From 0b63bcdad5d5f18d6c505b3e7a9c645283a1658a Mon Sep 17 00:00:00 2001 From: Shaun Verch Date: Tue, 19 May 2020 16:36:16 -0400 Subject: [PATCH 001/430] Make it easier to test multiple endpoints with aya This cleans up the interface of are you alive to pass it a config file with endpoint configuration rather than command line options that make are you alive construct the connection strings in different ways. This makes it easier to test a larger number of endpoints, so that, for example, you could easily configure it to write to one endpoint while reading from 11 others, at any rate you want. Also removes environment from the labels since that could be added later by the deployment, and makes the rate configuration a true rate instead of a delay. Signed-off-by: Shaun Verch --- examples/are-you-alive/README.md | 8 + examples/are-you-alive/build/dev/Dockerfile | 19 +- examples/are-you-alive/build/dev/reflex.conf | 5 +- .../are-you-alive/build/release/Dockerfile | 3 +- .../are-you-alive/cmd/are-you-alive/main.go | 255 +++++++++--------- examples/are-you-alive/docker-compose.yml | 2 - examples/are-you-alive/go.mod | 9 +- examples/are-you-alive/go.sum | 29 ++ examples/are-you-alive/pkg/client/client.go | 67 +++-- 9 files changed, 215 insertions(+), 182 deletions(-) diff --git a/examples/are-you-alive/README.md b/examples/are-you-alive/README.md index 65bff90cad6..7da5460c64d 100644 --- a/examples/are-you-alive/README.md +++ b/examples/are-you-alive/README.md @@ -73,6 +73,14 @@ After you run docker compose, navigate to `http://localhost:9090` to see Prometheus and `http://localhost:8080/metrics` to see the raw metrics being exported. +## Test Specific Tablet Types + +See [this vitess +documentation](https://vitess.io/docs/user-guides/faq/#how-do-i-choose-between-master-vs-replica-for-queries) +for how to target specific tablet types. In the configuration file you'll want +to, for example, put "@master" or "@replica" on the ends of your connection +strings. + ## Push to Registry If you have push access to the [planetscale public diff --git a/examples/are-you-alive/build/dev/Dockerfile b/examples/are-you-alive/build/dev/Dockerfile index 3b079cfcf8a..7a6a06d590b 100644 --- a/examples/are-you-alive/build/dev/Dockerfile +++ b/examples/are-you-alive/build/dev/Dockerfile @@ -1,13 +1,6 @@ -# Use a [multi stage -# build](https://docs.docker.com/develop/develop-images/multistage-build/) to -# build [reflex](https://github.com/cespare/reflex), a tool that will allow us -# to automatically rerun the project when any files change. -FROM golang:1.12.5 AS build -# Build reflex as a static binary (CGO_ENABLED=0) so we can run it in our final -# container. -RUN CGO_ENABLED=0 go get -v github.com/cespare/reflex - -FROM golang:1.12.5-alpine AS runtime -COPY --from=build /go/bin/reflex /go/bin/reflex -COPY reflex.conf / -ENTRYPOINT ["/go/bin/reflex", "-c", "/reflex.conf"] +FROM golang:1.14 +RUN go get -v github.com/cespare/reflex +COPY reflex.conf /reflex.conf +COPY entrypoint.sh /entrypoint.sh +COPY endpoints.yaml /endpoints.yaml +ENTRYPOINT ["/entrypoint.sh"] diff --git a/examples/are-you-alive/build/dev/reflex.conf b/examples/are-you-alive/build/dev/reflex.conf index 9e92ab1a7ca..6985f66d979 100644 --- a/examples/are-you-alive/build/dev/reflex.conf +++ b/examples/are-you-alive/build/dev/reflex.conf @@ -1,2 +1,5 @@ +# Get all dependencies when go.mod changes. +-r '(\.mod$)' -s -- go get vitess.io/vitess/examples/are-you-alive/cmd/are-you-alive/... + # Rerun "go run" every time a ".go" file changes. --r '(\.go$)' -s -- go run vitess.io/vitess/examples/are-you-alive/cmd/are-you-alive --initialize +-r '(\.go$)' -s -- go run vitess.io/vitess/examples/are-you-alive/cmd/are-you-alive --initialize --endpoints_config /endpoints.yaml diff --git a/examples/are-you-alive/build/release/Dockerfile b/examples/are-you-alive/build/release/Dockerfile index 67310da895a..55b8c9f66a1 100644 --- a/examples/are-you-alive/build/release/Dockerfile +++ b/examples/are-you-alive/build/release/Dockerfile @@ -1,5 +1,6 @@ -FROM golang:1.12.5 AS build +FROM golang:1.14 AS build COPY . /go/src/vitess.io/vitess/examples/are-you-alive +RUN go get vitess.io/vitess/examples/are-you-alive/cmd/are-you-alive/... RUN CGO_ENABLED=0 go install vitess.io/vitess/examples/are-you-alive/cmd/are-you-alive FROM debian:stretch-slim AS runtime diff --git a/examples/are-you-alive/cmd/are-you-alive/main.go b/examples/are-you-alive/cmd/are-you-alive/main.go index fd747468558..4744c68efd4 100644 --- a/examples/are-you-alive/cmd/are-you-alive/main.go +++ b/examples/are-you-alive/cmd/are-you-alive/main.go @@ -2,6 +2,7 @@ package main import ( "database/sql" + "errors" "flag" "fmt" "github.com/go-sql-driver/mysql" @@ -9,12 +10,13 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" + "go.uber.org/ratelimit" + "gopkg.in/yaml.v2" "math/rand" "net/http" "os" "os/signal" "sync" - "time" "vitess.io/vitess/examples/are-you-alive/pkg/client" ) @@ -38,10 +40,10 @@ var ( ) ) -func writeNextRecord(environmentName string, connectionString string) error { +func writeNextRecord(connectionString string) error { // 1. Call monitored client - err := client.Write(environmentName, connectionString, maxPage) + err := client.Write(connectionString, maxPage) if err != nil { // Check to see if this is a duplicate key error. We've seen this // sometimes happen, and when it does this client app gets stuck in an @@ -70,7 +72,7 @@ func writeNextRecord(environmentName string, connectionString string) error { return nil } -func readRandomRecord(environmentName string, connectionString string) error { +func readRandomRecord(connectionString string) error { // 1. Pick Random Number Between "minPage" and "maxPage" if minPage == maxPage { @@ -80,7 +82,7 @@ func readRandomRecord(environmentName string, connectionString string) error { page := (rand.Int() % (maxPage - minPage)) + minPage // 2. Read Record - readID, readMsg, err := client.Read(environmentName, connectionString, page) + readID, readMsg, err := client.Read(connectionString, page) if err != nil { if err == sql.ErrNoRows { // This races with deletion, but if our page is greater than minPage @@ -125,10 +127,10 @@ func readRandomRecord(environmentName string, connectionString string) error { return nil } -func runCount(environmentName string, connectionString string) error { +func runCount(connectionString string) error { // 1. Run Count - count, err := client.Count(environmentName, connectionString) + count, err := client.Count(connectionString) if err != nil { logrus.WithError(err).Error("Error counting records") return err @@ -141,7 +143,7 @@ func runCount(environmentName string, connectionString string) error { return nil } -func deleteLastRecordIfNecessary(environmentName string, connectionString string) error { +func deleteLastRecordIfNecessary(connectionString string) error { // 1. Compare "maxPage" - "minPage" to Desired Dataset Size if (maxPage - minPage) < *datasetSize { @@ -153,7 +155,7 @@ func deleteLastRecordIfNecessary(environmentName string, connectionString string }).Debug("Deleting last record") // 2. Delete Record If We Are Above Desired Size - err := client.Delete(environmentName, connectionString, minPage) + err := client.Delete(connectionString, minPage) if err != nil { logrus.WithError(err).Error("Error deleting record") return err @@ -165,33 +167,27 @@ func deleteLastRecordIfNecessary(environmentName string, connectionString string } var ( - mysqlConnectionString = flag.String( - "mysql_connection_string", "", "Connection string for db to test") prometheusMetricsAddress = flag.String( "prometheus_metrics_address", ":8080", "Address on which to serve prometheus metrics") - debug = flag.Bool("debug", false, "Enable debug logging") - useVtgate = flag.Bool("vtgate", false, "Using vtgate (for @master and @replica)") - readFromReplica = flag.Bool("replica", false, "Read from replica") - readFromReadOnly = flag.Bool("rdonly", false, "Read from rdonly") - initialize = flag.Bool("initialize", false, "Initialize database (for testing)") - sleepTime = flag.Int("delay", 1*1000*1000*1000, "Delay in nanoseconds between ops") - datasetSize = flag.Int("dataset_size", 10, "Number of total records in database") - environmentName = flag.String("environment_name", "prod", - "Environment the database is deployed in that this client is pointing at") + debug = flag.Bool("debug", false, "Enable debug logging") + useVtgate = flag.Bool("vtgate", false, "Using vtgate (for @master and @replica)") + initialize = flag.Bool("initialize", false, "Initialize database (for testing)") + datasetSize = flag.Int("dataset_size", 10, "Number of total records in database") + endpointsConfigFilename = flag.String("endpoints_config", "", "Endpoint and load configuration.") ) type runner struct { - connString string - envName string - fn func(string, string) error - errMessage string - sleepTime time.Duration + connString string + fn func(string) error + errMessage string + opsPerSecond int } func (r *runner) run() { + rl := ratelimit.New(r.opsPerSecond) for { - time.Sleep(r.sleepTime) - err := r.fn(r.envName, r.connString) + _ = rl.Take() + err := r.fn(r.connString) if err != nil { logrus.WithError(err).Error(r.errMessage) } @@ -216,6 +212,35 @@ func runPrometheus() { logrus.Fatal(http.ListenAndServe(*prometheusMetricsAddress, nil)) } +func loadEndpointsConfig(endpointsConfigFilename string) (endpointsConfig, error) { + if endpointsConfigFilename == "" { + return endpointsConfig{}, errors.New("You must pass an endpoints configuration file") + } + + f, err := os.Open(endpointsConfigFilename) + if err != nil { + return endpointsConfig{}, err + } + defer f.Close() + + var cfg endpointsConfig + decoder := yaml.NewDecoder(f) + err = decoder.Decode(&cfg) + if err != nil { + return endpointsConfig{}, err + } + return cfg, nil +} + +type endpointsConfig struct { + Endpoints []struct { + ConnectionString string `yaml:"connectionString"` + TargetCountsPerSecond int `yaml:"targetCountsPerSecond"` + TargetQueriesPerSecond int `yaml:"targetQueriesPerSecond"` + TargetWritesPerSecond int `yaml:"targetWritesPerSecond"` + } `yaml:"endpoints"` +} + func main() { // 0. Handle Arguments @@ -224,24 +249,31 @@ func main() { logrus.SetLevel(logrus.DebugLevel) } logrus.WithFields(logrus.Fields{ - "mysqlConnectionString": *mysqlConnectionString, + "endpointsConfigFilename": *endpointsConfigFilename, "prometheusMetricsAddress": *prometheusMetricsAddress, "debug": *debug, }).Debug("Command line arguments") - connectionString := "" - if *mysqlConnectionString != "" { - connectionString = *mysqlConnectionString - } else if os.Getenv("MYSQL_CONN_STRING") != "" { - connectionString = os.Getenv("MYSQL_CONN_STRING") + var endpoints endpointsConfig + endpoints, err := loadEndpointsConfig(*endpointsConfigFilename) + if err != nil { + logrus.WithError(err).Error("Failed to load endpoints config.") + os.Exit(1) } - masterConnectionString := connectionString - replicaConnectionString := connectionString - rdonlyConnectionString := connectionString - // When using vtgate, we want to append @master and @replica to the DSN, but - // this will fail against normal mysql which we're using for testing. See: - // https://vitess.io/docs/user-guides/faq/#how-do-i-choose-between-master-vs-replica-for-queries - if *useVtgate { + + // 0. Set Up Prometheus Metrics + logrus.Info("Prometheus Go") + go runPrometheus() + + // 1. Pass "interpolateParams" + for _, endpoint := range endpoints.Endpoints { + logrus.WithFields(logrus.Fields{ + "connectionString": endpoint.ConnectionString, + "targetCountsPerSecond": endpoint.TargetCountsPerSecond, + "targetQueriesPerSecond": endpoint.TargetQueriesPerSecond, + "targetWritesPerSecond": endpoint.TargetWritesPerSecond, + }).Info("Found endpoint configuration") + // We need to pass interpolateParams when using a vtgate because // prepare is not supported. // @@ -249,101 +281,72 @@ func main() { // - https://github.com/go-sql-driver/mysql/blob/master/README.md#interpolateparams // - https://github.com/src-d/go-mysql-server/issues/428 // - https://github.com/vitessio/vitess/pull/3862 - masterConnectionString = fmt.Sprintf("%s@master?interpolateParams=true", connectionString) - replicaConnectionString = fmt.Sprintf("%s@replica?interpolateParams=true", connectionString) - rdonlyConnectionString = fmt.Sprintf("%s@rdonly?interpolateParams=true", connectionString) + endpoint.ConnectionString = fmt.Sprintf("%s?interpolateParams=true", endpoint.ConnectionString) } - fmt.Println("masterConnectionString:", masterConnectionString) - fmt.Println("replicaConnectionString:", replicaConnectionString) - fmt.Println("rdonlyConnectionString:", rdonlyConnectionString) - - // 1. Set Up Prometheus Metrics - logrus.Info("Prometheus Go") - go runPrometheus() // 2. Initialize Database - logrus.Info("Initializing database") - // For local testing, does not initialize vschema - if *initialize { - client.InitializeDatabase(*environmentName, masterConnectionString, "are_you_alive_messages") + for _, endpoint := range endpoints.Endpoints { + logrus.WithFields(logrus.Fields{ + "connectionString": endpoint.ConnectionString, + "targetCountsPerSecond": endpoint.TargetCountsPerSecond, + "targetQueriesPerSecond": endpoint.TargetQueriesPerSecond, + "targetWritesPerSecond": endpoint.TargetWritesPerSecond, + }).Info("Found endpoint configuration") + + if endpoint.TargetWritesPerSecond > 0 { + logrus.Info("Initializing database") + // For local testing, does not initialize vschema + if *initialize { + client.InitializeDatabase(endpoint.ConnectionString, "are_you_alive_messages") + } + client.WipeTestTable(endpoint.ConnectionString, "are_you_alive_messages") + } } - client.WipeTestTable(*environmentName, masterConnectionString, "are_you_alive_messages") - // 3. Start goroutines to do various things + // 3. Start Client Goroutines logrus.Info("Starting client goroutines") - deleter := runner{ - connString: masterConnectionString, - envName: *environmentName, - fn: deleteLastRecordIfNecessary, - errMessage: "Recieved error deleting last record", - sleepTime: time.Duration(*sleepTime), - } - go deleter.run() - writer := runner{ - connString: masterConnectionString, - envName: *environmentName, - fn: writeNextRecord, - errMessage: "Recieved error writing next record", - sleepTime: time.Duration(*sleepTime), - } - go writer.run() - reader := runner{ - connString: masterConnectionString, - envName: *environmentName, - fn: readRandomRecord, - errMessage: "Recieved error reading record", - sleepTime: time.Duration(*sleepTime), - } - go reader.run() - counter := runner{ - connString: masterConnectionString, - envName: *environmentName, - fn: runCount, - errMessage: "Recieved error running count", - sleepTime: time.Duration(*sleepTime), - } - go counter.run() - - // Only bother starting a replica reader/counter if we are using a vtgate - // and actually are asking to do replica reads - if *useVtgate && *readFromReplica { - replicaReader := runner{ - connString: replicaConnectionString, - envName: *environmentName, - fn: readRandomRecord, - errMessage: "Recieved error reading record from replica", - sleepTime: time.Duration(*sleepTime), - } - go replicaReader.run() - replicaRowCounter := runner{ - connString: replicaConnectionString, - envName: *environmentName, - fn: runCount, - errMessage: "Recieved error running count on replica", - sleepTime: time.Duration(*sleepTime), + for _, endpoint := range endpoints.Endpoints { + logrus.WithFields(logrus.Fields{ + "connectionString": endpoint.ConnectionString, + "targetCountsPerSecond": endpoint.TargetCountsPerSecond, + "targetQueriesPerSecond": endpoint.TargetQueriesPerSecond, + "targetWritesPerSecond": endpoint.TargetWritesPerSecond, + }).Info("Found endpoint configuration") + + if endpoint.TargetWritesPerSecond > 0 { + writer := runner{ + connString: endpoint.ConnectionString, + fn: writeNextRecord, + errMessage: "Recieved error writing next record", + opsPerSecond: endpoint.TargetWritesPerSecond, + } + go writer.run() + deleter := runner{ + connString: endpoint.ConnectionString, + fn: deleteLastRecordIfNecessary, + errMessage: "Recieved error deleting last record", + opsPerSecond: 100, // This is based on target "dataset_size", and will not make a query if not needed. TODO: Actually tune this in a reasonable way after redesigning the schema? + } + go deleter.run() } - go replicaRowCounter.run() - } - - // Only bother starting a rdonly reader/counter if we are using a vtgate and - // actually are asking to do rdonly reads - if *useVtgate && *readFromReadOnly { - replicaReader := runner{ - connString: rdonlyConnectionString, - envName: *environmentName, - fn: readRandomRecord, - errMessage: "Recieved error reading record from rdonly", - sleepTime: time.Duration(*sleepTime), + if endpoint.TargetQueriesPerSecond > 0 { + reader := runner{ + connString: endpoint.ConnectionString, + fn: readRandomRecord, + errMessage: "Recieved error reading record", + opsPerSecond: endpoint.TargetQueriesPerSecond, + } + go reader.run() } - go replicaReader.run() - replicaRowCounter := runner{ - connString: rdonlyConnectionString, - envName: *environmentName, - fn: runCount, - errMessage: "Recieved error running count on rdonly", - sleepTime: time.Duration(*sleepTime), + if endpoint.TargetCountsPerSecond > 0 { + counter := runner{ + connString: endpoint.ConnectionString, + fn: runCount, + errMessage: "Recieved error running count", + opsPerSecond: endpoint.TargetCountsPerSecond, + } + go counter.run() } - go replicaRowCounter.run() } logrus.Info("Press Ctrl+C to end\n") diff --git a/examples/are-you-alive/docker-compose.yml b/examples/are-you-alive/docker-compose.yml index 603353dcb89..700d840b0c2 100644 --- a/examples/are-you-alive/docker-compose.yml +++ b/examples/are-you-alive/docker-compose.yml @@ -7,8 +7,6 @@ services: volumes: - .:/go/src/vitess.io/vitess/examples/are-you-alive working_dir: /go/src/vitess.io/vitess/examples/are-you-alive - environment: - MYSQL_CONN_STRING: root:mysql@tcp(mysql)/testfixture depends_on: - mysql ports: diff --git a/examples/are-you-alive/go.mod b/examples/are-you-alive/go.mod index 9bb69e1307b..79c3fc251bf 100644 --- a/examples/are-you-alive/go.mod +++ b/examples/are-you-alive/go.mod @@ -1,9 +1,12 @@ module vitess.io/vitess/examples/are-you-alive -go 1.12 +go 1.14 require ( github.com/go-sql-driver/mysql v1.5.0 - github.com/prometheus/client_golang v1.4.1 - github.com/sirupsen/logrus v1.4.2 + github.com/prometheus/client_golang v1.6.0 + github.com/sirupsen/logrus v1.6.0 + go.uber.org/ratelimit v0.1.0 + golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 // indirect + gopkg.in/yaml.v2 v2.2.5 ) diff --git a/examples/are-you-alive/go.sum b/examples/are-you-alive/go.sum index 7c05c83b99b..409a0ce1d02 100644 --- a/examples/are-you-alive/go.sum +++ b/examples/are-you-alive/go.sum @@ -22,6 +22,13 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -30,6 +37,8 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -48,6 +57,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.1 h1:FFSuS004yOQEtDdTq+TAOLP5xUq63KqAFYyOi8zA+Y8= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= @@ -59,14 +70,20 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +go.uber.org/ratelimit v0.1.0 h1:U2AruXqeTb4Eh9sYQSTrMhH8Cb7M0Ian2ibBOnBcnAw= +go.uber.org/ratelimit v0.1.0/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -78,15 +95,27 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f h1:gWF768j/LaZugp8dyS4UwsslYCYz9XgFxvlgsn0n9H8= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= vitess.io/vitess v2.1.1+incompatible h1:nuuGHiWYWpudD3gOCLeGzol2EJ25e/u5Wer2wV1O130= diff --git a/examples/are-you-alive/pkg/client/client.go b/examples/are-you-alive/pkg/client/client.go index e4f35d3e882..95a564af678 100644 --- a/examples/are-you-alive/pkg/client/client.go +++ b/examples/are-you-alive/pkg/client/client.go @@ -22,70 +22,70 @@ var ( Help: "Latency to recieve a count error", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name", "tablet_type"}, + []string{"database_name", "tablet_type"}, ) readErrorLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_read_error_latency_seconds", Help: "Latency to recieve a read error", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name", "tablet_type"}, + []string{"database_name", "tablet_type"}, ) deleteErrorLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_delete_error_latency_seconds", Help: "Latency to recieve a delete error", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name"}, + []string{"database_name"}, ) writeErrorLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_write_error_latency_seconds", Help: "Latency to recieve a write error", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name"}, + []string{"database_name"}, ) connectErrorLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_connect_error_latency_seconds", Help: "Latency to recieve a connect error", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name", "tablet_type"}, + []string{"database_name", "tablet_type"}, ) countLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_count_latency_seconds", Help: "Time it takes to count to the database", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name", "tablet_type"}, + []string{"database_name", "tablet_type"}, ) readLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_read_latency_seconds", Help: "Time it takes to read to the database", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name", "tablet_type"}, + []string{"database_name", "tablet_type"}, ) deleteLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_delete_latency_seconds", Help: "Time it takes to delete to the database", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name"}, + []string{"database_name"}, ) writeLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_write_latency_seconds", Help: "Time it takes to write to the database", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name"}, + []string{"database_name"}, ) connectLatency = promauto.NewHistogramVec(prometheus.HistogramOpts{ Name: "are_you_alive_connect_latency_seconds", Help: "Time it takes to connect to the database", Buckets: defaultBuckets, }, - []string{"environment_name", "database_name", "tablet_type"}, + []string{"database_name", "tablet_type"}, ) ) @@ -115,7 +115,7 @@ func ParseTabletType(connectionString string) string { } } -func openDatabase(environmentName string, connectionString string) (*sql.DB, error) { +func openDatabase(connectionString string) (*sql.DB, error) { databaseName := ParseDBName(connectionString) tabletType := ParseTabletType(connectionString) // NOTE: This is probably not measuring open connections. I think they @@ -125,9 +125,8 @@ func openDatabase(environmentName string, connectionString string) (*sql.DB, err // happening locally. We should just see everything complete within // milliseconds. labels := prometheus.Labels{ - "environment_name": environmentName, - "database_name": databaseName, - "tablet_type": tabletType} + "database_name": databaseName, + "tablet_type": tabletType} connectTimer := prometheus.NewTimer(connectLatency.With(labels)) connectErrorTimer := prometheus.NewTimer(connectErrorLatency.With(labels)) db, err := sql.Open("mysql", connectionString) @@ -144,13 +143,13 @@ func openDatabase(environmentName string, connectionString string) (*sql.DB, err // given tableName, and recreate it with the schema that the rest of the client // expects. This is not something any normal client would do but is convenient // here because we are just using this client for monitoring. -func InitializeDatabase(environmentName string, connectionString string, tableName string) error { +func InitializeDatabase(connectionString string, tableName string) error { // 0. Create logger log := logrus.WithField("connection_string", connectionString) // 1. Open client to database - db, err := openDatabase(environmentName, connectionString) + db, err := openDatabase(connectionString) if err != nil { log.WithError(err).Error("Error opening database") return err @@ -176,13 +175,13 @@ func InitializeDatabase(environmentName string, connectionString string, tableNa // everything in the table given by tableName because this client expects the // table to be empty. No client would normally do this, but it's convenient for // testing. -func WipeTestTable(environmentName string, connectionString string, tableName string) error { +func WipeTestTable(connectionString string, tableName string) error { // 0. Create logger log := logrus.WithField("connection_string", connectionString) // 1. Open client to database - db, err := openDatabase(environmentName, connectionString) + db, err := openDatabase(connectionString) if err != nil { log.WithError(err).Error("Error opening database") return err @@ -198,14 +197,14 @@ func WipeTestTable(environmentName string, connectionString string, tableName st // Write will write the record given by page to the test table in the database // referenced by connectionString. -func Write(environmentName string, connectionString string, page int) error { +func Write(connectionString string, page int) error { // 0. Create logger log := logrus.WithField("connection_string", connectionString) // 1. Open client to database databaseName := ParseDBName(connectionString) - db, err := openDatabase(environmentName, connectionString) + db, err := openDatabase(connectionString) if err != nil { log.WithError(err).Error("Error opening database") return err @@ -214,8 +213,7 @@ func Write(environmentName string, connectionString string, page int) error { // 2. Write record labels := prometheus.Labels{ - "environment_name": environmentName, - "database_name": databaseName} + "database_name": databaseName} writeTimer := prometheus.NewTimer(writeLatency.With(labels)) writeErrorTimer := prometheus.NewTimer(writeErrorLatency.With(labels)) if _, err := db.Exec("INSERT INTO are_you_alive_messages (page, message) VALUES (?, ?)", page, "foo"); err != nil { @@ -229,14 +227,14 @@ func Write(environmentName string, connectionString string, page int) error { // Read will read the record given by page from the test table in the database // referenced by connectionString. -func Read(environmentName string, connectionString string, page int) (int, string, error) { +func Read(connectionString string, page int) (int, string, error) { // 0. Create logger log := logrus.WithField("connection_string", connectionString) // 1. Open client to database databaseName := ParseDBName(connectionString) - db, err := openDatabase(environmentName, connectionString) + db, err := openDatabase(connectionString) if err != nil { log.WithError(err).Error("Error opening database") return 0, "", err @@ -246,9 +244,8 @@ func Read(environmentName string, connectionString string, page int) (int, strin // 2. Read record tabletType := ParseTabletType(connectionString) labels := prometheus.Labels{ - "environment_name": environmentName, - "database_name": databaseName, - "tablet_type": tabletType} + "database_name": databaseName, + "tablet_type": tabletType} readTimer := prometheus.NewTimer(readLatency.With(labels)) readErrorTimer := prometheus.NewTimer(readErrorLatency.With(labels)) row := db.QueryRow("SELECT * FROM are_you_alive_messages WHERE page=?", page) @@ -275,14 +272,14 @@ func Read(environmentName string, connectionString string, page int) (int, strin // Count will count all the documents in the test table in the database // referenced by connectionString. -func Count(environmentName string, connectionString string) (int, error) { +func Count(connectionString string) (int, error) { // 0. Create logger log := logrus.WithField("connection_string", connectionString) // 1. Open client to database databaseName := ParseDBName(connectionString) - db, err := openDatabase(environmentName, connectionString) + db, err := openDatabase(connectionString) if err != nil { log.WithError(err).Error("Error opening database") return 0, err @@ -292,9 +289,8 @@ func Count(environmentName string, connectionString string) (int, error) { // 2. Run Count tabletType := ParseTabletType(connectionString) labels := prometheus.Labels{ - "environment_name": environmentName, - "database_name": databaseName, - "tablet_type": tabletType} + "database_name": databaseName, + "tablet_type": tabletType} countTimer := prometheus.NewTimer(countLatency.With(labels)) countErrorTimer := prometheus.NewTimer(countErrorLatency.With(labels)) row := db.QueryRow("SELECT COUNT(*) FROM are_you_alive_messages") @@ -313,7 +309,7 @@ func Count(environmentName string, connectionString string) (int, error) { // Delete will delete the record given by page from the test table in the // database referenced by connectionString. -func Delete(environmentName string, connectionString string, page int) error { +func Delete(connectionString string, page int) error { // 0. Create logger log := logrus.WithFields(logrus.Fields{ @@ -324,11 +320,10 @@ func Delete(environmentName string, connectionString string, page int) error { // 1. Open client to database databaseName := ParseDBName(connectionString) labels := prometheus.Labels{ - "environment_name": environmentName, - "database_name": databaseName} + "database_name": databaseName} deleteTimer := prometheus.NewTimer(deleteLatency.With(labels)) deleteErrorTimer := prometheus.NewTimer(deleteErrorLatency.With(labels)) - db, err := openDatabase(environmentName, connectionString) + db, err := openDatabase(connectionString) if err != nil { log.WithError(err).Error("Error opening database") deleteErrorTimer.ObserveDuration() From 673a3afd47df72ac43f50f011d1c9e52df03bda8 Mon Sep 17 00:00:00 2001 From: huiqing Date: Thu, 28 May 2020 15:26:57 -0700 Subject: [PATCH 002/430] exclude `DestinationKeyspaceID,DestinationKeyspaceIDs` from being used as part of the plan cache key prefix, as it explodes the plan cache Signed-off-by: huiqing --- go/vt/vtgate/vcursor_impl.go | 16 ++++++ go/vt/vtgate/vcursor_impl_test.go | 96 +++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/go/vt/vtgate/vcursor_impl.go b/go/vt/vtgate/vcursor_impl.go index 4b07c27e24f..c0dfeb98772 100644 --- a/go/vt/vtgate/vcursor_impl.go +++ b/go/vt/vtgate/vcursor_impl.go @@ -18,6 +18,8 @@ package vtgate import ( "fmt" + "sort" + "strings" "sync/atomic" "time" @@ -420,6 +422,20 @@ func parseDestinationTarget(targetString string, vschema *vindexes.VSchema) (str func (vc *vcursorImpl) planPrefixKey() string { if vc.destination != nil { + switch vc.destination.(type) { + case key.DestinationKeyspaceID, key.DestinationKeyspaceIDs: + resolved, _, err := vc.ResolveDestinations(vc.keyspace, nil, []key.Destination{vc.destination}) + if err == nil && len(resolved) > 0 { + shards := make([]string, len(resolved)) + for i := 0; i < len(shards); i++ { + shards[i] = resolved[i].Target.GetShard() + } + sort.Strings(shards) + return fmt.Sprintf("%s%sDestinationKeyspaceIDsResolved(%s)", vc.keyspace, vindexes.TabletTypeSuffix[vc.tabletType], strings.Join(shards, ",")) + } + default: + // use destination string (out of the switch) + } return fmt.Sprintf("%s%s%s", vc.keyspace, vindexes.TabletTypeSuffix[vc.tabletType], vc.destination.String()) } return fmt.Sprintf("%s%s", vc.keyspace, vindexes.TabletTypeSuffix[vc.tabletType]) diff --git a/go/vt/vtgate/vcursor_impl_test.go b/go/vt/vtgate/vcursor_impl_test.go index b4d59d50906..d3252034eb2 100644 --- a/go/vt/vtgate/vcursor_impl_test.go +++ b/go/vt/vtgate/vcursor_impl_test.go @@ -2,9 +2,13 @@ package vtgate import ( "context" + "encoding/hex" "testing" "vitess.io/vitess/go/vt/proto/vschema" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" + "vitess.io/vitess/go/vt/srvtopo" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/vtgate/vindexes" @@ -33,6 +37,45 @@ func (f fakeVSchemaOperator) UpdateVSchema(ctx context.Context, ksName string, v panic("implement me") } +type fakeTopoServer struct { +} + +// GetTopoServer returns the full topo.Server instance. +func (f *fakeTopoServer) GetTopoServer() (*topo.Server, error) { + return nil, nil +} + +// GetSrvKeyspaceNames returns the list of keyspaces served in +// the provided cell. +func (f *fakeTopoServer) GetSrvKeyspaceNames(ctx context.Context, cell string, staleOK bool) ([]string, error) { + return []string{"ks1"}, nil +} + +// GetSrvKeyspace returns the SrvKeyspace for a cell/keyspace. +func (f *fakeTopoServer) GetSrvKeyspace(ctx context.Context, cell, keyspace string) (*topodatapb.SrvKeyspace, error) { + zeroHexBytes, _ := hex.DecodeString("") + eightyHexBytes, _ := hex.DecodeString("80") + ks := &topodatapb.SrvKeyspace{ + Partitions: []*topodatapb.SrvKeyspace_KeyspacePartition{ + { + ServedType: topodatapb.TabletType_MASTER, + ShardReferences: []*topodatapb.ShardReference{ + {Name: "-80", KeyRange: &topodatapb.KeyRange{Start: zeroHexBytes, End: eightyHexBytes}}, + {Name: "80-", KeyRange: &topodatapb.KeyRange{Start: eightyHexBytes, End: zeroHexBytes}}, + }, + }, + }, + } + return ks, nil +} + +// WatchSrvVSchema starts watching the SrvVSchema object for +// the provided cell. It will call the callback when +// a new value or an error occurs. +func (f *fakeTopoServer) WatchSrvVSchema(ctx context.Context, cell string, callback func(*vschemapb.SrvVSchema, error)) { + +} + func TestDestinationKeyspace(t *testing.T) { ks1 := &vindexes.Keyspace{ Name: "ks1", @@ -218,3 +261,56 @@ func TestSetTarget(t *testing.T) { }) } } + +func TestPlanPrefixKey(t *testing.T) { + ks1 := &vindexes.Keyspace{ + Name: "ks1", + Sharded: false, + } + ks1Schema := &vindexes.KeyspaceSchema{ + Keyspace: ks1, + Tables: nil, + Vindexes: nil, + Error: nil, + } + vschemaWith1KS := &vindexes.VSchema{ + Keyspaces: map[string]*vindexes.KeyspaceSchema{ + ks1.Name: ks1Schema, + }, + } + + type testCase struct { + vschema *vindexes.VSchema + targetString string + expectedPlanPrefixKey string + } + + tests := []testCase{{ + vschema: vschemaWith1KS, + targetString: "", + expectedPlanPrefixKey: "ks1@master", + }, { + vschema: vschemaWith1KS, + targetString: "ks1@replica", + expectedPlanPrefixKey: "ks1@replica", + }, { + vschema: vschemaWith1KS, + targetString: "ks1:-80", + expectedPlanPrefixKey: "ks1@masterDestinationShard(-80)", + }, { + vschema: vschemaWith1KS, + targetString: "ks1[deadbeef]", + expectedPlanPrefixKey: "ks1@masterDestinationKeyspaceIDsResolved(80-)", + }} + + for i, tc := range tests { + t.Run(string(i)+"#"+tc.targetString, func(t *testing.T) { + ss := NewSafeSession(&vtgatepb.Session{InTransaction: false}) + ss.SetTargetString(tc.targetString) + vc, err := newVCursorImpl(context.Background(), ss, sqlparser.MarginComments{}, nil, nil, &fakeVSchemaOperator{vschema: tc.vschema}, tc.vschema, srvtopo.NewResolver(&fakeTopoServer{}, nil, "")) + require.NoError(t, err) + vc.vschema = tc.vschema + require.Equal(t, tc.expectedPlanPrefixKey, vc.planPrefixKey()) + }) + } +} From 4eabc0cfbe6e35d5e0a87ac56e7bf5d99a725f61 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Mon, 1 Jun 2020 22:09:18 -0700 Subject: [PATCH 003/430] tm revamp: remove deprecated code mysql host and port have been first class proto fields for a long time now. Signed-off-by: Sugu Sougoumarane --- go/cmd/vtbackup/vtbackup.go | 2 +- go/vt/topo/helpers/copy_test.go | 5 +-- go/vt/topo/tablet.go | 2 +- go/vt/topo/test/tablet.go | 3 +- go/vt/topo/topoproto/tablet.go | 41 ++----------------- go/vt/vtctl/vtctl.go | 4 +- go/vt/vtctl/vtctlclienttest/client.go | 3 +- go/vt/vttablet/tabletmanager/action_agent.go | 10 ++--- .../tabletmanager/healthcheck_test.go | 2 +- go/vt/vttablet/tabletmanager/orchestrator.go | 4 +- go/vt/vttablet/tabletmanager/restore.go | 2 +- .../vttablet/tabletmanager/rpc_replication.go | 6 +-- go/vt/wrangler/fake_tablet_test.go | 3 +- go/vt/wrangler/testlib/fake_tablet.go | 3 +- .../testlib/init_shard_master_test.go | 2 +- .../testlib/planned_reparent_shard_test.go | 4 +- go/vt/wrangler/testlib/reparent_utils_test.go | 4 +- go/vt/wrangler/validator.go | 4 +- 18 files changed, 32 insertions(+), 72 deletions(-) diff --git a/go/cmd/vtbackup/vtbackup.go b/go/cmd/vtbackup/vtbackup.go index 944e593a5e1..08f71852cd6 100644 --- a/go/cmd/vtbackup/vtbackup.go +++ b/go/cmd/vtbackup/vtbackup.go @@ -449,7 +449,7 @@ func startReplication(ctx context.Context, mysqld mysqlctl.MysqlDaemon, topoServ } // Stop slave (in case we're restarting), set master, and start slave. - if err := mysqld.SetMaster(ctx, topoproto.MysqlHostname(ti.Tablet), int(topoproto.MysqlPort(ti.Tablet)), true /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { + if err := mysqld.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), true /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { return vterrors.Wrap(err, "MysqlDaemon.SetMaster failed") } return nil diff --git a/go/vt/topo/helpers/copy_test.go b/go/vt/topo/helpers/copy_test.go index b70ea19a2c2..86b5f10ae8d 100644 --- a/go/vt/topo/helpers/copy_test.go +++ b/go/vt/topo/helpers/copy_test.go @@ -23,7 +23,6 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" - "vitess.io/vitess/go/vt/topo/topoproto" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" @@ -60,7 +59,7 @@ func createSetup(ctx context.Context, t *testing.T) (*topo.Server, *topo.Server) DbNameOverride: "", KeyRange: nil, } - topoproto.SetMysqlPort(tablet1, 3306) + tablet1.MysqlPort = 3306 if err := fromTS.CreateTablet(ctx, tablet1); err != nil { t.Fatalf("cannot create master tablet: %v", err) } @@ -82,7 +81,7 @@ func createSetup(ctx context.Context, t *testing.T) (*topo.Server, *topo.Server) DbNameOverride: "", KeyRange: nil, } - topoproto.SetMysqlPort(tablet2, 3306) + tablet2.MysqlPort = 3306 if err := fromTS.CreateTablet(ctx, tablet2); err != nil { t.Fatalf("cannot create slave tablet: %v", err) } diff --git a/go/vt/topo/tablet.go b/go/vt/topo/tablet.go index 22ae93a2928..7e1fa034504 100644 --- a/go/vt/topo/tablet.go +++ b/go/vt/topo/tablet.go @@ -184,7 +184,7 @@ func (ti *TabletInfo) Addr() string { // MysqlAddr returns hostname:mysql port. func (ti *TabletInfo) MysqlAddr() string { - return netutil.JoinHostPort(topoproto.MysqlHostname(ti.Tablet), topoproto.MysqlPort(ti.Tablet)) + return netutil.JoinHostPort(ti.Tablet.MysqlHostname, ti.Tablet.MysqlPort) } // DbName is usually implied by keyspace. Having the shard information in the diff --git a/go/vt/topo/test/tablet.go b/go/vt/topo/test/tablet.go index d7fdf6f0c88..cbb16387817 100644 --- a/go/vt/topo/test/tablet.go +++ b/go/vt/topo/test/tablet.go @@ -23,7 +23,6 @@ import ( "golang.org/x/net/context" "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/topo/topoproto" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) @@ -48,7 +47,7 @@ func checkTablet(t *testing.T, ts *topo.Server) { Type: topodatapb.TabletType_MASTER, KeyRange: newKeyRange("-10"), } - topoproto.SetMysqlPort(tablet, 3334) + tablet.MysqlPort = 3334 if err := ts.CreateTablet(ctx, tablet); err != nil { t.Fatalf("CreateTablet: %v", err) } diff --git a/go/vt/topo/topoproto/tablet.go b/go/vt/topo/topoproto/tablet.go index a72d4595cfa..6a35377b8b6 100644 --- a/go/vt/topo/topoproto/tablet.go +++ b/go/vt/topo/topoproto/tablet.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/golang/protobuf/proto" + "vitess.io/vitess/go/netutil" "vitess.io/vitess/go/vt/vterrors" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -199,50 +200,14 @@ func MakeStringTypeList(types []topodatapb.TabletType) []string { return strs } -// SetMysqlPort sets the mysql port for tablet. This function -// also handles legacy by setting the port in PortMap. -// TODO(sougou); deprecate this function after 3.0. -func SetMysqlPort(tablet *topodatapb.Tablet, port int32) { - if tablet.MysqlHostname == "" || tablet.MysqlHostname == tablet.Hostname { - tablet.PortMap["mysql"] = port - } - // If it's the legacy form, preserve old behavior to prevent - // confusion between new and old code. - if tablet.MysqlHostname != "" { - tablet.MysqlPort = port - } -} - // MysqlAddr returns the host:port of the mysql server. func MysqlAddr(tablet *topodatapb.Tablet) string { - return fmt.Sprintf("%v:%v", MysqlHostname(tablet), MysqlPort(tablet)) -} - -// MysqlHostname returns the mysql host name. This function -// also handles legacy behavior: it uses the tablet's hostname -// if MysqlHostname is not specified. -// TODO(sougou); deprecate this function after 3.0. -func MysqlHostname(tablet *topodatapb.Tablet) string { - if tablet.MysqlHostname == "" { - return tablet.Hostname - } - return tablet.MysqlHostname -} - -// MysqlPort returns the mysql port. This function -// also handles legacy behavior: it uses the tablet's port map -// if MysqlHostname is not specified. -// TODO(sougou); deprecate this function after 3.0. -func MysqlPort(tablet *topodatapb.Tablet) int32 { - if tablet.MysqlHostname == "" { - return tablet.PortMap["mysql"] - } - return tablet.MysqlPort + return netutil.JoinHostPort(tablet.MysqlHostname, tablet.MysqlPort) } // MySQLIP returns the MySQL server's IP by resolvign the host name. func MySQLIP(tablet *topodatapb.Tablet) (string, error) { - ipAddrs, err := net.LookupHost(MysqlHostname(tablet)) + ipAddrs, err := net.LookupHost(tablet.MysqlHostname) if err != nil { return "", err } diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 524cd2b84ba..89f27e54665 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -758,7 +758,7 @@ func commandInitTablet(ctx context.Context, wr *wrangler.Wrangler, subFlags *fla tablet.PortMap["vt"] = int32(*port) } if *mysqlPort != 0 { - topoproto.SetMysqlPort(tablet, int32(*mysqlPort)) + tablet.MysqlPort = int32(*mysqlPort) } if *grpcPort != 0 { tablet.PortMap["grpc"] = int32(*grpcPort) @@ -824,7 +824,7 @@ func commandUpdateTabletAddrs(ctx context.Context, wr *wrangler.Wrangler, subFla tablet.PortMap["grpc"] = int32(*grpcPort) } if *mysqlPort != 0 { - topoproto.SetMysqlPort(tablet, int32(*mysqlPort)) + tablet.MysqlPort = int32(*mysqlPort) } } return nil diff --git a/go/vt/vtctl/vtctlclienttest/client.go b/go/vt/vtctl/vtctlclienttest/client.go index ba5d085f2c5..919efb0cb29 100644 --- a/go/vt/vtctl/vtctlclienttest/client.go +++ b/go/vt/vtctl/vtctlclienttest/client.go @@ -35,7 +35,6 @@ import ( "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" - "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/vtctlclient" "vitess.io/vitess/go/vt/vttablet/tmclient" @@ -73,7 +72,7 @@ func TestSuite(t *testing.T, ts *topo.Server, client vtctlclient.VtctlClient) { Keyspace: "test_keyspace", Type: topodatapb.TabletType_MASTER, } - topoproto.SetMysqlPort(tablet, 3334) + tablet.MysqlPort = 3334 if err := ts.CreateTablet(ctx, tablet); err != nil { t.Errorf("CreateTablet: %v", err) } diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 836fb1399ef..462941dc9e3 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -641,7 +641,7 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs if mysqlPort != 0 { // only overwrite mysql port if we know it, otherwise // leave it as is. - topoproto.SetMysqlPort(tablet, int32(mysqlPort)) + tablet.MysqlPort = int32(mysqlPort) } if vtPort != 0 { tablet.PortMap["vt"] = vtPort @@ -815,7 +815,7 @@ func (agent *ActionAgent) checkTabletMysqlPort(ctx context.Context, tablet *topo } } - if mport == topoproto.MysqlPort(tablet) { + if mport == tablet.MysqlPort { // The topology record contains the right port. // Remember we successfully checked it, and that we're // not waiting on MySQL to start any more. @@ -830,13 +830,13 @@ func (agent *ActionAgent) checkTabletMysqlPort(ctx context.Context, tablet *topo ctx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() if !agent.waitingForMysql { - log.Warningf("MySQL port has changed from %v to %v, updating it in tablet record", topoproto.MysqlPort(tablet), mport) + log.Warningf("MySQL port has changed from %v to %v, updating it in tablet record", tablet.MysqlPort, mport) } newTablet, err := agent.TopoServer.UpdateTabletFields(ctx, tablet.Alias, func(t *topodatapb.Tablet) error { if err := topotools.CheckOwnership(agent.initialTablet, tablet); err != nil { return err } - topoproto.SetMysqlPort(t, mport) + t.MysqlPort = mport return nil }) if err != nil { @@ -852,7 +852,7 @@ func (agent *ActionAgent) checkTabletMysqlPort(ctx context.Context, tablet *topo // Update worked, return the new record, so the agent can save it. // This should not happen often, so we can log it. - log.Infof("MySQL port has changed from %v to %v, successfully updated the tablet record in topology", topoproto.MysqlPort(tablet), mport) + log.Infof("MySQL port has changed from %v to %v, successfully updated the tablet record in topology", tablet.MysqlPort, mport) agent.gotMysqlPort = true agent.waitingForMysql = false return newTablet diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index e50cb14d1c2..fbe77c83124 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -204,7 +204,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("First health check failed to go to replica: %v", ti.Type) } - if port := topoproto.MysqlPort(ti.Tablet); port != 3306 { + if port := ti.Tablet.MysqlPort; port != 3306 { t.Errorf("First health check failed to update mysql port: %v", port) } if !agent.gotMysqlPort { diff --git a/go/vt/vttablet/tabletmanager/orchestrator.go b/go/vt/vttablet/tabletmanager/orchestrator.go index 73f2e2fcb2d..42f6ec314b7 100644 --- a/go/vt/vttablet/tabletmanager/orchestrator.go +++ b/go/vt/vttablet/tabletmanager/orchestrator.go @@ -164,11 +164,11 @@ func (orc *orcClient) InActiveShardRecovery(tablet *topodatapb.Tablet) (bool, er } func mysqlHostPort(tablet *topodatapb.Tablet) (host, port string, err error) { - mysqlPort := int(topoproto.MysqlPort(tablet)) + mysqlPort := int(tablet.MysqlPort) if mysqlPort == 0 { return "", "", fmt.Errorf("MySQL port is unknown for tablet %v (mysqld may not be running yet)", topoproto.TabletAliasString(tablet.Alias)) } - return topoproto.MysqlHostname(tablet), strconv.Itoa(mysqlPort), nil + return tablet.MysqlHostname, strconv.Itoa(mysqlPort), nil } // apiGet calls the given Orchestrator API endpoint. diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index aed6a4a864e..3a489af58d0 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -213,7 +213,7 @@ func (agent *ActionAgent) startReplication(ctx context.Context, pos mysql.Positi } // Set master and start slave. - if err := agent.MysqlDaemon.SetMaster(ctx, topoproto.MysqlHostname(ti.Tablet), int(topoproto.MysqlPort(ti.Tablet)), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { + if err := agent.MysqlDaemon.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { return vterrors.Wrap(err, "MysqlDaemon.SetMaster failed") } diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index ce9afc8f9b0..991b435f86f 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -283,7 +283,7 @@ func (agent *ActionAgent) InitSlave(ctx context.Context, parent *topodatapb.Tabl if err := agent.MysqlDaemon.SetSlavePosition(ctx, pos); err != nil { return err } - if err := agent.MysqlDaemon.SetMaster(ctx, topoproto.MysqlHostname(ti.Tablet), int(topoproto.MysqlPort(ti.Tablet)), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { + if err := agent.MysqlDaemon.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { return err } @@ -577,8 +577,8 @@ func (agent *ActionAgent) setMasterLocked(ctx context.Context, parentAlias *topo if err != nil { return err } - masterHost := topoproto.MysqlHostname(parent.Tablet) - masterPort := int(topoproto.MysqlPort(parent.Tablet)) + masterHost := parent.Tablet.MysqlHostname + masterPort := int(parent.Tablet.MysqlPort) if status.MasterHost != masterHost || status.MasterPort != masterPort { // This handles both changing the address and starting replication. if err := agent.MysqlDaemon.SetMaster(ctx, masterHost, masterPort, wasReplicating, shouldbeReplicating); err != nil { diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index 85adabf6cb1..02688951571 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -30,7 +30,6 @@ import ( querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vttablet/grpctmserver" "vitess.io/vitess/go/vt/vttablet/tabletconn" "vitess.io/vitess/go/vt/vttablet/tabletmanager" @@ -119,7 +118,7 @@ func newFakeTablet(t *testing.T, wr *Wrangler, cell string, uid uint32, tabletTy Shard: "0", Type: tabletType, } - topoproto.SetMysqlPort(tablet, mysqlPort) + tablet.MysqlPort = mysqlPort for _, option := range options { option(tablet) } diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index 0e5be5c793c..a67d81a8b82 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -33,7 +33,6 @@ import ( "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vttablet/grpctmserver" "vitess.io/vitess/go/vt/vttablet/tabletconn" "vitess.io/vitess/go/vt/vttablet/tabletmanager" @@ -137,7 +136,7 @@ func NewFakeTablet(t *testing.T, wr *wrangler.Wrangler, cell string, uid uint32, Shard: "0", Type: tabletType, } - topoproto.SetMysqlPort(tablet, mysqlPort) + tablet.MysqlPort = mysqlPort for _, option := range options { option(tablet) } diff --git a/go/vt/wrangler/testlib/init_shard_master_test.go b/go/vt/wrangler/testlib/init_shard_master_test.go index fb0f3c100d0..172e0f3db84 100644 --- a/go/vt/wrangler/testlib/init_shard_master_test.go +++ b/go/vt/wrangler/testlib/init_shard_master_test.go @@ -272,7 +272,7 @@ func TestInitMasterShardOneSlaveFails(t *testing.T) { // on purpose badSlave.FakeMysqlDaemon.ReadOnly = true badSlave.FakeMysqlDaemon.SetSlavePositionPos = master.FakeMysqlDaemon.CurrentMasterPosition - badSlave.FakeMysqlDaemon.SetMasterInput = fmt.Sprintf("%v:%v", "", topoproto.MysqlPort(master.Tablet)) + badSlave.FakeMysqlDaemon.SetMasterInput = fmt.Sprintf("%v:%v", "", master.Tablet.MysqlPort) badSlave.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE RESET ALL REPLICATION", "FAKE SET SLAVE POSITION", diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index 0f46ea2dcd9..7ad1d7506ec 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -561,8 +561,8 @@ func TestPlannedReparentShardRelayLogErrorStartSlave(t *testing.T) { goodReplica1.FakeMysqlDaemon.Replicating = true goodReplica1.FakeMysqlDaemon.SlaveIORunning = false goodReplica1.FakeMysqlDaemon.SetMasterInput = topoproto.MysqlAddr(master.Tablet) - goodReplica1.FakeMysqlDaemon.CurrentMasterHost = topoproto.MysqlHostname(master.Tablet) - goodReplica1.FakeMysqlDaemon.CurrentMasterPort = int(topoproto.MysqlPort(master.Tablet)) + goodReplica1.FakeMysqlDaemon.CurrentMasterHost = master.Tablet.MysqlHostname + goodReplica1.FakeMysqlDaemon.CurrentMasterPort = int(master.Tablet.MysqlPort) // simulate error that will trigger a call to RestartSlave goodReplica1.FakeMysqlDaemon.StartSlaveError = errors.New("Slave failed to initialize relay log info structure from the repository") goodReplica1.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index 9b31f04f2d7..fdb62de9e41 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -75,8 +75,8 @@ func TestShardReplicationStatuses(t *testing.T) { }, }, } - slave.FakeMysqlDaemon.CurrentMasterHost = topoproto.MysqlHostname(master.Tablet) - slave.FakeMysqlDaemon.CurrentMasterPort = int(topoproto.MysqlPort(master.Tablet)) + slave.FakeMysqlDaemon.CurrentMasterHost = master.Tablet.MysqlHostname + slave.FakeMysqlDaemon.CurrentMasterPort = int(master.Tablet.MysqlPort) slave.StartActionLoop(t, wr) defer slave.StopActionLoop(t) diff --git a/go/vt/wrangler/validator.go b/go/vt/wrangler/validator.go index 375d63bafc5..557977e5df6 100644 --- a/go/vt/wrangler/validator.go +++ b/go/vt/wrangler/validator.go @@ -213,7 +213,7 @@ func (wr *Wrangler) validateReplication(ctx context.Context, shardInfo *topo.Sha for _, tablet := range tabletMap { ip, err := topoproto.MySQLIP(tablet.Tablet) if err != nil { - results <- fmt.Errorf("could not resolve IP for tablet %s: %v", topoproto.MysqlHostname(tablet.Tablet), err) + results <- fmt.Errorf("could not resolve IP for tablet %s: %v", tablet.Tablet.MysqlHostname, err) continue } tabletIPMap[normalizeIP(ip)] = tablet.Tablet @@ -235,7 +235,7 @@ func (wr *Wrangler) validateReplication(ctx context.Context, shardInfo *topo.Sha ip, err := topoproto.MySQLIP(tablet.Tablet) if err != nil { - results <- fmt.Errorf("could not resolve IP for tablet %s: %v", topoproto.MysqlHostname(tablet.Tablet), err) + results <- fmt.Errorf("could not resolve IP for tablet %s: %v", tablet.Tablet.MysqlHostname, err) continue } if !slaveIPMap[normalizeIP(ip)] { From 8339adf8033158766365bb4821fb7029082af801 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Tue, 2 Jun 2020 13:49:20 -0700 Subject: [PATCH 004/430] tm revamp: simplify topo update of mysql port The previous scheme was unnecessarily complex and elaborate. The new code launches a simple standalone goroutine that polls and exits after a successful update. Signed-off-by: Sugu Sougoumarane --- .../fakemysqldaemon/fakemysqldaemon.go | 6 +- go/vt/vttablet/tabletmanager/action_agent.go | 121 ++---------------- go/vt/vttablet/tabletmanager/healthcheck.go | 20 --- .../tabletmanager/healthcheck_test.go | 12 +- go/vt/vttablet/tabletmanager/state_change.go | 24 ++-- .../tabletmanager/state_change_test.go | 25 ++++ .../vreplication/controller_test.go | 11 +- .../tabletmanager/vreplication/engine_test.go | 17 +-- go/vt/wrangler/fake_tablet_test.go | 2 +- .../testlib/external_reparent_test.go | 2 +- go/vt/wrangler/testlib/fake_tablet.go | 2 +- 11 files changed, 78 insertions(+), 164 deletions(-) diff --git a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go index 7f0c9c80067..13698524f0d 100644 --- a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go +++ b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go @@ -50,7 +50,7 @@ type FakeMysqlDaemon struct { // MysqlPort will be returned by GetMysqlPort(). Set to -1 to // return an error. - MysqlPort int32 + MysqlPort sync2.AtomicInt32 // Replicating is updated when calling StartSlave / StopSlave // (it is not used at all when calling SlaveStatus, it is the @@ -210,10 +210,10 @@ func (fmd *FakeMysqlDaemon) Wait(ctx context.Context, cnf *mysqlctl.Mycnf) error // GetMysqlPort is part of the MysqlDaemon interface func (fmd *FakeMysqlDaemon) GetMysqlPort() (int32, error) { - if fmd.MysqlPort == -1 { + if fmd.MysqlPort.Get() == -1 { return 0, fmt.Errorf("FakeMysqlDaemon.GetMysqlPort returns an error") } - return fmd.MysqlPort, nil + return fmd.MysqlPort.Get(), nil } // SlaveStatus is part of the MysqlDaemon interface diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 462941dc9e3..c0837263899 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -136,26 +136,6 @@ type ActionAgent struct { // to have the actionMutex have it. actionMutexLocked bool - // waitingForMysql is set to true if mysql is not up when we - // start. That way, we only log once that we're waiting for - // mysql. It is protected by actionMutex. - waitingForMysql bool - - // gotMysqlPort is set when we got the current MySQL port and - // successfully saved it into the topology. That way we don't - // keep writing to the topology server on every heartbeat, but we - // know to try again if we fail to get it. - // We clear it when the tablet goes from unhealthy to healthy, - // so we are sure to get the up-to-date version in case of - // a MySQL server restart. - // It is protected by actionMutex. - gotMysqlPort bool - - // mysqlAdvertisePort is the port to publish for our own mysqld in the - // tablet record. If this is greater than 0, we simply advertise this value - // instead of asking mysqld what port it's serving on. - mysqlAdvertisePort int32 - // initialTablet remembers the state of the tablet record at startup. // It can be used to notice, for example, if another tablet has taken // over the record. @@ -295,18 +275,13 @@ func NewActionAgent( if appConfig, _ := config.DB.AppWithDB().MysqlParams(); appConfig.Host != "" { mysqlHost = appConfig.Host mysqlPort = int32(appConfig.Port) - - // Remember this port as the advertise port. When we're connecting over - // host:port, it doesn't make sense to ask mysqld for its port after - // connecting. We should just tell others to use the same port we were - // told to use, in case it's a proxy. - agent.mysqlAdvertisePort = mysqlPort } else { // Assume unix socket was specified and try to get the port from mysqld var err error mysqlPort, err = mysqld.GetMysqlPort() if err != nil { - log.Warningf("Cannot get current mysql port, will try to get it later: %v", err) + // We start this loop in Start, after the tablet record ports have been initialized. + log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", *publishRetryInterval, err) } } @@ -448,7 +423,6 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias Cnf: nil, MysqlDaemon: mysqlDaemon, VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), - gotMysqlPort: true, History: history.New(historyLength), DemoteMasterType: demoteMasterType, _healthy: fmt.Errorf("healthcheck not run yet"), @@ -638,17 +612,12 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs if tablet.PortMap == nil { tablet.PortMap = make(map[string]int32) } - if mysqlPort != 0 { - // only overwrite mysql port if we know it, otherwise - // leave it as is. - tablet.MysqlPort = int32(mysqlPort) - } + tablet.MysqlPort = int32(mysqlPort) if vtPort != 0 { tablet.PortMap["vt"] = vtPort } else { delete(tablet.PortMap, "vt") } - delete(tablet.PortMap, "vts") if gRPCPort != 0 { tablet.PortMap["grpc"] = gRPCPort } else { @@ -724,6 +693,16 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs startingTablet.Type = topodatapb.TabletType_UNKNOWN agent.setTablet(startingTablet) + // If mysql port was not specified, we have to discover it. + // This should be started after agent.tablet is initialized. + if mysqlPort == 0 { + // We send the publishRetryInterval as input parameter to + // avoid races in tests. + // TODO(sougou): undo this after proper shutdown procedure + // has been implemented for this goroutine. + go agent.findMysqlPort(*publishRetryInterval) + } + // Start a background goroutine to watch and update the shard record, // to make sure it and our tablet record are in sync. agent.startShardSync() @@ -784,80 +763,6 @@ func (agent *ActionAgent) hookExtraEnv() map[string]string { return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(agent.TabletAlias)} } -// checkTabletMysqlPort will check the mysql port for the tablet is good, -// and if not will try to update it. It returns the modified Tablet record, -// if it was updated successfully in the topology server. -// -// We use the agent.waitingForMysql flag to log only the first -// error we get when trying to get the port from MySQL, and store it in the -// topology. That way we don't spam the logs. -// -// The actionMutex lock must be held when calling this function. -func (agent *ActionAgent) checkTabletMysqlPort(ctx context.Context, tablet *topodatapb.Tablet) *topodatapb.Tablet { - agent.checkLock() - - var mport int32 - - // If we have stored an advertise port, just assume that. - // Otherwise, ask mysqld (presumably over unix socket) what its port is. - if agent.mysqlAdvertisePort > 0 { - mport = agent.mysqlAdvertisePort - } else { - var err error - mport, err = agent.MysqlDaemon.GetMysqlPort() - if err != nil { - // Only log the first time, so we don't spam the logs. - if !agent.waitingForMysql { - log.Warningf("Cannot get current mysql port, not checking it (will retry at healthcheck interval): %v", err) - agent.waitingForMysql = true - } - return nil - } - } - - if mport == tablet.MysqlPort { - // The topology record contains the right port. - // Remember we successfully checked it, and that we're - // not waiting on MySQL to start any more. - agent.gotMysqlPort = true - agent.waitingForMysql = false - return nil - } - - // Update the port in the topology. Use a shorter timeout, so if - // the topo server is busy / throttling us, we don't hang forever here. - // The healthcheck go routine will try again next time. - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - if !agent.waitingForMysql { - log.Warningf("MySQL port has changed from %v to %v, updating it in tablet record", tablet.MysqlPort, mport) - } - newTablet, err := agent.TopoServer.UpdateTabletFields(ctx, tablet.Alias, func(t *topodatapb.Tablet) error { - if err := topotools.CheckOwnership(agent.initialTablet, tablet); err != nil { - return err - } - t.MysqlPort = mport - return nil - }) - if err != nil { - if !agent.waitingForMysql { - // After this, we will try again on every - // heartbeat to go through this code, but we - // won't log it. - log.Warningf("Failed to update tablet record, may use old mysql port: %v", err) - agent.waitingForMysql = true - } - return nil - } - - // Update worked, return the new record, so the agent can save it. - // This should not happen often, so we can log it. - log.Infof("MySQL port has changed from %v to %v, successfully updated the tablet record in topology", tablet.MysqlPort, mport) - agent.gotMysqlPort = true - agent.waitingForMysql = false - return newTablet -} - // withRetry will exponentially back off and retry a function upon // failure, until the context is Done(), or the function returned with // no error. We use this at startup with a context timeout set to the diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index 65edb4f15db..f62b4fa8547 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -239,18 +239,6 @@ func (agent *ActionAgent) runHealthCheckLocked() { // changed because we'll broadcast the latest health // status after this immediately anyway. _ /* state changed */, healthErr = agent.QueryServiceControl.SetServingType(tablet.Type, true, nil) - - if healthErr == nil { - // We were unhealthy, are now healthy, - // make sure we have the right mysql port. - // Also make sure to display any error message. - agent.gotMysqlPort = false - agent.waitingForMysql = false - if updatedTablet := agent.checkTabletMysqlPort(agent.batchCtx, tablet); updatedTablet != nil { - agent.setTablet(updatedTablet) - tablet = updatedTablet - } - } } } else { if isServing { @@ -299,14 +287,6 @@ func (agent *ActionAgent) runHealthCheckLocked() { record.ReplicationDelay = replicationDelay agent.History.Add(record) - // Try to figure out the mysql port if we don't have it yet. - if !agent.gotMysqlPort { - if updatedTablet := agent.checkTabletMysqlPort(agent.batchCtx, tablet); updatedTablet != nil { - agent.setTablet(updatedTablet) - tablet = updatedTablet - } - } - // remember our health status agent.mutex.Lock() agent._healthy = healthErr diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index fbe77c83124..3788c14112c 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -27,6 +27,7 @@ import ( "golang.org/x/net/context" + "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/health" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" @@ -156,7 +157,7 @@ func createTestAgent(ctx context.Context, t *testing.T, preStart func(*ActionAge t.Fatalf("CreateTablet failed: %v", err) } - mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} agent := NewTestActionAgent(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) agent.HealthReporter = &fakeHealthCheck{} @@ -192,8 +193,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { t.Errorf("UpdateStream should be running") } - // first health check, should keep us as replica and serving, - // and update the mysql port to 3306 + // First health check, should keep us as replica and serving. before := time.Now() agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second agent.runHealthCheck() @@ -204,12 +204,6 @@ func TestHealthCheckControlsQueryService(t *testing.T) { if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("First health check failed to go to replica: %v", ti.Type) } - if port := ti.Tablet.MysqlPort; port != 3306 { - t.Errorf("First health check failed to update mysql port: %v", port) - } - if !agent.gotMysqlPort { - t.Errorf("Healthcheck didn't record it updated the MySQL port.") - } if !agent.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 011d2ad35ea..89fc6b37bb7 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -149,14 +149,6 @@ func (agent *ActionAgent) refreshTablet(ctx context.Context, reason string) erro } tablet := ti.Tablet - // Also refresh the MySQL port, to be sure it's correct. - // Note if this run doesn't succeed, the healthcheck go routine - // will try again. - agent.gotMysqlPort = false - agent.waitingForMysql = false - if updatedTablet := agent.checkTabletMysqlPort(ctx, tablet); updatedTablet != nil { - tablet = updatedTablet - } // Also refresh masterTermStartTime agent.setMasterTermStartTime(logutil.ProtoToTime(tablet.MasterTermStartTime)) agent.updateState(ctx, tablet, reason) @@ -436,3 +428,19 @@ func (agent *ActionAgent) retryPublish() { return } } + +func (agent *ActionAgent) findMysqlPort(retryInterval time.Duration) { + for { + time.Sleep(retryInterval) + mport, err := agent.MysqlDaemon.GetMysqlPort() + if err != nil { + continue + } + log.Infof("Identified mysql port: %v", mport) + agent.pubMu.Lock() + agent.tablet.MysqlPort = mport + agent.pubMu.Unlock() + agent.publishState(agent.batchCtx) + return + } +} diff --git a/go/vt/vttablet/tabletmanager/state_change_test.go b/go/vt/vttablet/tabletmanager/state_change_test.go index ae5a1fd18aa..0cf71558691 100644 --- a/go/vt/vttablet/tabletmanager/state_change_test.go +++ b/go/vt/vttablet/tabletmanager/state_change_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" + "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" ) func TestPublishState(t *testing.T) { @@ -70,3 +71,27 @@ func TestPublishState(t *testing.T) { require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) } + +func TestFindMysqlPort(t *testing.T) { + defer func(saved time.Duration) { *publishRetryInterval = saved }(*publishRetryInterval) + *publishRetryInterval = 1 * time.Millisecond + + ctx := context.Background() + agent := createTestAgent(ctx, t, nil) + ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + require.NoError(t, err) + assert.Equal(t, ttablet.MysqlPort, int32(0)) + + agent.pubMu.Lock() + agent.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) + agent.pubMu.Unlock() + for i := 0; i < 10; i++ { + ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + require.NoError(t, err) + if ttablet.MysqlPort == 3306 { + return + } + time.Sleep(5 * time.Millisecond) + } + assert.Fail(t, "mysql port was not updated") +} diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller_test.go b/go/vt/vttablet/tabletmanager/vreplication/controller_test.go index 88d78eb05f7..b922a74fc21 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller_test.go @@ -25,6 +25,7 @@ import ( "golang.org/x/net/context" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" "vitess.io/vitess/go/vt/mysqlctl/tmutils" @@ -74,7 +75,7 @@ func TestControllerKeyRange(t *testing.T) { dbClient.ExpectRequest("commit", nil, nil) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "replica", nil, nil) if err != nil { @@ -110,7 +111,7 @@ func TestControllerTables(t *testing.T) { dbClientFactory := func() binlogplayer.DBClient { return dbClient } mysqld := &fakemysqldaemon.FakeMysqlDaemon{ - MysqlPort: 3306, + MysqlPort: sync2.NewAtomicInt32(3306), Schema: &tabletmanagerdatapb.SchemaDefinition{ DatabaseSchema: "", TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ @@ -201,7 +202,7 @@ func TestControllerOverrides(t *testing.T) { dbClient.ExpectRequest("commit", nil, nil) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "rdonly", nil, nil) if err != nil { @@ -267,7 +268,7 @@ func TestControllerRetry(t *testing.T) { dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) dbClient.ExpectRequest("commit", nil, nil) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "rdonly", nil, nil) if err != nil { @@ -313,7 +314,7 @@ func TestControllerStopPosition(t *testing.T) { dbClient.ExpectRequest("update _vt.vreplication set state='Stopped', message='Reached stopping position, done playing logs' where id=1", testDMLResponse, nil) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "replica", nil, nil) if err != nil { diff --git a/go/vt/vttablet/tabletmanager/vreplication/engine_test.go b/go/vt/vttablet/tabletmanager/vreplication/engine_test.go index feccaa71b3f..bf4392bbe3f 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/engine_test.go @@ -26,6 +26,7 @@ import ( "golang.org/x/net/context" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" ) @@ -37,7 +38,7 @@ func TestEngineOpen(t *testing.T) { resetBinlogClient() dbClient := binlogplayer.NewMockDBClient(t) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} // Test Insert @@ -85,7 +86,7 @@ func TestEngineExec(t *testing.T) { resetBinlogClient() dbClient := binlogplayer.NewMockDBClient(t) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} // Test Insert @@ -247,7 +248,7 @@ func TestEngineBadInsert(t *testing.T) { dbClient := binlogplayer.NewMockDBClient(t) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} vre := NewTestEngine(env.TopoServ, env.Cells[0], mysqld, dbClientFactory, dbClient.DBName(), nil) @@ -277,7 +278,7 @@ func TestEngineSelect(t *testing.T) { dbClient := binlogplayer.NewMockDBClient(t) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} vre := NewTestEngine(env.TopoServ, env.Cells[0], mysqld, dbClientFactory, dbClient.DBName(), nil) @@ -312,7 +313,7 @@ func TestWaitForPos(t *testing.T) { waitRetryTime = 10 * time.Millisecond dbClient := binlogplayer.NewMockDBClient(t) - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} dbClientFactory := func() binlogplayer.DBClient { return dbClient } vre := NewTestEngine(env.TopoServ, env.Cells[0], mysqld, dbClientFactory, dbClient.DBName(), nil) @@ -342,7 +343,7 @@ func TestWaitForPos(t *testing.T) { func TestWaitForPosError(t *testing.T) { dbClient := binlogplayer.NewMockDBClient(t) - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} dbClientFactory := func() binlogplayer.DBClient { return dbClient } vre := NewTestEngine(env.TopoServ, env.Cells[0], mysqld, dbClientFactory, dbClient.DBName(), nil) @@ -384,7 +385,7 @@ func TestWaitForPosError(t *testing.T) { func TestWaitForPosCancel(t *testing.T) { dbClient := binlogplayer.NewMockDBClient(t) - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} dbClientFactory := func() binlogplayer.DBClient { return dbClient } vre := NewTestEngine(env.TopoServ, env.Cells[0], mysqld, dbClientFactory, dbClient.DBName(), nil) @@ -430,7 +431,7 @@ func TestCreateDBAndTable(t *testing.T) { resetBinlogClient() dbClient := binlogplayer.NewMockDBClient(t) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: 3306} + mysqld := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(3306)} // Test Insert diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index 02688951571..e71e3add497 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -128,7 +128,7 @@ func newFakeTablet(t *testing.T, wr *Wrangler, cell string, uid uint32, tabletTy // create a FakeMysqlDaemon with the right information by default fakeMysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) - fakeMysqlDaemon.MysqlPort = mysqlPort + fakeMysqlDaemon.MysqlPort.Set(mysqlPort) return &fakeTablet{ Tablet: tablet, diff --git a/go/vt/wrangler/testlib/external_reparent_test.go b/go/vt/wrangler/testlib/external_reparent_test.go index 6ca8887a41c..39a23b0a1e9 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -220,7 +220,7 @@ func TestTabletExternallyReparentedWithDifferentMysqlPort(t *testing.T) { // On the elected master, we will respond to // TabletActionSlaveWasPromoted, so we need a MysqlDaemon // that returns no master, and the new port (as returned by mysql) - newMaster.FakeMysqlDaemon.MysqlPort = 3303 + newMaster.FakeMysqlDaemon.MysqlPort.Set(3303) newMaster.StartActionLoop(t, wr) defer newMaster.StopActionLoop(t) diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index a67d81a8b82..847a130718c 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -150,7 +150,7 @@ func NewFakeTablet(t *testing.T, wr *wrangler.Wrangler, cell string, uid uint32, // create a FakeMysqlDaemon with the right information by default fakeMysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) - fakeMysqlDaemon.MysqlPort = mysqlPort + fakeMysqlDaemon.MysqlPort.Set(mysqlPort) return &FakeTablet{ Tablet: tablet, From ff3145bc93d6715339e60a6f96befac9501affad Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 5 Jun 2020 19:48:58 -0700 Subject: [PATCH 005/430] tm revamp: fix e2e tabletmanager test Signed-off-by: Sugu Sougoumarane --- .../tabletmanager/tablet_health_test.go | 131 +++++++++--------- 1 file changed, 67 insertions(+), 64 deletions(-) diff --git a/go/test/endtoend/tabletmanager/tablet_health_test.go b/go/test/endtoend/tabletmanager/tablet_health_test.go index ee7e43790e2..c4c1802cf17 100644 --- a/go/test/endtoend/tabletmanager/tablet_health_test.go +++ b/go/test/endtoend/tabletmanager/tablet_health_test.go @@ -41,11 +41,11 @@ func TestTabletReshuffle(t *testing.T) { ctx := context.Background() masterConn, err := mysql.Connect(ctx, &masterTabletParams) - require.Nil(t, err) + require.NoError(t, err) defer masterConn.Close() replicaConn, err := mysql.Connect(ctx, &replicaTabletParams) - require.Nil(t, err) + require.NoError(t, err) defer replicaConn.Close() // Sanity Check @@ -58,7 +58,7 @@ func TestTabletReshuffle(t *testing.T) { //Init Tablets err = clusterInstance.VtctlclientProcess.InitTablet(rTablet, cell, keyspaceName, hostname, shardName) - require.Nil(t, err) + require.NoError(t, err) // mycnf_server_id prevents vttablet from reading the mycnf // Pointing to masterTablet's socket file @@ -67,10 +67,12 @@ func TestTabletReshuffle(t *testing.T) { "-mycnf_server_id", fmt.Sprintf("%d", rTablet.TabletUID), "-db_socket", fmt.Sprintf("%s/mysql.sock", masterTablet.VttabletProcess.Directory), } + defer func() { clusterInstance.VtTabletExtraArgs = []string{} }() + // SupportsBackup=False prevents vttablet from trying to restore // Start vttablet process err = clusterInstance.StartVttablet(rTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) - require.Nil(t, err) + require.NoError(t, err) sql := "select value from t1" args := []string{ @@ -81,14 +83,12 @@ func TestTabletReshuffle(t *testing.T) { sql, } result, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput(args...) - require.Nil(t, err) + require.NoError(t, err) assertExcludeFields(t, result) err = clusterInstance.VtctlclientProcess.ExecuteCommand("Backup", rTablet.Alias) assert.Error(t, err, "cannot perform backup without my.cnf") - // Reset the VtTabletExtraArgs - clusterInstance.VtTabletExtraArgs = []string{} killTablets(t, rTablet) } @@ -102,7 +102,7 @@ func TestHealthCheck(t *testing.T) { // Start Mysql Processes and return connection replicaConn, err := cluster.StartMySQLAndGetConnection(ctx, rTablet, username, clusterInstance.TmpDirectory) - require.Nil(t, err) + require.NoError(t, err) defer replicaConn.Close() @@ -111,18 +111,18 @@ func TestHealthCheck(t *testing.T) { //Init Replica Tablet err = clusterInstance.VtctlclientProcess.InitTablet(rTablet, cell, keyspaceName, hostname, shardName) - require.Nil(t, err) + require.NoError(t, err) // start vttablet process, should be in SERVING state as we already have a master err = clusterInstance.StartVttablet(rTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) - require.Nil(t, err) + require.NoError(t, err) masterConn, err := mysql.Connect(ctx, &masterTabletParams) - require.Nil(t, err) + require.NoError(t, err) defer masterConn.Close() err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) checkHealth(t, rTablet.HTTPPort, false) // Make sure the master is still master @@ -131,25 +131,25 @@ func TestHealthCheck(t *testing.T) { // stop replication, make sure we don't go unhealthy. err = clusterInstance.VtctlclientProcess.ExecuteCommand("StopSlave", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) // make sure the health stream is updated result, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("VtTabletStreamHealth", "-count", "1", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) verifyStreamHealth(t, result) // then restart replication, make sure we stay healthy err = clusterInstance.VtctlclientProcess.ExecuteCommand("StopSlave", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) checkHealth(t, rTablet.HTTPPort, false) // now test VtTabletStreamHealth returns the right thing result, err = clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("VtTabletStreamHealth", "-count", "2", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) scanner := bufio.NewScanner(strings.NewReader(result)) for scanner.Scan() { verifyStreamHealth(t, scanner.Text()) @@ -162,7 +162,7 @@ func TestHealthCheck(t *testing.T) { func checkHealth(t *testing.T, port int, shouldError bool) { url := fmt.Sprintf("http://localhost:%d/healthz", port) resp, err := http.Get(url) - require.Nil(t, err) + require.NoError(t, err) if shouldError { assert.True(t, resp.StatusCode > 400) } else { @@ -172,11 +172,11 @@ func checkHealth(t *testing.T, port int, shouldError bool) { func checkTabletType(t *testing.T, tabletAlias string, typeWant string) { result, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("GetTablet", tabletAlias) - require.Nil(t, err) + require.NoError(t, err) var tablet topodatapb.Tablet err = json2.Unmarshal([]byte(result), &tablet) - require.Nil(t, err) + require.NoError(t, err) actualType := tablet.GetType() got := fmt.Sprintf("%d", actualType) @@ -190,7 +190,7 @@ func checkTabletType(t *testing.T, tabletAlias string, typeWant string) { func verifyStreamHealth(t *testing.T, result string) { var streamHealthResponse querypb.StreamHealthResponse err := json2.Unmarshal([]byte(result), &streamHealthResponse) - require.Nil(t, err) + require.NoError(t, err) serving := streamHealthResponse.GetServing() UID := streamHealthResponse.GetTabletAlias().GetUid() realTimeStats := streamHealthResponse.GetRealtimeStats() @@ -210,7 +210,7 @@ func TestHealthCheckDrainedStateDoesNotShutdownQueryService(t *testing.T) { //Wait if tablet is not in service state defer cluster.PanicHandler(t) err := rdonlyTablet.VttabletProcess.WaitForTabletType("SERVING") - require.Nil(t, err) + require.NoError(t, err) // Check tablet health checkHealth(t, rdonlyTablet.HTTPPort, false) @@ -221,30 +221,30 @@ func TestHealthCheckDrainedStateDoesNotShutdownQueryService(t *testing.T) { // implementation.) The tablet will stay healthy, and the // query service is still running. err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeSlaveType", rdonlyTablet.Alias, "drained") - require.Nil(t, err) + require.NoError(t, err) // Trying to drain the same tablet again, should error err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeSlaveType", rdonlyTablet.Alias, "drained") assert.Error(t, err, "already drained") err = clusterInstance.VtctlclientProcess.ExecuteCommand("StopSlave", rdonlyTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) // Trigger healthcheck explicitly to avoid waiting for the next interval. err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rdonlyTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) checkTabletType(t, rdonlyTablet.Alias, "DRAINED") // Query service is still running. err = rdonlyTablet.VttabletProcess.WaitForTabletType("SERVING") - require.Nil(t, err) + require.NoError(t, err) // Restart replication. Tablet will become healthy again. err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeSlaveType", rdonlyTablet.Alias, "rdonly") - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.ExecuteCommand("StartSlave", rdonlyTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rdonlyTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) checkHealth(t, rdonlyTablet.HTTPPort, false) } @@ -264,7 +264,7 @@ func TestIgnoreHealthError(t *testing.T) { tablet := clusterInstance.NewVttabletInstance("replica", 0, "") tablet.MysqlctlProcess = *cluster.MysqlCtlProcessInstance(tablet.TabletUID, tablet.MySQLPort, clusterInstance.TmpDirectory) err := tablet.MysqlctlProcess.Start() - require.Nil(t, err) + require.NoError(t, err) // start vttablet process tablet.VttabletProcess = cluster.VttabletProcessInstance(tablet.HTTPPort, @@ -287,32 +287,32 @@ func TestIgnoreHealthError(t *testing.T) { // Init Tablet err = clusterInstance.VtctlclientProcess.InitTablet(tablet, cell, keyspaceName, hostname, newShard.Name) - require.Nil(t, err) + require.NoError(t, err) // create database err = tablet.VttabletProcess.CreateDB(keyspaceName) - require.Nil(t, err) + require.NoError(t, err) // Start Vttablet, it should be NOT_SERVING as there is no master err = clusterInstance.StartVttablet(tablet, "NOT_SERVING", false, cell, keyspaceName, hostname, newShard.Name) - require.Nil(t, err) + require.NoError(t, err) // Force it healthy. err = clusterInstance.VtctlclientProcess.ExecuteCommand("IgnoreHealthError", tablet.Alias, ".*no slave status.*") - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", tablet.Alias) - require.Nil(t, err) + require.NoError(t, err) err = tablet.VttabletProcess.WaitForTabletType("SERVING") - require.Nil(t, err) + require.NoError(t, err) checkHealth(t, tablet.HTTPPort, false) // Turn off the force-healthy. err = clusterInstance.VtctlclientProcess.ExecuteCommand("IgnoreHealthError", tablet.Alias, "") - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", tablet.Alias) - require.Nil(t, err) + require.NoError(t, err) err = tablet.VttabletProcess.WaitForTabletType("NOT_SERVING") - require.Nil(t, err) + require.NoError(t, err) checkHealth(t, tablet.HTTPPort, true) // Tear down custom processes @@ -326,16 +326,21 @@ func TestNoMysqlHealthCheck(t *testing.T) { defer cluster.PanicHandler(t) ctx := context.Background() + clusterInstance.VtTabletExtraArgs = []string{ + "-publish_retry_interval", "1s", + } + defer func() { clusterInstance.VtTabletExtraArgs = []string{} }() + rTablet := clusterInstance.NewVttabletInstance("replica", 0, "") mTablet := clusterInstance.NewVttabletInstance("replica", 0, "") // Start Mysql Processes and return connection masterConn, err := cluster.StartMySQLAndGetConnection(ctx, mTablet, username, clusterInstance.TmpDirectory) - require.Nil(t, err) + require.NoError(t, err) defer masterConn.Close() replicaConn, err := cluster.StartMySQLAndGetConnection(ctx, rTablet, username, clusterInstance.TmpDirectory) - require.Nil(t, err) + require.NoError(t, err) defer replicaConn.Close() // Create database in mysql @@ -356,21 +361,21 @@ func TestNoMysqlHealthCheck(t *testing.T) { // now shutdown all mysqld err = rTablet.MysqlctlProcess.Stop() - require.Nil(t, err) + require.NoError(t, err) err = mTablet.MysqlctlProcess.Stop() - require.Nil(t, err) + require.NoError(t, err) //Init Tablets err = clusterInstance.VtctlclientProcess.InitTablet(mTablet, cell, keyspaceName, hostname, shardName) - require.Nil(t, err) + require.NoError(t, err) err = clusterInstance.VtctlclientProcess.InitTablet(rTablet, cell, keyspaceName, hostname, shardName) - require.Nil(t, err) + require.NoError(t, err) // Start vttablet process, should be in NOT_SERVING state as mysqld is not running err = clusterInstance.StartVttablet(mTablet, "NOT_SERVING", false, cell, keyspaceName, hostname, shardName) - require.Nil(t, err, "error should be Nil") + require.NoError(t, err) err = clusterInstance.StartVttablet(rTablet, "NOT_SERVING", false, cell, keyspaceName, hostname, shardName) - require.Nil(t, err, "error should be Nil") + require.NoError(t, err) // Check Health should fail as Mysqld is not found checkHealth(t, mTablet.HTTPPort, true) @@ -384,35 +389,35 @@ func TestNoMysqlHealthCheck(t *testing.T) { //The above notice to not fix replication should survive tablet restart. err = rTablet.VttabletProcess.TearDown() - require.Nil(t, err) + require.NoError(t, err) err = rTablet.VttabletProcess.Setup() - require.Nil(t, err) + require.NoError(t, err) // restart mysqld rTablet.MysqlctlProcess.InitMysql = false err = rTablet.MysqlctlProcess.Start() - require.Nil(t, err) + require.NoError(t, err) mTablet.MysqlctlProcess.InitMysql = false err = mTablet.MysqlctlProcess.Start() - require.Nil(t, err) + require.NoError(t, err) // the master should still be healthy err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", mTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) checkHealth(t, mTablet.HTTPPort, false) // the slave will now be healthy, but report a very high replication // lag, because it can't figure out what it exactly is. err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) assert.Equal(t, "SERVING", rTablet.VttabletProcess.GetTabletStatus()) checkHealth(t, rTablet.HTTPPort, false) result, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("VtTabletStreamHealth", "-count", "1", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) var streamHealthResponse querypb.StreamHealthResponse err = json2.Unmarshal([]byte(result), &streamHealthResponse) - require.Nil(t, err) + require.NoError(t, err) realTimeStats := streamHealthResponse.GetRealtimeStats() secondsBehindMaster := realTimeStats.GetSecondsBehindMaster() assert.True(t, secondsBehindMaster == 7200) @@ -420,15 +425,15 @@ func TestNoMysqlHealthCheck(t *testing.T) { // restart replication, wait until health check goes small // (a value of zero is default and won't be in structure) err = clusterInstance.VtctlclientProcess.ExecuteCommand("StartSlave", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) timeout := time.Now().Add(10 * time.Second) for time.Now().Before(timeout) { result, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("VtTabletStreamHealth", "-count", "1", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) var streamHealthResponse querypb.StreamHealthResponse err = json2.Unmarshal([]byte(result), &streamHealthResponse) - require.Nil(t, err) + require.NoError(t, err) realTimeStats := streamHealthResponse.GetRealtimeStats() secondsBehindMaster := realTimeStats.GetSecondsBehindMaster() if secondsBehindMaster < 30 { @@ -440,13 +445,11 @@ func TestNoMysqlHealthCheck(t *testing.T) { // wait for the tablet to fix its mysql port result, err = clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput("GetTablet", rTablet.Alias) - require.Nil(t, err) + require.NoError(t, err) var tablet topodatapb.Tablet err = json2.Unmarshal([]byte(result), &tablet) - require.Nil(t, err) - portMap := tablet.GetPortMap() - mysqlPort := int(portMap["mysql"]) - assert.True(t, mysqlPort == rTablet.MySQLPort, "mysql port in tablet record") + require.NoError(t, err) + assert.Equal(t, int32(rTablet.MySQLPort), tablet.MysqlPort, "mysql port in tablet record") // Tear down custom processes killTablets(t, rTablet, mTablet) From 7d8d899b8012a9c48c451e05bcad8da9cd56bb0f Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 5 Jun 2020 22:35:45 -0700 Subject: [PATCH 006/430] tm revamp: deprecate demoteMasterType No one knows this exists, and no one uses it. The intuitive tablet type is the one from init_tablet_type, which everybody already sets while starting a vttablet. Because this is the only use case in real life, this change also requires init_tablet_type to be always specified. Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/action_agent.go | 39 ++++++++----------- go/vt/vttablet/tabletmanager/init_tablet.go | 21 ++-------- .../tabletmanager/init_tablet_test.go | 18 ++++----- go/vt/vttablet/tabletmanager/shard_sync.go | 6 +-- .../testlib/external_reparent_test.go | 13 +++---- 5 files changed, 36 insertions(+), 61 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index c0837263899..f4b61f7a28b 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -82,7 +82,6 @@ const ( var ( tabletHostname = flag.String("tablet_hostname", "", "if not empty, this hostname will be assumed instead of trying to resolve it") - demoteMasterType = flag.String("demote_master_type", "REPLICA", "the tablet type a demoted master will transition to") initPopulateMetadata = flag.Bool("init_populate_metadata", false, "(init parameter) populate metadata tables even if restore_from_backup is disabled. If restore_from_backup is enabled, metadata tables are always populated regardless of this flag.") ) @@ -98,7 +97,9 @@ type ActionAgent struct { MysqlDaemon mysqlctl.MysqlDaemon DBConfigs *dbconfigs.DBConfigs VREngine *vreplication.Engine - DemoteMasterType topodatapb.TabletType + // BaseTabletType is the tablet type we revert back to + // when we transition back from something like MASTER. + BaseTabletType topodatapb.TabletType // exportStats is set only for production tablet. exportStats bool @@ -234,7 +235,7 @@ func NewActionAgent( return nil, err } - demoteMasterTabletType, err := validateDemoteMasterType() + baseTabletType, err := validateInitTabletType(*initTabletType) if err != nil { return nil, err } @@ -248,7 +249,7 @@ func NewActionAgent( Cnf: mycnf, MysqlDaemon: mysqld, History: history.New(historyLength), - DemoteMasterType: demoteMasterTabletType, + BaseTabletType: baseTabletType, _healthy: fmt.Errorf("healthcheck not run yet"), orc: orc, } @@ -366,11 +367,6 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * panic(vterrors.Wrap(err, "failed reading tablet")) } - demoteMasterTabletType, err := validateDemoteMasterType() - if err != nil { - panic(vterrors.Wrapf(err, "failed to parse tablet type %v", demoteMasterTabletType)) - } - agent := &ActionAgent{ QueryServiceControl: tabletservermock.NewController(), UpdateStream: binlog.NewUpdateStreamControlMock(), @@ -382,7 +378,7 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * MysqlDaemon: mysqlDaemon, VREngine: vreplication.NewTestEngine(ts, tabletAlias.Cell, mysqlDaemon, binlogplayer.NewFakeDBClient, ti.DbName(), nil), History: history.New(historyLength), - DemoteMasterType: demoteMasterTabletType, + BaseTabletType: topodatapb.TabletType_REPLICA, _healthy: fmt.Errorf("healthcheck not run yet"), } if preStart != nil { @@ -407,10 +403,10 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * // NewComboActionAgent creates an agent tailored specifically to run // within the vtcombo binary. It cannot be called concurrently, // as it changes the flags. -func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, queryServiceControl tabletserver.Controller, dbcfgs *dbconfigs.DBConfigs, mysqlDaemon mysqlctl.MysqlDaemon, keyspace, shard, dbname, tabletType string) *ActionAgent { - demoteMasterType, err := validateDemoteMasterType() +func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, queryServiceControl tabletserver.Controller, dbcfgs *dbconfigs.DBConfigs, mysqlDaemon mysqlctl.MysqlDaemon, keyspace, shard, dbname, tabletTypeStr string) *ActionAgent { + baseTabletType, err := validateInitTabletType(tabletTypeStr) if err != nil { - panic(vterrors.Wrapf(err, "failed to parse tablet type %v", tabletType)) + panic(err) } agent := &ActionAgent{ @@ -424,7 +420,7 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias MysqlDaemon: mysqlDaemon, VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), History: history.New(historyLength), - DemoteMasterType: demoteMasterType, + BaseTabletType: baseTabletType, _healthy: fmt.Errorf("healthcheck not run yet"), } agent.registerQueryRuleSources() @@ -433,7 +429,6 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *initDbNameOverride = dbname *initKeyspace = keyspace *initShard = shard - *initTabletType = tabletType if err := agent.InitTablet(vtPort, grpcPort); err != nil { panic(vterrors.Wrap(err, "agent.InitTablet failed")) } @@ -793,16 +788,14 @@ func (agent *ActionAgent) withRetry(ctx context.Context, description string, wor } } -func validateDemoteMasterType() (topodatapb.TabletType, error) { - tabletType, err := topoproto.ParseTabletType(*demoteMasterType) +func validateInitTabletType(tabletTypeStr string) (topodatapb.TabletType, error) { + tabletType, err := topoproto.ParseTabletType(tabletTypeStr) if err != nil { return topodatapb.TabletType_UNKNOWN, err } - if tabletType != topodatapb.TabletType_SPARE && tabletType != topodatapb.TabletType_REPLICA { - return topodatapb.TabletType_UNKNOWN, fmt.Errorf("invalid demote_master_type %v; can only be REPLICA or SPARE", tabletType) - } - if tabletType == topodatapb.TabletType_SPARE && !*mysqlctl.DisableActiveReparents { - return topodatapb.TabletType_UNKNOWN, fmt.Errorf("demote to SPARE is only allowed when active reparents is disabled (set the -disable_active_reparents flag to disable)") + switch tabletType { + case topodatapb.TabletType_SPARE, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY: + return tabletType, nil } - return tabletType, nil + return topodatapb.TabletType_UNKNOWN, fmt.Errorf("invalid init_tablet_type %v; can only be REPLICA, RDONLY or SPARE", tabletType) } diff --git a/go/vt/vttablet/tabletmanager/init_tablet.go b/go/vt/vttablet/tabletmanager/init_tablet.go index f1ca125ea64..eda8523bfd7 100644 --- a/go/vt/vttablet/tabletmanager/init_tablet.go +++ b/go/vt/vttablet/tabletmanager/init_tablet.go @@ -53,26 +53,11 @@ func init() { // InitTablet initializes the tablet record if necessary. func (agent *ActionAgent) InitTablet(port, gRPCPort int32) error { - // it should be either we have all three of init_keyspace, - // init_shard and init_tablet_type, or none. - if *initKeyspace == "" && *initShard == "" && *initTabletType == "" { - // not initializing the record - return nil - } - if *initKeyspace == "" || *initShard == "" || *initTabletType == "" { - return fmt.Errorf("either need all of init_keyspace, init_shard and init_tablet_type, or none") + if *initKeyspace == "" || *initShard == "" { + return fmt.Errorf("init_keyspace and init_shard must be specified") } - // parse init_tablet_type - tabletType, err := topoproto.ParseTabletType(*initTabletType) - if err != nil { - return vterrors.Wrapf(err, "invalid init_tablet_type %v", *initTabletType) - } - if tabletType == topodatapb.TabletType_MASTER { - // We disallow MASTER, so we don't have to change - // shard.MasterAlias, and deal with the corner cases. - return fmt.Errorf("init_tablet_type cannot be master, use replica instead") - } + tabletType := agent.BaseTabletType // parse and validate shard name shard, keyRange, err := topo.ValidateShardName(*initShard) diff --git a/go/vt/vttablet/tabletmanager/init_tablet_test.go b/go/vt/vttablet/tabletmanager/init_tablet_test.go index 897d004a9b6..918352d92c7 100644 --- a/go/vt/vttablet/tabletmanager/init_tablet_test.go +++ b/go/vt/vttablet/tabletmanager/init_tablet_test.go @@ -179,14 +179,15 @@ func TestInitTablet(t *testing.T) { gRPCPort := int32(3456) mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) agent := &ActionAgent{ - TopoServer: ts, - TabletAlias: tabletAlias, - MysqlDaemon: mysqlDaemon, - DBConfigs: &dbconfigs.DBConfigs{}, - VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), - batchCtx: ctx, - History: history.New(historyLength), - _healthy: fmt.Errorf("healthcheck not run yet"), + TopoServer: ts, + TabletAlias: tabletAlias, + MysqlDaemon: mysqlDaemon, + DBConfigs: &dbconfigs.DBConfigs{}, + VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), + batchCtx: ctx, + History: history.New(historyLength), + BaseTabletType: topodatapb.TabletType_REPLICA, + _healthy: fmt.Errorf("healthcheck not run yet"), } // 1. Initialize the tablet as REPLICA. @@ -197,7 +198,6 @@ func TestInitTablet(t *testing.T) { *tabletHostname = "localhost" *initKeyspace = "test_keyspace" *initShard = "-C0" - *initTabletType = "replica" tabletAlias = &topodatapb.TabletAlias{ Cell: "cell1", Uid: 2, diff --git a/go/vt/vttablet/tabletmanager/shard_sync.go b/go/vt/vttablet/tabletmanager/shard_sync.go index 86c57cc2211..673ed7898a9 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync.go +++ b/go/vt/vttablet/tabletmanager/shard_sync.go @@ -195,15 +195,15 @@ func syncShardMaster(ctx context.Context, ts *topo.Server, tablet *topodatapb.Ta // We just directly update our tablet type to REPLICA. func (agent *ActionAgent) abortMasterTerm(ctx context.Context, masterAlias *topodatapb.TabletAlias) error { masterAliasStr := topoproto.TabletAliasString(masterAlias) - log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, agent.DemoteMasterType) + log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, agent.BaseTabletType) if *mysqlctl.DisableActiveReparents { // Don't touch anything at the MySQL level. Just update tablet state. log.Infof("Active reparents are disabled; updating tablet state only.") changeTypeCtx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancel() - if err := agent.ChangeType(changeTypeCtx, agent.DemoteMasterType); err != nil { - return vterrors.Wrapf(err, "failed to change type to %v", agent.DemoteMasterType) + if err := agent.ChangeType(changeTypeCtx, agent.BaseTabletType); err != nil { + return vterrors.Wrapf(err, "failed to change type to %v", agent.BaseTabletType) } return nil } diff --git a/go/vt/wrangler/testlib/external_reparent_test.go b/go/vt/wrangler/testlib/external_reparent_test.go index 39a23b0a1e9..111a1bb8714 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -439,14 +439,8 @@ func TestTabletExternallyReparentedRerun(t *testing.T) { } func TestRPCTabletExternallyReparentedDemotesMasterToConfiguredTabletType(t *testing.T) { - flag.Set("demote_master_type", "spare") flag.Set("disable_active_reparents", "true") - - // Reset back to default values - defer func() { - flag.Set("demote_master_type", "replica") - flag.Set("disable_active_reparents", "false") - }() + defer flag.Set("disable_active_reparents", "false") ctx := context.Background() ts := memorytopo.NewServer("cell1") @@ -458,10 +452,13 @@ func TestRPCTabletExternallyReparentedDemotesMasterToConfiguredTabletType(t *tes oldMaster.StartActionLoop(t, wr) newMaster.StartActionLoop(t, wr) - defer oldMaster.StopActionLoop(t) defer newMaster.StopActionLoop(t) + // For a real Agent, this would be initialized from initTabletType. + oldMaster.Agent.BaseTabletType = topodatapb.TabletType_SPARE + newMaster.Agent.BaseTabletType = topodatapb.TabletType_SPARE + // Build keyspace graph err := topotools.RebuildKeyspace(context.Background(), logutil.NewConsoleLogger(), ts, oldMaster.Tablet.Keyspace, []string{"cell1"}) assert.NoError(t, err, "RebuildKeyspaceLocked failed: %v", err) From 0a33587bd747e4315487aba55a7e1b070a0f48f9 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 6 Jun 2020 19:24:27 -0700 Subject: [PATCH 007/430] tm revamp: fix reparent test Signed-off-by: Sugu Sougoumarane --- go/test/endtoend/reparent/reparent_test.go | 23 +--------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/go/test/endtoend/reparent/reparent_test.go b/go/test/endtoend/reparent/reparent_test.go index e160d3d9610..cf46e929ba0 100644 --- a/go/test/endtoend/reparent/reparent_test.go +++ b/go/test/endtoend/reparent/reparent_test.go @@ -204,14 +204,6 @@ func TestReparentCrossCell(t *testing.T) { } func TestReparentGraceful(t *testing.T) { - reparentGraceful(t, false) -} - -func TestReparentGracefulRecovery(t *testing.T) { - reparentGraceful(t, true) -} - -func reparentGraceful(t *testing.T, confusedMaster bool) { defer cluster.PanicHandler(t) ctx := context.Background() @@ -270,20 +262,7 @@ func reparentGraceful(t *testing.T, confusedMaster bool) { checkMasterTablet(t, tablet62044) - // Simulate a master that forgets it's master and becomes replica. - // PlannedReparentShard should be able to recover by reparenting to the same master again, - // as long as all tablets are available to check that it's safe. - if confusedMaster { - tablet62044.Type = "replica" - err = clusterInstance.VtctlclientProcess.InitTablet(tablet62044, tablet62044.Cell, keyspaceName, hostname, shardName) - require.Nil(t, err) - - err = clusterInstance.VtctlclientProcess.ExecuteCommand("RefreshState", tablet62044.Alias) - require.Nil(t, err) - } - - // Perform a graceful reparent to the same master. - // It should be idempotent, and should fix any inconsistencies if necessary + // A graceful reparent to the same master should be idempotent. err = clusterInstance.VtctlclientProcess.ExecuteCommand( "PlannedReparentShard", "-keyspace_shard", fmt.Sprintf("%s/%s", keyspaceName, shardName), From 65084c3d0656b157b8b628f8f3ee107594852631 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 7 Jun 2020 15:21:05 -0700 Subject: [PATCH 008/430] tm revamp: move mysql check inside Start Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/action_agent.go | 43 +++++++++----------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index f4b61f7a28b..f4d3edcdd6d 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -271,23 +271,8 @@ func NewActionAgent( agent.statsTabletTypeCount = stats.NewCountersWithSingleLabel("TabletTypeCount", "Number of times the tablet changed to the labeled type", "type") agent.statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) - var mysqlHost string - var mysqlPort int32 - if appConfig, _ := config.DB.AppWithDB().MysqlParams(); appConfig.Host != "" { - mysqlHost = appConfig.Host - mysqlPort = int32(appConfig.Port) - } else { - // Assume unix socket was specified and try to get the port from mysqld - var err error - mysqlPort, err = mysqld.GetMysqlPort() - if err != nil { - // We start this loop in Start, after the tablet record ports have been initialized. - log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", *publishRetryInterval, err) - } - } - // Start will get the tablet info, and update our state from it - if err := agent.Start(batchCtx, config.DB, mysqlHost, int32(mysqlPort), port, gRPCPort, true); err != nil { + if err := agent.Start(batchCtx, config.DB, port, gRPCPort, true); err != nil { return nil, err } @@ -386,7 +371,7 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * } // Start will update the topology and setup services. - if err := agent.Start(batchCtx, &dbconfigs.DBConfigs{}, "", 0, vtPort, grpcPort, false); err != nil { + if err := agent.Start(batchCtx, &dbconfigs.DBConfigs{}, vtPort, grpcPort, false); err != nil { panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) } @@ -434,7 +419,7 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias } // Start the agent. - if err := agent.Start(batchCtx, dbcfgs, "", 0, vtPort, grpcPort, false); err != nil { + if err := agent.Start(batchCtx, dbcfgs, vtPort, grpcPort, false); err != nil { panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) } @@ -583,7 +568,7 @@ func (agent *ActionAgent) verifyTopology(ctx context.Context) { // Start validates and updates the topology records for the tablet, and performs // the initial state change callback to start tablet services. // If initUpdateStream is set, update stream service will also be registered. -func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs, mysqlHost string, mysqlPort, vtPort, gRPCPort int32, initUpdateStream bool) error { +func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs, vtPort, gRPCPort int32, initUpdateStream bool) error { // find our hostname as fully qualified, and IP hostname := *tabletHostname if hostname == "" { @@ -594,10 +579,22 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs } } - // If mysqlHost is not set, a unix socket was specified. So, assume - // it's the same as the current host. - if mysqlHost == "" { + var mysqlHost string + var mysqlPort int32 + mysqlPortNotKnown := false + if appConfig, _ := dbcfgs.AppWithDB().MysqlParams(); appConfig.Host != "" { + mysqlHost = appConfig.Host + mysqlPort = int32(appConfig.Port) + } else { + // Assume unix socket was specified and try to get the port from mysqld mysqlHost = hostname + var err error + mysqlPort, err = agent.MysqlDaemon.GetMysqlPort() + if err != nil { + // We start this loop in Start, after the tablet record ports have been initialized. + log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", *publishRetryInterval, err) + mysqlPortNotKnown = true + } } // Update bind addr for mysql and query service in the tablet node. @@ -690,7 +687,7 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs // If mysql port was not specified, we have to discover it. // This should be started after agent.tablet is initialized. - if mysqlPort == 0 { + if mysqlPortNotKnown { // We send the publishRetryInterval as input parameter to // avoid races in tests. // TODO(sougou): undo this after proper shutdown procedure From 3411d6232a9ea4d65eaefd4bd813141d54d07e4f Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Mon, 8 Jun 2020 11:10:15 -0700 Subject: [PATCH 009/430] tm revamp: break InitTablet into smaller parts We'll recombine them differently later. Signed-off-by: Sugu Sougoumarane --- go/test/endtoend/recovery/recovery_util.go | 10 +- go/vt/topo/shard.go | 2 +- go/vt/topotools/shard_test.go | 2 +- go/vt/vttablet/tabletmanager/action_agent.go | 243 +++++++++++++++-- ...it_tablet_test.go => action_agent_test.go} | 133 +++++---- go/vt/vttablet/tabletmanager/init_tablet.go | 255 ------------------ .../vttablet/tabletmanager/initial_rebuild.go | 53 ---- go/vt/wrangler/tablet.go | 2 +- go/vt/wrangler/testlib/reparent_utils_test.go | 4 +- 9 files changed, 322 insertions(+), 382 deletions(-) rename go/vt/vttablet/tabletmanager/{init_tablet_test.go => action_agent_test.go} (78%) delete mode 100644 go/vt/vttablet/tabletmanager/init_tablet.go delete mode 100644 go/vt/vttablet/tabletmanager/initial_rebuild.go diff --git a/go/test/endtoend/recovery/recovery_util.go b/go/test/endtoend/recovery/recovery_util.go index 054ef63127f..b6deef0b5c1 100644 --- a/go/test/endtoend/recovery/recovery_util.go +++ b/go/test/endtoend/recovery/recovery_util.go @@ -32,7 +32,8 @@ var ( dbPassword = "VtDbaPass" // UseXb flag to use extra backup for recovery teseting. - UseXb = false + UseXb = false + // XbArgs are the arguments for specifying xtrabackup. XbArgs = []string{ "-backup_engine_implementation", "xtrabackup", "-xtrabackup_stream_mode=xbstream", @@ -41,12 +42,14 @@ var ( } ) +// VerifyQueriesUsingVtgate verifies queries using vtgate. func VerifyQueriesUsingVtgate(t *testing.T, session *vtgateconn.VTGateSession, query string, value string) { qr, err := session.Execute(context.Background(), query, nil) require.Nil(t, err) assert.Equal(t, value, fmt.Sprintf("%v", qr.Rows[0][0])) } +// RestoreTablet performs a PITR restore. func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tablet *cluster.Vttablet, restoreKSName string, shardName string, keyspaceName string, commonTabletArg []string) { tablet.ValidateTabletRestart(t) replicaTabletArgs := commonTabletArg @@ -69,7 +72,9 @@ func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tabl "-enable_replication_reporter=false", "-init_tablet_type", "replica", "-init_keyspace", restoreKSName, - "-init_shard", shardName) + "-init_shard", shardName, + "-init_db_name_override", "vt_"+keyspaceName, + ) tablet.VttabletProcess.SupportsBackup = true tablet.VttabletProcess.ExtraArgs = replicaTabletArgs @@ -81,6 +86,7 @@ func RestoreTablet(t *testing.T, localCluster *cluster.LocalProcessCluster, tabl require.Nil(t, err) } +// InsertData inserts data. func InsertData(t *testing.T, tablet *cluster.Vttablet, index int, keyspaceName string) { _, err := tablet.VttabletProcess.QueryTablet(fmt.Sprintf("insert into vt_insert_test (id, msg) values (%d, 'test %d')", index, index), keyspaceName, true) require.Nil(t, err) diff --git a/go/vt/topo/shard.go b/go/vt/topo/shard.go index c3f71632122..10b2382b6bd 100644 --- a/go/vt/topo/shard.go +++ b/go/vt/topo/shard.go @@ -327,7 +327,7 @@ func (ts *Server) CreateShard(ctx context.Context, keyspace, shard string) (err // GetOrCreateShard will return the shard object, or create one if it doesn't // already exist. Note the shard creation is protected by a keyspace Lock. -func (ts *Server) GetOrCreateShard(ctx context.Context, keyspace, shard, cell string) (si *ShardInfo, err error) { +func (ts *Server) GetOrCreateShard(ctx context.Context, keyspace, shard string) (si *ShardInfo, err error) { log.Info("GetShard %s/%s", keyspace, shard) si, err = ts.GetShard(ctx, keyspace, shard) if !IsErrType(err, NoNode) { diff --git a/go/vt/topotools/shard_test.go b/go/vt/topotools/shard_test.go index 4717588d968..cd9559c3699 100644 --- a/go/vt/topotools/shard_test.go +++ b/go/vt/topotools/shard_test.go @@ -120,7 +120,7 @@ func TestGetOrCreateShard(t *testing.T) { for j := 0; j < 100; j++ { index := rand.Intn(10) shard := fmt.Sprintf("%v", index) - si, err := ts.GetOrCreateShard(ctx, keyspace, shard, cell) + si, err := ts.GetOrCreateShard(ctx, keyspace, shard) if err != nil { t.Errorf("GetOrCreateShard(%v, %v) failed: %v", i, shard, err) } diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index f4d3edcdd6d..6c96e17e4d7 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -44,6 +44,7 @@ import ( "sync" "time" + "vitess.io/vitess/go/flagutil" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/vterrors" @@ -83,8 +84,20 @@ const ( var ( tabletHostname = flag.String("tablet_hostname", "", "if not empty, this hostname will be assumed instead of trying to resolve it") initPopulateMetadata = flag.Bool("init_populate_metadata", false, "(init parameter) populate metadata tables even if restore_from_backup is disabled. If restore_from_backup is enabled, metadata tables are always populated regardless of this flag.") + + initKeyspace = flag.String("init_keyspace", "", "(init parameter) keyspace to use for this tablet") + initShard = flag.String("init_shard", "", "(init parameter) shard to use for this tablet") + initTabletType = flag.String("init_tablet_type", "", "(init parameter) the tablet type to use for this tablet.") + initDbNameOverride = flag.String("init_db_name_override", "", "(init parameter) override the name of the db used by vttablet. Without this flag, the db name defaults to vt_") + initTags flagutil.StringMapValue + + initTimeout = flag.Duration("init_timeout", 1*time.Minute, "(init parameter) timeout to use for the init phase.") ) +func init() { + flag.Var(&initTags, "init_tags", "(init parameter) comma separated list of key:value pairs used to tag the tablet") +} + // ActionAgent is the main class for the agent. type ActionAgent struct { // The following fields are set during creation @@ -235,7 +248,7 @@ func NewActionAgent( return nil, err } - baseTabletType, err := validateInitTabletType(*initTabletType) + tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) if err != nil { return nil, err } @@ -249,10 +262,12 @@ func NewActionAgent( Cnf: mycnf, MysqlDaemon: mysqld, History: history.New(historyLength), - BaseTabletType: baseTabletType, _healthy: fmt.Errorf("healthcheck not run yet"), orc: orc, + BaseTabletType: tablet.Type, + tablet: tablet, } + // Sanity check for inconsistent flags if agent.Cnf == nil && *restoreFromBackup { return nil, fmt.Errorf("you cannot enable -restore_from_backup without a my.cnf file") @@ -260,9 +275,17 @@ func NewActionAgent( agent.registerQueryRuleSources() - // try to initialize the tablet if we have to - if err := agent.InitTablet(port, gRPCPort); err != nil { - return nil, vterrors.Wrap(err, "agent.InitTablet failed") + ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) + defer cancel() + si, err := agent.createKeyspaceShard(ctx) + if err != nil { + return nil, err + } + if err := agent.checkMastership(ctx, si); err != nil { + return nil, err + } + if err := agent.initTablet(ctx); err != nil { + return nil, err } // Create the TabletType stats @@ -280,10 +303,6 @@ func NewActionAgent( agent.VREngine = vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld) servenv.OnTerm(agent.VREngine.Close) - // Run a background task to rebuild the SrvKeyspace in our cell/keyspace - // if it doesn't exist yet. - go agent.maybeRebuildKeyspace(agent.initialTablet.Alias.Cell, agent.initialTablet.Keyspace) - // register the RPC services from the agent servenv.OnRun(func() { agent.registerQueryService() @@ -389,11 +408,14 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * // within the vtcombo binary. It cannot be called concurrently, // as it changes the flags. func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, queryServiceControl tabletserver.Controller, dbcfgs *dbconfigs.DBConfigs, mysqlDaemon mysqlctl.MysqlDaemon, keyspace, shard, dbname, tabletTypeStr string) *ActionAgent { - baseTabletType, err := validateInitTabletType(tabletTypeStr) + *initDbNameOverride = dbname + *initKeyspace = keyspace + *initShard = shard + *initTabletType = tabletTypeStr + tablet, err := buildTabletFromInput(tabletAlias, vtPort, grpcPort) if err != nil { panic(err) } - agent := &ActionAgent{ QueryServiceControl: queryServiceControl, UpdateStream: binlog.NewUpdateStreamControlMock(), @@ -405,16 +427,23 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias MysqlDaemon: mysqlDaemon, VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), History: history.New(historyLength), - BaseTabletType: baseTabletType, _healthy: fmt.Errorf("healthcheck not run yet"), + BaseTabletType: tablet.Type, + tablet: tablet, } + agent.tablet = tablet agent.registerQueryRuleSources() - // Initialize the tablet. - *initDbNameOverride = dbname - *initKeyspace = keyspace - *initShard = shard - if err := agent.InitTablet(vtPort, grpcPort); err != nil { + ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) + defer cancel() + si, err := agent.createKeyspaceShard(ctx) + if err != nil { + panic(vterrors.Wrap(err, "agent.InitTablet failed")) + } + if err := agent.checkMastership(ctx, si); err != nil { + panic(vterrors.Wrap(err, "agent.InitTablet failed")) + } + if err := agent.initTablet(ctx); err != nil { panic(vterrors.Wrap(err, "agent.InitTablet failed")) } @@ -785,14 +814,184 @@ func (agent *ActionAgent) withRetry(ctx context.Context, description string, wor } } -func validateInitTabletType(tabletTypeStr string) (topodatapb.TabletType, error) { - tabletType, err := topoproto.ParseTabletType(tabletTypeStr) +func buildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) (*topodatapb.Tablet, error) { + hostname := *tabletHostname + if hostname == "" { + var err error + hostname, err = netutil.FullyQualifiedHostname() + if err != nil { + return nil, err + } + log.Infof("Using detected machine hostname: %v To change this, fix your machine network configuration or override it with -tablet_hostname.", hostname) + } else { + log.Infof("Using hostname: %v from -tablet_hostname flag.", hostname) + } + + if *initKeyspace == "" || *initShard == "" { + return nil, fmt.Errorf("init_keyspace and init_shard must be specified") + } + + // parse and validate shard name + shard, keyRange, err := topo.ValidateShardName(*initShard) if err != nil { - return topodatapb.TabletType_UNKNOWN, err + return nil, vterrors.Wrapf(err, "cannot validate shard name %v", *initShard) + } + + tabletType, err := topoproto.ParseTabletType(*initTabletType) + if err != nil { + return nil, err } switch tabletType { case topodatapb.TabletType_SPARE, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY: - return tabletType, nil + default: + return nil, fmt.Errorf("invalid init_tablet_type %v; can only be REPLICA, RDONLY or SPARE", tabletType) + } + + return &topodatapb.Tablet{ + Alias: alias, + Hostname: hostname, + PortMap: map[string]int32{ + "vt": port, + "grpc": grpcPort, + }, + Keyspace: *initKeyspace, + Shard: shard, + KeyRange: keyRange, + Type: tabletType, + DbNameOverride: *initDbNameOverride, + Tags: initTags, + }, nil +} + +func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) (*topo.ShardInfo, error) { + log.Infof("Reading/creating keyspace and shard records for %v/%v", agent.tablet.Keyspace, agent.tablet.Shard) + + // Read the shard, create it if necessary. + var si *topo.ShardInfo + if err := agent.withRetry(ctx, "creating keyspace and shard", func() error { + var err error + si, err = agent.TopoServer.GetOrCreateShard(ctx, agent.tablet.Keyspace, agent.tablet.Shard) + return err + }); err != nil { + return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: cannot GetOrCreateShard shard") + } + + // Rebuild keyspace if this the first tablet in this keyspace/cell + _, err := agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, agent.tablet.Keyspace) + switch { + case err == nil: + // NOOP + case topo.IsErrType(err, topo.NoNode): + // Try to RebuildKeyspace here but ignore errors if it fails. + // It will fail until at least one tablet is up for every shard. + topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), agent.TopoServer, agent.tablet.Keyspace, []string{agent.TabletAlias.Cell}) + default: + return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvKeyspace") + } + + // Rebuild vschema graph if this is the first tablet in this keyspace/cell. + srvVSchema, err := agent.TopoServer.GetSrvVSchema(ctx, agent.TabletAlias.Cell) + switch { + case err == nil: + // Check if vschema was rebuilt after the initial creation of the keyspace. + if _, keyspaceExists := srvVSchema.GetKeyspaces()[agent.tablet.Keyspace]; !keyspaceExists { + if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { + return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") + } + } + case topo.IsErrType(err, topo.NoNode): + // There is no SrvSchema in this cell at all, so we definitely need to rebuild. + if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { + return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") + } + default: + return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvVSchema") + } + return si, nil +} + +func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInfo) error { + if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, agent.TabletAlias) { + // We're marked as master in the shard record, which could mean the master + // tablet process was just restarted. However, we need to check if a new + // master is in the process of taking over. In that case, it will let us + // know by forcibly updating the old master's tablet record. + oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + switch { + case topo.IsErrType(err, topo.NoNode): + // There's no existing tablet record, so we can assume + // no one has left us a message to step down. + agent.tablet.Type = topodatapb.TabletType_MASTER + // Update the master term start time (current value is 0) because we + // assume that we are actually the MASTER and in case of a tiebreak, + // vtgate should prefer us. + agent.tablet.MasterTermStartTime = logutil.TimeToProto(time.Now()) + case err == nil: + if oldTablet.Type == topodatapb.TabletType_MASTER { + // We're marked as master in the shard record, + // and our existing tablet record agrees. + agent.tablet.Type = topodatapb.TabletType_MASTER + agent.tablet.MasterTermStartTime = oldTablet.MasterTermStartTime + } + default: + return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") + } + } else { + oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + switch { + case topo.IsErrType(err, topo.NoNode): + // There's no existing tablet record, so there is nothing to do + case err == nil: + if oldTablet.Type == topodatapb.TabletType_MASTER { + // Our existing tablet type is master, but the shard record does not agree. + // Only take over if our master_term_start_time is after what is in the shard record + oldMasterTermStartTime := oldTablet.GetMasterTermStartTime() + currentShardTime := si.GetMasterTermStartTime() + if oldMasterTermStartTime.After(currentShardTime) { + agent.tablet.Type = topodatapb.TabletType_MASTER + agent.tablet.MasterTermStartTime = oldTablet.MasterTermStartTime + } + } + default: + return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") + } } - return topodatapb.TabletType_UNKNOWN, fmt.Errorf("invalid init_tablet_type %v; can only be REPLICA, RDONLY or SPARE", tabletType) + return nil +} + +func (agent *ActionAgent) initTablet(ctx context.Context) error { + err := agent.TopoServer.CreateTablet(ctx, agent.tablet) + switch { + case err == nil: + // It worked, we're good. + case topo.IsErrType(err, topo.NodeExists): + // The node already exists, will just try to update + // it. So we read it first. + oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.tablet.Alias) + if err != nil { + return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") + } + + // Sanity check the keyspace and shard + if oldTablet.Keyspace != agent.tablet.Keyspace || oldTablet.Shard != agent.tablet.Shard { + return fmt.Errorf("InitTablet failed because existing tablet keyspace and shard %v/%v differ from the provided ones %v/%v", oldTablet.Keyspace, oldTablet.Shard, agent.tablet.Keyspace, agent.tablet.Shard) + } + + // Update ShardReplication in any case, to be sure. This is + // meant to fix the case when a Tablet record was created, but + // then the ShardReplication record was not (because for + // instance of a startup timeout). Upon running this code + // again, we want to fix ShardReplication. + if updateErr := topo.UpdateTabletReplicationData(ctx, agent.TopoServer, agent.tablet); updateErr != nil { + return vterrors.Wrap(updateErr, "UpdateTabletReplicationData failed") + } + + // Then overwrite everything, ignoring version mismatch. + if err := agent.TopoServer.UpdateTablet(ctx, topo.NewTabletInfo(agent.tablet, nil)); err != nil { + return vterrors.Wrap(err, "UpdateTablet failed") + } + default: + return vterrors.Wrap(err, "CreateTablet failed") + } + return nil } diff --git a/go/vt/vttablet/tabletmanager/init_tablet_test.go b/go/vt/vttablet/tabletmanager/action_agent_test.go similarity index 78% rename from go/vt/vttablet/tabletmanager/init_tablet_test.go rename to go/vt/vttablet/tabletmanager/action_agent_test.go index 918352d92c7..63c4104adbe 100644 --- a/go/vt/vttablet/tabletmanager/init_tablet_test.go +++ b/go/vt/vttablet/tabletmanager/action_agent_test.go @@ -1,5 +1,5 @@ /* -Copyright 2019 The Vitess Authors. +Copyright 2020 The Vitess Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,20 +20,18 @@ import ( "fmt" "testing" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/require" "golang.org/x/net/context" - - "github.com/golang/protobuf/proto" - "vitess.io/vitess/go/history" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" - - topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) // Init tablet fixes replication data when safe @@ -47,13 +45,10 @@ func TestInitTabletFixesReplicationData(t *testing.T) { } // start with a tablet record that doesn't exist - port := int32(1234) - gRPCPort := int32(3456) - mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(nil) agent := &ActionAgent{ TopoServer: ts, TabletAlias: tabletAlias, - MysqlDaemon: mysqlDaemon, + MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), DBConfigs: &dbconfigs.DBConfigs{}, batchCtx: ctx, History: history.New(historyLength), @@ -70,9 +65,15 @@ func TestInitTabletFixesReplicationData(t *testing.T) { Uid: 2, } agent.TabletAlias = tabletAlias - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type) failed: %v", err) - } + + tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) + require.NoError(t, err) + agent.tablet = tablet + _, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + sri, err := ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") if err != nil || len(sri.Nodes) != 1 || !proto.Equal(sri.Nodes[0].TabletAlias, tabletAlias) { t.Fatalf("Created ShardReplication doesn't match: %v %v", sri, err) @@ -80,18 +81,16 @@ func TestInitTabletFixesReplicationData(t *testing.T) { // Remove the ShardReplication record, try to create the // tablets again, make sure it's fixed. - if err := topo.RemoveShardReplicationRecord(ctx, ts, cell, *initKeyspace, "-c0", tabletAlias); err != nil { - t.Fatalf("RemoveShardReplicationRecord failed: %v", err) - } + err = topo.RemoveShardReplicationRecord(ctx, ts, cell, *initKeyspace, "-c0", tabletAlias) + require.NoError(t, err) sri, err = ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") if err != nil || len(sri.Nodes) != 0 { t.Fatalf("Modifed ShardReplication doesn't match: %v %v", sri, err) } - // Initialize the same tablet again, CreateTablet will fail, but it should recreate shard replication data - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type) failed: %v", err) - } + // An initTablet will recreate the shard replication data. + err = agent.initTablet(context.Background()) + require.NoError(t, err) sri, err = ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") if err != nil || len(sri.Nodes) != 1 || !proto.Equal(sri.Nodes[0].TabletAlias, tabletAlias) { @@ -112,13 +111,10 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. } // start with a tablet record that doesn't exist - port := int32(1234) - gRPCPort := int32(3456) - mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(nil) agent := &ActionAgent{ TopoServer: ts, TabletAlias: tabletAlias, - MysqlDaemon: mysqlDaemon, + MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), DBConfigs: &dbconfigs.DBConfigs{}, batchCtx: ctx, History: history.New(historyLength), @@ -135,9 +131,15 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. Uid: 2, } agent.TabletAlias = tabletAlias - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type) failed: %v", err) - } + + tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) + require.NoError(t, err) + agent.tablet = tablet + _, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-c0") if err != nil { t.Fatalf("Could not fetch tablet aliases for shard: %v", err) @@ -152,9 +154,14 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. // Try to initialize a tablet with the same uid in a different shard. *initShard = "-D0" - if err := agent.InitTablet(port, gRPCPort); err == nil { - t.Fatalf("InitTablet(type) should have failed, got nil") - } + tablet, err = buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) + require.NoError(t, err) + agent.tablet = tablet + _, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + // This should fail. + require.Error(t, err) if tablets, _ := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-d0"); len(tablets) != 0 { t.Fatalf("Tablet shouldn't be added to replication data") @@ -212,9 +219,15 @@ func TestInitTablet(t *testing.T) { } agent.TabletAlias = tabletAlias - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type) failed: %v", err) - } + + tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) + require.NoError(t, err) + agent.tablet = tablet + _, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + si, err := ts.GetShard(ctx, "test_keyspace", "-c0") if err != nil { t.Fatalf("GetShard failed: %v", err) @@ -265,9 +278,15 @@ func TestInitTablet(t *testing.T) { if err != nil { t.Fatalf("UpdateShardFields failed: %v", err) } - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type, healthcheck) failed: %v", err) - } + + tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + require.NoError(t, err) + agent.tablet = tablet + _, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) @@ -286,9 +305,17 @@ func TestInitTablet(t *testing.T) { if err := ts.DeleteTablet(ctx, tabletAlias); err != nil { t.Fatalf("DeleteTablet failed: %v", err) } - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type, healthcheck) failed: %v", err) - } + + tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + require.NoError(t, err) + agent.tablet = tablet + si, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.checkMastership(ctx, si) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) @@ -308,9 +335,17 @@ func TestInitTablet(t *testing.T) { if err := ts.UpdateTablet(ctx, ti); err != nil { t.Fatalf("UpdateTablet failed: %v", err) } - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type, healthcheck) failed: %v", err) - } + + tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + require.NoError(t, err) + agent.tablet = tablet + si, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.checkMastership(ctx, si) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) @@ -327,9 +362,17 @@ func TestInitTablet(t *testing.T) { // (Also check db name override and tags here.) *initDbNameOverride = "DBNAME" initTags.Set("aaa:bbb") - if err := agent.InitTablet(port, gRPCPort); err != nil { - t.Fatalf("InitTablet(type, healthcheck) failed: %v", err) - } + + tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + require.NoError(t, err) + agent.tablet = tablet + si, err = agent.createKeyspaceShard(context.Background()) + require.NoError(t, err) + err = agent.checkMastership(ctx, si) + require.NoError(t, err) + err = agent.initTablet(context.Background()) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) diff --git a/go/vt/vttablet/tabletmanager/init_tablet.go b/go/vt/vttablet/tabletmanager/init_tablet.go deleted file mode 100644 index eda8523bfd7..00000000000 --- a/go/vt/vttablet/tabletmanager/init_tablet.go +++ /dev/null @@ -1,255 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package tabletmanager - -// This file handles the initialization of the tablet at startup time. -// It is only enabled if init_tablet_type or init_keyspace is set. - -import ( - "flag" - "fmt" - "time" - - "golang.org/x/net/context" - - "vitess.io/vitess/go/flagutil" - "vitess.io/vitess/go/netutil" - "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/logutil" - "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/topo/topoproto" - "vitess.io/vitess/go/vt/topotools" - "vitess.io/vitess/go/vt/vterrors" - - topodatapb "vitess.io/vitess/go/vt/proto/topodata" -) - -var ( - initDbNameOverride = flag.String("init_db_name_override", "", "(init parameter) override the name of the db used by vttablet. Without this flag, the db name defaults to vt_") - initKeyspace = flag.String("init_keyspace", "", "(init parameter) keyspace to use for this tablet") - initShard = flag.String("init_shard", "", "(init parameter) shard to use for this tablet") - initTags flagutil.StringMapValue - initTabletType = flag.String("init_tablet_type", "", "(init parameter) the tablet type to use for this tablet.") - initTimeout = flag.Duration("init_timeout", 1*time.Minute, "(init parameter) timeout to use for the init phase.") -) - -func init() { - flag.Var(&initTags, "init_tags", "(init parameter) comma separated list of key:value pairs used to tag the tablet") -} - -// InitTablet initializes the tablet record if necessary. -func (agent *ActionAgent) InitTablet(port, gRPCPort int32) error { - if *initKeyspace == "" || *initShard == "" { - return fmt.Errorf("init_keyspace and init_shard must be specified") - } - - tabletType := agent.BaseTabletType - - // parse and validate shard name - shard, keyRange, err := topo.ValidateShardName(*initShard) - if err != nil { - return vterrors.Wrapf(err, "cannot validate shard name %v", *initShard) - } - - // Create a context for this whole operation. Note we will - // retry some actions upon failure up to this context expires. - ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) - defer cancel() - - // Read the shard, create it if necessary. - log.Infof("Reading/creating keyspace and shard records for %v/%v", *initKeyspace, shard) - var si *topo.ShardInfo - if err := agent.withRetry(ctx, "creating keyspace and shard", func() error { - var err error - cell := agent.TabletAlias.GetCell() - si, err = agent.TopoServer.GetOrCreateShard(ctx, *initKeyspace, shard, cell) - return err - }); err != nil { - return vterrors.Wrap(err, "InitTablet cannot GetOrCreateShard shard") - } - var masterTermStartTime time.Time - if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, agent.TabletAlias) { - // We're marked as master in the shard record, which could mean the master - // tablet process was just restarted. However, we need to check if a new - // master is in the process of taking over. In that case, it will let us - // know by forcibly updating the old master's tablet record. - oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) - switch { - case topo.IsErrType(err, topo.NoNode): - // There's no existing tablet record, so we can assume - // no one has left us a message to step down. - tabletType = topodatapb.TabletType_MASTER - // Update the master term start time (current value is 0) because we - // assume that we are actually the MASTER and in case of a tiebreak, - // vtgate should prefer us. - masterTermStartTime = time.Now() - case err == nil: - if oldTablet.Type == topodatapb.TabletType_MASTER { - // We're marked as master in the shard record, - // and our existing tablet record agrees. - tabletType = topodatapb.TabletType_MASTER - // Read the master term start time from tablet. - // If it is nil, it might mean that we are upgrading, so use current time instead - if oldTablet.MasterTermStartTime != nil { - masterTermStartTime = oldTablet.GetMasterTermStartTime() - } else { - masterTermStartTime = time.Now() - } - } - default: - return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") - } - } else { - oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) - switch { - case topo.IsErrType(err, topo.NoNode): - // There's no existing tablet record, so there is nothing to do - case err == nil: - if oldTablet.Type == topodatapb.TabletType_MASTER { - // Our existing tablet type is master, but the shard record does not agree. - // Only take over if our master_term_start_time is after what is in the shard record - oldMasterTermStartTime := oldTablet.GetMasterTermStartTime() - currentShardTime := si.GetMasterTermStartTime() - if oldMasterTermStartTime.After(currentShardTime) { - tabletType = topodatapb.TabletType_MASTER - // read the master term start time from tablet - masterTermStartTime = oldTablet.GetMasterTermStartTime() - } - } - default: - return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") - } - } - - // Rebuild keyspace graph if this the first tablet in this keyspace/cell - _, err = agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, *initKeyspace) - switch { - case err == nil: - // NOOP - case topo.IsErrType(err, topo.NoNode): - // Try to RebuildKeyspace here but ignore errors if it fails. - // It will fail until at least one tablet is up for every shard. - topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), agent.TopoServer, *initKeyspace, []string{agent.TabletAlias.Cell}) - default: - return vterrors.Wrap(err, "InitTablet failed to read SrvKeyspace") - } - - // Rebuild vschema graph if this is the first tablet in this keyspace/cell. - srvVSchema, err := agent.TopoServer.GetSrvVSchema(ctx, agent.TabletAlias.Cell) - switch { - case err == nil: - // Check if vschema was rebuilt after the initial creation of the keyspace. - if _, keyspaceExists := srvVSchema.GetKeyspaces()[*initKeyspace]; !keyspaceExists { - if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { - return vterrors.Wrap(err, "InitTablet failed to RebuildSrvVSchema") - } - } - case topo.IsErrType(err, topo.NoNode): - // There is no SrvSchema in this cell at all, so we definitely need to rebuild. - if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { - return vterrors.Wrap(err, "InitTablet failed to RebuildSrvVSchema") - } - default: - return vterrors.Wrap(err, "InitTablet failed to read SrvVSchema") - } - - log.Infof("Initializing the tablet for type %v", tabletType) - - // figure out the hostname - hostname := *tabletHostname - if hostname != "" { - log.Infof("Using hostname: %v from -tablet_hostname flag.", hostname) - } else { - hostname, err := netutil.FullyQualifiedHostname() - if err != nil { - return err - } - log.Infof("Using detected machine hostname: %v To change this, fix your machine network configuration or override it with -tablet_hostname.", hostname) - } - - // if we are recovering from a snapshot we set initDbNameOverride - // but only if it not already set - if *initDbNameOverride == "" { - keyspaceInfo, err := agent.TopoServer.GetKeyspace(ctx, *initKeyspace) - if err != nil { - return vterrors.Wrapf(err, "Error getting keyspace: %v", *initKeyspace) - } - baseKeyspace := keyspaceInfo.Keyspace.BaseKeyspace - if baseKeyspace != "" { - *initDbNameOverride = topoproto.VtDbPrefix + baseKeyspace - } - } - - // create and populate tablet record - tablet := &topodatapb.Tablet{ - Alias: agent.TabletAlias, - Hostname: hostname, - PortMap: make(map[string]int32), - Keyspace: *initKeyspace, - Shard: shard, - KeyRange: keyRange, - Type: tabletType, - DbNameOverride: *initDbNameOverride, - Tags: initTags, - } - if !masterTermStartTime.IsZero() { - tablet.MasterTermStartTime = logutil.TimeToProto(masterTermStartTime) - } - if port != 0 { - tablet.PortMap["vt"] = port - } - if gRPCPort != 0 { - tablet.PortMap["grpc"] = gRPCPort - } - - // Now try to create the record (it will also fix up the - // ShardReplication record if necessary). - err = agent.TopoServer.CreateTablet(ctx, tablet) - switch { - case err == nil: - // It worked, we're good. - case topo.IsErrType(err, topo.NodeExists): - // The node already exists, will just try to update - // it. So we read it first. - oldTablet, err := agent.TopoServer.GetTablet(ctx, tablet.Alias) - if err != nil { - return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") - } - - // Sanity check the keyspace and shard - if oldTablet.Keyspace != tablet.Keyspace || oldTablet.Shard != tablet.Shard { - return fmt.Errorf("InitTablet failed because existing tablet keyspace and shard %v/%v differ from the provided ones %v/%v", oldTablet.Keyspace, oldTablet.Shard, tablet.Keyspace, tablet.Shard) - } - - // Update ShardReplication in any case, to be sure. This is - // meant to fix the case when a Tablet record was created, but - // then the ShardReplication record was not (because for - // instance of a startup timeout). Upon running this code - // again, we want to fix ShardReplication. - if updateErr := topo.UpdateTabletReplicationData(ctx, agent.TopoServer, tablet); updateErr != nil { - return vterrors.Wrap(updateErr, "UpdateTabletReplicationData failed") - } - - // Then overwrite everything, ignoring version mismatch. - if err := agent.TopoServer.UpdateTablet(ctx, topo.NewTabletInfo(tablet, nil)); err != nil { - return vterrors.Wrap(err, "UpdateTablet failed") - } - default: - return vterrors.Wrap(err, "CreateTablet failed") - } - return nil -} diff --git a/go/vt/vttablet/tabletmanager/initial_rebuild.go b/go/vt/vttablet/tabletmanager/initial_rebuild.go deleted file mode 100644 index b376b6eace5..00000000000 --- a/go/vt/vttablet/tabletmanager/initial_rebuild.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package tabletmanager - -import ( - "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/logutil" - "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/topotools" -) - -// maybeRebuildKeyspace handles the initial rebuild of SrvKeyspace if needed. -// This should be run as a background task: we use the batch context to check -// the SrvKeyspace object. If it is not there, we try to rebuild it -// for the current cell only. -func (agent *ActionAgent) maybeRebuildKeyspace(cell, keyspace string) { - _, err := agent.TopoServer.GetSrvKeyspace(agent.batchCtx, cell, keyspace) - switch { - case err == nil: - // SrvKeyspace exists, we're done - log.Infof("SrvKeyspace(%v,%v) exists, not building it", cell, keyspace) - return - case topo.IsErrType(err, topo.NoNode): - log.Infof("SrvKeyspace(%v,%v) doesn't exist, rebuilding it", cell, keyspace) - // SrvKeyspace doesn't exist, we'll try to rebuild it - default: - log.Warningf("Cannot read SrvKeyspace(%v,%v) (may need to run 'vtctl RebuildKeyspaceGraph %v'), skipping rebuild: %v", cell, keyspace, keyspace, err) - return - } - - if err := topotools.RebuildKeyspace(agent.batchCtx, logutil.NewConsoleLogger(), agent.TopoServer, keyspace, []string{cell}); err != nil { - log.Warningf("RebuildKeyspace(%v,%v) failed: %v, may need to run 'vtctl RebuildKeyspaceGraph %v')", cell, keyspace, err, keyspace) - return - } - - if err := agent.TopoServer.RebuildSrvVSchema(agent.batchCtx, []string{cell}); err != nil { - log.Warningf("RebuildVSchema(%v) failed: %v, may need to run 'vtctl RebuildVSchemaGraph --cells %v", cell, err, cell) - } -} diff --git a/go/vt/wrangler/tablet.go b/go/vt/wrangler/tablet.go index a98a05464b4..82075ecbb05 100644 --- a/go/vt/wrangler/tablet.go +++ b/go/vt/wrangler/tablet.go @@ -53,7 +53,7 @@ func (wr *Wrangler) InitTablet(ctx context.Context, tablet *topodatapb.Tablet, a if createShardAndKeyspace { // create the parent keyspace and shard if needed - si, err = wr.ts.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard, tablet.Alias.GetCell()) + si, err = wr.ts.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard) } else { si, err = wr.ts.GetShard(ctx, tablet.Keyspace, tablet.Shard) if topo.IsErrType(err, topo.NoNode) { diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index fdb62de9e41..695840d38d9 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -38,7 +38,7 @@ func TestShardReplicationStatuses(t *testing.T) { wr := wrangler.New(logutil.NewConsoleLogger(), ts, tmclient.NewTabletManagerClient()) // create shard and tablets - if _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0", "cell1"); err != nil { + if _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0"); err != nil { t.Fatalf("GetOrCreateShard failed: %v", err) } master := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_MASTER, nil) @@ -108,7 +108,7 @@ func TestReparentTablet(t *testing.T) { wr := wrangler.New(logutil.NewConsoleLogger(), ts, tmclient.NewTabletManagerClient()) // create shard and tablets - if _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0", "cell1"); err != nil { + if _, err := ts.GetOrCreateShard(ctx, "test_keyspace", "0"); err != nil { t.Fatalf("CreateShard failed: %v", err) } master := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_MASTER, nil) From 52633d9f0c4cdb87a7f5ed72288f68ff763c2493 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Mon, 8 Jun 2020 20:54:16 -0700 Subject: [PATCH 010/430] tm revamp: checkMysql function Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/action_agent.go | 105 +++++++----------- .../tabletmanager/state_change_test.go | 6 +- go/vt/wrangler/fake_tablet_test.go | 6 +- go/vt/wrangler/testlib/fake_tablet.go | 6 +- 4 files changed, 51 insertions(+), 72 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 6c96e17e4d7..9b0993a5400 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -92,6 +92,9 @@ var ( initTags flagutil.StringMapValue initTimeout = flag.Duration("init_timeout", 1*time.Minute, "(init parameter) timeout to use for the init phase.") + + // mysqlPortRetryInterval can be changed to speed up tests. + mysqlPortRetryInterval = 1 * time.Second ) func init() { @@ -252,6 +255,7 @@ func NewActionAgent( if err != nil { return nil, err } + config.DB.DBName = topoproto.TabletDbName(tablet) agent = &ActionAgent{ QueryServiceControl: queryServiceControl, @@ -261,6 +265,7 @@ func NewActionAgent( TabletAlias: tabletAlias, Cnf: mycnf, MysqlDaemon: mysqld, + DBConfigs: config.DB, History: history.New(historyLength), _healthy: fmt.Errorf("healthcheck not run yet"), orc: orc, @@ -284,6 +289,9 @@ func NewActionAgent( if err := agent.checkMastership(ctx, si); err != nil { return nil, err } + if err := agent.checkMysql(ctx); err != nil { + return nil, err + } if err := agent.initTablet(ctx); err != nil { return nil, err } @@ -370,6 +378,10 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * if err != nil { panic(vterrors.Wrap(err, "failed reading tablet")) } + ti.PortMap = map[string]int32{ + "vt": vtPort, + "grpc": grpcPort, + } agent := &ActionAgent{ QueryServiceControl: tabletservermock.NewController(), @@ -383,12 +395,17 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * VREngine: vreplication.NewTestEngine(ts, tabletAlias.Cell, mysqlDaemon, binlogplayer.NewFakeDBClient, ti.DbName(), nil), History: history.New(historyLength), BaseTabletType: topodatapb.TabletType_REPLICA, + tablet: ti.Tablet, _healthy: fmt.Errorf("healthcheck not run yet"), } if preStart != nil { preStart(agent) } + if agent.initTablet(batchCtx); err != nil { + panic(err) + } + // Start will update the topology and setup services. if err := agent.Start(batchCtx, &dbconfigs.DBConfigs{}, vtPort, grpcPort, false); err != nil { panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) @@ -598,60 +615,8 @@ func (agent *ActionAgent) verifyTopology(ctx context.Context) { // the initial state change callback to start tablet services. // If initUpdateStream is set, update stream service will also be registered. func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs, vtPort, gRPCPort int32, initUpdateStream bool) error { - // find our hostname as fully qualified, and IP - hostname := *tabletHostname - if hostname == "" { - var err error - hostname, err = netutil.FullyQualifiedHostname() - if err != nil { - return err - } - } - - var mysqlHost string - var mysqlPort int32 - mysqlPortNotKnown := false - if appConfig, _ := dbcfgs.AppWithDB().MysqlParams(); appConfig.Host != "" { - mysqlHost = appConfig.Host - mysqlPort = int32(appConfig.Port) - } else { - // Assume unix socket was specified and try to get the port from mysqld - mysqlHost = hostname - var err error - mysqlPort, err = agent.MysqlDaemon.GetMysqlPort() - if err != nil { - // We start this loop in Start, after the tablet record ports have been initialized. - log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", *publishRetryInterval, err) - mysqlPortNotKnown = true - } - } - - // Update bind addr for mysql and query service in the tablet node. - f := func(tablet *topodatapb.Tablet) error { - tablet.Hostname = hostname - tablet.MysqlHostname = mysqlHost - if tablet.PortMap == nil { - tablet.PortMap = make(map[string]int32) - } - tablet.MysqlPort = int32(mysqlPort) - if vtPort != 0 { - tablet.PortMap["vt"] = vtPort - } else { - delete(tablet.PortMap, "vt") - } - if gRPCPort != 0 { - tablet.PortMap["grpc"] = gRPCPort - } else { - delete(tablet.PortMap, "grpc") - } - - // Save the original tablet for ownership tests later. - agent.initialTablet = tablet - return nil - } - if _, err := agent.TopoServer.UpdateTabletFields(ctx, agent.TabletAlias, f); err != nil { - return err - } + // Save the original tablet for ownership tests later. + agent.initialTablet = agent.tablet // Initialize masterTermStartTime agent.setMasterTermStartTime(logutil.ProtoToTime(agent.initialTablet.MasterTermStartTime)) @@ -714,16 +679,6 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs startingTablet.Type = topodatapb.TabletType_UNKNOWN agent.setTablet(startingTablet) - // If mysql port was not specified, we have to discover it. - // This should be started after agent.tablet is initialized. - if mysqlPortNotKnown { - // We send the publishRetryInterval as input parameter to - // avoid races in tests. - // TODO(sougou): undo this after proper shutdown procedure - // has been implemented for this goroutine. - go agent.findMysqlPort(*publishRetryInterval) - } - // Start a background goroutine to watch and update the shard record, // to make sure it and our tablet record are in sync. agent.startShardSync() @@ -959,6 +914,24 @@ func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInf return nil } +func (agent *ActionAgent) checkMysql(ctx context.Context) error { + if appConfig, _ := agent.DBConfigs.AppWithDB().MysqlParams(); appConfig.Host != "" { + agent.tablet.MysqlHostname = appConfig.Host + agent.tablet.MysqlPort = int32(appConfig.Port) + } else { + // Assume unix socket was specified and try to get the port from mysqld + agent.tablet.MysqlHostname = agent.tablet.Hostname + mysqlPort, err := agent.MysqlDaemon.GetMysqlPort() + if err != nil { + log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", mysqlPortRetryInterval, err) + go agent.findMysqlPort(mysqlPortRetryInterval) + } else { + agent.tablet.MysqlPort = mysqlPort + } + } + return nil +} + func (agent *ActionAgent) initTablet(ctx context.Context) error { err := agent.TopoServer.CreateTablet(ctx, agent.tablet) switch { @@ -969,12 +942,12 @@ func (agent *ActionAgent) initTablet(ctx context.Context) error { // it. So we read it first. oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.tablet.Alias) if err != nil { - return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") + return vterrors.Wrap(err, "initTablet failed to read existing tablet record") } // Sanity check the keyspace and shard if oldTablet.Keyspace != agent.tablet.Keyspace || oldTablet.Shard != agent.tablet.Shard { - return fmt.Errorf("InitTablet failed because existing tablet keyspace and shard %v/%v differ from the provided ones %v/%v", oldTablet.Keyspace, oldTablet.Shard, agent.tablet.Keyspace, agent.tablet.Shard) + return fmt.Errorf("initTablet failed because existing tablet keyspace and shard %v/%v differ from the provided ones %v/%v", oldTablet.Keyspace, oldTablet.Shard, agent.tablet.Keyspace, agent.tablet.Shard) } // Update ShardReplication in any case, to be sure. This is diff --git a/go/vt/vttablet/tabletmanager/state_change_test.go b/go/vt/vttablet/tabletmanager/state_change_test.go index 0cf71558691..a138b91f69c 100644 --- a/go/vt/vttablet/tabletmanager/state_change_test.go +++ b/go/vt/vttablet/tabletmanager/state_change_test.go @@ -73,11 +73,13 @@ func TestPublishState(t *testing.T) { } func TestFindMysqlPort(t *testing.T) { - defer func(saved time.Duration) { *publishRetryInterval = saved }(*publishRetryInterval) - *publishRetryInterval = 1 * time.Millisecond + defer func(saved time.Duration) { mysqlPortRetryInterval = saved }(mysqlPortRetryInterval) + mysqlPortRetryInterval = 1 * time.Millisecond ctx := context.Background() agent := createTestAgent(ctx, t, nil) + err := agent.checkMysql(ctx) + require.NoError(t, err) ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) require.NoError(t, err) assert.Equal(t, ttablet.MysqlPort, int32(0)) diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index e71e3add497..b4c118a33b2 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -17,15 +17,16 @@ limitations under the License. package wrangler import ( - "fmt" "net" "net/http" "testing" "time" + "github.com/stretchr/testify/require" "golang.org/x/net/context" "google.golang.org/grpc" "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/netutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -105,7 +106,8 @@ func newFakeTablet(t *testing.T, wr *Wrangler, cell string, uid uint32, tabletTy t.Fatalf("uid has to be between 0 and 99: %v", uid) } mysqlPort := int32(3300 + uid) - hostname := fmt.Sprintf("%v.%d", cell, uid) + hostname, err := netutil.FullyQualifiedHostname() + require.NoError(t, err) tablet := &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: cell, Uid: uid}, Hostname: hostname, diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index 847a130718c..1fa94227abc 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -21,16 +21,17 @@ deal with topology common tasks, like fake tablets and action loops. package testlib import ( - "fmt" "net" "net/http" "testing" "time" + "github.com/stretchr/testify/require" "golang.org/x/net/context" "google.golang.org/grpc" "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/netutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vttablet/grpctmserver" @@ -123,7 +124,8 @@ func NewFakeTablet(t *testing.T, wr *wrangler.Wrangler, cell string, uid uint32, t.Fatalf("uid has to be between 0 and 99: %v", uid) } mysqlPort := int32(3300 + uid) - hostname := fmt.Sprintf("%v.%d", cell, uid) + hostname, err := netutil.FullyQualifiedHostname() + require.NoError(t, err) tablet := &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{Cell: cell, Uid: uid}, Hostname: hostname, From 56e4a05019df5edd3c6cf0c902656de3f923d2b2 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Mon, 8 Jun 2020 21:51:36 -0700 Subject: [PATCH 011/430] tm revamp: fix race conditions Signed-off-by: Sugu Sougoumarane --- .../tablet_security_policy_test.go | 6 +- go/vt/vttablet/tabletmanager/action_agent.go | 152 +++++++++--------- 2 files changed, 80 insertions(+), 78 deletions(-) diff --git a/go/test/endtoend/tabletmanager/tablet_security_policy_test.go b/go/test/endtoend/tabletmanager/tablet_security_policy_test.go index 61df124f2fe..671a79bd1d4 100644 --- a/go/test/endtoend/tabletmanager/tablet_security_policy_test.go +++ b/go/test/endtoend/tabletmanager/tablet_security_policy_test.go @@ -42,7 +42,7 @@ func TestFallbackSecurityPolicy(t *testing.T) { // Requesting an unregistered security_policy should fallback to deny-all. clusterInstance.VtTabletExtraArgs = []string{"-security_policy", "bogus"} - err = clusterInstance.StartVttablet(mTablet, "NOT_SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(mTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) require.Nil(t, err) // It should deny ADMIN role. @@ -101,7 +101,7 @@ func TestDenyAllSecurityPolicy(t *testing.T) { // Requesting a deny-all security_policy. clusterInstance.VtTabletExtraArgs = []string{"-security_policy", "deny-all"} - err = clusterInstance.StartVttablet(mTablet, "NOT_SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(mTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) require.Nil(t, err) // It should deny ADMIN role. @@ -137,7 +137,7 @@ func TestReadOnlySecurityPolicy(t *testing.T) { // Requesting a read-only security_policy. clusterInstance.VtTabletExtraArgs = []string{"-security_policy", "read-only"} - err = clusterInstance.StartVttablet(mTablet, "NOT_SERVING", false, cell, keyspaceName, hostname, shardName) + err = clusterInstance.StartVttablet(mTablet, "SERVING", false, cell, keyspaceName, hostname, shardName) require.Nil(t, err) // It should deny ADMIN role. diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 9b0993a5400..2f477238ddd 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -153,11 +153,6 @@ type ActionAgent struct { // to have the actionMutex have it. actionMutexLocked bool - // initialTablet remembers the state of the tablet record at startup. - // It can be used to notice, for example, if another tablet has taken - // over the record. - initialTablet *topodatapb.Tablet - // orc is an optional client for Orchestrator HTTP API calls. // If this is nil, those calls will be skipped. // It's only set once in NewActionAgent() and never modified after that. @@ -318,31 +313,19 @@ func NewActionAgent( // optionally populate metadata records if !*restoreFromBackup && *initPopulateMetadata { - // we use initialTablet here because it has the intended tabletType. - // the tablet returned by agent.Tablet() will have type UNKNOWN until - // we call updateState. - localMetadata := agent.getLocalMetadataValues(agent.initialTablet.Type) + localMetadata := agent.getLocalMetadataValues(tablet.Type) if agent.Cnf != nil { // we are managing mysqld // we'll use batchCtx here because we are still initializing and can't proceed unless this succeeds if err := agent.MysqlDaemon.Wait(batchCtx, agent.Cnf); err != nil { return nil, err } } - err := mysqlctl.PopulateMetadataTables(agent.MysqlDaemon, localMetadata, topoproto.TabletDbName(agent.initialTablet)) + err := mysqlctl.PopulateMetadataTables(agent.MysqlDaemon, localMetadata, topoproto.TabletDbName(tablet)) if err != nil { return nil, vterrors.Wrap(err, "failed to -init_populate_metadata") } } - // Update our state (need the action lock). - // We do this upfront to prevent this from racing with restoreFromBackup - // in case it gets launched. - if err := agent.lock(batchCtx); err != nil { - return nil, err - } - agent.updateState(batchCtx, agent.initialTablet, "Start") - agent.unlock() - // two cases then: // - restoreFromBackup is set: we restore, then initHealthCheck, all // in the background @@ -363,6 +346,15 @@ func NewActionAgent( agent.initHealthCheck() } + // Temporary glue code to keep things working. + // TODO(sougou); remove after refactor. + if err := agent.lock(batchCtx); err != nil { + return nil, err + } + defer agent.unlock() + tablet = agent.Tablet() + agent.changeCallback(batchCtx, tablet, tablet) + // Start periodic Orchestrator self-registration, if configured. if agent.orc != nil { go agent.orc.DiscoverLoop(agent) @@ -411,12 +403,14 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) } - // Update our running state. Need to take action lock. + // Temporary glue code to keep things working. + // TODO(sougou); remove after refactor. if err := agent.lock(batchCtx); err != nil { - panic(vterrors.Wrap(err, "agent.lock() failed")) + panic(err) } defer agent.unlock() - agent.updateState(batchCtx, agent.initialTablet, "Start") + tablet := agent.Tablet() + agent.changeCallback(batchCtx, tablet, tablet) return agent } @@ -448,7 +442,6 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias BaseTabletType: tablet.Type, tablet: tablet, } - agent.tablet = tablet agent.registerQueryRuleSources() ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) @@ -469,13 +462,6 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) } - // And update our running state (need to take the Action lock). - if err := agent.lock(batchCtx); err != nil { - panic(vterrors.Wrap(err, "agent.lock() failed")) - } - defer agent.unlock() - agent.updateState(batchCtx, agent.initialTablet, "Start") - return agent } @@ -493,6 +479,15 @@ func (agent *ActionAgent) setTablet(tablet *topodatapb.Tablet) { agent.notifyShardSync() } +func (agent *ActionAgent) updateTablet(update func(tablet *topodatapb.Tablet)) { + agent.pubMu.Lock() + update(agent.tablet) + agent.pubMu.Unlock() + + // Notify the shard sync loop that the tablet state changed. + agent.notifyShardSync() +} + // Tablet reads the stored Tablet from the agent. func (agent *ActionAgent) Tablet() *topodatapb.Tablet { agent.pubMu.Lock() @@ -616,22 +611,22 @@ func (agent *ActionAgent) verifyTopology(ctx context.Context) { // If initUpdateStream is set, update stream service will also be registered. func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs, vtPort, gRPCPort int32, initUpdateStream bool) error { // Save the original tablet for ownership tests later. - agent.initialTablet = agent.tablet + tablet := agent.Tablet() // Initialize masterTermStartTime - agent.setMasterTermStartTime(logutil.ProtoToTime(agent.initialTablet.MasterTermStartTime)) + agent.setMasterTermStartTime(logutil.ProtoToTime(tablet.MasterTermStartTime)) // Verify the topology is correct. agent.verifyTopology(ctx) - dbcfgs.DBName = topoproto.TabletDbName(agent.initialTablet) + dbcfgs.DBName = topoproto.TabletDbName(tablet) agent.DBConfigs = dbcfgs // Create and register the RPC services from UpdateStream. // (it needs the dbname, so it has to be delayed up to here, // but it has to be before updateState below that may use it) if initUpdateStream { - us := binlog.NewUpdateStream(agent.TopoServer, agent.initialTablet.Keyspace, agent.TabletAlias.Cell, agent.DBConfigs.DbaWithDB(), agent.QueryServiceControl.SchemaEngine()) + us := binlog.NewUpdateStream(agent.TopoServer, tablet.Keyspace, agent.TabletAlias.Cell, agent.DBConfigs.DbaWithDB(), agent.QueryServiceControl.SchemaEngine()) agent.UpdateStream = us servenv.OnRun(func() { us.RegisterService() @@ -648,9 +643,9 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs // initialize tablet server if err := agent.QueryServiceControl.InitDBConfig(querypb.Target{ - Keyspace: agent.initialTablet.Keyspace, - Shard: agent.initialTablet.Shard, - TabletType: agent.initialTablet.Type, + Keyspace: tablet.Keyspace, + Shard: tablet.Shard, + TabletType: tablet.Type, }, agent.DBConfigs); err != nil { return vterrors.Wrap(err, "failed to InitDBConfig") } @@ -663,22 +658,15 @@ func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs statsKeyRangeEnd := stats.NewString("TabletKeyRangeEnd") statsAlias := stats.NewString("TabletAlias") - statsKeyspace.Set(agent.initialTablet.Keyspace) - statsShard.Set(agent.initialTablet.Shard) - if key.KeyRangeIsPartial(agent.initialTablet.KeyRange) { - statsKeyRangeStart.Set(hex.EncodeToString(agent.initialTablet.KeyRange.Start)) - statsKeyRangeEnd.Set(hex.EncodeToString(agent.initialTablet.KeyRange.End)) + statsKeyspace.Set(tablet.Keyspace) + statsShard.Set(tablet.Shard) + if key.KeyRangeIsPartial(tablet.KeyRange) { + statsKeyRangeStart.Set(hex.EncodeToString(tablet.KeyRange.Start)) + statsKeyRangeEnd.Set(hex.EncodeToString(tablet.KeyRange.End)) } - statsAlias.Set(topoproto.TabletAliasString(agent.initialTablet.Alias)) + statsAlias.Set(topoproto.TabletAliasString(tablet.Alias)) } - // Initialize the current tablet to match our current running - // state: Has most field filled in, but type is UNKNOWN. - // Subsequents calls to updateState will then work as expected. - startingTablet := proto.Clone(agent.initialTablet).(*topodatapb.Tablet) - startingTablet.Type = topodatapb.TabletType_UNKNOWN - agent.setTablet(startingTablet) - // Start a background goroutine to watch and update the shard record, // to make sure it and our tablet record are in sync. agent.startShardSync() @@ -697,7 +685,7 @@ func (agent *ActionAgent) Close() { // cleanup initialized fields in the tablet entry f := func(tablet *topodatapb.Tablet) error { - if err := topotools.CheckOwnership(agent.initialTablet, tablet); err != nil { + if err := topotools.CheckOwnership(agent.Tablet(), tablet); err != nil { return err } tablet.Hostname = "" @@ -819,27 +807,28 @@ func buildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( } func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) (*topo.ShardInfo, error) { - log.Infof("Reading/creating keyspace and shard records for %v/%v", agent.tablet.Keyspace, agent.tablet.Shard) + tablet := agent.Tablet() + log.Infof("Reading/creating keyspace and shard records for %v/%v", tablet.Keyspace, tablet.Shard) // Read the shard, create it if necessary. var si *topo.ShardInfo if err := agent.withRetry(ctx, "creating keyspace and shard", func() error { var err error - si, err = agent.TopoServer.GetOrCreateShard(ctx, agent.tablet.Keyspace, agent.tablet.Shard) + si, err = agent.TopoServer.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard) return err }); err != nil { return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: cannot GetOrCreateShard shard") } // Rebuild keyspace if this the first tablet in this keyspace/cell - _, err := agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, agent.tablet.Keyspace) + _, err := agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, tablet.Keyspace) switch { case err == nil: // NOOP case topo.IsErrType(err, topo.NoNode): // Try to RebuildKeyspace here but ignore errors if it fails. // It will fail until at least one tablet is up for every shard. - topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), agent.TopoServer, agent.tablet.Keyspace, []string{agent.TabletAlias.Cell}) + topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), agent.TopoServer, tablet.Keyspace, []string{agent.TabletAlias.Cell}) default: return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvKeyspace") } @@ -849,7 +838,7 @@ func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) (*topo.ShardI switch { case err == nil: // Check if vschema was rebuilt after the initial creation of the keyspace. - if _, keyspaceExists := srvVSchema.GetKeyspaces()[agent.tablet.Keyspace]; !keyspaceExists { + if _, keyspaceExists := srvVSchema.GetKeyspaces()[tablet.Keyspace]; !keyspaceExists { if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } @@ -876,17 +865,21 @@ func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInf case topo.IsErrType(err, topo.NoNode): // There's no existing tablet record, so we can assume // no one has left us a message to step down. - agent.tablet.Type = topodatapb.TabletType_MASTER - // Update the master term start time (current value is 0) because we - // assume that we are actually the MASTER and in case of a tiebreak, - // vtgate should prefer us. - agent.tablet.MasterTermStartTime = logutil.TimeToProto(time.Now()) + agent.updateTablet(func(tablet *topodatapb.Tablet) { + tablet.Type = topodatapb.TabletType_MASTER + // Update the master term start time (current value is 0) because we + // assume that we are actually the MASTER and in case of a tiebreak, + // vtgate should prefer us. + tablet.MasterTermStartTime = logutil.TimeToProto(time.Now()) + }) case err == nil: if oldTablet.Type == topodatapb.TabletType_MASTER { // We're marked as master in the shard record, // and our existing tablet record agrees. - agent.tablet.Type = topodatapb.TabletType_MASTER - agent.tablet.MasterTermStartTime = oldTablet.MasterTermStartTime + agent.updateTablet(func(tablet *topodatapb.Tablet) { + tablet.Type = topodatapb.TabletType_MASTER + tablet.MasterTermStartTime = oldTablet.MasterTermStartTime + }) } default: return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") @@ -903,8 +896,10 @@ func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInf oldMasterTermStartTime := oldTablet.GetMasterTermStartTime() currentShardTime := si.GetMasterTermStartTime() if oldMasterTermStartTime.After(currentShardTime) { - agent.tablet.Type = topodatapb.TabletType_MASTER - agent.tablet.MasterTermStartTime = oldTablet.MasterTermStartTime + agent.updateTablet(func(tablet *topodatapb.Tablet) { + tablet.Type = topodatapb.TabletType_MASTER + tablet.MasterTermStartTime = oldTablet.MasterTermStartTime + }) } } default: @@ -916,38 +911,45 @@ func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInf func (agent *ActionAgent) checkMysql(ctx context.Context) error { if appConfig, _ := agent.DBConfigs.AppWithDB().MysqlParams(); appConfig.Host != "" { - agent.tablet.MysqlHostname = appConfig.Host - agent.tablet.MysqlPort = int32(appConfig.Port) + agent.updateTablet(func(tablet *topodatapb.Tablet) { + tablet.MysqlHostname = appConfig.Host + tablet.MysqlPort = int32(appConfig.Port) + }) } else { // Assume unix socket was specified and try to get the port from mysqld - agent.tablet.MysqlHostname = agent.tablet.Hostname + agent.updateTablet(func(tablet *topodatapb.Tablet) { + tablet.MysqlHostname = tablet.Hostname + }) mysqlPort, err := agent.MysqlDaemon.GetMysqlPort() if err != nil { log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", mysqlPortRetryInterval, err) go agent.findMysqlPort(mysqlPortRetryInterval) } else { - agent.tablet.MysqlPort = mysqlPort + agent.updateTablet(func(tablet *topodatapb.Tablet) { + tablet.MysqlPort = mysqlPort + }) } } return nil } func (agent *ActionAgent) initTablet(ctx context.Context) error { - err := agent.TopoServer.CreateTablet(ctx, agent.tablet) + tablet := agent.Tablet() + err := agent.TopoServer.CreateTablet(ctx, tablet) switch { case err == nil: // It worked, we're good. case topo.IsErrType(err, topo.NodeExists): // The node already exists, will just try to update // it. So we read it first. - oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.tablet.Alias) + oldTablet, err := agent.TopoServer.GetTablet(ctx, tablet.Alias) if err != nil { return vterrors.Wrap(err, "initTablet failed to read existing tablet record") } // Sanity check the keyspace and shard - if oldTablet.Keyspace != agent.tablet.Keyspace || oldTablet.Shard != agent.tablet.Shard { - return fmt.Errorf("initTablet failed because existing tablet keyspace and shard %v/%v differ from the provided ones %v/%v", oldTablet.Keyspace, oldTablet.Shard, agent.tablet.Keyspace, agent.tablet.Shard) + if oldTablet.Keyspace != tablet.Keyspace || oldTablet.Shard != tablet.Shard { + return fmt.Errorf("initTablet failed because existing tablet keyspace and shard %v/%v differ from the provided ones %v/%v", oldTablet.Keyspace, oldTablet.Shard, tablet.Keyspace, tablet.Shard) } // Update ShardReplication in any case, to be sure. This is @@ -955,12 +957,12 @@ func (agent *ActionAgent) initTablet(ctx context.Context) error { // then the ShardReplication record was not (because for // instance of a startup timeout). Upon running this code // again, we want to fix ShardReplication. - if updateErr := topo.UpdateTabletReplicationData(ctx, agent.TopoServer, agent.tablet); updateErr != nil { + if updateErr := topo.UpdateTabletReplicationData(ctx, agent.TopoServer, tablet); updateErr != nil { return vterrors.Wrap(updateErr, "UpdateTabletReplicationData failed") } // Then overwrite everything, ignoring version mismatch. - if err := agent.TopoServer.UpdateTablet(ctx, topo.NewTabletInfo(agent.tablet, nil)); err != nil { + if err := agent.TopoServer.UpdateTablet(ctx, topo.NewTabletInfo(tablet, nil)); err != nil { return vterrors.Wrap(err, "UpdateTablet failed") } default: From ada175d98d6dc14315123e8bbcf658d32041d56d Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Tue, 9 Jun 2020 18:16:14 -0700 Subject: [PATCH 012/430] tm revamp: updateStream initialization refactored Signed-off-by: Sugu Sougoumarane --- go/vt/binlog/updatestreamctl.go | 8 ++- go/vt/vttablet/tabletmanager/action_agent.go | 51 ++++++++------------ 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/go/vt/binlog/updatestreamctl.go b/go/vt/binlog/updatestreamctl.go index ff331d89a33..87e7ca32c3b 100644 --- a/go/vt/binlog/updatestreamctl.go +++ b/go/vt/binlog/updatestreamctl.go @@ -59,12 +59,12 @@ var ( // UpdateStreamControl is the interface an UpdateStream service implements // to bring it up or down. type UpdateStreamControl interface { + // RegisterService registers the UpdateStream service. + RegisterService() // Enable will allow any new RPC calls Enable() - // Disable will interrupt all current calls, and disallow any new call Disable() - // IsEnabled returns true iff the service is enabled IsEnabled() bool } @@ -81,6 +81,10 @@ func NewUpdateStreamControlMock() *UpdateStreamControlMock { return &UpdateStreamControlMock{} } +// RegisterService is part of UpdateStreamControl +func (m *UpdateStreamControlMock) RegisterService() { +} + // Enable is part of UpdateStreamControl func (m *UpdateStreamControlMock) Enable() { m.Lock() diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 2f477238ddd..e0f8d91b3d3 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -298,11 +298,14 @@ func NewActionAgent( agent.statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) // Start will get the tablet info, and update our state from it - if err := agent.Start(batchCtx, config.DB, port, gRPCPort, true); err != nil { + if err := agent.Start(batchCtx); err != nil { return nil, err } - // The db name is set by the Start function called above + agent.UpdateStream = binlog.NewUpdateStream(agent.TopoServer, tablet.Keyspace, agent.TabletAlias.Cell, agent.DBConfigs.DbaWithDB(), agent.QueryServiceControl.SchemaEngine()) + servenv.OnRun(agent.UpdateStream.RegisterService) + servenv.OnTerm(agent.UpdateStream.Disable) + agent.VREngine = vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld) servenv.OnTerm(agent.VREngine.Close) @@ -384,6 +387,7 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * TabletAlias: tabletAlias, Cnf: nil, MysqlDaemon: mysqlDaemon, + DBConfigs: &dbconfigs.DBConfigs{}, VREngine: vreplication.NewTestEngine(ts, tabletAlias.Cell, mysqlDaemon, binlogplayer.NewFakeDBClient, ti.DbName(), nil), History: history.New(historyLength), BaseTabletType: topodatapb.TabletType_REPLICA, @@ -398,8 +402,17 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * panic(err) } + si, err := agent.createKeyspaceShard(batchCtx) + if err != nil { + panic(vterrors.Wrap(err, "agent.createKeyspaceShard failed")) + } + + if err := agent.checkMastership(batchCtx, si); err != nil { + panic(vterrors.Wrap(err, "agent.checkMastership failed")) + } + // Start will update the topology and setup services. - if err := agent.Start(batchCtx, &dbconfigs.DBConfigs{}, vtPort, grpcPort, false); err != nil { + if err := agent.Start(batchCtx); err != nil { panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) } @@ -427,6 +440,7 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias if err != nil { panic(err) } + dbcfgs.DBName = topoproto.TabletDbName(tablet) agent := &ActionAgent{ QueryServiceControl: queryServiceControl, UpdateStream: binlog.NewUpdateStreamControlMock(), @@ -436,6 +450,7 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias TabletAlias: tabletAlias, Cnf: nil, MysqlDaemon: mysqlDaemon, + DBConfigs: dbcfgs, VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), History: history.New(historyLength), _healthy: fmt.Errorf("healthcheck not run yet"), @@ -458,7 +473,7 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias } // Start the agent. - if err := agent.Start(batchCtx, dbcfgs, vtPort, grpcPort, false); err != nil { + if err := agent.Start(batchCtx); err != nil { panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) } @@ -609,38 +624,13 @@ func (agent *ActionAgent) verifyTopology(ctx context.Context) { // Start validates and updates the topology records for the tablet, and performs // the initial state change callback to start tablet services. // If initUpdateStream is set, update stream service will also be registered. -func (agent *ActionAgent) Start(ctx context.Context, dbcfgs *dbconfigs.DBConfigs, vtPort, gRPCPort int32, initUpdateStream bool) error { +func (agent *ActionAgent) Start(ctx context.Context) error { // Save the original tablet for ownership tests later. tablet := agent.Tablet() - // Initialize masterTermStartTime - agent.setMasterTermStartTime(logutil.ProtoToTime(tablet.MasterTermStartTime)) - // Verify the topology is correct. agent.verifyTopology(ctx) - dbcfgs.DBName = topoproto.TabletDbName(tablet) - agent.DBConfigs = dbcfgs - - // Create and register the RPC services from UpdateStream. - // (it needs the dbname, so it has to be delayed up to here, - // but it has to be before updateState below that may use it) - if initUpdateStream { - us := binlog.NewUpdateStream(agent.TopoServer, tablet.Keyspace, agent.TabletAlias.Cell, agent.DBConfigs.DbaWithDB(), agent.QueryServiceControl.SchemaEngine()) - agent.UpdateStream = us - servenv.OnRun(func() { - us.RegisterService() - }) - } - servenv.OnTerm(func() { - // Disable UpdateStream (if any) upon entering lameduck. - // We do this regardless of initUpdateStream, since agent.UpdateStream - // may have been set from elsewhere. - if agent.UpdateStream != nil { - agent.UpdateStream.Disable() - } - }) - // initialize tablet server if err := agent.QueryServiceControl.InitDBConfig(querypb.Target{ Keyspace: tablet.Keyspace, @@ -906,6 +896,7 @@ func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInf return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") } } + agent.setMasterTermStartTime(logutil.ProtoToTime(agent.Tablet().MasterTermStartTime)) return nil } From a347ebd043f75d3186423da7d1918cde7919afca Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Tue, 9 Jun 2020 19:57:46 -0700 Subject: [PATCH 013/430] tm revamp: break up Start into smaller parts Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/action_agent.go | 307 ++++++++++--------- go/vt/vttablet/tabletmanager/rpc_backup.go | 8 +- go/vt/vttablet/tabletmanager/state_change.go | 8 +- 3 files changed, 159 insertions(+), 164 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index e0f8d91b3d3..5cf7f5a435f 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -95,10 +95,25 @@ var ( // mysqlPortRetryInterval can be changed to speed up tests. mysqlPortRetryInterval = 1 * time.Second + + // statsTabletType is set to expose the current tablet type. + statsTabletType *stats.String + + // statsTabletTypeCount exposes the current tablet type as a label, + // with the value counting the occurrences of the respective tablet type. + // Useful for Prometheus which doesn't support exporting strings as stat values. + statsTabletTypeCount *stats.CountersWithSingleLabel + + // statsBackupIsRunning is set to 1 (true) if a backup is running. + statsBackupIsRunning *stats.GaugesWithMultiLabels ) func init() { flag.Var(&initTags, "init_tags", "(init parameter) comma separated list of key:value pairs used to tag the tablet") + + statsTabletType = stats.NewString("TabletType") + statsTabletTypeCount = stats.NewCountersWithSingleLabel("TabletTypeCount", "Number of times the tablet changed to the labeled type", "type") + statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) } // ActionAgent is the main class for the agent. @@ -117,23 +132,6 @@ type ActionAgent struct { // when we transition back from something like MASTER. BaseTabletType topodatapb.TabletType - // exportStats is set only for production tablet. - exportStats bool - - // statsTabletType is set to expose the current tablet type, - // only used if exportStats is true. - statsTabletType *stats.String - - // statsTabletTypeCount exposes the current tablet type as a label, - // with the value counting the occurrences of the respective tablet type. - // Useful for Prometheus which doesn't support exporting strings as stat values - // only used if exportStats is true. - statsTabletTypeCount *stats.CountersWithSingleLabel - - // statsBackupIsRunning is set to 1 (true) if a backup is running - // only used if exportStats is true - statsBackupIsRunning *stats.GaugesWithMultiLabels - // batchCtx is given to the agent by its creator, and should be used for // any background tasks spawned by the agent. batchCtx context.Context @@ -241,10 +239,6 @@ func NewActionAgent( mycnf *mysqlctl.Mycnf, port, gRPCPort int32, ) (agent *ActionAgent, err error) { - orc, err := newOrcClient() - if err != nil { - return nil, err - } tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) if err != nil { @@ -263,18 +257,10 @@ func NewActionAgent( DBConfigs: config.DB, History: history.New(historyLength), _healthy: fmt.Errorf("healthcheck not run yet"), - orc: orc, BaseTabletType: tablet.Type, tablet: tablet, } - // Sanity check for inconsistent flags - if agent.Cnf == nil && *restoreFromBackup { - return nil, fmt.Errorf("you cannot enable -restore_from_backup without a my.cnf file") - } - - agent.registerQueryRuleSources() - ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) defer cancel() si, err := agent.createKeyspaceShard(ctx) @@ -291,16 +277,17 @@ func NewActionAgent( return nil, err } - // Create the TabletType stats - agent.exportStats = true - agent.statsTabletType = stats.NewString("TabletType") - agent.statsTabletTypeCount = stats.NewCountersWithSingleLabel("TabletTypeCount", "Number of times the tablet changed to the labeled type", "type") - agent.statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) - - // Start will get the tablet info, and update our state from it - if err := agent.Start(batchCtx); err != nil { - return nil, err + tablet = agent.Tablet() + err = agent.QueryServiceControl.InitDBConfig(querypb.Target{ + Keyspace: tablet.Keyspace, + Shard: tablet.Shard, + TabletType: tablet.Type, + }, agent.DBConfigs) + if err != nil { + return nil, vterrors.Wrap(err, "failed to InitDBConfig") } + agent.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) + servenv.OnRun(agent.registerQueryService) agent.UpdateStream = binlog.NewUpdateStream(agent.TopoServer, tablet.Keyspace, agent.TabletAlias.Cell, agent.DBConfigs.DbaWithDB(), agent.QueryServiceControl.SchemaEngine()) servenv.OnRun(agent.UpdateStream.RegisterService) @@ -309,44 +296,22 @@ func NewActionAgent( agent.VREngine = vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld) servenv.OnTerm(agent.VREngine.Close) - // register the RPC services from the agent - servenv.OnRun(func() { - agent.registerQueryService() - }) - - // optionally populate metadata records - if !*restoreFromBackup && *initPopulateMetadata { - localMetadata := agent.getLocalMetadataValues(tablet.Type) - if agent.Cnf != nil { // we are managing mysqld - // we'll use batchCtx here because we are still initializing and can't proceed unless this succeeds - if err := agent.MysqlDaemon.Wait(batchCtx, agent.Cnf); err != nil { - return nil, err - } - } - err := mysqlctl.PopulateMetadataTables(agent.MysqlDaemon, localMetadata, topoproto.TabletDbName(tablet)) - if err != nil { - return nil, vterrors.Wrap(err, "failed to -init_populate_metadata") - } + if err := agent.handleRestore(batchCtx); err != nil { + return nil, err } - // two cases then: - // - restoreFromBackup is set: we restore, then initHealthCheck, all - // in the background - // - restoreFromBackup is not set: we initHealthCheck right away - if *restoreFromBackup { - go func() { - // restoreFromBackup will just be a regular action - // (same as if it was triggered remotely) - if err := agent.RestoreData(batchCtx, logutil.NewConsoleLogger(), *waitForBackupInterval, false /* deleteBeforeRestore */); err != nil { - log.Exitf("RestoreFromBackup failed: %v", err) - } + agent.startShardSync() - // after the restore is done, start health check - agent.initHealthCheck() - }() - } else { - // synchronously start health check if needed - agent.initHealthCheck() + agent.exportStats() + + // Start periodic Orchestrator self-registration, if configured. + orc, err := newOrcClient() + if err != nil { + return nil, err + } + if orc != nil { + agent.orc = orc + go agent.orc.DiscoverLoop(agent) } // Temporary glue code to keep things working. @@ -358,17 +323,20 @@ func NewActionAgent( tablet = agent.Tablet() agent.changeCallback(batchCtx, tablet, tablet) - // Start periodic Orchestrator self-registration, if configured. - if agent.orc != nil { - go agent.orc.DiscoverLoop(agent) - } - return agent, nil } // NewTestActionAgent creates an agent for test purposes. Only a // subset of features are supported now, but we'll add more over time. -func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, mysqlDaemon mysqlctl.MysqlDaemon, preStart func(*ActionAgent)) *ActionAgent { +func NewTestActionAgent( + batchCtx context.Context, + ts *topo.Server, + tabletAlias *topodatapb.TabletAlias, + vtPort, grpcPort int32, + mysqlDaemon mysqlctl.MysqlDaemon, + preStart func(*ActionAgent), +) *ActionAgent { + ti, err := ts.GetTablet(batchCtx, tabletAlias) if err != nil { panic(vterrors.Wrap(err, "failed reading tablet")) @@ -398,31 +366,38 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * preStart(agent) } - if agent.initTablet(batchCtx); err != nil { - panic(err) - } - si, err := agent.createKeyspaceShard(batchCtx) if err != nil { - panic(vterrors.Wrap(err, "agent.createKeyspaceShard failed")) + panic(err) } - if err := agent.checkMastership(batchCtx, si); err != nil { - panic(vterrors.Wrap(err, "agent.checkMastership failed")) + panic(err) + } + if agent.initTablet(batchCtx); err != nil { + panic(err) } - // Start will update the topology and setup services. - if err := agent.Start(batchCtx); err != nil { - panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) + tablet := agent.Tablet() + err = agent.QueryServiceControl.InitDBConfig(querypb.Target{ + Keyspace: tablet.Keyspace, + Shard: tablet.Shard, + TabletType: tablet.Type, + }, agent.DBConfigs) + if err != nil { + panic(err) } + // Start a background goroutine to watch and update the shard record, + // to make sure it and our tablet record are in sync. + agent.startShardSync() + // Temporary glue code to keep things working. // TODO(sougou); remove after refactor. if err := agent.lock(batchCtx); err != nil { panic(err) } defer agent.unlock() - tablet := agent.Tablet() + tablet = agent.Tablet() agent.changeCallback(batchCtx, tablet, tablet) return agent @@ -431,7 +406,17 @@ func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias * // NewComboActionAgent creates an agent tailored specifically to run // within the vtcombo binary. It cannot be called concurrently, // as it changes the flags. -func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, queryServiceControl tabletserver.Controller, dbcfgs *dbconfigs.DBConfigs, mysqlDaemon mysqlctl.MysqlDaemon, keyspace, shard, dbname, tabletTypeStr string) *ActionAgent { +func NewComboActionAgent( + batchCtx context.Context, + ts *topo.Server, + tabletAlias *topodatapb.TabletAlias, + vtPort, grpcPort int32, + queryServiceControl tabletserver.Controller, + dbcfgs *dbconfigs.DBConfigs, + mysqlDaemon mysqlctl.MysqlDaemon, + keyspace, shard, dbname, tabletTypeStr string, +) *ActionAgent { + *initDbNameOverride = dbname *initKeyspace = keyspace *initShard = shard @@ -457,32 +442,36 @@ func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias BaseTabletType: tablet.Type, tablet: tablet, } - agent.registerQueryRuleSources() ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) defer cancel() si, err := agent.createKeyspaceShard(ctx) if err != nil { - panic(vterrors.Wrap(err, "agent.InitTablet failed")) + panic(err) } if err := agent.checkMastership(ctx, si); err != nil { - panic(vterrors.Wrap(err, "agent.InitTablet failed")) + panic(err) } if err := agent.initTablet(ctx); err != nil { - panic(vterrors.Wrap(err, "agent.InitTablet failed")) + panic(err) } - // Start the agent. - if err := agent.Start(batchCtx); err != nil { - panic(vterrors.Wrapf(err, "agent.Start(%v) failed", tabletAlias)) + tablet = agent.Tablet() + err = agent.QueryServiceControl.InitDBConfig(querypb.Target{ + Keyspace: tablet.Keyspace, + Shard: tablet.Shard, + TabletType: tablet.Type, + }, agent.DBConfigs) + if err != nil { + panic(err) } + agent.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) - return agent -} + // Start a background goroutine to watch and update the shard record, + // to make sure it and our tablet record are in sync. + agent.startShardSync() -// registerQueryRuleSources registers query rule sources under control of agent -func (agent *ActionAgent) registerQueryRuleSources() { - agent.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) + return agent } func (agent *ActionAgent) setTablet(tablet *topodatapb.Tablet) { @@ -614,56 +603,6 @@ func (agent *ActionAgent) setBlacklistedTables(value []string) { agent.mutex.Unlock() } -func (agent *ActionAgent) verifyTopology(ctx context.Context) { - if err := topo.Validate(ctx, agent.TopoServer, agent.TabletAlias); err != nil { - // Don't stop, it's not serious enough, this is likely transient. - log.Warningf("tablet validate failed: %v %v", agent.TabletAlias, err) - } -} - -// Start validates and updates the topology records for the tablet, and performs -// the initial state change callback to start tablet services. -// If initUpdateStream is set, update stream service will also be registered. -func (agent *ActionAgent) Start(ctx context.Context) error { - // Save the original tablet for ownership tests later. - tablet := agent.Tablet() - - // Verify the topology is correct. - agent.verifyTopology(ctx) - - // initialize tablet server - if err := agent.QueryServiceControl.InitDBConfig(querypb.Target{ - Keyspace: tablet.Keyspace, - Shard: tablet.Shard, - TabletType: tablet.Type, - }, agent.DBConfigs); err != nil { - return vterrors.Wrap(err, "failed to InitDBConfig") - } - - // export a few static variables - if agent.exportStats { - statsKeyspace := stats.NewString("TabletKeyspace") - statsShard := stats.NewString("TabletShard") - statsKeyRangeStart := stats.NewString("TabletKeyRangeStart") - statsKeyRangeEnd := stats.NewString("TabletKeyRangeEnd") - statsAlias := stats.NewString("TabletAlias") - - statsKeyspace.Set(tablet.Keyspace) - statsShard.Set(tablet.Shard) - if key.KeyRangeIsPartial(tablet.KeyRange) { - statsKeyRangeStart.Set(hex.EncodeToString(tablet.KeyRange.Start)) - statsKeyRangeEnd.Set(hex.EncodeToString(tablet.KeyRange.End)) - } - statsAlias.Set(topoproto.TabletAliasString(tablet.Alias)) - } - - // Start a background goroutine to watch and update the shard record, - // to make sure it and our tablet record are in sync. - agent.startShardSync() - - return nil -} - // Close prepares a tablet for shutdown. First we check our tablet ownership and // then prune the tablet topology entry of all post-init fields. This prevents // stale identifiers from hanging around in topology. @@ -961,3 +900,65 @@ func (agent *ActionAgent) initTablet(ctx context.Context) error { } return nil } + +func (agent *ActionAgent) handleRestore(ctx context.Context) error { + tablet := agent.Tablet() + // Sanity check for inconsistent flags + if agent.Cnf == nil && *restoreFromBackup { + return fmt.Errorf("you cannot enable -restore_from_backup without a my.cnf file") + } + + // two cases then: + // - restoreFromBackup is set: we restore, then initHealthCheck, all + // in the background + // - restoreFromBackup is not set: we initHealthCheck right away + if *restoreFromBackup { + go func() { + // restoreFromBackup will just be a regular action + // (same as if it was triggered remotely) + if err := agent.RestoreData(ctx, logutil.NewConsoleLogger(), *waitForBackupInterval, false /* deleteBeforeRestore */); err != nil { + log.Exitf("RestoreFromBackup failed: %v", err) + } + + // after the restore is done, start health check + agent.initHealthCheck() + }() + return nil + } + + // optionally populate metadata records + if *initPopulateMetadata { + localMetadata := agent.getLocalMetadataValues(tablet.Type) + if agent.Cnf != nil { // we are managing mysqld + // we'll use batchCtx here because we are still initializing and can't proceed unless this succeeds + if err := agent.MysqlDaemon.Wait(ctx, agent.Cnf); err != nil { + return err + } + } + err := mysqlctl.PopulateMetadataTables(agent.MysqlDaemon, localMetadata, topoproto.TabletDbName(tablet)) + if err != nil { + return vterrors.Wrap(err, "failed to -init_populate_metadata") + } + } + + // synchronously start health check if needed + agent.initHealthCheck() + return nil +} + +func (agent *ActionAgent) exportStats() { + tablet := agent.Tablet() + statsKeyspace := stats.NewString("TabletKeyspace") + statsShard := stats.NewString("TabletShard") + statsKeyRangeStart := stats.NewString("TabletKeyRangeStart") + statsKeyRangeEnd := stats.NewString("TabletKeyRangeEnd") + statsAlias := stats.NewString("TabletAlias") + + statsKeyspace.Set(tablet.Keyspace) + statsShard.Set(tablet.Shard) + if key.KeyRangeIsPartial(tablet.KeyRange) { + statsKeyRangeStart.Set(hex.EncodeToString(tablet.KeyRange.Start)) + statsKeyRangeEnd.Set(hex.EncodeToString(tablet.KeyRange.End)) + } + statsAlias.Set(topoproto.TabletAliasString(tablet.Alias)) +} diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 8ee3364aaf7..86428ea28d0 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -167,9 +167,7 @@ func (agent *ActionAgent) beginBackup(backupMode string) error { // offline backups also run only one at a time because we take the action lock // so this is not really needed in that case, however we are using it to record the state agent._isBackupRunning = true - if agent.exportStats { - agent.statsBackupIsRunning.Set([]string{backupMode}, 1) - } + statsBackupIsRunning.Set([]string{backupMode}, 1) return nil } @@ -179,7 +177,5 @@ func (agent *ActionAgent) endBackup(backupMode string) { agent.mutex.Lock() defer agent.mutex.Unlock() agent._isBackupRunning = false - if agent.exportStats { - agent.statsBackupIsRunning.Set([]string{backupMode}, 0) - } + statsBackupIsRunning.Set([]string{backupMode}, 0) } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 89fc6b37bb7..34abd81c5ad 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -347,11 +347,9 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl } // Update the stats to our current type. - if agent.exportStats { - s := topoproto.TabletTypeLString(newTablet.Type) - agent.statsTabletType.Set(s) - agent.statsTabletTypeCount.Add(s, 1) - } + s := topoproto.TabletTypeLString(newTablet.Type) + statsTabletType.Set(s) + statsTabletTypeCount.Add(s, 1) // See if we need to start or stop vreplication. if newTablet.Type == topodatapb.TabletType_MASTER { From 6608b8cf6dd32efa6f0cd1bb7320ebf95b38f1dc Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Wed, 10 Jun 2020 15:18:13 -0700 Subject: [PATCH 014/430] tm revamp: refreshState does not reload tablet Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/healthcheck_test.go | 10 ++++------ go/vt/vttablet/tabletmanager/state_change.go | 16 +++------------- go/vt/wrangler/reparent.go | 7 +------ 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index 3788c14112c..56bfc16c9db 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -802,7 +802,6 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // Refresh the tablet state, as vtworker would do. // Since we change the QueryService state, we'll also trigger a health broadcast. - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 21 * time.Second agent.RefreshState(ctx) // (Destination) MASTER with enabled filtered replication mustn't serve anymore. @@ -811,8 +810,8 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Consume health broadcast sent out due to QueryService state change from // (MASTER, SERVING) to (MASTER, NOT_SERVING). - // RefreshState on MASTER always sets the replicationDelay to 0 - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 0); err != nil { + // TODO(sougou); this test case does not reflect reality. Need to fix. + if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 20); err != nil { t.Fatal(err) } if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_MASTER); err != nil { @@ -820,7 +819,6 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Running a healthcheck won't put the QueryService back to SERVING. - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 22 * time.Second agent.runHealthCheck() ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -835,7 +833,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_MASTER) } - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 22); err != nil { + if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 20); err != nil { t.Fatal(err) } // NOTE: No state change here since nothing has changed. @@ -862,7 +860,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // Since we didn't run healthcheck again yet, the broadcast data contains the // cached replication lag of 0. This is because // RefreshState on MASTER always sets the replicationDelay to 0 - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 0); err != nil { + if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 20); err != nil { t.Fatal(err) } if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_MASTER); err != nil { diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 34abd81c5ad..1ac12416e5a 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -30,14 +30,12 @@ import ( "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" - "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletmanager/events" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletserver/rules" @@ -141,17 +139,9 @@ func (agent *ActionAgent) refreshTablet(ctx context.Context, reason string) erro span.Annotate("reason", reason) defer span.Finish() - // Actions should have side effects on the tablet, so reload the data. - ti, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) - if err != nil { - log.Warningf("Failed rereading tablet after %v - services may be inconsistent: %v", reason, err) - return vterrors.Wrapf(err, "refreshTablet failed rereading tablet after %v", reason) - } - tablet := ti.Tablet - - // Also refresh masterTermStartTime - agent.setMasterTermStartTime(logutil.ProtoToTime(tablet.MasterTermStartTime)) - agent.updateState(ctx, tablet, reason) + // TODO(sougou): change this to specifically look for global topo changes. + tablet := agent.Tablet() + agent.changeCallback(ctx, tablet, tablet) log.Infof("Done with post-action state refresh") return nil } diff --git a/go/vt/wrangler/reparent.go b/go/vt/wrangler/reparent.go index c15a2b6b755..12135de9dc8 100644 --- a/go/vt/wrangler/reparent.go +++ b/go/vt/wrangler/reparent.go @@ -533,15 +533,10 @@ func (wr *Wrangler) plannedReparentShardLocked(ctx context.Context, ev *events.R return vterrors.Wrapf(err, "failed to SetReadWrite on current master %v", masterElectTabletAliasStr) } // The master is already the one we want according to its tablet record. - // Refresh it to make sure the tablet has read its record recently. refreshCtx, refreshCancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer refreshCancel() - if err := wr.tmc.RefreshState(refreshCtx, masterElectTabletInfo.Tablet); err != nil { - return vterrors.Wrapf(err, "failed to RefreshState on current master %v", masterElectTabletAliasStr) - } - - // Then get the position so we can try to fix replicas (below). + // Get the position so we can try to fix replicas (below). rp, err := wr.tmc.MasterPosition(refreshCtx, masterElectTabletInfo.Tablet) if err != nil { return vterrors.Wrapf(err, "failed to get replication position of current master %v", masterElectTabletAliasStr) From 553d2d6bcc31ec96bfabf6438c202e629896811f Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Thu, 11 Jun 2020 11:24:14 -0700 Subject: [PATCH 015/430] tm revamp: pre-populate shardInfo and srvKeyspace Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/status.go | 4 - go/vt/vttablet/tabletmanager/action_agent.go | 77 +++++++++---------- .../tabletmanager/action_agent_test.go | 22 +++--- go/vt/vttablet/tabletmanager/healthcheck.go | 8 +- .../tabletmanager/healthcheck_test.go | 12 --- go/vt/vttablet/tabletmanager/state_change.go | 44 +++++++++-- go/vt/wrangler/testlib/fake_tablet.go | 2 + 7 files changed, 88 insertions(+), 81 deletions(-) diff --git a/go/cmd/vttablet/status.go b/go/cmd/vttablet/status.go index 920e5f70445..80aacab50ea 100644 --- a/go/cmd/vttablet/status.go +++ b/go/cmd/vttablet/status.go @@ -67,9 +67,6 @@ var ( {{if .DisallowQueryService}} Query Service disabled: {{.DisallowQueryService}}
{{end}} - {{if .DisableUpdateStream}} - Update Stream disabled
- {{end}} Schema
@@ -153,7 +150,6 @@ func addStatusParts(qsc tabletserver.Controller) { "Tablet": topo.NewTabletInfo(agent.Tablet(), nil), "BlacklistedTables": agent.BlacklistedTables(), "DisallowQueryService": agent.DisallowQueryService(), - "DisableUpdateStream": !agent.EnableUpdateStream(), } }) servenv.AddStatusFuncs(template.FuncMap{ diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 5cf7f5a435f..0a64999350c 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -93,9 +93,6 @@ var ( initTimeout = flag.Duration("init_timeout", 1*time.Minute, "(init parameter) timeout to use for the init phase.") - // mysqlPortRetryInterval can be changed to speed up tests. - mysqlPortRetryInterval = 1 * time.Second - // statsTabletType is set to expose the current tablet type. statsTabletType *stats.String @@ -106,6 +103,10 @@ var ( // statsBackupIsRunning is set to 1 (true) if a backup is running. statsBackupIsRunning *stats.GaugesWithMultiLabels + + // The following variables can be changed to speed up tests. + mysqlPortRetryInterval = 1 * time.Second + rebuildKeyspaceRetryInterval = 1 * time.Second ) func init() { @@ -160,6 +161,10 @@ type ActionAgent struct { // only hold the mutex to update the fields, nothing else. mutex sync.Mutex + // _shardInfo and _srvKeyspace are cached and refreshed on RefreshState. + _shardInfo *topo.ShardInfo + _srvKeyspace *topodatapb.SrvKeyspace + // _shardSyncChan is a channel for informing the shard sync goroutine that // it should wake up and recheck the tablet state, to make sure it and the // shard record are in sync. @@ -181,12 +186,6 @@ type ActionAgent struct { // tells us not to serve, or if filtered replication is running. _disallowQueryService string - // _enableUpdateStream is true if we should be running the - // UpdateStream service. Note if we can't start the query - // service, or if the server health check fails, we will - // disable UpdateStream. - _enableUpdateStream bool - // _blacklistedTables has the list of tables we are currently // blacklisting. _blacklistedTables []string @@ -263,11 +262,10 @@ func NewActionAgent( ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) defer cancel() - si, err := agent.createKeyspaceShard(ctx) - if err != nil { + if err = agent.createKeyspaceShard(ctx); err != nil { return nil, err } - if err := agent.checkMastership(ctx, si); err != nil { + if err := agent.checkMastership(ctx); err != nil { return nil, err } if err := agent.checkMysql(ctx); err != nil { @@ -366,11 +364,10 @@ func NewTestActionAgent( preStart(agent) } - si, err := agent.createKeyspaceShard(batchCtx) - if err != nil { + if err := agent.createKeyspaceShard(batchCtx); err != nil { panic(err) } - if err := agent.checkMastership(batchCtx, si); err != nil { + if err := agent.checkMastership(batchCtx); err != nil { panic(err) } if agent.initTablet(batchCtx); err != nil { @@ -445,11 +442,10 @@ func NewComboActionAgent( ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) defer cancel() - si, err := agent.createKeyspaceShard(ctx) - if err != nil { + if err := agent.createKeyspaceShard(ctx); err != nil { panic(err) } - if err := agent.checkMastership(ctx, si); err != nil { + if err := agent.checkMastership(ctx); err != nil { panic(err) } if err := agent.initTablet(ctx); err != nil { @@ -533,13 +529,6 @@ func (agent *ActionAgent) DisallowQueryService() string { return agent._disallowQueryService } -// EnableUpdateStream returns if we should enable update stream or not -func (agent *ActionAgent) EnableUpdateStream() bool { - agent.mutex.Lock() - defer agent.mutex.Unlock() - return agent._enableUpdateStream -} - func (agent *ActionAgent) slaveStopped() bool { agent.mutex.Lock() defer agent.mutex.Unlock() @@ -590,10 +579,9 @@ func (agent *ActionAgent) setSlaveStopped(slaveStopped bool) { } } -func (agent *ActionAgent) setServicesDesiredState(disallowQueryService string, enableUpdateStream bool) { +func (agent *ActionAgent) setServicesDesiredState(disallowQueryService string) { agent.mutex.Lock() agent._disallowQueryService = disallowQueryService - agent._enableUpdateStream = enableUpdateStream agent.mutex.Unlock() } @@ -735,31 +723,32 @@ func buildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( }, nil } -func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) (*topo.ShardInfo, error) { +func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) error { + // mutex is needed because we set _shardInfo and _srvKeyspace + agent.mutex.Lock() + defer agent.mutex.Unlock() + tablet := agent.Tablet() log.Infof("Reading/creating keyspace and shard records for %v/%v", tablet.Keyspace, tablet.Shard) // Read the shard, create it if necessary. - var si *topo.ShardInfo if err := agent.withRetry(ctx, "creating keyspace and shard", func() error { var err error - si, err = agent.TopoServer.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard) + agent._shardInfo, err = agent.TopoServer.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard) return err }); err != nil { - return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: cannot GetOrCreateShard shard") + return vterrors.Wrap(err, "createKeyspaceShard: cannot GetOrCreateShard shard") } // Rebuild keyspace if this the first tablet in this keyspace/cell - _, err := agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, tablet.Keyspace) + srvKeyspace, err := agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, tablet.Keyspace) switch { case err == nil: - // NOOP + agent._srvKeyspace = srvKeyspace case topo.IsErrType(err, topo.NoNode): - // Try to RebuildKeyspace here but ignore errors if it fails. - // It will fail until at least one tablet is up for every shard. - topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), agent.TopoServer, tablet.Keyspace, []string{agent.TabletAlias.Cell}) + go agent.rebuildKeyspace(tablet.Keyspace, rebuildKeyspaceRetryInterval) default: - return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvKeyspace") + return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvKeyspace") } // Rebuild vschema graph if this is the first tablet in this keyspace/cell. @@ -769,21 +758,25 @@ func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) (*topo.ShardI // Check if vschema was rebuilt after the initial creation of the keyspace. if _, keyspaceExists := srvVSchema.GetKeyspaces()[tablet.Keyspace]; !keyspaceExists { if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { - return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") + return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } } case topo.IsErrType(err, topo.NoNode): // There is no SrvSchema in this cell at all, so we definitely need to rebuild. if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { - return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") + return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } default: - return nil, vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvVSchema") + return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvVSchema") } - return si, nil + return nil } -func (agent *ActionAgent) checkMastership(ctx context.Context, si *topo.ShardInfo) error { +func (agent *ActionAgent) checkMastership(ctx context.Context) error { + agent.mutex.Lock() + si := agent._shardInfo + agent.mutex.Unlock() + if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, agent.TabletAlias) { // We're marked as master in the shard record, which could mean the master // tablet process was just restarted. However, we need to check if a new diff --git a/go/vt/vttablet/tabletmanager/action_agent_test.go b/go/vt/vttablet/tabletmanager/action_agent_test.go index 63c4104adbe..6c7301107f9 100644 --- a/go/vt/vttablet/tabletmanager/action_agent_test.go +++ b/go/vt/vttablet/tabletmanager/action_agent_test.go @@ -69,7 +69,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) agent.tablet = tablet - _, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) @@ -135,7 +135,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) agent.tablet = tablet - _, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) @@ -157,7 +157,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. tablet, err = buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) agent.tablet = tablet - _, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) err = agent.initTablet(context.Background()) // This should fail. @@ -223,7 +223,7 @@ func TestInitTablet(t *testing.T) { tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) agent.tablet = tablet - _, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) @@ -282,7 +282,7 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) agent.tablet = tablet - _, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) @@ -309,9 +309,9 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) agent.tablet = tablet - si, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.checkMastership(ctx, si) + err = agent.checkMastership(ctx) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) @@ -339,9 +339,9 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) agent.tablet = tablet - si, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.checkMastership(ctx, si) + err = agent.checkMastership(ctx) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) @@ -366,9 +366,9 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) agent.tablet = tablet - si, err = agent.createKeyspaceShard(context.Background()) + err = agent.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.checkMastership(ctx, si) + err = agent.checkMastership(ctx) require.NoError(t, err) err = agent.initTablet(context.Background()) require.NoError(t, err) diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index f62b4fa8547..3de6869d3fc 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -184,7 +184,6 @@ func (agent *ActionAgent) runHealthCheckLocked() { tablet := agent.Tablet() agent.mutex.Lock() shouldBeServing := agent._disallowQueryService == "" - runUpdateStream := agent._enableUpdateStream ignoreErrorExpr := agent._ignoreHealthErrorExpr agent.mutex.Unlock() @@ -260,12 +259,7 @@ func (agent *ActionAgent) runHealthCheckLocked() { } } } - - // change UpdateStream state if necessary - if healthErr != nil { - runUpdateStream = false - } - if topo.IsRunningUpdateStream(tablet.Type) && runUpdateStream { + if topo.IsRunningUpdateStream(tablet.Type) { agent.UpdateStream.Enable() } else { agent.UpdateStream.Disable() diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index 56bfc16c9db..6e0cf8165cd 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -235,9 +235,6 @@ func TestHealthCheckControlsQueryService(t *testing.T) { if agent.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent.UpdateStream.IsEnabled() { - t.Errorf("UpdateStream should not be running") - } if agent._healthyTime.Sub(before) < 0 { t.Errorf("runHealthCheck did not update agent._healthyTime") } @@ -359,9 +356,6 @@ func TestQueryServiceNotStarting(t *testing.T) { if agent.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent.UpdateStream.IsEnabled() { - t.Errorf("UpdateStream should not be running") - } if agent._healthyTime.Sub(before) < 0 { t.Errorf("runHealthCheck did not update agent._healthyTime") } @@ -455,9 +449,6 @@ func TestQueryServiceStopped(t *testing.T) { if agent.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent.UpdateStream.IsEnabled() { - t.Errorf("UpdateStream should not be running") - } if agent._healthyTime.Sub(before) < 0 { t.Errorf("runHealthCheck did not update agent._healthyTime") } @@ -611,9 +602,6 @@ func TestTabletControl(t *testing.T) { if agent.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent.UpdateStream.IsEnabled() { - t.Errorf("UpdateStream should not be running") - } if agent._healthyTime.Sub(before) < 0 { t.Errorf("runHealthCheck did not update agent._healthyTime") } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 1ac12416e5a..2f4c4faa627 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -30,6 +30,7 @@ import ( "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -184,8 +185,6 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl defer span.Finish() allowQuery := topo.IsRunningQueryService(newTablet.Type) - broadcastHealth := false - runUpdateStream := allowQuery // Read the shard to get SourceShards / TabletControlMap if // we're going to use it. @@ -267,7 +266,7 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl disallowQueryReason = fmt.Sprintf("not a serving tablet type(%v)", newTablet.Type) disallowQueryService = disallowQueryReason } - agent.setServicesDesiredState(disallowQueryService, runUpdateStream) + agent.setServicesDesiredState(disallowQueryService) if updateBlacklistedTables { if err := agent.loadBlacklistRules(ctx, newTablet, blacklistedTables); err != nil { // FIXME(alainjobart) how to handle this error? @@ -277,6 +276,7 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl } } + broadcastHealth := false if allowQuery { // Query service should be running. if oldTablet.Type == topodatapb.TabletType_REPLICA && @@ -302,7 +302,6 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl broadcastHealth = true } } else { - runUpdateStream = false log.Errorf("Cannot start query service: %v", err) } } else { @@ -330,7 +329,7 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl } // UpdateStream needs to be started or stopped too. - if topo.IsRunningUpdateStream(newTablet.Type) && runUpdateStream { + if topo.IsRunningUpdateStream(newTablet.Type) { agent.UpdateStream.Enable() } else { agent.UpdateStream.Disable() @@ -417,6 +416,41 @@ func (agent *ActionAgent) retryPublish() { } } +func (agent *ActionAgent) rebuildKeyspace(keyspace string, retryInterval time.Duration) { + var srvKeyspace *topodatapb.SrvKeyspace + defer func() { + log.Infof("Keyspace rebuilt: %v", keyspace) + agent.mutex.Lock() + defer agent.mutex.Unlock() + agent._srvKeyspace = srvKeyspace + }() + + // RebuildKeyspace will fail until at least one tablet is up for every shard. + firstTime := true + var err error + for { + if !firstTime { + // If keyspace was rebuilt by someone else, we can just exit. + srvKeyspace, err = agent.TopoServer.GetSrvKeyspace(agent.batchCtx, agent.TabletAlias.Cell, keyspace) + if err == nil { + return + } + } + err = topotools.RebuildKeyspace(agent.batchCtx, logutil.NewConsoleLogger(), agent.TopoServer, keyspace, []string{agent.TabletAlias.Cell}) + if err == nil { + srvKeyspace, err = agent.TopoServer.GetSrvKeyspace(agent.batchCtx, agent.TabletAlias.Cell, keyspace) + if err == nil { + return + } + } + if firstTime { + log.Warningf("rebuildKeyspace failed, will retry every %v: %v", retryInterval, err) + } + firstTime = false + time.Sleep(retryInterval) + } +} + func (agent *ActionAgent) findMysqlPort(retryInterval time.Duration) { for { time.Sleep(retryInterval) diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index 1fa94227abc..81e09004033 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -120,6 +120,8 @@ func StartHTTPServer() TabletOption { // Use TabletOption implementations if you need to change values at creation. // 'db' can be nil if the test doesn't use a database at all. func NewFakeTablet(t *testing.T, wr *wrangler.Wrangler, cell string, uid uint32, tabletType topodatapb.TabletType, db *fakesqldb.DB, options ...TabletOption) *FakeTablet { + t.Helper() + if uid > 99 { t.Fatalf("uid has to be between 0 and 99: %v", uid) } From 68627aff67b6b97dc715556ea70d7ac57ccb425a Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 12 Jun 2020 09:49:33 -0700 Subject: [PATCH 016/430] tm revamp: fix tests after rebase Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/healthcheck_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index 6e0cf8165cd..cb728640618 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -336,8 +336,8 @@ func TestQueryServiceNotStarting(t *testing.T) { if agent.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent.UpdateStream.IsEnabled() { - t.Errorf("UpdateStream should not be running") + if !agent.UpdateStream.IsEnabled() { + t.Errorf("UpdateStream should be running") } // There is no broadcast data to consume, we're just not From 105f995dab9522e7ca22dc7893acca51d39e2d14 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 12 Jun 2020 16:32:30 -0700 Subject: [PATCH 017/430] tm revamp: remove agent._masterTermStartTime Signed-off-by: Sugu Sougoumarane --- go/vt/topo/tablet.go | 5 ---- go/vt/vtctl/vtctl.go | 12 ++++----- go/vt/vttablet/tabletmanager/action_agent.go | 4 --- .../tabletmanager/action_agent_test.go | 11 ++++---- .../tabletmanager/healthcheck_test.go | 2 +- go/vt/vttablet/tabletmanager/rpc_actions.go | 9 ++----- .../vttablet/tabletmanager/rpc_replication.go | 1 - go/vt/vttablet/tabletmanager/shard_sync.go | 26 +++++-------------- go/vt/vttablet/tabletmanager/state_change.go | 13 +--------- go/vt/wrangler/tablet.go | 4 +-- 10 files changed, 23 insertions(+), 64 deletions(-) diff --git a/go/vt/topo/tablet.go b/go/vt/topo/tablet.go index 7e1fa034504..8e96a6b1418 100644 --- a/go/vt/topo/tablet.go +++ b/go/vt/topo/tablet.go @@ -214,11 +214,6 @@ func (ti *TabletInfo) GetMasterTermStartTime() time.Time { return logutil.ProtoToTime(ti.Tablet.MasterTermStartTime) } -// SetMasterTermStartTime sets the tablet's master term start time as a Time value. -func (ti *TabletInfo) SetMasterTermStartTime(t time.Time) { - ti.Tablet.MasterTermStartTime = logutil.TimeToProto(t) -} - // NewTabletInfo returns a TabletInfo basing on tablet with the // version set. This function should be only used by Server // implementations. diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 89f27e54665..d39e5f0c43c 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -530,14 +530,14 @@ func listTabletsByShard(ctx context.Context, wr *wrangler.Wrangler, keyspace, sh var trueMasterTimestamp time.Time for _, ti := range tabletMap { if ti.Type == topodatapb.TabletType_MASTER { - masterTimestamp := logutil.ProtoToTime(ti.MasterTermStartTime) + masterTimestamp := ti.GetMasterTermStartTime() if masterTimestamp.After(trueMasterTimestamp) { trueMasterTimestamp = masterTimestamp } } } for _, ti := range tabletMap { - masterTimestamp := logutil.ProtoToTime(ti.MasterTermStartTime) + masterTimestamp := ti.GetMasterTermStartTime() if ti.Type == topodatapb.TabletType_MASTER && masterTimestamp.Before(trueMasterTimestamp) { ti.Type = topodatapb.TabletType_UNKNOWN } @@ -557,7 +557,7 @@ func dumpAllTablets(ctx context.Context, wr *wrangler.Wrangler, cell string) err trueMasterTimestamps := findTrueMasterTimestamps(tablets) for _, ti := range tablets { key := ti.Keyspace + "." + ti.Shard - masterTimestamp := logutil.ProtoToTime(ti.MasterTermStartTime) + masterTimestamp := ti.GetMasterTermStartTime() if ti.Type == topodatapb.TabletType_MASTER && masterTimestamp.Before(trueMasterTimestamps[key]) { ti.Type = topodatapb.TabletType_UNKNOWN } @@ -571,10 +571,10 @@ func findTrueMasterTimestamps(tablets []*topo.TabletInfo) map[string]time.Time { for _, ti := range tablets { key := ti.Keyspace + "." + ti.Shard if v, ok := result[key]; !ok { - result[key] = logutil.ProtoToTime(ti.MasterTermStartTime) + result[key] = ti.GetMasterTermStartTime() } else { - if logutil.ProtoToTime(ti.MasterTermStartTime).After(v) { - result[key] = logutil.ProtoToTime(ti.MasterTermStartTime) + if ti.GetMasterTermStartTime().After(v) { + result[key] = ti.GetMasterTermStartTime() } } } diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/action_agent.go index 0a64999350c..5117131b88d 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/action_agent.go @@ -200,9 +200,6 @@ type ActionAgent struct { // replication delay the last time we got it _replicationDelay time.Duration - // _masterTermStartTime is the time at which our term as master began. - _masterTermStartTime time.Time - // _ignoreHealthErrorExpr can be set by RPC to selectively disable certain // healthcheck errors. It should only be accessed while holding actionMutex. _ignoreHealthErrorExpr *regexp.Regexp @@ -828,7 +825,6 @@ func (agent *ActionAgent) checkMastership(ctx context.Context) error { return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") } } - agent.setMasterTermStartTime(logutil.ProtoToTime(agent.Tablet().MasterTermStartTime)) return nil } diff --git a/go/vt/vttablet/tabletmanager/action_agent_test.go b/go/vt/vttablet/tabletmanager/action_agent_test.go index 6c7301107f9..4581321faa7 100644 --- a/go/vt/vttablet/tabletmanager/action_agent_test.go +++ b/go/vt/vttablet/tabletmanager/action_agent_test.go @@ -26,7 +26,6 @@ import ( "vitess.io/vitess/go/history" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/vt/dbconfigs" - "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" @@ -263,7 +262,7 @@ func TestInitTablet(t *testing.T) { if string(ti.KeyRange.Start) != "" || string(ti.KeyRange.End) != "\xc0" { t.Errorf("wrong KeyRange for tablet: %v", ti.KeyRange) } - if got := agent._masterTermStartTime; !got.IsZero() { + if got := agent.masterTermStartTime(); !got.IsZero() { t.Fatalf("REPLICA tablet should not have a MasterTermStartTime set: %v", got) } @@ -295,7 +294,7 @@ func TestInitTablet(t *testing.T) { if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("wrong tablet type: %v", ti.Type) } - if got := agent._masterTermStartTime; !got.IsZero() { + if got := agent.masterTermStartTime(); !got.IsZero() { t.Fatalf("REPLICA tablet should not have a masterTermStartTime set: %v", got) } @@ -323,7 +322,7 @@ func TestInitTablet(t *testing.T) { if ti.Type != topodatapb.TabletType_MASTER { t.Errorf("wrong tablet type: %v", ti.Type) } - ter1 := logutil.ProtoToTime(ti.Tablet.MasterTermStartTime) + ter1 := ti.GetMasterTermStartTime() if ter1.IsZero() { t.Fatalf("MASTER tablet should have a masterTermStartTime set") } @@ -353,7 +352,7 @@ func TestInitTablet(t *testing.T) { if ti.Type != topodatapb.TabletType_MASTER { t.Errorf("wrong tablet type: %v", ti.Type) } - ter2 := logutil.ProtoToTime(ti.Tablet.MasterTermStartTime) + ter2 := ti.GetMasterTermStartTime() if ter2.IsZero() || !ter2.Equal(ter1) { t.Fatalf("After a restart, masterTermStartTime must be equal to the previous time saved in the tablet record. Previous timestamp: %v current timestamp: %v", ter1, ter2) } @@ -386,7 +385,7 @@ func TestInitTablet(t *testing.T) { if len(ti.Tags) != 1 || ti.Tags["aaa"] != "bbb" { t.Errorf("wrong tablet tags: %v", ti.Tags) } - ter3 := logutil.ProtoToTime(ti.Tablet.MasterTermStartTime) + ter3 := ti.GetMasterTermStartTime() if ter3.IsZero() || !ter3.Equal(ter2) { t.Fatalf("After a restart, masterTermStartTime must be set to the previous time saved in the tablet record. Previous timestamp: %v current timestamp: %v", ter2, ter3) } diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index cb728640618..fc82974fafa 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -742,7 +742,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Consume the health broadcast (no replication delay as we are master) - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 0); err != nil { + if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 12); err != nil { t.Fatal(err) } if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_MASTER); err != nil { diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index 049518a44b8..e40f8d40da8 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -80,20 +80,15 @@ func (agent *ActionAgent) changeTypeLocked(ctx context.Context, tabletType topod // If we have been told we're master, set master term start time to Now // and save it topo immediately. if tabletType == topodatapb.TabletType_MASTER { - agentMasterTermStartTime := time.Now() - tablet.MasterTermStartTime = logutil.TimeToProto(agentMasterTermStartTime) + tablet.MasterTermStartTime = logutil.TimeToProto(time.Now()) // change our type in the topology, and set masterTermStartTime on tablet record if applicable _, err := topotools.ChangeType(ctx, agent.TopoServer, agent.TabletAlias, tabletType, tablet.MasterTermStartTime) if err != nil { return err } - // We only update agent's masterTermStartTime if we were able to update the topo. - // This ensures that in case of a failure, we are never in a situation where the - // tablet's timestamp is ahead of the topo's timestamp. - agent.setMasterTermStartTime(agentMasterTermStartTime) } else { - agent.setMasterTermStartTime(time.Time{}) + tablet.MasterTermStartTime = nil } // updateState will invoke broadcastHealth if needed. diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 991b435f86f..c0ae6d12611 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -533,7 +533,6 @@ func (agent *ActionAgent) setMasterLocked(ctx context.Context, parentAlias *topo if tablet.Type == topodatapb.TabletType_MASTER { tablet.Type = topodatapb.TabletType_REPLICA tablet.MasterTermStartTime = nil - agent.setMasterTermStartTime(time.Time{}) agent.updateState(ctx, tablet, "setMasterLocked") } diff --git a/go/vt/vttablet/tabletmanager/shard_sync.go b/go/vt/vttablet/tabletmanager/shard_sync.go index 673ed7898a9..542c88466b4 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync.go +++ b/go/vt/vttablet/tabletmanager/shard_sync.go @@ -284,25 +284,11 @@ func (agent *ActionAgent) notifyShardSync() { } } -// setMasterTermStartTime remembers the time when our term as master began. -// -// If another tablet claims to be master and offers a more recent time, -// that tablet will be trusted over us. -func (agent *ActionAgent) setMasterTermStartTime(t time.Time) { - agent.mutex.Lock() - agent._masterTermStartTime = t - // Reset replication delay ony if we're the master. - if !t.IsZero() { - agent._replicationDelay = 0 - } - agent.mutex.Unlock() - - // Notify the shard sync loop that the tablet state changed. - agent.notifyShardSync() -} - func (agent *ActionAgent) masterTermStartTime() time.Time { - agent.mutex.Lock() - defer agent.mutex.Unlock() - return agent._masterTermStartTime + agent.pubMu.Lock() + defer agent.pubMu.Unlock() + if agent.tablet == nil { + return time.Time{} + } + return logutil.ProtoToTime(agent.tablet.MasterTermStartTime) } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 2f4c4faa627..057786763c4 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -104,7 +104,6 @@ func (agent *ActionAgent) broadcastHealth() { agent.mutex.Lock() replicationDelay := agent._replicationDelay healthError := agent._healthy - terTime := agent._masterTermStartTime healthyTime := agent._healthyTime agent.mutex.Unlock() @@ -124,6 +123,7 @@ func (agent *ActionAgent) broadcastHealth() { } } var ts int64 + terTime := agent.masterTermStartTime() if !terTime.IsZero() { ts = terTime.Unix() } @@ -167,17 +167,6 @@ func (agent *ActionAgent) updateState(ctx context.Context, newTablet *topodatapb // changeCallback is run after every action that might // have changed something in the tablet record or in the topology. -// -// It owns making changes to the BinlogPlayerMap. The input for this is the -// tablet type (has to be master), and the shard's SourceShards. -// -// It owns updating the blacklisted tables. -// -// It owns updating the stats record for 'TabletType'. -// -// It owns starting and stopping the update stream service. -// -// It owns reading the TabletControl for the current tablet, and storing it. func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTablet *topodatapb.Tablet) { agent.checkLock() diff --git a/go/vt/wrangler/tablet.go b/go/vt/wrangler/tablet.go index 82075ecbb05..d3f3c1fe98d 100644 --- a/go/vt/wrangler/tablet.go +++ b/go/vt/wrangler/tablet.go @@ -235,7 +235,7 @@ func (wr *Wrangler) isMasterTablet(ctx context.Context, ti *topo.TabletInfo) (bo } // Shard record has another tablet as master, so check MasterTermStartTime // If tablet record's MasterTermStartTime is later than the one in the shard record, then tablet is master - tabletMTST := logutil.ProtoToTime(ti.MasterTermStartTime) - shardMTST := logutil.ProtoToTime(si.MasterTermStartTime) + tabletMTST := ti.GetMasterTermStartTime() + shardMTST := si.GetMasterTermStartTime() return tabletMTST.After(shardMTST), nil } From aa7484a95e4d41926a81010973d56b88ec22ed91 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 12 Jun 2020 18:56:31 -0700 Subject: [PATCH 018/430] tm revamp: ActionAgent -> TabletManager Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/vttablet.go | 6 +- go/vt/vtcombo/tablet_map.go | 6 +- go/vt/vttablet/grpctmserver/server.go | 4 +- go/vt/vttablet/tabletmanager/healthcheck.go | 10 +-- .../tabletmanager/healthcheck_test.go | 16 ++-- go/vt/vttablet/tabletmanager/orchestrator.go | 2 +- .../tabletmanager/replication_reporter.go | 6 +- .../replication_reporter_test.go | 8 +- go/vt/vttablet/tabletmanager/restore.go | 8 +- go/vt/vttablet/tabletmanager/rpc_actions.go | 20 ++--- go/vt/vttablet/tabletmanager/rpc_backup.go | 8 +- .../vttablet/tabletmanager/rpc_lock_tables.go | 8 +- go/vt/vttablet/tabletmanager/rpc_query.go | 6 +- .../vttablet/tabletmanager/rpc_replication.go | 56 +++++++------- go/vt/vttablet/tabletmanager/rpc_schema.go | 8 +- go/vt/vttablet/tabletmanager/rpc_server.go | 12 +-- go/vt/vttablet/tabletmanager/shard_sync.go | 12 +-- go/vt/vttablet/tabletmanager/state_change.go | 24 +++--- .../{action_agent.go => tm_init.go} | 74 +++++++++---------- .../{action_agent_test.go => tm_init_test.go} | 6 +- go/vt/vttablet/tabletmanager/vreplication.go | 4 +- go/vt/wrangler/fake_tablet_test.go | 4 +- go/vt/wrangler/testlib/fake_tablet.go | 4 +- 23 files changed, 156 insertions(+), 156 deletions(-) rename go/vt/vttablet/tabletmanager/{action_agent.go => tm_init.go} (93%) rename go/vt/vttablet/tabletmanager/{action_agent_test.go => tm_init_test.go} (99%) diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index d55ecb554dc..71fc9688642 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -43,7 +43,7 @@ var ( tabletPath = flag.String("tablet-path", "", "tablet alias") tabletConfig = flag.String("tablet_config", "", "YAML file config for tablet") - agent *tabletmanager.ActionAgent + agent *tabletmanager.TabletManager ) func init() { @@ -142,9 +142,9 @@ func main() { if servenv.GRPCPort != nil { gRPCPort = int32(*servenv.GRPCPort) } - agent, err = tabletmanager.NewActionAgent(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) + agent, err = tabletmanager.NewTabletManager(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) if err != nil { - log.Exitf("NewActionAgent() failed: %v", err) + log.Exitf("NewTabletManager() failed: %v", err) } servenv.OnClose(func() { diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index ed5c45425f7..d9e0f3855a2 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -65,7 +65,7 @@ type tablet struct { // objects built at construction time qsc tabletserver.Controller - agent *tabletmanager.ActionAgent + agent *tabletmanager.TabletManager } // tabletMap maps the tablet uid to the tablet record @@ -86,7 +86,7 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, if tabletType == topodatapb.TabletType_MASTER { initTabletType = topodatapb.TabletType_REPLICA } - agent := tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) + agent := tabletmanager.NewComboTabletManager(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) if tabletType == topodatapb.TabletType_MASTER { if err := agent.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { return fmt.Errorf("TabletExternallyReparented failed on master %v: %v", topoproto.TabletAliasString(alias), err) @@ -200,7 +200,7 @@ func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlct _, err = conn.ExecuteFetch("CREATE DATABASE IF NOT EXISTS `"+dbname+"`", 1, false) if err != nil { - return fmt.Errorf("Error ensuring database exists: %v", err) + return fmt.Errorf("error ensuring database exists: %v", err) } } diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index 71f6a7b9de9..8e503ac2bba 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -482,7 +482,7 @@ func (s *server) RestoreFromBackup(request *tabletmanagerdatapb.RestoreFromBacku // registration glue func init() { - tabletmanager.RegisterQueryServices = append(tabletmanager.RegisterQueryServices, func(agent *tabletmanager.ActionAgent) { + tabletmanager.RegisterQueryServices = append(tabletmanager.RegisterQueryServices, func(agent *tabletmanager.TabletManager) { if servenv.GRPCCheckServiceMap("tabletmanager") { tabletmanagerservicepb.RegisterTabletManagerServer(servenv.GRPCServer, &server{agent}) } @@ -490,6 +490,6 @@ func init() { } // RegisterForTest will register the RPC, to be used by test instances only -func RegisterForTest(s *grpc.Server, agent *tabletmanager.ActionAgent) { +func RegisterForTest(s *grpc.Server, agent *tabletmanager.TabletManager) { tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{agent}) } diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index 3de6869d3fc..f4d77574902 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -134,9 +134,9 @@ func ConfigHTML() template.HTML { } // initHealthCheck will start the health check background go routine, -// and configure the healthcheck shutdown. It is only run by NewActionAgent +// and configure the healthcheck shutdown. It is only run by NewTabletManager // for real vttablet agents (not by tests, nor vtcombo). -func (agent *ActionAgent) initHealthCheck() { +func (agent *TabletManager) initHealthCheck() { registerReplicationReporter(agent) registerHeartbeatReporter(agent.QueryServiceControl) @@ -168,7 +168,7 @@ func (agent *ActionAgent) initHealthCheck() { // // This will not change the TabletControl record, but will use it // to see if we should be running the query service. -func (agent *ActionAgent) runHealthCheck() { +func (agent *TabletManager) runHealthCheck() { if err := agent.lock(agent.batchCtx); err != nil { log.Warningf("cannot lock actionMutex, not running HealthCheck") return @@ -178,7 +178,7 @@ func (agent *ActionAgent) runHealthCheck() { agent.runHealthCheckLocked() } -func (agent *ActionAgent) runHealthCheckLocked() { +func (agent *TabletManager) runHealthCheckLocked() { agent.checkLock() // read the current tablet record and tablet control tablet := agent.Tablet() @@ -295,7 +295,7 @@ func (agent *ActionAgent) runHealthCheckLocked() { // terminateHealthChecks is called when we enter lame duck mode. // We will clean up our state, and set query service to lame duck mode. // We only do something if we are in a serving state, and not a master. -func (agent *ActionAgent) terminateHealthChecks() { +func (agent *TabletManager) terminateHealthChecks() { // No need to check for error, only a canceled batchCtx would fail this. agent.lock(agent.batchCtx) defer agent.unlock() diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index fc82974fafa..1428d372912 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -131,7 +131,7 @@ func (fhc *fakeHealthCheck) HTMLName() template.HTML { return template.HTML("fakeHealthCheck") } -func createTestAgent(ctx context.Context, t *testing.T, preStart func(*ActionAgent)) *ActionAgent { +func createTestAgent(ctx context.Context, t *testing.T, preStart func(*TabletManager)) *TabletManager { ts := memorytopo.NewServer("cell1") if err := ts.CreateKeyspace(ctx, "test_keyspace", &topodatapb.Keyspace{}); err != nil { @@ -158,7 +158,7 @@ func createTestAgent(ctx context.Context, t *testing.T, preStart func(*ActionAge } mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} - agent := NewTestActionAgent(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) + agent := NewTestTabletManager(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) agent.HealthReporter = &fakeHealthCheck{} @@ -177,7 +177,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { ctx := context.Background() agent := createTestAgent(ctx, t, nil) - // Consume the first health broadcast triggered by ActionAgent.Start(): + // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { @@ -275,7 +275,7 @@ func TestErrSlaveNotRunningIsHealthy(t *testing.T) { ctx := context.Background() agent := createTestAgent(ctx, t, nil) - // Consume the first health broadcast triggered by ActionAgent.Start(): + // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { @@ -326,7 +326,7 @@ func TestErrSlaveNotRunningIsHealthy(t *testing.T) { // query service, it should not go healthy. func TestQueryServiceNotStarting(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, func(a *ActionAgent) { + agent := createTestAgent(ctx, t, func(a *TabletManager) { // The SetServingType that will fail is part of Start() // so we have to do this here. a.QueryServiceControl.(*tabletservermock.Controller).SetServingTypeError = fmt.Errorf("test cannot start query service") @@ -381,7 +381,7 @@ func TestQueryServiceStopped(t *testing.T) { ctx := context.Background() agent := createTestAgent(ctx, t, nil) - // Consume the first health broadcast triggered by ActionAgent.Start(): + // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { @@ -476,7 +476,7 @@ func TestTabletControl(t *testing.T) { ctx := context.Background() agent := createTestAgent(ctx, t, nil) - // Consume the first health broadcast triggered by ActionAgent.Start(): + // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { @@ -676,7 +676,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { ctx := context.Background() agent := createTestAgent(ctx, t, nil) - // Consume the first health broadcast triggered by ActionAgent.Start(): + // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { diff --git a/go/vt/vttablet/tabletmanager/orchestrator.go b/go/vt/vttablet/tabletmanager/orchestrator.go index 42f6ec314b7..6349bf757a6 100644 --- a/go/vt/vttablet/tabletmanager/orchestrator.go +++ b/go/vt/vttablet/tabletmanager/orchestrator.go @@ -68,7 +68,7 @@ func newOrcClient() (*orcClient, error) { // DiscoverLoop periodically calls orc.discover() until process termination. // The Tablet is read from the given agent each time before calling discover(). // Usually this will be launched as a background goroutine. -func (orc *orcClient) DiscoverLoop(agent *ActionAgent) { +func (orc *orcClient) DiscoverLoop(agent *TabletManager) { if *orcInterval == 0 { // 0 means never. return diff --git a/go/vt/vttablet/tabletmanager/replication_reporter.go b/go/vt/vttablet/tabletmanager/replication_reporter.go index 9c4f60b7db8..f4ca0371008 100644 --- a/go/vt/vttablet/tabletmanager/replication_reporter.go +++ b/go/vt/vttablet/tabletmanager/replication_reporter.go @@ -40,7 +40,7 @@ var ( // replicationReporter implements health.Reporter type replicationReporter struct { // set at construction time - agent *ActionAgent + agent *TabletManager now func() time.Time // store the last time we successfully got the lag, so if we @@ -111,7 +111,7 @@ func (r *replicationReporter) HTMLName() template.HTML { // repairReplication tries to connect this slave to whoever is // the current master of the shard, and start replicating. -func repairReplication(ctx context.Context, agent *ActionAgent) error { +func repairReplication(ctx context.Context, agent *TabletManager) error { if *mysqlctl.DisableActiveReparents { return fmt.Errorf("can't repair replication with --disable_active_reparents") } @@ -156,7 +156,7 @@ func repairReplication(ctx context.Context, agent *ActionAgent) error { return agent.setMasterRepairReplication(ctx, si.MasterAlias, 0, "", true) } -func registerReplicationReporter(agent *ActionAgent) { +func registerReplicationReporter(agent *TabletManager) { if *enableReplicationReporter { health.DefaultAggregator.Register("replication_reporter", &replicationReporter{ diff --git a/go/vt/vttablet/tabletmanager/replication_reporter_test.go b/go/vt/vttablet/tabletmanager/replication_reporter_test.go index 4140f0a2f4c..6ee0f18d319 100644 --- a/go/vt/vttablet/tabletmanager/replication_reporter_test.go +++ b/go/vt/vttablet/tabletmanager/replication_reporter_test.go @@ -32,7 +32,7 @@ func TestBasicMySQLReplicationLag(t *testing.T) { slaveStopped := true rep := &replicationReporter{ - agent: &ActionAgent{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, now: time.Now, } dur, err := rep.Report(true, true) @@ -47,7 +47,7 @@ func TestNoKnownMySQLReplicationLag(t *testing.T) { slaveStopped := true rep := &replicationReporter{ - agent: &ActionAgent{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, now: time.Now, } dur, err := rep.Report(true, true) @@ -64,7 +64,7 @@ func TestExtrapolatedMySQLReplicationLag(t *testing.T) { now := time.Now() rep := &replicationReporter{ - agent: &ActionAgent{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, now: func() time.Time { return now }, } @@ -92,7 +92,7 @@ func TestNoExtrapolatedMySQLReplicationLag(t *testing.T) { now := time.Now() rep := &replicationReporter{ - agent: &ActionAgent{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, now: func() time.Time { return now }, } diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 3a489af58d0..20ac9255c68 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -50,7 +50,7 @@ var ( // It will either work, fail gracefully, or return // an error in case of a non-recoverable error. // It takes the action lock so no RPC interferes. -func (agent *ActionAgent) RestoreData(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { +func (agent *TabletManager) RestoreData(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { if err := agent.lock(ctx); err != nil { return err } @@ -61,7 +61,7 @@ func (agent *ActionAgent) RestoreData(ctx context.Context, logger logutil.Logger return agent.restoreDataLocked(ctx, logger, waitForBackupInterval, deleteBeforeRestore) } -func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { +func (agent *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { var originalType topodatapb.TabletType tablet := agent.Tablet() originalType, tablet.Type = tablet.Type, topodatapb.TabletType_RESTORE @@ -166,7 +166,7 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. return nil } -func (agent *ActionAgent) startReplication(ctx context.Context, pos mysql.Position, tabletType topodatapb.TabletType) error { +func (agent *TabletManager) startReplication(ctx context.Context, pos mysql.Position, tabletType topodatapb.TabletType) error { cmds := []string{ "STOP SLAVE", "RESET SLAVE ALL", // "ALL" makes it forget master host:port. @@ -261,7 +261,7 @@ func (agent *ActionAgent) startReplication(ctx context.Context, pos mysql.Positi return nil } -func (agent *ActionAgent) getLocalMetadataValues(tabletType topodatapb.TabletType) map[string]string { +func (agent *TabletManager) getLocalMetadataValues(tabletType topodatapb.TabletType) map[string]string { tablet := agent.Tablet() values := map[string]string{ "Alias": topoproto.TabletAliasString(tablet.Alias), diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index e40f8d40da8..1cda4775122 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -38,17 +38,17 @@ import ( // Major groups of methods are broken out into files named "rpc_*.go". // Ping makes sure RPCs work, and refreshes the tablet record. -func (agent *ActionAgent) Ping(ctx context.Context, args string) string { +func (agent *TabletManager) Ping(ctx context.Context, args string) string { return args } // GetPermissions returns the db permissions. -func (agent *ActionAgent) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) { +func (agent *TabletManager) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) { return mysqlctl.GetPermissions(agent.MysqlDaemon) } // SetReadOnly makes the mysql instance read-only or read-write. -func (agent *ActionAgent) SetReadOnly(ctx context.Context, rdonly bool) error { +func (agent *TabletManager) SetReadOnly(ctx context.Context, rdonly bool) error { if err := agent.lock(ctx); err != nil { return err } @@ -58,7 +58,7 @@ func (agent *ActionAgent) SetReadOnly(ctx context.Context, rdonly bool) error { } // ChangeType changes the tablet type -func (agent *ActionAgent) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error { +func (agent *TabletManager) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error { if err := agent.lock(ctx); err != nil { return err } @@ -67,7 +67,7 @@ func (agent *ActionAgent) ChangeType(ctx context.Context, tabletType topodatapb. } // ChangeType changes the tablet type -func (agent *ActionAgent) changeTypeLocked(ctx context.Context, tabletType topodatapb.TabletType) error { +func (agent *TabletManager) changeTypeLocked(ctx context.Context, tabletType topodatapb.TabletType) error { // We don't want to allow multiple callers to claim a tablet as drained. There is a race that could happen during // horizontal resharding where two vtworkers will try to DRAIN the same tablet. This check prevents that race from // causing errors. @@ -102,7 +102,7 @@ func (agent *ActionAgent) changeTypeLocked(ctx context.Context, tabletType topod } // Sleep sleeps for the duration -func (agent *ActionAgent) Sleep(ctx context.Context, duration time.Duration) { +func (agent *TabletManager) Sleep(ctx context.Context, duration time.Duration) { if err := agent.lock(ctx); err != nil { // client gave up return @@ -113,7 +113,7 @@ func (agent *ActionAgent) Sleep(ctx context.Context, duration time.Duration) { } // ExecuteHook executes the provided hook locally, and returns the result. -func (agent *ActionAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { +func (agent *TabletManager) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { if err := agent.lock(ctx); err != nil { // client gave up return &hook.HookResult{} @@ -126,7 +126,7 @@ func (agent *ActionAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook. } // RefreshState reload the tablet record from the topo server. -func (agent *ActionAgent) RefreshState(ctx context.Context) error { +func (agent *TabletManager) RefreshState(ctx context.Context) error { if err := agent.lock(ctx); err != nil { return err } @@ -136,12 +136,12 @@ func (agent *ActionAgent) RefreshState(ctx context.Context) error { } // RunHealthCheck will manually run the health check on the tablet. -func (agent *ActionAgent) RunHealthCheck(ctx context.Context) { +func (agent *TabletManager) RunHealthCheck(ctx context.Context) { agent.runHealthCheck() } // IgnoreHealthError sets the regexp for health check errors to ignore. -func (agent *ActionAgent) IgnoreHealthError(ctx context.Context, pattern string) error { +func (agent *TabletManager) IgnoreHealthError(ctx context.Context, pattern string) error { var expr *regexp.Regexp if pattern != "" { var err error diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 86428ea28d0..1e548036ac9 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -35,7 +35,7 @@ const ( ) // Backup takes a db backup and sends it to the BackupStorage -func (agent *ActionAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { +func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { if agent.Cnf == nil { return fmt.Errorf("cannot perform backup without my.cnf, please restart vttablet with a my.cnf file specified") } @@ -129,7 +129,7 @@ func (agent *ActionAgent) Backup(ctx context.Context, concurrency int, logger lo } // RestoreFromBackup deletes all local data and restores anew from the latest backup. -func (agent *ActionAgent) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error { +func (agent *TabletManager) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error { if err := agent.lock(ctx); err != nil { return err } @@ -155,7 +155,7 @@ func (agent *ActionAgent) RestoreFromBackup(ctx context.Context, logger logutil. return err } -func (agent *ActionAgent) beginBackup(backupMode string) error { +func (agent *TabletManager) beginBackup(backupMode string) error { agent.mutex.Lock() defer agent.mutex.Unlock() if agent._isBackupRunning { @@ -171,7 +171,7 @@ func (agent *ActionAgent) beginBackup(backupMode string) error { return nil } -func (agent *ActionAgent) endBackup(backupMode string) { +func (agent *TabletManager) endBackup(backupMode string) { // now we set _isBackupRunning back to false // have to take the mutex lock before writing to _ fields agent.mutex.Lock() diff --git a/go/vt/vttablet/tabletmanager/rpc_lock_tables.go b/go/vt/vttablet/tabletmanager/rpc_lock_tables.go index 171ff210bda..58186e0a39d 100644 --- a/go/vt/vttablet/tabletmanager/rpc_lock_tables.go +++ b/go/vt/vttablet/tabletmanager/rpc_lock_tables.go @@ -35,7 +35,7 @@ var ( ) // LockTables will lock all tables with read locks, effectively pausing replication while the lock is held (idempotent) -func (agent *ActionAgent) LockTables(ctx context.Context) error { +func (agent *TabletManager) LockTables(ctx context.Context) error { // get a connection agent.mutex.Lock() defer agent.mutex.Unlock() @@ -82,7 +82,7 @@ func (agent *ActionAgent) LockTables(ctx context.Context) error { return nil } -func (agent *ActionAgent) lockTablesUsingLockTables(conn *dbconnpool.DBConnection) error { +func (agent *TabletManager) lockTablesUsingLockTables(conn *dbconnpool.DBConnection) error { log.Warningf("failed to lock tables with FTWRL - falling back to LOCK TABLES") // Ensure schema engine is Open. If vttablet came up in a non_serving role, @@ -116,7 +116,7 @@ func (agent *ActionAgent) lockTablesUsingLockTables(conn *dbconnpool.DBConnectio } // UnlockTables will unlock all tables (idempotent) -func (agent *ActionAgent) UnlockTables(ctx context.Context) error { +func (agent *TabletManager) UnlockTables(ctx context.Context) error { agent.mutex.Lock() defer agent.mutex.Unlock() @@ -127,7 +127,7 @@ func (agent *ActionAgent) UnlockTables(ctx context.Context) error { return agent.unlockTablesHoldingMutex() } -func (agent *ActionAgent) unlockTablesHoldingMutex() error { +func (agent *TabletManager) unlockTablesHoldingMutex() error { // We are cleaning up manually, let's kill the timer agent._lockTablesTimer.Stop() _, err := agent._lockTablesConnection.ExecuteFetch("UNLOCK TABLES", 0, false) diff --git a/go/vt/vttablet/tabletmanager/rpc_query.go b/go/vt/vttablet/tabletmanager/rpc_query.go index c96094bd6b8..d0b116ff8ec 100644 --- a/go/vt/vttablet/tabletmanager/rpc_query.go +++ b/go/vt/vttablet/tabletmanager/rpc_query.go @@ -25,7 +25,7 @@ import ( ) // ExecuteFetchAsDba will execute the given query, possibly disabling binlogs and reload schema. -func (agent *ActionAgent) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) { +func (agent *TabletManager) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) { // get a connection conn, err := agent.MysqlDaemon.GetDbaConnection(ctx) if err != nil { @@ -70,7 +70,7 @@ func (agent *ActionAgent) ExecuteFetchAsDba(ctx context.Context, query []byte, d } // ExecuteFetchAsAllPrivs will execute the given query, possibly reloading schema. -func (agent *ActionAgent) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) { +func (agent *TabletManager) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) { // get a connection conn, err := agent.MysqlDaemon.GetAllPrivsConnection(ctx) if err != nil { @@ -97,7 +97,7 @@ func (agent *ActionAgent) ExecuteFetchAsAllPrivs(ctx context.Context, query []by } // ExecuteFetchAsApp will execute the given query. -func (agent *ActionAgent) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) { +func (agent *TabletManager) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) { // get a connection conn, err := agent.MysqlDaemon.GetAppConnection(ctx) if err != nil { diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index c0ae6d12611..4322066961e 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -40,7 +40,7 @@ var ( ) // SlaveStatus returns the replication status -func (agent *ActionAgent) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) { +func (agent *TabletManager) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) { status, err := agent.MysqlDaemon.SlaveStatus() if err != nil { return nil, err @@ -49,7 +49,7 @@ func (agent *ActionAgent) SlaveStatus(ctx context.Context) (*replicationdatapb.S } // MasterPosition returns the master position -func (agent *ActionAgent) MasterPosition(ctx context.Context) (string, error) { +func (agent *TabletManager) MasterPosition(ctx context.Context) (string, error) { pos, err := agent.MysqlDaemon.MasterPosition() if err != nil { return "", err @@ -58,7 +58,7 @@ func (agent *ActionAgent) MasterPosition(ctx context.Context) (string, error) { } // WaitForPosition returns the master position -func (agent *ActionAgent) WaitForPosition(ctx context.Context, pos string) error { +func (agent *TabletManager) WaitForPosition(ctx context.Context, pos string) error { mpos, err := mysql.DecodePosition(pos) if err != nil { return err @@ -68,7 +68,7 @@ func (agent *ActionAgent) WaitForPosition(ctx context.Context, pos string) error // StopSlave will stop the mysql. Works both when Vitess manages // replication or not (using hook if not). -func (agent *ActionAgent) StopSlave(ctx context.Context) error { +func (agent *TabletManager) StopSlave(ctx context.Context) error { if err := agent.lock(ctx); err != nil { return err } @@ -77,7 +77,7 @@ func (agent *ActionAgent) StopSlave(ctx context.Context) error { return agent.stopSlaveLocked(ctx) } -func (agent *ActionAgent) stopSlaveLocked(ctx context.Context) error { +func (agent *TabletManager) stopSlaveLocked(ctx context.Context) error { // Remember that we were told to stop, so we don't try to // restart ourselves (in replication_reporter). @@ -100,7 +100,7 @@ func (agent *ActionAgent) stopSlaveLocked(ctx context.Context) error { // StopSlaveMinimum will stop the slave after it reaches at least the // provided position. Works both when Vitess manages // replication or not (using hook if not). -func (agent *ActionAgent) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { +func (agent *TabletManager) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { if err := agent.lock(ctx); err != nil { return "", err } @@ -127,7 +127,7 @@ func (agent *ActionAgent) StopSlaveMinimum(ctx context.Context, position string, // StartSlave will start the mysql. Works both when Vitess manages // replication or not (using hook if not). -func (agent *ActionAgent) StartSlave(ctx context.Context) error { +func (agent *TabletManager) StartSlave(ctx context.Context) error { if err := agent.lock(ctx); err != nil { return err } @@ -154,7 +154,7 @@ func (agent *ActionAgent) StartSlave(ctx context.Context) error { // StartSlaveUntilAfter will start the replication and let it catch up // until and including the transactions in `position` -func (agent *ActionAgent) StartSlaveUntilAfter(ctx context.Context, position string, waitTime time.Duration) error { +func (agent *TabletManager) StartSlaveUntilAfter(ctx context.Context, position string, waitTime time.Duration) error { if err := agent.lock(ctx); err != nil { return err } @@ -172,13 +172,13 @@ func (agent *ActionAgent) StartSlaveUntilAfter(ctx context.Context, position str } // GetSlaves returns the address of all the slaves -func (agent *ActionAgent) GetSlaves(ctx context.Context) ([]string, error) { +func (agent *TabletManager) GetSlaves(ctx context.Context) ([]string, error) { return mysqlctl.FindSlaves(agent.MysqlDaemon) } // ResetReplication completely resets the replication on the host. // All binary and relay logs are flushed. All replication positions are reset. -func (agent *ActionAgent) ResetReplication(ctx context.Context) error { +func (agent *TabletManager) ResetReplication(ctx context.Context) error { if err := agent.lock(ctx); err != nil { return err } @@ -189,7 +189,7 @@ func (agent *ActionAgent) ResetReplication(ctx context.Context) error { } // InitMaster enables writes and returns the replication position. -func (agent *ActionAgent) InitMaster(ctx context.Context) (string, error) { +func (agent *TabletManager) InitMaster(ctx context.Context) (string, error) { if err := agent.lock(ctx); err != nil { return "", err } @@ -230,7 +230,7 @@ func (agent *ActionAgent) InitMaster(ctx context.Context) (string, error) { } // PopulateReparentJournal adds an entry into the reparent_journal table. -func (agent *ActionAgent) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error { +func (agent *TabletManager) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error { pos, err := mysql.DecodePosition(position) if err != nil { return err @@ -243,7 +243,7 @@ func (agent *ActionAgent) PopulateReparentJournal(ctx context.Context, timeCreat // InitSlave sets replication master and position, and waits for the // reparent_journal table entry up to context timeout -func (agent *ActionAgent) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error { +func (agent *TabletManager) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error { if err := agent.lock(ctx); err != nil { return err } @@ -306,7 +306,7 @@ func (agent *ActionAgent) InitSlave(ctx context.Context, parent *topodatapb.Tabl // or on a tablet that already transitioned to REPLICA. // // If a step fails in the middle, it will try to undo any changes it made. -func (agent *ActionAgent) DemoteMaster(ctx context.Context) (string, error) { +func (agent *TabletManager) DemoteMaster(ctx context.Context) (string, error) { // The public version always reverts on partial failure. return agent.demoteMaster(ctx, true /* revertPartialFailure */) } @@ -315,7 +315,7 @@ func (agent *ActionAgent) DemoteMaster(ctx context.Context) (string, error) { // // If revertPartialFailure is true, and a step fails in the middle, it will try // to undo any changes it made. -func (agent *ActionAgent) demoteMaster(ctx context.Context, revertPartialFailure bool) (replicationPosition string, finalErr error) { +func (agent *TabletManager) demoteMaster(ctx context.Context, revertPartialFailure bool) (replicationPosition string, finalErr error) { if err := agent.lock(ctx); err != nil { return "", err } @@ -411,7 +411,7 @@ func (agent *ActionAgent) demoteMaster(ctx context.Context, revertPartialFailure // UndoDemoteMaster reverts a previous call to DemoteMaster // it sets read-only to false, fixes semi-sync // and returns its master position. -func (agent *ActionAgent) UndoDemoteMaster(ctx context.Context) error { +func (agent *TabletManager) UndoDemoteMaster(ctx context.Context) error { if err := agent.lock(ctx); err != nil { return err } @@ -441,7 +441,7 @@ func (agent *ActionAgent) UndoDemoteMaster(ctx context.Context) error { // replication up to the provided point, and then makes the slave the // shard master. // Deprecated -func (agent *ActionAgent) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { +func (agent *TabletManager) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { if err := agent.lock(ctx); err != nil { return "", err } @@ -478,13 +478,13 @@ func (agent *ActionAgent) PromoteSlaveWhenCaughtUp(ctx context.Context, position } // SlaveWasPromoted promotes a slave to master, no questions asked. -func (agent *ActionAgent) SlaveWasPromoted(ctx context.Context) error { +func (agent *TabletManager) SlaveWasPromoted(ctx context.Context) error { return agent.ChangeType(ctx, topodatapb.TabletType_MASTER) } // SetMaster sets replication master, and waits for the // reparent_journal table entry up to context timeout -func (agent *ActionAgent) SetMaster(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error { +func (agent *TabletManager) SetMaster(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error { if err := agent.lock(ctx); err != nil { return err } @@ -493,7 +493,7 @@ func (agent *ActionAgent) SetMaster(ctx context.Context, parentAlias *topodatapb return agent.setMasterLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartSlave) } -func (agent *ActionAgent) setMasterRepairReplication(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { +func (agent *TabletManager) setMasterRepairReplication(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { parent, err := agent.TopoServer.GetTablet(ctx, parentAlias) if err != nil { return err @@ -509,7 +509,7 @@ func (agent *ActionAgent) setMasterRepairReplication(ctx context.Context, parent return agent.setMasterLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartSlave) } -func (agent *ActionAgent) setMasterLocked(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { +func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { // End orchestrator maintenance at the end of fixing replication. // This is a best effort operation, so it should happen in a goroutine defer func() { @@ -621,7 +621,7 @@ func (agent *ActionAgent) setMasterLocked(ctx context.Context, parentAlias *topo } // SlaveWasRestarted updates the parent record for a tablet. -func (agent *ActionAgent) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error { +func (agent *TabletManager) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error { if err := agent.lock(ctx); err != nil { return err } @@ -642,7 +642,7 @@ func (agent *ActionAgent) SlaveWasRestarted(ctx context.Context, parent *topodat // StopReplicationAndGetStatus stops MySQL replication, and returns the // current status. -func (agent *ActionAgent) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { +func (agent *TabletManager) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { if err := agent.lock(ctx); err != nil { return nil, err } @@ -669,7 +669,7 @@ func (agent *ActionAgent) StopReplicationAndGetStatus(ctx context.Context) (*rep } // PromoteReplica makes the current tablet the master -func (agent *ActionAgent) PromoteReplica(ctx context.Context) (string, error) { +func (agent *TabletManager) PromoteReplica(ctx context.Context) (string, error) { if err := agent.lock(ctx); err != nil { return "", err } @@ -700,7 +700,7 @@ func (agent *ActionAgent) PromoteReplica(ctx context.Context) (string, error) { // PromoteSlave makes the current tablet the master // Deprecated -func (agent *ActionAgent) PromoteSlave(ctx context.Context) (string, error) { +func (agent *TabletManager) PromoteSlave(ctx context.Context) (string, error) { if err := agent.lock(ctx); err != nil { return "", err } @@ -737,7 +737,7 @@ func isMasterEligible(tabletType topodatapb.TabletType) bool { return false } -func (agent *ActionAgent) fixSemiSync(tabletType topodatapb.TabletType) error { +func (agent *TabletManager) fixSemiSync(tabletType topodatapb.TabletType) error { if !*enableSemiSync { // Semi-sync handling is not enabled. return nil @@ -754,7 +754,7 @@ func (agent *ActionAgent) fixSemiSync(tabletType topodatapb.TabletType) error { return agent.MysqlDaemon.SetSemiSyncEnabled(tabletType == topodatapb.TabletType_MASTER, true) } -func (agent *ActionAgent) fixSemiSyncAndReplication(tabletType topodatapb.TabletType) error { +func (agent *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.TabletType) error { if !*enableSemiSync { // Semi-sync handling is not enabled. return nil @@ -804,7 +804,7 @@ func (agent *ActionAgent) fixSemiSyncAndReplication(tabletType topodatapb.Tablet return nil } -func (agent *ActionAgent) handleRelayLogError(err error) error { +func (agent *TabletManager) handleRelayLogError(err error) error { // attempt to fix this error: // Slave failed to initialize relay log info structure from the repository (errno 1872) (sqlstate HY000) during query: START SLAVE // see https://bugs.mysql.com/bug.php?id=83713 or https://github.com/vitessio/vitess/issues/5067 diff --git a/go/vt/vttablet/tabletmanager/rpc_schema.go b/go/vt/vttablet/tabletmanager/rpc_schema.go index 04489418f35..c1682f99d50 100644 --- a/go/vt/vttablet/tabletmanager/rpc_schema.go +++ b/go/vt/vttablet/tabletmanager/rpc_schema.go @@ -30,14 +30,14 @@ import ( ) // GetSchema returns the schema. -func (agent *ActionAgent) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) { +func (agent *TabletManager) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) { return agent.MysqlDaemon.GetSchema(ctx, topoproto.TabletDbName(agent.Tablet()), tables, excludeTables, includeViews) } // ReloadSchema will reload the schema // This doesn't need the action mutex because periodic schema reloads happen // in the background anyway. -func (agent *ActionAgent) ReloadSchema(ctx context.Context, waitPosition string) error { +func (agent *TabletManager) ReloadSchema(ctx context.Context, waitPosition string) error { if agent.DBConfigs.IsZero() { // we skip this for test instances that can't connect to the DB anyway return nil @@ -59,7 +59,7 @@ func (agent *ActionAgent) ReloadSchema(ctx context.Context, waitPosition string) } // PreflightSchema will try out the schema changes in "changes". -func (agent *ActionAgent) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { +func (agent *TabletManager) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { if err := agent.lock(ctx); err != nil { return nil, err } @@ -73,7 +73,7 @@ func (agent *ActionAgent) PreflightSchema(ctx context.Context, changes []string) } // ApplySchema will apply a schema change -func (agent *ActionAgent) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { +func (agent *TabletManager) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { if err := agent.lock(ctx); err != nil { return nil, err } diff --git a/go/vt/vttablet/tabletmanager/rpc_server.go b/go/vt/vttablet/tabletmanager/rpc_server.go index 8a074a602f3..bdaa2397218 100644 --- a/go/vt/vttablet/tabletmanager/rpc_server.go +++ b/go/vt/vttablet/tabletmanager/rpc_server.go @@ -36,7 +36,7 @@ import ( // lock is used at the beginning of an RPC call, to lock the // action mutex. It returns ctx.Err() if <-ctx.Done() after the lock. -func (agent *ActionAgent) lock(ctx context.Context) error { +func (agent *TabletManager) lock(ctx context.Context) error { agent.actionMutex.Lock() agent.actionMutexLocked = true @@ -53,20 +53,20 @@ func (agent *ActionAgent) lock(ctx context.Context) error { } // unlock is the symmetrical action to lock. -func (agent *ActionAgent) unlock() { +func (agent *TabletManager) unlock() { agent.actionMutexLocked = false agent.actionMutex.Unlock() } // checkLock checks we have locked the actionMutex. -func (agent *ActionAgent) checkLock() { +func (agent *TabletManager) checkLock() { if !agent.actionMutexLocked { panic("programming error: this action should have taken the actionMutex") } } // HandleRPCPanic is part of the RPCAgent interface. -func (agent *ActionAgent) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { +func (agent *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { // panic handling if x := recover(); x != nil { log.Errorf("TabletManager.%v(%v) on %v panic: %v\n%s", name, args, topoproto.TabletAliasString(agent.TabletAlias), x, tb.Stack(4)) @@ -98,13 +98,13 @@ func (agent *ActionAgent) HandleRPCPanic(ctx context.Context, name string, args, // // RegisterQueryService is used to delay registration of RPC servers until we have all the objects. -type RegisterQueryService func(*ActionAgent) +type RegisterQueryService func(*TabletManager) // RegisterQueryServices is a list of functions to call when the delayed registration is triggered. var RegisterQueryServices []RegisterQueryService // registerQueryService will register all the instances. -func (agent *ActionAgent) registerQueryService() { +func (agent *TabletManager) registerQueryService() { for _, f := range RegisterQueryServices { f(agent) } diff --git a/go/vt/vttablet/tabletmanager/shard_sync.go b/go/vt/vttablet/tabletmanager/shard_sync.go index 542c88466b4..15543be210d 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync.go +++ b/go/vt/vttablet/tabletmanager/shard_sync.go @@ -48,7 +48,7 @@ var ( // This goroutine gets woken up for shard record changes by maintaining a // topo watch on the shard record. It gets woken up for tablet state changes by // a notification signal from setTablet(). -func (agent *ActionAgent) shardSyncLoop(ctx context.Context) { +func (agent *TabletManager) shardSyncLoop(ctx context.Context) { // Make a copy of the channels so we don't race when stopShardSync() clears them. agent.mutex.Lock() notifyChan := agent._shardSyncChan @@ -193,7 +193,7 @@ func syncShardMaster(ctx context.Context, ts *topo.Server, tablet *topodatapb.Ta // // If active reparents are disabled, we don't touch our MySQL. // We just directly update our tablet type to REPLICA. -func (agent *ActionAgent) abortMasterTerm(ctx context.Context, masterAlias *topodatapb.TabletAlias) error { +func (agent *TabletManager) abortMasterTerm(ctx context.Context, masterAlias *topodatapb.TabletAlias) error { masterAliasStr := topoproto.TabletAliasString(masterAlias) log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, agent.BaseTabletType) @@ -228,7 +228,7 @@ func (agent *ActionAgent) abortMasterTerm(ctx context.Context, masterAlias *topo return nil } -func (agent *ActionAgent) startShardSync() { +func (agent *TabletManager) startShardSync() { // Use a buffer size of 1 so we can remember we need to check the state // even if the receiver is busy. We can drop any additional send attempts // if the buffer is full because all we care about is that the receiver will @@ -247,7 +247,7 @@ func (agent *ActionAgent) startShardSync() { go agent.shardSyncLoop(ctx) } -func (agent *ActionAgent) stopShardSync() { +func (agent *TabletManager) stopShardSync() { var doneChan <-chan struct{} agent.mutex.Lock() @@ -267,7 +267,7 @@ func (agent *ActionAgent) stopShardSync() { } } -func (agent *ActionAgent) notifyShardSync() { +func (agent *TabletManager) notifyShardSync() { // If this is called before the shard sync is started, do nothing. agent.mutex.Lock() defer agent.mutex.Unlock() @@ -284,7 +284,7 @@ func (agent *ActionAgent) notifyShardSync() { } } -func (agent *ActionAgent) masterTermStartTime() time.Time { +func (agent *TabletManager) masterTermStartTime() time.Time { agent.pubMu.Lock() defer agent.pubMu.Unlock() if agent.tablet == nil { diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 057786763c4..96469218361 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -60,7 +60,7 @@ var ( const blacklistQueryRules string = "BlacklistQueryRules" // loadBlacklistRules loads and builds the blacklist query rules -func (agent *ActionAgent) loadBlacklistRules(ctx context.Context, tablet *topodatapb.Tablet, blacklistedTables []string) (err error) { +func (agent *TabletManager) loadBlacklistRules(ctx context.Context, tablet *topodatapb.Tablet, blacklistedTables []string) (err error) { blacklistRules := rules.New() if len(blacklistedTables) > 0 { // tables, first resolve wildcards @@ -91,7 +91,7 @@ func (agent *ActionAgent) loadBlacklistRules(ctx context.Context, tablet *topoda // lameduck changes the QueryServiceControl state to lameduck, // brodcasts the new health, then sleep for grace period, to give time // to clients to get the new status. -func (agent *ActionAgent) lameduck(reason string) { +func (agent *TabletManager) lameduck(reason string) { log.Infof("Agent is entering lameduck, reason: %v", reason) agent.QueryServiceControl.EnterLameduck() agent.broadcastHealth() @@ -99,7 +99,7 @@ func (agent *ActionAgent) lameduck(reason string) { log.Infof("Agent is leaving lameduck") } -func (agent *ActionAgent) broadcastHealth() { +func (agent *TabletManager) broadcastHealth() { // get the replication delays agent.mutex.Lock() replicationDelay := agent._replicationDelay @@ -132,11 +132,11 @@ func (agent *ActionAgent) broadcastHealth() { // refreshTablet needs to be run after an action may have changed the current // state of the tablet. -func (agent *ActionAgent) refreshTablet(ctx context.Context, reason string) error { +func (agent *TabletManager) refreshTablet(ctx context.Context, reason string) error { agent.checkLock() log.Infof("Executing post-action state refresh: %v", reason) - span, ctx := trace.NewSpan(ctx, "ActionAgent.refreshTablet") + span, ctx := trace.NewSpan(ctx, "TabletManager.refreshTablet") span.Annotate("reason", reason) defer span.Finish() @@ -149,7 +149,7 @@ func (agent *ActionAgent) refreshTablet(ctx context.Context, reason string) erro // updateState will use the provided tablet record as the new tablet state, // the current tablet as a base, run changeCallback, and dispatch the event. -func (agent *ActionAgent) updateState(ctx context.Context, newTablet *topodatapb.Tablet, reason string) { +func (agent *TabletManager) updateState(ctx context.Context, newTablet *topodatapb.Tablet, reason string) { oldTablet := agent.Tablet() if oldTablet == nil { oldTablet = &topodatapb.Tablet{} @@ -167,10 +167,10 @@ func (agent *ActionAgent) updateState(ctx context.Context, newTablet *topodatapb // changeCallback is run after every action that might // have changed something in the tablet record or in the topology. -func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTablet *topodatapb.Tablet) { +func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTablet *topodatapb.Tablet) { agent.checkLock() - span, ctx := trace.NewSpan(ctx, "ActionAgent.changeCallback") + span, ctx := trace.NewSpan(ctx, "TabletManager.changeCallback") defer span.Finish() allowQuery := topo.IsRunningQueryService(newTablet.Type) @@ -346,7 +346,7 @@ func (agent *ActionAgent) changeCallback(ctx context.Context, oldTablet, newTabl } } -func (agent *ActionAgent) publishState(ctx context.Context) { +func (agent *TabletManager) publishState(ctx context.Context) { agent.pubMu.Lock() defer agent.pubMu.Unlock() log.Infof("Publishing state: %v", agent.tablet) @@ -373,7 +373,7 @@ func (agent *ActionAgent) publishState(ctx context.Context) { } } -func (agent *ActionAgent) retryPublish() { +func (agent *TabletManager) retryPublish() { agent.pubMu.Lock() defer func() { agent.isPublishing = false @@ -405,7 +405,7 @@ func (agent *ActionAgent) retryPublish() { } } -func (agent *ActionAgent) rebuildKeyspace(keyspace string, retryInterval time.Duration) { +func (agent *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Duration) { var srvKeyspace *topodatapb.SrvKeyspace defer func() { log.Infof("Keyspace rebuilt: %v", keyspace) @@ -440,7 +440,7 @@ func (agent *ActionAgent) rebuildKeyspace(keyspace string, retryInterval time.Du } } -func (agent *ActionAgent) findMysqlPort(retryInterval time.Duration) { +func (agent *TabletManager) findMysqlPort(retryInterval time.Duration) { for { time.Sleep(retryInterval) mport, err := agent.MysqlDaemon.GetMysqlPort() diff --git a/go/vt/vttablet/tabletmanager/action_agent.go b/go/vt/vttablet/tabletmanager/tm_init.go similarity index 93% rename from go/vt/vttablet/tabletmanager/action_agent.go rename to go/vt/vttablet/tabletmanager/tm_init.go index 5117131b88d..d60f0e98d8e 100644 --- a/go/vt/vttablet/tabletmanager/action_agent.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -15,7 +15,7 @@ limitations under the License. */ /* -Package tabletmanager exports the ActionAgent object. It keeps the local tablet +Package tabletmanager exports the TabletManager object. It keeps the local tablet state, starts / stops all associated services (query service, update stream, binlog players, ...), and handles tabletmanager RPCs to update the state. @@ -117,8 +117,8 @@ func init() { statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) } -// ActionAgent is the main class for the agent. -type ActionAgent struct { +// TabletManager is the main class for the agent. +type TabletManager struct { // The following fields are set during creation QueryServiceControl tabletserver.Controller UpdateStream binlog.UpdateStreamControl @@ -154,7 +154,7 @@ type ActionAgent struct { // orc is an optional client for Orchestrator HTTP API calls. // If this is nil, those calls will be skipped. - // It's only set once in NewActionAgent() and never modified after that. + // It's only set once in NewTabletManager() and never modified after that. orc *orcClient // mutex protects all the following fields (that start with '_'), @@ -220,12 +220,12 @@ type ActionAgent struct { isPublishing bool } -// NewActionAgent creates a new ActionAgent and registers all the +// NewTabletManager creates a new TabletManager and registers all the // associated services. // // batchCtx is the context that the agent will use for any background tasks // it spawns. -func NewActionAgent( +func NewTabletManager( batchCtx context.Context, ts *topo.Server, mysqld mysqlctl.MysqlDaemon, @@ -234,7 +234,7 @@ func NewActionAgent( config *tabletenv.TabletConfig, mycnf *mysqlctl.Mycnf, port, gRPCPort int32, -) (agent *ActionAgent, err error) { +) (agent *TabletManager, err error) { tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) if err != nil { @@ -242,7 +242,7 @@ func NewActionAgent( } config.DB.DBName = topoproto.TabletDbName(tablet) - agent = &ActionAgent{ + agent = &TabletManager{ QueryServiceControl: queryServiceControl, HealthReporter: health.DefaultAggregator, batchCtx: batchCtx, @@ -321,16 +321,16 @@ func NewActionAgent( return agent, nil } -// NewTestActionAgent creates an agent for test purposes. Only a +// NewTestTabletManager creates an agent for test purposes. Only a // subset of features are supported now, but we'll add more over time. -func NewTestActionAgent( +func NewTestTabletManager( batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, mysqlDaemon mysqlctl.MysqlDaemon, - preStart func(*ActionAgent), -) *ActionAgent { + preStart func(*TabletManager), +) *TabletManager { ti, err := ts.GetTablet(batchCtx, tabletAlias) if err != nil { @@ -341,7 +341,7 @@ func NewTestActionAgent( "grpc": grpcPort, } - agent := &ActionAgent{ + agent := &TabletManager{ QueryServiceControl: tabletservermock.NewController(), UpdateStream: binlog.NewUpdateStreamControlMock(), HealthReporter: health.DefaultAggregator, @@ -397,10 +397,10 @@ func NewTestActionAgent( return agent } -// NewComboActionAgent creates an agent tailored specifically to run +// NewComboTabletManager creates an agent tailored specifically to run // within the vtcombo binary. It cannot be called concurrently, // as it changes the flags. -func NewComboActionAgent( +func NewComboTabletManager( batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, @@ -409,7 +409,7 @@ func NewComboActionAgent( dbcfgs *dbconfigs.DBConfigs, mysqlDaemon mysqlctl.MysqlDaemon, keyspace, shard, dbname, tabletTypeStr string, -) *ActionAgent { +) *TabletManager { *initDbNameOverride = dbname *initKeyspace = keyspace @@ -420,7 +420,7 @@ func NewComboActionAgent( panic(err) } dbcfgs.DBName = topoproto.TabletDbName(tablet) - agent := &ActionAgent{ + agent := &TabletManager{ QueryServiceControl: queryServiceControl, UpdateStream: binlog.NewUpdateStreamControlMock(), HealthReporter: health.DefaultAggregator, @@ -467,7 +467,7 @@ func NewComboActionAgent( return agent } -func (agent *ActionAgent) setTablet(tablet *topodatapb.Tablet) { +func (agent *TabletManager) setTablet(tablet *topodatapb.Tablet) { agent.pubMu.Lock() agent.tablet = proto.Clone(tablet).(*topodatapb.Tablet) agent.pubMu.Unlock() @@ -476,7 +476,7 @@ func (agent *ActionAgent) setTablet(tablet *topodatapb.Tablet) { agent.notifyShardSync() } -func (agent *ActionAgent) updateTablet(update func(tablet *topodatapb.Tablet)) { +func (agent *TabletManager) updateTablet(update func(tablet *topodatapb.Tablet)) { agent.pubMu.Lock() update(agent.tablet) agent.pubMu.Unlock() @@ -486,7 +486,7 @@ func (agent *ActionAgent) updateTablet(update func(tablet *topodatapb.Tablet)) { } // Tablet reads the stored Tablet from the agent. -func (agent *ActionAgent) Tablet() *topodatapb.Tablet { +func (agent *TabletManager) Tablet() *topodatapb.Tablet { agent.pubMu.Lock() tablet := proto.Clone(agent.tablet).(*topodatapb.Tablet) agent.pubMu.Unlock() @@ -496,7 +496,7 @@ func (agent *ActionAgent) Tablet() *topodatapb.Tablet { // Healthy reads the result of the latest healthcheck, protected by mutex. // If that status is too old, it means healthcheck hasn't run for a while, // and is probably stuck, this is not good, we're not healthy. -func (agent *ActionAgent) Healthy() (time.Duration, error) { +func (agent *TabletManager) Healthy() (time.Duration, error) { agent.mutex.Lock() defer agent.mutex.Unlock() @@ -512,7 +512,7 @@ func (agent *ActionAgent) Healthy() (time.Duration, error) { } // BlacklistedTables returns the list of currently blacklisted tables. -func (agent *ActionAgent) BlacklistedTables() []string { +func (agent *TabletManager) BlacklistedTables() []string { agent.mutex.Lock() defer agent.mutex.Unlock() return agent._blacklistedTables @@ -520,13 +520,13 @@ func (agent *ActionAgent) BlacklistedTables() []string { // DisallowQueryService returns the reason the query service should be // disabled, if any. -func (agent *ActionAgent) DisallowQueryService() string { +func (agent *TabletManager) DisallowQueryService() string { agent.mutex.Lock() defer agent.mutex.Unlock() return agent._disallowQueryService } -func (agent *ActionAgent) slaveStopped() bool { +func (agent *TabletManager) slaveStopped() bool { agent.mutex.Lock() defer agent.mutex.Unlock() @@ -548,7 +548,7 @@ func (agent *ActionAgent) slaveStopped() bool { return slaveStopped } -func (agent *ActionAgent) setSlaveStopped(slaveStopped bool) { +func (agent *TabletManager) setSlaveStopped(slaveStopped bool) { agent.mutex.Lock() defer agent.mutex.Unlock() @@ -576,13 +576,13 @@ func (agent *ActionAgent) setSlaveStopped(slaveStopped bool) { } } -func (agent *ActionAgent) setServicesDesiredState(disallowQueryService string) { +func (agent *TabletManager) setServicesDesiredState(disallowQueryService string) { agent.mutex.Lock() agent._disallowQueryService = disallowQueryService agent.mutex.Unlock() } -func (agent *ActionAgent) setBlacklistedTables(value []string) { +func (agent *TabletManager) setBlacklistedTables(value []string) { agent.mutex.Lock() agent._blacklistedTables = value agent.mutex.Unlock() @@ -591,7 +591,7 @@ func (agent *ActionAgent) setBlacklistedTables(value []string) { // Close prepares a tablet for shutdown. First we check our tablet ownership and // then prune the tablet topology entry of all post-init fields. This prevents // stale identifiers from hanging around in topology. -func (agent *ActionAgent) Close() { +func (agent *TabletManager) Close() { // Stop the shard sync loop and wait for it to exit. We do this in Close() // rather than registering it as an OnTerm hook so the shard sync loop keeps // running during lame duck. @@ -620,7 +620,7 @@ func (agent *ActionAgent) Close() { // servenv OnTerm and OnClose hooks to coordinate shutdown automatically, // while taking lameduck into account. However, this may be useful for tests, // when you want to clean up an agent immediately. -func (agent *ActionAgent) Stop() { +func (agent *TabletManager) Stop() { // Stop the shard sync loop and wait for it to exit. This needs to be done // here in addition to in Close() because tests do not call Close(). agent.stopShardSync() @@ -637,7 +637,7 @@ func (agent *ActionAgent) Stop() { } // hookExtraEnv returns the map to pass to local hooks -func (agent *ActionAgent) hookExtraEnv() map[string]string { +func (agent *TabletManager) hookExtraEnv() map[string]string { return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(agent.TabletAlias)} } @@ -646,7 +646,7 @@ func (agent *ActionAgent) hookExtraEnv() map[string]string { // no error. We use this at startup with a context timeout set to the // value of the init_timeout flag, so we can try to modify the // topology over a longer period instead of dying right away. -func (agent *ActionAgent) withRetry(ctx context.Context, description string, work func() error) error { +func (agent *TabletManager) withRetry(ctx context.Context, description string, work func() error) error { backoff := 1 * time.Second for { err := work() @@ -720,7 +720,7 @@ func buildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( }, nil } -func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) error { +func (agent *TabletManager) createKeyspaceShard(ctx context.Context) error { // mutex is needed because we set _shardInfo and _srvKeyspace agent.mutex.Lock() defer agent.mutex.Unlock() @@ -769,7 +769,7 @@ func (agent *ActionAgent) createKeyspaceShard(ctx context.Context) error { return nil } -func (agent *ActionAgent) checkMastership(ctx context.Context) error { +func (agent *TabletManager) checkMastership(ctx context.Context) error { agent.mutex.Lock() si := agent._shardInfo agent.mutex.Unlock() @@ -828,7 +828,7 @@ func (agent *ActionAgent) checkMastership(ctx context.Context) error { return nil } -func (agent *ActionAgent) checkMysql(ctx context.Context) error { +func (agent *TabletManager) checkMysql(ctx context.Context) error { if appConfig, _ := agent.DBConfigs.AppWithDB().MysqlParams(); appConfig.Host != "" { agent.updateTablet(func(tablet *topodatapb.Tablet) { tablet.MysqlHostname = appConfig.Host @@ -852,7 +852,7 @@ func (agent *ActionAgent) checkMysql(ctx context.Context) error { return nil } -func (agent *ActionAgent) initTablet(ctx context.Context) error { +func (agent *TabletManager) initTablet(ctx context.Context) error { tablet := agent.Tablet() err := agent.TopoServer.CreateTablet(ctx, tablet) switch { @@ -890,7 +890,7 @@ func (agent *ActionAgent) initTablet(ctx context.Context) error { return nil } -func (agent *ActionAgent) handleRestore(ctx context.Context) error { +func (agent *TabletManager) handleRestore(ctx context.Context) error { tablet := agent.Tablet() // Sanity check for inconsistent flags if agent.Cnf == nil && *restoreFromBackup { @@ -935,7 +935,7 @@ func (agent *ActionAgent) handleRestore(ctx context.Context) error { return nil } -func (agent *ActionAgent) exportStats() { +func (agent *TabletManager) exportStats() { tablet := agent.Tablet() statsKeyspace := stats.NewString("TabletKeyspace") statsShard := stats.NewString("TabletShard") diff --git a/go/vt/vttablet/tabletmanager/action_agent_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go similarity index 99% rename from go/vt/vttablet/tabletmanager/action_agent_test.go rename to go/vt/vttablet/tabletmanager/tm_init_test.go index 4581321faa7..4fd234fca4d 100644 --- a/go/vt/vttablet/tabletmanager/action_agent_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -44,7 +44,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { } // start with a tablet record that doesn't exist - agent := &ActionAgent{ + agent := &TabletManager{ TopoServer: ts, TabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), @@ -110,7 +110,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. } // start with a tablet record that doesn't exist - agent := &ActionAgent{ + agent := &TabletManager{ TopoServer: ts, TabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), @@ -184,7 +184,7 @@ func TestInitTablet(t *testing.T) { port := int32(1234) gRPCPort := int32(3456) mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) - agent := &ActionAgent{ + agent := &TabletManager{ TopoServer: ts, TabletAlias: tabletAlias, MysqlDaemon: mysqlDaemon, diff --git a/go/vt/vttablet/tabletmanager/vreplication.go b/go/vt/vttablet/tabletmanager/vreplication.go index d8dd142abdf..071c6a659ed 100644 --- a/go/vt/vttablet/tabletmanager/vreplication.go +++ b/go/vt/vttablet/tabletmanager/vreplication.go @@ -25,7 +25,7 @@ import ( ) // VReplicationExec executes a vreplication command. -func (agent *ActionAgent) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { +func (agent *TabletManager) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { qr, err := agent.VREngine.Exec(query) if err != nil { return nil, err @@ -34,6 +34,6 @@ func (agent *ActionAgent) VReplicationExec(ctx context.Context, query string) (* } // VReplicationWaitForPos waits for the specified position. -func (agent *ActionAgent) VReplicationWaitForPos(ctx context.Context, id int, pos string) error { +func (agent *TabletManager) VReplicationWaitForPos(ctx context.Context, id int, pos string) error { return agent.VREngine.WaitForPos(ctx, id, pos) } diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index b4c118a33b2..922d6707e4d 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -68,7 +68,7 @@ type fakeTablet struct { // The following fields are created when we start the event loop for // the tablet, and closed / cleared when we stop it. // The Listener is used by the gRPC server. - Agent *tabletmanager.ActionAgent + Agent *tabletmanager.TabletManager Listener net.Listener // These optional fields are used if the tablet also needs to @@ -171,7 +171,7 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { // Create a test agent on that port, and re-read the record // (it has new ports and IP). - ft.Agent = tabletmanager.NewTestActionAgent(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.Agent = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) ft.Tablet = ft.Agent.Tablet() // Register the gRPC server, and starts listening. diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index 81e09004033..d2806f5d6e0 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -69,7 +69,7 @@ type FakeTablet struct { // The following fields are created when we start the event loop for // the tablet, and closed / cleared when we stop it. // The Listener is used by the gRPC server. - Agent *tabletmanager.ActionAgent + Agent *tabletmanager.TabletManager Listener net.Listener // These optional fields are used if the tablet also needs to @@ -196,7 +196,7 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { // Create a test agent on that port, and re-read the record // (it has new ports and IP). - ft.Agent = tabletmanager.NewTestActionAgent(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.Agent = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) ft.Tablet = ft.Agent.Tablet() // Register the gRPC server, and starts listening. From 3331e9fce93876f49d430168f6f4168b7bfcdd89 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 12 Jun 2020 19:28:21 -0700 Subject: [PATCH 019/430] tm revamp: Agent -> TM Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/grpctmserver/server.go | 2 +- go/vt/vttablet/grpctmserver/server_test.go | 8 +- .../tabletmanager/healthcheck_test.go | 20 +-- go/vt/vttablet/tabletmanager/rpc_actions.go | 2 +- go/vt/vttablet/tabletmanager/rpc_agent.go | 4 +- go/vt/vttablet/tabletmanager/rpc_server.go | 2 +- go/vt/vttablet/tabletmanager/state_change.go | 4 +- .../tabletmanager/state_change_test.go | 4 +- .../test_tm_rpc.go} | 122 +++++++++--------- go/vt/worker/legacy_split_clone_test.go | 2 +- go/vt/worker/split_clone_flaky_test.go | 4 +- go/vt/wrangler/fake_tablet_test.go | 22 ++-- go/vt/wrangler/testlib/backup_test.go | 12 +- .../testlib/external_reparent_test.go | 8 +- go/vt/wrangler/testlib/fake_tablet.go | 22 ++-- .../testlib/migrate_served_from_test.go | 6 +- .../testlib/migrate_served_types_test.go | 36 +++--- .../testlib/planned_reparent_shard_test.go | 24 ++-- go/vt/wrangler/traffic_switcher_env_test.go | 12 +- 19 files changed, 158 insertions(+), 158 deletions(-) rename go/vt/vttablet/{agentrpctest/test_agent_rpc.go => tmrpctest/test_tm_rpc.go} (89%) diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index 8e503ac2bba..0a022b03a29 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -38,7 +38,7 @@ import ( // server is the gRPC implementation of the RPC server type server struct { // implementation of the agent to call - agent tabletmanager.RPCAgent + agent tabletmanager.RPCTM } func (s *server) Ping(ctx context.Context, request *tabletmanagerdatapb.PingRequest) (response *tabletmanagerdatapb.PingResponse, err error) { diff --git a/go/vt/vttablet/grpctmserver/server_test.go b/go/vt/vttablet/grpctmserver/server_test.go index 82fb9cbd3a6..bdb16210ed0 100644 --- a/go/vt/vttablet/grpctmserver/server_test.go +++ b/go/vt/vttablet/grpctmserver/server_test.go @@ -21,8 +21,8 @@ import ( "testing" "google.golang.org/grpc" - "vitess.io/vitess/go/vt/vttablet/agentrpctest" "vitess.io/vitess/go/vt/vttablet/grpctmclient" + "vitess.io/vitess/go/vt/vttablet/tmrpctest" tabletmanagerservicepb "vitess.io/vitess/go/vt/proto/tabletmanagerservice" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -41,8 +41,8 @@ func TestGRPCTMServer(t *testing.T) { // Create a gRPC server and listen on the port. s := grpc.NewServer() - fakeAgent := agentrpctest.NewFakeRPCAgent(t) - tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{agent: fakeAgent}) + fakeTM := tmrpctest.NewFakeRPCTM(t) + tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{agent: fakeTM}) go s.Serve(listener) // Create a gRPC client to talk to the fake tablet. @@ -59,5 +59,5 @@ func TestGRPCTMServer(t *testing.T) { } // and run the test suite - agentrpctest.Run(t, client, tablet, fakeAgent) + tmrpctest.Run(t, client, tablet, fakeTM) } diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index 1428d372912..30d2cb0ff3e 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -131,7 +131,7 @@ func (fhc *fakeHealthCheck) HTMLName() template.HTML { return template.HTML("fakeHealthCheck") } -func createTestAgent(ctx context.Context, t *testing.T, preStart func(*TabletManager)) *TabletManager { +func createTestTM(ctx context.Context, t *testing.T, preStart func(*TabletManager)) *TabletManager { ts := memorytopo.NewServer("cell1") if err := ts.CreateKeyspace(ctx, "test_keyspace", &topodatapb.Keyspace{}); err != nil { @@ -175,7 +175,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { }() ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we @@ -273,7 +273,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { func TestErrSlaveNotRunningIsHealthy(t *testing.T) { *unhealthyThreshold = 10 * time.Minute ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we @@ -326,7 +326,7 @@ func TestErrSlaveNotRunningIsHealthy(t *testing.T) { // query service, it should not go healthy. func TestQueryServiceNotStarting(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, func(a *TabletManager) { + agent := createTestTM(ctx, t, func(a *TabletManager) { // The SetServingType that will fail is part of Start() // so we have to do this here. a.QueryServiceControl.(*tabletservermock.Controller).SetServingTypeError = fmt.Errorf("test cannot start query service") @@ -379,7 +379,7 @@ func TestQueryServiceNotStarting(t *testing.T) { // service is shut down, the tablet goes unhealthy func TestQueryServiceStopped(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we @@ -474,7 +474,7 @@ func TestQueryServiceStopped(t *testing.T) { // query service in a tablet. func TestTabletControl(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we @@ -674,7 +674,7 @@ func TestTabletControl(t *testing.T) { // of a StreamHealthResponse message. func TestStateChangeImmediateHealthBroadcast(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we @@ -867,7 +867,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // return an error func TestOldHealthCheck(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) *healthCheckInterval = 20 * time.Second agent._healthy = nil @@ -894,7 +894,7 @@ func TestOldHealthCheck(t *testing.T) { // the replication delay before setting REPLICA tablet to SERVING func TestBackupStateChange(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) *degradedThreshold = 7 * time.Second *unhealthyThreshold = 15 * time.Second @@ -942,7 +942,7 @@ func TestBackupStateChange(t *testing.T) { // the replication delay before setting REPLICA tablet to SERVING func TestRestoreStateChange(t *testing.T) { ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) *degradedThreshold = 7 * time.Second *unhealthyThreshold = 15 * time.Second diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index 1cda4775122..8b5ded8286c 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -34,7 +34,7 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) -// This file contains the implementations of RPCAgent methods. +// This file contains the implementations of RPCTM methods. // Major groups of methods are broken out into files named "rpc_*.go". // Ping makes sure RPCs work, and refreshes the tablet record. diff --git a/go/vt/vttablet/tabletmanager/rpc_agent.go b/go/vt/vttablet/tabletmanager/rpc_agent.go index 96b7b2a30e7..cdbdc1c492f 100644 --- a/go/vt/vttablet/tabletmanager/rpc_agent.go +++ b/go/vt/vttablet/tabletmanager/rpc_agent.go @@ -31,9 +31,9 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) -// RPCAgent defines the interface implemented by the Agent for RPCs. +// RPCTM defines the interface implemented by the TM for RPCs. // It is useful for RPC implementations to test their full stack. -type RPCAgent interface { +type RPCTM interface { // RPC calls // Various read-only methods diff --git a/go/vt/vttablet/tabletmanager/rpc_server.go b/go/vt/vttablet/tabletmanager/rpc_server.go index bdaa2397218..694da24908e 100644 --- a/go/vt/vttablet/tabletmanager/rpc_server.go +++ b/go/vt/vttablet/tabletmanager/rpc_server.go @@ -65,7 +65,7 @@ func (agent *TabletManager) checkLock() { } } -// HandleRPCPanic is part of the RPCAgent interface. +// HandleRPCPanic is part of the RPCTM interface. func (agent *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { // panic handling if x := recover(); x != nil { diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 96469218361..aec42f0a15d 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -92,11 +92,11 @@ func (agent *TabletManager) loadBlacklistRules(ctx context.Context, tablet *topo // brodcasts the new health, then sleep for grace period, to give time // to clients to get the new status. func (agent *TabletManager) lameduck(reason string) { - log.Infof("Agent is entering lameduck, reason: %v", reason) + log.Infof("TabletManager is entering lameduck, reason: %v", reason) agent.QueryServiceControl.EnterLameduck() agent.broadcastHealth() time.Sleep(*gracePeriod) - log.Infof("Agent is leaving lameduck") + log.Infof("TabletManager is leaving lameduck") } func (agent *TabletManager) broadcastHealth() { diff --git a/go/vt/vttablet/tabletmanager/state_change_test.go b/go/vt/vttablet/tabletmanager/state_change_test.go index a138b91f69c..461d24701b9 100644 --- a/go/vt/vttablet/tabletmanager/state_change_test.go +++ b/go/vt/vttablet/tabletmanager/state_change_test.go @@ -35,7 +35,7 @@ func TestPublishState(t *testing.T) { // code path. ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) require.NoError(t, err) assert.Equal(t, agent.Tablet(), ttablet.Tablet) @@ -77,7 +77,7 @@ func TestFindMysqlPort(t *testing.T) { mysqlPortRetryInterval = 1 * time.Millisecond ctx := context.Background() - agent := createTestAgent(ctx, t, nil) + agent := createTestTM(ctx, t, nil) err := agent.checkMysql(ctx) require.NoError(t, err) ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) diff --git a/go/vt/vttablet/agentrpctest/test_agent_rpc.go b/go/vt/vttablet/tmrpctest/test_tm_rpc.go similarity index 89% rename from go/vt/vttablet/agentrpctest/test_agent_rpc.go rename to go/vt/vttablet/tmrpctest/test_tm_rpc.go index f294eac1cd4..cbdd11e52fb 100644 --- a/go/vt/vttablet/agentrpctest/test_agent_rpc.go +++ b/go/vt/vttablet/tmrpctest/test_tm_rpc.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package agentrpctest +package tmrpctest import ( "fmt" @@ -41,9 +41,9 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) -// fakeRPCAgent implements tabletmanager.RPCAgent and fills in all +// fakeRPCTM implements tabletmanager.RPCTM and fills in all // possible values in all APIs -type fakeRPCAgent struct { +type fakeRPCTM struct { t *testing.T panics bool // slow if true will let Ping() sleep and effectively not respond to an RPC. @@ -52,30 +52,30 @@ type fakeRPCAgent struct { mu sync.Mutex } -func (fra *fakeRPCAgent) LockTables(ctx context.Context) error { +func (fra *fakeRPCTM) LockTables(ctx context.Context) error { panic("implement me") } -func (fra *fakeRPCAgent) UnlockTables(ctx context.Context) error { +func (fra *fakeRPCTM) UnlockTables(ctx context.Context) error { panic("implement me") } -func (fra *fakeRPCAgent) setSlow(slow bool) { +func (fra *fakeRPCTM) setSlow(slow bool) { fra.mu.Lock() fra.slow = slow fra.mu.Unlock() } -// NewFakeRPCAgent returns a fake tabletmanager.RPCAgent that's just a mirror. -func NewFakeRPCAgent(t *testing.T) tabletmanager.RPCAgent { - return &fakeRPCAgent{ +// NewFakeRPCTM returns a fake tabletmanager.RPCTM that's just a mirror. +func NewFakeRPCTM(t *testing.T) tabletmanager.RPCTM { + return &fakeRPCTM{ t: t, } } // The way this test is organized is a repetition of: // - static test data for a call -// - implementation of the tabletmanager.RPCAgent method for fakeRPCAgent +// - implementation of the tabletmanager.RPCTM method for fakeRPCTM // - static test method for the call (client side) // for each possible method of the interface. // This makes the implementations all in the same spot. @@ -171,7 +171,7 @@ func expectHandleRPCPanic(t *testing.T, name string, verbose bool, err error) { // Various read-only methods // -func (fra *fakeRPCAgent) Ping(ctx context.Context, args string) string { +func (fra *fakeRPCTM) Ping(ctx context.Context, args string) string { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -221,7 +221,7 @@ func agentRPCTestDialExpiredContext(ctx context.Context, t *testing.T, client tm // agentRPCTestRPCTimeout verifies that // the context returns the right DeadlineExceeded Err() for // RPCs failed due to an expired context during execution. -func agentRPCTestRPCTimeout(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet, fakeAgent *fakeRPCAgent) { +func agentRPCTestRPCTimeout(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet, fakeTM *fakeRPCTM) { // We must use a timeout > 0 such that the context deadline hasn't expired // yet in grpctmclient.Client.dial(). // NOTE: This might still race e.g. when test execution takes too long the @@ -229,8 +229,8 @@ func agentRPCTestRPCTimeout(ctx context.Context, t *testing.T, client tmclient.T // will be reduced but the test will not flake. shortCtx, cancel := context.WithTimeout(ctx, 10*time.Millisecond) defer cancel() - fakeAgent.setSlow(true) - defer func() { fakeAgent.setSlow(false) }() + fakeTM.setSlow(true) + defer func() { fakeTM.setSlow(false) }() err := client.Ping(shortCtx, tablet) if err == nil { t.Fatal("agentRPCTestRPCTimeout: RPC with expired context did not fail") @@ -272,7 +272,7 @@ var testGetSchemaReply = &tabletmanagerdatapb.SchemaDefinition{ Version: "xxx", } -func (fra *fakeRPCAgent) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) { +func (fra *fakeRPCTM) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -317,7 +317,7 @@ var testGetPermissionsReply = &tabletmanagerdatapb.Permissions{ }, } -func (fra *fakeRPCAgent) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) { +func (fra *fakeRPCTM) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -340,7 +340,7 @@ func agentRPCTestGetPermissionsPanic(ctx context.Context, t *testing.T, client t var testSetReadOnlyExpectedValue bool -func (fra *fakeRPCAgent) SetReadOnly(ctx context.Context, rdonly bool) error { +func (fra *fakeRPCTM) SetReadOnly(ctx context.Context, rdonly bool) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -372,7 +372,7 @@ func agentRPCTestSetReadOnlyPanic(ctx context.Context, t *testing.T, client tmcl var testChangeTypeValue = topodatapb.TabletType_REPLICA -func (fra *fakeRPCAgent) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error { +func (fra *fakeRPCTM) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -394,7 +394,7 @@ func agentRPCTestChangeTypePanic(ctx context.Context, t *testing.T, client tmcli var testSleepDuration = time.Minute -func (fra *fakeRPCAgent) Sleep(ctx context.Context, duration time.Duration) { +func (fra *fakeRPCTM) Sleep(ctx context.Context, duration time.Duration) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -427,7 +427,7 @@ var testExecuteHookHookResult = &hook.HookResult{ Stderr: "err", } -func (fra *fakeRPCAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { +func (fra *fakeRPCTM) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -447,7 +447,7 @@ func agentRPCTestExecuteHookPanic(ctx context.Context, t *testing.T, client tmcl var testRefreshStateCalled = false -func (fra *fakeRPCAgent) RefreshState(ctx context.Context) error { +func (fra *fakeRPCTM) RefreshState(ctx context.Context) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -473,7 +473,7 @@ func agentRPCTestRefreshStatePanic(ctx context.Context, t *testing.T, client tmc expectHandleRPCPanic(t, "RefreshState", true /*verbose*/, err) } -func (fra *fakeRPCAgent) RunHealthCheck(ctx context.Context) { +func (fra *fakeRPCTM) RunHealthCheck(ctx context.Context) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -481,7 +481,7 @@ func (fra *fakeRPCAgent) RunHealthCheck(ctx context.Context) { var testIgnoreHealthErrorValue = ".*" -func (fra *fakeRPCAgent) IgnoreHealthError(ctx context.Context, pattern string) error { +func (fra *fakeRPCTM) IgnoreHealthError(ctx context.Context, pattern string) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -515,7 +515,7 @@ func agentRPCTestIgnoreHealthErrorPanic(ctx context.Context, t *testing.T, clien var testReloadSchemaCalled = false -func (fra *fakeRPCAgent) ReloadSchema(ctx context.Context, waitPosition string) error { +func (fra *fakeRPCTM) ReloadSchema(ctx context.Context, waitPosition string) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -549,7 +549,7 @@ var testSchemaChangeResult = []*tabletmanagerdatapb.SchemaChangeResult{ }, } -func (fra *fakeRPCAgent) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { +func (fra *fakeRPCTM) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -575,7 +575,7 @@ var testSchemaChange = &tmutils.SchemaChange{ AfterSchema: testGetSchemaReply, } -func (fra *fakeRPCAgent) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { +func (fra *fakeRPCTM) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -623,7 +623,7 @@ var testExecuteFetchResult = &querypb.QueryResult{ }, } -func (fra *fakeRPCAgent) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) { +func (fra *fakeRPCTM) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -635,7 +635,7 @@ func (fra *fakeRPCAgent) ExecuteFetchAsDba(ctx context.Context, query []byte, db return testExecuteFetchResult, nil } -func (fra *fakeRPCAgent) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) { +func (fra *fakeRPCTM) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -646,7 +646,7 @@ func (fra *fakeRPCAgent) ExecuteFetchAsAllPrivs(ctx context.Context, query []byt return testExecuteFetchResult, nil } -func (fra *fakeRPCAgent) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) { +func (fra *fakeRPCTM) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -702,7 +702,7 @@ var testReplicationStatus = &replicationdatapb.Status{ MasterConnectRetry: 12, } -func (fra *fakeRPCAgent) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) { +func (fra *fakeRPCTM) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -721,14 +721,14 @@ func agentRPCTestSlaveStatusPanic(ctx context.Context, t *testing.T, client tmcl var testReplicationPosition = "MariaDB/5-456-890" -func (fra *fakeRPCAgent) MasterPosition(ctx context.Context) (string, error) { +func (fra *fakeRPCTM) MasterPosition(ctx context.Context) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } return testReplicationPosition, nil } -func (fra *fakeRPCAgent) WaitForPosition(ctx context.Context, pos string) error { +func (fra *fakeRPCTM) WaitForPosition(ctx context.Context, pos string) error { panic("unimplemented") } @@ -744,7 +744,7 @@ func agentRPCTestMasterPositionPanic(ctx context.Context, t *testing.T, client t var testStopSlaveCalled = false -func (fra *fakeRPCAgent) StopSlave(ctx context.Context) error { +func (fra *fakeRPCTM) StopSlave(ctx context.Context) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -764,7 +764,7 @@ func agentRPCTestStopSlavePanic(ctx context.Context, t *testing.T, client tmclie var testStopSlaveMinimumWaitTime = time.Hour -func (fra *fakeRPCAgent) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { +func (fra *fakeRPCTM) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -785,7 +785,7 @@ func agentRPCTestStopSlaveMinimumPanic(ctx context.Context, t *testing.T, client var testStartSlaveCalled = false -func (fra *fakeRPCAgent) StartSlave(ctx context.Context) error { +func (fra *fakeRPCTM) StartSlave(ctx context.Context) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -795,7 +795,7 @@ func (fra *fakeRPCAgent) StartSlave(ctx context.Context) error { var testStartSlaveUntilAfterCalledWith = "" -func (fra *fakeRPCAgent) StartSlaveUntilAfter(ctx context.Context, position string, waitTime time.Duration) error { +func (fra *fakeRPCTM) StartSlaveUntilAfter(ctx context.Context, position string, waitTime time.Duration) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -820,7 +820,7 @@ func agentRPCTestStartSlavePanic(ctx context.Context, t *testing.T, client tmcli var testGetSlavesResult = []string{"slave1", "slave2"} -func (fra *fakeRPCAgent) GetSlaves(ctx context.Context) ([]string, error) { +func (fra *fakeRPCTM) GetSlaves(ctx context.Context) ([]string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -839,7 +839,7 @@ func agentRPCTestGetSlavesPanic(ctx context.Context, t *testing.T, client tmclie var testVRQuery = "query" -func (fra *fakeRPCAgent) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { +func (fra *fakeRPCTM) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -862,7 +862,7 @@ var ( wfppos = "" ) -func (fra *fakeRPCAgent) VReplicationWaitForPos(ctx context.Context, id int, pos string) error { +func (fra *fakeRPCTM) VReplicationWaitForPos(ctx context.Context, id int, pos string) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -887,7 +887,7 @@ func agentRPCTestVReplicationWaitForPosPanic(ctx context.Context, t *testing.T, var testResetReplicationCalled = false -func (fra *fakeRPCAgent) ResetReplication(ctx context.Context) error { +func (fra *fakeRPCTM) ResetReplication(ctx context.Context) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -905,7 +905,7 @@ func agentRPCTestResetReplicationPanic(ctx context.Context, t *testing.T, client expectHandleRPCPanic(t, "ResetReplication", true /*verbose*/, err) } -func (fra *fakeRPCAgent) InitMaster(ctx context.Context) (string, error) { +func (fra *fakeRPCTM) InitMaster(ctx context.Context) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -931,7 +931,7 @@ var testMasterAlias = &topodatapb.TabletAlias{ Uid: 372, } -func (fra *fakeRPCAgent) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error { +func (fra *fakeRPCTM) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -955,7 +955,7 @@ func agentRPCTestPopulateReparentJournalPanic(ctx context.Context, t *testing.T, var testInitSlaveCalled = false -func (fra *fakeRPCAgent) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error { +func (fra *fakeRPCTM) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -976,7 +976,7 @@ func agentRPCTestInitSlavePanic(ctx context.Context, t *testing.T, client tmclie expectHandleRPCPanic(t, "InitSlave", true /*verbose*/, err) } -func (fra *fakeRPCAgent) DemoteMaster(ctx context.Context) (string, error) { +func (fra *fakeRPCTM) DemoteMaster(ctx context.Context) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -995,7 +995,7 @@ func agentRPCTestDemoteMasterPanic(ctx context.Context, t *testing.T, client tmc var testUndoDemoteMasterCalled = false -func (fra *fakeRPCAgent) UndoDemoteMaster(ctx context.Context) error { +func (fra *fakeRPCTM) UndoDemoteMaster(ctx context.Context) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1015,7 +1015,7 @@ func agentRPCTestUndoDemoteMasterPanic(ctx context.Context, t *testing.T, client var testReplicationPositionReturned = "MariaDB/5-567-3456" -func (fra *fakeRPCAgent) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { +func (fra *fakeRPCTM) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1035,7 +1035,7 @@ func agentRPCTestPromoteSlaveWhenCaughtUpPanic(ctx context.Context, t *testing.T var testSlaveWasPromotedCalled = false -func (fra *fakeRPCAgent) SlaveWasPromoted(ctx context.Context) error { +func (fra *fakeRPCTM) SlaveWasPromoted(ctx context.Context) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1056,7 +1056,7 @@ func agentRPCTestSlaveWasPromotedPanic(ctx context.Context, t *testing.T, client var testSetMasterCalled = false var testForceStartSlave = true -func (fra *fakeRPCAgent) SetMaster(ctx context.Context, parent *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error { +func (fra *fakeRPCTM) SetMaster(ctx context.Context, parent *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1084,7 +1084,7 @@ var testSlaveWasRestartedParent = &topodatapb.TabletAlias{ } var testSlaveWasRestartedCalled = false -func (fra *fakeRPCAgent) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error { +func (fra *fakeRPCTM) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1103,7 +1103,7 @@ func agentRPCTestSlaveWasRestartedPanic(ctx context.Context, t *testing.T, clien expectHandleRPCPanic(t, "SlaveWasRestarted", true /*verbose*/, err) } -func (fra *fakeRPCAgent) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { +func (fra *fakeRPCTM) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1120,7 +1120,7 @@ func agentRPCTestStopReplicationAndGetStatusPanic(ctx context.Context, t *testin expectHandleRPCPanic(t, "StopReplicationAndGetStatus", true /*verbose*/, err) } -func (fra *fakeRPCAgent) PromoteSlave(ctx context.Context) (string, error) { +func (fra *fakeRPCTM) PromoteSlave(ctx context.Context) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1137,7 +1137,7 @@ func agentRPCTestPromoteSlavePanic(ctx context.Context, t *testing.T, client tmc expectHandleRPCPanic(t, "PromoteSlave", true /*verbose*/, err) } -func (fra *fakeRPCAgent) PromoteReplica(ctx context.Context) (string, error) { +func (fra *fakeRPCTM) PromoteReplica(ctx context.Context) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1163,7 +1163,7 @@ var testBackupAllowMaster = false var testBackupCalled = false var testRestoreFromBackupCalled = false -func (fra *fakeRPCAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { +func (fra *fakeRPCTM) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1195,7 +1195,7 @@ func agentRPCTestBackupPanic(ctx context.Context, t *testing.T, client tmclient. expectHandleRPCPanic(t, "Backup", true /*verbose*/, err) } -func (fra *fakeRPCAgent) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error { +func (fra *fakeRPCTM) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1229,8 +1229,8 @@ func agentRPCTestRestoreFromBackupPanic(ctx context.Context, t *testing.T, clien // RPC helpers // -// HandleRPCPanic is part of the RPCAgent interface -func (fra *fakeRPCAgent) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { +// HandleRPCPanic is part of the RPCTM interface +func (fra *fakeRPCTM) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { if x := recover(); x != nil { // Use the panic case to make sure 'name' and 'verbose' are right. *err = fmt.Errorf("HandleRPCPanic caught panic during %v with verbose %v", name, verbose) @@ -1241,14 +1241,14 @@ func (fra *fakeRPCAgent) HandleRPCPanic(ctx context.Context, name string, args, // Run will run the test suite using the provided client and // the provided tablet. Tablet's vt address needs to be configured so -// the client will connect to a server backed by our RPCAgent (returned -// by NewFakeRPCAgent) -func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet, fakeAgent tabletmanager.RPCAgent) { +// the client will connect to a server backed by our RPCTM (returned +// by NewFakeRPCTM) +func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet, fakeTM tabletmanager.RPCTM) { ctx := context.Background() // Test RPC specific methods of the interface. agentRPCTestDialExpiredContext(ctx, t, client, tablet) - agentRPCTestRPCTimeout(ctx, t, client, tablet, fakeAgent.(*fakeRPCAgent)) + agentRPCTestRPCTimeout(ctx, t, client, tablet, fakeTM.(*fakeRPCTM)) // Various read-only methods agentRPCTestPing(ctx, t, client, tablet) @@ -1303,7 +1303,7 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T // // Tests panic handling everywhere now // - fakeAgent.(*fakeRPCAgent).panics = true + fakeTM.(*fakeRPCTM).panics = true // Various read-only methods agentRPCTestPingPanic(ctx, t, client, tablet) diff --git a/go/vt/worker/legacy_split_clone_test.go b/go/vt/worker/legacy_split_clone_test.go index 4be808ac07d..35fd5e9190f 100644 --- a/go/vt/worker/legacy_split_clone_test.go +++ b/go/vt/worker/legacy_split_clone_test.go @@ -426,7 +426,7 @@ func TestLegacySplitCloneV2_NoMasterAvailable(t *testing.T) { } // Make leftReplica the new MASTER. - tc.leftReplica.Agent.ChangeType(ctx, topodatapb.TabletType_MASTER) + tc.leftReplica.TM.ChangeType(ctx, topodatapb.TabletType_MASTER) tc.leftReplicaQs.UpdateType(topodatapb.TabletType_MASTER) tc.leftReplicaQs.AddDefaultHealthResponse() errs <- nil diff --git a/go/vt/worker/split_clone_flaky_test.go b/go/vt/worker/split_clone_flaky_test.go index b0ccd38dc65..ce287485d79 100644 --- a/go/vt/worker/split_clone_flaky_test.go +++ b/go/vt/worker/split_clone_flaky_test.go @@ -293,7 +293,7 @@ func (tc *splitCloneTestCase) tearDown() { ft.StopActionLoop(tc.t) ft.RPCServer.Stop() ft.FakeMysqlDaemon.Close() - ft.Agent = nil + ft.TM = nil ft.RPCServer = nil ft.FakeMysqlDaemon = nil } @@ -985,7 +985,7 @@ func TestSplitCloneV2_NoMasterAvailable(t *testing.T) { } // Make leftReplica the new MASTER. - tc.leftReplica.Agent.ChangeType(ctx, topodatapb.TabletType_MASTER) + tc.leftReplica.TM.ChangeType(ctx, topodatapb.TabletType_MASTER) t.Logf("resetting tablet back to MASTER") tc.leftReplicaQs.UpdateType(topodatapb.TabletType_MASTER) tc.leftReplicaQs.AddDefaultHealthResponse() diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index 922d6707e4d..5a5fe13e6ec 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -68,7 +68,7 @@ type fakeTablet struct { // The following fields are created when we start the event loop for // the tablet, and closed / cleared when we stop it. // The Listener is used by the gRPC server. - Agent *tabletmanager.TabletManager + TM *tabletmanager.TabletManager Listener net.Listener // These optional fields are used if the tablet also needs to @@ -142,8 +142,8 @@ func newFakeTablet(t *testing.T, wr *Wrangler, cell string, uid uint32, tabletTy // StartActionLoop will start the action loop for a fake tablet, // using ft.FakeMysqlDaemon as the backing mysqld. func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { - if ft.Agent != nil { - t.Fatalf("Agent for %v is already running", ft.Tablet.Alias) + if ft.TM != nil { + t.Fatalf("TM for %v is already running", ft.Tablet.Alias) } // Listen on a random port for gRPC. @@ -171,11 +171,11 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { // Create a test agent on that port, and re-read the record // (it has new ports and IP). - ft.Agent = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) - ft.Tablet = ft.Agent.Tablet() + ft.TM = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.Tablet = ft.TM.Tablet() // Register the gRPC server, and starts listening. - grpctmserver.RegisterForTest(ft.RPCServer, ft.Agent) + grpctmserver.RegisterForTest(ft.RPCServer, ft.TM) go ft.RPCServer.Serve(ft.Listener) // And wait for it to serve, so we don't start using it before it's @@ -185,7 +185,7 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { c := tmclient.NewTabletManagerClient() for timeout >= 0 { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - err := c.Ping(ctx, ft.Agent.Tablet()) + err := c.Ping(ctx, ft.TM.Tablet()) cancel() if err == nil { break @@ -200,15 +200,15 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { // StopActionLoop will stop the Action Loop for the given FakeTablet func (ft *fakeTablet) StopActionLoop(t *testing.T) { - if ft.Agent == nil { - t.Fatalf("Agent for %v is not running", ft.Tablet.Alias) + if ft.TM == nil { + t.Fatalf("TM for %v is not running", ft.Tablet.Alias) } if ft.StartHTTPServer { ft.HTTPListener.Close() } ft.Listener.Close() - ft.Agent.Stop() - ft.Agent = nil + ft.TM.Stop() + ft.TM = nil ft.Listener = nil ft.HTTPListener = nil } diff --git a/go/vt/wrangler/testlib/backup_test.go b/go/vt/wrangler/testlib/backup_test.go index 5fdf479b640..d69343afa37 100644 --- a/go/vt/wrangler/testlib/backup_test.go +++ b/go/vt/wrangler/testlib/backup_test.go @@ -135,7 +135,7 @@ func TestBackupRestore(t *testing.T) { sourceTablet.StartActionLoop(t, wr) defer sourceTablet.StopActionLoop(t) - sourceTablet.Agent.Cnf = &mysqlctl.Mycnf{ + sourceTablet.TM.Cnf = &mysqlctl.Mycnf{ DataDir: sourceDataDir, InnodbDataHomeDir: sourceInnodbDataDir, InnodbLogGroupHomeDir: sourceInnodbLogDir, @@ -186,7 +186,7 @@ func TestBackupRestore(t *testing.T) { destTablet.StartActionLoop(t, wr) defer destTablet.StopActionLoop(t) - destTablet.Agent.Cnf = &mysqlctl.Mycnf{ + destTablet.TM.Cnf = &mysqlctl.Mycnf{ DataDir: sourceDataDir, InnodbDataHomeDir: sourceInnodbDataDir, InnodbLogGroupHomeDir: sourceInnodbLogDir, @@ -196,7 +196,7 @@ func TestBackupRestore(t *testing.T) { RelayLogInfoPath: path.Join(root, "relay-log.info"), } - if err := destTablet.Agent.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */); err != nil { + if err := destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */); err != nil { t.Fatalf("RestoreData failed: %v", err) } @@ -306,7 +306,7 @@ func TestRestoreUnreachableMaster(t *testing.T) { sourceTablet.StartActionLoop(t, wr) defer sourceTablet.StopActionLoop(t) - sourceTablet.Agent.Cnf = &mysqlctl.Mycnf{ + sourceTablet.TM.Cnf = &mysqlctl.Mycnf{ DataDir: sourceDataDir, InnodbDataHomeDir: sourceInnodbDataDir, InnodbLogGroupHomeDir: sourceInnodbLogDir, @@ -346,7 +346,7 @@ func TestRestoreUnreachableMaster(t *testing.T) { destTablet.StartActionLoop(t, wr) defer destTablet.StopActionLoop(t) - destTablet.Agent.Cnf = &mysqlctl.Mycnf{ + destTablet.TM.Cnf = &mysqlctl.Mycnf{ DataDir: sourceDataDir, InnodbDataHomeDir: sourceInnodbDataDir, InnodbLogGroupHomeDir: sourceInnodbLogDir, @@ -362,7 +362,7 @@ func TestRestoreUnreachableMaster(t *testing.T) { // set a short timeout so that we don't have to wait 30 seconds *topo.RemoteOperationTimeout = 2 * time.Second // Restore should still succeed - if err := destTablet.Agent.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */); err != nil { + if err := destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */); err != nil { t.Fatalf("RestoreData failed: %v", err) } diff --git a/go/vt/wrangler/testlib/external_reparent_test.go b/go/vt/wrangler/testlib/external_reparent_test.go index 111a1bb8714..6db36fae643 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -455,9 +455,9 @@ func TestRPCTabletExternallyReparentedDemotesMasterToConfiguredTabletType(t *tes defer oldMaster.StopActionLoop(t) defer newMaster.StopActionLoop(t) - // For a real Agent, this would be initialized from initTabletType. - oldMaster.Agent.BaseTabletType = topodatapb.TabletType_SPARE - newMaster.Agent.BaseTabletType = topodatapb.TabletType_SPARE + // For a real TM, this would be initialized from initTabletType. + oldMaster.TM.BaseTabletType = topodatapb.TabletType_SPARE + newMaster.TM.BaseTabletType = topodatapb.TabletType_SPARE // Build keyspace graph err := topotools.RebuildKeyspace(context.Background(), logutil.NewConsoleLogger(), ts, oldMaster.Tablet.Keyspace, []string{"cell1"}) @@ -499,5 +499,5 @@ func TestRPCTabletExternallyReparentedDemotesMasterToConfiguredTabletType(t *tes assert.NoError(t, err) assert.True(t, topoproto.TabletAliasEqual(newMaster.Tablet.Alias, shardInfo.MasterAlias)) - assert.Equal(t, topodatapb.TabletType_MASTER, newMaster.Agent.Tablet().Type) + assert.Equal(t, topodatapb.TabletType_MASTER, newMaster.TM.Tablet().Type) } diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index d2806f5d6e0..9396e09016a 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -69,7 +69,7 @@ type FakeTablet struct { // The following fields are created when we start the event loop for // the tablet, and closed / cleared when we stop it. // The Listener is used by the gRPC server. - Agent *tabletmanager.TabletManager + TM *tabletmanager.TabletManager Listener net.Listener // These optional fields are used if the tablet also needs to @@ -167,8 +167,8 @@ func NewFakeTablet(t *testing.T, wr *wrangler.Wrangler, cell string, uid uint32, // StartActionLoop will start the action loop for a fake tablet, // using ft.FakeMysqlDaemon as the backing mysqld. func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { - if ft.Agent != nil { - t.Fatalf("Agent for %v is already running", ft.Tablet.Alias) + if ft.TM != nil { + t.Fatalf("TM for %v is already running", ft.Tablet.Alias) } // Listen on a random port for gRPC. @@ -196,11 +196,11 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { // Create a test agent on that port, and re-read the record // (it has new ports and IP). - ft.Agent = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) - ft.Tablet = ft.Agent.Tablet() + ft.TM = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.Tablet = ft.TM.Tablet() // Register the gRPC server, and starts listening. - grpctmserver.RegisterForTest(ft.RPCServer, ft.Agent) + grpctmserver.RegisterForTest(ft.RPCServer, ft.TM) go ft.RPCServer.Serve(ft.Listener) // And wait for it to serve, so we don't start using it before it's @@ -210,7 +210,7 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { c := tmclient.NewTabletManagerClient() for timeout >= 0 { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - err := c.Ping(ctx, ft.Agent.Tablet()) + err := c.Ping(ctx, ft.TM.Tablet()) cancel() if err == nil { break @@ -225,15 +225,15 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { // StopActionLoop will stop the Action Loop for the given FakeTablet func (ft *FakeTablet) StopActionLoop(t *testing.T) { - if ft.Agent == nil { - t.Fatalf("Agent for %v is not running", ft.Tablet.Alias) + if ft.TM == nil { + t.Fatalf("TM for %v is not running", ft.Tablet.Alias) } if ft.StartHTTPServer { ft.HTTPListener.Close() } ft.Listener.Close() - ft.Agent.Stop() - ft.Agent = nil + ft.TM.Stop() + ft.TM = nil ft.Listener = nil ft.HTTPListener = nil } diff --git a/go/vt/wrangler/testlib/migrate_served_from_test.go b/go/vt/wrangler/testlib/migrate_served_from_test.go index f718024fc21..9b834206a98 100644 --- a/go/vt/wrangler/testlib/migrate_served_from_test.go +++ b/go/vt/wrangler/testlib/migrate_served_from_test.go @@ -103,12 +103,12 @@ func TestMigrateServedFrom(t *testing.T) { destMaster.StartActionLoop(t, wr) defer destMaster.StopActionLoop(t) - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient := binlogplayer.NewMockDBClient(t) dbClientFactory := func() binlogplayer.DBClient { return dbClient } - destMaster.Agent.VREngine = vreplication.NewTestEngine(ts, "", destMaster.FakeMysqlDaemon, dbClientFactory, dbClient.DBName(), nil) + destMaster.TM.VREngine = vreplication.NewTestEngine(ts, "", destMaster.FakeMysqlDaemon, dbClientFactory, dbClient.DBName(), nil) dbClient.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := destMaster.Agent.VREngine.Open(context.Background()); err != nil { + if err := destMaster.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } // select pos, state, message from _vt.vreplication diff --git a/go/vt/wrangler/testlib/migrate_served_types_test.go b/go/vt/wrangler/testlib/migrate_served_types_test.go index ae55eb1a71f..ff5e855d897 100644 --- a/go/vt/wrangler/testlib/migrate_served_types_test.go +++ b/go/vt/wrangler/testlib/migrate_served_types_test.go @@ -150,13 +150,13 @@ func TestMigrateServedTypes(t *testing.T) { dest1Master.StartActionLoop(t, wr) defer dest1Master.StopActionLoop(t) - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient1 := binlogplayer.NewMockDBClient(t) dbClientFactory1 := func() binlogplayer.DBClient { return dbClient1 } - dest1Master.Agent.VREngine = vreplication.NewTestEngine(ts, "", dest1Master.FakeMysqlDaemon, dbClientFactory1, dbClient1.DBName(), nil) + dest1Master.TM.VREngine = vreplication.NewTestEngine(ts, "", dest1Master.FakeMysqlDaemon, dbClientFactory1, dbClient1.DBName(), nil) // select * from _vt.vreplication during Open dbClient1.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := dest1Master.Agent.VREngine.Open(context.Background()); err != nil { + if err := dest1Master.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } // select pos, state, message from _vt.vreplication @@ -178,13 +178,13 @@ func TestMigrateServedTypes(t *testing.T) { dest2Master.StartActionLoop(t, wr) defer dest2Master.StopActionLoop(t) - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient2 := binlogplayer.NewMockDBClient(t) dbClientFactory2 := func() binlogplayer.DBClient { return dbClient2 } - dest2Master.Agent.VREngine = vreplication.NewTestEngine(ts, "", dest2Master.FakeMysqlDaemon, dbClientFactory2, dbClient2.DBName(), nil) + dest2Master.TM.VREngine = vreplication.NewTestEngine(ts, "", dest2Master.FakeMysqlDaemon, dbClientFactory2, dbClient2.DBName(), nil) // select * from _vt.vreplication during Open dbClient2.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := dest2Master.Agent.VREngine.Open(context.Background()); err != nil { + if err := dest2Master.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } // select pos, state, message from _vt.vreplication @@ -414,13 +414,13 @@ func TestMultiShardMigrateServedTypes(t *testing.T) { dest4Master.StartActionLoop(t, wr) defer dest4Master.StopActionLoop(t) - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient1 := binlogplayer.NewMockDBClient(t) dbClientFactory1 := func() binlogplayer.DBClient { return dbClient1 } - dest1Master.Agent.VREngine = vreplication.NewTestEngine(ts, "", dest1Master.FakeMysqlDaemon, dbClientFactory1, "db", nil) + dest1Master.TM.VREngine = vreplication.NewTestEngine(ts, "", dest1Master.FakeMysqlDaemon, dbClientFactory1, "db", nil) // select * from _vt.vreplication during Open dbClient1.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := dest1Master.Agent.VREngine.Open(context.Background()); err != nil { + if err := dest1Master.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } // select pos, state, message from _vt.vreplication @@ -431,13 +431,13 @@ func TestMultiShardMigrateServedTypes(t *testing.T) { }}}, nil) expectDeleteVRepl(dbClient1) - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient2 := binlogplayer.NewMockDBClient(t) dbClientFactory2 := func() binlogplayer.DBClient { return dbClient2 } - dest2Master.Agent.VREngine = vreplication.NewTestEngine(ts, "", dest2Master.FakeMysqlDaemon, dbClientFactory2, "db", nil) + dest2Master.TM.VREngine = vreplication.NewTestEngine(ts, "", dest2Master.FakeMysqlDaemon, dbClientFactory2, "db", nil) // select * from _vt.vreplication during Open dbClient2.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := dest2Master.Agent.VREngine.Open(context.Background()); err != nil { + if err := dest2Master.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } @@ -502,13 +502,13 @@ func TestMultiShardMigrateServedTypes(t *testing.T) { // Now migrate the second destination shard - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient1 = binlogplayer.NewMockDBClient(t) dbClientFactory1 = func() binlogplayer.DBClient { return dbClient1 } - dest3Master.Agent.VREngine = vreplication.NewTestEngine(ts, "", dest3Master.FakeMysqlDaemon, dbClientFactory1, "db", nil) + dest3Master.TM.VREngine = vreplication.NewTestEngine(ts, "", dest3Master.FakeMysqlDaemon, dbClientFactory1, "db", nil) // select * from _vt.vreplication during Open dbClient1.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := dest3Master.Agent.VREngine.Open(context.Background()); err != nil { + if err := dest3Master.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } // select pos, state, message from _vt.vreplication @@ -519,13 +519,13 @@ func TestMultiShardMigrateServedTypes(t *testing.T) { }}}, nil) expectDeleteVRepl(dbClient1) - // Override with a fake VREngine after Agent is initialized in action loop. + // Override with a fake VREngine after TM is initialized in action loop. dbClient2 = binlogplayer.NewMockDBClient(t) dbClientFactory2 = func() binlogplayer.DBClient { return dbClient2 } - dest4Master.Agent.VREngine = vreplication.NewTestEngine(ts, "", dest4Master.FakeMysqlDaemon, dbClientFactory2, "db", nil) + dest4Master.TM.VREngine = vreplication.NewTestEngine(ts, "", dest4Master.FakeMysqlDaemon, dbClientFactory2, "db", nil) // select * from _vt.vreplication during Open dbClient2.ExpectRequest("select * from _vt.vreplication where db_name='db'", &sqltypes.Result{}, nil) - if err := dest4Master.Agent.VREngine.Open(context.Background()); err != nil { + if err := dest4Master.TM.VREngine.Open(context.Background()); err != nil { t.Fatal(err) } diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index 7ad1d7506ec..3bf28f2a678 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -93,7 +93,7 @@ func TestPlannedReparentShardNoMasterProvided(t *testing.T) { } oldMaster.StartActionLoop(t, wr) defer oldMaster.StopActionLoop(t) - oldMaster.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + oldMaster.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // SetMaster is called on new master to make sure it's replicating before reparenting. newMaster.FakeMysqlDaemon.SetMasterInput = topoproto.MysqlAddr(oldMaster.Tablet) @@ -127,7 +127,7 @@ func TestPlannedReparentShardNoMasterProvided(t *testing.T) { assert.False(t, newMaster.FakeMysqlDaemon.ReadOnly, "newMaster.FakeMysqlDaemon.ReadOnly is set") assert.True(t, oldMaster.FakeMysqlDaemon.ReadOnly, "oldMaster.FakeMysqlDaemon.ReadOnly not set") assert.True(t, goodReplica1.FakeMysqlDaemon.ReadOnly, "goodReplica1.FakeMysqlDaemon.ReadOnly not set") - assert.True(t, oldMaster.Agent.QueryServiceControl.IsServing(), "oldMaster...QueryServiceControl not serving") + assert.True(t, oldMaster.TM.QueryServiceControl.IsServing(), "oldMaster...QueryServiceControl not serving") // verify the old master was told to start replicating (and not // the replica that wasn't replicating in the first place) @@ -196,7 +196,7 @@ func TestPlannedReparentShardNoError(t *testing.T) { } oldMaster.StartActionLoop(t, wr) defer oldMaster.StopActionLoop(t) - oldMaster.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + oldMaster.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // SetMaster is called on new master to make sure it's replicating before reparenting. newMaster.FakeMysqlDaemon.SetMasterInput = topoproto.MysqlAddr(oldMaster.Tablet) @@ -243,7 +243,7 @@ func TestPlannedReparentShardNoError(t *testing.T) { assert.True(t, goodReplica1.FakeMysqlDaemon.ReadOnly, "goodReplica1.FakeMysqlDaemon.ReadOnly not set") assert.True(t, goodReplica2.FakeMysqlDaemon.ReadOnly, "goodReplica2.FakeMysqlDaemon.ReadOnly not set") - assert.True(t, oldMaster.Agent.QueryServiceControl.IsServing(), "oldMaster...QueryServiceControl not serving") + assert.True(t, oldMaster.TM.QueryServiceControl.IsServing(), "oldMaster...QueryServiceControl not serving") // verify the old master was told to start replicating (and not // the replica that wasn't replicating in the first place) @@ -329,7 +329,7 @@ func TestPlannedReparentShardWaitForPositionFail(t *testing.T) { } oldMaster.StartActionLoop(t, wr) defer oldMaster.StopActionLoop(t) - oldMaster.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + oldMaster.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // SetMaster is called on new master to make sure it's replicating before reparenting. newMaster.FakeMysqlDaemon.SetMasterInput = topoproto.MysqlAddr(oldMaster.Tablet) @@ -423,7 +423,7 @@ func TestPlannedReparentShardWaitForPositionTimeout(t *testing.T) { } oldMaster.StartActionLoop(t, wr) defer oldMaster.StopActionLoop(t) - oldMaster.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + oldMaster.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // SetMaster is called on new master to make sure it's replicating before reparenting. newMaster.FakeMysqlDaemon.SetMasterInput = topoproto.MysqlAddr(oldMaster.Tablet) @@ -489,7 +489,7 @@ func TestPlannedReparentShardRelayLogError(t *testing.T) { } master.StartActionLoop(t, wr) defer master.StopActionLoop(t) - master.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + master.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // goodReplica1 is replicating goodReplica1.FakeMysqlDaemon.ReadOnly = true @@ -517,7 +517,7 @@ func TestPlannedReparentShardRelayLogError(t *testing.T) { assert.False(t, master.FakeMysqlDaemon.ReadOnly, "master.FakeMysqlDaemon.ReadOnly set") assert.True(t, goodReplica1.FakeMysqlDaemon.ReadOnly, "goodReplica1.FakeMysqlDaemon.ReadOnly not set") - assert.True(t, master.Agent.QueryServiceControl.IsServing(), "master...QueryServiceControl not serving") + assert.True(t, master.TM.QueryServiceControl.IsServing(), "master...QueryServiceControl not serving") // verify the old master was told to start replicating (and not // the replica that wasn't replicating in the first place) @@ -554,7 +554,7 @@ func TestPlannedReparentShardRelayLogErrorStartSlave(t *testing.T) { } master.StartActionLoop(t, wr) defer master.StopActionLoop(t) - master.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + master.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // good replica 1 is not replicating goodReplica1.FakeMysqlDaemon.ReadOnly = true @@ -585,7 +585,7 @@ func TestPlannedReparentShardRelayLogErrorStartSlave(t *testing.T) { assert.False(t, master.FakeMysqlDaemon.ReadOnly, "master.FakeMysqlDaemon.ReadOnly set") assert.True(t, goodReplica1.FakeMysqlDaemon.ReadOnly, "goodReplica1.FakeMysqlDaemon.ReadOnly not set") - assert.True(t, master.Agent.QueryServiceControl.IsServing(), "master...QueryServiceControl not serving") + assert.True(t, master.TM.QueryServiceControl.IsServing(), "master...QueryServiceControl not serving") // verify the old master was told to start replicating (and not // the replica that wasn't replicating in the first place) @@ -652,7 +652,7 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { } oldMaster.StartActionLoop(t, wr) defer oldMaster.StopActionLoop(t) - oldMaster.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + oldMaster.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // SetMaster is called on new master to make sure it's replicating before reparenting. newMaster.FakeMysqlDaemon.SetMasterInput = topoproto.MysqlAddr(oldMaster.Tablet) @@ -753,7 +753,7 @@ func TestPlannedReparentShardSameMaster(t *testing.T) { } oldMaster.StartActionLoop(t, wr) defer oldMaster.StopActionLoop(t) - oldMaster.Agent.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) + oldMaster.TM.QueryServiceControl.(*tabletservermock.Controller).SetQueryServiceEnabledForTests(true) // good replica 1 is replicating goodReplica1.FakeMysqlDaemon.ReadOnly = true diff --git a/go/vt/wrangler/traffic_switcher_env_test.go b/go/vt/wrangler/traffic_switcher_env_test.go index a100c75d6e9..bec632c45ea 100644 --- a/go/vt/wrangler/traffic_switcher_env_test.go +++ b/go/vt/wrangler/traffic_switcher_env_test.go @@ -335,9 +335,9 @@ func (tme *testMigraterEnv) createDBClients(ctx context.Context, t *testing.T) { tme.dbSourceClients = append(tme.dbSourceClients, dbclient) dbClientFactory := func() binlogplayer.DBClient { return dbclient } // Replace existing engine with a new one - master.Agent.VREngine.Close() - master.Agent.VREngine = vreplication.NewTestEngine(tme.ts, "", master.FakeMysqlDaemon, dbClientFactory, dbclient.DBName(), nil) - if err := master.Agent.VREngine.Open(ctx); err != nil { + master.TM.VREngine.Close() + master.TM.VREngine = vreplication.NewTestEngine(tme.ts, "", master.FakeMysqlDaemon, dbClientFactory, dbclient.DBName(), nil) + if err := master.TM.VREngine.Open(ctx); err != nil { t.Fatal(err) } } @@ -346,9 +346,9 @@ func (tme *testMigraterEnv) createDBClients(ctx context.Context, t *testing.T) { tme.dbTargetClients = append(tme.dbTargetClients, dbclient) dbClientFactory := func() binlogplayer.DBClient { return dbclient } // Replace existing engine with a new one - master.Agent.VREngine.Close() - master.Agent.VREngine = vreplication.NewTestEngine(tme.ts, "", master.FakeMysqlDaemon, dbClientFactory, dbclient.DBName(), nil) - if err := master.Agent.VREngine.Open(ctx); err != nil { + master.TM.VREngine.Close() + master.TM.VREngine = vreplication.NewTestEngine(tme.ts, "", master.FakeMysqlDaemon, dbClientFactory, dbclient.DBName(), nil) + if err := master.TM.VREngine.Open(ctx); err != nil { t.Fatal(err) } } From be8cc28bf61358af334f1180088d6de77c3c4298 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 12 Jun 2020 19:38:53 -0700 Subject: [PATCH 020/430] tm revamp: agent -> tm Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/healthz.go | 6 +- go/cmd/vttablet/status.go | 10 +- go/cmd/vttablet/vttablet.go | 12 +- go/vt/vtcombo/tablet_map.go | 42 +- go/vt/vttablet/grpctmserver/server.go | 184 ++++---- go/vt/vttablet/grpctmserver/server_test.go | 2 +- go/vt/vttablet/tabletmanager/healthcheck.go | 80 ++-- .../tabletmanager/healthcheck_test.go | 442 +++++++++--------- go/vt/vttablet/tabletmanager/orchestrator.go | 6 +- .../tabletmanager/replication_reporter.go | 34 +- .../replication_reporter_test.go | 16 +- go/vt/vttablet/tabletmanager/restore.go | 56 +-- go/vt/vttablet/tabletmanager/rpc_actions.go | 70 +-- go/vt/vttablet/tabletmanager/rpc_backup.go | 62 +-- .../vttablet/tabletmanager/rpc_lock_tables.go | 54 +-- go/vt/vttablet/tabletmanager/rpc_query.go | 16 +- .../vttablet/tabletmanager/rpc_replication.go | 316 ++++++------- go/vt/vttablet/tabletmanager/rpc_schema.go | 34 +- go/vt/vttablet/tabletmanager/rpc_server.go | 34 +- go/vt/vttablet/tabletmanager/shard_sync.go | 84 ++-- go/vt/vttablet/tabletmanager/state_change.go | 162 +++---- .../tabletmanager/state_change_test.go | 48 +- go/vt/vttablet/tabletmanager/tm_init.go | 352 +++++++------- go/vt/vttablet/tabletmanager/tm_init_test.go | 78 ++-- go/vt/vttablet/tabletmanager/vreplication.go | 8 +- go/vt/vttablet/tmrpctest/test_tm_rpc.go | 324 ++++++------- go/vt/wrangler/fake_tablet_test.go | 2 +- go/vt/wrangler/testlib/fake_tablet.go | 2 +- 28 files changed, 1268 insertions(+), 1268 deletions(-) diff --git a/go/cmd/vttablet/healthz.go b/go/cmd/vttablet/healthz.go index 09bc92ef748..610e73a113d 100644 --- a/go/cmd/vttablet/healthz.go +++ b/go/cmd/vttablet/healthz.go @@ -22,15 +22,15 @@ import ( "vitess.io/vitess/go/vt/servenv" ) -// This file registers a /healthz URL that reports the health of the agent. +// This file registers a /healthz URL that reports the health of the tm. var okMessage = []byte("ok\n") func init() { servenv.OnRun(func() { http.Handle("/healthz", http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - if _, err := agent.Healthy(); err != nil { - http.Error(rw, fmt.Sprintf("500 internal server error: agent not healthy: %v", err), http.StatusInternalServerError) + if _, err := tm.Healthy(); err != nil { + http.Error(rw, fmt.Sprintf("500 internal server error: tm not healthy: %v", err), http.StatusInternalServerError) return } diff --git a/go/cmd/vttablet/status.go b/go/cmd/vttablet/status.go index 80aacab50ea..fd4d6564cec 100644 --- a/go/cmd/vttablet/status.go +++ b/go/cmd/vttablet/status.go @@ -147,18 +147,18 @@ func healthHTMLName() template.HTML { func addStatusParts(qsc tabletserver.Controller) { servenv.AddStatusPart("Tablet", tabletTemplate, func() interface{} { return map[string]interface{}{ - "Tablet": topo.NewTabletInfo(agent.Tablet(), nil), - "BlacklistedTables": agent.BlacklistedTables(), - "DisallowQueryService": agent.DisallowQueryService(), + "Tablet": topo.NewTabletInfo(tm.Tablet(), nil), + "BlacklistedTables": tm.BlacklistedTables(), + "DisallowQueryService": tm.DisallowQueryService(), } }) servenv.AddStatusFuncs(template.FuncMap{ "github_com_vitessio_vitess_health_html_name": healthHTMLName, }) servenv.AddStatusPart("Health", healthTemplate, func() interface{} { - latest, _ := agent.History.Latest().(*tabletmanager.HealthRecord) + latest, _ := tm.History.Latest().(*tabletmanager.HealthRecord) return &healthStatus{ - Records: agent.History.Records(), + Records: tm.History.Records(), Config: tabletmanager.ConfigHTML(), current: latest, } diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index 71fc9688642..32c180ba729 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -43,7 +43,7 @@ var ( tabletPath = flag.String("tablet-path", "", "tablet alias") tabletConfig = flag.String("tablet_config", "", "YAML file config for tablet") - agent *tabletmanager.TabletManager + tm *tabletmanager.TabletManager ) func init() { @@ -132,8 +132,8 @@ func main() { qsc.InitACL(*tableACLConfig, *enforceTableACLConfig, *tableACLConfigReloadInterval) // Create mysqld and register the health reporter (needs to be done - // before initializing the agent, so the initial health check - // done by the agent has the right reporter) + // before initializing the tm, so the initial health check + // done by the tm has the right reporter) mysqld := mysqlctl.NewMysqld(config.DB) servenv.OnClose(mysqld.Close) @@ -142,15 +142,15 @@ func main() { if servenv.GRPCPort != nil { gRPCPort = int32(*servenv.GRPCPort) } - agent, err = tabletmanager.NewTabletManager(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) + tm, err = tabletmanager.NewTabletManager(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) if err != nil { log.Exitf("NewTabletManager() failed: %v", err) } servenv.OnClose(func() { - // Close the agent so that our topo entry gets pruned properly and any + // Close the tm so that our topo entry gets pruned properly and any // background goroutines that use the topo connection are stopped. - agent.Close() + tm.Close() // We will still use the topo server during lameduck period // to update our state, so closing it in OnClose() diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index d9e0f3855a2..a4c17bf89f5 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -64,14 +64,14 @@ type tablet struct { dbname string // objects built at construction time - qsc tabletserver.Controller - agent *tabletmanager.TabletManager + qsc tabletserver.Controller + tm *tabletmanager.TabletManager } // tabletMap maps the tablet uid to the tablet record var tabletMap map[uint32]*tablet -// CreateTablet creates an individual tablet, with its agent, and adds +// CreateTablet creates an individual tablet, with its tm, and adds // it to the map. If it's a master tablet, it also issues a TER. func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, keyspace, shard, dbname string, tabletType topodatapb.TabletType, mysqld mysqlctl.MysqlDaemon, dbcfgs *dbconfigs.DBConfigs) error { alias := &topodatapb.TabletAlias{ @@ -86,9 +86,9 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, if tabletType == topodatapb.TabletType_MASTER { initTabletType = topodatapb.TabletType_REPLICA } - agent := tabletmanager.NewComboTabletManager(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) + tm := tabletmanager.NewComboTabletManager(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) if tabletType == topodatapb.TabletType_MASTER { - if err := agent.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { + if err := tm.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { return fmt.Errorf("TabletExternallyReparented failed on master %v: %v", topoproto.TabletAliasString(alias), err) } } @@ -100,13 +100,13 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, tabletType: tabletType, dbname: dbname, - qsc: controller, - agent: agent, + qsc: controller, + tm: tm, } return nil } -// InitTabletMap creates the action agents and associated data structures +// InitTabletMap creates the action tms and associated data structures // for all tablets, based on the vttest proto parameter. func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlctl.MysqlDaemon, dbcfgs *dbconfigs.DBConfigs, schemaDir string, mycnf *mysqlctl.Mycnf, ensureDatabase bool) error { tabletMap = make(map[uint32]*tablet) @@ -270,9 +270,9 @@ func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlct // run healthcheck on all vttablets tmc := tmclient.NewTabletManagerClient() for _, tablet := range tabletMap { - tabletInfo, err := ts.GetTablet(ctx, tablet.agent.TabletAlias) + tabletInfo, err := ts.GetTablet(ctx, tablet.tm.TabletAlias) if err != nil { - return fmt.Errorf("cannot find tablet: %+v", tablet.agent.TabletAlias) + return fmt.Errorf("cannot find tablet: %+v", tablet.tm.TabletAlias) } tmc.RunHealthCheck(ctx, tabletInfo.Tablet) } @@ -499,7 +499,7 @@ func (itmc *internalTabletManagerClient) Ping(ctx context.Context, tablet *topod if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - t.agent.Ping(ctx, "payload") + t.tm.Ping(ctx, "payload") return nil } @@ -508,7 +508,7 @@ func (itmc *internalTabletManagerClient) GetSchema(ctx context.Context, tablet * if !ok { return nil, fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - return t.agent.GetSchema(ctx, tables, excludeTables, includeViews) + return t.tm.GetSchema(ctx, tables, excludeTables, includeViews) } func (itmc *internalTabletManagerClient) GetPermissions(ctx context.Context, tablet *topodatapb.Tablet) (*tabletmanagerdatapb.Permissions, error) { @@ -516,7 +516,7 @@ func (itmc *internalTabletManagerClient) GetPermissions(ctx context.Context, tab if !ok { return nil, fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - return t.agent.GetPermissions(ctx) + return t.tm.GetPermissions(ctx) } func (itmc *internalTabletManagerClient) SetReadOnly(ctx context.Context, tablet *topodatapb.Tablet) error { @@ -532,7 +532,7 @@ func (itmc *internalTabletManagerClient) ChangeType(ctx context.Context, tablet if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - t.agent.ChangeType(ctx, dbType) + t.tm.ChangeType(ctx, dbType) return nil } @@ -541,7 +541,7 @@ func (itmc *internalTabletManagerClient) Sleep(ctx context.Context, tablet *topo if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - t.agent.Sleep(ctx, duration) + t.tm.Sleep(ctx, duration) return nil } @@ -554,7 +554,7 @@ func (itmc *internalTabletManagerClient) RefreshState(ctx context.Context, table if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - return t.agent.RefreshState(ctx) + return t.tm.RefreshState(ctx) } func (itmc *internalTabletManagerClient) RunHealthCheck(ctx context.Context, tablet *topodatapb.Tablet) error { @@ -562,7 +562,7 @@ func (itmc *internalTabletManagerClient) RunHealthCheck(ctx context.Context, tab if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - t.agent.RunHealthCheck(ctx) + t.tm.RunHealthCheck(ctx) return nil } @@ -571,7 +571,7 @@ func (itmc *internalTabletManagerClient) IgnoreHealthError(ctx context.Context, if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - t.agent.IgnoreHealthError(ctx, pattern) + t.tm.IgnoreHealthError(ctx, pattern) return nil } @@ -580,7 +580,7 @@ func (itmc *internalTabletManagerClient) ReloadSchema(ctx context.Context, table if !ok { return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - return t.agent.ReloadSchema(ctx, waitPosition) + return t.tm.ReloadSchema(ctx, waitPosition) } func (itmc *internalTabletManagerClient) PreflightSchema(ctx context.Context, tablet *topodatapb.Tablet, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { @@ -588,7 +588,7 @@ func (itmc *internalTabletManagerClient) PreflightSchema(ctx context.Context, ta if !ok { return nil, fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - return t.agent.PreflightSchema(ctx, changes) + return t.tm.PreflightSchema(ctx, changes) } func (itmc *internalTabletManagerClient) ApplySchema(ctx context.Context, tablet *topodatapb.Tablet, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { @@ -596,7 +596,7 @@ func (itmc *internalTabletManagerClient) ApplySchema(ctx context.Context, tablet if !ok { return nil, fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) } - return t.agent.ApplySchema(ctx, change) + return t.tm.ApplySchema(ctx, change) } func (itmc *internalTabletManagerClient) ExecuteFetchAsDba(ctx context.Context, tablet *topodatapb.Tablet, usePool bool, query []byte, maxRows int, disableBinlogs, reloadSchema bool) (*querypb.QueryResult, error) { diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index 0a022b03a29..14b8d032f9a 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -37,32 +37,32 @@ import ( // server is the gRPC implementation of the RPC server type server struct { - // implementation of the agent to call - agent tabletmanager.RPCTM + // implementation of the tm to call + tm tabletmanager.RPCTM } func (s *server) Ping(ctx context.Context, request *tabletmanagerdatapb.PingRequest) (response *tabletmanagerdatapb.PingResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "Ping", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "Ping", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.PingResponse{ - Payload: s.agent.Ping(ctx, request.Payload), + Payload: s.tm.Ping(ctx, request.Payload), } return response, nil } func (s *server) Sleep(ctx context.Context, request *tabletmanagerdatapb.SleepRequest) (response *tabletmanagerdatapb.SleepResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "Sleep", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "Sleep", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SleepResponse{} - s.agent.Sleep(ctx, time.Duration(request.Duration)) + s.tm.Sleep(ctx, time.Duration(request.Duration)) return response, nil } func (s *server) ExecuteHook(ctx context.Context, request *tabletmanagerdatapb.ExecuteHookRequest) (response *tabletmanagerdatapb.ExecuteHookResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ExecuteHook", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ExecuteHook", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ExecuteHookResponse{} - hr := s.agent.ExecuteHook(ctx, &hook.Hook{ + hr := s.tm.ExecuteHook(ctx, &hook.Hook{ Name: request.Name, Parameters: request.Parameters, ExtraEnv: request.ExtraEnv, @@ -74,10 +74,10 @@ func (s *server) ExecuteHook(ctx context.Context, request *tabletmanagerdatapb.E } func (s *server) GetSchema(ctx context.Context, request *tabletmanagerdatapb.GetSchemaRequest) (response *tabletmanagerdatapb.GetSchemaResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "GetSchema", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "GetSchema", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.GetSchemaResponse{} - sd, err := s.agent.GetSchema(ctx, request.Tables, request.ExcludeTables, request.IncludeViews) + sd, err := s.tm.GetSchema(ctx, request.Tables, request.ExcludeTables, request.IncludeViews) if err == nil { response.SchemaDefinition = sd } @@ -85,10 +85,10 @@ func (s *server) GetSchema(ctx context.Context, request *tabletmanagerdatapb.Get } func (s *server) GetPermissions(ctx context.Context, request *tabletmanagerdatapb.GetPermissionsRequest) (response *tabletmanagerdatapb.GetPermissionsResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "GetPermissions", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "GetPermissions", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.GetPermissionsResponse{} - p, err := s.agent.GetPermissions(ctx) + p, err := s.tm.GetPermissions(ctx) if err == nil { response.Permissions = p } @@ -100,60 +100,60 @@ func (s *server) GetPermissions(ctx context.Context, request *tabletmanagerdatap // func (s *server) SetReadOnly(ctx context.Context, request *tabletmanagerdatapb.SetReadOnlyRequest) (response *tabletmanagerdatapb.SetReadOnlyResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "SetReadOnly", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "SetReadOnly", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SetReadOnlyResponse{} - return response, s.agent.SetReadOnly(ctx, true) + return response, s.tm.SetReadOnly(ctx, true) } func (s *server) SetReadWrite(ctx context.Context, request *tabletmanagerdatapb.SetReadWriteRequest) (response *tabletmanagerdatapb.SetReadWriteResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "SetReadWrite", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "SetReadWrite", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SetReadWriteResponse{} - return response, s.agent.SetReadOnly(ctx, false) + return response, s.tm.SetReadOnly(ctx, false) } func (s *server) ChangeType(ctx context.Context, request *tabletmanagerdatapb.ChangeTypeRequest) (response *tabletmanagerdatapb.ChangeTypeResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ChangeType", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ChangeType", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ChangeTypeResponse{} - return response, s.agent.ChangeType(ctx, request.TabletType) + return response, s.tm.ChangeType(ctx, request.TabletType) } func (s *server) RefreshState(ctx context.Context, request *tabletmanagerdatapb.RefreshStateRequest) (response *tabletmanagerdatapb.RefreshStateResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "RefreshState", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "RefreshState", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.RefreshStateResponse{} - return response, s.agent.RefreshState(ctx) + return response, s.tm.RefreshState(ctx) } func (s *server) RunHealthCheck(ctx context.Context, request *tabletmanagerdatapb.RunHealthCheckRequest) (response *tabletmanagerdatapb.RunHealthCheckResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "RunHealthCheck", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "RunHealthCheck", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.RunHealthCheckResponse{} - s.agent.RunHealthCheck(ctx) + s.tm.RunHealthCheck(ctx) return response, nil } func (s *server) IgnoreHealthError(ctx context.Context, request *tabletmanagerdatapb.IgnoreHealthErrorRequest) (response *tabletmanagerdatapb.IgnoreHealthErrorResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "IgnoreHealthError", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "IgnoreHealthError", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.IgnoreHealthErrorResponse{} - return response, s.agent.IgnoreHealthError(ctx, request.Pattern) + return response, s.tm.IgnoreHealthError(ctx, request.Pattern) } func (s *server) ReloadSchema(ctx context.Context, request *tabletmanagerdatapb.ReloadSchemaRequest) (response *tabletmanagerdatapb.ReloadSchemaResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ReloadSchema", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ReloadSchema", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ReloadSchemaResponse{} - return response, s.agent.ReloadSchema(ctx, request.WaitPosition) + return response, s.tm.ReloadSchema(ctx, request.WaitPosition) } func (s *server) PreflightSchema(ctx context.Context, request *tabletmanagerdatapb.PreflightSchemaRequest) (response *tabletmanagerdatapb.PreflightSchemaResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "PreflightSchema", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "PreflightSchema", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.PreflightSchemaResponse{} - results, err := s.agent.PreflightSchema(ctx, request.Changes) + results, err := s.tm.PreflightSchema(ctx, request.Changes) if err == nil { response.ChangeResults = results } @@ -161,10 +161,10 @@ func (s *server) PreflightSchema(ctx context.Context, request *tabletmanagerdata } func (s *server) ApplySchema(ctx context.Context, request *tabletmanagerdatapb.ApplySchemaRequest) (response *tabletmanagerdatapb.ApplySchemaResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ApplySchema", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ApplySchema", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ApplySchemaResponse{} - scr, err := s.agent.ApplySchema(ctx, &tmutils.SchemaChange{ + scr, err := s.tm.ApplySchema(ctx, &tmutils.SchemaChange{ SQL: request.Sql, Force: request.Force, AllowReplication: request.AllowReplication, @@ -179,7 +179,7 @@ func (s *server) ApplySchema(ctx context.Context, request *tabletmanagerdatapb.A } func (s *server) LockTables(ctx context.Context, req *tabletmanagerdatapb.LockTablesRequest) (*tabletmanagerdatapb.LockTablesResponse, error) { - err := s.agent.LockTables(ctx) + err := s.tm.LockTables(ctx) if err != nil { return nil, err } @@ -187,7 +187,7 @@ func (s *server) LockTables(ctx context.Context, req *tabletmanagerdatapb.LockTa } func (s *server) UnlockTables(ctx context.Context, req *tabletmanagerdatapb.UnlockTablesRequest) (*tabletmanagerdatapb.UnlockTablesResponse, error) { - err := s.agent.UnlockTables(ctx) + err := s.tm.UnlockTables(ctx) if err != nil { return nil, err } @@ -195,10 +195,10 @@ func (s *server) UnlockTables(ctx context.Context, req *tabletmanagerdatapb.Unlo } func (s *server) ExecuteFetchAsDba(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsDbaRequest) (response *tabletmanagerdatapb.ExecuteFetchAsDbaResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ExecuteFetchAsDba", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ExecuteFetchAsDba", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ExecuteFetchAsDbaResponse{} - qr, err := s.agent.ExecuteFetchAsDba(ctx, request.Query, request.DbName, int(request.MaxRows), request.DisableBinlogs, request.ReloadSchema) + qr, err := s.tm.ExecuteFetchAsDba(ctx, request.Query, request.DbName, int(request.MaxRows), request.DisableBinlogs, request.ReloadSchema) if err != nil { return nil, vterrors.ToGRPC(err) } @@ -207,10 +207,10 @@ func (s *server) ExecuteFetchAsDba(ctx context.Context, request *tabletmanagerda } func (s *server) ExecuteFetchAsAllPrivs(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsAllPrivsRequest) (response *tabletmanagerdatapb.ExecuteFetchAsAllPrivsResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ExecuteFetchAsAllPrivs", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ExecuteFetchAsAllPrivs", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ExecuteFetchAsAllPrivsResponse{} - qr, err := s.agent.ExecuteFetchAsAllPrivs(ctx, request.Query, request.DbName, int(request.MaxRows), request.ReloadSchema) + qr, err := s.tm.ExecuteFetchAsAllPrivs(ctx, request.Query, request.DbName, int(request.MaxRows), request.ReloadSchema) if err != nil { return nil, vterrors.ToGRPC(err) } @@ -219,10 +219,10 @@ func (s *server) ExecuteFetchAsAllPrivs(ctx context.Context, request *tabletmana } func (s *server) ExecuteFetchAsApp(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (response *tabletmanagerdatapb.ExecuteFetchAsAppResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ExecuteFetchAsApp", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ExecuteFetchAsApp", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ExecuteFetchAsAppResponse{} - qr, err := s.agent.ExecuteFetchAsApp(ctx, request.Query, int(request.MaxRows)) + qr, err := s.tm.ExecuteFetchAsApp(ctx, request.Query, int(request.MaxRows)) if err != nil { return nil, vterrors.ToGRPC(err) } @@ -235,10 +235,10 @@ func (s *server) ExecuteFetchAsApp(ctx context.Context, request *tabletmanagerda // func (s *server) SlaveStatus(ctx context.Context, request *tabletmanagerdatapb.SlaveStatusRequest) (response *tabletmanagerdatapb.SlaveStatusResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "SlaveStatus", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "SlaveStatus", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SlaveStatusResponse{} - status, err := s.agent.SlaveStatus(ctx) + status, err := s.tm.SlaveStatus(ctx) if err == nil { response.Status = status } @@ -246,10 +246,10 @@ func (s *server) SlaveStatus(ctx context.Context, request *tabletmanagerdatapb.S } func (s *server) MasterPosition(ctx context.Context, request *tabletmanagerdatapb.MasterPositionRequest) (response *tabletmanagerdatapb.MasterPositionResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "MasterPosition", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "MasterPosition", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.MasterPositionResponse{} - position, err := s.agent.MasterPosition(ctx) + position, err := s.tm.MasterPosition(ctx) if err == nil { response.Position = position } @@ -257,24 +257,24 @@ func (s *server) MasterPosition(ctx context.Context, request *tabletmanagerdatap } func (s *server) WaitForPosition(ctx context.Context, request *tabletmanagerdatapb.WaitForPositionRequest) (response *tabletmanagerdatapb.WaitForPositionResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "WaitForPosition", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "WaitForPosition", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.WaitForPositionResponse{} - return response, s.agent.WaitForPosition(ctx, request.Position) + return response, s.tm.WaitForPosition(ctx, request.Position) } func (s *server) StopSlave(ctx context.Context, request *tabletmanagerdatapb.StopSlaveRequest) (response *tabletmanagerdatapb.StopSlaveResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "StopSlave", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "StopSlave", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.StopSlaveResponse{} - return response, s.agent.StopSlave(ctx) + return response, s.tm.StopSlave(ctx) } func (s *server) StopSlaveMinimum(ctx context.Context, request *tabletmanagerdatapb.StopSlaveMinimumRequest) (response *tabletmanagerdatapb.StopSlaveMinimumResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "StopSlaveMinimum", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "StopSlaveMinimum", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.StopSlaveMinimumResponse{} - position, err := s.agent.StopSlaveMinimum(ctx, request.Position, time.Duration(request.WaitTimeout)) + position, err := s.tm.StopSlaveMinimum(ctx, request.Position, time.Duration(request.WaitTimeout)) if err == nil { response.Position = position } @@ -282,24 +282,24 @@ func (s *server) StopSlaveMinimum(ctx context.Context, request *tabletmanagerdat } func (s *server) StartSlave(ctx context.Context, request *tabletmanagerdatapb.StartSlaveRequest) (response *tabletmanagerdatapb.StartSlaveResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "StartSlave", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "StartSlave", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.StartSlaveResponse{} - return response, s.agent.StartSlave(ctx) + return response, s.tm.StartSlave(ctx) } func (s *server) StartSlaveUntilAfter(ctx context.Context, request *tabletmanagerdatapb.StartSlaveUntilAfterRequest) (response *tabletmanagerdatapb.StartSlaveUntilAfterResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "StartSlave", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "StartSlave", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.StartSlaveUntilAfterResponse{} - return response, s.agent.StartSlaveUntilAfter(ctx, request.Position, time.Duration(request.WaitTimeout)) + return response, s.tm.StartSlaveUntilAfter(ctx, request.Position, time.Duration(request.WaitTimeout)) } func (s *server) GetSlaves(ctx context.Context, request *tabletmanagerdatapb.GetSlavesRequest) (response *tabletmanagerdatapb.GetSlavesResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "GetSlaves", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "GetSlaves", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.GetSlavesResponse{} - addrs, err := s.agent.GetSlaves(ctx) + addrs, err := s.tm.GetSlaves(ctx) if err == nil { response.Addrs = addrs } @@ -307,17 +307,17 @@ func (s *server) GetSlaves(ctx context.Context, request *tabletmanagerdatapb.Get } func (s *server) VReplicationExec(ctx context.Context, request *tabletmanagerdatapb.VReplicationExecRequest) (response *tabletmanagerdatapb.VReplicationExecResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "VReplicationExec", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "VReplicationExec", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.VReplicationExecResponse{} - response.Result, err = s.agent.VReplicationExec(ctx, request.Query) + response.Result, err = s.tm.VReplicationExec(ctx, request.Query) return response, err } func (s *server) VReplicationWaitForPos(ctx context.Context, request *tabletmanagerdatapb.VReplicationWaitForPosRequest) (response *tabletmanagerdatapb.VReplicationWaitForPosResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "VReplicationWaitForPos", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "VReplicationWaitForPos", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) - err = s.agent.VReplicationWaitForPos(ctx, int(request.Id), request.Position) + err = s.tm.VReplicationWaitForPos(ctx, int(request.Id), request.Position) return &tabletmanagerdatapb.VReplicationWaitForPosResponse{}, err } @@ -326,17 +326,17 @@ func (s *server) VReplicationWaitForPos(ctx context.Context, request *tabletmana // func (s *server) ResetReplication(ctx context.Context, request *tabletmanagerdatapb.ResetReplicationRequest) (response *tabletmanagerdatapb.ResetReplicationResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "ResetReplication", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "ResetReplication", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ResetReplicationResponse{} - return response, s.agent.ResetReplication(ctx) + return response, s.tm.ResetReplication(ctx) } func (s *server) InitMaster(ctx context.Context, request *tabletmanagerdatapb.InitMasterRequest) (response *tabletmanagerdatapb.InitMasterResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "InitMaster", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "InitMaster", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.InitMasterResponse{} - position, err := s.agent.InitMaster(ctx) + position, err := s.tm.InitMaster(ctx) if err == nil { response.Position = position } @@ -344,24 +344,24 @@ func (s *server) InitMaster(ctx context.Context, request *tabletmanagerdatapb.In } func (s *server) PopulateReparentJournal(ctx context.Context, request *tabletmanagerdatapb.PopulateReparentJournalRequest) (response *tabletmanagerdatapb.PopulateReparentJournalResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "PopulateReparentJournal", request, response, false /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "PopulateReparentJournal", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.PopulateReparentJournalResponse{} - return response, s.agent.PopulateReparentJournal(ctx, request.TimeCreatedNs, request.ActionName, request.MasterAlias, request.ReplicationPosition) + return response, s.tm.PopulateReparentJournal(ctx, request.TimeCreatedNs, request.ActionName, request.MasterAlias, request.ReplicationPosition) } func (s *server) InitSlave(ctx context.Context, request *tabletmanagerdatapb.InitSlaveRequest) (response *tabletmanagerdatapb.InitSlaveResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "InitSlave", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "InitSlave", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.InitSlaveResponse{} - return response, s.agent.InitSlave(ctx, request.Parent, request.ReplicationPosition, request.TimeCreatedNs) + return response, s.tm.InitSlave(ctx, request.Parent, request.ReplicationPosition, request.TimeCreatedNs) } func (s *server) DemoteMaster(ctx context.Context, request *tabletmanagerdatapb.DemoteMasterRequest) (response *tabletmanagerdatapb.DemoteMasterResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "DemoteMaster", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "DemoteMaster", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.DemoteMasterResponse{} - position, err := s.agent.DemoteMaster(ctx) + position, err := s.tm.DemoteMaster(ctx) if err == nil { response.Position = position } @@ -369,19 +369,19 @@ func (s *server) DemoteMaster(ctx context.Context, request *tabletmanagerdatapb. } func (s *server) UndoDemoteMaster(ctx context.Context, request *tabletmanagerdatapb.UndoDemoteMasterRequest) (response *tabletmanagerdatapb.UndoDemoteMasterResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "UndoDemoteMaster", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "UndoDemoteMaster", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.UndoDemoteMasterResponse{} - err = s.agent.UndoDemoteMaster(ctx) + err = s.tm.UndoDemoteMaster(ctx) return response, err } // Deprecated func (s *server) PromoteSlaveWhenCaughtUp(ctx context.Context, request *tabletmanagerdatapb.PromoteSlaveWhenCaughtUpRequest) (response *tabletmanagerdatapb.PromoteSlaveWhenCaughtUpResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "PromoteSlaveWhenCaughtUp", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "PromoteSlaveWhenCaughtUp", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.PromoteSlaveWhenCaughtUpResponse{} - position, err := s.agent.PromoteSlaveWhenCaughtUp(ctx, request.Position) + position, err := s.tm.PromoteSlaveWhenCaughtUp(ctx, request.Position) if err == nil { response.Position = position } @@ -389,31 +389,31 @@ func (s *server) PromoteSlaveWhenCaughtUp(ctx context.Context, request *tabletma } func (s *server) SlaveWasPromoted(ctx context.Context, request *tabletmanagerdatapb.SlaveWasPromotedRequest) (response *tabletmanagerdatapb.SlaveWasPromotedResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "SlaveWasPromoted", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "SlaveWasPromoted", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SlaveWasPromotedResponse{} - return response, s.agent.SlaveWasPromoted(ctx) + return response, s.tm.SlaveWasPromoted(ctx) } func (s *server) SetMaster(ctx context.Context, request *tabletmanagerdatapb.SetMasterRequest) (response *tabletmanagerdatapb.SetMasterResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "SetMaster", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "SetMaster", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SetMasterResponse{} - return response, s.agent.SetMaster(ctx, request.Parent, request.TimeCreatedNs, request.WaitPosition, request.ForceStartSlave) + return response, s.tm.SetMaster(ctx, request.Parent, request.TimeCreatedNs, request.WaitPosition, request.ForceStartSlave) } func (s *server) SlaveWasRestarted(ctx context.Context, request *tabletmanagerdatapb.SlaveWasRestartedRequest) (response *tabletmanagerdatapb.SlaveWasRestartedResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "SlaveWasRestarted", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "SlaveWasRestarted", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.SlaveWasRestartedResponse{} - return response, s.agent.SlaveWasRestarted(ctx, request.Parent) + return response, s.tm.SlaveWasRestarted(ctx, request.Parent) } func (s *server) StopReplicationAndGetStatus(ctx context.Context, request *tabletmanagerdatapb.StopReplicationAndGetStatusRequest) (response *tabletmanagerdatapb.StopReplicationAndGetStatusResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "StopReplicationAndGetStatus", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "StopReplicationAndGetStatus", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.StopReplicationAndGetStatusResponse{} - status, err := s.agent.StopReplicationAndGetStatus(ctx) + status, err := s.tm.StopReplicationAndGetStatus(ctx) if err == nil { response.Status = status } @@ -422,10 +422,10 @@ func (s *server) StopReplicationAndGetStatus(ctx context.Context, request *table // Deprecated func (s *server) PromoteSlave(ctx context.Context, request *tabletmanagerdatapb.PromoteSlaveRequest) (response *tabletmanagerdatapb.PromoteSlaveResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "PromoteSlave", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "PromoteSlave", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.PromoteSlaveResponse{} - position, err := s.agent.PromoteSlave(ctx) + position, err := s.tm.PromoteSlave(ctx) if err == nil { response.Position = position } @@ -433,10 +433,10 @@ func (s *server) PromoteSlave(ctx context.Context, request *tabletmanagerdatapb. } func (s *server) PromoteReplica(ctx context.Context, request *tabletmanagerdatapb.PromoteReplicaRequest) (response *tabletmanagerdatapb.PromoteReplicaResponse, err error) { - defer s.agent.HandleRPCPanic(ctx, "PromoteReplica", request, response, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "PromoteReplica", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.PromoteReplicaResponse{} - position, err := s.agent.PromoteReplica(ctx) + position, err := s.tm.PromoteReplica(ctx) if err == nil { response.Position = position } @@ -445,7 +445,7 @@ func (s *server) PromoteReplica(ctx context.Context, request *tabletmanagerdatap func (s *server) Backup(request *tabletmanagerdatapb.BackupRequest, stream tabletmanagerservicepb.TabletManager_BackupServer) (err error) { ctx := stream.Context() - defer s.agent.HandleRPCPanic(ctx, "Backup", request, nil, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "Backup", request, nil, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) // create a logger, send the result back to the caller @@ -458,12 +458,12 @@ func (s *server) Backup(request *tabletmanagerdatapb.BackupRequest, stream table }) }) - return s.agent.Backup(ctx, int(request.Concurrency), logger, bool(request.AllowMaster)) + return s.tm.Backup(ctx, int(request.Concurrency), logger, bool(request.AllowMaster)) } func (s *server) RestoreFromBackup(request *tabletmanagerdatapb.RestoreFromBackupRequest, stream tabletmanagerservicepb.TabletManager_RestoreFromBackupServer) (err error) { ctx := stream.Context() - defer s.agent.HandleRPCPanic(ctx, "RestoreFromBackup", request, nil, true /*verbose*/, &err) + defer s.tm.HandleRPCPanic(ctx, "RestoreFromBackup", request, nil, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) // create a logger, send the result back to the caller @@ -476,20 +476,20 @@ func (s *server) RestoreFromBackup(request *tabletmanagerdatapb.RestoreFromBacku }) }) - return s.agent.RestoreFromBackup(ctx, logger) + return s.tm.RestoreFromBackup(ctx, logger) } // registration glue func init() { - tabletmanager.RegisterQueryServices = append(tabletmanager.RegisterQueryServices, func(agent *tabletmanager.TabletManager) { + tabletmanager.RegisterQueryServices = append(tabletmanager.RegisterQueryServices, func(tm *tabletmanager.TabletManager) { if servenv.GRPCCheckServiceMap("tabletmanager") { - tabletmanagerservicepb.RegisterTabletManagerServer(servenv.GRPCServer, &server{agent}) + tabletmanagerservicepb.RegisterTabletManagerServer(servenv.GRPCServer, &server{tm}) } }) } // RegisterForTest will register the RPC, to be used by test instances only -func RegisterForTest(s *grpc.Server, agent *tabletmanager.TabletManager) { - tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{agent}) +func RegisterForTest(s *grpc.Server, tm *tabletmanager.TabletManager) { + tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{tm}) } diff --git a/go/vt/vttablet/grpctmserver/server_test.go b/go/vt/vttablet/grpctmserver/server_test.go index bdb16210ed0..08f5b393409 100644 --- a/go/vt/vttablet/grpctmserver/server_test.go +++ b/go/vt/vttablet/grpctmserver/server_test.go @@ -42,7 +42,7 @@ func TestGRPCTMServer(t *testing.T) { // Create a gRPC server and listen on the port. s := grpc.NewServer() fakeTM := tmrpctest.NewFakeRPCTM(t) - tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{agent: fakeTM}) + tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{tm: fakeTM}) go s.Serve(listener) // Create a gRPC client to talk to the fake tablet. diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index f4d77574902..a3fc2209ee2 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -135,10 +135,10 @@ func ConfigHTML() template.HTML { // initHealthCheck will start the health check background go routine, // and configure the healthcheck shutdown. It is only run by NewTabletManager -// for real vttablet agents (not by tests, nor vtcombo). -func (agent *TabletManager) initHealthCheck() { - registerReplicationReporter(agent) - registerHeartbeatReporter(agent.QueryServiceControl) +// for real vttablet tms (not by tests, nor vtcombo). +func (tm *TabletManager) initHealthCheck() { + registerReplicationReporter(tm) + registerHeartbeatReporter(tm.QueryServiceControl) log.Infof("Starting periodic health check every %v", *healthCheckInterval) t := timer.NewTimer(*healthCheckInterval) @@ -150,10 +150,10 @@ func (agent *TabletManager) initHealthCheck() { t.Stop() // Now we can finish up and force ourselves to not healthy. - agent.terminateHealthChecks() + tm.terminateHealthChecks() }) t.Start(func() { - agent.runHealthCheck() + tm.runHealthCheck() }) t.Trigger() } @@ -168,24 +168,24 @@ func (agent *TabletManager) initHealthCheck() { // // This will not change the TabletControl record, but will use it // to see if we should be running the query service. -func (agent *TabletManager) runHealthCheck() { - if err := agent.lock(agent.batchCtx); err != nil { +func (tm *TabletManager) runHealthCheck() { + if err := tm.lock(tm.batchCtx); err != nil { log.Warningf("cannot lock actionMutex, not running HealthCheck") return } - defer agent.unlock() + defer tm.unlock() - agent.runHealthCheckLocked() + tm.runHealthCheckLocked() } -func (agent *TabletManager) runHealthCheckLocked() { - agent.checkLock() +func (tm *TabletManager) runHealthCheckLocked() { + tm.checkLock() // read the current tablet record and tablet control - tablet := agent.Tablet() - agent.mutex.Lock() - shouldBeServing := agent._disallowQueryService == "" - ignoreErrorExpr := agent._ignoreHealthErrorExpr - agent.mutex.Unlock() + tablet := tm.Tablet() + tm.mutex.Lock() + shouldBeServing := tm._disallowQueryService == "" + ignoreErrorExpr := tm._ignoreHealthErrorExpr + tm.mutex.Unlock() // run the health check record := &HealthRecord{} @@ -196,7 +196,7 @@ func (agent *TabletManager) runHealthCheckLocked() { // Remember the health error as healthErr to be sure we don't // accidentally overwrite it with some other err. - replicationDelay, healthErr := agent.HealthReporter.Report(isSlaveType, shouldBeServing) + replicationDelay, healthErr := tm.HealthReporter.Report(isSlaveType, shouldBeServing) if healthErr != nil && ignoreErrorExpr != nil && ignoreErrorExpr.MatchString(healthErr.Error()) { // we need to ignore this health error @@ -228,7 +228,7 @@ func (agent *TabletManager) runHealthCheckLocked() { shouldBeServing = false } } - isServing := agent.QueryServiceControl.IsServing() + isServing := tm.QueryServiceControl.IsServing() if shouldBeServing { if !isServing { // If starting queryservice fails, that's our @@ -237,7 +237,7 @@ func (agent *TabletManager) runHealthCheckLocked() { // We don't care if the QueryService state actually // changed because we'll broadcast the latest health // status after this immediately anyway. - _ /* state changed */, healthErr = agent.QueryServiceControl.SetServingType(tablet.Type, true, nil) + _ /* state changed */, healthErr = tm.QueryServiceControl.SetServingType(tablet.Type, true, nil) } } else { if isServing { @@ -247,30 +247,30 @@ func (agent *TabletManager) runHealthCheckLocked() { // First enter lameduck during gracePeriod to // limit client errors. if topo.IsSubjectToLameduck(tablet.Type) && *gracePeriod > 0 { - agent.lameduck("health check failed") + tm.lameduck("health check failed") } // We don't care if the QueryService state actually // changed because we'll broadcast the latest health // status after this immediately anyway. log.Infof("Disabling query service because of health-check failure: %v", healthErr) - if _ /* state changed */, err := agent.QueryServiceControl.SetServingType(tablet.Type, false, nil); err != nil { + if _ /* state changed */, err := tm.QueryServiceControl.SetServingType(tablet.Type, false, nil); err != nil { log.Errorf("SetServingType(serving=false) failed: %v", err) } } } if topo.IsRunningUpdateStream(tablet.Type) { - agent.UpdateStream.Enable() + tm.UpdateStream.Enable() } else { - agent.UpdateStream.Disable() + tm.UpdateStream.Disable() } // All master tablets have to run the VReplication engine. // There is no guarantee that VREngine was successfully started when tabletmanager // came up. This is because the mysql could have been in read-only mode, etc. // So, start the engine if it's not already running. - if tablet.Type == topodatapb.TabletType_MASTER && !agent.VREngine.IsOpen() { - if err := agent.VREngine.Open(agent.batchCtx); err == nil { + if tablet.Type == topodatapb.TabletType_MASTER && !tm.VREngine.IsOpen() { + if err := tm.VREngine.Open(tm.batchCtx); err == nil { log.Info("VReplication engine successfully started") } } @@ -279,30 +279,30 @@ func (agent *TabletManager) runHealthCheckLocked() { record.Time = time.Now() record.Error = healthErr record.ReplicationDelay = replicationDelay - agent.History.Add(record) + tm.History.Add(record) // remember our health status - agent.mutex.Lock() - agent._healthy = healthErr - agent._healthyTime = time.Now() - agent._replicationDelay = replicationDelay - agent.mutex.Unlock() + tm.mutex.Lock() + tm._healthy = healthErr + tm._healthyTime = time.Now() + tm._replicationDelay = replicationDelay + tm.mutex.Unlock() // send it to our observers - agent.broadcastHealth() + tm.broadcastHealth() } // terminateHealthChecks is called when we enter lame duck mode. // We will clean up our state, and set query service to lame duck mode. // We only do something if we are in a serving state, and not a master. -func (agent *TabletManager) terminateHealthChecks() { +func (tm *TabletManager) terminateHealthChecks() { // No need to check for error, only a canceled batchCtx would fail this. - agent.lock(agent.batchCtx) - defer agent.unlock() - log.Info("agent.terminateHealthChecks is starting") + tm.lock(tm.batchCtx) + defer tm.unlock() + log.Info("tm.terminateHealthChecks is starting") // read the current tablet record - tablet := agent.Tablet() + tablet := tm.Tablet() if !topo.IsSubjectToLameduck(tablet.Type) { // If we're MASTER, SPARE, WORKER, etc. then we // shouldn't enter lameduck. We do lameduck to not @@ -322,7 +322,7 @@ func (agent *TabletManager) terminateHealthChecks() { // own "-lameduck-period" flag. During that extra period, // queryservice will be in old lameduck mode, meaning stay // alive but reject new queries. - agent.lameduck("terminating healthchecks") + tm.lameduck("terminating healthchecks") // Note we only do this now if we entered lameduck. In the // master case for instance, we want to keep serving until @@ -330,5 +330,5 @@ func (agent *TabletManager) terminateHealthChecks() { // go?). After servenv lameduck, the queryservice is stopped // from a servenv.OnClose() hook anyway. log.Infof("Disabling query service after lameduck in terminating healthchecks") - agent.QueryServiceControl.SetServingType(tablet.Type, false, nil) + tm.QueryServiceControl.SetServingType(tablet.Type, false, nil) } diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index 30d2cb0ff3e..b7a26335ab5 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -158,11 +158,11 @@ func createTestTM(ctx context.Context, t *testing.T, preStart func(*TabletManage } mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} - agent := NewTestTabletManager(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) + tm := NewTestTabletManager(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) - agent.HealthReporter = &fakeHealthCheck{} + tm.HealthReporter = &fakeHealthCheck{} - return agent + return tm } // TestHealthCheckControlsQueryService verifies that a tablet going healthy @@ -175,94 +175,94 @@ func TestHealthCheckControlsQueryService(t *testing.T) { }() ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } // First health check, should keep us as replica and serving. before := time.Now() - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second - agent.runHealthCheck() - ti, err := agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.runHealthCheck() + ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("First health check failed to go to replica: %v", ti.Type) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType != topodatapb.TabletType_REPLICA { - t.Errorf("invalid tabletserver target: %v", agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType) + if tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType != topodatapb.TabletType_REPLICA { + t.Errorf("invalid tabletserver target: %v", tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType) } - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 12); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 12); err != nil { t.Fatal(err) } // now make the tablet unhealthy - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 13 * time.Second - agent.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 13 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") before = time.Now() - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("Unhappy health check failed to stay as replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_REPLICA) } // first we get the lameduck broadcast, with no error and old // replication delay - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 12); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "", 12); err != nil { t.Fatal(err) } // then query service is disabled since we are unhealthy now. - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // and the associated broadcast - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "tablet is unhealthy", 13); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "tablet is unhealthy", 13); err != nil { t.Fatal(err) } // and nothing more. - if err := expectBroadcastDataEmpty(agent.QueryServiceControl); err != nil { + if err := expectBroadcastDataEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } - if err := expectStateChangesEmpty(agent.QueryServiceControl); err != nil { + if err := expectStateChangesEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } } @@ -273,51 +273,51 @@ func TestHealthCheckControlsQueryService(t *testing.T) { func TestErrSlaveNotRunningIsHealthy(t *testing.T) { *unhealthyThreshold = 10 * time.Minute ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } // health check returning health.ErrSlaveNotRunning, should // keep us as replica and serving before := time.Now() - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second - agent.HealthReporter.(*fakeHealthCheck).reportError = health.ErrSlaveNotRunning - agent.runHealthCheck() - if !agent.QueryServiceControl.IsServing() { + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = health.ErrSlaveNotRunning + tm.runHealthCheck() + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType != topodatapb.TabletType_REPLICA { - t.Errorf("invalid tabletserver target: %v", agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType) + if tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType != topodatapb.TabletType_REPLICA { + t.Errorf("invalid tabletserver target: %v", tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType) } - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 10*60); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 10*60); err != nil { t.Fatal(err) } // and nothing more. - if err := expectBroadcastDataEmpty(agent.QueryServiceControl); err != nil { + if err := expectBroadcastDataEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } - if err := expectStateChangesEmpty(agent.QueryServiceControl); err != nil { + if err := expectStateChangesEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } } @@ -326,17 +326,17 @@ func TestErrSlaveNotRunningIsHealthy(t *testing.T) { // query service, it should not go healthy. func TestQueryServiceNotStarting(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, func(a *TabletManager) { + tm := createTestTM(ctx, t, func(a *TabletManager) { // The SetServingType that will fail is part of Start() // so we have to do this here. a.QueryServiceControl.(*tabletservermock.Controller).SetServingTypeError = fmt.Errorf("test cannot start query service") }) // we should not be serving. - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } @@ -345,32 +345,32 @@ func TestQueryServiceNotStarting(t *testing.T) { // Now we can run another health check, it will stay unhealthy forever. before := time.Now() - agent.runHealthCheck() - ti, err := agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.runHealthCheck() + ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("Happy health check which cannot start query service should stay replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - bd := <-agent.QueryServiceControl.(*tabletservermock.Controller).BroadcastData + bd := <-tm.QueryServiceControl.(*tabletservermock.Controller).BroadcastData if bd.RealtimeStats.HealthError != "test cannot start query service" { t.Errorf("unexpected HealthError: %v", *bd) } - if agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType != topodatapb.TabletType_REPLICA { - t.Errorf("invalid tabletserver target: %v", agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType) + if tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType != topodatapb.TabletType_REPLICA { + t.Errorf("invalid tabletserver target: %v", tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType) } - if err := expectBroadcastDataEmpty(agent.QueryServiceControl); err != nil { + if err := expectBroadcastDataEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } - if err := expectStateChangesEmpty(agent.QueryServiceControl); err != nil { + if err := expectStateChangesEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } } @@ -379,93 +379,93 @@ func TestQueryServiceNotStarting(t *testing.T) { // service is shut down, the tablet goes unhealthy func TestQueryServiceStopped(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } // first health check, should keep us in replica / healthy before := time.Now() - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 14 * time.Second - agent.runHealthCheck() - ti, err := agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 14 * time.Second + tm.runHealthCheck() + ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("First health check failed to stay in replica: %v", ti.Type) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } want := topodatapb.TabletType_REPLICA - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != want { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != want { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, want) } - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 14); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 14); err != nil { t.Fatal(err) } // shut down query service and prevent it from starting again // (this is to simulate mysql going away, tablet server detecting it // and shutting itself down). Intercept the message - agent.QueryServiceControl.SetServingType(topodatapb.TabletType_REPLICA, false, nil) - agent.QueryServiceControl.(*tabletservermock.Controller).SetServingTypeError = fmt.Errorf("test cannot start query service") - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { + tm.QueryServiceControl.SetServingType(topodatapb.TabletType_REPLICA, false, nil) + tm.QueryServiceControl.(*tabletservermock.Controller).SetServingTypeError = fmt.Errorf("test cannot start query service") + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // health check should now fail before = time.Now() - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 15 * time.Second - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 15 * time.Second + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("Happy health check which cannot start query service should stay replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } want = topodatapb.TabletType_REPLICA - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != want { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != want { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, want) } - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "test cannot start query service", 15); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "test cannot start query service", 15); err != nil { t.Fatal(err) } // NOTE: No more broadcasts or state changes since SetServingTypeError is set // on the mocked controller and this disables its SetServingType(). - if err := expectBroadcastDataEmpty(agent.QueryServiceControl); err != nil { + if err := expectBroadcastDataEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } - if err := expectStateChangesEmpty(agent.QueryServiceControl); err != nil { + if err := expectStateChangesEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } } @@ -474,197 +474,197 @@ func TestQueryServiceStopped(t *testing.T) { // query service in a tablet. func TestTabletControl(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // first health check, should keep us in replica, just broadcast before := time.Now() - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second - agent.runHealthCheck() - ti, err := agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.runHealthCheck() + ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("First health check failed to go to replica: %v", ti.Type) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_REPLICA) } - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 16); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 16); err != nil { t.Fatal(err) } // now update the shard - si, err := agent.TopoServer.GetShard(ctx, "test_keyspace", "0") + si, err := tm.TopoServer.GetShard(ctx, "test_keyspace", "0") if err != nil { t.Fatalf("GetShard failed: %v", err) } - ctx, unlock, lockErr := agent.TopoServer.LockKeyspace(ctx, "test_keyspace", "UpdateDisableQueryService") + ctx, unlock, lockErr := tm.TopoServer.LockKeyspace(ctx, "test_keyspace", "UpdateDisableQueryService") if lockErr != nil { t.Fatalf("Couldn't lock keyspace for test") } defer unlock(&err) // Let's generate the keyspace graph we have partition information for this cell - err = topotools.RebuildKeyspaceLocked(ctx, logutil.NewConsoleLogger(), agent.TopoServer, "test_keyspace", []string{agent.TabletAlias.GetCell()}) + err = topotools.RebuildKeyspaceLocked(ctx, logutil.NewConsoleLogger(), tm.TopoServer, "test_keyspace", []string{tm.TabletAlias.GetCell()}) if err != nil { t.Fatalf("RebuildKeyspaceLocked failed: %v", err) } - err = agent.TopoServer.UpdateDisableQueryService(ctx, "test_keyspace", []*topo.ShardInfo{si}, topodatapb.TabletType_REPLICA, nil, true) + err = tm.TopoServer.UpdateDisableQueryService(ctx, "test_keyspace", []*topo.ShardInfo{si}, topodatapb.TabletType_REPLICA, nil, true) if err != nil { t.Fatalf("UpdateShardFields failed: %v", err) } // now refresh the tablet state, as the resharding process would do - agent.RefreshState(ctx) + tm.RefreshState(ctx) // check we shutdown query service - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } // check UpdateStream is still running - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } // Consume the health broadcast which was triggered due to the QueryService // state change from SERVING to NOT_SERVING. - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 16); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "", 16); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // check running a health check will not start it again before = time.Now() - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 17 * time.Second - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 17 * time.Second + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("Health check failed to go to replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_REPLICA) } - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 17); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "", 17); err != nil { t.Fatal(err) } // NOTE: No state change here since nothing has changed. // go unhealthy, check we go to error state and QS is not running - agent.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 18 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 18 * time.Second before = time.Now() - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("Unhealthy health check should stay replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "tablet is unhealthy", 18); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "tablet is unhealthy", 18); err != nil { t.Fatal(err) } // NOTE: No state change here since QueryService is already NOT_SERVING. want := topodatapb.TabletType_REPLICA - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != want { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != want { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, want) } // go back healthy, check QS is still not running - agent.HealthReporter.(*fakeHealthCheck).reportError = nil - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = nil + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second before = time.Now() - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("Healthy health check should go to replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if !agent.UpdateStream.IsEnabled() { + if !tm.UpdateStream.IsEnabled() { t.Errorf("UpdateStream should be running") } - if agent._healthyTime.Sub(before) < 0 { - t.Errorf("runHealthCheck did not update agent._healthyTime") + if tm._healthyTime.Sub(before) < 0 { + t.Errorf("runHealthCheck did not update tm._healthyTime") } - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 19); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "", 19); err != nil { t.Fatal(err) } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_REPLICA) } // now clear TabletControl, run health check, make sure we go // back healthy and serving. - err = agent.TopoServer.UpdateDisableQueryService(ctx, "test_keyspace", []*topo.ShardInfo{si}, topodatapb.TabletType_REPLICA, nil, false) + err = tm.TopoServer.UpdateDisableQueryService(ctx, "test_keyspace", []*topo.ShardInfo{si}, topodatapb.TabletType_REPLICA, nil, false) if err != nil { t.Fatalf("UpdateDisableQueryService failed: %v", err) } // now refresh the tablet state, as the resharding process would do - agent.RefreshState(ctx) + tm.RefreshState(ctx) // QueryService changed back from SERVING to NOT_SERVING since RefreshState() // re-read the topology and saw that REPLICA is still not allowed to serve. - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 19); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 19); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - if err := expectBroadcastDataEmpty(agent.QueryServiceControl); err != nil { + if err := expectBroadcastDataEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } - if err := expectStateChangesEmpty(agent.QueryServiceControl); err != nil { + if err := expectStateChangesEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } } @@ -674,104 +674,104 @@ func TestTabletControl(t *testing.T) { // of a StreamHealthResponse message. func TestStateChangeImmediateHealthBroadcast(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) // Consume the first health broadcast triggered by TabletManager.Start(): // (REPLICA, NOT_SERVING) goes to (REPLICA, SERVING). And we // should be serving. - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // Run health check to turn into a healthy replica - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second - agent.runHealthCheck() - if !agent.QueryServiceControl.IsServing() { + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.runHealthCheck() + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_REPLICA { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_REPLICA) } - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 12); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 12); err != nil { t.Fatal(err) } // Change to master. - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second - if err := agent.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second + if err := tm.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { t.Fatalf("TabletExternallyReparented failed: %v", err) } // Wait for shard_sync to finish startTime := time.Now() for { if time.Since(startTime) > 10*time.Second /* timeout */ { - si, err := agent.TopoServer.GetShard(ctx, agent.Tablet().Keyspace, agent.Tablet().Shard) + si, err := tm.TopoServer.GetShard(ctx, tm.Tablet().Keyspace, tm.Tablet().Shard) if err != nil { - t.Fatalf("GetShard(%v, %v) failed: %v", agent.Tablet().Keyspace, agent.Tablet().Shard, err) + t.Fatalf("GetShard(%v, %v) failed: %v", tm.Tablet().Keyspace, tm.Tablet().Shard, err) } - if !topoproto.TabletAliasEqual(si.MasterAlias, agent.Tablet().Alias) { - t.Fatalf("ShardInfo should have MasterAlias %v but has %v", topoproto.TabletAliasString(agent.Tablet().Alias), topoproto.TabletAliasString(si.MasterAlias)) + if !topoproto.TabletAliasEqual(si.MasterAlias, tm.Tablet().Alias) { + t.Fatalf("ShardInfo should have MasterAlias %v but has %v", topoproto.TabletAliasString(tm.Tablet().Alias), topoproto.TabletAliasString(si.MasterAlias)) } } - si, err := agent.TopoServer.GetShard(ctx, agent.Tablet().Keyspace, agent.Tablet().Shard) + si, err := tm.TopoServer.GetShard(ctx, tm.Tablet().Keyspace, tm.Tablet().Shard) if err != nil { - t.Fatalf("GetShard(%v, %v) failed: %v", agent.Tablet().Keyspace, agent.Tablet().Shard, err) + t.Fatalf("GetShard(%v, %v) failed: %v", tm.Tablet().Keyspace, tm.Tablet().Shard, err) } - if topoproto.TabletAliasEqual(si.MasterAlias, agent.Tablet().Alias) { + if topoproto.TabletAliasEqual(si.MasterAlias, tm.Tablet().Alias) { break } else { time.Sleep(100 * time.Millisecond /* interval at which to re-check the shard record */) } } - ti, err := agent.TopoServer.GetTablet(ctx, tabletAlias) + ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_MASTER { t.Errorf("TER failed to go to master: %v", ti.Type) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_MASTER) } // Consume the health broadcast (no replication delay as we are master) - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 12); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 12); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_MASTER); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_MASTER); err != nil { t.Fatal(err) } // Run health check to make sure we stay good - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 20 * time.Second - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 20 * time.Second + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_MASTER { t.Errorf("First health check failed to go to master: %v", ti.Type) } - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_MASTER) } - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 20); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 20); err != nil { t.Fatal(err) } // Simulate a vertical split resharding where we set // SourceShards in the topo and enable filtered replication. - _, err = agent.TopoServer.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { + _, err = tm.TopoServer.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { si.SourceShards = []*topodatapb.Shard_SourceShard{ { Uid: 1, @@ -790,44 +790,44 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // Refresh the tablet state, as vtworker would do. // Since we change the QueryService state, we'll also trigger a health broadcast. - agent.RefreshState(ctx) + tm.RefreshState(ctx) // (Destination) MASTER with enabled filtered replication mustn't serve anymore. - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } // Consume health broadcast sent out due to QueryService state change from // (MASTER, SERVING) to (MASTER, NOT_SERVING). // TODO(sougou); this test case does not reflect reality. Need to fix. - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 20); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "", 20); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_MASTER); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_MASTER); err != nil { t.Fatal(err) } // Running a healthcheck won't put the QueryService back to SERVING. - agent.runHealthCheck() - ti, err = agent.TopoServer.GetTablet(ctx, tabletAlias) + tm.runHealthCheck() + ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) } if ti.Type != topodatapb.TabletType_MASTER { t.Errorf("Health check failed to go to replica: %v", ti.Type) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } - if got := agent.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { + if got := tm.QueryServiceControl.(*tabletservermock.Controller).CurrentTarget.TabletType; got != topodatapb.TabletType_MASTER { t.Errorf("invalid tabletserver target: got = %v, want = %v", got, topodatapb.TabletType_MASTER) } - if _, err := expectBroadcastData(agent.QueryServiceControl, false, "", 20); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, false, "", 20); err != nil { t.Fatal(err) } // NOTE: No state change here since nothing has changed. // Simulate migration to destination master i.e. remove SourceShards. - _, err = agent.TopoServer.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { + _, err = tm.TopoServer.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { si.SourceShards = nil return nil }) @@ -838,27 +838,27 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // Refresh the tablet state, as vtctl MigrateServedFrom would do. // This should also trigger a health broadcast since the QueryService state // changes from NOT_SERVING to SERVING. - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 23 * time.Second - agent.RefreshState(ctx) + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 23 * time.Second + tm.RefreshState(ctx) // QueryService changed from NOT_SERVING to SERVING. - if !agent.QueryServiceControl.IsServing() { + if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should not be running") } // Since we didn't run healthcheck again yet, the broadcast data contains the // cached replication lag of 0. This is because // RefreshState on MASTER always sets the replicationDelay to 0 - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "", 20); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "", 20); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_MASTER); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_MASTER); err != nil { t.Fatal(err) } - if err := expectBroadcastDataEmpty(agent.QueryServiceControl); err != nil { + if err := expectBroadcastDataEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } - if err := expectStateChangesEmpty(agent.QueryServiceControl); err != nil { + if err := expectStateChangesEmpty(tm.QueryServiceControl); err != nil { t.Fatal(err) } } @@ -867,25 +867,25 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // return an error func TestOldHealthCheck(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) *healthCheckInterval = 20 * time.Second - agent._healthy = nil + tm._healthy = nil // last health check time is now, we're good - agent._healthyTime = time.Now() - if _, healthy := agent.Healthy(); healthy != nil { + tm._healthyTime = time.Now() + if _, healthy := tm.Healthy(); healthy != nil { t.Errorf("Healthy returned unexpected error: %v", healthy) } // last health check time is 2x interval ago, we're good - agent._healthyTime = time.Now().Add(-2 * *healthCheckInterval) - if _, healthy := agent.Healthy(); healthy != nil { + tm._healthyTime = time.Now().Add(-2 * *healthCheckInterval) + if _, healthy := tm.Healthy(); healthy != nil { t.Errorf("Healthy returned unexpected error: %v", healthy) } // last health check time is 4x interval ago, we're not good - agent._healthyTime = time.Now().Add(-4 * *healthCheckInterval) - if _, healthy := agent.Healthy(); healthy == nil || !strings.Contains(healthy.Error(), "last health check is too old") { + tm._healthyTime = time.Now().Add(-4 * *healthCheckInterval) + if _, healthy := tm.Healthy(); healthy == nil || !strings.Contains(healthy.Error(), "last health check is too old") { t.Errorf("Healthy returned wrong error: %v", healthy) } } @@ -894,46 +894,46 @@ func TestOldHealthCheck(t *testing.T) { // the replication delay before setting REPLICA tablet to SERVING func TestBackupStateChange(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) *degradedThreshold = 7 * time.Second *unhealthyThreshold = 15 * time.Second - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second // change to BACKUP, query service will turn off - if err := agent.ChangeType(ctx, topodatapb.TabletType_BACKUP); err != nil { + if err := tm.ChangeType(ctx, topodatapb.TabletType_BACKUP); err != nil { t.Fatal(err) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should NOT be running") } - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_BACKUP); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_BACKUP); err != nil { t.Fatal(err) } // change back to REPLICA, query service should not start // because replication delay > unhealthyThreshold - if err := agent.ChangeType(ctx, topodatapb.TabletType_REPLICA); err != nil { + if err := tm.ChangeType(ctx, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should NOT be running") } - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // run healthcheck // now query service should still be OFF - agent.runHealthCheck() - if agent.QueryServiceControl.IsServing() { + tm.runHealthCheck() + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should NOT be running") } } @@ -942,46 +942,46 @@ func TestBackupStateChange(t *testing.T) { // the replication delay before setting REPLICA tablet to SERVING func TestRestoreStateChange(t *testing.T) { ctx := context.Background() - agent := createTestTM(ctx, t, nil) + tm := createTestTM(ctx, t, nil) *degradedThreshold = 7 * time.Second *unhealthyThreshold = 15 * time.Second - if _, err := expectBroadcastData(agent.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { + if _, err := expectBroadcastData(tm.QueryServiceControl, true, "healthcheck not run yet", 0); err != nil { t.Fatal(err) } - if err := expectStateChange(agent.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, true, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - agent.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second // change to RESTORE, query service will turn off - if err := agent.ChangeType(ctx, topodatapb.TabletType_RESTORE); err != nil { + if err := tm.ChangeType(ctx, topodatapb.TabletType_RESTORE); err != nil { t.Fatal(err) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should NOT be running") } - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_RESTORE); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_RESTORE); err != nil { t.Fatal(err) } // change back to REPLICA, query service should not start // because replication delay > unhealthyThreshold - if err := agent.ChangeType(ctx, topodatapb.TabletType_REPLICA); err != nil { + if err := tm.ChangeType(ctx, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } - if agent.QueryServiceControl.IsServing() { + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should NOT be running") } - if err := expectStateChange(agent.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { + if err := expectStateChange(tm.QueryServiceControl, false, topodatapb.TabletType_REPLICA); err != nil { t.Fatal(err) } // run healthcheck // now query service should still be OFF - agent.runHealthCheck() - if agent.QueryServiceControl.IsServing() { + tm.runHealthCheck() + if tm.QueryServiceControl.IsServing() { t.Errorf("Query service should NOT be running") } } diff --git a/go/vt/vttablet/tabletmanager/orchestrator.go b/go/vt/vttablet/tabletmanager/orchestrator.go index 6349bf757a6..4e6486c7dda 100644 --- a/go/vt/vttablet/tabletmanager/orchestrator.go +++ b/go/vt/vttablet/tabletmanager/orchestrator.go @@ -66,9 +66,9 @@ func newOrcClient() (*orcClient, error) { } // DiscoverLoop periodically calls orc.discover() until process termination. -// The Tablet is read from the given agent each time before calling discover(). +// The Tablet is read from the given tm each time before calling discover(). // Usually this will be launched as a background goroutine. -func (orc *orcClient) DiscoverLoop(agent *TabletManager) { +func (orc *orcClient) DiscoverLoop(tm *TabletManager) { if *orcInterval == 0 { // 0 means never. return @@ -83,7 +83,7 @@ func (orc *orcClient) DiscoverLoop(agent *TabletManager) { for { // Do the first attempt immediately. - err := orc.Discover(agent.Tablet()) + err := orc.Discover(tm.Tablet()) // Only log if we're transitioning between success and failure states. if (err != nil) != (lastErr != nil) { diff --git a/go/vt/vttablet/tabletmanager/replication_reporter.go b/go/vt/vttablet/tabletmanager/replication_reporter.go index f4ca0371008..4ea339c4934 100644 --- a/go/vt/vttablet/tabletmanager/replication_reporter.go +++ b/go/vt/vttablet/tabletmanager/replication_reporter.go @@ -40,8 +40,8 @@ var ( // replicationReporter implements health.Reporter type replicationReporter struct { // set at construction time - agent *TabletManager - now func() time.Time + tm *TabletManager + now func() time.Time // store the last time we successfully got the lag, so if we // can't get the lag any more, we can extrapolate. @@ -55,26 +55,26 @@ func (r *replicationReporter) Report(isSlaveType, shouldQueryServiceBeRunning bo return 0, nil } - status, statusErr := r.agent.MysqlDaemon.SlaveStatus() + status, statusErr := r.tm.MysqlDaemon.SlaveStatus() if statusErr == mysql.ErrNotSlave || (statusErr == nil && !status.SlaveSQLRunning && !status.SlaveIORunning) { // MySQL is up, but slave is either not configured or not running. // Both SQL and IO threads are stopped, so it's probably either // stopped on purpose, or stopped because of a mysqld restart. - if !r.agent.slaveStopped() { + if !r.tm.slaveStopped() { // As far as we've been told, it isn't stopped on purpose, // so let's try to start it. if *mysqlctl.DisableActiveReparents { log.Infof("Slave is stopped. Running with --disable_active_reparents so will not try to reconnect to master...") } else { log.Infof("Slave is stopped. Trying to reconnect to master...") - ctx, cancel := context.WithTimeout(r.agent.batchCtx, 5*time.Second) - if err := repairReplication(ctx, r.agent); err != nil { + ctx, cancel := context.WithTimeout(r.tm.batchCtx, 5*time.Second) + if err := repairReplication(ctx, r.tm); err != nil { log.Infof("Failed to reconnect to master: %v", err) } cancel() // Check status again. - status, statusErr = r.agent.MysqlDaemon.SlaveStatus() + status, statusErr = r.tm.MysqlDaemon.SlaveStatus() } } } @@ -111,13 +111,13 @@ func (r *replicationReporter) HTMLName() template.HTML { // repairReplication tries to connect this slave to whoever is // the current master of the shard, and start replicating. -func repairReplication(ctx context.Context, agent *TabletManager) error { +func repairReplication(ctx context.Context, tm *TabletManager) error { if *mysqlctl.DisableActiveReparents { return fmt.Errorf("can't repair replication with --disable_active_reparents") } - ts := agent.TopoServer - tablet := agent.Tablet() + ts := tm.TopoServer + tablet := tm.Tablet() si, err := ts.GetShard(ctx, tablet.Keyspace, tablet.Shard) if err != nil { @@ -136,8 +136,8 @@ func repairReplication(ctx context.Context, agent *TabletManager) error { } // If Orchestrator is configured and if Orchestrator is actively reparenting, we should not repairReplication - if agent.orc != nil { - re, err := agent.orc.InActiveShardRecovery(tablet) + if tm.orc != nil { + re, err := tm.orc.InActiveShardRecovery(tablet) if err != nil { return err } @@ -147,21 +147,21 @@ func repairReplication(ctx context.Context, agent *TabletManager) error { // Before repairing replication, tell Orchestrator to enter maintenance mode for this tablet and to // lock any other actions on this tablet by Orchestrator. - if err := agent.orc.BeginMaintenance(agent.Tablet(), "vttablet has been told to StopSlave"); err != nil { + if err := tm.orc.BeginMaintenance(tm.Tablet(), "vttablet has been told to StopSlave"); err != nil { log.Warningf("Orchestrator BeginMaintenance failed: %v", err) return vterrors.Wrap(err, "orchestrator BeginMaintenance failed, skipping repairReplication") } } - return agent.setMasterRepairReplication(ctx, si.MasterAlias, 0, "", true) + return tm.setMasterRepairReplication(ctx, si.MasterAlias, 0, "", true) } -func registerReplicationReporter(agent *TabletManager) { +func registerReplicationReporter(tm *TabletManager) { if *enableReplicationReporter { health.DefaultAggregator.Register("replication_reporter", &replicationReporter{ - agent: agent, - now: time.Now, + tm: tm, + now: time.Now, }) } } diff --git a/go/vt/vttablet/tabletmanager/replication_reporter_test.go b/go/vt/vttablet/tabletmanager/replication_reporter_test.go index 6ee0f18d319..43ed3bee39d 100644 --- a/go/vt/vttablet/tabletmanager/replication_reporter_test.go +++ b/go/vt/vttablet/tabletmanager/replication_reporter_test.go @@ -32,8 +32,8 @@ func TestBasicMySQLReplicationLag(t *testing.T) { slaveStopped := true rep := &replicationReporter{ - agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, - now: time.Now, + tm: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + now: time.Now, } dur, err := rep.Report(true, true) if err != nil || dur != 10*time.Second { @@ -47,8 +47,8 @@ func TestNoKnownMySQLReplicationLag(t *testing.T) { slaveStopped := true rep := &replicationReporter{ - agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, - now: time.Now, + tm: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + now: time.Now, } dur, err := rep.Report(true, true) if err != health.ErrSlaveNotRunning { @@ -64,8 +64,8 @@ func TestExtrapolatedMySQLReplicationLag(t *testing.T) { now := time.Now() rep := &replicationReporter{ - agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, - now: func() time.Time { return now }, + tm: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + now: func() time.Time { return now }, } // seed the last known value with a good value @@ -92,8 +92,8 @@ func TestNoExtrapolatedMySQLReplicationLag(t *testing.T) { now := time.Now() rep := &replicationReporter{ - agent: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, - now: func() time.Time { return now }, + tm: &TabletManager{MysqlDaemon: mysqld, _slaveStopped: &slaveStopped}, + now: func() time.Time { return now }, } // seed the last known value with a good value diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 20ac9255c68..7b884bac556 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -50,31 +50,31 @@ var ( // It will either work, fail gracefully, or return // an error in case of a non-recoverable error. // It takes the action lock so no RPC interferes. -func (agent *TabletManager) RestoreData(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) RestoreData(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() - if agent.Cnf == nil { + defer tm.unlock() + if tm.Cnf == nil { return fmt.Errorf("cannot perform restore without my.cnf, please restart vttablet with a my.cnf file specified") } - return agent.restoreDataLocked(ctx, logger, waitForBackupInterval, deleteBeforeRestore) + return tm.restoreDataLocked(ctx, logger, waitForBackupInterval, deleteBeforeRestore) } -func (agent *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { +func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.Logger, waitForBackupInterval time.Duration, deleteBeforeRestore bool) error { var originalType topodatapb.TabletType - tablet := agent.Tablet() + tablet := tm.Tablet() originalType, tablet.Type = tablet.Type, topodatapb.TabletType_RESTORE - agent.updateState(ctx, tablet, "restore from backup") + tm.updateState(ctx, tablet, "restore from backup") // Try to restore. Depending on the reason for failure, we may be ok. - // If we're not ok, return an error and the agent will log.Fatalf, + // If we're not ok, return an error and the tm will log.Fatalf, // causing the process to be restarted and the restore retried. // Record local metadata values based on the original type. - localMetadata := agent.getLocalMetadataValues(originalType) + localMetadata := tm.getLocalMetadataValues(originalType) keyspace := tablet.Keyspace - keyspaceInfo, err := agent.TopoServer.GetKeyspace(ctx, keyspace) + keyspaceInfo, err := tm.TopoServer.GetKeyspace(ctx, keyspace) if err != nil { return err } @@ -89,11 +89,11 @@ func (agent *TabletManager) restoreDataLocked(ctx context.Context, logger loguti } params := mysqlctl.RestoreParams{ - Cnf: agent.Cnf, - Mysqld: agent.MysqlDaemon, + Cnf: tm.Cnf, + Mysqld: tm.MysqlDaemon, Logger: logger, Concurrency: *restoreConcurrency, - HookExtraEnv: agent.hookExtraEnv(), + HookExtraEnv: tm.hookExtraEnv(), LocalMetadata: localMetadata, DeleteBeforeRestore: deleteBeforeRestore, DbName: topoproto.TabletDbName(tablet), @@ -132,7 +132,7 @@ func (agent *TabletManager) restoreDataLocked(ctx context.Context, logger loguti // context. Thus we use the background context to get through to the finish. if keyspaceInfo.KeyspaceType == topodatapb.KeyspaceType_NORMAL { // Reconnect to master only for "NORMAL" keyspaces - if err := agent.startReplication(context.Background(), pos, originalType); err != nil { + if err := tm.startReplication(context.Background(), pos, originalType); err != nil { return err } } @@ -146,7 +146,7 @@ func (agent *TabletManager) restoreDataLocked(ctx context.Context, logger loguti default: // If anything failed, we should reset the original tablet type tablet.Type = originalType - agent.updateState(ctx, tablet, "failed for restore from backup") + tm.updateState(ctx, tablet, "failed for restore from backup") return vterrors.Wrap(err, "Can't restore backup") } @@ -161,28 +161,28 @@ func (agent *TabletManager) restoreDataLocked(ctx context.Context, logger loguti // Change type back to original type if we're ok to serve. tablet.Type = originalType - agent.updateState(ctx, tablet, "after restore from backup") + tm.updateState(ctx, tablet, "after restore from backup") return nil } -func (agent *TabletManager) startReplication(ctx context.Context, pos mysql.Position, tabletType topodatapb.TabletType) error { +func (tm *TabletManager) startReplication(ctx context.Context, pos mysql.Position, tabletType topodatapb.TabletType) error { cmds := []string{ "STOP SLAVE", "RESET SLAVE ALL", // "ALL" makes it forget master host:port. } - if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { + if err := tm.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { return vterrors.Wrap(err, "failed to reset slave") } // Set the position at which to resume from the master. - if err := agent.MysqlDaemon.SetSlavePosition(ctx, pos); err != nil { + if err := tm.MysqlDaemon.SetSlavePosition(ctx, pos); err != nil { return vterrors.Wrap(err, "failed to set slave position") } // Read the shard to find the current master, and its location. - tablet := agent.Tablet() - si, err := agent.TopoServer.GetShard(ctx, tablet.Keyspace, tablet.Shard) + tablet := tm.Tablet() + si, err := tm.TopoServer.GetShard(ctx, tablet.Keyspace, tablet.Shard) if err != nil { return vterrors.Wrap(err, "can't read shard") } @@ -202,18 +202,18 @@ func (agent *TabletManager) startReplication(ctx context.Context, pos mysql.Posi log.Warningf("Can't start replication after restore: master record still points to this tablet.") return nil } - ti, err := agent.TopoServer.GetTablet(ctx, si.MasterAlias) + ti, err := tm.TopoServer.GetTablet(ctx, si.MasterAlias) if err != nil { return vterrors.Wrapf(err, "Cannot read master tablet %v", si.MasterAlias) } // If using semi-sync, we need to enable it before connecting to master. - if err := agent.fixSemiSync(tabletType); err != nil { + if err := tm.fixSemiSync(tabletType); err != nil { return err } // Set master and start slave. - if err := agent.MysqlDaemon.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { + if err := tm.MysqlDaemon.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { return vterrors.Wrap(err, "MysqlDaemon.SetMaster failed") } @@ -246,7 +246,7 @@ func (agent *TabletManager) startReplication(ctx context.Context, pos mysql.Posi if err := ctx.Err(); err != nil { return err } - status, err := agent.MysqlDaemon.SlaveStatus() + status, err := tm.MysqlDaemon.SlaveStatus() if err != nil { return vterrors.Wrap(err, "can't get slave status") } @@ -261,8 +261,8 @@ func (agent *TabletManager) startReplication(ctx context.Context, pos mysql.Posi return nil } -func (agent *TabletManager) getLocalMetadataValues(tabletType topodatapb.TabletType) map[string]string { - tablet := agent.Tablet() +func (tm *TabletManager) getLocalMetadataValues(tabletType topodatapb.TabletType) map[string]string { + tablet := tm.Tablet() values := map[string]string{ "Alias": topoproto.TabletAliasString(tablet.Alias), "ClusterAlias": fmt.Sprintf("%s.%s", tablet.Keyspace, tablet.Shard), diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index 8b5ded8286c..18916f23514 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -38,44 +38,44 @@ import ( // Major groups of methods are broken out into files named "rpc_*.go". // Ping makes sure RPCs work, and refreshes the tablet record. -func (agent *TabletManager) Ping(ctx context.Context, args string) string { +func (tm *TabletManager) Ping(ctx context.Context, args string) string { return args } // GetPermissions returns the db permissions. -func (agent *TabletManager) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) { - return mysqlctl.GetPermissions(agent.MysqlDaemon) +func (tm *TabletManager) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) { + return mysqlctl.GetPermissions(tm.MysqlDaemon) } // SetReadOnly makes the mysql instance read-only or read-write. -func (agent *TabletManager) SetReadOnly(ctx context.Context, rdonly bool) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) SetReadOnly(ctx context.Context, rdonly bool) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - return agent.MysqlDaemon.SetReadOnly(rdonly) + return tm.MysqlDaemon.SetReadOnly(rdonly) } // ChangeType changes the tablet type -func (agent *TabletManager) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() - return agent.changeTypeLocked(ctx, tabletType) + defer tm.unlock() + return tm.changeTypeLocked(ctx, tabletType) } // ChangeType changes the tablet type -func (agent *TabletManager) changeTypeLocked(ctx context.Context, tabletType topodatapb.TabletType) error { +func (tm *TabletManager) changeTypeLocked(ctx context.Context, tabletType topodatapb.TabletType) error { // We don't want to allow multiple callers to claim a tablet as drained. There is a race that could happen during // horizontal resharding where two vtworkers will try to DRAIN the same tablet. This check prevents that race from // causing errors. - if tabletType == topodatapb.TabletType_DRAINED && agent.Tablet().Type == topodatapb.TabletType_DRAINED { - return fmt.Errorf("Tablet: %v, is already drained", agent.TabletAlias) + if tabletType == topodatapb.TabletType_DRAINED && tm.Tablet().Type == topodatapb.TabletType_DRAINED { + return fmt.Errorf("Tablet: %v, is already drained", tm.TabletAlias) } - tablet := agent.Tablet() + tablet := tm.Tablet() tablet.Type = tabletType // If we have been told we're master, set master term start time to Now // and save it topo immediately. @@ -83,7 +83,7 @@ func (agent *TabletManager) changeTypeLocked(ctx context.Context, tabletType top tablet.MasterTermStartTime = logutil.TimeToProto(time.Now()) // change our type in the topology, and set masterTermStartTime on tablet record if applicable - _, err := topotools.ChangeType(ctx, agent.TopoServer, agent.TabletAlias, tabletType, tablet.MasterTermStartTime) + _, err := topotools.ChangeType(ctx, tm.TopoServer, tm.TabletAlias, tabletType, tablet.MasterTermStartTime) if err != nil { return err } @@ -92,56 +92,56 @@ func (agent *TabletManager) changeTypeLocked(ctx context.Context, tabletType top } // updateState will invoke broadcastHealth if needed. - agent.updateState(ctx, tablet, "ChangeType") + tm.updateState(ctx, tablet, "ChangeType") // Let's see if we need to fix semi-sync acking. - if err := agent.fixSemiSyncAndReplication(agent.Tablet().Type); err != nil { + if err := tm.fixSemiSyncAndReplication(tm.Tablet().Type); err != nil { return vterrors.Wrap(err, "fixSemiSyncAndReplication failed, may not ack correctly") } return nil } // Sleep sleeps for the duration -func (agent *TabletManager) Sleep(ctx context.Context, duration time.Duration) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) Sleep(ctx context.Context, duration time.Duration) { + if err := tm.lock(ctx); err != nil { // client gave up return } - defer agent.unlock() + defer tm.unlock() time.Sleep(duration) } // ExecuteHook executes the provided hook locally, and returns the result. -func (agent *TabletManager) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { + if err := tm.lock(ctx); err != nil { // client gave up return &hook.HookResult{} } - defer agent.unlock() + defer tm.unlock() // Execute the hooks - topotools.ConfigureTabletHook(hk, agent.TabletAlias) + topotools.ConfigureTabletHook(hk, tm.TabletAlias) return hk.Execute() } // RefreshState reload the tablet record from the topo server. -func (agent *TabletManager) RefreshState(ctx context.Context) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) RefreshState(ctx context.Context) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - return agent.refreshTablet(ctx, "RefreshState") + return tm.refreshTablet(ctx, "RefreshState") } // RunHealthCheck will manually run the health check on the tablet. -func (agent *TabletManager) RunHealthCheck(ctx context.Context) { - agent.runHealthCheck() +func (tm *TabletManager) RunHealthCheck(ctx context.Context) { + tm.runHealthCheck() } // IgnoreHealthError sets the regexp for health check errors to ignore. -func (agent *TabletManager) IgnoreHealthError(ctx context.Context, pattern string) error { +func (tm *TabletManager) IgnoreHealthError(ctx context.Context, pattern string) error { var expr *regexp.Regexp if pattern != "" { var err error @@ -149,8 +149,8 @@ func (agent *TabletManager) IgnoreHealthError(ctx context.Context, pattern strin return err } } - agent.mutex.Lock() - agent._ignoreHealthErrorExpr = expr - agent.mutex.Unlock() + tm.mutex.Lock() + tm._ignoreHealthErrorExpr = expr + tm.mutex.Unlock() return nil } diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 1e548036ac9..0adc8520eb5 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -35,8 +35,8 @@ const ( ) // Backup takes a db backup and sends it to the BackupStorage -func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { - if agent.Cnf == nil { +func (tm *TabletManager) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { + if tm.Cnf == nil { return fmt.Errorf("cannot perform backup without my.cnf, please restart vttablet with a my.cnf file specified") } @@ -44,7 +44,7 @@ func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger // During a network partition it is possible that from the topology perspective this is no longer the master, // but the process didn't find out about this. // It is not safe to take backups from tablet in this state - currentTablet := agent.Tablet() + currentTablet := tm.Tablet() if !allowMaster && currentTablet.Type == topodatapb.TabletType_MASTER { return fmt.Errorf("type MASTER cannot take backup. if you really need to do this, rerun the backup command with -allow_master") } @@ -53,7 +53,7 @@ func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger return vterrors.Wrap(err, "failed to find backup engine") } // get Tablet info from topo so that it is up to date - tablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) if err != nil { return err } @@ -66,25 +66,25 @@ func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger if engine.ShouldDrainForBackup() { backupMode = backupModeOffline } - if err := agent.beginBackup(backupMode); err != nil { + if err := tm.beginBackup(backupMode); err != nil { return err } - defer agent.endBackup(backupMode) + defer tm.endBackup(backupMode) var originalType topodatapb.TabletType if engine.ShouldDrainForBackup() { - if err := agent.lock(ctx); err != nil { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - tablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) if err != nil { return err } originalType = tablet.Type // update our type to BACKUP - if err := agent.changeTypeLocked(ctx, topodatapb.TabletType_BACKUP); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_BACKUP); err != nil { return err } } @@ -93,12 +93,12 @@ func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger // now we can run the backup backupParams := mysqlctl.BackupParams{ - Cnf: agent.Cnf, - Mysqld: agent.MysqlDaemon, + Cnf: tm.Cnf, + Mysqld: tm.MysqlDaemon, Logger: l, Concurrency: concurrency, - HookExtraEnv: agent.hookExtraEnv(), - TopoServer: agent.TopoServer, + HookExtraEnv: tm.hookExtraEnv(), + TopoServer: tm.TopoServer, Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletAlias: topoproto.TabletAliasString(tablet.Alias), @@ -115,7 +115,7 @@ func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger // Change our type back to the original value. // Original type could be master so pass in a real value for masterTermStartTime - if err := agent.changeTypeLocked(bgCtx, originalType); err != nil { + if err := tm.changeTypeLocked(bgCtx, originalType); err != nil { // failure in changing the topology type is probably worse, // so returning that (we logged the snapshot error anyway) if returnErr != nil { @@ -129,13 +129,13 @@ func (agent *TabletManager) Backup(ctx context.Context, concurrency int, logger } // RestoreFromBackup deletes all local data and restores anew from the latest backup. -func (agent *TabletManager) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - tablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) if err != nil { return err } @@ -147,35 +147,35 @@ func (agent *TabletManager) RestoreFromBackup(ctx context.Context, logger loguti l := logutil.NewTeeLogger(logutil.NewConsoleLogger(), logger) // now we can run restore - err = agent.restoreDataLocked(ctx, l, 0 /* waitForBackupInterval */, true /* deleteBeforeRestore */) + err = tm.restoreDataLocked(ctx, l, 0 /* waitForBackupInterval */, true /* deleteBeforeRestore */) // re-run health check to be sure to capture any replication delay - agent.runHealthCheckLocked() + tm.runHealthCheckLocked() return err } -func (agent *TabletManager) beginBackup(backupMode string) error { - agent.mutex.Lock() - defer agent.mutex.Unlock() - if agent._isBackupRunning { - return fmt.Errorf("a backup is already running on tablet: %v", agent.TabletAlias) +func (tm *TabletManager) beginBackup(backupMode string) error { + tm.mutex.Lock() + defer tm.mutex.Unlock() + if tm._isBackupRunning { + return fmt.Errorf("a backup is already running on tablet: %v", tm.TabletAlias) } // when mode is online we don't take the action lock, so we continue to serve, // but let's set _isBackupRunning to true // so that we only allow one online backup at a time // offline backups also run only one at a time because we take the action lock // so this is not really needed in that case, however we are using it to record the state - agent._isBackupRunning = true + tm._isBackupRunning = true statsBackupIsRunning.Set([]string{backupMode}, 1) return nil } -func (agent *TabletManager) endBackup(backupMode string) { +func (tm *TabletManager) endBackup(backupMode string) { // now we set _isBackupRunning back to false // have to take the mutex lock before writing to _ fields - agent.mutex.Lock() - defer agent.mutex.Unlock() - agent._isBackupRunning = false + tm.mutex.Lock() + defer tm.mutex.Unlock() + tm._isBackupRunning = false statsBackupIsRunning.Set([]string{backupMode}, 0) } diff --git a/go/vt/vttablet/tabletmanager/rpc_lock_tables.go b/go/vt/vttablet/tabletmanager/rpc_lock_tables.go index 58186e0a39d..ecd11464639 100644 --- a/go/vt/vttablet/tabletmanager/rpc_lock_tables.go +++ b/go/vt/vttablet/tabletmanager/rpc_lock_tables.go @@ -35,17 +35,17 @@ var ( ) // LockTables will lock all tables with read locks, effectively pausing replication while the lock is held (idempotent) -func (agent *TabletManager) LockTables(ctx context.Context) error { +func (tm *TabletManager) LockTables(ctx context.Context) error { // get a connection - agent.mutex.Lock() - defer agent.mutex.Unlock() + tm.mutex.Lock() + defer tm.mutex.Unlock() - if agent._lockTablesConnection != nil { + if tm._lockTablesConnection != nil { // tables are already locked, bail out return errors.New("tables already locked on this tablet") } - conn, err := agent.MysqlDaemon.GetDbaConnection(ctx) + conn, err := tm.MysqlDaemon.GetDbaConnection(ctx) if err != nil { return err } @@ -55,24 +55,24 @@ func (agent *TabletManager) LockTables(ctx context.Context) error { if err != nil { // as fall back, we can lock each individual table as well. // this requires slightly less privileges but achieves the same effect - err = agent.lockTablesUsingLockTables(conn) + err = tm.lockTablesUsingLockTables(conn) if err != nil { return err } } log.Infof("[%v] Tables locked", conn.ConnectionID) - agent._lockTablesConnection = conn - agent._lockTablesTimer = time.AfterFunc(*lockTablesTimeout, func() { + tm._lockTablesConnection = conn + tm._lockTablesTimer = time.AfterFunc(*lockTablesTimeout, func() { // Here we'll sleep until the timeout time has elapsed. // If the table locks have not been released yet, we'll release them here - agent.mutex.Lock() - defer agent.mutex.Unlock() + tm.mutex.Lock() + defer tm.mutex.Unlock() // We need the mutex locked before we check this field - if agent._lockTablesConnection == conn { + if tm._lockTablesConnection == conn { log.Errorf("table lock timed out and released the lock - something went wrong") - err = agent.unlockTablesHoldingMutex() + err = tm.unlockTablesHoldingMutex() if err != nil { log.Errorf("failed to unlock tables: %v", err) } @@ -82,13 +82,13 @@ func (agent *TabletManager) LockTables(ctx context.Context) error { return nil } -func (agent *TabletManager) lockTablesUsingLockTables(conn *dbconnpool.DBConnection) error { +func (tm *TabletManager) lockTablesUsingLockTables(conn *dbconnpool.DBConnection) error { log.Warningf("failed to lock tables with FTWRL - falling back to LOCK TABLES") // Ensure schema engine is Open. If vttablet came up in a non_serving role, // the schema engine may not have been initialized. Open() is idempotent, so this // is always safe - se := agent.QueryServiceControl.SchemaEngine() + se := tm.QueryServiceControl.SchemaEngine() if err := se.Open(); err != nil { return err } @@ -102,7 +102,7 @@ func (agent *TabletManager) lockTablesUsingLockTables(conn *dbconnpool.DBConnect tableNames = append(tableNames, fmt.Sprintf("%s READ", sqlescape.EscapeID(name))) } lockStatement := fmt.Sprintf("LOCK TABLES %v", strings.Join(tableNames, ", ")) - _, err := conn.ExecuteFetch(fmt.Sprintf("USE %s", agent.DBConfigs.DBName), 0, false) + _, err := conn.ExecuteFetch(fmt.Sprintf("USE %s", tm.DBConfigs.DBName), 0, false) if err != nil { return err } @@ -116,28 +116,28 @@ func (agent *TabletManager) lockTablesUsingLockTables(conn *dbconnpool.DBConnect } // UnlockTables will unlock all tables (idempotent) -func (agent *TabletManager) UnlockTables(ctx context.Context) error { - agent.mutex.Lock() - defer agent.mutex.Unlock() +func (tm *TabletManager) UnlockTables(ctx context.Context) error { + tm.mutex.Lock() + defer tm.mutex.Unlock() - if agent._lockTablesConnection == nil { + if tm._lockTablesConnection == nil { return fmt.Errorf("tables were not locked") } - return agent.unlockTablesHoldingMutex() + return tm.unlockTablesHoldingMutex() } -func (agent *TabletManager) unlockTablesHoldingMutex() error { +func (tm *TabletManager) unlockTablesHoldingMutex() error { // We are cleaning up manually, let's kill the timer - agent._lockTablesTimer.Stop() - _, err := agent._lockTablesConnection.ExecuteFetch("UNLOCK TABLES", 0, false) + tm._lockTablesTimer.Stop() + _, err := tm._lockTablesConnection.ExecuteFetch("UNLOCK TABLES", 0, false) if err != nil { return err } - log.Infof("[%v] Tables unlocked", agent._lockTablesConnection.ConnectionID) - agent._lockTablesConnection.Close() - agent._lockTablesConnection = nil - agent._lockTablesTimer = nil + log.Infof("[%v] Tables unlocked", tm._lockTablesConnection.ConnectionID) + tm._lockTablesConnection.Close() + tm._lockTablesConnection = nil + tm._lockTablesTimer = nil return nil } diff --git a/go/vt/vttablet/tabletmanager/rpc_query.go b/go/vt/vttablet/tabletmanager/rpc_query.go index d0b116ff8ec..1c919764ff8 100644 --- a/go/vt/vttablet/tabletmanager/rpc_query.go +++ b/go/vt/vttablet/tabletmanager/rpc_query.go @@ -25,9 +25,9 @@ import ( ) // ExecuteFetchAsDba will execute the given query, possibly disabling binlogs and reload schema. -func (agent *TabletManager) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) { +func (tm *TabletManager) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) { // get a connection - conn, err := agent.MysqlDaemon.GetDbaConnection(ctx) + conn, err := tm.MysqlDaemon.GetDbaConnection(ctx) if err != nil { return nil, err } @@ -61,7 +61,7 @@ func (agent *TabletManager) ExecuteFetchAsDba(ctx context.Context, query []byte, } if err == nil && reloadSchema { - reloadErr := agent.QueryServiceControl.ReloadSchema(ctx) + reloadErr := tm.QueryServiceControl.ReloadSchema(ctx) if reloadErr != nil { log.Errorf("failed to reload the schema %v", reloadErr) } @@ -70,9 +70,9 @@ func (agent *TabletManager) ExecuteFetchAsDba(ctx context.Context, query []byte, } // ExecuteFetchAsAllPrivs will execute the given query, possibly reloading schema. -func (agent *TabletManager) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) { +func (tm *TabletManager) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) { // get a connection - conn, err := agent.MysqlDaemon.GetAllPrivsConnection(ctx) + conn, err := tm.MysqlDaemon.GetAllPrivsConnection(ctx) if err != nil { return nil, err } @@ -88,7 +88,7 @@ func (agent *TabletManager) ExecuteFetchAsAllPrivs(ctx context.Context, query [] result, err := conn.ExecuteFetch(string(query), maxrows, true /*wantFields*/) if err == nil && reloadSchema { - reloadErr := agent.QueryServiceControl.ReloadSchema(ctx) + reloadErr := tm.QueryServiceControl.ReloadSchema(ctx) if reloadErr != nil { log.Errorf("failed to reload the schema %v", reloadErr) } @@ -97,9 +97,9 @@ func (agent *TabletManager) ExecuteFetchAsAllPrivs(ctx context.Context, query [] } // ExecuteFetchAsApp will execute the given query. -func (agent *TabletManager) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) { +func (tm *TabletManager) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) { // get a connection - conn, err := agent.MysqlDaemon.GetAppConnection(ctx) + conn, err := tm.MysqlDaemon.GetAppConnection(ctx) if err != nil { return nil, err } diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 4322066961e..f16435fc6b7 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -40,8 +40,8 @@ var ( ) // SlaveStatus returns the replication status -func (agent *TabletManager) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) { - status, err := agent.MysqlDaemon.SlaveStatus() +func (tm *TabletManager) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) { + status, err := tm.MysqlDaemon.SlaveStatus() if err != nil { return nil, err } @@ -49,8 +49,8 @@ func (agent *TabletManager) SlaveStatus(ctx context.Context) (*replicationdatapb } // MasterPosition returns the master position -func (agent *TabletManager) MasterPosition(ctx context.Context) (string, error) { - pos, err := agent.MysqlDaemon.MasterPosition() +func (tm *TabletManager) MasterPosition(ctx context.Context) (string, error) { + pos, err := tm.MysqlDaemon.MasterPosition() if err != nil { return "", err } @@ -58,53 +58,53 @@ func (agent *TabletManager) MasterPosition(ctx context.Context) (string, error) } // WaitForPosition returns the master position -func (agent *TabletManager) WaitForPosition(ctx context.Context, pos string) error { +func (tm *TabletManager) WaitForPosition(ctx context.Context, pos string) error { mpos, err := mysql.DecodePosition(pos) if err != nil { return err } - return agent.MysqlDaemon.WaitMasterPos(ctx, mpos) + return tm.MysqlDaemon.WaitMasterPos(ctx, mpos) } // StopSlave will stop the mysql. Works both when Vitess manages // replication or not (using hook if not). -func (agent *TabletManager) StopSlave(ctx context.Context) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) StopSlave(ctx context.Context) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - return agent.stopSlaveLocked(ctx) + return tm.stopSlaveLocked(ctx) } -func (agent *TabletManager) stopSlaveLocked(ctx context.Context) error { +func (tm *TabletManager) stopSlaveLocked(ctx context.Context) error { // Remember that we were told to stop, so we don't try to // restart ourselves (in replication_reporter). - agent.setSlaveStopped(true) + tm.setSlaveStopped(true) // Also tell Orchestrator we're stopped on purpose for some Vitess task. // Do this in the background, as it's best-effort. go func() { - if agent.orc == nil { + if tm.orc == nil { return } - if err := agent.orc.BeginMaintenance(agent.Tablet(), "vttablet has been told to StopSlave"); err != nil { + if err := tm.orc.BeginMaintenance(tm.Tablet(), "vttablet has been told to StopSlave"); err != nil { log.Warningf("Orchestrator BeginMaintenance failed: %v", err) } }() - return agent.MysqlDaemon.StopSlave(agent.hookExtraEnv()) + return tm.MysqlDaemon.StopSlave(tm.hookExtraEnv()) } // StopSlaveMinimum will stop the slave after it reaches at least the // provided position. Works both when Vitess manages // replication or not (using hook if not). -func (agent *TabletManager) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { + if err := tm.lock(ctx); err != nil { return "", err } - defer agent.unlock() + defer tm.unlock() pos, err := mysql.DecodePosition(position) if err != nil { @@ -112,13 +112,13 @@ func (agent *TabletManager) StopSlaveMinimum(ctx context.Context, position strin } waitCtx, cancel := context.WithTimeout(ctx, waitTime) defer cancel() - if err := agent.MysqlDaemon.WaitMasterPos(waitCtx, pos); err != nil { + if err := tm.MysqlDaemon.WaitMasterPos(waitCtx, pos); err != nil { return "", err } - if err := agent.stopSlaveLocked(ctx); err != nil { + if err := tm.stopSlaveLocked(ctx); err != nil { return "", err } - pos, err = agent.MysqlDaemon.MasterPosition() + pos, err = tm.MysqlDaemon.MasterPosition() if err != nil { return "", err } @@ -127,38 +127,38 @@ func (agent *TabletManager) StopSlaveMinimum(ctx context.Context, position strin // StartSlave will start the mysql. Works both when Vitess manages // replication or not (using hook if not). -func (agent *TabletManager) StartSlave(ctx context.Context) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) StartSlave(ctx context.Context) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - agent.setSlaveStopped(false) + tm.setSlaveStopped(false) // Tell Orchestrator we're no longer stopped on purpose. // Do this in the background, as it's best-effort. go func() { - if agent.orc == nil { + if tm.orc == nil { return } - if err := agent.orc.EndMaintenance(agent.Tablet()); err != nil { + if err := tm.orc.EndMaintenance(tm.Tablet()); err != nil { log.Warningf("Orchestrator EndMaintenance failed: %v", err) } }() - if err := agent.fixSemiSync(agent.Tablet().Type); err != nil { + if err := tm.fixSemiSync(tm.Tablet().Type); err != nil { return err } - return agent.MysqlDaemon.StartSlave(agent.hookExtraEnv()) + return tm.MysqlDaemon.StartSlave(tm.hookExtraEnv()) } // StartSlaveUntilAfter will start the replication and let it catch up // until and including the transactions in `position` -func (agent *TabletManager) StartSlaveUntilAfter(ctx context.Context, position string, waitTime time.Duration) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) StartSlaveUntilAfter(ctx context.Context, position string, waitTime time.Duration) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() waitCtx, cancel := context.WithTimeout(ctx, waitTime) defer cancel() @@ -168,69 +168,69 @@ func (agent *TabletManager) StartSlaveUntilAfter(ctx context.Context, position s return err } - return agent.MysqlDaemon.StartSlaveUntilAfter(waitCtx, pos) + return tm.MysqlDaemon.StartSlaveUntilAfter(waitCtx, pos) } // GetSlaves returns the address of all the slaves -func (agent *TabletManager) GetSlaves(ctx context.Context) ([]string, error) { - return mysqlctl.FindSlaves(agent.MysqlDaemon) +func (tm *TabletManager) GetSlaves(ctx context.Context) ([]string, error) { + return mysqlctl.FindSlaves(tm.MysqlDaemon) } // ResetReplication completely resets the replication on the host. // All binary and relay logs are flushed. All replication positions are reset. -func (agent *TabletManager) ResetReplication(ctx context.Context) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) ResetReplication(ctx context.Context) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - agent.setSlaveStopped(true) - return agent.MysqlDaemon.ResetReplication(ctx) + tm.setSlaveStopped(true) + return tm.MysqlDaemon.ResetReplication(ctx) } // InitMaster enables writes and returns the replication position. -func (agent *TabletManager) InitMaster(ctx context.Context) (string, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) InitMaster(ctx context.Context) (string, error) { + if err := tm.lock(ctx); err != nil { return "", err } - defer agent.unlock() + defer tm.unlock() // Initializing as master implies undoing any previous "do not replicate". - agent.setSlaveStopped(false) + tm.setSlaveStopped(false) // we need to insert something in the binlogs, so we can get the // current position. Let's just use the mysqlctl.CreateReparentJournal commands. cmds := mysqlctl.CreateReparentJournal() - if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { + if err := tm.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { return "", err } // get the current replication position - pos, err := agent.MysqlDaemon.MasterPosition() + pos, err := tm.MysqlDaemon.MasterPosition() if err != nil { return "", err } // If using semi-sync, we need to enable it before going read-write. - if err := agent.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { return "", err } // Set the server read-write, from now on we can accept real // client writes. Note that if semi-sync replication is enabled, // we'll still need some slaves to be able to commit transactions. - if err := agent.MysqlDaemon.SetReadOnly(false); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { return "", err } - if err := agent.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { return "", err } return mysql.EncodePosition(pos), nil } // PopulateReparentJournal adds an entry into the reparent_journal table. -func (agent *TabletManager) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error { +func (tm *TabletManager) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error { pos, err := mysql.DecodePosition(position) if err != nil { return err @@ -238,22 +238,22 @@ func (agent *TabletManager) PopulateReparentJournal(ctx context.Context, timeCre cmds := mysqlctl.CreateReparentJournal() cmds = append(cmds, mysqlctl.PopulateReparentJournal(timeCreatedNS, actionName, topoproto.TabletAliasString(masterAlias), pos)) - return agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds) + return tm.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds) } // InitSlave sets replication master and position, and waits for the // reparent_journal table entry up to context timeout -func (agent *TabletManager) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() // If we were a master type, switch our type to replica. This // is used on the old master when using InitShardMaster with // -force, and the new master is different from the old master. - if agent.Tablet().Type == topodatapb.TabletType_MASTER { - if err := agent.changeTypeLocked(ctx, topodatapb.TabletType_REPLICA); err != nil { + if tm.Tablet().Type == topodatapb.TabletType_MASTER { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_REPLICA); err != nil { return err } } @@ -262,33 +262,33 @@ func (agent *TabletManager) InitSlave(ctx context.Context, parent *topodatapb.Ta if err != nil { return err } - ti, err := agent.TopoServer.GetTablet(ctx, parent) + ti, err := tm.TopoServer.GetTablet(ctx, parent) if err != nil { return err } - agent.setSlaveStopped(false) + tm.setSlaveStopped(false) // If using semi-sync, we need to enable it before connecting to master. // If we were a master type, we need to switch back to replica settings. // Otherwise we won't be able to commit anything. - tt := agent.Tablet().Type + tt := tm.Tablet().Type if tt == topodatapb.TabletType_MASTER { tt = topodatapb.TabletType_REPLICA } - if err := agent.fixSemiSync(tt); err != nil { + if err := tm.fixSemiSync(tt); err != nil { return err } - if err := agent.MysqlDaemon.SetSlavePosition(ctx, pos); err != nil { + if err := tm.MysqlDaemon.SetSlavePosition(ctx, pos); err != nil { return err } - if err := agent.MysqlDaemon.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { + if err := tm.MysqlDaemon.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), false /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { return err } // wait until we get the replicated row, or our context times out - return agent.MysqlDaemon.WaitForReparentJournal(ctx, timeCreatedNS) + return tm.MysqlDaemon.WaitForReparentJournal(ctx, timeCreatedNS) } // DemoteMaster prepares a MASTER tablet to give up mastership to another tablet. @@ -306,25 +306,25 @@ func (agent *TabletManager) InitSlave(ctx context.Context, parent *topodatapb.Ta // or on a tablet that already transitioned to REPLICA. // // If a step fails in the middle, it will try to undo any changes it made. -func (agent *TabletManager) DemoteMaster(ctx context.Context) (string, error) { +func (tm *TabletManager) DemoteMaster(ctx context.Context) (string, error) { // The public version always reverts on partial failure. - return agent.demoteMaster(ctx, true /* revertPartialFailure */) + return tm.demoteMaster(ctx, true /* revertPartialFailure */) } // demoteMaster implements DemoteMaster with an additional, private option. // // If revertPartialFailure is true, and a step fails in the middle, it will try // to undo any changes it made. -func (agent *TabletManager) demoteMaster(ctx context.Context, revertPartialFailure bool) (replicationPosition string, finalErr error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) demoteMaster(ctx context.Context, revertPartialFailure bool) (replicationPosition string, finalErr error) { + if err := tm.lock(ctx); err != nil { return "", err } - defer agent.unlock() + defer tm.unlock() - tablet := agent.Tablet() + tablet := tm.Tablet() wasMaster := tablet.Type == topodatapb.TabletType_MASTER - wasServing := agent.QueryServiceControl.IsServing() - wasReadOnly, err := agent.MysqlDaemon.IsReadOnly() + wasServing := tm.QueryServiceControl.IsServing() + wasReadOnly, err := tm.MysqlDaemon.IsReadOnly() if err != nil { return "", err } @@ -338,10 +338,10 @@ func (agent *TabletManager) demoteMaster(ctx context.Context, revertPartialFailu // Tell Orchestrator we're stopped on purpose for demotion. // This is a best effort task, so run it in a goroutine. go func() { - if agent.orc == nil { + if tm.orc == nil { return } - if err := agent.orc.BeginMaintenance(agent.Tablet(), "vttablet has been told to DemoteMaster"); err != nil { + if err := tm.orc.BeginMaintenance(tm.Tablet(), "vttablet has been told to DemoteMaster"); err != nil { log.Warningf("Orchestrator BeginMaintenance failed: %v", err) } }() @@ -352,12 +352,12 @@ func (agent *TabletManager) demoteMaster(ctx context.Context, revertPartialFailu // considered successful. If we are already not serving, this will be // idempotent. log.Infof("DemoteMaster disabling query service") - if _ /* state changed */, err := agent.QueryServiceControl.SetServingType(tablet.Type, false, nil); err != nil { + if _ /* state changed */, err := tm.QueryServiceControl.SetServingType(tablet.Type, false, nil); err != nil { return "", vterrors.Wrap(err, "SetServingType(serving=false) failed") } defer func() { if finalErr != nil && revertPartialFailure && wasServing { - if _ /* state changed */, err := agent.QueryServiceControl.SetServingType(tablet.Type, true, nil); err != nil { + if _ /* state changed */, err := tm.QueryServiceControl.SetServingType(tablet.Type, true, nil); err != nil { log.Warningf("SetServingType(serving=true) failed during revert: %v", err) } } @@ -370,38 +370,38 @@ func (agent *TabletManager) demoteMaster(ctx context.Context, revertPartialFailu // idempotent. if *setSuperReadOnly { // Setting super_read_only also sets read_only - if err := agent.MysqlDaemon.SetSuperReadOnly(true); err != nil { + if err := tm.MysqlDaemon.SetSuperReadOnly(true); err != nil { return "", err } } else { - if err := agent.MysqlDaemon.SetReadOnly(true); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(true); err != nil { return "", err } } defer func() { if finalErr != nil && revertPartialFailure && !wasReadOnly { // setting read_only OFF will also set super_read_only OFF if it was set - if err := agent.MysqlDaemon.SetReadOnly(false); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { log.Warningf("SetReadOnly(false) failed during revert: %v", err) } } }() // If using semi-sync, we need to disable master-side. - if err := agent.fixSemiSync(topodatapb.TabletType_REPLICA); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_REPLICA); err != nil { return "", err } defer func() { if finalErr != nil && revertPartialFailure && wasMaster { // enable master-side semi-sync again - if err := agent.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { log.Warningf("fixSemiSync(MASTER) failed during revert: %v", err) } } }() // Return the current replication position. - pos, err := agent.MysqlDaemon.MasterPosition() + pos, err := tm.MysqlDaemon.MasterPosition() if err != nil { return "", err } @@ -411,26 +411,26 @@ func (agent *TabletManager) demoteMaster(ctx context.Context, revertPartialFailu // UndoDemoteMaster reverts a previous call to DemoteMaster // it sets read-only to false, fixes semi-sync // and returns its master position. -func (agent *TabletManager) UndoDemoteMaster(ctx context.Context) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) UndoDemoteMaster(ctx context.Context) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() // If using semi-sync, we need to enable master-side. - if err := agent.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { return err } // Now, set the server read-only false. - if err := agent.MysqlDaemon.SetReadOnly(false); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { return err } // Update serving graph - tablet := agent.Tablet() + tablet := tm.Tablet() log.Infof("UndoDemoteMaster re-enabling query service") - if _ /* state changed */, err := agent.QueryServiceControl.SetServingType(tablet.Type, true, nil); err != nil { + if _ /* state changed */, err := tm.QueryServiceControl.SetServingType(tablet.Type, true, nil); err != nil { return vterrors.Wrap(err, "SetServingType(serving=true) failed") } @@ -441,36 +441,36 @@ func (agent *TabletManager) UndoDemoteMaster(ctx context.Context) error { // replication up to the provided point, and then makes the slave the // shard master. // Deprecated -func (agent *TabletManager) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { + if err := tm.lock(ctx); err != nil { return "", err } - defer agent.unlock() + defer tm.unlock() pos, err := mysql.DecodePosition(position) if err != nil { return "", err } - if err := agent.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { + if err := tm.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { return "", err } - pos, err = agent.MysqlDaemon.Promote(agent.hookExtraEnv()) + pos, err = tm.MysqlDaemon.Promote(tm.hookExtraEnv()) if err != nil { return "", err } // If using semi-sync, we need to enable it before going read-write. - if err := agent.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { return "", err } - if err := agent.MysqlDaemon.SetReadOnly(false); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { return "", err } - if err := agent.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { return "", err } @@ -478,46 +478,46 @@ func (agent *TabletManager) PromoteSlaveWhenCaughtUp(ctx context.Context, positi } // SlaveWasPromoted promotes a slave to master, no questions asked. -func (agent *TabletManager) SlaveWasPromoted(ctx context.Context) error { - return agent.ChangeType(ctx, topodatapb.TabletType_MASTER) +func (tm *TabletManager) SlaveWasPromoted(ctx context.Context) error { + return tm.ChangeType(ctx, topodatapb.TabletType_MASTER) } // SetMaster sets replication master, and waits for the // reparent_journal table entry up to context timeout -func (agent *TabletManager) SetMaster(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) SetMaster(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() - return agent.setMasterLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartSlave) + return tm.setMasterLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartSlave) } -func (agent *TabletManager) setMasterRepairReplication(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { - parent, err := agent.TopoServer.GetTablet(ctx, parentAlias) +func (tm *TabletManager) setMasterRepairReplication(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { + parent, err := tm.TopoServer.GetTablet(ctx, parentAlias) if err != nil { return err } - ctx, unlock, lockErr := agent.TopoServer.LockShard(ctx, parent.Tablet.GetKeyspace(), parent.Tablet.GetShard(), fmt.Sprintf("repairReplication to %v as parent)", topoproto.TabletAliasString(parentAlias))) + ctx, unlock, lockErr := tm.TopoServer.LockShard(ctx, parent.Tablet.GetKeyspace(), parent.Tablet.GetShard(), fmt.Sprintf("repairReplication to %v as parent)", topoproto.TabletAliasString(parentAlias))) if lockErr != nil { return lockErr } defer unlock(&err) - return agent.setMasterLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartSlave) + return tm.setMasterLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartSlave) } -func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { +func (tm *TabletManager) setMasterLocked(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) (err error) { // End orchestrator maintenance at the end of fixing replication. // This is a best effort operation, so it should happen in a goroutine defer func() { go func() { - if agent.orc == nil { + if tm.orc == nil { return } - if err := agent.orc.EndMaintenance(agent.Tablet()); err != nil { + if err := tm.orc.EndMaintenance(tm.Tablet()); err != nil { log.Warningf("Orchestrator EndMaintenance failed: %v", err) } }() @@ -529,17 +529,17 @@ func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *to // steps fail below. // Note it is important to check for MASTER here so that we don't // unintentionally change the type of RDONLY tablets - tablet := agent.Tablet() + tablet := tm.Tablet() if tablet.Type == topodatapb.TabletType_MASTER { tablet.Type = topodatapb.TabletType_REPLICA tablet.MasterTermStartTime = nil - agent.updateState(ctx, tablet, "setMasterLocked") + tm.updateState(ctx, tablet, "setMasterLocked") } // See if we were replicating at all, and should be replicating. wasReplicating := false shouldbeReplicating := false - status, err := agent.MysqlDaemon.SlaveStatus() + status, err := tm.MysqlDaemon.SlaveStatus() if err == mysql.ErrNotSlave { // This is a special error that means we actually succeeded in reading // the status, but the status is empty because replication is not @@ -563,16 +563,16 @@ func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *to // If using semi-sync, we need to enable it before connecting to master. // If we are currently MASTER, assume we are about to become REPLICA. - tabletType := agent.Tablet().Type + tabletType := tm.Tablet().Type if tabletType == topodatapb.TabletType_MASTER { tabletType = topodatapb.TabletType_REPLICA } - if err := agent.fixSemiSync(tabletType); err != nil { + if err := tm.fixSemiSync(tabletType); err != nil { return err } // Update the master address only if needed. // We don't want to interrupt replication for no reason. - parent, err := agent.TopoServer.GetTablet(ctx, parentAlias) + parent, err := tm.TopoServer.GetTablet(ctx, parentAlias) if err != nil { return err } @@ -580,16 +580,16 @@ func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *to masterPort := int(parent.Tablet.MysqlPort) if status.MasterHost != masterHost || status.MasterPort != masterPort { // This handles both changing the address and starting replication. - if err := agent.MysqlDaemon.SetMaster(ctx, masterHost, masterPort, wasReplicating, shouldbeReplicating); err != nil { - if err := agent.handleRelayLogError(err); err != nil { + if err := tm.MysqlDaemon.SetMaster(ctx, masterHost, masterPort, wasReplicating, shouldbeReplicating); err != nil { + if err := tm.handleRelayLogError(err); err != nil { return err } } } else if shouldbeReplicating { // The address is correct. Just start replication if needed. if !status.SlaveRunning() { - if err := agent.MysqlDaemon.StartSlave(agent.hookExtraEnv()); err != nil { - if err := agent.handleRelayLogError(err); err != nil { + if err := tm.MysqlDaemon.StartSlave(tm.hookExtraEnv()); err != nil { + if err := tm.handleRelayLogError(err); err != nil { return err } } @@ -606,12 +606,12 @@ func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *to if err != nil { return err } - if err := agent.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { + if err := tm.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { return err } } if timeCreatedNS != 0 { - if err := agent.MysqlDaemon.WaitForReparentJournal(ctx, timeCreatedNS); err != nil { + if err := tm.MysqlDaemon.WaitForReparentJournal(ctx, timeCreatedNS); err != nil { return err } } @@ -621,35 +621,35 @@ func (agent *TabletManager) setMasterLocked(ctx context.Context, parentAlias *to } // SlaveWasRestarted updates the parent record for a tablet. -func (agent *TabletManager) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error { + if err := tm.lock(ctx); err != nil { return err } - defer agent.unlock() + defer tm.unlock() // Only change type of former MASTER tablets. // Don't change type of RDONLY - tablet := agent.Tablet() + tablet := tm.Tablet() if tablet.Type != topodatapb.TabletType_MASTER { return nil } tablet.Type = topodatapb.TabletType_MASTER tablet.MasterTermStartTime = nil - agent.updateState(ctx, tablet, "SlaveWasRestarted") - agent.runHealthCheckLocked() + tm.updateState(ctx, tablet, "SlaveWasRestarted") + tm.runHealthCheckLocked() return nil } // StopReplicationAndGetStatus stops MySQL replication, and returns the // current status. -func (agent *TabletManager) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { + if err := tm.lock(ctx); err != nil { return nil, err } - defer agent.unlock() + defer tm.unlock() // get the status before we stop replication - rs, err := agent.MysqlDaemon.SlaveStatus() + rs, err := tm.MysqlDaemon.SlaveStatus() if err != nil { return nil, vterrors.Wrap(err, "before status failed") } @@ -657,11 +657,11 @@ func (agent *TabletManager) StopReplicationAndGetStatus(ctx context.Context) (*r // no replication is running, just return what we got return mysql.SlaveStatusToProto(rs), nil } - if err := agent.stopSlaveLocked(ctx); err != nil { + if err := tm.stopSlaveLocked(ctx); err != nil { return nil, vterrors.Wrap(err, "stop slave failed") } // now patch in the current position - rs.Position, err = agent.MysqlDaemon.MasterPosition() + rs.Position, err = tm.MysqlDaemon.MasterPosition() if err != nil { return nil, vterrors.Wrap(err, "after position failed") } @@ -669,29 +669,29 @@ func (agent *TabletManager) StopReplicationAndGetStatus(ctx context.Context) (*r } // PromoteReplica makes the current tablet the master -func (agent *TabletManager) PromoteReplica(ctx context.Context) (string, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) PromoteReplica(ctx context.Context) (string, error) { + if err := tm.lock(ctx); err != nil { return "", err } - defer agent.unlock() + defer tm.unlock() - pos, err := agent.MysqlDaemon.Promote(agent.hookExtraEnv()) + pos, err := tm.MysqlDaemon.Promote(tm.hookExtraEnv()) if err != nil { return "", err } // If using semi-sync, we need to enable it before going read-write. - if err := agent.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { return "", err } - if err := agent.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { return "", err } // We call SetReadOnly only after the topo has been updated to avoid // situations where two tablets are master at the DB level but not at the vitess level - if err := agent.MysqlDaemon.SetReadOnly(false); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { return "", err } @@ -700,28 +700,28 @@ func (agent *TabletManager) PromoteReplica(ctx context.Context) (string, error) // PromoteSlave makes the current tablet the master // Deprecated -func (agent *TabletManager) PromoteSlave(ctx context.Context) (string, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) PromoteSlave(ctx context.Context) (string, error) { + if err := tm.lock(ctx); err != nil { return "", err } - defer agent.unlock() + defer tm.unlock() - pos, err := agent.MysqlDaemon.Promote(agent.hookExtraEnv()) + pos, err := tm.MysqlDaemon.Promote(tm.hookExtraEnv()) if err != nil { return "", err } // If using semi-sync, we need to enable it before going read-write. - if err := agent.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { + if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { return "", err } // Set the server read-write - if err := agent.MysqlDaemon.SetReadOnly(false); err != nil { + if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { return "", err } - if err := agent.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { + if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { return "", err } @@ -737,7 +737,7 @@ func isMasterEligible(tabletType topodatapb.TabletType) bool { return false } -func (agent *TabletManager) fixSemiSync(tabletType topodatapb.TabletType) error { +func (tm *TabletManager) fixSemiSync(tabletType topodatapb.TabletType) error { if !*enableSemiSync { // Semi-sync handling is not enabled. return nil @@ -746,15 +746,15 @@ func (agent *TabletManager) fixSemiSync(tabletType topodatapb.TabletType) error // Only enable if we're eligible for becoming master (REPLICA type). // Ineligible slaves (RDONLY) shouldn't ACK because we'll never promote them. if !isMasterEligible(tabletType) { - return agent.MysqlDaemon.SetSemiSyncEnabled(false, false) + return tm.MysqlDaemon.SetSemiSyncEnabled(false, false) } // Always enable slave-side since it doesn't hurt to keep it on for a master. // The master-side needs to be off for a slave, or else it will get stuck. - return agent.MysqlDaemon.SetSemiSyncEnabled(tabletType == topodatapb.TabletType_MASTER, true) + return tm.MysqlDaemon.SetSemiSyncEnabled(tabletType == topodatapb.TabletType_MASTER, true) } -func (agent *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.TabletType) error { +func (tm *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.TabletType) error { if !*enableSemiSync { // Semi-sync handling is not enabled. return nil @@ -767,14 +767,14 @@ func (agent *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.Tabl return nil } - if err := agent.fixSemiSync(tabletType); err != nil { + if err := tm.fixSemiSync(tabletType); err != nil { return vterrors.Wrapf(err, "failed to fixSemiSync(%v)", tabletType) } // If replication is running, but the status is wrong, // we should restart replication. First, let's make sure // replication is running. - status, err := agent.MysqlDaemon.SlaveStatus() + status, err := tm.MysqlDaemon.SlaveStatus() if err != nil { // Replication is not configured, nothing to do. return nil @@ -785,7 +785,7 @@ func (agent *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.Tabl } shouldAck := isMasterEligible(tabletType) - acking, err := agent.MysqlDaemon.SemiSyncSlaveStatus() + acking, err := tm.MysqlDaemon.SemiSyncSlaveStatus() if err != nil { return vterrors.Wrap(err, "failed to get SemiSyncSlaveStatus") } @@ -795,22 +795,22 @@ func (agent *TabletManager) fixSemiSyncAndReplication(tabletType topodatapb.Tabl // We need to restart replication log.Infof("Restarting replication for semi-sync flag change to take effect from %v to %v", acking, shouldAck) - if err := agent.MysqlDaemon.StopSlave(agent.hookExtraEnv()); err != nil { + if err := tm.MysqlDaemon.StopSlave(tm.hookExtraEnv()); err != nil { return vterrors.Wrap(err, "failed to StopSlave") } - if err := agent.MysqlDaemon.StartSlave(agent.hookExtraEnv()); err != nil { + if err := tm.MysqlDaemon.StartSlave(tm.hookExtraEnv()); err != nil { return vterrors.Wrap(err, "failed to StartSlave") } return nil } -func (agent *TabletManager) handleRelayLogError(err error) error { +func (tm *TabletManager) handleRelayLogError(err error) error { // attempt to fix this error: // Slave failed to initialize relay log info structure from the repository (errno 1872) (sqlstate HY000) during query: START SLAVE // see https://bugs.mysql.com/bug.php?id=83713 or https://github.com/vitessio/vitess/issues/5067 if strings.Contains(err.Error(), "Slave failed to initialize relay log info structure from the repository") { // Stop, reset and start slave again to resolve this error - if err := agent.MysqlDaemon.RestartSlave(agent.hookExtraEnv()); err != nil { + if err := tm.MysqlDaemon.RestartSlave(tm.hookExtraEnv()); err != nil { return err } return nil diff --git a/go/vt/vttablet/tabletmanager/rpc_schema.go b/go/vt/vttablet/tabletmanager/rpc_schema.go index c1682f99d50..bd39775f28d 100644 --- a/go/vt/vttablet/tabletmanager/rpc_schema.go +++ b/go/vt/vttablet/tabletmanager/rpc_schema.go @@ -30,15 +30,15 @@ import ( ) // GetSchema returns the schema. -func (agent *TabletManager) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) { - return agent.MysqlDaemon.GetSchema(ctx, topoproto.TabletDbName(agent.Tablet()), tables, excludeTables, includeViews) +func (tm *TabletManager) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) { + return tm.MysqlDaemon.GetSchema(ctx, topoproto.TabletDbName(tm.Tablet()), tables, excludeTables, includeViews) } // ReloadSchema will reload the schema // This doesn't need the action mutex because periodic schema reloads happen // in the background anyway. -func (agent *TabletManager) ReloadSchema(ctx context.Context, waitPosition string) error { - if agent.DBConfigs.IsZero() { +func (tm *TabletManager) ReloadSchema(ctx context.Context, waitPosition string) error { + if tm.DBConfigs.IsZero() { // we skip this for test instances that can't connect to the DB anyway return nil } @@ -49,46 +49,46 @@ func (agent *TabletManager) ReloadSchema(ctx context.Context, waitPosition strin return vterrors.Wrapf(err, "ReloadSchema: can't parse wait position (%q)", waitPosition) } log.Infof("ReloadSchema: waiting for replication position: %v", waitPosition) - if err := agent.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { + if err := tm.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { return err } } log.Infof("ReloadSchema requested via RPC") - return agent.QueryServiceControl.ReloadSchema(ctx) + return tm.QueryServiceControl.ReloadSchema(ctx) } // PreflightSchema will try out the schema changes in "changes". -func (agent *TabletManager) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) { + if err := tm.lock(ctx); err != nil { return nil, err } - defer agent.unlock() + defer tm.unlock() // get the db name from the tablet - dbName := topoproto.TabletDbName(agent.Tablet()) + dbName := topoproto.TabletDbName(tm.Tablet()) // and preflight the change - return agent.MysqlDaemon.PreflightSchemaChange(ctx, dbName, changes) + return tm.MysqlDaemon.PreflightSchemaChange(ctx, dbName, changes) } // ApplySchema will apply a schema change -func (agent *TabletManager) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { - if err := agent.lock(ctx); err != nil { +func (tm *TabletManager) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { + if err := tm.lock(ctx); err != nil { return nil, err } - defer agent.unlock() + defer tm.unlock() // get the db name from the tablet - dbName := topoproto.TabletDbName(agent.Tablet()) + dbName := topoproto.TabletDbName(tm.Tablet()) // apply the change - scr, err := agent.MysqlDaemon.ApplySchemaChange(ctx, dbName, change) + scr, err := tm.MysqlDaemon.ApplySchemaChange(ctx, dbName, change) if err != nil { return nil, err } // and if it worked, reload the schema - agent.ReloadSchema(ctx, "") + tm.ReloadSchema(ctx, "") return scr, nil } diff --git a/go/vt/vttablet/tabletmanager/rpc_server.go b/go/vt/vttablet/tabletmanager/rpc_server.go index 694da24908e..22cea57f8ca 100644 --- a/go/vt/vttablet/tabletmanager/rpc_server.go +++ b/go/vt/vttablet/tabletmanager/rpc_server.go @@ -36,16 +36,16 @@ import ( // lock is used at the beginning of an RPC call, to lock the // action mutex. It returns ctx.Err() if <-ctx.Done() after the lock. -func (agent *TabletManager) lock(ctx context.Context) error { - agent.actionMutex.Lock() - agent.actionMutexLocked = true +func (tm *TabletManager) lock(ctx context.Context) error { + tm.actionMutex.Lock() + tm.actionMutexLocked = true // After we take the lock (which could take a long time), we // check the client is still here. select { case <-ctx.Done(): - agent.actionMutexLocked = false - agent.actionMutex.Unlock() + tm.actionMutexLocked = false + tm.actionMutex.Unlock() return ctx.Err() default: return nil @@ -53,23 +53,23 @@ func (agent *TabletManager) lock(ctx context.Context) error { } // unlock is the symmetrical action to lock. -func (agent *TabletManager) unlock() { - agent.actionMutexLocked = false - agent.actionMutex.Unlock() +func (tm *TabletManager) unlock() { + tm.actionMutexLocked = false + tm.actionMutex.Unlock() } // checkLock checks we have locked the actionMutex. -func (agent *TabletManager) checkLock() { - if !agent.actionMutexLocked { +func (tm *TabletManager) checkLock() { + if !tm.actionMutexLocked { panic("programming error: this action should have taken the actionMutex") } } // HandleRPCPanic is part of the RPCTM interface. -func (agent *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { +func (tm *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { // panic handling if x := recover(); x != nil { - log.Errorf("TabletManager.%v(%v) on %v panic: %v\n%s", name, args, topoproto.TabletAliasString(agent.TabletAlias), x, tb.Stack(4)) + log.Errorf("TabletManager.%v(%v) on %v panic: %v\n%s", name, args, topoproto.TabletAliasString(tm.TabletAlias), x, tb.Stack(4)) *err = fmt.Errorf("caught panic during %v: %v", name, x) return } @@ -88,11 +88,11 @@ func (agent *TabletManager) HandleRPCPanic(ctx context.Context, name string, arg if *err != nil { // error case - log.Warningf("TabletManager.%v(%v)(on %v from %v) error: %v", name, args, topoproto.TabletAliasString(agent.TabletAlias), from, (*err).Error()) - *err = vterrors.Wrapf(*err, "TabletManager.%v on %v error: %v", name, topoproto.TabletAliasString(agent.TabletAlias), (*err).Error()) + log.Warningf("TabletManager.%v(%v)(on %v from %v) error: %v", name, args, topoproto.TabletAliasString(tm.TabletAlias), from, (*err).Error()) + *err = vterrors.Wrapf(*err, "TabletManager.%v on %v error: %v", name, topoproto.TabletAliasString(tm.TabletAlias), (*err).Error()) } else { // success case - log.Infof("TabletManager.%v(%v)(on %v from %v): %#v", name, args, topoproto.TabletAliasString(agent.TabletAlias), from, reply) + log.Infof("TabletManager.%v(%v)(on %v from %v): %#v", name, args, topoproto.TabletAliasString(tm.TabletAlias), from, reply) } } @@ -104,8 +104,8 @@ type RegisterQueryService func(*TabletManager) var RegisterQueryServices []RegisterQueryService // registerQueryService will register all the instances. -func (agent *TabletManager) registerQueryService() { +func (tm *TabletManager) registerQueryService() { for _, f := range RegisterQueryServices { - f(agent) + f(tm) } } diff --git a/go/vt/vttablet/tabletmanager/shard_sync.go b/go/vt/vttablet/tabletmanager/shard_sync.go index 15543be210d..b6917c04c55 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync.go +++ b/go/vt/vttablet/tabletmanager/shard_sync.go @@ -48,12 +48,12 @@ var ( // This goroutine gets woken up for shard record changes by maintaining a // topo watch on the shard record. It gets woken up for tablet state changes by // a notification signal from setTablet(). -func (agent *TabletManager) shardSyncLoop(ctx context.Context) { +func (tm *TabletManager) shardSyncLoop(ctx context.Context) { // Make a copy of the channels so we don't race when stopShardSync() clears them. - agent.mutex.Lock() - notifyChan := agent._shardSyncChan - doneChan := agent._shardSyncDone - agent.mutex.Unlock() + tm.mutex.Lock() + notifyChan := tm._shardSyncChan + doneChan := tm._shardSyncDone + tm.mutex.Unlock() defer close(doneChan) @@ -97,12 +97,12 @@ func (agent *TabletManager) shardSyncLoop(ctx context.Context) { retryChan = nil // Get the latest internal tablet value, representing what we think we are. - tablet := agent.Tablet() + tablet := tm.Tablet() switch tablet.Type { case topodatapb.TabletType_MASTER: // If we think we're master, check if we need to update the shard record. - masterAlias, err := syncShardMaster(ctx, agent.TopoServer, tablet, agent.masterTermStartTime()) + masterAlias, err := syncShardMaster(ctx, tm.TopoServer, tablet, tm.masterTermStartTime()) if err != nil { log.Errorf("Failed to sync shard record: %v", err) // Start retry timer and go back to sleep. @@ -111,7 +111,7 @@ func (agent *TabletManager) shardSyncLoop(ctx context.Context) { } if !topoproto.TabletAliasEqual(masterAlias, tablet.Alias) { // Another master has taken over while we still think we're master. - if err := agent.abortMasterTerm(ctx, masterAlias); err != nil { + if err := tm.abortMasterTerm(ctx, masterAlias); err != nil { log.Errorf("Failed to abort master term: %v", err) // Start retry timer and go back to sleep. retryChan = time.After(*shardSyncRetryDelay) @@ -128,7 +128,7 @@ func (agent *TabletManager) shardSyncLoop(ctx context.Context) { // We already have an active watch. Nothing to do. continue } - if err := shardWatch.start(ctx, agent.TopoServer, tablet.Keyspace, tablet.Shard); err != nil { + if err := shardWatch.start(ctx, tm.TopoServer, tablet.Keyspace, tablet.Shard); err != nil { log.Errorf("Failed to start shard watch: %v", err) // Start retry timer and go back to sleep. retryChan = time.After(*shardSyncRetryDelay) @@ -193,17 +193,17 @@ func syncShardMaster(ctx context.Context, ts *topo.Server, tablet *topodatapb.Ta // // If active reparents are disabled, we don't touch our MySQL. // We just directly update our tablet type to REPLICA. -func (agent *TabletManager) abortMasterTerm(ctx context.Context, masterAlias *topodatapb.TabletAlias) error { +func (tm *TabletManager) abortMasterTerm(ctx context.Context, masterAlias *topodatapb.TabletAlias) error { masterAliasStr := topoproto.TabletAliasString(masterAlias) - log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, agent.BaseTabletType) + log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, tm.BaseTabletType) if *mysqlctl.DisableActiveReparents { // Don't touch anything at the MySQL level. Just update tablet state. log.Infof("Active reparents are disabled; updating tablet state only.") changeTypeCtx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancel() - if err := agent.ChangeType(changeTypeCtx, agent.BaseTabletType); err != nil { - return vterrors.Wrapf(err, "failed to change type to %v", agent.BaseTabletType) + if err := tm.ChangeType(changeTypeCtx, tm.BaseTabletType); err != nil { + return vterrors.Wrapf(err, "failed to change type to %v", tm.BaseTabletType) } return nil } @@ -216,50 +216,50 @@ func (agent *TabletManager) abortMasterTerm(ctx context.Context, masterAlias *to log.Infof("Active reparents are enabled; converting MySQL to replica.") demoteMasterCtx, cancelDemoteMaster := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancelDemoteMaster() - if _, err := agent.demoteMaster(demoteMasterCtx, false /* revertPartialFailure */); err != nil { + if _, err := tm.demoteMaster(demoteMasterCtx, false /* revertPartialFailure */); err != nil { return vterrors.Wrap(err, "failed to demote master") } setMasterCtx, cancelSetMaster := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancelSetMaster() log.Infof("Attempting to reparent self to new master %v.", masterAliasStr) - if err := agent.SetMaster(setMasterCtx, masterAlias, 0, "", true); err != nil { + if err := tm.SetMaster(setMasterCtx, masterAlias, 0, "", true); err != nil { return vterrors.Wrap(err, "failed to reparent self to new master") } return nil } -func (agent *TabletManager) startShardSync() { +func (tm *TabletManager) startShardSync() { // Use a buffer size of 1 so we can remember we need to check the state // even if the receiver is busy. We can drop any additional send attempts // if the buffer is full because all we care about is that the receiver will // be told it needs to recheck the state. - agent.mutex.Lock() - agent._shardSyncChan = make(chan struct{}, 1) - agent._shardSyncDone = make(chan struct{}) + tm.mutex.Lock() + tm._shardSyncChan = make(chan struct{}, 1) + tm._shardSyncDone = make(chan struct{}) ctx, cancel := context.WithCancel(context.Background()) - agent._shardSyncCancel = cancel - agent.mutex.Unlock() + tm._shardSyncCancel = cancel + tm.mutex.Unlock() // Queue up a pending notification to force the loop to run once at startup. - agent.notifyShardSync() + tm.notifyShardSync() // Start the sync loop in the background. - go agent.shardSyncLoop(ctx) + go tm.shardSyncLoop(ctx) } -func (agent *TabletManager) stopShardSync() { +func (tm *TabletManager) stopShardSync() { var doneChan <-chan struct{} - agent.mutex.Lock() - if agent._shardSyncCancel != nil { - agent._shardSyncCancel() - agent._shardSyncCancel = nil - agent._shardSyncChan = nil + tm.mutex.Lock() + if tm._shardSyncCancel != nil { + tm._shardSyncCancel() + tm._shardSyncCancel = nil + tm._shardSyncChan = nil - doneChan = agent._shardSyncDone - agent._shardSyncDone = nil + doneChan = tm._shardSyncDone + tm._shardSyncDone = nil } - agent.mutex.Unlock() + tm.mutex.Unlock() // If the shard sync loop was running, wait for it to fully stop. if doneChan != nil { @@ -267,28 +267,28 @@ func (agent *TabletManager) stopShardSync() { } } -func (agent *TabletManager) notifyShardSync() { +func (tm *TabletManager) notifyShardSync() { // If this is called before the shard sync is started, do nothing. - agent.mutex.Lock() - defer agent.mutex.Unlock() + tm.mutex.Lock() + defer tm.mutex.Unlock() - if agent._shardSyncChan == nil { + if tm._shardSyncChan == nil { return } // Try to send. If the channel buffer is full, it means a notification is // already pending, so we don't need to do anything. select { - case agent._shardSyncChan <- struct{}{}: + case tm._shardSyncChan <- struct{}{}: default: } } -func (agent *TabletManager) masterTermStartTime() time.Time { - agent.pubMu.Lock() - defer agent.pubMu.Unlock() - if agent.tablet == nil { +func (tm *TabletManager) masterTermStartTime() time.Time { + tm.pubMu.Lock() + defer tm.pubMu.Unlock() + if tm.tablet == nil { return time.Time{} } - return logutil.ProtoToTime(agent.tablet.MasterTermStartTime) + return logutil.ProtoToTime(tm.tablet.MasterTermStartTime) } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index aec42f0a15d..4f0c49bbbf0 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -16,7 +16,7 @@ limitations under the License. package tabletmanager -// This file handles the agent state changes. +// This file handles the tm state changes. import ( "flag" @@ -60,11 +60,11 @@ var ( const blacklistQueryRules string = "BlacklistQueryRules" // loadBlacklistRules loads and builds the blacklist query rules -func (agent *TabletManager) loadBlacklistRules(ctx context.Context, tablet *topodatapb.Tablet, blacklistedTables []string) (err error) { +func (tm *TabletManager) loadBlacklistRules(ctx context.Context, tablet *topodatapb.Tablet, blacklistedTables []string) (err error) { blacklistRules := rules.New() if len(blacklistedTables) > 0 { // tables, first resolve wildcards - tables, err := mysqlctl.ResolveTables(ctx, agent.MysqlDaemon, topoproto.TabletDbName(tablet), blacklistedTables) + tables, err := mysqlctl.ResolveTables(ctx, tm.MysqlDaemon, topoproto.TabletDbName(tablet), blacklistedTables) if err != nil { return err } @@ -81,7 +81,7 @@ func (agent *TabletManager) loadBlacklistRules(ctx context.Context, tablet *topo } } - loadRuleErr := agent.QueryServiceControl.SetQueryRules(blacklistQueryRules, blacklistRules) + loadRuleErr := tm.QueryServiceControl.SetQueryRules(blacklistQueryRules, blacklistRules) if loadRuleErr != nil { log.Warningf("Fail to load query rule set %s: %s", blacklistQueryRules, loadRuleErr) } @@ -91,21 +91,21 @@ func (agent *TabletManager) loadBlacklistRules(ctx context.Context, tablet *topo // lameduck changes the QueryServiceControl state to lameduck, // brodcasts the new health, then sleep for grace period, to give time // to clients to get the new status. -func (agent *TabletManager) lameduck(reason string) { +func (tm *TabletManager) lameduck(reason string) { log.Infof("TabletManager is entering lameduck, reason: %v", reason) - agent.QueryServiceControl.EnterLameduck() - agent.broadcastHealth() + tm.QueryServiceControl.EnterLameduck() + tm.broadcastHealth() time.Sleep(*gracePeriod) log.Infof("TabletManager is leaving lameduck") } -func (agent *TabletManager) broadcastHealth() { +func (tm *TabletManager) broadcastHealth() { // get the replication delays - agent.mutex.Lock() - replicationDelay := agent._replicationDelay - healthError := agent._healthy - healthyTime := agent._healthyTime - agent.mutex.Unlock() + tm.mutex.Lock() + replicationDelay := tm._replicationDelay + healthError := tm._healthy + healthyTime := tm._healthyTime + tm.mutex.Unlock() // send it to our observers // FIXME(alainjobart,liguo) add CpuUsage @@ -113,7 +113,7 @@ func (agent *TabletManager) broadcastHealth() { SecondsBehindMaster: uint32(replicationDelay.Seconds()), } stats.SecondsBehindMasterFilteredReplication, stats.BinlogPlayersCount = vreplication.StatusSummary() - stats.Qps = agent.QueryServiceControl.Stats().QPSRates.TotalRate() + stats.Qps = tm.QueryServiceControl.Stats().QPSRates.TotalRate() if healthError != nil { stats.HealthError = healthError.Error() } else { @@ -123,17 +123,17 @@ func (agent *TabletManager) broadcastHealth() { } } var ts int64 - terTime := agent.masterTermStartTime() + terTime := tm.masterTermStartTime() if !terTime.IsZero() { ts = terTime.Unix() } - go agent.QueryServiceControl.BroadcastHealth(ts, stats, *healthCheckInterval*3) + go tm.QueryServiceControl.BroadcastHealth(ts, stats, *healthCheckInterval*3) } // refreshTablet needs to be run after an action may have changed the current // state of the tablet. -func (agent *TabletManager) refreshTablet(ctx context.Context, reason string) error { - agent.checkLock() +func (tm *TabletManager) refreshTablet(ctx context.Context, reason string) error { + tm.checkLock() log.Infof("Executing post-action state refresh: %v", reason) span, ctx := trace.NewSpan(ctx, "TabletManager.refreshTablet") @@ -141,23 +141,23 @@ func (agent *TabletManager) refreshTablet(ctx context.Context, reason string) er defer span.Finish() // TODO(sougou): change this to specifically look for global topo changes. - tablet := agent.Tablet() - agent.changeCallback(ctx, tablet, tablet) + tablet := tm.Tablet() + tm.changeCallback(ctx, tablet, tablet) log.Infof("Done with post-action state refresh") return nil } // updateState will use the provided tablet record as the new tablet state, // the current tablet as a base, run changeCallback, and dispatch the event. -func (agent *TabletManager) updateState(ctx context.Context, newTablet *topodatapb.Tablet, reason string) { - oldTablet := agent.Tablet() +func (tm *TabletManager) updateState(ctx context.Context, newTablet *topodatapb.Tablet, reason string) { + oldTablet := tm.Tablet() if oldTablet == nil { oldTablet = &topodatapb.Tablet{} } log.Infof("Running tablet callback because: %v", reason) - agent.changeCallback(ctx, oldTablet, newTablet) - agent.setTablet(newTablet) - agent.publishState(ctx) + tm.changeCallback(ctx, oldTablet, newTablet) + tm.setTablet(newTablet) + tm.publishState(ctx) event.Dispatch(&events.StateChange{ OldTablet: *oldTablet, NewTablet: *newTablet, @@ -167,8 +167,8 @@ func (agent *TabletManager) updateState(ctx context.Context, newTablet *topodata // changeCallback is run after every action that might // have changed something in the tablet record or in the topology. -func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTablet *topodatapb.Tablet) { - agent.checkLock() +func (tm *TabletManager) changeCallback(ctx context.Context, oldTablet, newTablet *topodatapb.Tablet) { + tm.checkLock() span, ctx := trace.NewSpan(ctx, "TabletManager.changeCallback") defer span.Finish() @@ -186,7 +186,7 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa var blacklistedTables []string updateBlacklistedTables := true if allowQuery { - shardInfo, err = agent.TopoServer.GetShard(ctx, newTablet.Keyspace, newTablet.Shard) + shardInfo, err = tm.TopoServer.GetShard(ctx, newTablet.Keyspace, newTablet.Shard) if err != nil { log.Errorf("Cannot read shard for this tablet %v, might have inaccurate SourceShards and TabletControls: %v", newTablet.Alias, err) updateBlacklistedTables = false @@ -207,22 +207,22 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa disallowQueryService = disallowQueryReason } } else { - replicationDelay, healthErr := agent.HealthReporter.Report(true, true) + replicationDelay, healthErr := tm.HealthReporter.Report(true, true) if healthErr != nil { allowQuery = false disallowQueryReason = "unable to get health" } else { - agent.mutex.Lock() - agent._replicationDelay = replicationDelay - agent.mutex.Unlock() - if agent._replicationDelay > *unhealthyThreshold { + tm.mutex.Lock() + tm._replicationDelay = replicationDelay + tm.mutex.Unlock() + if tm._replicationDelay > *unhealthyThreshold { allowQuery = false disallowQueryReason = "replica tablet with unhealthy replication lag" } } } } - srvKeyspace, err := agent.TopoServer.GetSrvKeyspace(ctx, newTablet.Alias.Cell, newTablet.Keyspace) + srvKeyspace, err := tm.TopoServer.GetSrvKeyspace(ctx, newTablet.Alias.Cell, newTablet.Keyspace) if err != nil { log.Errorf("failed to get SrvKeyspace %v with: %v", newTablet.Keyspace, err) } else { @@ -255,13 +255,13 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa disallowQueryReason = fmt.Sprintf("not a serving tablet type(%v)", newTablet.Type) disallowQueryService = disallowQueryReason } - agent.setServicesDesiredState(disallowQueryService) + tm.setServicesDesiredState(disallowQueryService) if updateBlacklistedTables { - if err := agent.loadBlacklistRules(ctx, newTablet, blacklistedTables); err != nil { + if err := tm.loadBlacklistRules(ctx, newTablet, blacklistedTables); err != nil { // FIXME(alainjobart) how to handle this error? log.Errorf("Cannot update blacklisted tables rule: %v", err) } else { - agent.setBlacklistedTables(blacklistedTables) + tm.setBlacklistedTables(blacklistedTables) } } @@ -272,17 +272,17 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa newTablet.Type == topodatapb.TabletType_MASTER { // When promoting from replica to master, allow both master and replica // queries to be served during gracePeriod. - if _, err := agent.QueryServiceControl.SetServingType(newTablet.Type, + if _, err := tm.QueryServiceControl.SetServingType(newTablet.Type, true, []topodatapb.TabletType{oldTablet.Type}); err == nil { // If successful, broadcast to vtgate and then wait. - agent.broadcastHealth() + tm.broadcastHealth() time.Sleep(*gracePeriod) } else { log.Errorf("Can't start query service for MASTER+REPLICA mode: %v", err) } } - if stateChanged, err := agent.QueryServiceControl.SetServingType(newTablet.Type, true, nil); err == nil { + if stateChanged, err := tm.QueryServiceControl.SetServingType(newTablet.Type, true, nil); err == nil { // If the state changed, broadcast to vtgate. // (e.g. this happens when the tablet was already master, but it just // changed from NOT_SERVING to SERVING due to @@ -300,11 +300,11 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa *gracePeriod > 0 { // When a non-MASTER serving type is going SPARE, // put query service in lameduck during gracePeriod. - agent.lameduck(disallowQueryReason) + tm.lameduck(disallowQueryReason) } log.Infof("Disabling query service on type change, reason: %v", disallowQueryReason) - if stateChanged, err := agent.QueryServiceControl.SetServingType(newTablet.Type, false, nil); err == nil { + if stateChanged, err := tm.QueryServiceControl.SetServingType(newTablet.Type, false, nil); err == nil { // If the state changed, broadcast to vtgate. // (e.g. this happens when the tablet was already master, but it just // changed from SERVING to NOT_SERVING because filtered replication was @@ -319,9 +319,9 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa // UpdateStream needs to be started or stopped too. if topo.IsRunningUpdateStream(newTablet.Type) { - agent.UpdateStream.Enable() + tm.UpdateStream.Enable() } else { - agent.UpdateStream.Disable() + tm.UpdateStream.Disable() } // Update the stats to our current type. @@ -331,87 +331,87 @@ func (agent *TabletManager) changeCallback(ctx context.Context, oldTablet, newTa // See if we need to start or stop vreplication. if newTablet.Type == topodatapb.TabletType_MASTER { - if err := agent.VREngine.Open(agent.batchCtx); err != nil { + if err := tm.VREngine.Open(tm.batchCtx); err != nil { log.Errorf("Could not start VReplication engine: %v. Will keep retrying at health check intervals.", err) } else { log.Info("VReplication engine started") } } else { - agent.VREngine.Close() + tm.VREngine.Close() } // Broadcast health changes to vtgate immediately. if broadcastHealth { - agent.broadcastHealth() + tm.broadcastHealth() } } -func (agent *TabletManager) publishState(ctx context.Context) { - agent.pubMu.Lock() - defer agent.pubMu.Unlock() - log.Infof("Publishing state: %v", agent.tablet) +func (tm *TabletManager) publishState(ctx context.Context) { + tm.pubMu.Lock() + defer tm.pubMu.Unlock() + log.Infof("Publishing state: %v", tm.tablet) // If retry is in progress, there's nothing to do. - if agent.isPublishing { + if tm.isPublishing { return } // Common code path: publish immediately. ctx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancel() - _, err := agent.TopoServer.UpdateTabletFields(ctx, agent.TabletAlias, func(tablet *topodatapb.Tablet) error { - if err := topotools.CheckOwnership(tablet, agent.tablet); err != nil { + _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.TabletAlias, func(tablet *topodatapb.Tablet) error { + if err := topotools.CheckOwnership(tablet, tm.tablet); err != nil { log.Error(err) return topo.NewError(topo.NoUpdateNeeded, "") } - *tablet = *proto.Clone(agent.tablet).(*topodatapb.Tablet) + *tablet = *proto.Clone(tm.tablet).(*topodatapb.Tablet) return nil }) if err != nil { log.Errorf("Unable to publish state to topo, will keep retrying: %v", err) - agent.isPublishing = true + tm.isPublishing = true // Keep retrying until success. - go agent.retryPublish() + go tm.retryPublish() } } -func (agent *TabletManager) retryPublish() { - agent.pubMu.Lock() +func (tm *TabletManager) retryPublish() { + tm.pubMu.Lock() defer func() { - agent.isPublishing = false - agent.pubMu.Unlock() + tm.isPublishing = false + tm.pubMu.Unlock() }() for { // Retry immediately the first time because the previous failure might have been // due to an expired context. - ctx, cancel := context.WithTimeout(agent.batchCtx, *topo.RemoteOperationTimeout) - _, err := agent.TopoServer.UpdateTabletFields(ctx, agent.TabletAlias, func(tablet *topodatapb.Tablet) error { - if err := topotools.CheckOwnership(tablet, agent.tablet); err != nil { + ctx, cancel := context.WithTimeout(tm.batchCtx, *topo.RemoteOperationTimeout) + _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.TabletAlias, func(tablet *topodatapb.Tablet) error { + if err := topotools.CheckOwnership(tablet, tm.tablet); err != nil { log.Error(err) return topo.NewError(topo.NoUpdateNeeded, "") } - *tablet = *proto.Clone(agent.tablet).(*topodatapb.Tablet) + *tablet = *proto.Clone(tm.tablet).(*topodatapb.Tablet) return nil }) cancel() if err != nil { log.Errorf("Unable to publish state to topo, will keep retrying: %v", err) - agent.pubMu.Unlock() + tm.pubMu.Unlock() time.Sleep(*publishRetryInterval) - agent.pubMu.Lock() + tm.pubMu.Lock() continue } - log.Infof("Published state: %v", agent.tablet) + log.Infof("Published state: %v", tm.tablet) return } } -func (agent *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Duration) { +func (tm *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Duration) { var srvKeyspace *topodatapb.SrvKeyspace defer func() { log.Infof("Keyspace rebuilt: %v", keyspace) - agent.mutex.Lock() - defer agent.mutex.Unlock() - agent._srvKeyspace = srvKeyspace + tm.mutex.Lock() + defer tm.mutex.Unlock() + tm._srvKeyspace = srvKeyspace }() // RebuildKeyspace will fail until at least one tablet is up for every shard. @@ -420,14 +420,14 @@ func (agent *TabletManager) rebuildKeyspace(keyspace string, retryInterval time. for { if !firstTime { // If keyspace was rebuilt by someone else, we can just exit. - srvKeyspace, err = agent.TopoServer.GetSrvKeyspace(agent.batchCtx, agent.TabletAlias.Cell, keyspace) + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.TabletAlias.Cell, keyspace) if err == nil { return } } - err = topotools.RebuildKeyspace(agent.batchCtx, logutil.NewConsoleLogger(), agent.TopoServer, keyspace, []string{agent.TabletAlias.Cell}) + err = topotools.RebuildKeyspace(tm.batchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.TabletAlias.Cell}) if err == nil { - srvKeyspace, err = agent.TopoServer.GetSrvKeyspace(agent.batchCtx, agent.TabletAlias.Cell, keyspace) + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.TabletAlias.Cell, keyspace) if err == nil { return } @@ -440,18 +440,18 @@ func (agent *TabletManager) rebuildKeyspace(keyspace string, retryInterval time. } } -func (agent *TabletManager) findMysqlPort(retryInterval time.Duration) { +func (tm *TabletManager) findMysqlPort(retryInterval time.Duration) { for { time.Sleep(retryInterval) - mport, err := agent.MysqlDaemon.GetMysqlPort() + mport, err := tm.MysqlDaemon.GetMysqlPort() if err != nil { continue } log.Infof("Identified mysql port: %v", mport) - agent.pubMu.Lock() - agent.tablet.MysqlPort = mport - agent.pubMu.Unlock() - agent.publishState(agent.batchCtx) + tm.pubMu.Lock() + tm.tablet.MysqlPort = mport + tm.pubMu.Unlock() + tm.publishState(tm.batchCtx) return } } diff --git a/go/vt/vttablet/tabletmanager/state_change_test.go b/go/vt/vttablet/tabletmanager/state_change_test.go index 461d24701b9..c35837e9655 100644 --- a/go/vt/vttablet/tabletmanager/state_change_test.go +++ b/go/vt/vttablet/tabletmanager/state_change_test.go @@ -35,39 +35,39 @@ func TestPublishState(t *testing.T) { // code path. ctx := context.Background() - agent := createTestTM(ctx, t, nil) - ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tm := createTestTM(ctx, t, nil) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) - assert.Equal(t, agent.Tablet(), ttablet.Tablet) + assert.Equal(t, tm.Tablet(), ttablet.Tablet) - tab1 := agent.Tablet() + tab1 := tm.Tablet() tab1.Keyspace = "tab1" - agent.setTablet(tab1) - agent.publishState(ctx) - ttablet, err = agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tm.setTablet(tab1) + tm.publishState(ctx) + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) assert.Equal(t, tab1, ttablet.Tablet) - tab2 := agent.Tablet() + tab2 := tm.Tablet() tab2.Keyspace = "tab2" - agent.setTablet(tab2) - agent.retryPublish() - ttablet, err = agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tm.setTablet(tab2) + tm.retryPublish() + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) // If hostname doesn't match, it should not update. - tab3 := agent.Tablet() + tab3 := tm.Tablet() tab3.Hostname = "tab3" - agent.setTablet(tab3) - agent.publishState(ctx) - ttablet, err = agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tm.setTablet(tab3) + tm.publishState(ctx) + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) // Same for retryPublish. - agent.retryPublish() - ttablet, err = agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + tm.retryPublish() + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) } @@ -77,18 +77,18 @@ func TestFindMysqlPort(t *testing.T) { mysqlPortRetryInterval = 1 * time.Millisecond ctx := context.Background() - agent := createTestTM(ctx, t, nil) - err := agent.checkMysql(ctx) + tm := createTestTM(ctx, t, nil) + err := tm.checkMysql(ctx) require.NoError(t, err) - ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) assert.Equal(t, ttablet.MysqlPort, int32(0)) - agent.pubMu.Lock() - agent.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) - agent.pubMu.Unlock() + tm.pubMu.Lock() + tm.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) + tm.pubMu.Unlock() for i := 0; i < 10; i++ { - ttablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) require.NoError(t, err) if ttablet.MysqlPort == 3306 { return diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index d60f0e98d8e..603c9eaba2a 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -20,7 +20,7 @@ state, starts / stops all associated services (query service, update stream, binlog players, ...), and handles tabletmanager RPCs to update the state. -The agent is responsible for maintaining the tablet record in the +The tm is responsible for maintaining the tablet record in the topology server. Only 'vtctl DeleteTablet' should be run by other processes, everything else should ask the tablet server to make the change. @@ -117,7 +117,7 @@ func init() { statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) } -// TabletManager is the main class for the agent. +// TabletManager is the main class for the tm. type TabletManager struct { // The following fields are set during creation QueryServiceControl tabletserver.Controller @@ -133,8 +133,8 @@ type TabletManager struct { // when we transition back from something like MASTER. BaseTabletType topodatapb.TabletType - // batchCtx is given to the agent by its creator, and should be used for - // any background tasks spawned by the agent. + // batchCtx is given to the tm by its creator, and should be used for + // any background tasks spawned by the tm. batchCtx context.Context // History of the health checks, public so status @@ -142,7 +142,7 @@ type TabletManager struct { History *history.History // actionMutex is there to run only one action at a time. If - // both agent.actionMutex and agent.mutex needs to be taken, + // both tm.actionMutex and tm.mutex needs to be taken, // take actionMutex first. actionMutex sync.Mutex @@ -169,7 +169,7 @@ type TabletManager struct { // it should wake up and recheck the tablet state, to make sure it and the // shard record are in sync. // - // Call agent.notifyShardSync() instead of sending directly to this channel. + // Call tm.notifyShardSync() instead of sending directly to this channel. _shardSyncChan chan struct{} // _shardSyncDone is a channel for waiting until the shard sync goroutine @@ -190,7 +190,7 @@ type TabletManager struct { // blacklisting. _blacklistedTables []string - // if the agent is healthy, this is nil. Otherwise it contains + // if the tm is healthy, this is nil. Otherwise it contains // the reason we're not healthy. _healthy error @@ -223,7 +223,7 @@ type TabletManager struct { // NewTabletManager creates a new TabletManager and registers all the // associated services. // -// batchCtx is the context that the agent will use for any background tasks +// batchCtx is the context that the tm will use for any background tasks // it spawns. func NewTabletManager( batchCtx context.Context, @@ -234,7 +234,7 @@ func NewTabletManager( config *tabletenv.TabletConfig, mycnf *mysqlctl.Mycnf, port, gRPCPort int32, -) (agent *TabletManager, err error) { +) (tm *TabletManager, err error) { tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) if err != nil { @@ -242,7 +242,7 @@ func NewTabletManager( } config.DB.DBName = topoproto.TabletDbName(tablet) - agent = &TabletManager{ + tm = &TabletManager{ QueryServiceControl: queryServiceControl, HealthReporter: health.DefaultAggregator, batchCtx: batchCtx, @@ -257,47 +257,47 @@ func NewTabletManager( tablet: tablet, } - ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) + ctx, cancel := context.WithTimeout(tm.batchCtx, *initTimeout) defer cancel() - if err = agent.createKeyspaceShard(ctx); err != nil { + if err = tm.createKeyspaceShard(ctx); err != nil { return nil, err } - if err := agent.checkMastership(ctx); err != nil { + if err := tm.checkMastership(ctx); err != nil { return nil, err } - if err := agent.checkMysql(ctx); err != nil { + if err := tm.checkMysql(ctx); err != nil { return nil, err } - if err := agent.initTablet(ctx); err != nil { + if err := tm.initTablet(ctx); err != nil { return nil, err } - tablet = agent.Tablet() - err = agent.QueryServiceControl.InitDBConfig(querypb.Target{ + tablet = tm.Tablet() + err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type, - }, agent.DBConfigs) + }, tm.DBConfigs) if err != nil { return nil, vterrors.Wrap(err, "failed to InitDBConfig") } - agent.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) - servenv.OnRun(agent.registerQueryService) + tm.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) + servenv.OnRun(tm.registerQueryService) - agent.UpdateStream = binlog.NewUpdateStream(agent.TopoServer, tablet.Keyspace, agent.TabletAlias.Cell, agent.DBConfigs.DbaWithDB(), agent.QueryServiceControl.SchemaEngine()) - servenv.OnRun(agent.UpdateStream.RegisterService) - servenv.OnTerm(agent.UpdateStream.Disable) + tm.UpdateStream = binlog.NewUpdateStream(tm.TopoServer, tablet.Keyspace, tm.TabletAlias.Cell, tm.DBConfigs.DbaWithDB(), tm.QueryServiceControl.SchemaEngine()) + servenv.OnRun(tm.UpdateStream.RegisterService) + servenv.OnTerm(tm.UpdateStream.Disable) - agent.VREngine = vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld) - servenv.OnTerm(agent.VREngine.Close) + tm.VREngine = vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld) + servenv.OnTerm(tm.VREngine.Close) - if err := agent.handleRestore(batchCtx); err != nil { + if err := tm.handleRestore(batchCtx); err != nil { return nil, err } - agent.startShardSync() + tm.startShardSync() - agent.exportStats() + tm.exportStats() // Start periodic Orchestrator self-registration, if configured. orc, err := newOrcClient() @@ -305,23 +305,23 @@ func NewTabletManager( return nil, err } if orc != nil { - agent.orc = orc - go agent.orc.DiscoverLoop(agent) + tm.orc = orc + go tm.orc.DiscoverLoop(tm) } // Temporary glue code to keep things working. // TODO(sougou); remove after refactor. - if err := agent.lock(batchCtx); err != nil { + if err := tm.lock(batchCtx); err != nil { return nil, err } - defer agent.unlock() - tablet = agent.Tablet() - agent.changeCallback(batchCtx, tablet, tablet) + defer tm.unlock() + tablet = tm.Tablet() + tm.changeCallback(batchCtx, tablet, tablet) - return agent, nil + return tm, nil } -// NewTestTabletManager creates an agent for test purposes. Only a +// NewTestTabletManager creates an tm for test purposes. Only a // subset of features are supported now, but we'll add more over time. func NewTestTabletManager( batchCtx context.Context, @@ -341,7 +341,7 @@ func NewTestTabletManager( "grpc": grpcPort, } - agent := &TabletManager{ + tm := &TabletManager{ QueryServiceControl: tabletservermock.NewController(), UpdateStream: binlog.NewUpdateStreamControlMock(), HealthReporter: health.DefaultAggregator, @@ -358,46 +358,46 @@ func NewTestTabletManager( _healthy: fmt.Errorf("healthcheck not run yet"), } if preStart != nil { - preStart(agent) + preStart(tm) } - if err := agent.createKeyspaceShard(batchCtx); err != nil { + if err := tm.createKeyspaceShard(batchCtx); err != nil { panic(err) } - if err := agent.checkMastership(batchCtx); err != nil { + if err := tm.checkMastership(batchCtx); err != nil { panic(err) } - if agent.initTablet(batchCtx); err != nil { + if tm.initTablet(batchCtx); err != nil { panic(err) } - tablet := agent.Tablet() - err = agent.QueryServiceControl.InitDBConfig(querypb.Target{ + tablet := tm.Tablet() + err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type, - }, agent.DBConfigs) + }, tm.DBConfigs) if err != nil { panic(err) } // Start a background goroutine to watch and update the shard record, // to make sure it and our tablet record are in sync. - agent.startShardSync() + tm.startShardSync() // Temporary glue code to keep things working. // TODO(sougou); remove after refactor. - if err := agent.lock(batchCtx); err != nil { + if err := tm.lock(batchCtx); err != nil { panic(err) } - defer agent.unlock() - tablet = agent.Tablet() - agent.changeCallback(batchCtx, tablet, tablet) + defer tm.unlock() + tablet = tm.Tablet() + tm.changeCallback(batchCtx, tablet, tablet) - return agent + return tm } -// NewComboTabletManager creates an agent tailored specifically to run +// NewComboTabletManager creates an tm tailored specifically to run // within the vtcombo binary. It cannot be called concurrently, // as it changes the flags. func NewComboTabletManager( @@ -420,7 +420,7 @@ func NewComboTabletManager( panic(err) } dbcfgs.DBName = topoproto.TabletDbName(tablet) - agent := &TabletManager{ + tm := &TabletManager{ QueryServiceControl: queryServiceControl, UpdateStream: binlog.NewUpdateStreamControlMock(), HealthReporter: health.DefaultAggregator, @@ -437,131 +437,131 @@ func NewComboTabletManager( tablet: tablet, } - ctx, cancel := context.WithTimeout(agent.batchCtx, *initTimeout) + ctx, cancel := context.WithTimeout(tm.batchCtx, *initTimeout) defer cancel() - if err := agent.createKeyspaceShard(ctx); err != nil { + if err := tm.createKeyspaceShard(ctx); err != nil { panic(err) } - if err := agent.checkMastership(ctx); err != nil { + if err := tm.checkMastership(ctx); err != nil { panic(err) } - if err := agent.initTablet(ctx); err != nil { + if err := tm.initTablet(ctx); err != nil { panic(err) } - tablet = agent.Tablet() - err = agent.QueryServiceControl.InitDBConfig(querypb.Target{ + tablet = tm.Tablet() + err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type, - }, agent.DBConfigs) + }, tm.DBConfigs) if err != nil { panic(err) } - agent.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) + tm.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) // Start a background goroutine to watch and update the shard record, // to make sure it and our tablet record are in sync. - agent.startShardSync() + tm.startShardSync() - return agent + return tm } -func (agent *TabletManager) setTablet(tablet *topodatapb.Tablet) { - agent.pubMu.Lock() - agent.tablet = proto.Clone(tablet).(*topodatapb.Tablet) - agent.pubMu.Unlock() +func (tm *TabletManager) setTablet(tablet *topodatapb.Tablet) { + tm.pubMu.Lock() + tm.tablet = proto.Clone(tablet).(*topodatapb.Tablet) + tm.pubMu.Unlock() // Notify the shard sync loop that the tablet state changed. - agent.notifyShardSync() + tm.notifyShardSync() } -func (agent *TabletManager) updateTablet(update func(tablet *topodatapb.Tablet)) { - agent.pubMu.Lock() - update(agent.tablet) - agent.pubMu.Unlock() +func (tm *TabletManager) updateTablet(update func(tablet *topodatapb.Tablet)) { + tm.pubMu.Lock() + update(tm.tablet) + tm.pubMu.Unlock() // Notify the shard sync loop that the tablet state changed. - agent.notifyShardSync() + tm.notifyShardSync() } -// Tablet reads the stored Tablet from the agent. -func (agent *TabletManager) Tablet() *topodatapb.Tablet { - agent.pubMu.Lock() - tablet := proto.Clone(agent.tablet).(*topodatapb.Tablet) - agent.pubMu.Unlock() +// Tablet reads the stored Tablet from the tm. +func (tm *TabletManager) Tablet() *topodatapb.Tablet { + tm.pubMu.Lock() + tablet := proto.Clone(tm.tablet).(*topodatapb.Tablet) + tm.pubMu.Unlock() return tablet } // Healthy reads the result of the latest healthcheck, protected by mutex. // If that status is too old, it means healthcheck hasn't run for a while, // and is probably stuck, this is not good, we're not healthy. -func (agent *TabletManager) Healthy() (time.Duration, error) { - agent.mutex.Lock() - defer agent.mutex.Unlock() +func (tm *TabletManager) Healthy() (time.Duration, error) { + tm.mutex.Lock() + defer tm.mutex.Unlock() - healthy := agent._healthy + healthy := tm._healthy if healthy == nil { - timeSinceLastCheck := time.Since(agent._healthyTime) + timeSinceLastCheck := time.Since(tm._healthyTime) if timeSinceLastCheck > *healthCheckInterval*3 { healthy = fmt.Errorf("last health check is too old: %s > %s", timeSinceLastCheck, *healthCheckInterval*3) } } - return agent._replicationDelay, healthy + return tm._replicationDelay, healthy } // BlacklistedTables returns the list of currently blacklisted tables. -func (agent *TabletManager) BlacklistedTables() []string { - agent.mutex.Lock() - defer agent.mutex.Unlock() - return agent._blacklistedTables +func (tm *TabletManager) BlacklistedTables() []string { + tm.mutex.Lock() + defer tm.mutex.Unlock() + return tm._blacklistedTables } // DisallowQueryService returns the reason the query service should be // disabled, if any. -func (agent *TabletManager) DisallowQueryService() string { - agent.mutex.Lock() - defer agent.mutex.Unlock() - return agent._disallowQueryService +func (tm *TabletManager) DisallowQueryService() string { + tm.mutex.Lock() + defer tm.mutex.Unlock() + return tm._disallowQueryService } -func (agent *TabletManager) slaveStopped() bool { - agent.mutex.Lock() - defer agent.mutex.Unlock() +func (tm *TabletManager) slaveStopped() bool { + tm.mutex.Lock() + defer tm.mutex.Unlock() // If we already know the value, don't bother checking the file. - if agent._slaveStopped != nil { - return *agent._slaveStopped + if tm._slaveStopped != nil { + return *tm._slaveStopped } // If there's no Cnf file, don't read state. - if agent.Cnf == nil { + if tm.Cnf == nil { return false } // If the marker file exists, we're stopped. // Treat any read error as if the file doesn't exist. - _, err := os.Stat(path.Join(agent.Cnf.TabletDir(), slaveStoppedFile)) + _, err := os.Stat(path.Join(tm.Cnf.TabletDir(), slaveStoppedFile)) slaveStopped := err == nil - agent._slaveStopped = &slaveStopped + tm._slaveStopped = &slaveStopped return slaveStopped } -func (agent *TabletManager) setSlaveStopped(slaveStopped bool) { - agent.mutex.Lock() - defer agent.mutex.Unlock() +func (tm *TabletManager) setSlaveStopped(slaveStopped bool) { + tm.mutex.Lock() + defer tm.mutex.Unlock() - agent._slaveStopped = &slaveStopped + tm._slaveStopped = &slaveStopped // Make a best-effort attempt to persist the value across tablet restarts. // We store a marker in the filesystem so it works regardless of whether // mysqld is running, and so it's tied to this particular instance of the // tablet data dir (the one that's paused at a known replication position). - if agent.Cnf == nil { + if tm.Cnf == nil { return } - tabletDir := agent.Cnf.TabletDir() + tabletDir := tm.Cnf.TabletDir() if tabletDir == "" { return } @@ -576,30 +576,30 @@ func (agent *TabletManager) setSlaveStopped(slaveStopped bool) { } } -func (agent *TabletManager) setServicesDesiredState(disallowQueryService string) { - agent.mutex.Lock() - agent._disallowQueryService = disallowQueryService - agent.mutex.Unlock() +func (tm *TabletManager) setServicesDesiredState(disallowQueryService string) { + tm.mutex.Lock() + tm._disallowQueryService = disallowQueryService + tm.mutex.Unlock() } -func (agent *TabletManager) setBlacklistedTables(value []string) { - agent.mutex.Lock() - agent._blacklistedTables = value - agent.mutex.Unlock() +func (tm *TabletManager) setBlacklistedTables(value []string) { + tm.mutex.Lock() + tm._blacklistedTables = value + tm.mutex.Unlock() } // Close prepares a tablet for shutdown. First we check our tablet ownership and // then prune the tablet topology entry of all post-init fields. This prevents // stale identifiers from hanging around in topology. -func (agent *TabletManager) Close() { +func (tm *TabletManager) Close() { // Stop the shard sync loop and wait for it to exit. We do this in Close() // rather than registering it as an OnTerm hook so the shard sync loop keeps // running during lame duck. - agent.stopShardSync() + tm.stopShardSync() // cleanup initialized fields in the tablet entry f := func(tablet *topodatapb.Tablet) error { - if err := topotools.CheckOwnership(agent.Tablet(), tablet); err != nil { + if err := topotools.CheckOwnership(tm.Tablet(), tablet); err != nil { return err } tablet.Hostname = "" @@ -611,34 +611,34 @@ func (agent *TabletManager) Close() { updateCtx, updateCancel := context.WithTimeout(context.Background(), *topo.RemoteOperationTimeout) defer updateCancel() - if _, err := agent.TopoServer.UpdateTabletFields(updateCtx, agent.TabletAlias, f); err != nil { + if _, err := tm.TopoServer.UpdateTabletFields(updateCtx, tm.TabletAlias, f); err != nil { log.Warningf("Failed to update tablet record, may contain stale identifiers: %v", err) } } -// Stop shuts down the agent. Normally this is not necessary, since we use +// Stop shuts down the tm. Normally this is not necessary, since we use // servenv OnTerm and OnClose hooks to coordinate shutdown automatically, // while taking lameduck into account. However, this may be useful for tests, -// when you want to clean up an agent immediately. -func (agent *TabletManager) Stop() { +// when you want to clean up an tm immediately. +func (tm *TabletManager) Stop() { // Stop the shard sync loop and wait for it to exit. This needs to be done // here in addition to in Close() because tests do not call Close(). - agent.stopShardSync() + tm.stopShardSync() - if agent.UpdateStream != nil { - agent.UpdateStream.Disable() + if tm.UpdateStream != nil { + tm.UpdateStream.Disable() } - agent.VREngine.Close() + tm.VREngine.Close() - if agent.MysqlDaemon != nil { - agent.MysqlDaemon.Close() + if tm.MysqlDaemon != nil { + tm.MysqlDaemon.Close() } } // hookExtraEnv returns the map to pass to local hooks -func (agent *TabletManager) hookExtraEnv() map[string]string { - return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(agent.TabletAlias)} +func (tm *TabletManager) hookExtraEnv() map[string]string { + return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(tm.TabletAlias)} } // withRetry will exponentially back off and retry a function upon @@ -646,7 +646,7 @@ func (agent *TabletManager) hookExtraEnv() map[string]string { // no error. We use this at startup with a context timeout set to the // value of the init_timeout flag, so we can try to modify the // topology over a longer period instead of dying right away. -func (agent *TabletManager) withRetry(ctx context.Context, description string, work func() error) error { +func (tm *TabletManager) withRetry(ctx context.Context, description string, work func() error) error { backoff := 1 * time.Second for { err := work() @@ -720,47 +720,47 @@ func buildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( }, nil } -func (agent *TabletManager) createKeyspaceShard(ctx context.Context) error { +func (tm *TabletManager) createKeyspaceShard(ctx context.Context) error { // mutex is needed because we set _shardInfo and _srvKeyspace - agent.mutex.Lock() - defer agent.mutex.Unlock() + tm.mutex.Lock() + defer tm.mutex.Unlock() - tablet := agent.Tablet() + tablet := tm.Tablet() log.Infof("Reading/creating keyspace and shard records for %v/%v", tablet.Keyspace, tablet.Shard) // Read the shard, create it if necessary. - if err := agent.withRetry(ctx, "creating keyspace and shard", func() error { + if err := tm.withRetry(ctx, "creating keyspace and shard", func() error { var err error - agent._shardInfo, err = agent.TopoServer.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard) + tm._shardInfo, err = tm.TopoServer.GetOrCreateShard(ctx, tablet.Keyspace, tablet.Shard) return err }); err != nil { return vterrors.Wrap(err, "createKeyspaceShard: cannot GetOrCreateShard shard") } // Rebuild keyspace if this the first tablet in this keyspace/cell - srvKeyspace, err := agent.TopoServer.GetSrvKeyspace(ctx, agent.TabletAlias.Cell, tablet.Keyspace) + srvKeyspace, err := tm.TopoServer.GetSrvKeyspace(ctx, tm.TabletAlias.Cell, tablet.Keyspace) switch { case err == nil: - agent._srvKeyspace = srvKeyspace + tm._srvKeyspace = srvKeyspace case topo.IsErrType(err, topo.NoNode): - go agent.rebuildKeyspace(tablet.Keyspace, rebuildKeyspaceRetryInterval) + go tm.rebuildKeyspace(tablet.Keyspace, rebuildKeyspaceRetryInterval) default: return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to read SrvKeyspace") } // Rebuild vschema graph if this is the first tablet in this keyspace/cell. - srvVSchema, err := agent.TopoServer.GetSrvVSchema(ctx, agent.TabletAlias.Cell) + srvVSchema, err := tm.TopoServer.GetSrvVSchema(ctx, tm.TabletAlias.Cell) switch { case err == nil: // Check if vschema was rebuilt after the initial creation of the keyspace. if _, keyspaceExists := srvVSchema.GetKeyspaces()[tablet.Keyspace]; !keyspaceExists { - if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { + if err := tm.TopoServer.RebuildSrvVSchema(ctx, []string{tm.TabletAlias.Cell}); err != nil { return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } } case topo.IsErrType(err, topo.NoNode): // There is no SrvSchema in this cell at all, so we definitely need to rebuild. - if err := agent.TopoServer.RebuildSrvVSchema(ctx, []string{agent.TabletAlias.Cell}); err != nil { + if err := tm.TopoServer.RebuildSrvVSchema(ctx, []string{tm.TabletAlias.Cell}); err != nil { return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } default: @@ -769,22 +769,22 @@ func (agent *TabletManager) createKeyspaceShard(ctx context.Context) error { return nil } -func (agent *TabletManager) checkMastership(ctx context.Context) error { - agent.mutex.Lock() - si := agent._shardInfo - agent.mutex.Unlock() +func (tm *TabletManager) checkMastership(ctx context.Context) error { + tm.mutex.Lock() + si := tm._shardInfo + tm.mutex.Unlock() - if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, agent.TabletAlias) { + if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, tm.TabletAlias) { // We're marked as master in the shard record, which could mean the master // tablet process was just restarted. However, we need to check if a new // master is in the process of taking over. In that case, it will let us // know by forcibly updating the old master's tablet record. - oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + oldTablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) switch { case topo.IsErrType(err, topo.NoNode): // There's no existing tablet record, so we can assume // no one has left us a message to step down. - agent.updateTablet(func(tablet *topodatapb.Tablet) { + tm.updateTablet(func(tablet *topodatapb.Tablet) { tablet.Type = topodatapb.TabletType_MASTER // Update the master term start time (current value is 0) because we // assume that we are actually the MASTER and in case of a tiebreak, @@ -795,7 +795,7 @@ func (agent *TabletManager) checkMastership(ctx context.Context) error { if oldTablet.Type == topodatapb.TabletType_MASTER { // We're marked as master in the shard record, // and our existing tablet record agrees. - agent.updateTablet(func(tablet *topodatapb.Tablet) { + tm.updateTablet(func(tablet *topodatapb.Tablet) { tablet.Type = topodatapb.TabletType_MASTER tablet.MasterTermStartTime = oldTablet.MasterTermStartTime }) @@ -804,7 +804,7 @@ func (agent *TabletManager) checkMastership(ctx context.Context) error { return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") } } else { - oldTablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) + oldTablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) switch { case topo.IsErrType(err, topo.NoNode): // There's no existing tablet record, so there is nothing to do @@ -815,7 +815,7 @@ func (agent *TabletManager) checkMastership(ctx context.Context) error { oldMasterTermStartTime := oldTablet.GetMasterTermStartTime() currentShardTime := si.GetMasterTermStartTime() if oldMasterTermStartTime.After(currentShardTime) { - agent.updateTablet(func(tablet *topodatapb.Tablet) { + tm.updateTablet(func(tablet *topodatapb.Tablet) { tablet.Type = topodatapb.TabletType_MASTER tablet.MasterTermStartTime = oldTablet.MasterTermStartTime }) @@ -828,23 +828,23 @@ func (agent *TabletManager) checkMastership(ctx context.Context) error { return nil } -func (agent *TabletManager) checkMysql(ctx context.Context) error { - if appConfig, _ := agent.DBConfigs.AppWithDB().MysqlParams(); appConfig.Host != "" { - agent.updateTablet(func(tablet *topodatapb.Tablet) { +func (tm *TabletManager) checkMysql(ctx context.Context) error { + if appConfig, _ := tm.DBConfigs.AppWithDB().MysqlParams(); appConfig.Host != "" { + tm.updateTablet(func(tablet *topodatapb.Tablet) { tablet.MysqlHostname = appConfig.Host tablet.MysqlPort = int32(appConfig.Port) }) } else { // Assume unix socket was specified and try to get the port from mysqld - agent.updateTablet(func(tablet *topodatapb.Tablet) { + tm.updateTablet(func(tablet *topodatapb.Tablet) { tablet.MysqlHostname = tablet.Hostname }) - mysqlPort, err := agent.MysqlDaemon.GetMysqlPort() + mysqlPort, err := tm.MysqlDaemon.GetMysqlPort() if err != nil { log.Warningf("Cannot get current mysql port, will keep retrying every %v: %v", mysqlPortRetryInterval, err) - go agent.findMysqlPort(mysqlPortRetryInterval) + go tm.findMysqlPort(mysqlPortRetryInterval) } else { - agent.updateTablet(func(tablet *topodatapb.Tablet) { + tm.updateTablet(func(tablet *topodatapb.Tablet) { tablet.MysqlPort = mysqlPort }) } @@ -852,16 +852,16 @@ func (agent *TabletManager) checkMysql(ctx context.Context) error { return nil } -func (agent *TabletManager) initTablet(ctx context.Context) error { - tablet := agent.Tablet() - err := agent.TopoServer.CreateTablet(ctx, tablet) +func (tm *TabletManager) initTablet(ctx context.Context) error { + tablet := tm.Tablet() + err := tm.TopoServer.CreateTablet(ctx, tablet) switch { case err == nil: // It worked, we're good. case topo.IsErrType(err, topo.NodeExists): // The node already exists, will just try to update // it. So we read it first. - oldTablet, err := agent.TopoServer.GetTablet(ctx, tablet.Alias) + oldTablet, err := tm.TopoServer.GetTablet(ctx, tablet.Alias) if err != nil { return vterrors.Wrap(err, "initTablet failed to read existing tablet record") } @@ -876,12 +876,12 @@ func (agent *TabletManager) initTablet(ctx context.Context) error { // then the ShardReplication record was not (because for // instance of a startup timeout). Upon running this code // again, we want to fix ShardReplication. - if updateErr := topo.UpdateTabletReplicationData(ctx, agent.TopoServer, tablet); updateErr != nil { + if updateErr := topo.UpdateTabletReplicationData(ctx, tm.TopoServer, tablet); updateErr != nil { return vterrors.Wrap(updateErr, "UpdateTabletReplicationData failed") } // Then overwrite everything, ignoring version mismatch. - if err := agent.TopoServer.UpdateTablet(ctx, topo.NewTabletInfo(tablet, nil)); err != nil { + if err := tm.TopoServer.UpdateTablet(ctx, topo.NewTabletInfo(tablet, nil)); err != nil { return vterrors.Wrap(err, "UpdateTablet failed") } default: @@ -890,10 +890,10 @@ func (agent *TabletManager) initTablet(ctx context.Context) error { return nil } -func (agent *TabletManager) handleRestore(ctx context.Context) error { - tablet := agent.Tablet() +func (tm *TabletManager) handleRestore(ctx context.Context) error { + tablet := tm.Tablet() // Sanity check for inconsistent flags - if agent.Cnf == nil && *restoreFromBackup { + if tm.Cnf == nil && *restoreFromBackup { return fmt.Errorf("you cannot enable -restore_from_backup without a my.cnf file") } @@ -905,38 +905,38 @@ func (agent *TabletManager) handleRestore(ctx context.Context) error { go func() { // restoreFromBackup will just be a regular action // (same as if it was triggered remotely) - if err := agent.RestoreData(ctx, logutil.NewConsoleLogger(), *waitForBackupInterval, false /* deleteBeforeRestore */); err != nil { + if err := tm.RestoreData(ctx, logutil.NewConsoleLogger(), *waitForBackupInterval, false /* deleteBeforeRestore */); err != nil { log.Exitf("RestoreFromBackup failed: %v", err) } // after the restore is done, start health check - agent.initHealthCheck() + tm.initHealthCheck() }() return nil } // optionally populate metadata records if *initPopulateMetadata { - localMetadata := agent.getLocalMetadataValues(tablet.Type) - if agent.Cnf != nil { // we are managing mysqld + localMetadata := tm.getLocalMetadataValues(tablet.Type) + if tm.Cnf != nil { // we are managing mysqld // we'll use batchCtx here because we are still initializing and can't proceed unless this succeeds - if err := agent.MysqlDaemon.Wait(ctx, agent.Cnf); err != nil { + if err := tm.MysqlDaemon.Wait(ctx, tm.Cnf); err != nil { return err } } - err := mysqlctl.PopulateMetadataTables(agent.MysqlDaemon, localMetadata, topoproto.TabletDbName(tablet)) + err := mysqlctl.PopulateMetadataTables(tm.MysqlDaemon, localMetadata, topoproto.TabletDbName(tablet)) if err != nil { return vterrors.Wrap(err, "failed to -init_populate_metadata") } } // synchronously start health check if needed - agent.initHealthCheck() + tm.initHealthCheck() return nil } -func (agent *TabletManager) exportStats() { - tablet := agent.Tablet() +func (tm *TabletManager) exportStats() { + tablet := tm.Tablet() statsKeyspace := stats.NewString("TabletKeyspace") statsShard := stats.NewString("TabletShard") statsKeyRangeStart := stats.NewString("TabletKeyRangeStart") diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 4fd234fca4d..c9133e1317f 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -44,7 +44,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { } // start with a tablet record that doesn't exist - agent := &TabletManager{ + tm := &TabletManager{ TopoServer: ts, TabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), @@ -63,14 +63,14 @@ func TestInitTabletFixesReplicationData(t *testing.T) { Cell: cell, Uid: 2, } - agent.TabletAlias = tabletAlias + tm.TabletAlias = tabletAlias tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) sri, err := ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") @@ -88,7 +88,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { } // An initTablet will recreate the shard replication data. - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) sri, err = ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") @@ -110,7 +110,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. } // start with a tablet record that doesn't exist - agent := &TabletManager{ + tm := &TabletManager{ TopoServer: ts, TabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), @@ -129,14 +129,14 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. Cell: "cell1", Uid: 2, } - agent.TabletAlias = tabletAlias + tm.TabletAlias = tabletAlias tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-c0") @@ -155,10 +155,10 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. *initShard = "-D0" tablet, err = buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) // This should fail. require.Error(t, err) @@ -184,7 +184,7 @@ func TestInitTablet(t *testing.T) { port := int32(1234) gRPCPort := int32(3456) mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) - agent := &TabletManager{ + tm := &TabletManager{ TopoServer: ts, TabletAlias: tabletAlias, MysqlDaemon: mysqlDaemon, @@ -209,7 +209,7 @@ func TestInitTablet(t *testing.T) { Uid: 2, } - _, err := agent.TopoServer.GetSrvKeyspace(ctx, "cell1", "test_keyspace") + _, err := tm.TopoServer.GetSrvKeyspace(ctx, "cell1", "test_keyspace") switch { case topo.IsErrType(err, topo.NoNode): // srvKeyspace should not be when tablets haven't been registered to this cell @@ -217,14 +217,14 @@ func TestInitTablet(t *testing.T) { t.Fatalf("GetSrvKeyspace failed: %v", err) } - agent.TabletAlias = tabletAlias + tm.TabletAlias = tabletAlias tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) si, err := ts.GetShard(ctx, "test_keyspace", "-c0") @@ -232,7 +232,7 @@ func TestInitTablet(t *testing.T) { t.Fatalf("GetShard failed: %v", err) } - _, err = agent.TopoServer.GetSrvKeyspace(ctx, "cell1", "test_keyspace") + _, err = tm.TopoServer.GetSrvKeyspace(ctx, "cell1", "test_keyspace") switch { case err != nil: // srvKeyspace should not be when tablets haven't been registered to this cell @@ -262,7 +262,7 @@ func TestInitTablet(t *testing.T) { if string(ti.KeyRange.Start) != "" || string(ti.KeyRange.End) != "\xc0" { t.Errorf("wrong KeyRange for tablet: %v", ti.KeyRange) } - if got := agent.masterTermStartTime(); !got.IsZero() { + if got := tm.masterTermStartTime(); !got.IsZero() { t.Fatalf("REPLICA tablet should not have a MasterTermStartTime set: %v", got) } @@ -270,7 +270,7 @@ func TestInitTablet(t *testing.T) { // (This simulates the case where the MasterAlias in the shard record says // that we are the master but the tablet record says otherwise. In that case, // we assume we are not the MASTER.) - _, err = agent.TopoServer.UpdateShardFields(ctx, "test_keyspace", "-c0", func(si *topo.ShardInfo) error { + _, err = tm.TopoServer.UpdateShardFields(ctx, "test_keyspace", "-c0", func(si *topo.ShardInfo) error { si.MasterAlias = tabletAlias return nil }) @@ -280,10 +280,10 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) ti, err = ts.GetTablet(ctx, tabletAlias) @@ -294,7 +294,7 @@ func TestInitTablet(t *testing.T) { if ti.Type != topodatapb.TabletType_REPLICA { t.Errorf("wrong tablet type: %v", ti.Type) } - if got := agent.masterTermStartTime(); !got.IsZero() { + if got := tm.masterTermStartTime(); !got.IsZero() { t.Fatalf("REPLICA tablet should not have a masterTermStartTime set: %v", got) } @@ -307,12 +307,12 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.checkMastership(ctx) + err = tm.checkMastership(ctx) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) ti, err = ts.GetTablet(ctx, tabletAlias) @@ -337,12 +337,12 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.checkMastership(ctx) + err = tm.checkMastership(ctx) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) ti, err = ts.GetTablet(ctx, tabletAlias) @@ -364,12 +364,12 @@ func TestInitTablet(t *testing.T) { tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) - agent.tablet = tablet - err = agent.createKeyspaceShard(context.Background()) + tm.tablet = tablet + err = tm.createKeyspaceShard(context.Background()) require.NoError(t, err) - err = agent.checkMastership(ctx) + err = tm.checkMastership(ctx) require.NoError(t, err) - err = agent.initTablet(context.Background()) + err = tm.initTablet(context.Background()) require.NoError(t, err) ti, err = ts.GetTablet(ctx, tabletAlias) diff --git a/go/vt/vttablet/tabletmanager/vreplication.go b/go/vt/vttablet/tabletmanager/vreplication.go index 071c6a659ed..6f729820eda 100644 --- a/go/vt/vttablet/tabletmanager/vreplication.go +++ b/go/vt/vttablet/tabletmanager/vreplication.go @@ -25,8 +25,8 @@ import ( ) // VReplicationExec executes a vreplication command. -func (agent *TabletManager) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { - qr, err := agent.VREngine.Exec(query) +func (tm *TabletManager) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { + qr, err := tm.VREngine.Exec(query) if err != nil { return nil, err } @@ -34,6 +34,6 @@ func (agent *TabletManager) VReplicationExec(ctx context.Context, query string) } // VReplicationWaitForPos waits for the specified position. -func (agent *TabletManager) VReplicationWaitForPos(ctx context.Context, id int, pos string) error { - return agent.VREngine.WaitForPos(ctx, id, pos) +func (tm *TabletManager) VReplicationWaitForPos(ctx context.Context, id int, pos string) error { + return tm.VREngine.WaitForPos(ctx, id, pos) } diff --git a/go/vt/vttablet/tmrpctest/test_tm_rpc.go b/go/vt/vttablet/tmrpctest/test_tm_rpc.go index cbdd11e52fb..8c385500c1b 100644 --- a/go/vt/vttablet/tmrpctest/test_tm_rpc.go +++ b/go/vt/vttablet/tmrpctest/test_tm_rpc.go @@ -184,44 +184,44 @@ func (fra *fakeRPCTM) Ping(ctx context.Context, args string) string { return args } -func agentRPCTestPing(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPing(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.Ping(ctx, tablet) if err != nil { t.Errorf("Ping failed: %v", err) } } -func agentRPCTestPingPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPingPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.Ping(ctx, tablet) expectHandleRPCPanic(t, "Ping", false /*verbose*/, err) } -// agentRPCTestDialExpiredContext verifies that +// tmRPCTestDialExpiredContext verifies that // the context returns the right DeadlineExceeded Err() for // RPCs failed due to an expired context before .Dial(). -func agentRPCTestDialExpiredContext(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestDialExpiredContext(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { // Using a timeout of 0 here such that .Dial() will fail immediately. expiredCtx, cancel := context.WithTimeout(ctx, 0) defer cancel() err := client.Ping(expiredCtx, tablet) if err == nil { - t.Fatal("agentRPCTestDialExpiredContext: RPC with expired context did not fail") + t.Fatal("tmRPCTestDialExpiredContext: RPC with expired context did not fail") } // The context was already expired when we created it. Here we only verify that it returns the expected error. select { case <-expiredCtx.Done(): if err := expiredCtx.Err(); err != context.DeadlineExceeded { - t.Errorf("agentRPCTestDialExpiredContext: got %v want context.DeadlineExceeded", err) + t.Errorf("tmRPCTestDialExpiredContext: got %v want context.DeadlineExceeded", err) } default: - t.Errorf("agentRPCTestDialExpiredContext: context.Done() not closed") + t.Errorf("tmRPCTestDialExpiredContext: context.Done() not closed") } } -// agentRPCTestRPCTimeout verifies that +// tmRPCTestRPCTimeout verifies that // the context returns the right DeadlineExceeded Err() for // RPCs failed due to an expired context during execution. -func agentRPCTestRPCTimeout(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet, fakeTM *fakeRPCTM) { +func tmRPCTestRPCTimeout(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet, fakeTM *fakeRPCTM) { // We must use a timeout > 0 such that the context deadline hasn't expired // yet in grpctmclient.Client.dial(). // NOTE: This might still race e.g. when test execution takes too long the @@ -233,15 +233,15 @@ func agentRPCTestRPCTimeout(ctx context.Context, t *testing.T, client tmclient.T defer func() { fakeTM.setSlow(false) }() err := client.Ping(shortCtx, tablet) if err == nil { - t.Fatal("agentRPCTestRPCTimeout: RPC with expired context did not fail") + t.Fatal("tmRPCTestRPCTimeout: RPC with expired context did not fail") } select { case <-shortCtx.Done(): if err := shortCtx.Err(); err != context.DeadlineExceeded { - t.Errorf("agentRPCTestRPCTimeout: got %v want context.DeadlineExceeded", err) + t.Errorf("tmRPCTestRPCTimeout: got %v want context.DeadlineExceeded", err) } default: - t.Errorf("agentRPCTestRPCTimeout: context.Done() not closed") + t.Errorf("tmRPCTestRPCTimeout: context.Done() not closed") } } @@ -282,12 +282,12 @@ func (fra *fakeRPCTM) GetSchema(ctx context.Context, tables, excludeTables []str return testGetSchemaReply, nil } -func agentRPCTestGetSchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestGetSchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { result, err := client.GetSchema(ctx, tablet, testGetSchemaTables, testGetSchemaExcludeTables, true) compareError(t, "GetSchema", err, result, testGetSchemaReply) } -func agentRPCTestGetSchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestGetSchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.GetSchema(ctx, tablet, testGetSchemaTables, testGetSchemaExcludeTables, true) expectHandleRPCPanic(t, "GetSchema", false /*verbose*/, err) } @@ -324,12 +324,12 @@ func (fra *fakeRPCTM) GetPermissions(ctx context.Context) (*tabletmanagerdatapb. return testGetPermissionsReply, nil } -func agentRPCTestGetPermissions(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestGetPermissions(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { result, err := client.GetPermissions(ctx, tablet) compareError(t, "GetPermissions", err, result, testGetPermissionsReply) } -func agentRPCTestGetPermissionsPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestGetPermissionsPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.GetPermissions(ctx, tablet) expectHandleRPCPanic(t, "GetPermissions", false /*verbose*/, err) } @@ -350,7 +350,7 @@ func (fra *fakeRPCTM) SetReadOnly(ctx context.Context, rdonly bool) error { return nil } -func agentRPCTestSetReadOnly(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSetReadOnly(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { testSetReadOnlyExpectedValue = true err := client.SetReadOnly(ctx, tablet) if err != nil { @@ -363,7 +363,7 @@ func agentRPCTestSetReadOnly(ctx context.Context, t *testing.T, client tmclient. } } -func agentRPCTestSetReadOnlyPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSetReadOnlyPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SetReadOnly(ctx, tablet) expectHandleRPCPanic(t, "SetReadOnly", true /*verbose*/, err) err = client.SetReadWrite(ctx, tablet) @@ -380,14 +380,14 @@ func (fra *fakeRPCTM) ChangeType(ctx context.Context, tabletType topodatapb.Tabl return nil } -func agentRPCTestChangeType(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestChangeType(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.ChangeType(ctx, tablet, testChangeTypeValue) if err != nil { t.Errorf("ChangeType failed: %v", err) } } -func agentRPCTestChangeTypePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestChangeTypePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.ChangeType(ctx, tablet, testChangeTypeValue) expectHandleRPCPanic(t, "ChangeType", true /*verbose*/, err) } @@ -401,14 +401,14 @@ func (fra *fakeRPCTM) Sleep(ctx context.Context, duration time.Duration) { compare(fra.t, "Sleep duration", duration, testSleepDuration) } -func agentRPCTestSleep(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSleep(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.Sleep(ctx, tablet, testSleepDuration) if err != nil { t.Errorf("Sleep failed: %v", err) } } -func agentRPCTestSleepPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSleepPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.Sleep(ctx, tablet, testSleepDuration) expectHandleRPCPanic(t, "Sleep", true /*verbose*/, err) } @@ -435,12 +435,12 @@ func (fra *fakeRPCTM) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.Hook return testExecuteHookHookResult } -func agentRPCTestExecuteHook(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestExecuteHook(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { hr, err := client.ExecuteHook(ctx, tablet, testExecuteHookHook) compareError(t, "ExecuteHook", err, hr, testExecuteHookHookResult) } -func agentRPCTestExecuteHookPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestExecuteHookPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.ExecuteHook(ctx, tablet, testExecuteHookHook) expectHandleRPCPanic(t, "ExecuteHook", true /*verbose*/, err) } @@ -458,7 +458,7 @@ func (fra *fakeRPCTM) RefreshState(ctx context.Context) error { return nil } -func agentRPCTestRefreshState(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestRefreshState(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.RefreshState(ctx, tablet) if err != nil { t.Errorf("RefreshState failed: %v", err) @@ -468,7 +468,7 @@ func agentRPCTestRefreshState(ctx context.Context, t *testing.T, client tmclient } } -func agentRPCTestRefreshStatePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestRefreshStatePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.RefreshState(ctx, tablet) expectHandleRPCPanic(t, "RefreshState", true /*verbose*/, err) } @@ -489,26 +489,26 @@ func (fra *fakeRPCTM) IgnoreHealthError(ctx context.Context, pattern string) err return nil } -func agentRPCTestRunHealthCheck(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestRunHealthCheck(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.RunHealthCheck(ctx, tablet) if err != nil { t.Errorf("RunHealthCheck failed: %v", err) } } -func agentRPCTestRunHealthCheckPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestRunHealthCheckPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.RunHealthCheck(ctx, tablet) expectHandleRPCPanic(t, "RunHealthCheck", false /*verbose*/, err) } -func agentRPCTestIgnoreHealthError(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestIgnoreHealthError(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.IgnoreHealthError(ctx, tablet, testIgnoreHealthErrorValue) if err != nil { t.Errorf("IgnoreHealthError failed: %v", err) } } -func agentRPCTestIgnoreHealthErrorPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestIgnoreHealthErrorPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.IgnoreHealthError(ctx, tablet, testIgnoreHealthErrorValue) expectHandleRPCPanic(t, "IgnoreHealthError", false /*verbose*/, err) } @@ -526,7 +526,7 @@ func (fra *fakeRPCTM) ReloadSchema(ctx context.Context, waitPosition string) err return nil } -func agentRPCTestReloadSchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestReloadSchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.ReloadSchema(ctx, tablet, "") if err != nil { t.Errorf("ReloadSchema failed: %v", err) @@ -536,7 +536,7 @@ func agentRPCTestReloadSchema(ctx context.Context, t *testing.T, client tmclient } } -func agentRPCTestReloadSchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestReloadSchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.ReloadSchema(ctx, tablet, "") expectHandleRPCPanic(t, "ReloadSchema", false /*verbose*/, err) } @@ -557,12 +557,12 @@ func (fra *fakeRPCTM) PreflightSchema(ctx context.Context, changes []string) ([] return testSchemaChangeResult, nil } -func agentRPCTestPreflightSchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPreflightSchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { scr, err := client.PreflightSchema(ctx, tablet, testPreflightSchema) compareError(t, "PreflightSchema", err, scr, testSchemaChangeResult) } -func agentRPCTestPreflightSchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPreflightSchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.PreflightSchema(ctx, tablet, testPreflightSchema) expectHandleRPCPanic(t, "PreflightSchema", true /*verbose*/, err) } @@ -585,12 +585,12 @@ func (fra *fakeRPCTM) ApplySchema(ctx context.Context, change *tmutils.SchemaCha return testSchemaChangeResult[0], nil } -func agentRPCTestApplySchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestApplySchema(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { scr, err := client.ApplySchema(ctx, tablet, testSchemaChange) compareError(t, "ApplySchema", err, scr, testSchemaChangeResult[0]) } -func agentRPCTestApplySchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestApplySchemaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.ApplySchema(ctx, tablet, testSchemaChange) expectHandleRPCPanic(t, "ApplySchema", true /*verbose*/, err) } @@ -655,7 +655,7 @@ func (fra *fakeRPCTM) ExecuteFetchAsApp(ctx context.Context, query []byte, maxro return testExecuteFetchResult, nil } -func agentRPCTestExecuteFetch(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestExecuteFetch(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { // using pool qr, err := client.ExecuteFetchAsDba(ctx, tablet, true, testExecuteFetchQuery, testExecuteFetchMaxRows, true, true) compareError(t, "ExecuteFetchAsDba", err, qr, testExecuteFetchResult) @@ -672,7 +672,7 @@ func agentRPCTestExecuteFetch(ctx context.Context, t *testing.T, client tmclient } -func agentRPCTestExecuteFetchPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestExecuteFetchPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { // using pool _, err := client.ExecuteFetchAsDba(ctx, tablet, true, testExecuteFetchQuery, testExecuteFetchMaxRows, true, false) expectHandleRPCPanic(t, "ExecuteFetchAsDba", false /*verbose*/, err) @@ -709,12 +709,12 @@ func (fra *fakeRPCTM) SlaveStatus(ctx context.Context) (*replicationdatapb.Statu return testReplicationStatus, nil } -func agentRPCTestSlaveStatus(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSlaveStatus(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rs, err := client.SlaveStatus(ctx, tablet) compareError(t, "SlaveStatus", err, rs, testReplicationStatus) } -func agentRPCTestSlaveStatusPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSlaveStatusPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.SlaveStatus(ctx, tablet) expectHandleRPCPanic(t, "SlaveStatus", false /*verbose*/, err) } @@ -732,12 +732,12 @@ func (fra *fakeRPCTM) WaitForPosition(ctx context.Context, pos string) error { panic("unimplemented") } -func agentRPCTestMasterPosition(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestMasterPosition(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rs, err := client.MasterPosition(ctx, tablet) compareError(t, "MasterPosition", err, rs, testReplicationPosition) } -func agentRPCTestMasterPositionPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestMasterPositionPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.MasterPosition(ctx, tablet) expectHandleRPCPanic(t, "MasterPosition", false /*verbose*/, err) } @@ -752,12 +752,12 @@ func (fra *fakeRPCTM) StopSlave(ctx context.Context) error { return nil } -func agentRPCTestStopSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStopSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.StopSlave(ctx, tablet) compareError(t, "StopSlave", err, true, testStopSlaveCalled) } -func agentRPCTestStopSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStopSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.StopSlave(ctx, tablet) expectHandleRPCPanic(t, "StopSlave", true /*verbose*/, err) } @@ -773,12 +773,12 @@ func (fra *fakeRPCTM) StopSlaveMinimum(ctx context.Context, position string, wai return testReplicationPositionReturned, nil } -func agentRPCTestStopSlaveMinimum(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStopSlaveMinimum(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { pos, err := client.StopSlaveMinimum(ctx, tablet, testReplicationPosition, testStopSlaveMinimumWaitTime) compareError(t, "StopSlaveMinimum", err, pos, testReplicationPositionReturned) } -func agentRPCTestStopSlaveMinimumPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStopSlaveMinimumPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.StopSlaveMinimum(ctx, tablet, testReplicationPosition, testStopSlaveMinimumWaitTime) expectHandleRPCPanic(t, "StopSlaveMinimum", true /*verbose*/, err) } @@ -803,17 +803,17 @@ func (fra *fakeRPCTM) StartSlaveUntilAfter(ctx context.Context, position string, return nil } -func agentRPCTestStartSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStartSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.StartSlave(ctx, tablet) compareError(t, "StartSlave", err, true, testStartSlaveCalled) } -func agentRPCTestStartSlaveUntilAfter(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStartSlaveUntilAfter(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.StartSlaveUntilAfter(ctx, tablet, "test-position", time.Minute) compareError(t, "StartSlaveUntilAfter", err, "test-position", testStartSlaveUntilAfterCalledWith) } -func agentRPCTestStartSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStartSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.StartSlave(ctx, tablet) expectHandleRPCPanic(t, "StartSlave", true /*verbose*/, err) } @@ -827,12 +827,12 @@ func (fra *fakeRPCTM) GetSlaves(ctx context.Context) ([]string, error) { return testGetSlavesResult, nil } -func agentRPCTestGetSlaves(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestGetSlaves(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { s, err := client.GetSlaves(ctx, tablet) compareError(t, "GetSlaves", err, s, testGetSlavesResult) } -func agentRPCTestGetSlavesPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestGetSlavesPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.GetSlaves(ctx, tablet) expectHandleRPCPanic(t, "GetSlaves", false /*verbose*/, err) } @@ -847,12 +847,12 @@ func (fra *fakeRPCTM) VReplicationExec(ctx context.Context, query string) (*quer return testExecuteFetchResult, nil } -func agentRPCTestVReplicationExec(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestVReplicationExec(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.VReplicationExec(ctx, tablet, testVRQuery) compareError(t, "VReplicationExec", err, rp, testExecuteFetchResult) } -func agentRPCTestVReplicationExecPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestVReplicationExecPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.VReplicationExec(ctx, tablet, testVRQuery) expectHandleRPCPanic(t, "VReplicationExec", true /*verbose*/, err) } @@ -871,12 +871,12 @@ func (fra *fakeRPCTM) VReplicationWaitForPos(ctx context.Context, id int, pos st return nil } -func agentRPCTestVReplicationWaitForPos(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestVReplicationWaitForPos(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.VReplicationWaitForPos(ctx, tablet, wfpid, wfppos) compareError(t, "VReplicationWaitForPos", err, true, true) } -func agentRPCTestVReplicationWaitForPosPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestVReplicationWaitForPosPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.VReplicationWaitForPos(ctx, tablet, wfpid, wfppos) expectHandleRPCPanic(t, "VReplicationWaitForPos", true /*verbose*/, err) } @@ -895,12 +895,12 @@ func (fra *fakeRPCTM) ResetReplication(ctx context.Context) error { return nil } -func agentRPCTestResetReplication(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestResetReplication(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.ResetReplication(ctx, tablet) compareError(t, "ResetReplication", err, true, testResetReplicationCalled) } -func agentRPCTestResetReplicationPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestResetReplicationPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.ResetReplication(ctx, tablet) expectHandleRPCPanic(t, "ResetReplication", true /*verbose*/, err) } @@ -912,12 +912,12 @@ func (fra *fakeRPCTM) InitMaster(ctx context.Context) (string, error) { return testReplicationPosition, nil } -func agentRPCTestInitMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestInitMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.InitMaster(ctx, tablet) compareError(t, "InitMaster", err, rp, testReplicationPosition) } -func agentRPCTestInitMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestInitMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.InitMaster(ctx, tablet) expectHandleRPCPanic(t, "InitMaster", true /*verbose*/, err) } @@ -943,12 +943,12 @@ func (fra *fakeRPCTM) PopulateReparentJournal(ctx context.Context, timeCreatedNS return nil } -func agentRPCTestPopulateReparentJournal(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPopulateReparentJournal(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.PopulateReparentJournal(ctx, tablet, testTimeCreatedNS, testActionName, testMasterAlias, testReplicationPosition) compareError(t, "PopulateReparentJournal", err, true, testPopulateReparentJournalCalled) } -func agentRPCTestPopulateReparentJournalPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPopulateReparentJournalPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.PopulateReparentJournal(ctx, tablet, testTimeCreatedNS, testActionName, testMasterAlias, testReplicationPosition) expectHandleRPCPanic(t, "PopulateReparentJournal", false /*verbose*/, err) } @@ -966,12 +966,12 @@ func (fra *fakeRPCTM) InitSlave(ctx context.Context, parent *topodatapb.TabletAl return nil } -func agentRPCTestInitSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestInitSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.InitSlave(ctx, tablet, testMasterAlias, testReplicationPosition, testTimeCreatedNS) compareError(t, "InitSlave", err, true, testInitSlaveCalled) } -func agentRPCTestInitSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestInitSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.InitSlave(ctx, tablet, testMasterAlias, testReplicationPosition, testTimeCreatedNS) expectHandleRPCPanic(t, "InitSlave", true /*verbose*/, err) } @@ -983,12 +983,12 @@ func (fra *fakeRPCTM) DemoteMaster(ctx context.Context) (string, error) { return testReplicationPosition, nil } -func agentRPCTestDemoteMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestDemoteMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.DemoteMaster(ctx, tablet) compareError(t, "DemoteMaster", err, rp, testReplicationPosition) } -func agentRPCTestDemoteMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestDemoteMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.DemoteMaster(ctx, tablet) expectHandleRPCPanic(t, "DemoteMaster", true /*verbose*/, err) } @@ -1002,13 +1002,13 @@ func (fra *fakeRPCTM) UndoDemoteMaster(ctx context.Context) error { return nil } -func agentRPCTestUndoDemoteMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestUndoDemoteMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.UndoDemoteMaster(ctx, tablet) testUndoDemoteMasterCalled = true compareError(t, "UndoDemoteMaster", err, true, testUndoDemoteMasterCalled) } -func agentRPCTestUndoDemoteMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestUndoDemoteMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.UndoDemoteMaster(ctx, tablet) expectHandleRPCPanic(t, "UndoDemoteMaster", true /*verbose*/, err) } @@ -1023,12 +1023,12 @@ func (fra *fakeRPCTM) PromoteSlaveWhenCaughtUp(ctx context.Context, position str return testReplicationPositionReturned, nil } -func agentRPCTestPromoteSlaveWhenCaughtUp(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPromoteSlaveWhenCaughtUp(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.PromoteSlaveWhenCaughtUp(ctx, tablet, testReplicationPosition) compareError(t, "PromoteSlaveWhenCaughtUp", err, rp, testReplicationPositionReturned) } -func agentRPCTestPromoteSlaveWhenCaughtUpPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPromoteSlaveWhenCaughtUpPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.PromoteSlaveWhenCaughtUp(ctx, tablet, testReplicationPosition) expectHandleRPCPanic(t, "PromoteSlaveWhenCaughtUp", true /*verbose*/, err) } @@ -1043,12 +1043,12 @@ func (fra *fakeRPCTM) SlaveWasPromoted(ctx context.Context) error { return nil } -func agentRPCTestSlaveWasPromoted(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSlaveWasPromoted(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SlaveWasPromoted(ctx, tablet) compareError(t, "SlaveWasPromoted", err, true, testSlaveWasPromotedCalled) } -func agentRPCTestSlaveWasPromotedPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSlaveWasPromotedPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SlaveWasPromoted(ctx, tablet) expectHandleRPCPanic(t, "SlaveWasPromoted", true /*verbose*/, err) } @@ -1068,12 +1068,12 @@ func (fra *fakeRPCTM) SetMaster(ctx context.Context, parent *topodatapb.TabletAl return nil } -func agentRPCTestSetMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSetMaster(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SetMaster(ctx, tablet, testMasterAlias, testTimeCreatedNS, testWaitPosition, testForceStartSlave) compareError(t, "SetMaster", err, true, testSetMasterCalled) } -func agentRPCTestSetMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSetMasterPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SetMaster(ctx, tablet, testMasterAlias, testTimeCreatedNS, testWaitPosition, testForceStartSlave) expectHandleRPCPanic(t, "SetMaster", true /*verbose*/, err) } @@ -1093,12 +1093,12 @@ func (fra *fakeRPCTM) SlaveWasRestarted(ctx context.Context, parent *topodatapb. return nil } -func agentRPCTestSlaveWasRestarted(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSlaveWasRestarted(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SlaveWasRestarted(ctx, tablet, testSlaveWasRestartedParent) compareError(t, "SlaveWasRestarted", err, true, testSlaveWasRestartedCalled) } -func agentRPCTestSlaveWasRestartedPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestSlaveWasRestartedPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.SlaveWasRestarted(ctx, tablet, testSlaveWasRestartedParent) expectHandleRPCPanic(t, "SlaveWasRestarted", true /*verbose*/, err) } @@ -1110,12 +1110,12 @@ func (fra *fakeRPCTM) StopReplicationAndGetStatus(ctx context.Context) (*replica return testReplicationStatus, nil } -func agentRPCTestStopReplicationAndGetStatus(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStopReplicationAndGetStatus(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.StopReplicationAndGetStatus(ctx, tablet) compareError(t, "StopReplicationAndGetStatus", err, rp, testReplicationStatus) } -func agentRPCTestStopReplicationAndGetStatusPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestStopReplicationAndGetStatusPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.StopReplicationAndGetStatus(ctx, tablet) expectHandleRPCPanic(t, "StopReplicationAndGetStatus", true /*verbose*/, err) } @@ -1127,12 +1127,12 @@ func (fra *fakeRPCTM) PromoteSlave(ctx context.Context) (string, error) { return testReplicationPosition, nil } -func agentRPCTestPromoteSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPromoteSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.PromoteSlave(ctx, tablet) compareError(t, "PromoteSlave", err, rp, testReplicationPosition) } -func agentRPCTestPromoteSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPromoteSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.PromoteSlave(ctx, tablet) expectHandleRPCPanic(t, "PromoteSlave", true /*verbose*/, err) } @@ -1144,12 +1144,12 @@ func (fra *fakeRPCTM) PromoteReplica(ctx context.Context) (string, error) { return testReplicationPosition, nil } -func agentRPCTestPromoteReplica(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPromoteReplica(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { rp, err := client.PromoteReplica(ctx, tablet) compareError(t, "PromoteReplica", err, rp, testReplicationPosition) } -func agentRPCTestPromoteReplicaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestPromoteReplicaPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { _, err := client.PromoteReplica(ctx, tablet) expectHandleRPCPanic(t, "PromoteReplica", true /*verbose*/, err) } @@ -1174,7 +1174,7 @@ func (fra *fakeRPCTM) Backup(ctx context.Context, concurrency int, logger loguti return nil } -func agentRPCTestBackup(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestBackup(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { stream, err := client.Backup(ctx, tablet, testBackupConcurrency, testBackupAllowMaster) if err != nil { t.Fatalf("Backup failed: %v", err) @@ -1183,7 +1183,7 @@ func agentRPCTestBackup(ctx context.Context, t *testing.T, client tmclient.Table compareError(t, "Backup", err, true, testBackupCalled) } -func agentRPCTestBackupPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestBackupPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { stream, err := client.Backup(ctx, tablet, testBackupConcurrency, testBackupAllowMaster) if err != nil { t.Fatalf("Backup failed: %v", err) @@ -1204,7 +1204,7 @@ func (fra *fakeRPCTM) RestoreFromBackup(ctx context.Context, logger logutil.Logg return nil } -func agentRPCTestRestoreFromBackup(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestRestoreFromBackup(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { stream, err := client.RestoreFromBackup(ctx, tablet) if err != nil { t.Fatalf("RestoreFromBackup failed: %v", err) @@ -1213,7 +1213,7 @@ func agentRPCTestRestoreFromBackup(ctx context.Context, t *testing.T, client tmc compareError(t, "RestoreFromBackup", err, true, testRestoreFromBackupCalled) } -func agentRPCTestRestoreFromBackupPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { +func tmRPCTestRestoreFromBackupPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { stream, err := client.RestoreFromBackup(ctx, tablet) if err != nil { t.Fatalf("RestoreFromBackup failed: %v", err) @@ -1247,58 +1247,58 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T ctx := context.Background() // Test RPC specific methods of the interface. - agentRPCTestDialExpiredContext(ctx, t, client, tablet) - agentRPCTestRPCTimeout(ctx, t, client, tablet, fakeTM.(*fakeRPCTM)) + tmRPCTestDialExpiredContext(ctx, t, client, tablet) + tmRPCTestRPCTimeout(ctx, t, client, tablet, fakeTM.(*fakeRPCTM)) // Various read-only methods - agentRPCTestPing(ctx, t, client, tablet) - agentRPCTestGetSchema(ctx, t, client, tablet) - agentRPCTestGetPermissions(ctx, t, client, tablet) + tmRPCTestPing(ctx, t, client, tablet) + tmRPCTestGetSchema(ctx, t, client, tablet) + tmRPCTestGetPermissions(ctx, t, client, tablet) // Various read-write methods - agentRPCTestSetReadOnly(ctx, t, client, tablet) - agentRPCTestChangeType(ctx, t, client, tablet) - agentRPCTestSleep(ctx, t, client, tablet) - agentRPCTestExecuteHook(ctx, t, client, tablet) - agentRPCTestRefreshState(ctx, t, client, tablet) - agentRPCTestRunHealthCheck(ctx, t, client, tablet) - agentRPCTestIgnoreHealthError(ctx, t, client, tablet) - agentRPCTestReloadSchema(ctx, t, client, tablet) - agentRPCTestPreflightSchema(ctx, t, client, tablet) - agentRPCTestApplySchema(ctx, t, client, tablet) - agentRPCTestExecuteFetch(ctx, t, client, tablet) + tmRPCTestSetReadOnly(ctx, t, client, tablet) + tmRPCTestChangeType(ctx, t, client, tablet) + tmRPCTestSleep(ctx, t, client, tablet) + tmRPCTestExecuteHook(ctx, t, client, tablet) + tmRPCTestRefreshState(ctx, t, client, tablet) + tmRPCTestRunHealthCheck(ctx, t, client, tablet) + tmRPCTestIgnoreHealthError(ctx, t, client, tablet) + tmRPCTestReloadSchema(ctx, t, client, tablet) + tmRPCTestPreflightSchema(ctx, t, client, tablet) + tmRPCTestApplySchema(ctx, t, client, tablet) + tmRPCTestExecuteFetch(ctx, t, client, tablet) // Replication related methods - agentRPCTestSlaveStatus(ctx, t, client, tablet) - agentRPCTestMasterPosition(ctx, t, client, tablet) - agentRPCTestStopSlave(ctx, t, client, tablet) - agentRPCTestStopSlaveMinimum(ctx, t, client, tablet) - agentRPCTestStartSlave(ctx, t, client, tablet) - agentRPCTestStartSlaveUntilAfter(ctx, t, client, tablet) - agentRPCTestGetSlaves(ctx, t, client, tablet) + tmRPCTestSlaveStatus(ctx, t, client, tablet) + tmRPCTestMasterPosition(ctx, t, client, tablet) + tmRPCTestStopSlave(ctx, t, client, tablet) + tmRPCTestStopSlaveMinimum(ctx, t, client, tablet) + tmRPCTestStartSlave(ctx, t, client, tablet) + tmRPCTestStartSlaveUntilAfter(ctx, t, client, tablet) + tmRPCTestGetSlaves(ctx, t, client, tablet) // VReplication methods - agentRPCTestVReplicationExec(ctx, t, client, tablet) - agentRPCTestVReplicationWaitForPos(ctx, t, client, tablet) + tmRPCTestVReplicationExec(ctx, t, client, tablet) + tmRPCTestVReplicationWaitForPos(ctx, t, client, tablet) // Reparenting related functions - agentRPCTestResetReplication(ctx, t, client, tablet) - agentRPCTestInitMaster(ctx, t, client, tablet) - agentRPCTestPopulateReparentJournal(ctx, t, client, tablet) - agentRPCTestInitSlave(ctx, t, client, tablet) - agentRPCTestDemoteMaster(ctx, t, client, tablet) - agentRPCTestUndoDemoteMaster(ctx, t, client, tablet) - agentRPCTestPromoteSlaveWhenCaughtUp(ctx, t, client, tablet) - agentRPCTestSlaveWasPromoted(ctx, t, client, tablet) - agentRPCTestSetMaster(ctx, t, client, tablet) - agentRPCTestSlaveWasRestarted(ctx, t, client, tablet) - agentRPCTestStopReplicationAndGetStatus(ctx, t, client, tablet) - agentRPCTestPromoteSlave(ctx, t, client, tablet) - agentRPCTestPromoteReplica(ctx, t, client, tablet) + tmRPCTestResetReplication(ctx, t, client, tablet) + tmRPCTestInitMaster(ctx, t, client, tablet) + tmRPCTestPopulateReparentJournal(ctx, t, client, tablet) + tmRPCTestInitSlave(ctx, t, client, tablet) + tmRPCTestDemoteMaster(ctx, t, client, tablet) + tmRPCTestUndoDemoteMaster(ctx, t, client, tablet) + tmRPCTestPromoteSlaveWhenCaughtUp(ctx, t, client, tablet) + tmRPCTestSlaveWasPromoted(ctx, t, client, tablet) + tmRPCTestSetMaster(ctx, t, client, tablet) + tmRPCTestSlaveWasRestarted(ctx, t, client, tablet) + tmRPCTestStopReplicationAndGetStatus(ctx, t, client, tablet) + tmRPCTestPromoteSlave(ctx, t, client, tablet) + tmRPCTestPromoteReplica(ctx, t, client, tablet) // Backup / restore related methods - agentRPCTestBackup(ctx, t, client, tablet) - agentRPCTestRestoreFromBackup(ctx, t, client, tablet) + tmRPCTestBackup(ctx, t, client, tablet) + tmRPCTestRestoreFromBackup(ctx, t, client, tablet) // // Tests panic handling everywhere now @@ -1306,53 +1306,53 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T fakeTM.(*fakeRPCTM).panics = true // Various read-only methods - agentRPCTestPingPanic(ctx, t, client, tablet) - agentRPCTestGetSchemaPanic(ctx, t, client, tablet) - agentRPCTestGetPermissionsPanic(ctx, t, client, tablet) + tmRPCTestPingPanic(ctx, t, client, tablet) + tmRPCTestGetSchemaPanic(ctx, t, client, tablet) + tmRPCTestGetPermissionsPanic(ctx, t, client, tablet) // Various read-write methods - agentRPCTestSetReadOnlyPanic(ctx, t, client, tablet) - agentRPCTestChangeTypePanic(ctx, t, client, tablet) - agentRPCTestSleepPanic(ctx, t, client, tablet) - agentRPCTestExecuteHookPanic(ctx, t, client, tablet) - agentRPCTestRefreshStatePanic(ctx, t, client, tablet) - agentRPCTestRunHealthCheckPanic(ctx, t, client, tablet) - agentRPCTestIgnoreHealthErrorPanic(ctx, t, client, tablet) - agentRPCTestReloadSchemaPanic(ctx, t, client, tablet) - agentRPCTestPreflightSchemaPanic(ctx, t, client, tablet) - agentRPCTestApplySchemaPanic(ctx, t, client, tablet) - agentRPCTestExecuteFetchPanic(ctx, t, client, tablet) + tmRPCTestSetReadOnlyPanic(ctx, t, client, tablet) + tmRPCTestChangeTypePanic(ctx, t, client, tablet) + tmRPCTestSleepPanic(ctx, t, client, tablet) + tmRPCTestExecuteHookPanic(ctx, t, client, tablet) + tmRPCTestRefreshStatePanic(ctx, t, client, tablet) + tmRPCTestRunHealthCheckPanic(ctx, t, client, tablet) + tmRPCTestIgnoreHealthErrorPanic(ctx, t, client, tablet) + tmRPCTestReloadSchemaPanic(ctx, t, client, tablet) + tmRPCTestPreflightSchemaPanic(ctx, t, client, tablet) + tmRPCTestApplySchemaPanic(ctx, t, client, tablet) + tmRPCTestExecuteFetchPanic(ctx, t, client, tablet) // Replication related methods - agentRPCTestSlaveStatusPanic(ctx, t, client, tablet) - agentRPCTestMasterPositionPanic(ctx, t, client, tablet) - agentRPCTestStopSlavePanic(ctx, t, client, tablet) - agentRPCTestStopSlaveMinimumPanic(ctx, t, client, tablet) - agentRPCTestStartSlavePanic(ctx, t, client, tablet) - agentRPCTestGetSlavesPanic(ctx, t, client, tablet) + tmRPCTestSlaveStatusPanic(ctx, t, client, tablet) + tmRPCTestMasterPositionPanic(ctx, t, client, tablet) + tmRPCTestStopSlavePanic(ctx, t, client, tablet) + tmRPCTestStopSlaveMinimumPanic(ctx, t, client, tablet) + tmRPCTestStartSlavePanic(ctx, t, client, tablet) + tmRPCTestGetSlavesPanic(ctx, t, client, tablet) // VReplication methods - agentRPCTestVReplicationExecPanic(ctx, t, client, tablet) - agentRPCTestVReplicationWaitForPosPanic(ctx, t, client, tablet) + tmRPCTestVReplicationExecPanic(ctx, t, client, tablet) + tmRPCTestVReplicationWaitForPosPanic(ctx, t, client, tablet) // Reparenting related functions - agentRPCTestResetReplicationPanic(ctx, t, client, tablet) - agentRPCTestInitMasterPanic(ctx, t, client, tablet) - agentRPCTestPopulateReparentJournalPanic(ctx, t, client, tablet) - agentRPCTestInitSlavePanic(ctx, t, client, tablet) - agentRPCTestDemoteMasterPanic(ctx, t, client, tablet) - agentRPCTestUndoDemoteMasterPanic(ctx, t, client, tablet) - agentRPCTestPromoteSlaveWhenCaughtUpPanic(ctx, t, client, tablet) - agentRPCTestSlaveWasPromotedPanic(ctx, t, client, tablet) - agentRPCTestSetMasterPanic(ctx, t, client, tablet) - agentRPCTestSlaveWasRestartedPanic(ctx, t, client, tablet) - agentRPCTestStopReplicationAndGetStatusPanic(ctx, t, client, tablet) - agentRPCTestPromoteSlavePanic(ctx, t, client, tablet) - agentRPCTestPromoteReplicaPanic(ctx, t, client, tablet) + tmRPCTestResetReplicationPanic(ctx, t, client, tablet) + tmRPCTestInitMasterPanic(ctx, t, client, tablet) + tmRPCTestPopulateReparentJournalPanic(ctx, t, client, tablet) + tmRPCTestInitSlavePanic(ctx, t, client, tablet) + tmRPCTestDemoteMasterPanic(ctx, t, client, tablet) + tmRPCTestUndoDemoteMasterPanic(ctx, t, client, tablet) + tmRPCTestPromoteSlaveWhenCaughtUpPanic(ctx, t, client, tablet) + tmRPCTestSlaveWasPromotedPanic(ctx, t, client, tablet) + tmRPCTestSetMasterPanic(ctx, t, client, tablet) + tmRPCTestSlaveWasRestartedPanic(ctx, t, client, tablet) + tmRPCTestStopReplicationAndGetStatusPanic(ctx, t, client, tablet) + tmRPCTestPromoteSlavePanic(ctx, t, client, tablet) + tmRPCTestPromoteReplicaPanic(ctx, t, client, tablet) // Backup / restore related methods - agentRPCTestBackupPanic(ctx, t, client, tablet) - agentRPCTestRestoreFromBackupPanic(ctx, t, client, tablet) + tmRPCTestBackupPanic(ctx, t, client, tablet) + tmRPCTestRestoreFromBackupPanic(ctx, t, client, tablet) client.Close() } diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index 5a5fe13e6ec..faaa219e859 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -169,7 +169,7 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { vtPort = int32(ft.HTTPListener.Addr().(*net.TCPAddr).Port) } - // Create a test agent on that port, and re-read the record + // Create a test tm on that port, and re-read the record // (it has new ports and IP). ft.TM = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) ft.Tablet = ft.TM.Tablet() diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index 9396e09016a..caedfe5c17a 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -194,7 +194,7 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { vtPort = int32(ft.HTTPListener.Addr().(*net.TCPAddr).Port) } - // Create a test agent on that port, and re-read the record + // Create a test tm on that port, and re-read the record // (it has new ports and IP). ft.TM = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) ft.Tablet = ft.TM.Tablet() From ac077d94b0b21d760cd1a0e95c3cd49e2fa22357 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 12 Jun 2020 19:43:13 -0700 Subject: [PATCH 021/430] tm revamp: rename 'New' functions Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/vttablet.go | 2 +- go/vt/vtcombo/tablet_map.go | 2 +- go/vt/vttablet/tabletmanager/healthcheck_test.go | 2 +- go/vt/vttablet/tabletmanager/tm_init.go | 14 +++++++------- go/vt/wrangler/fake_tablet_test.go | 2 +- go/vt/wrangler/testlib/fake_tablet.go | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index 32c180ba729..02dc7a87e55 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -142,7 +142,7 @@ func main() { if servenv.GRPCPort != nil { gRPCPort = int32(*servenv.GRPCPort) } - tm, err = tabletmanager.NewTabletManager(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) + tm, err = tabletmanager.New(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) if err != nil { log.Exitf("NewTabletManager() failed: %v", err) } diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index a4c17bf89f5..4e03f0f0a5f 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -86,7 +86,7 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, if tabletType == topodatapb.TabletType_MASTER { initTabletType = topodatapb.TabletType_REPLICA } - tm := tabletmanager.NewComboTabletManager(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) + tm := tabletmanager.NewComboTM(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) if tabletType == topodatapb.TabletType_MASTER { if err := tm.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { return fmt.Errorf("TabletExternallyReparented failed on master %v: %v", topoproto.TabletAliasString(alias), err) diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index b7a26335ab5..d168f650f3d 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -158,7 +158,7 @@ func createTestTM(ctx context.Context, t *testing.T, preStart func(*TabletManage } mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} - tm := NewTestTabletManager(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) + tm := NewTestTM(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) tm.HealthReporter = &fakeHealthCheck{} diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 603c9eaba2a..082441804bb 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -117,7 +117,7 @@ func init() { statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) } -// TabletManager is the main class for the tm. +// TabletManager is the main class for the tablet manager. type TabletManager struct { // The following fields are set during creation QueryServiceControl tabletserver.Controller @@ -220,12 +220,12 @@ type TabletManager struct { isPublishing bool } -// NewTabletManager creates a new TabletManager and registers all the +// New creates a new TabletManager and registers all the // associated services. // // batchCtx is the context that the tm will use for any background tasks // it spawns. -func NewTabletManager( +func New( batchCtx context.Context, ts *topo.Server, mysqld mysqlctl.MysqlDaemon, @@ -321,9 +321,9 @@ func NewTabletManager( return tm, nil } -// NewTestTabletManager creates an tm for test purposes. Only a +// NewTestTM creates an tm for test purposes. Only a // subset of features are supported now, but we'll add more over time. -func NewTestTabletManager( +func NewTestTM( batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, @@ -397,10 +397,10 @@ func NewTestTabletManager( return tm } -// NewComboTabletManager creates an tm tailored specifically to run +// NewComboTM creates an tm tailored specifically to run // within the vtcombo binary. It cannot be called concurrently, // as it changes the flags. -func NewComboTabletManager( +func NewComboTM( batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index faaa219e859..15e1014feab 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -171,7 +171,7 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { // Create a test tm on that port, and re-read the record // (it has new ports and IP). - ft.TM = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.TM = tabletmanager.NewTestTM(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) ft.Tablet = ft.TM.Tablet() // Register the gRPC server, and starts listening. diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index caedfe5c17a..552763ea319 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -196,7 +196,7 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { // Create a test tm on that port, and re-read the record // (it has new ports and IP). - ft.TM = tabletmanager.NewTestTabletManager(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.TM = tabletmanager.NewTestTM(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) ft.Tablet = ft.TM.Tablet() // Register the gRPC server, and starts listening. From 2d3641afe0584fa7975eae92665393cd43873842 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 13 Jun 2020 11:52:53 -0700 Subject: [PATCH 022/430] tm revamp: make some members private Preparing for a struct based initialization. Signed-off-by: Sugu Sougoumarane --- go/vt/vtcombo/tablet_map.go | 6 +- go/vt/vttablet/tabletmanager/healthcheck.go | 2 +- .../tabletmanager/healthcheck_test.go | 42 +++++------ go/vt/vttablet/tabletmanager/rpc_actions.go | 6 +- go/vt/vttablet/tabletmanager/rpc_backup.go | 8 +-- go/vt/vttablet/tabletmanager/rpc_server.go | 8 +-- go/vt/vttablet/tabletmanager/shard_sync.go | 6 +- go/vt/vttablet/tabletmanager/state_change.go | 12 ++-- .../tabletmanager/state_change_test.go | 14 ++-- go/vt/vttablet/tabletmanager/tm_init.go | 69 ++++++++++--------- go/vt/vttablet/tabletmanager/tm_init_test.go | 14 ++-- .../testlib/external_reparent_test.go | 6 +- 12 files changed, 98 insertions(+), 95 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 4e03f0f0a5f..9b1d9637309 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -58,6 +58,7 @@ import ( // tablet contains all the data for an individual tablet. type tablet struct { // configuration parameters + alias *topodatapb.TabletAlias keyspace string shard string tabletType topodatapb.TabletType @@ -95,6 +96,7 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, controller.AddStatusHeader() controller.AddStatusPart() tabletMap[uid] = &tablet{ + alias: alias, keyspace: keyspace, shard: shard, tabletType: tabletType, @@ -270,9 +272,9 @@ func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlct // run healthcheck on all vttablets tmc := tmclient.NewTabletManagerClient() for _, tablet := range tabletMap { - tabletInfo, err := ts.GetTablet(ctx, tablet.tm.TabletAlias) + tabletInfo, err := ts.GetTablet(ctx, tablet.alias) if err != nil { - return fmt.Errorf("cannot find tablet: %+v", tablet.tm.TabletAlias) + return fmt.Errorf("cannot find tablet: %+v", tablet.alias) } tmc.RunHealthCheck(ctx, tabletInfo.Tablet) } diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index a3fc2209ee2..2c7e3750d6d 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -196,7 +196,7 @@ func (tm *TabletManager) runHealthCheckLocked() { // Remember the health error as healthErr to be sure we don't // accidentally overwrite it with some other err. - replicationDelay, healthErr := tm.HealthReporter.Report(isSlaveType, shouldBeServing) + replicationDelay, healthErr := tm.healthReporter.Report(isSlaveType, shouldBeServing) if healthErr != nil && ignoreErrorExpr != nil && ignoreErrorExpr.MatchString(healthErr.Error()) { // we need to ignore this health error diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index d168f650f3d..ff7d3274bd2 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -160,7 +160,7 @@ func createTestTM(ctx context.Context, t *testing.T, preStart func(*TabletManage mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} tm := NewTestTM(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) - tm.HealthReporter = &fakeHealthCheck{} + tm.healthReporter = &fakeHealthCheck{} return tm } @@ -195,7 +195,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { // First health check, should keep us as replica and serving. before := time.Now() - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second tm.runHealthCheck() ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -221,8 +221,8 @@ func TestHealthCheckControlsQueryService(t *testing.T) { } // now make the tablet unhealthy - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 13 * time.Second - tm.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 13 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") before = time.Now() tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) @@ -294,8 +294,8 @@ func TestErrSlaveNotRunningIsHealthy(t *testing.T) { // health check returning health.ErrSlaveNotRunning, should // keep us as replica and serving before := time.Now() - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second - tm.HealthReporter.(*fakeHealthCheck).reportError = health.ErrSlaveNotRunning + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportError = health.ErrSlaveNotRunning tm.runHealthCheck() if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") @@ -399,7 +399,7 @@ func TestQueryServiceStopped(t *testing.T) { // first health check, should keep us in replica / healthy before := time.Now() - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 14 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 14 * time.Second tm.runHealthCheck() ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -437,7 +437,7 @@ func TestQueryServiceStopped(t *testing.T) { // health check should now fail before = time.Now() - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 15 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 15 * time.Second tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -488,7 +488,7 @@ func TestTabletControl(t *testing.T) { // first health check, should keep us in replica, just broadcast before := time.Now() - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second tm.runHealthCheck() ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -527,7 +527,7 @@ func TestTabletControl(t *testing.T) { defer unlock(&err) // Let's generate the keyspace graph we have partition information for this cell - err = topotools.RebuildKeyspaceLocked(ctx, logutil.NewConsoleLogger(), tm.TopoServer, "test_keyspace", []string{tm.TabletAlias.GetCell()}) + err = topotools.RebuildKeyspaceLocked(ctx, logutil.NewConsoleLogger(), tm.TopoServer, "test_keyspace", []string{tm.tabletAlias.GetCell()}) if err != nil { t.Fatalf("RebuildKeyspaceLocked failed: %v", err) } @@ -561,7 +561,7 @@ func TestTabletControl(t *testing.T) { // check running a health check will not start it again before = time.Now() - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 17 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 17 * time.Second tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -588,8 +588,8 @@ func TestTabletControl(t *testing.T) { // NOTE: No state change here since nothing has changed. // go unhealthy, check we go to error state and QS is not running - tm.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 18 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 18 * time.Second before = time.Now() tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) @@ -615,8 +615,8 @@ func TestTabletControl(t *testing.T) { } // go back healthy, check QS is still not running - tm.HealthReporter.(*fakeHealthCheck).reportError = nil - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportError = nil + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second before = time.Now() tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) @@ -687,7 +687,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Run health check to turn into a healthy replica - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second tm.runHealthCheck() if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") @@ -700,7 +700,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Change to master. - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second if err := tm.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { t.Fatalf("TabletExternallyReparented failed: %v", err) } @@ -750,7 +750,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Run health check to make sure we stay good - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 20 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 20 * time.Second tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -838,7 +838,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // Refresh the tablet state, as vtctl MigrateServedFrom would do. // This should also trigger a health broadcast since the QueryService state // changes from NOT_SERVING to SERVING. - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 23 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 23 * time.Second tm.RefreshState(ctx) // QueryService changed from NOT_SERVING to SERVING. @@ -906,7 +906,7 @@ func TestBackupStateChange(t *testing.T) { t.Fatal(err) } - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second // change to BACKUP, query service will turn off if err := tm.ChangeType(ctx, topodatapb.TabletType_BACKUP); err != nil { @@ -954,7 +954,7 @@ func TestRestoreStateChange(t *testing.T) { t.Fatal(err) } - tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second // change to RESTORE, query service will turn off if err := tm.ChangeType(ctx, topodatapb.TabletType_RESTORE); err != nil { diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index 18916f23514..d94ac935c28 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -72,7 +72,7 @@ func (tm *TabletManager) changeTypeLocked(ctx context.Context, tabletType topoda // horizontal resharding where two vtworkers will try to DRAIN the same tablet. This check prevents that race from // causing errors. if tabletType == topodatapb.TabletType_DRAINED && tm.Tablet().Type == topodatapb.TabletType_DRAINED { - return fmt.Errorf("Tablet: %v, is already drained", tm.TabletAlias) + return fmt.Errorf("Tablet: %v, is already drained", tm.tabletAlias) } tablet := tm.Tablet() @@ -83,7 +83,7 @@ func (tm *TabletManager) changeTypeLocked(ctx context.Context, tabletType topoda tablet.MasterTermStartTime = logutil.TimeToProto(time.Now()) // change our type in the topology, and set masterTermStartTime on tablet record if applicable - _, err := topotools.ChangeType(ctx, tm.TopoServer, tm.TabletAlias, tabletType, tablet.MasterTermStartTime) + _, err := topotools.ChangeType(ctx, tm.TopoServer, tm.tabletAlias, tabletType, tablet.MasterTermStartTime) if err != nil { return err } @@ -121,7 +121,7 @@ func (tm *TabletManager) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.H defer tm.unlock() // Execute the hooks - topotools.ConfigureTabletHook(hk, tm.TabletAlias) + topotools.ConfigureTabletHook(hk, tm.tabletAlias) return hk.Execute() } diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 0adc8520eb5..3e497ac386f 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -53,7 +53,7 @@ func (tm *TabletManager) Backup(ctx context.Context, concurrency int, logger log return vterrors.Wrap(err, "failed to find backup engine") } // get Tablet info from topo so that it is up to date - tablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + tablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) if err != nil { return err } @@ -78,7 +78,7 @@ func (tm *TabletManager) Backup(ctx context.Context, concurrency int, logger log } defer tm.unlock() - tablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + tablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) if err != nil { return err } @@ -135,7 +135,7 @@ func (tm *TabletManager) RestoreFromBackup(ctx context.Context, logger logutil.L } defer tm.unlock() - tablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + tablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) if err != nil { return err } @@ -159,7 +159,7 @@ func (tm *TabletManager) beginBackup(backupMode string) error { tm.mutex.Lock() defer tm.mutex.Unlock() if tm._isBackupRunning { - return fmt.Errorf("a backup is already running on tablet: %v", tm.TabletAlias) + return fmt.Errorf("a backup is already running on tablet: %v", tm.tabletAlias) } // when mode is online we don't take the action lock, so we continue to serve, // but let's set _isBackupRunning to true diff --git a/go/vt/vttablet/tabletmanager/rpc_server.go b/go/vt/vttablet/tabletmanager/rpc_server.go index 22cea57f8ca..bed3838f44e 100644 --- a/go/vt/vttablet/tabletmanager/rpc_server.go +++ b/go/vt/vttablet/tabletmanager/rpc_server.go @@ -69,7 +69,7 @@ func (tm *TabletManager) checkLock() { func (tm *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) { // panic handling if x := recover(); x != nil { - log.Errorf("TabletManager.%v(%v) on %v panic: %v\n%s", name, args, topoproto.TabletAliasString(tm.TabletAlias), x, tb.Stack(4)) + log.Errorf("TabletManager.%v(%v) on %v panic: %v\n%s", name, args, topoproto.TabletAliasString(tm.tabletAlias), x, tb.Stack(4)) *err = fmt.Errorf("caught panic during %v: %v", name, x) return } @@ -88,11 +88,11 @@ func (tm *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, if *err != nil { // error case - log.Warningf("TabletManager.%v(%v)(on %v from %v) error: %v", name, args, topoproto.TabletAliasString(tm.TabletAlias), from, (*err).Error()) - *err = vterrors.Wrapf(*err, "TabletManager.%v on %v error: %v", name, topoproto.TabletAliasString(tm.TabletAlias), (*err).Error()) + log.Warningf("TabletManager.%v(%v)(on %v from %v) error: %v", name, args, topoproto.TabletAliasString(tm.tabletAlias), from, (*err).Error()) + *err = vterrors.Wrapf(*err, "TabletManager.%v on %v error: %v", name, topoproto.TabletAliasString(tm.tabletAlias), (*err).Error()) } else { // success case - log.Infof("TabletManager.%v(%v)(on %v from %v): %#v", name, args, topoproto.TabletAliasString(tm.TabletAlias), from, reply) + log.Infof("TabletManager.%v(%v)(on %v from %v): %#v", name, args, topoproto.TabletAliasString(tm.tabletAlias), from, reply) } } diff --git a/go/vt/vttablet/tabletmanager/shard_sync.go b/go/vt/vttablet/tabletmanager/shard_sync.go index b6917c04c55..40bde00027d 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync.go +++ b/go/vt/vttablet/tabletmanager/shard_sync.go @@ -195,15 +195,15 @@ func syncShardMaster(ctx context.Context, ts *topo.Server, tablet *topodatapb.Ta // We just directly update our tablet type to REPLICA. func (tm *TabletManager) abortMasterTerm(ctx context.Context, masterAlias *topodatapb.TabletAlias) error { masterAliasStr := topoproto.TabletAliasString(masterAlias) - log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, tm.BaseTabletType) + log.Warningf("Another tablet (%v) has won master election. Stepping down to %v.", masterAliasStr, tm.baseTabletType) if *mysqlctl.DisableActiveReparents { // Don't touch anything at the MySQL level. Just update tablet state. log.Infof("Active reparents are disabled; updating tablet state only.") changeTypeCtx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancel() - if err := tm.ChangeType(changeTypeCtx, tm.BaseTabletType); err != nil { - return vterrors.Wrapf(err, "failed to change type to %v", tm.BaseTabletType) + if err := tm.ChangeType(changeTypeCtx, tm.baseTabletType); err != nil { + return vterrors.Wrapf(err, "failed to change type to %v", tm.baseTabletType) } return nil } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 4f0c49bbbf0..6a4d75a1d73 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -207,7 +207,7 @@ func (tm *TabletManager) changeCallback(ctx context.Context, oldTablet, newTable disallowQueryService = disallowQueryReason } } else { - replicationDelay, healthErr := tm.HealthReporter.Report(true, true) + replicationDelay, healthErr := tm.healthReporter.Report(true, true) if healthErr != nil { allowQuery = false disallowQueryReason = "unable to get health" @@ -357,7 +357,7 @@ func (tm *TabletManager) publishState(ctx context.Context) { // Common code path: publish immediately. ctx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) defer cancel() - _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.TabletAlias, func(tablet *topodatapb.Tablet) error { + _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.tabletAlias, func(tablet *topodatapb.Tablet) error { if err := topotools.CheckOwnership(tablet, tm.tablet); err != nil { log.Error(err) return topo.NewError(topo.NoUpdateNeeded, "") @@ -384,7 +384,7 @@ func (tm *TabletManager) retryPublish() { // Retry immediately the first time because the previous failure might have been // due to an expired context. ctx, cancel := context.WithTimeout(tm.batchCtx, *topo.RemoteOperationTimeout) - _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.TabletAlias, func(tablet *topodatapb.Tablet) error { + _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.tabletAlias, func(tablet *topodatapb.Tablet) error { if err := topotools.CheckOwnership(tablet, tm.tablet); err != nil { log.Error(err) return topo.NewError(topo.NoUpdateNeeded, "") @@ -420,14 +420,14 @@ func (tm *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Dur for { if !firstTime { // If keyspace was rebuilt by someone else, we can just exit. - srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.TabletAlias.Cell, keyspace) + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.tabletAlias.Cell, keyspace) if err == nil { return } } - err = topotools.RebuildKeyspace(tm.batchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.TabletAlias.Cell}) + err = topotools.RebuildKeyspace(tm.batchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.tabletAlias.Cell}) if err == nil { - srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.TabletAlias.Cell, keyspace) + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.tabletAlias.Cell, keyspace) if err == nil { return } diff --git a/go/vt/vttablet/tabletmanager/state_change_test.go b/go/vt/vttablet/tabletmanager/state_change_test.go index c35837e9655..1d4217e9e54 100644 --- a/go/vt/vttablet/tabletmanager/state_change_test.go +++ b/go/vt/vttablet/tabletmanager/state_change_test.go @@ -36,7 +36,7 @@ func TestPublishState(t *testing.T) { ctx := context.Background() tm := createTestTM(ctx, t, nil) - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) assert.Equal(t, tm.Tablet(), ttablet.Tablet) @@ -44,7 +44,7 @@ func TestPublishState(t *testing.T) { tab1.Keyspace = "tab1" tm.setTablet(tab1) tm.publishState(ctx) - ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) assert.Equal(t, tab1, ttablet.Tablet) @@ -52,7 +52,7 @@ func TestPublishState(t *testing.T) { tab2.Keyspace = "tab2" tm.setTablet(tab2) tm.retryPublish() - ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) @@ -61,13 +61,13 @@ func TestPublishState(t *testing.T) { tab3.Hostname = "tab3" tm.setTablet(tab3) tm.publishState(ctx) - ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) // Same for retryPublish. tm.retryPublish() - ttablet, err = tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err = tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) } @@ -80,7 +80,7 @@ func TestFindMysqlPort(t *testing.T) { tm := createTestTM(ctx, t, nil) err := tm.checkMysql(ctx) require.NoError(t, err) - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) assert.Equal(t, ttablet.MysqlPort, int32(0)) @@ -88,7 +88,7 @@ func TestFindMysqlPort(t *testing.T) { tm.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) tm.pubMu.Unlock() for i := 0; i < 10; i++ { - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) if ttablet.MysqlPort == 3306 { return diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 082441804bb..95ceb9b124b 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -120,18 +120,23 @@ func init() { // TabletManager is the main class for the tablet manager. type TabletManager struct { // The following fields are set during creation - QueryServiceControl tabletserver.Controller - UpdateStream binlog.UpdateStreamControl - HealthReporter health.Reporter TopoServer *topo.Server - TabletAlias *topodatapb.TabletAlias Cnf *mysqlctl.Mycnf MysqlDaemon mysqlctl.MysqlDaemon DBConfigs *dbconfigs.DBConfigs + QueryServiceControl tabletserver.Controller + UpdateStream binlog.UpdateStreamControl VREngine *vreplication.Engine - // BaseTabletType is the tablet type we revert back to + + // healthReporter initiates healthchecks. + healthReporter health.Reporter + + // tabletAlias is saved away from tablet for read-only access + tabletAlias *topodatapb.TabletAlias + + // baseTabletType is the tablet type we revert back to // when we transition back from something like MASTER. - BaseTabletType topodatapb.TabletType + baseTabletType topodatapb.TabletType // batchCtx is given to the tm by its creator, and should be used for // any background tasks spawned by the tm. @@ -243,18 +248,18 @@ func New( config.DB.DBName = topoproto.TabletDbName(tablet) tm = &TabletManager{ - QueryServiceControl: queryServiceControl, - HealthReporter: health.DefaultAggregator, batchCtx: batchCtx, TopoServer: ts, - TabletAlias: tabletAlias, Cnf: mycnf, MysqlDaemon: mysqld, DBConfigs: config.DB, + QueryServiceControl: queryServiceControl, History: history.New(historyLength), - _healthy: fmt.Errorf("healthcheck not run yet"), - BaseTabletType: tablet.Type, + tabletAlias: tabletAlias, + baseTabletType: tablet.Type, tablet: tablet, + healthReporter: health.DefaultAggregator, + _healthy: fmt.Errorf("healthcheck not run yet"), } ctx, cancel := context.WithTimeout(tm.batchCtx, *initTimeout) @@ -284,7 +289,7 @@ func New( tm.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) servenv.OnRun(tm.registerQueryService) - tm.UpdateStream = binlog.NewUpdateStream(tm.TopoServer, tablet.Keyspace, tm.TabletAlias.Cell, tm.DBConfigs.DbaWithDB(), tm.QueryServiceControl.SchemaEngine()) + tm.UpdateStream = binlog.NewUpdateStream(tm.TopoServer, tablet.Keyspace, tm.tabletAlias.Cell, tm.DBConfigs.DbaWithDB(), tm.QueryServiceControl.SchemaEngine()) servenv.OnRun(tm.UpdateStream.RegisterService) servenv.OnTerm(tm.UpdateStream.Disable) @@ -342,19 +347,19 @@ func NewTestTM( } tm := &TabletManager{ - QueryServiceControl: tabletservermock.NewController(), - UpdateStream: binlog.NewUpdateStreamControlMock(), - HealthReporter: health.DefaultAggregator, batchCtx: batchCtx, TopoServer: ts, - TabletAlias: tabletAlias, Cnf: nil, MysqlDaemon: mysqlDaemon, DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + UpdateStream: binlog.NewUpdateStreamControlMock(), VREngine: vreplication.NewTestEngine(ts, tabletAlias.Cell, mysqlDaemon, binlogplayer.NewFakeDBClient, ti.DbName(), nil), History: history.New(historyLength), - BaseTabletType: topodatapb.TabletType_REPLICA, + tabletAlias: tabletAlias, + baseTabletType: topodatapb.TabletType_REPLICA, tablet: ti.Tablet, + healthReporter: health.DefaultAggregator, _healthy: fmt.Errorf("healthcheck not run yet"), } if preStart != nil { @@ -421,20 +426,20 @@ func NewComboTM( } dbcfgs.DBName = topoproto.TabletDbName(tablet) tm := &TabletManager{ - QueryServiceControl: queryServiceControl, - UpdateStream: binlog.NewUpdateStreamControlMock(), - HealthReporter: health.DefaultAggregator, batchCtx: batchCtx, TopoServer: ts, - TabletAlias: tabletAlias, Cnf: nil, MysqlDaemon: mysqlDaemon, DBConfigs: dbcfgs, + QueryServiceControl: queryServiceControl, + UpdateStream: binlog.NewUpdateStreamControlMock(), VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), History: history.New(historyLength), - _healthy: fmt.Errorf("healthcheck not run yet"), - BaseTabletType: tablet.Type, + tabletAlias: tabletAlias, + baseTabletType: tablet.Type, tablet: tablet, + healthReporter: health.DefaultAggregator, + _healthy: fmt.Errorf("healthcheck not run yet"), } ctx, cancel := context.WithTimeout(tm.batchCtx, *initTimeout) @@ -611,7 +616,7 @@ func (tm *TabletManager) Close() { updateCtx, updateCancel := context.WithTimeout(context.Background(), *topo.RemoteOperationTimeout) defer updateCancel() - if _, err := tm.TopoServer.UpdateTabletFields(updateCtx, tm.TabletAlias, f); err != nil { + if _, err := tm.TopoServer.UpdateTabletFields(updateCtx, tm.tabletAlias, f); err != nil { log.Warningf("Failed to update tablet record, may contain stale identifiers: %v", err) } } @@ -638,7 +643,7 @@ func (tm *TabletManager) Stop() { // hookExtraEnv returns the map to pass to local hooks func (tm *TabletManager) hookExtraEnv() map[string]string { - return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(tm.TabletAlias)} + return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(tm.tabletAlias)} } // withRetry will exponentially back off and retry a function upon @@ -738,7 +743,7 @@ func (tm *TabletManager) createKeyspaceShard(ctx context.Context) error { } // Rebuild keyspace if this the first tablet in this keyspace/cell - srvKeyspace, err := tm.TopoServer.GetSrvKeyspace(ctx, tm.TabletAlias.Cell, tablet.Keyspace) + srvKeyspace, err := tm.TopoServer.GetSrvKeyspace(ctx, tm.tabletAlias.Cell, tablet.Keyspace) switch { case err == nil: tm._srvKeyspace = srvKeyspace @@ -749,18 +754,18 @@ func (tm *TabletManager) createKeyspaceShard(ctx context.Context) error { } // Rebuild vschema graph if this is the first tablet in this keyspace/cell. - srvVSchema, err := tm.TopoServer.GetSrvVSchema(ctx, tm.TabletAlias.Cell) + srvVSchema, err := tm.TopoServer.GetSrvVSchema(ctx, tm.tabletAlias.Cell) switch { case err == nil: // Check if vschema was rebuilt after the initial creation of the keyspace. if _, keyspaceExists := srvVSchema.GetKeyspaces()[tablet.Keyspace]; !keyspaceExists { - if err := tm.TopoServer.RebuildSrvVSchema(ctx, []string{tm.TabletAlias.Cell}); err != nil { + if err := tm.TopoServer.RebuildSrvVSchema(ctx, []string{tm.tabletAlias.Cell}); err != nil { return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } } case topo.IsErrType(err, topo.NoNode): // There is no SrvSchema in this cell at all, so we definitely need to rebuild. - if err := tm.TopoServer.RebuildSrvVSchema(ctx, []string{tm.TabletAlias.Cell}); err != nil { + if err := tm.TopoServer.RebuildSrvVSchema(ctx, []string{tm.tabletAlias.Cell}); err != nil { return vterrors.Wrap(err, "initeKeyspaceShardTopo: failed to RebuildSrvVSchema") } default: @@ -774,12 +779,12 @@ func (tm *TabletManager) checkMastership(ctx context.Context) error { si := tm._shardInfo tm.mutex.Unlock() - if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, tm.TabletAlias) { + if si.MasterAlias != nil && topoproto.TabletAliasEqual(si.MasterAlias, tm.tabletAlias) { // We're marked as master in the shard record, which could mean the master // tablet process was just restarted. However, we need to check if a new // master is in the process of taking over. In that case, it will let us // know by forcibly updating the old master's tablet record. - oldTablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + oldTablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) switch { case topo.IsErrType(err, topo.NoNode): // There's no existing tablet record, so we can assume @@ -804,7 +809,7 @@ func (tm *TabletManager) checkMastership(ctx context.Context) error { return vterrors.Wrap(err, "InitTablet failed to read existing tablet record") } } else { - oldTablet, err := tm.TopoServer.GetTablet(ctx, tm.TabletAlias) + oldTablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) switch { case topo.IsErrType(err, topo.NoNode): // There's no existing tablet record, so there is nothing to do diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index c9133e1317f..22011930e78 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -46,7 +46,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { // start with a tablet record that doesn't exist tm := &TabletManager{ TopoServer: ts, - TabletAlias: tabletAlias, + tabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), DBConfigs: &dbconfigs.DBConfigs{}, batchCtx: ctx, @@ -63,7 +63,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { Cell: cell, Uid: 2, } - tm.TabletAlias = tabletAlias + tm.tabletAlias = tabletAlias tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) @@ -112,7 +112,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. // start with a tablet record that doesn't exist tm := &TabletManager{ TopoServer: ts, - TabletAlias: tabletAlias, + tabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), DBConfigs: &dbconfigs.DBConfigs{}, batchCtx: ctx, @@ -129,7 +129,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. Cell: "cell1", Uid: 2, } - tm.TabletAlias = tabletAlias + tm.tabletAlias = tabletAlias tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) @@ -186,13 +186,13 @@ func TestInitTablet(t *testing.T) { mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) tm := &TabletManager{ TopoServer: ts, - TabletAlias: tabletAlias, + tabletAlias: tabletAlias, MysqlDaemon: mysqlDaemon, DBConfigs: &dbconfigs.DBConfigs{}, VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), batchCtx: ctx, History: history.New(historyLength), - BaseTabletType: topodatapb.TabletType_REPLICA, + baseTabletType: topodatapb.TabletType_REPLICA, _healthy: fmt.Errorf("healthcheck not run yet"), } @@ -217,7 +217,7 @@ func TestInitTablet(t *testing.T) { t.Fatalf("GetSrvKeyspace failed: %v", err) } - tm.TabletAlias = tabletAlias + tm.tabletAlias = tabletAlias tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) diff --git a/go/vt/wrangler/testlib/external_reparent_test.go b/go/vt/wrangler/testlib/external_reparent_test.go index 6db36fae643..3f0b3d045ec 100644 --- a/go/vt/wrangler/testlib/external_reparent_test.go +++ b/go/vt/wrangler/testlib/external_reparent_test.go @@ -447,7 +447,7 @@ func TestRPCTabletExternallyReparentedDemotesMasterToConfiguredTabletType(t *tes wr := wrangler.New(logutil.NewConsoleLogger(), ts, tmclient.NewTabletManagerClient()) // Create an old master and a new master - oldMaster := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_MASTER, nil) + oldMaster := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_SPARE, nil) newMaster := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_SPARE, nil) oldMaster.StartActionLoop(t, wr) @@ -455,10 +455,6 @@ func TestRPCTabletExternallyReparentedDemotesMasterToConfiguredTabletType(t *tes defer oldMaster.StopActionLoop(t) defer newMaster.StopActionLoop(t) - // For a real TM, this would be initialized from initTabletType. - oldMaster.TM.BaseTabletType = topodatapb.TabletType_SPARE - newMaster.TM.BaseTabletType = topodatapb.TabletType_SPARE - // Build keyspace graph err := topotools.RebuildKeyspace(context.Background(), logutil.NewConsoleLogger(), ts, oldMaster.Tablet.Keyspace, []string{"cell1"}) assert.NoError(t, err, "RebuildKeyspaceLocked failed: %v", err) From b1113c7f43d5e6aafd8da3a32d64e09c340fcb97 Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Sun, 14 Jun 2020 00:23:59 +0530 Subject: [PATCH 023/430] Initial commit for PITR - Added flags for restore to time - Added flags for binlog server details Signed-off-by: Arindam Nayak --- go/vt/vttablet/tabletmanager/restore.go | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index aed6a4a864e..b2265c83c0c 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -17,6 +17,7 @@ limitations under the License. package tabletmanager import ( + "errors" "flag" "fmt" "time" @@ -44,6 +45,13 @@ var ( restoreFromBackup = flag.Bool("restore_from_backup", false, "(init restore parameter) will check BackupStorage for a recent backup at startup and start there") restoreConcurrency = flag.Int("restore_concurrency", 4, "(init restore parameter) how many concurrent files to restore at once") waitForBackupInterval = flag.Duration("wait_for_backup_interval", 0, "(init restore parameter) if this is greater than 0, instead of starting up empty when no backups are found, keep checking at this interval for a backup to appear") + + // Flags for PITR + restoreToTimeStr = flag.String("restore_to_time", "", "(init restore parameter) will restore to the specified time, it depends on the binlog related flags.") + binlogHost = flag.String("binlog_host", "", "(init restore parameter) host name of binlog server.") + binlogPort = flag.Int("binlog_port", 0, "(init restore parameter) port of binlog server.") + binlogUser = flag.String("binlog_user", "", "(init restore parameter) username of binlog server.") + binlogPwd = flag.String("binlog_password", "", "(init restore parameter) password of binlog server.") ) // RestoreData is the main entry point for backup restore. @@ -126,6 +134,17 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. if backupManifest != nil { pos = backupManifest.Position } + // If restore_to_time is set , then apply the incremental change + if restoreToTimeStr != nil { + // validate the dependent settings + if *binlogHost == "" || *binlogPort <= 0 || *binlogUser == "" || *binlogPwd == "" { + return errors.New("restore_to_time flag depends on binlog server flags(binlog_host, binlog_port, binlog_user, binlog_password)") + } + err = agent.restoreToTimeFromBinlog(ctx, pos) + if err != nil { + return nil + } + } switch err { case nil: // Starting from here we won't be able to recover if we get stopped by a cancelled @@ -166,6 +185,19 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. return nil } +func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql.Position) error { + restoreTime, err := time.Parse(time.RFC3339, *restoreToTimeStr) + if err != nil { + return err + } + restoreTimePb := logutil.TimeToProto(restoreTime) + println(restoreTimePb) + // Get GTID from the restoreTime + + // Apply binlog events to the above GTID + return nil +} + func (agent *ActionAgent) startReplication(ctx context.Context, pos mysql.Position, tabletType topodatapb.TabletType) error { cmds := []string{ "STOP SLAVE", From 31cb5f87d988bf5471149b458d138a5a3f2509fc Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 13 Jun 2020 18:10:27 -0700 Subject: [PATCH 024/430] tm revamp: groundwork for different initialization Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/vttablet.go | 94 ++--- go/vt/vttablet/tabletmanager/healthcheck.go | 6 +- .../tabletmanager/replication_reporter.go | 2 +- go/vt/vttablet/tabletmanager/state_change.go | 12 +- go/vt/vttablet/tabletmanager/tm_init.go | 360 +++++++++--------- go/vt/vttablet/tabletmanager/tm_init_test.go | 22 +- 6 files changed, 248 insertions(+), 248 deletions(-) diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index 02dc7a87e55..6f1baf9d261 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -25,6 +25,7 @@ import ( "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/tableacl" "vitess.io/vitess/go/vt/tableacl/simpleacl" @@ -55,7 +56,49 @@ func main() { mysqlctl.RegisterFlags() servenv.ParseFlags("vttablet") + servenv.Init() + + if *tabletPath == "" { + log.Exit("-tablet-path required") + } + tabletAlias, err := topoproto.ParseTabletAlias(*tabletPath) + if err != nil { + log.Exitf("failed to parse -tablet-path: %v", err) + } + + // config and mycnf intializatin is intertwined. + config, mycnf := initConfig(tabletAlias) + + ts := topo.Open() + qsc := createTabletServer(config, ts, tabletAlias) + + mysqld := mysqlctl.NewMysqld(config.DB) + servenv.OnClose(mysqld.Close) + + // Depends on both query and updateStream. + gRPCPort := int32(0) + if servenv.GRPCPort != nil { + gRPCPort = int32(*servenv.GRPCPort) + } + tm, err = tabletmanager.New(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) + if err != nil { + log.Exitf("NewTabletManager() failed: %v", err) + } + + servenv.OnClose(func() { + // Close the tm so that our topo entry gets pruned properly and any + // background goroutines that use the topo connection are stopped. + tm.Close() + // We will still use the topo server during lameduck period + // to update our state, so closing it in OnClose() + ts.Close() + }) + + servenv.RunDefault() +} + +func initConfig(tabletAlias *topodatapb.TabletAlias) (*tabletenv.TabletConfig, *mysqlctl.Mycnf) { tabletenv.Init() // Load current config after tabletenv.Init, because it changes it. config := tabletenv.NewCurrentConfig() @@ -75,16 +118,6 @@ func main() { gotBytes, _ := yaml2.Marshal(config) log.Infof("Loaded config file %s successfully:\n%s", *tabletConfig, gotBytes) - servenv.Init() - - if *tabletPath == "" { - log.Exit("-tablet-path required") - } - tabletAlias, err := topoproto.ParseTabletAlias(*tabletPath) - if err != nil { - log.Exitf("failed to parse -tablet-path: %v", err) - } - var mycnf *mysqlctl.Mycnf var socketFile string // If no connection parameters were specified, load the mycnf file @@ -108,54 +141,23 @@ func main() { for _, cfg := range config.ExternalConnections { cfg.InitWithSocket("") } + return config, mycnf +} +func createTabletServer(config *tabletenv.TabletConfig, ts *topo.Server, tabletAlias *topodatapb.TabletAlias) *tabletserver.TabletServer { if *tableACLConfig != "" { // To override default simpleacl, other ACL plugins must set themselves to be default ACL factory tableacl.Register("simpleacl", &simpleacl.Factory{}) } else if *enforceTableACLConfig { log.Exit("table acl config has to be specified with table-acl-config flag because enforce-tableacl-config is set.") } - // creates and registers the query service - ts := topo.Open() qsc := tabletserver.NewTabletServer("", config, ts, *tabletAlias) servenv.OnRun(func() { qsc.Register() addStatusParts(qsc) }) - servenv.OnClose(func() { - // We now leave the queryservice running during lameduck, - // so stop it in OnClose(), after lameduck is over. - qsc.StopService() - }) - + servenv.OnClose(qsc.StopService) qsc.InitACL(*tableACLConfig, *enforceTableACLConfig, *tableACLConfigReloadInterval) - - // Create mysqld and register the health reporter (needs to be done - // before initializing the tm, so the initial health check - // done by the tm has the right reporter) - mysqld := mysqlctl.NewMysqld(config.DB) - servenv.OnClose(mysqld.Close) - - // Depends on both query and updateStream. - gRPCPort := int32(0) - if servenv.GRPCPort != nil { - gRPCPort = int32(*servenv.GRPCPort) - } - tm, err = tabletmanager.New(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) - if err != nil { - log.Exitf("NewTabletManager() failed: %v", err) - } - - servenv.OnClose(func() { - // Close the tm so that our topo entry gets pruned properly and any - // background goroutines that use the topo connection are stopped. - tm.Close() - - // We will still use the topo server during lameduck period - // to update our state, so closing it in OnClose() - ts.Close() - }) - - servenv.RunDefault() + return qsc } diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index 2c7e3750d6d..dcbca97c4d5 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -169,7 +169,7 @@ func (tm *TabletManager) initHealthCheck() { // This will not change the TabletControl record, but will use it // to see if we should be running the query service. func (tm *TabletManager) runHealthCheck() { - if err := tm.lock(tm.batchCtx); err != nil { + if err := tm.lock(tm.BatchCtx); err != nil { log.Warningf("cannot lock actionMutex, not running HealthCheck") return } @@ -270,7 +270,7 @@ func (tm *TabletManager) runHealthCheckLocked() { // came up. This is because the mysql could have been in read-only mode, etc. // So, start the engine if it's not already running. if tablet.Type == topodatapb.TabletType_MASTER && !tm.VREngine.IsOpen() { - if err := tm.VREngine.Open(tm.batchCtx); err == nil { + if err := tm.VREngine.Open(tm.BatchCtx); err == nil { log.Info("VReplication engine successfully started") } } @@ -297,7 +297,7 @@ func (tm *TabletManager) runHealthCheckLocked() { // We only do something if we are in a serving state, and not a master. func (tm *TabletManager) terminateHealthChecks() { // No need to check for error, only a canceled batchCtx would fail this. - tm.lock(tm.batchCtx) + tm.lock(tm.BatchCtx) defer tm.unlock() log.Info("tm.terminateHealthChecks is starting") diff --git a/go/vt/vttablet/tabletmanager/replication_reporter.go b/go/vt/vttablet/tabletmanager/replication_reporter.go index 4ea339c4934..2e313fb8c34 100644 --- a/go/vt/vttablet/tabletmanager/replication_reporter.go +++ b/go/vt/vttablet/tabletmanager/replication_reporter.go @@ -68,7 +68,7 @@ func (r *replicationReporter) Report(isSlaveType, shouldQueryServiceBeRunning bo log.Infof("Slave is stopped. Running with --disable_active_reparents so will not try to reconnect to master...") } else { log.Infof("Slave is stopped. Trying to reconnect to master...") - ctx, cancel := context.WithTimeout(r.tm.batchCtx, 5*time.Second) + ctx, cancel := context.WithTimeout(r.tm.BatchCtx, 5*time.Second) if err := repairReplication(ctx, r.tm); err != nil { log.Infof("Failed to reconnect to master: %v", err) } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 6a4d75a1d73..cd37b06c740 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -331,7 +331,7 @@ func (tm *TabletManager) changeCallback(ctx context.Context, oldTablet, newTable // See if we need to start or stop vreplication. if newTablet.Type == topodatapb.TabletType_MASTER { - if err := tm.VREngine.Open(tm.batchCtx); err != nil { + if err := tm.VREngine.Open(tm.BatchCtx); err != nil { log.Errorf("Could not start VReplication engine: %v. Will keep retrying at health check intervals.", err) } else { log.Info("VReplication engine started") @@ -383,7 +383,7 @@ func (tm *TabletManager) retryPublish() { for { // Retry immediately the first time because the previous failure might have been // due to an expired context. - ctx, cancel := context.WithTimeout(tm.batchCtx, *topo.RemoteOperationTimeout) + ctx, cancel := context.WithTimeout(tm.BatchCtx, *topo.RemoteOperationTimeout) _, err := tm.TopoServer.UpdateTabletFields(ctx, tm.tabletAlias, func(tablet *topodatapb.Tablet) error { if err := topotools.CheckOwnership(tablet, tm.tablet); err != nil { log.Error(err) @@ -420,14 +420,14 @@ func (tm *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Dur for { if !firstTime { // If keyspace was rebuilt by someone else, we can just exit. - srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.tabletAlias.Cell, keyspace) + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.BatchCtx, tm.tabletAlias.Cell, keyspace) if err == nil { return } } - err = topotools.RebuildKeyspace(tm.batchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.tabletAlias.Cell}) + err = topotools.RebuildKeyspace(tm.BatchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.tabletAlias.Cell}) if err == nil { - srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.batchCtx, tm.tabletAlias.Cell, keyspace) + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.BatchCtx, tm.tabletAlias.Cell, keyspace) if err == nil { return } @@ -451,7 +451,7 @@ func (tm *TabletManager) findMysqlPort(retryInterval time.Duration) { tm.pubMu.Lock() tm.tablet.MysqlPort = mport tm.pubMu.Unlock() - tm.publishState(tm.batchCtx) + tm.publishState(tm.BatchCtx) return } } diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 95ceb9b124b..48485e9e973 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -120,6 +120,7 @@ func init() { // TabletManager is the main class for the tablet manager. type TabletManager struct { // The following fields are set during creation + BatchCtx context.Context TopoServer *topo.Server Cnf *mysqlctl.Mycnf MysqlDaemon mysqlctl.MysqlDaemon @@ -138,10 +139,6 @@ type TabletManager struct { // when we transition back from something like MASTER. baseTabletType topodatapb.TabletType - // batchCtx is given to the tm by its creator, and should be used for - // any background tasks spawned by the tm. - batchCtx context.Context - // History of the health checks, public so status // pages can display it History *history.History @@ -225,6 +222,56 @@ type TabletManager struct { isPublishing bool } +// BuildTabletFromInput builds a tablet record from input parameters. +func BuildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) (*topodatapb.Tablet, error) { + hostname := *tabletHostname + if hostname == "" { + var err error + hostname, err = netutil.FullyQualifiedHostname() + if err != nil { + return nil, err + } + log.Infof("Using detected machine hostname: %v To change this, fix your machine network configuration or override it with -tablet_hostname.", hostname) + } else { + log.Infof("Using hostname: %v from -tablet_hostname flag.", hostname) + } + + if *initKeyspace == "" || *initShard == "" { + return nil, fmt.Errorf("init_keyspace and init_shard must be specified") + } + + // parse and validate shard name + shard, keyRange, err := topo.ValidateShardName(*initShard) + if err != nil { + return nil, vterrors.Wrapf(err, "cannot validate shard name %v", *initShard) + } + + tabletType, err := topoproto.ParseTabletType(*initTabletType) + if err != nil { + return nil, err + } + switch tabletType { + case topodatapb.TabletType_SPARE, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY: + default: + return nil, fmt.Errorf("invalid init_tablet_type %v; can only be REPLICA, RDONLY or SPARE", tabletType) + } + + return &topodatapb.Tablet{ + Alias: alias, + Hostname: hostname, + PortMap: map[string]int32{ + "vt": port, + "grpc": grpcPort, + }, + Keyspace: *initKeyspace, + Shard: shard, + KeyRange: keyRange, + Type: tabletType, + DbNameOverride: *initDbNameOverride, + Tags: initTags, + }, nil +} + // New creates a new TabletManager and registers all the // associated services. // @@ -241,14 +288,14 @@ func New( port, gRPCPort int32, ) (tm *TabletManager, err error) { - tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) + tablet, err := BuildTabletFromInput(tabletAlias, port, gRPCPort) if err != nil { return nil, err } config.DB.DBName = topoproto.TabletDbName(tablet) tm = &TabletManager{ - batchCtx: batchCtx, + BatchCtx: batchCtx, TopoServer: ts, Cnf: mycnf, MysqlDaemon: mysqld, @@ -262,7 +309,7 @@ func New( _healthy: fmt.Errorf("healthcheck not run yet"), } - ctx, cancel := context.WithTimeout(tm.batchCtx, *initTimeout) + ctx, cancel := context.WithTimeout(tm.BatchCtx, *initTimeout) defer cancel() if err = tm.createKeyspaceShard(ctx); err != nil { return nil, err @@ -347,7 +394,7 @@ func NewTestTM( } tm := &TabletManager{ - batchCtx: batchCtx, + BatchCtx: batchCtx, TopoServer: ts, Cnf: nil, MysqlDaemon: mysqlDaemon, @@ -420,13 +467,13 @@ func NewComboTM( *initKeyspace = keyspace *initShard = shard *initTabletType = tabletTypeStr - tablet, err := buildTabletFromInput(tabletAlias, vtPort, grpcPort) + tablet, err := BuildTabletFromInput(tabletAlias, vtPort, grpcPort) if err != nil { panic(err) } dbcfgs.DBName = topoproto.TabletDbName(tablet) tm := &TabletManager{ - batchCtx: batchCtx, + BatchCtx: batchCtx, TopoServer: ts, Cnf: nil, MysqlDaemon: mysqlDaemon, @@ -442,7 +489,7 @@ func NewComboTM( _healthy: fmt.Errorf("healthcheck not run yet"), } - ctx, cancel := context.WithTimeout(tm.batchCtx, *initTimeout) + ctx, cancel := context.WithTimeout(tm.BatchCtx, *initTimeout) defer cancel() if err := tm.createKeyspaceShard(ctx); err != nil { panic(err) @@ -472,127 +519,6 @@ func NewComboTM( return tm } -func (tm *TabletManager) setTablet(tablet *topodatapb.Tablet) { - tm.pubMu.Lock() - tm.tablet = proto.Clone(tablet).(*topodatapb.Tablet) - tm.pubMu.Unlock() - - // Notify the shard sync loop that the tablet state changed. - tm.notifyShardSync() -} - -func (tm *TabletManager) updateTablet(update func(tablet *topodatapb.Tablet)) { - tm.pubMu.Lock() - update(tm.tablet) - tm.pubMu.Unlock() - - // Notify the shard sync loop that the tablet state changed. - tm.notifyShardSync() -} - -// Tablet reads the stored Tablet from the tm. -func (tm *TabletManager) Tablet() *topodatapb.Tablet { - tm.pubMu.Lock() - tablet := proto.Clone(tm.tablet).(*topodatapb.Tablet) - tm.pubMu.Unlock() - return tablet -} - -// Healthy reads the result of the latest healthcheck, protected by mutex. -// If that status is too old, it means healthcheck hasn't run for a while, -// and is probably stuck, this is not good, we're not healthy. -func (tm *TabletManager) Healthy() (time.Duration, error) { - tm.mutex.Lock() - defer tm.mutex.Unlock() - - healthy := tm._healthy - if healthy == nil { - timeSinceLastCheck := time.Since(tm._healthyTime) - if timeSinceLastCheck > *healthCheckInterval*3 { - healthy = fmt.Errorf("last health check is too old: %s > %s", timeSinceLastCheck, *healthCheckInterval*3) - } - } - - return tm._replicationDelay, healthy -} - -// BlacklistedTables returns the list of currently blacklisted tables. -func (tm *TabletManager) BlacklistedTables() []string { - tm.mutex.Lock() - defer tm.mutex.Unlock() - return tm._blacklistedTables -} - -// DisallowQueryService returns the reason the query service should be -// disabled, if any. -func (tm *TabletManager) DisallowQueryService() string { - tm.mutex.Lock() - defer tm.mutex.Unlock() - return tm._disallowQueryService -} - -func (tm *TabletManager) slaveStopped() bool { - tm.mutex.Lock() - defer tm.mutex.Unlock() - - // If we already know the value, don't bother checking the file. - if tm._slaveStopped != nil { - return *tm._slaveStopped - } - - // If there's no Cnf file, don't read state. - if tm.Cnf == nil { - return false - } - - // If the marker file exists, we're stopped. - // Treat any read error as if the file doesn't exist. - _, err := os.Stat(path.Join(tm.Cnf.TabletDir(), slaveStoppedFile)) - slaveStopped := err == nil - tm._slaveStopped = &slaveStopped - return slaveStopped -} - -func (tm *TabletManager) setSlaveStopped(slaveStopped bool) { - tm.mutex.Lock() - defer tm.mutex.Unlock() - - tm._slaveStopped = &slaveStopped - - // Make a best-effort attempt to persist the value across tablet restarts. - // We store a marker in the filesystem so it works regardless of whether - // mysqld is running, and so it's tied to this particular instance of the - // tablet data dir (the one that's paused at a known replication position). - if tm.Cnf == nil { - return - } - tabletDir := tm.Cnf.TabletDir() - if tabletDir == "" { - return - } - markerFile := path.Join(tabletDir, slaveStoppedFile) - if slaveStopped { - file, err := os.Create(markerFile) - if err == nil { - file.Close() - } - } else { - os.Remove(markerFile) - } -} - -func (tm *TabletManager) setServicesDesiredState(disallowQueryService string) { - tm.mutex.Lock() - tm._disallowQueryService = disallowQueryService - tm.mutex.Unlock() -} - -func (tm *TabletManager) setBlacklistedTables(value []string) { - tm.mutex.Lock() - tm._blacklistedTables = value - tm.mutex.Unlock() -} - // Close prepares a tablet for shutdown. First we check our tablet ownership and // then prune the tablet topology entry of all post-init fields. This prevents // stale identifiers from hanging around in topology. @@ -676,55 +602,6 @@ func (tm *TabletManager) withRetry(ctx context.Context, description string, work } } -func buildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) (*topodatapb.Tablet, error) { - hostname := *tabletHostname - if hostname == "" { - var err error - hostname, err = netutil.FullyQualifiedHostname() - if err != nil { - return nil, err - } - log.Infof("Using detected machine hostname: %v To change this, fix your machine network configuration or override it with -tablet_hostname.", hostname) - } else { - log.Infof("Using hostname: %v from -tablet_hostname flag.", hostname) - } - - if *initKeyspace == "" || *initShard == "" { - return nil, fmt.Errorf("init_keyspace and init_shard must be specified") - } - - // parse and validate shard name - shard, keyRange, err := topo.ValidateShardName(*initShard) - if err != nil { - return nil, vterrors.Wrapf(err, "cannot validate shard name %v", *initShard) - } - - tabletType, err := topoproto.ParseTabletType(*initTabletType) - if err != nil { - return nil, err - } - switch tabletType { - case topodatapb.TabletType_SPARE, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY: - default: - return nil, fmt.Errorf("invalid init_tablet_type %v; can only be REPLICA, RDONLY or SPARE", tabletType) - } - - return &topodatapb.Tablet{ - Alias: alias, - Hostname: hostname, - PortMap: map[string]int32{ - "vt": port, - "grpc": grpcPort, - }, - Keyspace: *initKeyspace, - Shard: shard, - KeyRange: keyRange, - Type: tabletType, - DbNameOverride: *initDbNameOverride, - Tags: initTags, - }, nil -} - func (tm *TabletManager) createKeyspaceShard(ctx context.Context) error { // mutex is needed because we set _shardInfo and _srvKeyspace tm.mutex.Lock() @@ -956,3 +833,124 @@ func (tm *TabletManager) exportStats() { } statsAlias.Set(topoproto.TabletAliasString(tablet.Alias)) } + +func (tm *TabletManager) setTablet(tablet *topodatapb.Tablet) { + tm.pubMu.Lock() + tm.tablet = proto.Clone(tablet).(*topodatapb.Tablet) + tm.pubMu.Unlock() + + // Notify the shard sync loop that the tablet state changed. + tm.notifyShardSync() +} + +func (tm *TabletManager) updateTablet(update func(tablet *topodatapb.Tablet)) { + tm.pubMu.Lock() + update(tm.tablet) + tm.pubMu.Unlock() + + // Notify the shard sync loop that the tablet state changed. + tm.notifyShardSync() +} + +// Tablet reads the stored Tablet from the tm. +func (tm *TabletManager) Tablet() *topodatapb.Tablet { + tm.pubMu.Lock() + tablet := proto.Clone(tm.tablet).(*topodatapb.Tablet) + tm.pubMu.Unlock() + return tablet +} + +// Healthy reads the result of the latest healthcheck, protected by mutex. +// If that status is too old, it means healthcheck hasn't run for a while, +// and is probably stuck, this is not good, we're not healthy. +func (tm *TabletManager) Healthy() (time.Duration, error) { + tm.mutex.Lock() + defer tm.mutex.Unlock() + + healthy := tm._healthy + if healthy == nil { + timeSinceLastCheck := time.Since(tm._healthyTime) + if timeSinceLastCheck > *healthCheckInterval*3 { + healthy = fmt.Errorf("last health check is too old: %s > %s", timeSinceLastCheck, *healthCheckInterval*3) + } + } + + return tm._replicationDelay, healthy +} + +// BlacklistedTables returns the list of currently blacklisted tables. +func (tm *TabletManager) BlacklistedTables() []string { + tm.mutex.Lock() + defer tm.mutex.Unlock() + return tm._blacklistedTables +} + +// DisallowQueryService returns the reason the query service should be +// disabled, if any. +func (tm *TabletManager) DisallowQueryService() string { + tm.mutex.Lock() + defer tm.mutex.Unlock() + return tm._disallowQueryService +} + +func (tm *TabletManager) slaveStopped() bool { + tm.mutex.Lock() + defer tm.mutex.Unlock() + + // If we already know the value, don't bother checking the file. + if tm._slaveStopped != nil { + return *tm._slaveStopped + } + + // If there's no Cnf file, don't read state. + if tm.Cnf == nil { + return false + } + + // If the marker file exists, we're stopped. + // Treat any read error as if the file doesn't exist. + _, err := os.Stat(path.Join(tm.Cnf.TabletDir(), slaveStoppedFile)) + slaveStopped := err == nil + tm._slaveStopped = &slaveStopped + return slaveStopped +} + +func (tm *TabletManager) setSlaveStopped(slaveStopped bool) { + tm.mutex.Lock() + defer tm.mutex.Unlock() + + tm._slaveStopped = &slaveStopped + + // Make a best-effort attempt to persist the value across tablet restarts. + // We store a marker in the filesystem so it works regardless of whether + // mysqld is running, and so it's tied to this particular instance of the + // tablet data dir (the one that's paused at a known replication position). + if tm.Cnf == nil { + return + } + tabletDir := tm.Cnf.TabletDir() + if tabletDir == "" { + return + } + markerFile := path.Join(tabletDir, slaveStoppedFile) + if slaveStopped { + file, err := os.Create(markerFile) + if err == nil { + file.Close() + } + } else { + os.Remove(markerFile) + } +} + +func (tm *TabletManager) setServicesDesiredState(disallowQueryService string) { + tm.mutex.Lock() + tm._disallowQueryService = disallowQueryService + tm.mutex.Unlock() +} + +func (tm *TabletManager) setBlacklistedTables(value []string) { + tm.mutex.Lock() + tm._blacklistedTables = value + tm.mutex.Unlock() +} diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 22011930e78..3f3a73e8708 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -49,7 +49,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { tabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), DBConfigs: &dbconfigs.DBConfigs{}, - batchCtx: ctx, + BatchCtx: ctx, History: history.New(historyLength), _healthy: fmt.Errorf("healthcheck not run yet"), } @@ -65,7 +65,7 @@ func TestInitTabletFixesReplicationData(t *testing.T) { } tm.tabletAlias = tabletAlias - tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) + tablet, err := BuildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -115,7 +115,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. tabletAlias: tabletAlias, MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), DBConfigs: &dbconfigs.DBConfigs{}, - batchCtx: ctx, + BatchCtx: ctx, History: history.New(historyLength), _healthy: fmt.Errorf("healthcheck not run yet"), } @@ -131,7 +131,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. } tm.tabletAlias = tabletAlias - tablet, err := buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) + tablet, err := BuildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -153,7 +153,7 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. // Try to initialize a tablet with the same uid in a different shard. *initShard = "-D0" - tablet, err = buildTabletFromInput(tabletAlias, int32(1234), int32(3456)) + tablet, err = BuildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -190,7 +190,7 @@ func TestInitTablet(t *testing.T) { MysqlDaemon: mysqlDaemon, DBConfigs: &dbconfigs.DBConfigs{}, VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), - batchCtx: ctx, + BatchCtx: ctx, History: history.New(historyLength), baseTabletType: topodatapb.TabletType_REPLICA, _healthy: fmt.Errorf("healthcheck not run yet"), @@ -219,7 +219,7 @@ func TestInitTablet(t *testing.T) { tm.tabletAlias = tabletAlias - tablet, err := buildTabletFromInput(tabletAlias, port, gRPCPort) + tablet, err := BuildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -278,7 +278,7 @@ func TestInitTablet(t *testing.T) { t.Fatalf("UpdateShardFields failed: %v", err) } - tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -305,7 +305,7 @@ func TestInitTablet(t *testing.T) { t.Fatalf("DeleteTablet failed: %v", err) } - tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -335,7 +335,7 @@ func TestInitTablet(t *testing.T) { t.Fatalf("UpdateTablet failed: %v", err) } - tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) @@ -362,7 +362,7 @@ func TestInitTablet(t *testing.T) { *initDbNameOverride = "DBNAME" initTags.Set("aaa:bbb") - tablet, err = buildTabletFromInput(tabletAlias, port, gRPCPort) + tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) require.NoError(t, err) tm.tablet = tablet err = tm.createKeyspaceShard(context.Background()) From 9ed5de7f9f6d224e43bf2354b7b92c6c5e6b351b Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 13 Jun 2020 19:05:32 -0700 Subject: [PATCH 025/430] tm revamp: use new initialization method Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/vttablet.go | 21 ++++-- go/vt/vttablet/grpctmserver/server.go | 2 +- go/vt/vttablet/tabletmanager/rpc_server.go | 14 ++-- go/vt/vttablet/tabletmanager/tm_init.go | 79 +++++++--------------- 4 files changed, 49 insertions(+), 67 deletions(-) diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index 6f1baf9d261..f33239b0fe4 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -75,23 +75,32 @@ func main() { mysqld := mysqlctl.NewMysqld(config.DB) servenv.OnClose(mysqld.Close) - // Depends on both query and updateStream. + // Initialize and start tm. gRPCPort := int32(0) if servenv.GRPCPort != nil { gRPCPort = int32(*servenv.GRPCPort) } - tm, err = tabletmanager.New(context.Background(), ts, mysqld, qsc, tabletAlias, config, mycnf, int32(*servenv.Port), gRPCPort) + tablet, err := tabletmanager.BuildTabletFromInput(tabletAlias, int32(*servenv.Port), gRPCPort) if err != nil { - log.Exitf("NewTabletManager() failed: %v", err) + log.Exitf("failed to parse -tablet-path: %v", err) + } + tm = &tabletmanager.TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + Cnf: mycnf, + MysqlDaemon: mysqld, + DBConfigs: config.DB.Clone(), + QueryServiceControl: qsc, + } + if err := tm.Start(tablet, config); err != nil { + log.Exitf("failed to parse -tablet-path: %v", err) } - servenv.OnClose(func() { // Close the tm so that our topo entry gets pruned properly and any // background goroutines that use the topo connection are stopped. tm.Close() - // We will still use the topo server during lameduck period - // to update our state, so closing it in OnClose() + // tm uses ts. So, it should be closed after tm. ts.Close() }) diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index 14b8d032f9a..a38b305037e 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -482,7 +482,7 @@ func (s *server) RestoreFromBackup(request *tabletmanagerdatapb.RestoreFromBacku // registration glue func init() { - tabletmanager.RegisterQueryServices = append(tabletmanager.RegisterQueryServices, func(tm *tabletmanager.TabletManager) { + tabletmanager.RegisterTabletManagers = append(tabletmanager.RegisterTabletManagers, func(tm *tabletmanager.TabletManager) { if servenv.GRPCCheckServiceMap("tabletmanager") { tabletmanagerservicepb.RegisterTabletManagerServer(servenv.GRPCServer, &server{tm}) } diff --git a/go/vt/vttablet/tabletmanager/rpc_server.go b/go/vt/vttablet/tabletmanager/rpc_server.go index bed3838f44e..25e300c1b73 100644 --- a/go/vt/vttablet/tabletmanager/rpc_server.go +++ b/go/vt/vttablet/tabletmanager/rpc_server.go @@ -97,15 +97,15 @@ func (tm *TabletManager) HandleRPCPanic(ctx context.Context, name string, args, } // -// RegisterQueryService is used to delay registration of RPC servers until we have all the objects. -type RegisterQueryService func(*TabletManager) +// RegisterTabletManager is used to delay registration of RPC servers until we have all the objects. +type RegisterTabletManager func(*TabletManager) -// RegisterQueryServices is a list of functions to call when the delayed registration is triggered. -var RegisterQueryServices []RegisterQueryService +// RegisterTabletManagers is a list of functions to call when the delayed registration is triggered. +var RegisterTabletManagers []RegisterTabletManager -// registerQueryService will register all the instances. -func (tm *TabletManager) registerQueryService() { - for _, f := range RegisterQueryServices { +// registerTabletManager will register all the instances. +func (tm *TabletManager) registerTabletManager() { + for _, f := range RegisterTabletManagers { f(tm) } } diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 48485e9e973..69da2466e71 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -272,79 +272,50 @@ func BuildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( }, nil } -// New creates a new TabletManager and registers all the -// associated services. -// -// batchCtx is the context that the tm will use for any background tasks -// it spawns. -func New( - batchCtx context.Context, - ts *topo.Server, - mysqld mysqlctl.MysqlDaemon, - queryServiceControl tabletserver.Controller, - tabletAlias *topodatapb.TabletAlias, - config *tabletenv.TabletConfig, - mycnf *mysqlctl.Mycnf, - port, gRPCPort int32, -) (tm *TabletManager, err error) { - - tablet, err := BuildTabletFromInput(tabletAlias, port, gRPCPort) - if err != nil { - return nil, err - } - config.DB.DBName = topoproto.TabletDbName(tablet) - - tm = &TabletManager{ - BatchCtx: batchCtx, - TopoServer: ts, - Cnf: mycnf, - MysqlDaemon: mysqld, - DBConfigs: config.DB, - QueryServiceControl: queryServiceControl, - History: history.New(historyLength), - tabletAlias: tabletAlias, - baseTabletType: tablet.Type, - tablet: tablet, - healthReporter: health.DefaultAggregator, - _healthy: fmt.Errorf("healthcheck not run yet"), - } +// Start starts the TabletManager. +func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.TabletConfig) error { + tm.setTablet(tablet) + tm.DBConfigs.DBName = topoproto.TabletDbName(tablet) + tm.History = history.New(historyLength) + tm.tabletAlias = tablet.Alias + tm.baseTabletType = tablet.Type + tm.healthReporter = health.DefaultAggregator + tm._healthy = fmt.Errorf("healthcheck not run yet") ctx, cancel := context.WithTimeout(tm.BatchCtx, *initTimeout) defer cancel() - if err = tm.createKeyspaceShard(ctx); err != nil { - return nil, err + if err := tm.createKeyspaceShard(ctx); err != nil { + return err } if err := tm.checkMastership(ctx); err != nil { - return nil, err + return err } if err := tm.checkMysql(ctx); err != nil { - return nil, err + return err } if err := tm.initTablet(ctx); err != nil { - return nil, err + return err } - tablet = tm.Tablet() - err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ + err := tm.QueryServiceControl.InitDBConfig(querypb.Target{ Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type, }, tm.DBConfigs) if err != nil { - return nil, vterrors.Wrap(err, "failed to InitDBConfig") + return vterrors.Wrap(err, "failed to InitDBConfig") } tm.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) - servenv.OnRun(tm.registerQueryService) tm.UpdateStream = binlog.NewUpdateStream(tm.TopoServer, tablet.Keyspace, tm.tabletAlias.Cell, tm.DBConfigs.DbaWithDB(), tm.QueryServiceControl.SchemaEngine()) servenv.OnRun(tm.UpdateStream.RegisterService) servenv.OnTerm(tm.UpdateStream.Disable) - tm.VREngine = vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld) + tm.VREngine = vreplication.NewEngine(config, tm.TopoServer, tablet.Alias.Cell, tm.MysqlDaemon) servenv.OnTerm(tm.VREngine.Close) - if err := tm.handleRestore(batchCtx); err != nil { - return nil, err + if err := tm.handleRestore(tm.BatchCtx); err != nil { + return err } tm.startShardSync() @@ -354,23 +325,25 @@ func New( // Start periodic Orchestrator self-registration, if configured. orc, err := newOrcClient() if err != nil { - return nil, err + return err } if orc != nil { tm.orc = orc go tm.orc.DiscoverLoop(tm) } + servenv.OnRun(tm.registerTabletManager) + // Temporary glue code to keep things working. // TODO(sougou); remove after refactor. - if err := tm.lock(batchCtx); err != nil { - return nil, err + if err := tm.lock(tm.BatchCtx); err != nil { + return err } defer tm.unlock() tablet = tm.Tablet() - tm.changeCallback(batchCtx, tablet, tablet) + tm.changeCallback(tm.BatchCtx, tablet, tablet) - return tm, nil + return nil } // NewTestTM creates an tm for test purposes. Only a From 127e9f721e4e5e36e7421b28ebe460a4a6a79a6f Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 13 Jun 2020 19:38:43 -0700 Subject: [PATCH 026/430] tm revamp: make VREngine and UpdateStream optional Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/vttablet.go | 4 +++ go/vt/binlog/updatestreamctl.go | 14 +++++++-- go/vt/vttablet/tabletmanager/healthcheck.go | 12 ++++---- go/vt/vttablet/tabletmanager/state_change.go | 25 +++++++++------- go/vt/vttablet/tabletmanager/tm_init.go | 24 ++++++++------- .../tabletmanager/vreplication/engine.go | 29 ++++++++++++------- 6 files changed, 68 insertions(+), 40 deletions(-) diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index f33239b0fe4..6768928545d 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -22,6 +22,7 @@ import ( "io/ioutil" "golang.org/x/net/context" + "vitess.io/vitess/go/vt/binlog" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl" @@ -32,6 +33,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vttablet/tabletmanager" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletserver" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" "vitess.io/vitess/go/yaml2" @@ -91,6 +93,8 @@ func main() { MysqlDaemon: mysqld, DBConfigs: config.DB.Clone(), QueryServiceControl: qsc, + UpdateStream: binlog.NewUpdateStream(ts, tablet.Keyspace, tabletAlias.Cell, qsc.SchemaEngine()), + VREngine: vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld), } if err := tm.Start(tablet, config); err != nil { log.Exitf("failed to parse -tablet-path: %v", err) diff --git a/go/vt/binlog/updatestreamctl.go b/go/vt/binlog/updatestreamctl.go index 87e7ca32c3b..ce18f6d286c 100644 --- a/go/vt/binlog/updatestreamctl.go +++ b/go/vt/binlog/updatestreamctl.go @@ -59,6 +59,8 @@ var ( // UpdateStreamControl is the interface an UpdateStream service implements // to bring it up or down. type UpdateStreamControl interface { + // InitDBConfigs is called after the db name is computed. + InitDBConfig(*dbconfigs.DBConfigs) // RegisterService registers the UpdateStream service. RegisterService() // Enable will allow any new RPC calls @@ -81,6 +83,10 @@ func NewUpdateStreamControlMock() *UpdateStreamControlMock { return &UpdateStreamControlMock{} } +// InitDBConfig is part of UpdateStreamControl +func (m *UpdateStreamControlMock) InitDBConfig(*dbconfigs.DBConfigs) { +} + // RegisterService is part of UpdateStreamControl func (m *UpdateStreamControlMock) RegisterService() { } @@ -174,16 +180,20 @@ type RegisterUpdateStreamServiceFunc func(UpdateStream) var RegisterUpdateStreamServices []RegisterUpdateStreamServiceFunc // NewUpdateStream returns a new UpdateStreamImpl object -func NewUpdateStream(ts *topo.Server, keyspace string, cell string, cp dbconfigs.Connector, se *schema.Engine) *UpdateStreamImpl { +func NewUpdateStream(ts *topo.Server, keyspace string, cell string, se *schema.Engine) *UpdateStreamImpl { return &UpdateStreamImpl{ ts: ts, keyspace: keyspace, cell: cell, - cp: cp, se: se, } } +// InitDBConfig should be invoked after the db name is computed. +func (updateStream *UpdateStreamImpl) InitDBConfig(dbcfgs *dbconfigs.DBConfigs) { + updateStream.cp = dbcfgs.DbaWithDB() +} + // RegisterService needs to be called to publish stats, and to start listening // to clients. Only once instance can call this in a process. func (updateStream *UpdateStreamImpl) RegisterService() { diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index dcbca97c4d5..2a306a212b0 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -259,17 +259,19 @@ func (tm *TabletManager) runHealthCheckLocked() { } } } - if topo.IsRunningUpdateStream(tablet.Type) { - tm.UpdateStream.Enable() - } else { - tm.UpdateStream.Disable() + if tm.UpdateStream != nil { + if topo.IsRunningUpdateStream(tablet.Type) { + tm.UpdateStream.Enable() + } else { + tm.UpdateStream.Disable() + } } // All master tablets have to run the VReplication engine. // There is no guarantee that VREngine was successfully started when tabletmanager // came up. This is because the mysql could have been in read-only mode, etc. // So, start the engine if it's not already running. - if tablet.Type == topodatapb.TabletType_MASTER && !tm.VREngine.IsOpen() { + if tablet.Type == topodatapb.TabletType_MASTER && tm.VREngine != nil && !tm.VREngine.IsOpen() { if err := tm.VREngine.Open(tm.BatchCtx); err == nil { log.Info("VReplication engine successfully started") } diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index cd37b06c740..18bd5187cfc 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -317,11 +317,12 @@ func (tm *TabletManager) changeCallback(ctx context.Context, oldTablet, newTable } } - // UpdateStream needs to be started or stopped too. - if topo.IsRunningUpdateStream(newTablet.Type) { - tm.UpdateStream.Enable() - } else { - tm.UpdateStream.Disable() + if tm.UpdateStream != nil { + if topo.IsRunningUpdateStream(newTablet.Type) { + tm.UpdateStream.Enable() + } else { + tm.UpdateStream.Disable() + } } // Update the stats to our current type. @@ -330,14 +331,16 @@ func (tm *TabletManager) changeCallback(ctx context.Context, oldTablet, newTable statsTabletTypeCount.Add(s, 1) // See if we need to start or stop vreplication. - if newTablet.Type == topodatapb.TabletType_MASTER { - if err := tm.VREngine.Open(tm.BatchCtx); err != nil { - log.Errorf("Could not start VReplication engine: %v. Will keep retrying at health check intervals.", err) + if tm.VREngine != nil { + if newTablet.Type == topodatapb.TabletType_MASTER { + if err := tm.VREngine.Open(tm.BatchCtx); err != nil { + log.Errorf("Could not start VReplication engine: %v. Will keep retrying at health check intervals.", err) + } else { + log.Info("VReplication engine started") + } } else { - log.Info("VReplication engine started") + tm.VREngine.Close() } - } else { - tm.VREngine.Close() } // Broadcast health changes to vtgate immediately. diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 69da2466e71..9d9394bcdb6 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -307,12 +307,16 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.Tabl } tm.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) - tm.UpdateStream = binlog.NewUpdateStream(tm.TopoServer, tablet.Keyspace, tm.tabletAlias.Cell, tm.DBConfigs.DbaWithDB(), tm.QueryServiceControl.SchemaEngine()) - servenv.OnRun(tm.UpdateStream.RegisterService) - servenv.OnTerm(tm.UpdateStream.Disable) + if tm.UpdateStream != nil { + tm.UpdateStream.InitDBConfig(tm.DBConfigs) + servenv.OnRun(tm.UpdateStream.RegisterService) + servenv.OnTerm(tm.UpdateStream.Disable) + } - tm.VREngine = vreplication.NewEngine(config, tm.TopoServer, tablet.Alias.Cell, tm.MysqlDaemon) - servenv.OnTerm(tm.VREngine.Close) + if tm.VREngine != nil { + tm.VREngine.InitDBConfig(tm.DBConfigs) + servenv.OnTerm(tm.VREngine.Close) + } if err := tm.handleRestore(tm.BatchCtx); err != nil { return err @@ -452,8 +456,6 @@ func NewComboTM( MysqlDaemon: mysqlDaemon, DBConfigs: dbcfgs, QueryServiceControl: queryServiceControl, - UpdateStream: binlog.NewUpdateStreamControlMock(), - VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), History: history.New(historyLength), tabletAlias: tabletAlias, baseTabletType: tablet.Type, @@ -533,11 +535,11 @@ func (tm *TabletManager) Stop() { tm.UpdateStream.Disable() } - tm.VREngine.Close() - - if tm.MysqlDaemon != nil { - tm.MysqlDaemon.Close() + if tm.VREngine != nil { + tm.VREngine.Close() } + + tm.MysqlDaemon.Close() } // hookExtraEnv returns the map to pass to local hooks diff --git a/go/vt/vttablet/tabletmanager/vreplication/engine.go b/go/vt/vttablet/tabletmanager/vreplication/engine.go index 0fdee83bdbe..b4fe1d937fa 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/engine.go +++ b/go/vt/vttablet/tabletmanager/vreplication/engine.go @@ -102,22 +102,29 @@ type journalEvent struct { // NewEngine creates a new Engine. // A nil ts means that the Engine is disabled. func NewEngine(config *tabletenv.TabletConfig, ts *topo.Server, cell string, mysqld mysqlctl.MysqlDaemon) *Engine { - dbClientFactory := func() binlogplayer.DBClient { - return binlogplayer.NewDBClient(config.DB.FilteredWithDB()) - } vre := &Engine{ - controllers: make(map[int]*controller), - ts: ts, - cell: cell, - mysqld: mysqld, - dbClientFactory: dbClientFactory, - dbName: config.DB.DBName, - journaler: make(map[string]*journalEvent), - ec: newExternalConnector(config.ExternalConnections), + controllers: make(map[int]*controller), + ts: ts, + cell: cell, + mysqld: mysqld, + journaler: make(map[string]*journalEvent), + ec: newExternalConnector(config.ExternalConnections), } return vre } +// InitDBConfig should be invoked after the db name is computed. +func (vre *Engine) InitDBConfig(dbcfgs *dbconfigs.DBConfigs) { + // If we're already initilized, it's a test engine. Ignore the call. + if vre.dbClientFactory != nil { + return + } + vre.dbClientFactory = func() binlogplayer.DBClient { + return binlogplayer.NewDBClient(dbcfgs.FilteredWithDB()) + } + vre.dbName = dbcfgs.DBName +} + // NewTestEngine creates a new Engine for testing. func NewTestEngine(ts *topo.Server, cell string, mysqld mysqlctl.MysqlDaemon, dbClientFactory func() binlogplayer.DBClient, dbname string, externalConfig map[string]*dbconfigs.DBConfigs) *Engine { vre := &Engine{ From dbc25f0db09e23aeee271c18b679f66ace852e04 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 13 Jun 2020 22:21:34 -0700 Subject: [PATCH 027/430] tm revamp: unify codepaths through tm.Start Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/vttablet.go | 4 +- go/vt/vtcombo/tablet_map.go | 39 +++- go/vt/vttablet/tabletmanager/healthcheck.go | 8 +- .../tabletmanager/healthcheck_test.go | 73 ++++---- go/vt/vttablet/tabletmanager/state_change.go | 6 +- go/vt/vttablet/tabletmanager/tm_init.go | 167 +----------------- go/vt/wrangler/fake_tablet_test.go | 15 +- go/vt/wrangler/testlib/fake_tablet.go | 19 +- go/vt/wrangler/traffic_switcher_env_test.go | 2 - 9 files changed, 125 insertions(+), 208 deletions(-) diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index 6768928545d..c71d650f4b2 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -24,6 +24,7 @@ import ( "golang.org/x/net/context" "vitess.io/vitess/go/vt/binlog" "vitess.io/vitess/go/vt/dbconfigs" + "vitess.io/vitess/go/vt/health" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -95,8 +96,9 @@ func main() { QueryServiceControl: qsc, UpdateStream: binlog.NewUpdateStream(ts, tablet.Keyspace, tabletAlias.Cell, qsc.SchemaEngine()), VREngine: vreplication.NewEngine(config, ts, tabletAlias.Cell, mysqld), + HealthReporter: health.DefaultAggregator, } - if err := tm.Start(tablet, config); err != nil { + if err := tm.Start(tablet); err != nil { log.Exitf("failed to parse -tablet-path: %v", err) } servenv.OnClose(func() { diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 9b1d9637309..081c44631ff 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -21,7 +21,6 @@ import ( "fmt" "os" "path" - "strings" "time" "golang.org/x/net/context" @@ -56,7 +55,7 @@ import ( ) // tablet contains all the data for an individual tablet. -type tablet struct { +type comboTablet struct { // configuration parameters alias *topodatapb.TabletAlias keyspace string @@ -70,7 +69,7 @@ type tablet struct { } // tabletMap maps the tablet uid to the tablet record -var tabletMap map[uint32]*tablet +var tabletMap map[uint32]*comboTablet // CreateTablet creates an individual tablet, with its tm, and adds // it to the map. If it's a master tablet, it also issues a TER. @@ -87,7 +86,33 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, if tabletType == topodatapb.TabletType_MASTER { initTabletType = topodatapb.TabletType_REPLICA } - tm := tabletmanager.NewComboTM(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) + _, kr, err := topo.ValidateShardName(shard) + if err != nil { + return err + } + tm := &tabletmanager.TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: mysqld, + DBConfigs: dbcfgs, + QueryServiceControl: controller, + } + tablet := &topodatapb.Tablet{ + Alias: alias, + PortMap: map[string]int32{ + "vt": int32(8000 + uid), + "grpc": int32(9000 + uid), + }, + Keyspace: keyspace, + Shard: shard, + KeyRange: kr, + Type: initTabletType, + DbNameOverride: dbname, + } + if err := tm.Start(tablet); err != nil { + return err + } + if tabletType == topodatapb.TabletType_MASTER { if err := tm.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { return fmt.Errorf("TabletExternallyReparented failed on master %v: %v", topoproto.TabletAliasString(alias), err) @@ -95,7 +120,7 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, } controller.AddStatusHeader() controller.AddStatusPart() - tabletMap[uid] = &tablet{ + tabletMap[uid] = &comboTablet{ alias: alias, keyspace: keyspace, shard: shard, @@ -111,7 +136,7 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, // InitTabletMap creates the action tms and associated data structures // for all tablets, based on the vttest proto parameter. func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlctl.MysqlDaemon, dbcfgs *dbconfigs.DBConfigs, schemaDir string, mycnf *mysqlctl.Mycnf, ensureDatabase bool) error { - tabletMap = make(map[uint32]*tablet) + tabletMap = make(map[uint32]*comboTablet) ctx := context.Background() @@ -302,7 +327,7 @@ func dialer(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservi // internalTabletConn implements queryservice.QueryService by forwarding everything // to the tablet type internalTabletConn struct { - tablet *tablet + tablet *comboTablet topoTablet *topodatapb.Tablet } diff --git a/go/vt/vttablet/tabletmanager/healthcheck.go b/go/vt/vttablet/tabletmanager/healthcheck.go index 2a306a212b0..b193584c384 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck.go +++ b/go/vt/vttablet/tabletmanager/healthcheck.go @@ -137,6 +137,9 @@ func ConfigHTML() template.HTML { // and configure the healthcheck shutdown. It is only run by NewTabletManager // for real vttablet tms (not by tests, nor vtcombo). func (tm *TabletManager) initHealthCheck() { + if tm.HealthReporter == nil { + return + } registerReplicationReporter(tm) registerHeartbeatReporter(tm.QueryServiceControl) @@ -179,6 +182,9 @@ func (tm *TabletManager) runHealthCheck() { } func (tm *TabletManager) runHealthCheckLocked() { + if tm.HealthReporter == nil { + return + } tm.checkLock() // read the current tablet record and tablet control tablet := tm.Tablet() @@ -196,7 +202,7 @@ func (tm *TabletManager) runHealthCheckLocked() { // Remember the health error as healthErr to be sure we don't // accidentally overwrite it with some other err. - replicationDelay, healthErr := tm.healthReporter.Report(isSlaveType, shouldBeServing) + replicationDelay, healthErr := tm.HealthReporter.Report(isSlaveType, shouldBeServing) if healthErr != nil && ignoreErrorExpr != nil && ignoreErrorExpr.MatchString(healthErr.Error()) { // we need to ignore this health error diff --git a/go/vt/vttablet/tabletmanager/healthcheck_test.go b/go/vt/vttablet/tabletmanager/healthcheck_test.go index ff7d3274bd2..3e8daf92446 100644 --- a/go/vt/vttablet/tabletmanager/healthcheck_test.go +++ b/go/vt/vttablet/tabletmanager/healthcheck_test.go @@ -25,9 +25,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" "golang.org/x/net/context" "vitess.io/vitess/go/sync2" + "vitess.io/vitess/go/vt/binlog" + "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/health" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" @@ -133,34 +136,32 @@ func (fhc *fakeHealthCheck) HTMLName() template.HTML { func createTestTM(ctx context.Context, t *testing.T, preStart func(*TabletManager)) *TabletManager { ts := memorytopo.NewServer("cell1") - - if err := ts.CreateKeyspace(ctx, "test_keyspace", &topodatapb.Keyspace{}); err != nil { - t.Fatalf("CreateKeyspace failed: %v", err) - } - - if err := ts.CreateShard(ctx, "test_keyspace", "0"); err != nil { - t.Fatalf("CreateShard failed: %v", err) - } - - port := int32(1234) tablet := &topodatapb.Tablet{ Alias: tabletAlias, Hostname: "host", PortMap: map[string]int32{ - "vt": port, + "vt": int32(1234), }, Keyspace: "test_keyspace", Shard: "0", Type: topodatapb.TabletType_REPLICA, } - if err := ts.CreateTablet(ctx, tablet); err != nil { - t.Fatalf("CreateTablet failed: %v", err) - } - mysqlDaemon := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} - tm := NewTestTM(ctx, ts, tabletAlias, port, 0, mysqlDaemon, preStart) + tm := &TabletManager{ + BatchCtx: ctx, + TopoServer: ts, + MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)}, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + UpdateStream: binlog.NewUpdateStreamControlMock(), + } + if preStart != nil { + preStart(tm) + } + err := tm.Start(tablet) + require.NoError(t, err) - tm.healthReporter = &fakeHealthCheck{} + tm.HealthReporter = &fakeHealthCheck{} return tm } @@ -195,7 +196,7 @@ func TestHealthCheckControlsQueryService(t *testing.T) { // First health check, should keep us as replica and serving. before := time.Now() - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second tm.runHealthCheck() ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -221,8 +222,8 @@ func TestHealthCheckControlsQueryService(t *testing.T) { } // now make the tablet unhealthy - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 13 * time.Second - tm.healthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 13 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") before = time.Now() tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) @@ -294,8 +295,8 @@ func TestErrSlaveNotRunningIsHealthy(t *testing.T) { // health check returning health.ErrSlaveNotRunning, should // keep us as replica and serving before := time.Now() - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second - tm.healthReporter.(*fakeHealthCheck).reportError = health.ErrSlaveNotRunning + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = health.ErrSlaveNotRunning tm.runHealthCheck() if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") @@ -399,7 +400,7 @@ func TestQueryServiceStopped(t *testing.T) { // first health check, should keep us in replica / healthy before := time.Now() - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 14 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 14 * time.Second tm.runHealthCheck() ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -437,7 +438,7 @@ func TestQueryServiceStopped(t *testing.T) { // health check should now fail before = time.Now() - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 15 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 15 * time.Second tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -488,7 +489,7 @@ func TestTabletControl(t *testing.T) { // first health check, should keep us in replica, just broadcast before := time.Now() - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second tm.runHealthCheck() ti, err := tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -561,7 +562,7 @@ func TestTabletControl(t *testing.T) { // check running a health check will not start it again before = time.Now() - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 17 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 17 * time.Second tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -588,8 +589,8 @@ func TestTabletControl(t *testing.T) { // NOTE: No state change here since nothing has changed. // go unhealthy, check we go to error state and QS is not running - tm.healthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 18 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = fmt.Errorf("tablet is unhealthy") + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 18 * time.Second before = time.Now() tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) @@ -615,8 +616,8 @@ func TestTabletControl(t *testing.T) { } // go back healthy, check QS is still not running - tm.healthReporter.(*fakeHealthCheck).reportError = nil - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportError = nil + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second before = time.Now() tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) @@ -687,7 +688,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Run health check to turn into a healthy replica - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 12 * time.Second tm.runHealthCheck() if !tm.QueryServiceControl.IsServing() { t.Errorf("Query service should be running") @@ -700,7 +701,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Change to master. - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 19 * time.Second if err := tm.ChangeType(ctx, topodatapb.TabletType_MASTER); err != nil { t.Fatalf("TabletExternallyReparented failed: %v", err) } @@ -750,7 +751,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { } // Run health check to make sure we stay good - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 20 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 20 * time.Second tm.runHealthCheck() ti, err = tm.TopoServer.GetTablet(ctx, tabletAlias) if err != nil { @@ -838,7 +839,7 @@ func TestStateChangeImmediateHealthBroadcast(t *testing.T) { // Refresh the tablet state, as vtctl MigrateServedFrom would do. // This should also trigger a health broadcast since the QueryService state // changes from NOT_SERVING to SERVING. - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 23 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 23 * time.Second tm.RefreshState(ctx) // QueryService changed from NOT_SERVING to SERVING. @@ -906,7 +907,7 @@ func TestBackupStateChange(t *testing.T) { t.Fatal(err) } - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second // change to BACKUP, query service will turn off if err := tm.ChangeType(ctx, topodatapb.TabletType_BACKUP); err != nil { @@ -954,7 +955,7 @@ func TestRestoreStateChange(t *testing.T) { t.Fatal(err) } - tm.healthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second + tm.HealthReporter.(*fakeHealthCheck).reportReplicationDelay = 16 * time.Second // change to RESTORE, query service will turn off if err := tm.ChangeType(ctx, topodatapb.TabletType_RESTORE); err != nil { diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 18bd5187cfc..1dade4bc9d9 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -207,7 +207,11 @@ func (tm *TabletManager) changeCallback(ctx context.Context, oldTablet, newTable disallowQueryService = disallowQueryReason } } else { - replicationDelay, healthErr := tm.healthReporter.Report(true, true) + var replicationDelay time.Duration + var healthErr error + if tm.HealthReporter != nil { + replicationDelay, healthErr = tm.HealthReporter.Report(true, true) + } if healthErr != nil { allowQuery = false disallowQueryReason = "unable to get health" diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 9d9394bcdb6..9a4f73b426b 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -45,7 +45,6 @@ import ( "time" "vitess.io/vitess/go/flagutil" - "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/vterrors" "golang.org/x/net/context" @@ -68,8 +67,6 @@ import ( "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletserver" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" - "vitess.io/vitess/go/vt/vttablet/tabletservermock" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -104,6 +101,12 @@ var ( // statsBackupIsRunning is set to 1 (true) if a backup is running. statsBackupIsRunning *stats.GaugesWithMultiLabels + statsKeyspace = stats.NewString("TabletKeyspace") + statsShard = stats.NewString("TabletShard") + statsKeyRangeStart = stats.NewString("TabletKeyRangeStart") + statsKeyRangeEnd = stats.NewString("TabletKeyRangeEnd") + statsAlias = stats.NewString("TabletAlias") + // The following variables can be changed to speed up tests. mysqlPortRetryInterval = 1 * time.Second rebuildKeyspaceRetryInterval = 1 * time.Second @@ -129,8 +132,8 @@ type TabletManager struct { UpdateStream binlog.UpdateStreamControl VREngine *vreplication.Engine - // healthReporter initiates healthchecks. - healthReporter health.Reporter + // HealthReporter initiates healthchecks. + HealthReporter health.Reporter // tabletAlias is saved away from tablet for read-only access tabletAlias *topodatapb.TabletAlias @@ -273,13 +276,12 @@ func BuildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( } // Start starts the TabletManager. -func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.TabletConfig) error { +func (tm *TabletManager) Start(tablet *topodatapb.Tablet) error { tm.setTablet(tablet) tm.DBConfigs.DBName = topoproto.TabletDbName(tablet) tm.History = history.New(historyLength) tm.tabletAlias = tablet.Alias tm.baseTabletType = tablet.Type - tm.healthReporter = health.DefaultAggregator tm._healthy = fmt.Errorf("healthcheck not run yet") ctx, cancel := context.WithTimeout(tm.BatchCtx, *initTimeout) @@ -339,7 +341,6 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.Tabl servenv.OnRun(tm.registerTabletManager) // Temporary glue code to keep things working. - // TODO(sougou); remove after refactor. if err := tm.lock(tm.BatchCtx); err != nil { return err } @@ -350,150 +351,6 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.Tabl return nil } -// NewTestTM creates an tm for test purposes. Only a -// subset of features are supported now, but we'll add more over time. -func NewTestTM( - batchCtx context.Context, - ts *topo.Server, - tabletAlias *topodatapb.TabletAlias, - vtPort, grpcPort int32, - mysqlDaemon mysqlctl.MysqlDaemon, - preStart func(*TabletManager), -) *TabletManager { - - ti, err := ts.GetTablet(batchCtx, tabletAlias) - if err != nil { - panic(vterrors.Wrap(err, "failed reading tablet")) - } - ti.PortMap = map[string]int32{ - "vt": vtPort, - "grpc": grpcPort, - } - - tm := &TabletManager{ - BatchCtx: batchCtx, - TopoServer: ts, - Cnf: nil, - MysqlDaemon: mysqlDaemon, - DBConfigs: &dbconfigs.DBConfigs{}, - QueryServiceControl: tabletservermock.NewController(), - UpdateStream: binlog.NewUpdateStreamControlMock(), - VREngine: vreplication.NewTestEngine(ts, tabletAlias.Cell, mysqlDaemon, binlogplayer.NewFakeDBClient, ti.DbName(), nil), - History: history.New(historyLength), - tabletAlias: tabletAlias, - baseTabletType: topodatapb.TabletType_REPLICA, - tablet: ti.Tablet, - healthReporter: health.DefaultAggregator, - _healthy: fmt.Errorf("healthcheck not run yet"), - } - if preStart != nil { - preStart(tm) - } - - if err := tm.createKeyspaceShard(batchCtx); err != nil { - panic(err) - } - if err := tm.checkMastership(batchCtx); err != nil { - panic(err) - } - if tm.initTablet(batchCtx); err != nil { - panic(err) - } - - tablet := tm.Tablet() - err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ - Keyspace: tablet.Keyspace, - Shard: tablet.Shard, - TabletType: tablet.Type, - }, tm.DBConfigs) - if err != nil { - panic(err) - } - - // Start a background goroutine to watch and update the shard record, - // to make sure it and our tablet record are in sync. - tm.startShardSync() - - // Temporary glue code to keep things working. - // TODO(sougou); remove after refactor. - if err := tm.lock(batchCtx); err != nil { - panic(err) - } - defer tm.unlock() - tablet = tm.Tablet() - tm.changeCallback(batchCtx, tablet, tablet) - - return tm -} - -// NewComboTM creates an tm tailored specifically to run -// within the vtcombo binary. It cannot be called concurrently, -// as it changes the flags. -func NewComboTM( - batchCtx context.Context, - ts *topo.Server, - tabletAlias *topodatapb.TabletAlias, - vtPort, grpcPort int32, - queryServiceControl tabletserver.Controller, - dbcfgs *dbconfigs.DBConfigs, - mysqlDaemon mysqlctl.MysqlDaemon, - keyspace, shard, dbname, tabletTypeStr string, -) *TabletManager { - - *initDbNameOverride = dbname - *initKeyspace = keyspace - *initShard = shard - *initTabletType = tabletTypeStr - tablet, err := BuildTabletFromInput(tabletAlias, vtPort, grpcPort) - if err != nil { - panic(err) - } - dbcfgs.DBName = topoproto.TabletDbName(tablet) - tm := &TabletManager{ - BatchCtx: batchCtx, - TopoServer: ts, - Cnf: nil, - MysqlDaemon: mysqlDaemon, - DBConfigs: dbcfgs, - QueryServiceControl: queryServiceControl, - History: history.New(historyLength), - tabletAlias: tabletAlias, - baseTabletType: tablet.Type, - tablet: tablet, - healthReporter: health.DefaultAggregator, - _healthy: fmt.Errorf("healthcheck not run yet"), - } - - ctx, cancel := context.WithTimeout(tm.BatchCtx, *initTimeout) - defer cancel() - if err := tm.createKeyspaceShard(ctx); err != nil { - panic(err) - } - if err := tm.checkMastership(ctx); err != nil { - panic(err) - } - if err := tm.initTablet(ctx); err != nil { - panic(err) - } - - tablet = tm.Tablet() - err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ - Keyspace: tablet.Keyspace, - Shard: tablet.Shard, - TabletType: tablet.Type, - }, tm.DBConfigs) - if err != nil { - panic(err) - } - tm.QueryServiceControl.RegisterQueryRuleSource(blacklistQueryRules) - - // Start a background goroutine to watch and update the shard record, - // to make sure it and our tablet record are in sync. - tm.startShardSync() - - return tm -} - // Close prepares a tablet for shutdown. First we check our tablet ownership and // then prune the tablet topology entry of all post-init fields. This prevents // stale identifiers from hanging around in topology. @@ -794,12 +651,6 @@ func (tm *TabletManager) handleRestore(ctx context.Context) error { func (tm *TabletManager) exportStats() { tablet := tm.Tablet() - statsKeyspace := stats.NewString("TabletKeyspace") - statsShard := stats.NewString("TabletShard") - statsKeyRangeStart := stats.NewString("TabletKeyRangeStart") - statsKeyRangeEnd := stats.NewString("TabletKeyRangeEnd") - statsAlias := stats.NewString("TabletAlias") - statsKeyspace.Set(tablet.Keyspace) statsShard.Set(tablet.Shard) if key.KeyRangeIsPartial(tablet.KeyRange) { diff --git a/go/vt/wrangler/fake_tablet_test.go b/go/vt/wrangler/fake_tablet_test.go index 15e1014feab..7ac0b7bbbab 100644 --- a/go/vt/wrangler/fake_tablet_test.go +++ b/go/vt/wrangler/fake_tablet_test.go @@ -27,6 +27,7 @@ import ( "google.golang.org/grpc" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/netutil" + "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -34,6 +35,7 @@ import ( "vitess.io/vitess/go/vt/vttablet/grpctmserver" "vitess.io/vitess/go/vt/vttablet/tabletconn" "vitess.io/vitess/go/vt/vttablet/tabletmanager" + "vitess.io/vitess/go/vt/vttablet/tabletservermock" "vitess.io/vitess/go/vt/vttablet/tmclient" // import the gRPC client implementation for tablet manager @@ -168,10 +170,21 @@ func (ft *fakeTablet) StartActionLoop(t *testing.T, wr *Wrangler) { go ft.HTTPServer.Serve(ft.HTTPListener) vtPort = int32(ft.HTTPListener.Addr().(*net.TCPAddr).Port) } + ft.Tablet.PortMap["vt"] = vtPort + ft.Tablet.PortMap["grpc"] = gRPCPort // Create a test tm on that port, and re-read the record // (it has new ports and IP). - ft.TM = tabletmanager.NewTestTM(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.TM = &tabletmanager.TabletManager{ + BatchCtx: context.Background(), + TopoServer: wr.TopoServer(), + MysqlDaemon: ft.FakeMysqlDaemon, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + } + if err := ft.TM.Start(ft.Tablet); err != nil { + t.Fatal(err) + } ft.Tablet = ft.TM.Tablet() // Register the gRPC server, and starts listening. diff --git a/go/vt/wrangler/testlib/fake_tablet.go b/go/vt/wrangler/testlib/fake_tablet.go index 552763ea319..db1dc5e6a6b 100644 --- a/go/vt/wrangler/testlib/fake_tablet.go +++ b/go/vt/wrangler/testlib/fake_tablet.go @@ -32,11 +32,16 @@ import ( "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/netutil" + "vitess.io/vitess/go/vt/binlog/binlogplayer" + "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vttablet/grpctmserver" "vitess.io/vitess/go/vt/vttablet/tabletconn" "vitess.io/vitess/go/vt/vttablet/tabletmanager" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" + "vitess.io/vitess/go/vt/vttablet/tabletservermock" "vitess.io/vitess/go/vt/vttablet/tmclient" "vitess.io/vitess/go/vt/wrangler" @@ -193,10 +198,22 @@ func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { go ft.HTTPServer.Serve(ft.HTTPListener) vtPort = int32(ft.HTTPListener.Addr().(*net.TCPAddr).Port) } + ft.Tablet.PortMap["vt"] = vtPort + ft.Tablet.PortMap["grpc"] = gRPCPort // Create a test tm on that port, and re-read the record // (it has new ports and IP). - ft.TM = tabletmanager.NewTestTM(context.Background(), wr.TopoServer(), ft.Tablet.Alias, vtPort, gRPCPort, ft.FakeMysqlDaemon, nil) + ft.TM = &tabletmanager.TabletManager{ + BatchCtx: context.Background(), + TopoServer: wr.TopoServer(), + MysqlDaemon: ft.FakeMysqlDaemon, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + VREngine: vreplication.NewTestEngine(wr.TopoServer(), ft.Tablet.Alias.Cell, ft.FakeMysqlDaemon, binlogplayer.NewFakeDBClient, topoproto.TabletDbName(ft.Tablet), nil), + } + if err := ft.TM.Start(ft.Tablet); err != nil { + t.Fatal(err) + } ft.Tablet = ft.TM.Tablet() // Register the gRPC server, and starts listening. diff --git a/go/vt/wrangler/traffic_switcher_env_test.go b/go/vt/wrangler/traffic_switcher_env_test.go index bec632c45ea..2c6e5258abd 100644 --- a/go/vt/wrangler/traffic_switcher_env_test.go +++ b/go/vt/wrangler/traffic_switcher_env_test.go @@ -335,7 +335,6 @@ func (tme *testMigraterEnv) createDBClients(ctx context.Context, t *testing.T) { tme.dbSourceClients = append(tme.dbSourceClients, dbclient) dbClientFactory := func() binlogplayer.DBClient { return dbclient } // Replace existing engine with a new one - master.TM.VREngine.Close() master.TM.VREngine = vreplication.NewTestEngine(tme.ts, "", master.FakeMysqlDaemon, dbClientFactory, dbclient.DBName(), nil) if err := master.TM.VREngine.Open(ctx); err != nil { t.Fatal(err) @@ -346,7 +345,6 @@ func (tme *testMigraterEnv) createDBClients(ctx context.Context, t *testing.T) { tme.dbTargetClients = append(tme.dbTargetClients, dbclient) dbClientFactory := func() binlogplayer.DBClient { return dbclient } // Replace existing engine with a new one - master.TM.VREngine.Close() master.TM.VREngine = vreplication.NewTestEngine(tme.ts, "", master.FakeMysqlDaemon, dbClientFactory, dbclient.DBName(), nil) if err := master.TM.VREngine.Open(ctx); err != nil { t.Fatal(err) From 99f385f69f36b0dabf3e389e5c3b43d249dcb01d Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 13 Jun 2020 23:23:23 -0700 Subject: [PATCH 028/430] tm revamp: simplify some tm init tests Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/tm_init_test.go | 163 +++++++------------ 1 file changed, 62 insertions(+), 101 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 3f3a73e8708..ae7cba19f5d 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -20,17 +20,19 @@ import ( "fmt" "testing" - "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" "vitess.io/vitess/go/history" "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" + "vitess.io/vitess/go/vt/vttablet/tabletservermock" ) // Init tablet fixes replication data when safe @@ -38,63 +40,29 @@ func TestInitTabletFixesReplicationData(t *testing.T) { ctx := context.Background() cell := "cell1" ts := memorytopo.NewServer(cell, "cell2") - tabletAlias := &topodatapb.TabletAlias{ - Cell: cell, - Uid: 1, - } - - // start with a tablet record that doesn't exist - tm := &TabletManager{ - TopoServer: ts, - tabletAlias: tabletAlias, - MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), - DBConfigs: &dbconfigs.DBConfigs{}, - BatchCtx: ctx, - History: history.New(historyLength), - _healthy: fmt.Errorf("healthcheck not run yet"), - } + tm := newTestTM(t, ts) + tabletAlias := tm.tabletAlias + tablet := tm.Tablet() - // 1. Initialize the tablet as REPLICA. - *tabletHostname = "localhost" - *initKeyspace = "test_keyspace" - *initShard = "-C0" - *initTabletType = "replica" - tabletAlias = &topodatapb.TabletAlias{ - Cell: cell, - Uid: 2, - } - tm.tabletAlias = tabletAlias - - tablet, err := BuildTabletFromInput(tabletAlias, int32(1234), int32(3456)) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.initTablet(context.Background()) + sri, err := ts.GetShardReplication(ctx, cell, tablet.Keyspace, "-c0") require.NoError(t, err) - - sri, err := ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") - if err != nil || len(sri.Nodes) != 1 || !proto.Equal(sri.Nodes[0].TabletAlias, tabletAlias) { - t.Fatalf("Created ShardReplication doesn't match: %v %v", sri, err) - } + assert.Equal(t, tabletAlias, sri.Nodes[0].TabletAlias) // Remove the ShardReplication record, try to create the // tablets again, make sure it's fixed. - err = topo.RemoveShardReplicationRecord(ctx, ts, cell, *initKeyspace, "-c0", tabletAlias) + err = topo.RemoveShardReplicationRecord(ctx, ts, cell, tablet.Keyspace, "-c0", tabletAlias) require.NoError(t, err) - sri, err = ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") - if err != nil || len(sri.Nodes) != 0 { - t.Fatalf("Modifed ShardReplication doesn't match: %v %v", sri, err) - } + sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "-c0") + require.NoError(t, err) + assert.Equal(t, 0, len(sri.Nodes)) // An initTablet will recreate the shard replication data. err = tm.initTablet(context.Background()) require.NoError(t, err) - sri, err = ts.GetShardReplication(ctx, cell, *initKeyspace, "-c0") - if err != nil || len(sri.Nodes) != 1 || !proto.Equal(sri.Nodes[0].TabletAlias, tabletAlias) { - t.Fatalf("Created ShardReplication doesn't match: %v %v", sri, err) - } + sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "-c0") + require.NoError(t, err) + assert.Equal(t, tabletAlias, sri.Nodes[0].TabletAlias) } // This is a test to make sure a regression does not happen in the future. @@ -104,67 +72,24 @@ func TestInitTabletFixesReplicationData(t *testing.T) { func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { ctx := context.Background() ts := memorytopo.NewServer("cell1", "cell2") - tabletAlias := &topodatapb.TabletAlias{ - Cell: "cell1", - Uid: 1, - } - - // start with a tablet record that doesn't exist - tm := &TabletManager{ - TopoServer: ts, - tabletAlias: tabletAlias, - MysqlDaemon: fakemysqldaemon.NewFakeMysqlDaemon(nil), - DBConfigs: &dbconfigs.DBConfigs{}, - BatchCtx: ctx, - History: history.New(historyLength), - _healthy: fmt.Errorf("healthcheck not run yet"), - } - - // 1. Initialize the tablet as REPLICA. - *tabletHostname = "localhost" - *initKeyspace = "test_keyspace" - *initShard = "-C0" - *initTabletType = "replica" - tabletAlias = &topodatapb.TabletAlias{ - Cell: "cell1", - Uid: 2, - } - tm.tabletAlias = tabletAlias - - tablet, err := BuildTabletFromInput(tabletAlias, int32(1234), int32(3456)) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.initTablet(context.Background()) - require.NoError(t, err) + tm := newTestTM(t, ts) tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-c0") - if err != nil { - t.Fatalf("Could not fetch tablet aliases for shard: %v", err) - } - - if len(tabletAliases) != 1 { - t.Fatalf("Expected to have only one tablet alias, got: %v", len(tabletAliases)) - } - if tabletAliases[0].Uid != 2 { - t.Fatalf("Expected table UID be equal to 2, got: %v", tabletAliases[0].Uid) - } - - // Try to initialize a tablet with the same uid in a different shard. - *initShard = "-D0" - tablet, err = BuildTabletFromInput(tabletAlias, int32(1234), int32(3456)) require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) + assert.Equal(t, uint32(1), tabletAliases[0].Uid) + + tablet := newTestTablet(t) + _, keyRange, err := topo.ValidateShardName("-d0") require.NoError(t, err) - err = tm.initTablet(context.Background()) + tablet.Shard = "-d0" + tablet.KeyRange = keyRange + err = tm.Start(tablet) // This should fail. require.Error(t, err) - if tablets, _ := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-d0"); len(tablets) != 0 { - t.Fatalf("Tablet shouldn't be added to replication data") - } + tablets, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-d0") + require.NoError(t, err) + assert.Equal(t, 0, len(tablets)) } // TestInitTablet will test the InitTablet code creates / updates the @@ -204,6 +129,7 @@ func TestInitTablet(t *testing.T) { *tabletHostname = "localhost" *initKeyspace = "test_keyspace" *initShard = "-C0" + *initTabletType = "replica" tabletAlias = &topodatapb.TabletAlias{ Cell: "cell1", Uid: 2, @@ -390,3 +316,38 @@ func TestInitTablet(t *testing.T) { t.Fatalf("After a restart, masterTermStartTime must be set to the previous time saved in the tablet record. Previous timestamp: %v current timestamp: %v", ter2, ter3) } } + +func newTestTM(t *testing.T, ts *topo.Server) *TabletManager { + tablet := newTestTablet(t) + tm := &TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)}, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + } + err := tm.Start(tablet) + require.NoError(t, err) + return tm +} + +func newTestTablet(t *testing.T) *topodatapb.Tablet { + shard := "-c0" + _, keyRange, err := topo.ValidateShardName(shard) + require.NoError(t, err) + return &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 1, + }, + Hostname: "localhost", + PortMap: map[string]int32{ + "vt": int32(1234), + "grpc": int32(3456), + }, + Keyspace: "test_keyspace", + Shard: shard, + KeyRange: keyRange, + Type: topodatapb.TabletType_REPLICA, + } +} From 21b7a04d1d10fb0e55271dcd4c5c0e3f1a724933 Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Sun, 14 Jun 2020 17:20:34 +0530 Subject: [PATCH 029/430] Initial commit for PITR -2 Signed-off-by: Arindam Nayak --- go/vt/vttablet/tabletmanager/restore.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index b2265c83c0c..dbed11757aa 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -17,7 +17,6 @@ limitations under the License. package tabletmanager import ( - "errors" "flag" "fmt" "time" @@ -136,10 +135,6 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. } // If restore_to_time is set , then apply the incremental change if restoreToTimeStr != nil { - // validate the dependent settings - if *binlogHost == "" || *binlogPort <= 0 || *binlogUser == "" || *binlogPwd == "" { - return errors.New("restore_to_time flag depends on binlog server flags(binlog_host, binlog_port, binlog_user, binlog_password)") - } err = agent.restoreToTimeFromBinlog(ctx, pos) if err != nil { return nil @@ -186,12 +181,16 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. } func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql.Position) error { + // validate the dependent settings + if *binlogHost == "" || *binlogPort <= 0 || *binlogUser == "" { + return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "restore_to_time flag depends on binlog server flags(binlog_host, binlog_port, binlog_user, binlog_password)") + } restoreTime, err := time.Parse(time.RFC3339, *restoreToTimeStr) if err != nil { return err } restoreTimePb := logutil.TimeToProto(restoreTime) - println(restoreTimePb) + println(restoreTimePb.Seconds) // Get GTID from the restoreTime // Apply binlog events to the above GTID From 28df5988f9084bf97272acd7099471ebd552c82b Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Sun, 14 Jun 2020 20:39:41 +0530 Subject: [PATCH 030/430] PITR changes - added ability to fetch the GTID from the restore time - added ability to apply the binlogs till the above GTID Signed-off-by: Arindam Nayak --- go/mysql/flavor_mysql.go | 2 +- go/vt/dbconfigs/dbconfigs.go | 6 ++ go/vt/vttablet/tabletmanager/restore.go | 67 ++++++++++++- .../vreplication/replica_connector.go | 98 +++++++++++++++++++ go/vt/vttablet/tabletserver/schema/engine.go | 9 +- 5 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 go/vt/vttablet/tabletmanager/vreplication/replica_connector.go diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index 413322d2b68..a484f4479dd 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -32,7 +32,7 @@ type mysqlFlavor struct{} // masterGTIDSet is part of the Flavor interface. func (mysqlFlavor) masterGTIDSet(c *Conn) (GTIDSet, error) { - qr, err := c.ExecuteFetch("SELECT @@GLOBAL.gtid_executed", 1, false) + qr, err := c.ExecuteFetch("SELECT @@global.gtid_executed", 1, false) if err != nil { return nil, err } diff --git a/go/vt/dbconfigs/dbconfigs.go b/go/vt/dbconfigs/dbconfigs.go index fe13a8ee782..59375ccb07e 100644 --- a/go/vt/dbconfigs/dbconfigs.go +++ b/go/vt/dbconfigs/dbconfigs.go @@ -394,6 +394,12 @@ func (dbcfgs *DBConfigs) getParams(userKey string, dbc *DBConfigs) (*UserConfig, return uc, cp } +// SetDbParams sets the dba and app params +func (dbcfgs *DBConfigs) SetDbParams(params mysql.ConnParams) { + dbcfgs.dbaParams = params + dbcfgs.appParams = params +} + // NewTestDBConfigs returns a DBConfigs meant for testing. func NewTestDBConfigs(genParams, appDebugParams mysql.ConnParams, dbname string) *DBConfigs { return &DBConfigs{ diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index dbed11757aa..9bb28955463 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -21,6 +21,10 @@ import ( "fmt" "time" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" + + "vitess.io/vitess/go/vt/dbconfigs" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tmclient" @@ -33,6 +37,7 @@ import ( "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/topo/topoproto" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) @@ -191,9 +196,67 @@ func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql } restoreTimePb := logutil.TimeToProto(restoreTime) println(restoreTimePb.Seconds) - // Get GTID from the restoreTime - // Apply binlog events to the above GTID + gtid := agent.getGTIDFromTimestamp(ctx, pos, restoreTimePb.Seconds) + if gtid == "" { + return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "unable to fetch the GTID for the specified restore_to_time") + } + + err = agent.replicateUptoGTID(ctx, gtid) + if err != nil { + return vterrors.Wrapf(err, "unable to replicate upto specified gtid : %s", gtid) + } + + return nil +} + +// getGTIDFromTimestamp gets the next GTID of the event happened on the timestamp (resore_to_time) +func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Position, restoreTime int64) string { + connParams := &mysql.ConnParams{ + Host: *binlogHost, + Port: *binlogPort, + Uname: *binlogUser, + Pass: *binlogPwd, + } + dbCfgs := &dbconfigs.DBConfigs{ + Host: connParams.Host, + Port: connParams.Port, + } + dbCfgs.SetDbParams(*connParams) + vsClient := vreplication.NewReplicaConnector(connParams) + + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "/.*", + }}, + } + gtid := "" + _ = vsClient.VStream(ctx, mysql.EncodePosition(pos), filter, func(events []*binlogdatapb.VEvent) error { + for _, event := range events { + if event.Gtid != "" && event.Timestamp > restoreTime { + gtid = event.Gtid + break + } + } + return nil + }) + return gtid +} + +// replicateUptoGTID replicates upto specified gtid from binlog server +func (agent *ActionAgent) replicateUptoGTID(ctx context.Context, gtid string) error { + // TODO: we can use agent.MysqlDaemon.SetMaster , but it uses replDbConfig + cmds := []string{ + "STOP SLAVE FOR CHANNEL '' ", + "STOP SLAVE IO_THREAD FOR CHANNEL ''", + fmt.Sprintf("CHANGE MASTER TO MASTER_HOST='%s',MASTER_PORT=%d, MASTER_USER='%s', MASTER_AUTO_POSITION = 1;", *binlogHost, *binlogPort, *binlogUser), + fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtid), + } + + if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { + return vterrors.Wrap(err, "failed to reset slave") + } + // TODO: Wait for the replication to happen and then reset the slave, so that we don't be connected to binlog server return nil } diff --git a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go new file mode 100644 index 00000000000..fef947b1392 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go @@ -0,0 +1,98 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package vreplication + +import ( + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/dbconfigs" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + + "golang.org/x/net/context" + "vitess.io/vitess/go/sqltypes" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" + "vitess.io/vitess/go/vt/vttablet/tabletserver/vstreamer" +) + +var ( + _ VStreamerClient = (*mysqlConnector)(nil) +) + +// NewReplicaConnector returns replica connector +func NewReplicaConnector(connParams *mysql.ConnParams) *replicaConnector { + + // Construct + config := tabletenv.NewDefaultConfig() + dbCfg := &dbconfigs.DBConfigs{ + Host: connParams.Host, + Port: connParams.Port, + } + dbCfg.SetDbParams(*connParams) + config.DB = dbCfg + c := &replicaConnector{conn: connParams} + env := tabletenv.NewEnv(config, "source") + c.se = schema.NewEngine(env) + c.se.SkipMetaCheck = true + c.vstreamer = vstreamer.NewEngine(env, nil, c.se, nil) + c.se.InitDBConfig(dbconfigs.New(connParams)) + + // Open + + c.vstreamer.Open("", "") + + return c +} + +//----------------------------------------------------------- + +type replicaConnector struct { + conn *mysql.ConnParams + se *schema.Engine + vstreamer *vstreamer.Engine +} + +func (c *replicaConnector) shutdown() { + c.vstreamer.Close() + c.se.Close() +} + +func (c *replicaConnector) Open(ctx context.Context) error { + return nil +} + +func (c *replicaConnector) Close(ctx context.Context) error { + return nil +} + +func (c *replicaConnector) VStream(ctx context.Context, startPos string, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error { + return c.vstreamer.Stream(ctx, startPos, filter, send) +} + +func (c *replicaConnector) VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, send func(*binlogdatapb.VStreamRowsResponse) error) error { + var row []sqltypes.Value + if lastpk != nil { + r := sqltypes.Proto3ToResult(lastpk) + if len(r.Rows) != 1 { + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected lastpk input: %v", lastpk) + } + row = r.Rows[0] + } + return c.vstreamer.StreamRows(ctx, query, row, send) +} diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 3567d7711d4..88ad8b8e7f6 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -62,6 +62,9 @@ type Engine struct { notifierMu sync.Mutex notifiers map[string]notifier + // SkipMetaCheck skips the metadata about the database and table information + SkipMetaCheck bool + // The following fields have their own synchronization // and do not require locking mu. conns *connpool.Pool @@ -236,6 +239,10 @@ func (se *Engine) reload(ctx context.Context) error { if err != nil { return err } + // if this flag is set, then we can return from here + if se.SkipMetaCheck { + return nil + } tableData, err := conn.Exec(ctx, mysql.BaseShowTables, maxTableCount, false) if err != nil { return err @@ -296,7 +303,7 @@ func (se *Engine) reload(ctx context.Context) error { } func (se *Engine) mysqlTime(ctx context.Context, conn *connpool.DBConn) (int64, error) { - tm, err := conn.Exec(ctx, "select unix_timestamp()", 1, false) + tm, err := conn.Exec(ctx, "SELECT UNIX_TIMESTAMP()", 1, false) if err != nil { return 0, vterrors.Errorf(vtrpcpb.Code_UNKNOWN, "could not get MySQL time: %v", err) } From ddf1ee96a8cc23e45a6fecae14d22fff7e06583e Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Mon, 15 Jun 2020 00:15:52 +0530 Subject: [PATCH 031/430] Added some validation and fixes while testing Signed-off-by: Arindam Nayak --- go/vt/vttablet/tabletmanager/restore.go | 7 +++++++ go/vt/vttablet/tabletserver/vstreamer/vstreamer.go | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 9bb28955463..bfd424e6208 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -194,6 +194,10 @@ func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql if err != nil { return err } + if restoreTime.Second() > time.Now().Second() { + log.Warning("Restore time request is a future date, so skipping it") + return nil + } restoreTimePb := logutil.TimeToProto(restoreTime) println(restoreTimePb.Seconds) @@ -202,6 +206,7 @@ func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "unable to fetch the GTID for the specified restore_to_time") } + println(fmt.Sprintf("going to restore upto the gtid - %s", gtid)) err = agent.replicateUptoGTID(ctx, gtid) if err != nil { return vterrors.Wrapf(err, "unable to replicate upto specified gtid : %s", gtid) @@ -231,6 +236,8 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po }}, } gtid := "" + // Todo: we need to safely return from vstream if it takes more time + // Todo: we need to return from vstream , so that we return the GTID _ = vsClient.VStream(ctx, mysql.EncodePosition(pos), filter, func(events []*binlogdatapb.VEvent) error { for _, event := range events { if event.Gtid != "" && event.Timestamp > restoreTime { diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index 2373f79cc46..5a7f4959e5b 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -169,8 +169,10 @@ func (vs *vstreamer) Stream() error { // Ensure sh is Open. If vttablet came up in a non_serving role, // the schema engine may not have been initialized. - if err := vs.sh.Open(); err != nil { - return wrapError(err, vs.pos) + if !vs.se.SkipMetaCheck { + if err := vs.sh.Open(); err != nil { + return wrapError(err, vs.pos) + } } conn, err := binlog.NewSlaveConnection(vs.cp) From fc52afe1f5d203a8c386904bd18ad554968ff5ed Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 14 Jun 2020 11:20:43 -0700 Subject: [PATCH 032/430] tm revamp: TestStartBuildTabletFromInput Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/tm_init.go | 80 +++++++------- go/vt/vttablet/tabletmanager/tm_init_test.go | 110 ++++++++++++++++--- 2 files changed, 134 insertions(+), 56 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 9a4f73b426b..11e769442bf 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -79,16 +79,16 @@ const ( ) var ( - tabletHostname = flag.String("tablet_hostname", "", "if not empty, this hostname will be assumed instead of trying to resolve it") - initPopulateMetadata = flag.Bool("init_populate_metadata", false, "(init parameter) populate metadata tables even if restore_from_backup is disabled. If restore_from_backup is enabled, metadata tables are always populated regardless of this flag.") - + // The following flags initialize the tablet record. + tabletHostname = flag.String("tablet_hostname", "", "if not empty, this hostname will be assumed instead of trying to resolve it") initKeyspace = flag.String("init_keyspace", "", "(init parameter) keyspace to use for this tablet") initShard = flag.String("init_shard", "", "(init parameter) shard to use for this tablet") initTabletType = flag.String("init_tablet_type", "", "(init parameter) the tablet type to use for this tablet.") initDbNameOverride = flag.String("init_db_name_override", "", "(init parameter) override the name of the db used by vttablet. Without this flag, the db name defaults to vt_") initTags flagutil.StringMapValue - initTimeout = flag.Duration("init_timeout", 1*time.Minute, "(init parameter) timeout to use for the init phase.") + initPopulateMetadata = flag.Bool("init_populate_metadata", false, "(init parameter) populate metadata tables even if restore_from_backup is disabled. If restore_from_backup is enabled, metadata tables are always populated regardless of this flag.") + initTimeout = flag.Duration("init_timeout", 1*time.Minute, "(init parameter) timeout to use for the init phase.") // statsTabletType is set to expose the current tablet type. statsTabletType *stats.String @@ -234,7 +234,7 @@ func BuildTabletFromInput(alias *topodatapb.TabletAlias, port, grpcPort int32) ( if err != nil { return nil, err } - log.Infof("Using detected machine hostname: %v To change this, fix your machine network configuration or override it with -tablet_hostname.", hostname) + log.Infof("Using detected machine hostname: %v, to change this, fix your machine network configuration or override it with -tablet_hostname.", hostname) } else { log.Infof("Using hostname: %v from -tablet_hostname flag.", hostname) } @@ -399,41 +399,6 @@ func (tm *TabletManager) Stop() { tm.MysqlDaemon.Close() } -// hookExtraEnv returns the map to pass to local hooks -func (tm *TabletManager) hookExtraEnv() map[string]string { - return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(tm.tabletAlias)} -} - -// withRetry will exponentially back off and retry a function upon -// failure, until the context is Done(), or the function returned with -// no error. We use this at startup with a context timeout set to the -// value of the init_timeout flag, so we can try to modify the -// topology over a longer period instead of dying right away. -func (tm *TabletManager) withRetry(ctx context.Context, description string, work func() error) error { - backoff := 1 * time.Second - for { - err := work() - if err == nil || err == context.Canceled || err == context.DeadlineExceeded { - return err - } - - log.Warningf("%v failed (%v), backing off %v before retrying", description, err, backoff) - select { - case <-ctx.Done(): - return ctx.Err() - case <-time.After(backoff): - // Exponential backoff with 1.3 as a factor, - // and randomized down by at most 20 - // percent. The generated time series looks - // good. Also note rand.Seed is called at - // init() time in binlog_players.go. - f := float64(backoff) * 1.3 - f -= f * 0.2 * rand.Float64() - backoff = time.Duration(f) - } - } -} - func (tm *TabletManager) createKeyspaceShard(ctx context.Context) error { // mutex is needed because we set _shardInfo and _srvKeyspace tm.mutex.Lock() @@ -660,6 +625,36 @@ func (tm *TabletManager) exportStats() { statsAlias.Set(topoproto.TabletAliasString(tablet.Alias)) } +// withRetry will exponentially back off and retry a function upon +// failure, until the context is Done(), or the function returned with +// no error. We use this at startup with a context timeout set to the +// value of the init_timeout flag, so we can try to modify the +// topology over a longer period instead of dying right away. +func (tm *TabletManager) withRetry(ctx context.Context, description string, work func() error) error { + backoff := 1 * time.Second + for { + err := work() + if err == nil || err == context.Canceled || err == context.DeadlineExceeded { + return err + } + + log.Warningf("%v failed (%v), backing off %v before retrying", description, err, backoff) + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(backoff): + // Exponential backoff with 1.3 as a factor, + // and randomized down by at most 20 + // percent. The generated time series looks + // good. Also note rand.Seed is called at + // init() time in binlog_players.go. + f := float64(backoff) * 1.3 + f -= f * 0.2 * rand.Float64() + backoff = time.Duration(f) + } + } +} + func (tm *TabletManager) setTablet(tablet *topodatapb.Tablet) { tm.pubMu.Lock() tm.tablet = proto.Clone(tablet).(*topodatapb.Tablet) @@ -780,3 +775,8 @@ func (tm *TabletManager) setBlacklistedTables(value []string) { tm._blacklistedTables = value tm.mutex.Unlock() } + +// hookExtraEnv returns the map to pass to local hooks +func (tm *TabletManager) hookExtraEnv() map[string]string { + return map[string]string{"TABLET_ALIAS": topoproto.TabletAliasString(tm.tabletAlias)} +} diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index ae7cba19f5d..e394de5ec9e 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -35,8 +35,86 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletservermock" ) +func TestStartBuildTabletFromInput(t *testing.T) { + alias := &topodatapb.TabletAlias{ + Cell: "cell", + Uid: 1, + } + port := int32(12) + grpcport := int32(34) + + // Hostname should be used as is. + *tabletHostname = "foo" + *initKeyspace = "test_keyspace" + *initShard = "0" + *initTabletType = "replica" + *initDbNameOverride = "aa" + wantTablet := &topodatapb.Tablet{ + Alias: alias, + Hostname: "foo", + PortMap: map[string]int32{ + "vt": port, + "grpc": grpcport, + }, + Keyspace: "test_keyspace", + Shard: "0", + KeyRange: nil, + Type: topodatapb.TabletType_REPLICA, + DbNameOverride: "aa", + } + + gotTablet, err := BuildTabletFromInput(alias, port, grpcport) + require.NoError(t, err) + + // Hostname should be resolved. + assert.Equal(t, wantTablet, gotTablet) + *tabletHostname = "" + gotTablet, err = BuildTabletFromInput(alias, port, grpcport) + require.NoError(t, err) + assert.NotEqual(t, "", gotTablet.Hostname) + + // Cannonicalize shard name and compute keyrange. + *tabletHostname = "foo" + *initShard = "-C0" + wantTablet.Shard = "-c0" + wantTablet.KeyRange = &topodatapb.KeyRange{ + Start: []byte(""), + End: []byte("\xc0"), + } + gotTablet, err = BuildTabletFromInput(alias, port, grpcport) + require.NoError(t, err) + // KeyRange check is explicit because the next comparison doesn't + // show the diff well enough. + assert.Equal(t, wantTablet.KeyRange, gotTablet.KeyRange) + assert.Equal(t, wantTablet, gotTablet) + + // Invalid inputs. + *initKeyspace = "" + *initShard = "0" + _, err = BuildTabletFromInput(alias, port, grpcport) + assert.Contains(t, err.Error(), "init_keyspace and init_shard must be specified") + + *initKeyspace = "test_keyspace" + *initShard = "" + _, err = BuildTabletFromInput(alias, port, grpcport) + assert.Contains(t, err.Error(), "init_keyspace and init_shard must be specified") + + *initShard = "x-y" + _, err = BuildTabletFromInput(alias, port, grpcport) + assert.Contains(t, err.Error(), "cannot validate shard name") + + *initShard = "0" + *initTabletType = "bad" + _, err = BuildTabletFromInput(alias, port, grpcport) + assert.Contains(t, err.Error(), "unknown TabletType bad") + + *initTabletType = "master" + _, err = BuildTabletFromInput(alias, port, grpcport) + assert.Contains(t, err.Error(), "invalid init_tablet_type MASTER") +} + // Init tablet fixes replication data when safe -func TestInitTabletFixesReplicationData(t *testing.T) { +func TestStartFixesReplicationData(t *testing.T) { ctx := context.Background() cell := "cell1" ts := memorytopo.NewServer(cell, "cell2") @@ -44,15 +122,15 @@ func TestInitTabletFixesReplicationData(t *testing.T) { tabletAlias := tm.tabletAlias tablet := tm.Tablet() - sri, err := ts.GetShardReplication(ctx, cell, tablet.Keyspace, "-c0") + sri, err := ts.GetShardReplication(ctx, cell, tablet.Keyspace, "0") require.NoError(t, err) assert.Equal(t, tabletAlias, sri.Nodes[0].TabletAlias) // Remove the ShardReplication record, try to create the // tablets again, make sure it's fixed. - err = topo.RemoveShardReplicationRecord(ctx, ts, cell, tablet.Keyspace, "-c0", tabletAlias) + err = topo.RemoveShardReplicationRecord(ctx, ts, cell, tablet.Keyspace, "0", tabletAlias) require.NoError(t, err) - sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "-c0") + sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "0") require.NoError(t, err) assert.Equal(t, 0, len(sri.Nodes)) @@ -60,21 +138,21 @@ func TestInitTabletFixesReplicationData(t *testing.T) { err = tm.initTablet(context.Background()) require.NoError(t, err) - sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "-c0") + sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "0") require.NoError(t, err) assert.Equal(t, tabletAlias, sri.Nodes[0].TabletAlias) } // This is a test to make sure a regression does not happen in the future. -// There is code in InitTablet that updates replication data if tablet fails +// There is code in Start that updates replication data if tablet fails // to be created due to a NodeExists error. During this particular error we were not doing // the sanity checks that the provided tablet was the same in the topo. -func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { +func TestStartDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { ctx := context.Background() ts := memorytopo.NewServer("cell1", "cell2") tm := newTestTM(t, ts) - tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-c0") + tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "0") require.NoError(t, err) assert.Equal(t, uint32(1), tabletAliases[0].Uid) @@ -92,10 +170,10 @@ func TestInitTabletDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing. assert.Equal(t, 0, len(tablets)) } -// TestInitTablet will test the InitTablet code creates / updates the +// TestStart will test the Start code creates / updates the // tablet node correctly. Note we modify global parameters (the flags) // so this has to be in one test. -func TestInitTablet(t *testing.T) { +func TestStart(t *testing.T) { ctx := context.Background() ts := memorytopo.NewServer("cell1", "cell2") tabletAlias := &topodatapb.TabletAlias{ @@ -128,7 +206,7 @@ func TestInitTablet(t *testing.T) { // it to lower case. *tabletHostname = "localhost" *initKeyspace = "test_keyspace" - *initShard = "-C0" + *initShard = "0" *initTabletType = "replica" tabletAlias = &topodatapb.TabletAlias{ Cell: "cell1", @@ -153,7 +231,7 @@ func TestInitTablet(t *testing.T) { err = tm.initTablet(context.Background()) require.NoError(t, err) - si, err := ts.GetShard(ctx, "test_keyspace", "-c0") + si, err := ts.GetShard(ctx, "test_keyspace", "0") if err != nil { t.Fatalf("GetShard failed: %v", err) } @@ -182,10 +260,10 @@ func TestInitTablet(t *testing.T) { if ti.PortMap["grpc"] != gRPCPort { t.Errorf("wrong gRPC port for tablet: %v", ti.PortMap["grpc"]) } - if ti.Shard != "-c0" { + if ti.Shard != "0" { t.Errorf("wrong shard for tablet: %v", ti.Shard) } - if string(ti.KeyRange.Start) != "" || string(ti.KeyRange.End) != "\xc0" { + if ti.KeyRange != nil { t.Errorf("wrong KeyRange for tablet: %v", ti.KeyRange) } if got := tm.masterTermStartTime(); !got.IsZero() { @@ -196,7 +274,7 @@ func TestInitTablet(t *testing.T) { // (This simulates the case where the MasterAlias in the shard record says // that we are the master but the tablet record says otherwise. In that case, // we assume we are not the MASTER.) - _, err = tm.TopoServer.UpdateShardFields(ctx, "test_keyspace", "-c0", func(si *topo.ShardInfo) error { + _, err = tm.TopoServer.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { si.MasterAlias = tabletAlias return nil }) @@ -332,7 +410,7 @@ func newTestTM(t *testing.T, ts *topo.Server) *TabletManager { } func newTestTablet(t *testing.T) *topodatapb.Tablet { - shard := "-c0" + shard := "0" _, keyRange, err := topo.ValidateShardName(shard) require.NoError(t, err) return &topodatapb.Tablet{ From f5f5e1700fa33c6239010048055d19347d880e56 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 14 Jun 2020 12:11:38 -0700 Subject: [PATCH 033/430] tm revamp: fix vtcombo healthcheck Signed-off-by: Sugu Sougoumarane --- go/vt/vtcombo/tablet_map.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 081c44631ff..9651178368e 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/grpcclient" + "vitess.io/vitess/go/vt/health" "vitess.io/vitess/go/vt/hook" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" @@ -96,6 +97,7 @@ func CreateTablet(ctx context.Context, ts *topo.Server, cell string, uid uint32, MysqlDaemon: mysqld, DBConfigs: dbcfgs, QueryServiceControl: controller, + HealthReporter: health.DefaultAggregator, } tablet := &topodatapb.Tablet{ Alias: alias, From 9254e7800d2fe75fcb7f3c33b5e67abe18e64cf5 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 14 Jun 2020 13:05:49 -0700 Subject: [PATCH 034/430] tm revamp: TestStartCreateKeyspaceShard Signed-off-by: Sugu Sougoumarane --- go/vt/topo/shard.go | 5 - go/vt/vttablet/tabletmanager/tm_init_test.go | 132 ++++++++++++++----- 2 files changed, 97 insertions(+), 40 deletions(-) diff --git a/go/vt/topo/shard.go b/go/vt/topo/shard.go index 10b2382b6bd..a065c61a32c 100644 --- a/go/vt/topo/shard.go +++ b/go/vt/topo/shard.go @@ -328,33 +328,28 @@ func (ts *Server) CreateShard(ctx context.Context, keyspace, shard string) (err // GetOrCreateShard will return the shard object, or create one if it doesn't // already exist. Note the shard creation is protected by a keyspace Lock. func (ts *Server) GetOrCreateShard(ctx context.Context, keyspace, shard string) (si *ShardInfo, err error) { - log.Info("GetShard %s/%s", keyspace, shard) si, err = ts.GetShard(ctx, keyspace, shard) if !IsErrType(err, NoNode) { return } // create the keyspace, maybe it already exists - log.Info("CreateKeyspace %s/%s", keyspace, shard) if err = ts.CreateKeyspace(ctx, keyspace, &topodatapb.Keyspace{}); err != nil && !IsErrType(err, NodeExists) { return nil, vterrors.Wrapf(err, "CreateKeyspace(%v) failed", keyspace) } // make sure a valid vschema has been loaded - log.Info("EnsureVSchema %s/%s", keyspace, shard) if err = ts.EnsureVSchema(ctx, keyspace); err != nil { return nil, vterrors.Wrapf(err, "EnsureVSchema(%v) failed", keyspace) } // now try to create with the lock, may already exist - log.Info("CreateShard %s/%s", keyspace, shard) if err = ts.CreateShard(ctx, keyspace, shard); err != nil && !IsErrType(err, NodeExists) { return nil, vterrors.Wrapf(err, "CreateShard(%v/%v) failed", keyspace, shard) } // try to read the shard again, maybe someone created it // in between the original GetShard and the LockKeyspace - log.Info("GetShard %s/%s", keyspace, shard) return ts.GetShard(ctx, keyspace, shard) } diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index e394de5ec9e..eb302f28453 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -19,6 +19,7 @@ package tabletmanager import ( "fmt" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,10 +28,13 @@ import ( "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/dbconfigs" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletservermock" ) @@ -113,24 +117,99 @@ func TestStartBuildTabletFromInput(t *testing.T) { assert.Contains(t, err.Error(), "invalid init_tablet_type MASTER") } +func TestStartCreateKeyspaceShard(t *testing.T) { + defer func(saved time.Duration) { rebuildKeyspaceRetryInterval = saved }(rebuildKeyspaceRetryInterval) + rebuildKeyspaceRetryInterval = 10 * time.Millisecond + + ctx := context.Background() + cell := "cell1" + ts := memorytopo.NewServer(cell) + _ = newTestTM(t, ts, 1, "ks", "0") + + _, err := ts.GetShard(ctx, "ks", "0") + require.NoError(t, err) + + ensureSrvKeyspace(t, ts, cell, "ks") + + srvVSchema, err := ts.GetSrvVSchema(context.Background(), cell) + require.NoError(t, err) + wantVSchema := &vschemapb.Keyspace{} + assert.Equal(t, wantVSchema, srvVSchema.Keyspaces["ks"]) + + // keyspace-shard already created. + _, err = ts.GetOrCreateShard(ctx, "ks1", "0") + require.NoError(t, err) + _ = newTestTM(t, ts, 2, "ks1", "0") + _, err = ts.GetShard(ctx, "ks1", "0") + require.NoError(t, err) + ensureSrvKeyspace(t, ts, cell, "ks1") + srvVSchema, err = ts.GetSrvVSchema(context.Background(), cell) + require.NoError(t, err) + assert.Equal(t, wantVSchema, srvVSchema.Keyspaces["ks1"]) + + // srvKeyspace already created + _, err = ts.GetOrCreateShard(ctx, "ks2", "0") + require.NoError(t, err) + err = topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), ts, "ks2", []string{cell}) + require.NoError(t, err) + _ = newTestTM(t, ts, 3, "ks2", "0") + _, err = ts.GetShard(ctx, "ks2", "0") + require.NoError(t, err) + _, err = ts.GetSrvKeyspace(context.Background(), cell, "ks2") + require.NoError(t, err) + srvVSchema, err = ts.GetSrvVSchema(context.Background(), cell) + require.NoError(t, err) + assert.Equal(t, wantVSchema, srvVSchema.Keyspaces["ks2"]) + + // srvVSchema already created + _, err = ts.GetOrCreateShard(ctx, "ks3", "0") + require.NoError(t, err) + err = topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), ts, "ks3", []string{cell}) + require.NoError(t, err) + err = ts.RebuildSrvVSchema(ctx, []string{cell}) + require.NoError(t, err) + _ = newTestTM(t, ts, 4, "ks3", "0") + _, err = ts.GetShard(ctx, "ks3", "0") + require.NoError(t, err) + _, err = ts.GetSrvKeyspace(context.Background(), cell, "ks3") + require.NoError(t, err) + srvVSchema, err = ts.GetSrvVSchema(context.Background(), cell) + require.NoError(t, err) + assert.Equal(t, wantVSchema, srvVSchema.Keyspaces["ks3"]) +} + +func ensureSrvKeyspace(t *testing.T, ts *topo.Server, cell, keyspace string) { + t.Helper() + found := false + for i := 0; i < 10; i++ { + _, err := ts.GetSrvKeyspace(context.Background(), cell, "ks") + if err == nil { + found = true + break + } + require.True(t, topo.IsErrType(err, topo.NoNode), err) + time.Sleep(rebuildKeyspaceRetryInterval) + } + assert.True(t, found) +} + // Init tablet fixes replication data when safe func TestStartFixesReplicationData(t *testing.T) { ctx := context.Background() cell := "cell1" ts := memorytopo.NewServer(cell, "cell2") - tm := newTestTM(t, ts) + tm := newTestTM(t, ts, 1, "ks", "0") tabletAlias := tm.tabletAlias - tablet := tm.Tablet() - sri, err := ts.GetShardReplication(ctx, cell, tablet.Keyspace, "0") + sri, err := ts.GetShardReplication(ctx, cell, "ks", "0") require.NoError(t, err) assert.Equal(t, tabletAlias, sri.Nodes[0].TabletAlias) // Remove the ShardReplication record, try to create the // tablets again, make sure it's fixed. - err = topo.RemoveShardReplicationRecord(ctx, ts, cell, tablet.Keyspace, "0", tabletAlias) + err = topo.RemoveShardReplicationRecord(ctx, ts, cell, "ks", "0", tabletAlias) require.NoError(t, err) - sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "0") + sri, err = ts.GetShardReplication(ctx, cell, "ks", "0") require.NoError(t, err) assert.Equal(t, 0, len(sri.Nodes)) @@ -138,7 +217,7 @@ func TestStartFixesReplicationData(t *testing.T) { err = tm.initTablet(context.Background()) require.NoError(t, err) - sri, err = ts.GetShardReplication(ctx, cell, tablet.Keyspace, "0") + sri, err = ts.GetShardReplication(ctx, cell, "ks", "0") require.NoError(t, err) assert.Equal(t, tabletAlias, sri.Nodes[0].TabletAlias) } @@ -150,22 +229,18 @@ func TestStartFixesReplicationData(t *testing.T) { func TestStartDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { ctx := context.Background() ts := memorytopo.NewServer("cell1", "cell2") - tm := newTestTM(t, ts) + tm := newTestTM(t, ts, 1, "ks", "0") - tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "0") + tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "ks", "0") require.NoError(t, err) assert.Equal(t, uint32(1), tabletAliases[0].Uid) - tablet := newTestTablet(t) - _, keyRange, err := topo.ValidateShardName("-d0") + tablet := newTestTablet(t, 1, "ks", "-d0") require.NoError(t, err) - tablet.Shard = "-d0" - tablet.KeyRange = keyRange err = tm.Start(tablet) - // This should fail. - require.Error(t, err) + assert.Contains(t, err.Error(), "existing tablet keyspace and shard ks/0 differ") - tablets, err := ts.FindAllTabletAliasesInShard(ctx, "test_keyspace", "-d0") + tablets, err := ts.FindAllTabletAliasesInShard(ctx, "ks", "-d0") require.NoError(t, err) assert.Equal(t, 0, len(tablets)) } @@ -231,19 +306,6 @@ func TestStart(t *testing.T) { err = tm.initTablet(context.Background()) require.NoError(t, err) - si, err := ts.GetShard(ctx, "test_keyspace", "0") - if err != nil { - t.Fatalf("GetShard failed: %v", err) - } - - _, err = tm.TopoServer.GetSrvKeyspace(ctx, "cell1", "test_keyspace") - switch { - case err != nil: - // srvKeyspace should not be when tablets haven't been registered to this cell - default: - t.Errorf("Serving keyspace was not generated for cell: %v", si) - } - ti, err := ts.GetTablet(ctx, tabletAlias) if err != nil { t.Fatalf("GetTablet failed: %v", err) @@ -395,8 +457,9 @@ func TestStart(t *testing.T) { } } -func newTestTM(t *testing.T, ts *topo.Server) *TabletManager { - tablet := newTestTablet(t) +func newTestTM(t *testing.T, ts *topo.Server, uid int, keyspace, shard string) *TabletManager { + t.Helper() + tablet := newTestTablet(t, uid, keyspace, shard) tm := &TabletManager{ BatchCtx: context.Background(), TopoServer: ts, @@ -409,21 +472,20 @@ func newTestTM(t *testing.T, ts *topo.Server) *TabletManager { return tm } -func newTestTablet(t *testing.T) *topodatapb.Tablet { - shard := "0" - _, keyRange, err := topo.ValidateShardName(shard) +func newTestTablet(t *testing.T, uid int, keyspace, shard string) *topodatapb.Tablet { + shard, keyRange, err := topo.ValidateShardName(shard) require.NoError(t, err) return &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{ Cell: "cell1", - Uid: 1, + Uid: uint32(uid), }, Hostname: "localhost", PortMap: map[string]int32{ "vt": int32(1234), "grpc": int32(3456), }, - Keyspace: "test_keyspace", + Keyspace: keyspace, Shard: shard, KeyRange: keyRange, Type: topodatapb.TabletType_REPLICA, From 4442cd9d49b9334b3856e05d524cf6420fbd678b Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 14 Jun 2020 15:08:36 -0700 Subject: [PATCH 035/430] tm revamp: TestCheckMastership Also fixed a race in shard sync. Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/shard_sync.go | 24 +- go/vt/vttablet/tabletmanager/state_change.go | 52 --- .../tabletmanager/state_change_test.go | 27 -- go/vt/vttablet/tabletmanager/tm_init.go | 51 +++ go/vt/vttablet/tabletmanager/tm_init_test.go | 358 +++++++----------- 5 files changed, 195 insertions(+), 317 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/shard_sync.go b/go/vt/vttablet/tabletmanager/shard_sync.go index 40bde00027d..5748c10b929 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync.go +++ b/go/vt/vttablet/tabletmanager/shard_sync.go @@ -48,13 +48,7 @@ var ( // This goroutine gets woken up for shard record changes by maintaining a // topo watch on the shard record. It gets woken up for tablet state changes by // a notification signal from setTablet(). -func (tm *TabletManager) shardSyncLoop(ctx context.Context) { - // Make a copy of the channels so we don't race when stopShardSync() clears them. - tm.mutex.Lock() - notifyChan := tm._shardSyncChan - doneChan := tm._shardSyncDone - tm.mutex.Unlock() - +func (tm *TabletManager) shardSyncLoop(ctx context.Context, notifyChan <-chan struct{}, doneChan chan<- struct{}) { defer close(doneChan) // retryChan is how we wake up after going to sleep between retries. @@ -234,17 +228,17 @@ func (tm *TabletManager) startShardSync() { // if the buffer is full because all we care about is that the receiver will // be told it needs to recheck the state. tm.mutex.Lock() + defer tm.mutex.Unlock() tm._shardSyncChan = make(chan struct{}, 1) tm._shardSyncDone = make(chan struct{}) ctx, cancel := context.WithCancel(context.Background()) tm._shardSyncCancel = cancel - tm.mutex.Unlock() - - // Queue up a pending notification to force the loop to run once at startup. - tm.notifyShardSync() // Start the sync loop in the background. - go tm.shardSyncLoop(ctx) + go tm.shardSyncLoop(ctx, tm._shardSyncChan, tm._shardSyncDone) + + // Queue up a pending notification to force the loop to run once at startup. + go tm.notifyShardSync() } func (tm *TabletManager) stopShardSync() { @@ -253,12 +247,8 @@ func (tm *TabletManager) stopShardSync() { tm.mutex.Lock() if tm._shardSyncCancel != nil { tm._shardSyncCancel() - tm._shardSyncCancel = nil - tm._shardSyncChan = nil - - doneChan = tm._shardSyncDone - tm._shardSyncDone = nil } + doneChan = tm._shardSyncDone tm.mutex.Unlock() // If the shard sync loop was running, wait for it to fully stop. diff --git a/go/vt/vttablet/tabletmanager/state_change.go b/go/vt/vttablet/tabletmanager/state_change.go index 1dade4bc9d9..95221562c1a 100644 --- a/go/vt/vttablet/tabletmanager/state_change.go +++ b/go/vt/vttablet/tabletmanager/state_change.go @@ -30,7 +30,6 @@ import ( "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -411,54 +410,3 @@ func (tm *TabletManager) retryPublish() { return } } - -func (tm *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Duration) { - var srvKeyspace *topodatapb.SrvKeyspace - defer func() { - log.Infof("Keyspace rebuilt: %v", keyspace) - tm.mutex.Lock() - defer tm.mutex.Unlock() - tm._srvKeyspace = srvKeyspace - }() - - // RebuildKeyspace will fail until at least one tablet is up for every shard. - firstTime := true - var err error - for { - if !firstTime { - // If keyspace was rebuilt by someone else, we can just exit. - srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.BatchCtx, tm.tabletAlias.Cell, keyspace) - if err == nil { - return - } - } - err = topotools.RebuildKeyspace(tm.BatchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.tabletAlias.Cell}) - if err == nil { - srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.BatchCtx, tm.tabletAlias.Cell, keyspace) - if err == nil { - return - } - } - if firstTime { - log.Warningf("rebuildKeyspace failed, will retry every %v: %v", retryInterval, err) - } - firstTime = false - time.Sleep(retryInterval) - } -} - -func (tm *TabletManager) findMysqlPort(retryInterval time.Duration) { - for { - time.Sleep(retryInterval) - mport, err := tm.MysqlDaemon.GetMysqlPort() - if err != nil { - continue - } - log.Infof("Identified mysql port: %v", mport) - tm.pubMu.Lock() - tm.tablet.MysqlPort = mport - tm.pubMu.Unlock() - tm.publishState(tm.BatchCtx) - return - } -} diff --git a/go/vt/vttablet/tabletmanager/state_change_test.go b/go/vt/vttablet/tabletmanager/state_change_test.go index 1d4217e9e54..31d8ab6c910 100644 --- a/go/vt/vttablet/tabletmanager/state_change_test.go +++ b/go/vt/vttablet/tabletmanager/state_change_test.go @@ -23,7 +23,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" - "vitess.io/vitess/go/vt/mysqlctl/fakemysqldaemon" ) func TestPublishState(t *testing.T) { @@ -71,29 +70,3 @@ func TestPublishState(t *testing.T) { require.NoError(t, err) assert.Equal(t, tab2, ttablet.Tablet) } - -func TestFindMysqlPort(t *testing.T) { - defer func(saved time.Duration) { mysqlPortRetryInterval = saved }(mysqlPortRetryInterval) - mysqlPortRetryInterval = 1 * time.Millisecond - - ctx := context.Background() - tm := createTestTM(ctx, t, nil) - err := tm.checkMysql(ctx) - require.NoError(t, err) - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) - require.NoError(t, err) - assert.Equal(t, ttablet.MysqlPort, int32(0)) - - tm.pubMu.Lock() - tm.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) - tm.pubMu.Unlock() - for i := 0; i < 10; i++ { - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) - require.NoError(t, err) - if ttablet.MysqlPort == 3306 { - return - } - time.Sleep(5 * time.Millisecond) - } - assert.Fail(t, "mysql port was not updated") -} diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 11e769442bf..a68abcfbfae 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -448,6 +448,41 @@ func (tm *TabletManager) createKeyspaceShard(ctx context.Context) error { return nil } +func (tm *TabletManager) rebuildKeyspace(keyspace string, retryInterval time.Duration) { + var srvKeyspace *topodatapb.SrvKeyspace + defer func() { + log.Infof("Keyspace rebuilt: %v", keyspace) + tm.mutex.Lock() + defer tm.mutex.Unlock() + tm._srvKeyspace = srvKeyspace + }() + + // RebuildKeyspace will fail until at least one tablet is up for every shard. + firstTime := true + var err error + for { + if !firstTime { + // If keyspace was rebuilt by someone else, we can just exit. + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.BatchCtx, tm.tabletAlias.Cell, keyspace) + if err == nil { + return + } + } + err = topotools.RebuildKeyspace(tm.BatchCtx, logutil.NewConsoleLogger(), tm.TopoServer, keyspace, []string{tm.tabletAlias.Cell}) + if err == nil { + srvKeyspace, err = tm.TopoServer.GetSrvKeyspace(tm.BatchCtx, tm.tabletAlias.Cell, keyspace) + if err == nil { + return + } + } + if firstTime { + log.Warningf("rebuildKeyspace failed, will retry every %v: %v", retryInterval, err) + } + firstTime = false + time.Sleep(retryInterval) + } +} + func (tm *TabletManager) checkMastership(ctx context.Context) error { tm.mutex.Lock() si := tm._shardInfo @@ -531,6 +566,22 @@ func (tm *TabletManager) checkMysql(ctx context.Context) error { return nil } +func (tm *TabletManager) findMysqlPort(retryInterval time.Duration) { + for { + time.Sleep(retryInterval) + mport, err := tm.MysqlDaemon.GetMysqlPort() + if err != nil { + continue + } + log.Infof("Identified mysql port: %v", mport) + tm.pubMu.Lock() + tm.tablet.MysqlPort = mport + tm.pubMu.Unlock() + tm.publishState(tm.BatchCtx) + return + } +} + func (tm *TabletManager) initTablet(ctx context.Context) error { tablet := tm.Tablet() err := tm.TopoServer.CreateTablet(ctx, tablet) diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index eb302f28453..0b570341a43 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -17,15 +17,12 @@ limitations under the License. package tabletmanager import ( - "fmt" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" - "vitess.io/vitess/go/history" - "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/logutil" @@ -35,7 +32,6 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topotools" - "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletservermock" ) @@ -124,7 +120,8 @@ func TestStartCreateKeyspaceShard(t *testing.T) { ctx := context.Background() cell := "cell1" ts := memorytopo.NewServer(cell) - _ = newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0") + defer tm.Stop() _, err := ts.GetShard(ctx, "ks", "0") require.NoError(t, err) @@ -139,7 +136,8 @@ func TestStartCreateKeyspaceShard(t *testing.T) { // keyspace-shard already created. _, err = ts.GetOrCreateShard(ctx, "ks1", "0") require.NoError(t, err) - _ = newTestTM(t, ts, 2, "ks1", "0") + tm = newTestTM(t, ts, 2, "ks1", "0") + defer tm.Stop() _, err = ts.GetShard(ctx, "ks1", "0") require.NoError(t, err) ensureSrvKeyspace(t, ts, cell, "ks1") @@ -152,7 +150,8 @@ func TestStartCreateKeyspaceShard(t *testing.T) { require.NoError(t, err) err = topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), ts, "ks2", []string{cell}) require.NoError(t, err) - _ = newTestTM(t, ts, 3, "ks2", "0") + tm = newTestTM(t, ts, 3, "ks2", "0") + defer tm.Stop() _, err = ts.GetShard(ctx, "ks2", "0") require.NoError(t, err) _, err = ts.GetSrvKeyspace(context.Background(), cell, "ks2") @@ -168,7 +167,8 @@ func TestStartCreateKeyspaceShard(t *testing.T) { require.NoError(t, err) err = ts.RebuildSrvVSchema(ctx, []string{cell}) require.NoError(t, err) - _ = newTestTM(t, ts, 4, "ks3", "0") + tm = newTestTM(t, ts, 4, "ks3", "0") + defer tm.Stop() _, err = ts.GetShard(ctx, "ks3", "0") require.NoError(t, err) _, err = ts.GetSrvKeyspace(context.Background(), cell, "ks3") @@ -193,12 +193,139 @@ func ensureSrvKeyspace(t *testing.T, ts *topo.Server, cell, keyspace string) { assert.True(t, found) } +func TestCheckMastership(t *testing.T) { + defer func(saved time.Duration) { rebuildKeyspaceRetryInterval = saved }(rebuildKeyspaceRetryInterval) + rebuildKeyspaceRetryInterval = 10 * time.Millisecond + + ctx := context.Background() + cell := "cell1" + ts := memorytopo.NewServer(cell) + alias := &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 1, + } + + // 1. Initialize the tablet as REPLICA. + // This will create the respective topology records. + tm := newTestTM(t, ts, 1, "ks", "0") + tablet := tm.Tablet() + ensureSrvKeyspace(t, ts, cell, "ks") + ti, err := ts.GetTablet(ctx, alias) + require.NoError(t, err) + assert.Equal(t, topodatapb.TabletType_REPLICA, ti.Type) + tm.Stop() + + // 2. Update shard's master to our alias, then try to init again. + // (This simulates the case where the MasterAlias in the shard record says + // that we are the master but the tablet record says otherwise. In that case, + // we assume we are not the MASTER.) + _, err = ts.UpdateShardFields(ctx, "ks", "0", func(si *topo.ShardInfo) error { + si.MasterAlias = alias + return nil + }) + require.NoError(t, err) + err = tm.Start(tablet) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, alias) + require.NoError(t, err) + assert.Equal(t, topodatapb.TabletType_REPLICA, ti.Type) + ter0 := ti.GetMasterTermStartTime() + assert.True(t, ter0.IsZero()) + tm.Stop() + + // 3. Delete the tablet record. The shard record still says that we are the + // MASTER. Since it is the only source, we assume that its information is + // correct and start as MASTER. + err = ts.DeleteTablet(ctx, alias) + require.NoError(t, err) + err = tm.Start(tablet) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, alias) + require.NoError(t, err) + assert.Equal(t, topodatapb.TabletType_MASTER, ti.Type) + ter1 := ti.GetMasterTermStartTime() + tm.Stop() + + // 4. Fix the tablet record to agree that we're master. + // Shard and tablet record are in sync now and we assume that we are actually + // the MASTER. + ti.Type = topodatapb.TabletType_MASTER + err = ts.UpdateTablet(ctx, ti) + require.NoError(t, err) + err = tm.Start(tablet) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, alias) + require.NoError(t, err) + assert.Equal(t, topodatapb.TabletType_MASTER, ti.Type) + ter2 := ti.GetMasterTermStartTime() + assert.Equal(t, ter1, ter2) + tm.Stop() + + // 5. Subsequent inits will still start the vttablet as MASTER. + err = tm.Start(tablet) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, alias) + require.NoError(t, err) + assert.Equal(t, topodatapb.TabletType_MASTER, ti.Type) + ter3 := ti.GetMasterTermStartTime() + assert.Equal(t, ter1, ter3) + tm.Stop() + + // 6. If the shard record shows a different master with an older + // timestamp, we take over mastership. + otherAlias := &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 2, + } + _, err = ts.UpdateShardFields(ctx, "ks", "0", func(si *topo.ShardInfo) error { + si.MasterAlias = otherAlias + si.MasterTermStartTime = logutil.TimeToProto(ter1.Add(-10 * time.Second)) + return nil + }) + require.NoError(t, err) + err = tm.Start(tablet) + require.NoError(t, err) + ti, err = ts.GetTablet(ctx, alias) + require.NoError(t, err) + assert.Equal(t, topodatapb.TabletType_MASTER, ti.Type) + ter4 := ti.GetMasterTermStartTime() + assert.Equal(t, ter1, ter4) + tm.Stop() +} + +func TestFindMysqlPort(t *testing.T) { + defer func(saved time.Duration) { mysqlPortRetryInterval = saved }(mysqlPortRetryInterval) + mysqlPortRetryInterval = 1 * time.Millisecond + + ctx := context.Background() + tm := createTestTM(ctx, t, nil) + err := tm.checkMysql(ctx) + require.NoError(t, err) + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) + require.NoError(t, err) + assert.Equal(t, ttablet.MysqlPort, int32(0)) + + tm.pubMu.Lock() + tm.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) + tm.pubMu.Unlock() + for i := 0; i < 10; i++ { + ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) + require.NoError(t, err) + if ttablet.MysqlPort == 3306 { + return + } + time.Sleep(5 * time.Millisecond) + } + assert.Fail(t, "mysql port was not updated") +} + // Init tablet fixes replication data when safe func TestStartFixesReplicationData(t *testing.T) { ctx := context.Background() cell := "cell1" ts := memorytopo.NewServer(cell, "cell2") tm := newTestTM(t, ts, 1, "ks", "0") + defer tm.Stop() tabletAlias := tm.tabletAlias sri, err := ts.GetShardReplication(ctx, cell, "ks", "0") @@ -230,6 +357,7 @@ func TestStartDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { ctx := context.Background() ts := memorytopo.NewServer("cell1", "cell2") tm := newTestTM(t, ts, 1, "ks", "0") + defer tm.Stop() tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "ks", "0") require.NoError(t, err) @@ -245,225 +373,13 @@ func TestStartDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { assert.Equal(t, 0, len(tablets)) } -// TestStart will test the Start code creates / updates the -// tablet node correctly. Note we modify global parameters (the flags) -// so this has to be in one test. -func TestStart(t *testing.T) { - ctx := context.Background() - ts := memorytopo.NewServer("cell1", "cell2") - tabletAlias := &topodatapb.TabletAlias{ - Cell: "cell1", - Uid: 1, - } - db := fakesqldb.New(t) - defer db.Close() - - // start with a tablet record that doesn't exist - port := int32(1234) - gRPCPort := int32(3456) - mysqlDaemon := fakemysqldaemon.NewFakeMysqlDaemon(db) - tm := &TabletManager{ - TopoServer: ts, - tabletAlias: tabletAlias, - MysqlDaemon: mysqlDaemon, - DBConfigs: &dbconfigs.DBConfigs{}, - VREngine: vreplication.NewTestEngine(nil, "", nil, nil, "", nil), - BatchCtx: ctx, - History: history.New(historyLength), - baseTabletType: topodatapb.TabletType_REPLICA, - _healthy: fmt.Errorf("healthcheck not run yet"), - } - - // 1. Initialize the tablet as REPLICA. - // This will create the respective topology records. - // We use a capitalized shard name here, to make sure the - // Keyrange computation works, fills in the KeyRange, and converts - // it to lower case. - *tabletHostname = "localhost" - *initKeyspace = "test_keyspace" - *initShard = "0" - *initTabletType = "replica" - tabletAlias = &topodatapb.TabletAlias{ - Cell: "cell1", - Uid: 2, - } - - _, err := tm.TopoServer.GetSrvKeyspace(ctx, "cell1", "test_keyspace") - switch { - case topo.IsErrType(err, topo.NoNode): - // srvKeyspace should not be when tablets haven't been registered to this cell - default: - t.Fatalf("GetSrvKeyspace failed: %v", err) - } - - tm.tabletAlias = tabletAlias - - tablet, err := BuildTabletFromInput(tabletAlias, port, gRPCPort) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.initTablet(context.Background()) - require.NoError(t, err) - - ti, err := ts.GetTablet(ctx, tabletAlias) - if err != nil { - t.Fatalf("GetTablet failed: %v", err) - } - if ti.Type != topodatapb.TabletType_REPLICA { - t.Errorf("wrong tablet type: %v", ti.Type) - } - if ti.Hostname != "localhost" { - t.Errorf("wrong hostname for tablet: %v", ti.Hostname) - } - if ti.PortMap["vt"] != port { - t.Errorf("wrong port for tablet: %v", ti.PortMap["vt"]) - } - if ti.PortMap["grpc"] != gRPCPort { - t.Errorf("wrong gRPC port for tablet: %v", ti.PortMap["grpc"]) - } - if ti.Shard != "0" { - t.Errorf("wrong shard for tablet: %v", ti.Shard) - } - if ti.KeyRange != nil { - t.Errorf("wrong KeyRange for tablet: %v", ti.KeyRange) - } - if got := tm.masterTermStartTime(); !got.IsZero() { - t.Fatalf("REPLICA tablet should not have a MasterTermStartTime set: %v", got) - } - - // 2. Update shard's master to our alias, then try to init again. - // (This simulates the case where the MasterAlias in the shard record says - // that we are the master but the tablet record says otherwise. In that case, - // we assume we are not the MASTER.) - _, err = tm.TopoServer.UpdateShardFields(ctx, "test_keyspace", "0", func(si *topo.ShardInfo) error { - si.MasterAlias = tabletAlias - return nil - }) - if err != nil { - t.Fatalf("UpdateShardFields failed: %v", err) - } - - tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.initTablet(context.Background()) - require.NoError(t, err) - - ti, err = ts.GetTablet(ctx, tabletAlias) - if err != nil { - t.Fatalf("GetTablet failed: %v", err) - } - // It should still be replica, because the tablet record doesn't agree. - if ti.Type != topodatapb.TabletType_REPLICA { - t.Errorf("wrong tablet type: %v", ti.Type) - } - if got := tm.masterTermStartTime(); !got.IsZero() { - t.Fatalf("REPLICA tablet should not have a masterTermStartTime set: %v", got) - } - - // 3. Delete the tablet record. The shard record still says that we are the - // MASTER. Since it is the only source, we assume that its information is - // correct and start as MASTER. - if err := ts.DeleteTablet(ctx, tabletAlias); err != nil { - t.Fatalf("DeleteTablet failed: %v", err) - } - - tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.checkMastership(ctx) - require.NoError(t, err) - err = tm.initTablet(context.Background()) - require.NoError(t, err) - - ti, err = ts.GetTablet(ctx, tabletAlias) - if err != nil { - t.Fatalf("GetTablet failed: %v", err) - } - if ti.Type != topodatapb.TabletType_MASTER { - t.Errorf("wrong tablet type: %v", ti.Type) - } - ter1 := ti.GetMasterTermStartTime() - if ter1.IsZero() { - t.Fatalf("MASTER tablet should have a masterTermStartTime set") - } - - // 4. Fix the tablet record to agree that we're master. - // Shard and tablet record are in sync now and we assume that we are actually - // the MASTER. - ti.Type = topodatapb.TabletType_MASTER - if err := ts.UpdateTablet(ctx, ti); err != nil { - t.Fatalf("UpdateTablet failed: %v", err) - } - - tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.checkMastership(ctx) - require.NoError(t, err) - err = tm.initTablet(context.Background()) - require.NoError(t, err) - - ti, err = ts.GetTablet(ctx, tabletAlias) - if err != nil { - t.Fatalf("GetTablet failed: %v", err) - } - if ti.Type != topodatapb.TabletType_MASTER { - t.Errorf("wrong tablet type: %v", ti.Type) - } - ter2 := ti.GetMasterTermStartTime() - if ter2.IsZero() || !ter2.Equal(ter1) { - t.Fatalf("After a restart, masterTermStartTime must be equal to the previous time saved in the tablet record. Previous timestamp: %v current timestamp: %v", ter1, ter2) - } - - // 5. Subsequent inits will still start the vttablet as MASTER. - // (Also check db name override and tags here.) - *initDbNameOverride = "DBNAME" - initTags.Set("aaa:bbb") - - tablet, err = BuildTabletFromInput(tabletAlias, port, gRPCPort) - require.NoError(t, err) - tm.tablet = tablet - err = tm.createKeyspaceShard(context.Background()) - require.NoError(t, err) - err = tm.checkMastership(ctx) - require.NoError(t, err) - err = tm.initTablet(context.Background()) - require.NoError(t, err) - - ti, err = ts.GetTablet(ctx, tabletAlias) - if err != nil { - t.Fatalf("GetTablet failed: %v", err) - } - if ti.Type != topodatapb.TabletType_MASTER { - t.Errorf("wrong tablet type: %v", ti.Type) - } - if ti.DbNameOverride != "DBNAME" { - t.Errorf("wrong tablet DbNameOverride: %v", ti.DbNameOverride) - } - if len(ti.Tags) != 1 || ti.Tags["aaa"] != "bbb" { - t.Errorf("wrong tablet tags: %v", ti.Tags) - } - ter3 := ti.GetMasterTermStartTime() - if ter3.IsZero() || !ter3.Equal(ter2) { - t.Fatalf("After a restart, masterTermStartTime must be set to the previous time saved in the tablet record. Previous timestamp: %v current timestamp: %v", ter2, ter3) - } -} - func newTestTM(t *testing.T, ts *topo.Server, uid int, keyspace, shard string) *TabletManager { t.Helper() tablet := newTestTablet(t, uid, keyspace, shard) tm := &TabletManager{ BatchCtx: context.Background(), TopoServer: ts, - MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)}, + MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(1)}, DBConfigs: &dbconfigs.DBConfigs{}, QueryServiceControl: tabletservermock.NewController(), } From cab2687684eb2ab11252f4f9d2db0cb3ad1ff479 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 14 Jun 2020 16:19:02 -0700 Subject: [PATCH 036/430] tm recamp: test for multi-shard srvKeyspace Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/tm_init_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 0b570341a43..b6ad83a8baf 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -176,6 +176,20 @@ func TestStartCreateKeyspaceShard(t *testing.T) { srvVSchema, err = ts.GetSrvVSchema(context.Background(), cell) require.NoError(t, err) assert.Equal(t, wantVSchema, srvVSchema.Keyspaces["ks3"]) + + // Multi-shard + tm1 := newTestTM(t, ts, 5, "ks4", "-80") + defer tm1.Stop() + + // Wait a bit and make sure that srvKeyspace is still not created. + time.Sleep(100 * time.Millisecond) + _, err = ts.GetSrvKeyspace(context.Background(), cell, "ks4") + require.True(t, topo.IsErrType(err, topo.NoNode), err) + + tm2 := newTestTM(t, ts, 6, "ks4", "80-") + defer tm2.Stop() + // Now that we've started the tablet for the other shard, srvKeyspace will succeed. + ensureSrvKeyspace(t, ts, cell, "ks4") } func ensureSrvKeyspace(t *testing.T, ts *topo.Server, cell, keyspace string) { From 7e8d2d43a11d794b4dface8a09e70af409209a6e Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sun, 14 Jun 2020 18:00:32 -0700 Subject: [PATCH 037/430] tm revamp: TestStartCheckMysql Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/tm_init_test.go | 85 ++++++++++++++------ 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index b6ad83a8baf..1d6246f8dca 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sync2" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/logutil" @@ -192,21 +193,6 @@ func TestStartCreateKeyspaceShard(t *testing.T) { ensureSrvKeyspace(t, ts, cell, "ks4") } -func ensureSrvKeyspace(t *testing.T, ts *topo.Server, cell, keyspace string) { - t.Helper() - found := false - for i := 0; i < 10; i++ { - _, err := ts.GetSrvKeyspace(context.Background(), cell, "ks") - if err == nil { - found = true - break - } - require.True(t, topo.IsErrType(err, topo.NoNode), err) - time.Sleep(rebuildKeyspaceRetryInterval) - } - assert.True(t, found) -} - func TestCheckMastership(t *testing.T) { defer func(saved time.Duration) { rebuildKeyspaceRetryInterval = saved }(rebuildKeyspaceRetryInterval) rebuildKeyspaceRetryInterval = 10 * time.Millisecond @@ -307,25 +293,63 @@ func TestCheckMastership(t *testing.T) { tm.Stop() } -func TestFindMysqlPort(t *testing.T) { +func TestStartCheckMysql(t *testing.T) { + ctx := context.Background() + cell := "cell1" + ts := memorytopo.NewServer(cell) + tablet := newTestTablet(t, 1, "ks", "0") + cp := mysql.ConnParams{ + Host: "foo", + Port: 1, + } + tm := &TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)}, + DBConfigs: dbconfigs.NewTestDBConfigs(cp, cp, ""), + QueryServiceControl: tabletservermock.NewController(), + } + err := tm.Start(tablet) + require.NoError(t, err) + defer tm.Stop() + + ti, err := ts.GetTablet(ctx, tm.tabletAlias) + require.NoError(t, err) + assert.Equal(t, int32(1), ti.MysqlPort) + assert.Equal(t, "foo", ti.MysqlHostname) +} + +func TestStartFindMysqlPort(t *testing.T) { defer func(saved time.Duration) { mysqlPortRetryInterval = saved }(mysqlPortRetryInterval) mysqlPortRetryInterval = 1 * time.Millisecond ctx := context.Background() - tm := createTestTM(ctx, t, nil) - err := tm.checkMysql(ctx) + cell := "cell1" + ts := memorytopo.NewServer(cell) + tablet := newTestTablet(t, 1, "ks", "0") + fmd := &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(-1)} + tm := &TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: fmd, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + } + err := tm.Start(tablet) require.NoError(t, err) - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) + defer tm.Stop() + + ti, err := ts.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) - assert.Equal(t, ttablet.MysqlPort, int32(0)) + assert.Equal(t, int32(0), ti.MysqlPort) tm.pubMu.Lock() - tm.MysqlDaemon.(*fakemysqldaemon.FakeMysqlDaemon).MysqlPort.Set(3306) + fmd.MysqlPort.Set(3306) tm.pubMu.Unlock() for i := 0; i < 10; i++ { - ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) + ti, err := ts.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) - if ttablet.MysqlPort == 3306 { + if ti.MysqlPort == 3306 { return } time.Sleep(5 * time.Millisecond) @@ -421,3 +445,18 @@ func newTestTablet(t *testing.T, uid int, keyspace, shard string) *topodatapb.Ta Type: topodatapb.TabletType_REPLICA, } } + +func ensureSrvKeyspace(t *testing.T, ts *topo.Server, cell, keyspace string) { + t.Helper() + found := false + for i := 0; i < 10; i++ { + _, err := ts.GetSrvKeyspace(context.Background(), cell, "ks") + if err == nil { + found = true + break + } + require.True(t, topo.IsErrType(err, topo.NoNode), err) + time.Sleep(rebuildKeyspaceRetryInterval) + } + assert.True(t, found) +} From 94e6529b990a216bb1efd379cc89dc9a88549e3a Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Wed, 17 Jun 2020 23:59:47 +0530 Subject: [PATCH 038/430] updated vstream to work with go routine and return the gitd back via chan Signed-off-by: Arindam Nayak --- go/vt/dbconfigs/dbconfigs.go | 6 +- go/vt/vttablet/tabletmanager/restore.go | 78 +++++++++++-------- .../vreplication/replica_connector.go | 2 +- 3 files changed, 50 insertions(+), 36 deletions(-) diff --git a/go/vt/dbconfigs/dbconfigs.go b/go/vt/dbconfigs/dbconfigs.go index 59375ccb07e..dd0cf350c93 100644 --- a/go/vt/dbconfigs/dbconfigs.go +++ b/go/vt/dbconfigs/dbconfigs.go @@ -395,9 +395,9 @@ func (dbcfgs *DBConfigs) getParams(userKey string, dbc *DBConfigs) (*UserConfig, } // SetDbParams sets the dba and app params -func (dbcfgs *DBConfigs) SetDbParams(params mysql.ConnParams) { - dbcfgs.dbaParams = params - dbcfgs.appParams = params +func (dbcfgs *DBConfigs) SetDbParams(dbaParams, appParams mysql.ConnParams) { + dbcfgs.dbaParams = dbaParams + dbcfgs.appParams = appParams } // NewTestDBConfigs returns a DBConfigs meant for testing. diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index bfd424e6208..d4391c24a9f 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -21,6 +21,8 @@ import ( "fmt" "time" + "vitess.io/vitess/go/vt/proto/vttime" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/dbconfigs" @@ -51,11 +53,10 @@ var ( waitForBackupInterval = flag.Duration("wait_for_backup_interval", 0, "(init restore parameter) if this is greater than 0, instead of starting up empty when no backups are found, keep checking at this interval for a backup to appear") // Flags for PITR - restoreToTimeStr = flag.String("restore_to_time", "", "(init restore parameter) will restore to the specified time, it depends on the binlog related flags.") - binlogHost = flag.String("binlog_host", "", "(init restore parameter) host name of binlog server.") - binlogPort = flag.Int("binlog_port", 0, "(init restore parameter) port of binlog server.") - binlogUser = flag.String("binlog_user", "", "(init restore parameter) username of binlog server.") - binlogPwd = flag.String("binlog_password", "", "(init restore parameter) password of binlog server.") + binlogHost = flag.String("binlog_host", "", "(init restore parameter) host name of binlog server.") + binlogPort = flag.Int("binlog_port", 0, "(init restore parameter) port of binlog server.") + binlogUser = flag.String("binlog_user", "", "(init restore parameter) username of binlog server.") + binlogPwd = flag.String("binlog_password", "", "(init restore parameter) password of binlog server.") ) // RestoreData is the main entry point for backup restore. @@ -139,8 +140,8 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. pos = backupManifest.Position } // If restore_to_time is set , then apply the incremental change - if restoreToTimeStr != nil { - err = agent.restoreToTimeFromBinlog(ctx, pos) + if keyspaceInfo.SnapshotTime != nil { + err = agent.restoreToTimeFromBinlog(ctx, pos, keyspaceInfo.SnapshotTime) if err != nil { return nil } @@ -185,29 +186,27 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. return nil } -func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql.Position) error { +func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql.Position, restoreTime *vttime.Time) error { // validate the dependent settings if *binlogHost == "" || *binlogPort <= 0 || *binlogUser == "" { return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "restore_to_time flag depends on binlog server flags(binlog_host, binlog_port, binlog_user, binlog_password)") } - restoreTime, err := time.Parse(time.RFC3339, *restoreToTimeStr) - if err != nil { - return err - } - if restoreTime.Second() > time.Now().Second() { - log.Warning("Restore time request is a future date, so skipping it") - return nil - } - restoreTimePb := logutil.TimeToProto(restoreTime) - println(restoreTimePb.Seconds) - gtid := agent.getGTIDFromTimestamp(ctx, pos, restoreTimePb.Seconds) + //if restoreTime.Seconds > int64(time.Now().Second()) { + // println(restoreTime.Seconds) + // println(time.Now().Second()) + // log.Warning("Restore time request is a future date, so skipping it") + // return nil + //} + println("restoring from below time") + println(restoreTime.Seconds) + gtid := agent.getGTIDFromTimestamp(ctx, pos, restoreTime.Seconds) if gtid == "" { return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "unable to fetch the GTID for the specified restore_to_time") } println(fmt.Sprintf("going to restore upto the gtid - %s", gtid)) - err = agent.replicateUptoGTID(ctx, gtid) + err := agent.catchupToGTID(ctx, gtid) if err != nil { return vterrors.Wrapf(err, "unable to replicate upto specified gtid : %s", gtid) } @@ -227,7 +226,7 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po Host: connParams.Host, Port: connParams.Port, } - dbCfgs.SetDbParams(*connParams) + dbCfgs.SetDbParams(*connParams, *connParams) vsClient := vreplication.NewReplicaConnector(connParams) filter := &binlogdatapb.Filter{ @@ -235,23 +234,37 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po Match: "/.*", }}, } - gtid := "" + // Todo: we need to safely return from vstream if it takes more time - // Todo: we need to return from vstream , so that we return the GTID - _ = vsClient.VStream(ctx, mysql.EncodePosition(pos), filter, func(events []*binlogdatapb.VEvent) error { - for _, event := range events { - if event.Gtid != "" && event.Timestamp > restoreTime { - gtid = event.Gtid - break + found := make(chan string) + go func() { + err := vsClient.VStream(ctx, mysql.EncodePosition(pos), filter, func(events []*binlogdatapb.VEvent) error { + for _, event := range events { + if event.Gtid != "" && event.Timestamp > restoreTime { + found <- event.Gtid + break + } } + return nil + }) + if err != nil { + found <- "" } - return nil - }) - return gtid + }() + timeout := time.Now().Add(60 * time.Second) + for time.Now().Before(timeout) { + select { + case <-found: + return <-found + default: + time.Sleep(300 * time.Millisecond) + } + } + return "" } // replicateUptoGTID replicates upto specified gtid from binlog server -func (agent *ActionAgent) replicateUptoGTID(ctx context.Context, gtid string) error { +func (agent *ActionAgent) catchupToGTID(ctx context.Context, gtid string) error { // TODO: we can use agent.MysqlDaemon.SetMaster , but it uses replDbConfig cmds := []string{ "STOP SLAVE FOR CHANNEL '' ", @@ -263,6 +276,7 @@ func (agent *ActionAgent) replicateUptoGTID(ctx context.Context, gtid string) er if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { return vterrors.Wrap(err, "failed to reset slave") } + println("it should have cought up") // TODO: Wait for the replication to happen and then reset the slave, so that we don't be connected to binlog server return nil } diff --git a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go index fef947b1392..3133f7d9610 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go @@ -44,7 +44,7 @@ func NewReplicaConnector(connParams *mysql.ConnParams) *replicaConnector { Host: connParams.Host, Port: connParams.Port, } - dbCfg.SetDbParams(*connParams) + dbCfg.SetDbParams(*connParams, *connParams) config.DB = dbCfg c := &replicaConnector{conn: connParams} env := tabletenv.NewEnv(config, "source") From f1d2fa0fe52b0fb731837547c0c8d9c3ea66c75c Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Wed, 17 Jun 2020 11:14:59 -0700 Subject: [PATCH 039/430] parser: allow parenthesized selects Start of fix for #6305 Signed-off-by: Sugu Sougoumarane --- go/vt/sqlparser/sql.go | 5819 ++++++++++++++++++++-------------------- go/vt/sqlparser/sql.y | 66 +- 2 files changed, 2935 insertions(+), 2950 deletions(-) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 7838bab1f35..58748f2d2d7 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -822,9 +822,6 @@ var yyExca = [...]int{ -1, 1, 1, -1, -2, 0, - -1, 3, - 5, 36, - -2, 4, -1, 40, 33, 302, 131, 302, @@ -832,37 +829,34 @@ var yyExca = [...]int{ 168, 316, 169, 316, -2, 304, - -1, 66, + -1, 65, 38, 355, -2, 363, + -1, 375, + 119, 685, + -2, 681, -1, 376, - 119, 687, - -2, 683, - -1, 377, - 119, 688, - -2, 684, - -1, 390, + 119, 686, + -2, 682, + -1, 389, 38, 356, -2, 368, - -1, 391, + -1, 390, 38, 357, -2, 369, - -1, 414, - 87, 938, + -1, 413, + 87, 936, -2, 69, - -1, 415, - 87, 855, + -1, 414, + 87, 853, -2, 70, - -1, 420, - 87, 823, + -1, 419, + 87, 821, + -2, 647, + -1, 421, + 87, 884, -2, 649, - -1, 422, - 87, 886, - -2, 651, - -1, 609, - 5, 36, - -2, 334, - -1, 736, + -1, 729, 1, 393, 5, 393, 12, 393, @@ -886,407 +880,374 @@ var yyExca = [...]int{ 59, 393, 360, 393, -2, 411, - -1, 739, + -1, 732, 56, 51, 58, 51, -2, 55, - -1, 913, - 119, 690, - -2, 686, - -1, 1117, - 5, 37, - -2, 479, - -1, 1164, - 5, 36, - -2, 622, - -1, 1410, - 5, 37, - -2, 623, - -1, 1463, - 5, 36, - -2, 625, - -1, 1538, - 5, 37, - -2, 626, + -1, 906, + 119, 688, + -2, 684, } const yyPrivate = 57344 -const yyLast = 17507 +const yyLast = 17650 var yyAct = [...]int{ - 376, 1572, 1562, 1370, 1528, 1260, 320, 1167, 1443, 1476, - 1015, 1185, 1430, 349, 1311, 665, 3, 335, 988, 1344, - 1308, 379, 1168, 1011, 1058, 585, 62, 1211, 1024, 306, - 574, 1312, 1318, 1277, 1044, 85, 666, 1014, 1324, 275, - 1155, 295, 275, 838, 1108, 857, 583, 275, 1237, 900, - 1228, 1028, 752, 990, 975, 392, 419, 907, 716, 704, - 709, 932, 877, 986, 1054, 751, 968, 733, 405, 378, - 543, 413, 275, 85, 318, 741, 544, 275, 307, 275, - 66, 310, 732, 400, 864, 723, 679, 408, 61, 311, - 7, 6, 5, 680, 1565, 1549, 1560, 1536, 416, 563, - 738, 1557, 1371, 1548, 1038, 1077, 1535, 1294, 1399, 68, - 69, 70, 71, 72, 548, 1338, 1339, 1340, 361, 1076, - 367, 368, 365, 366, 364, 363, 362, 398, 271, 267, - 268, 269, 1006, 1007, 369, 370, 312, 1005, 603, 273, - 87, 88, 89, 1199, 309, 308, 1198, 302, 1219, 1200, - 87, 88, 89, 753, 27, 754, 54, 30, 31, 1037, - 598, 1075, 1433, 315, 599, 596, 597, 1262, 87, 88, - 89, 263, 407, 1045, 261, 1390, 265, 545, 1388, 547, - 1502, 628, 627, 637, 638, 630, 631, 632, 633, 634, - 635, 636, 629, 301, 601, 639, 827, 602, 910, 591, - 592, 1264, 826, 824, 1559, 59, 1556, 1529, 1259, 969, - 580, 1576, 582, 1072, 1069, 1070, 1278, 1068, 1521, 1580, - 1263, 1029, 588, 1186, 1188, 1477, 564, 550, 265, 1265, - 831, 815, 1485, 865, 866, 867, 1256, 828, 825, 553, - 1479, 1031, 1258, 1031, 579, 581, 87, 88, 89, 270, - 1079, 1082, 1334, 1333, 1332, 546, 278, 1280, 266, 651, - 652, 1510, 275, 555, 556, 1089, 1126, 275, 1088, 565, - 264, 1123, 1413, 275, 1195, 87, 88, 89, 1160, 275, - 572, 1136, 1116, 578, 85, 747, 560, 1074, 85, 1012, - 85, 1282, 262, 1286, 727, 1281, 85, 1279, 664, 279, - 639, 570, 1284, 85, 1187, 1045, 1001, 858, 282, 1073, - 1478, 1283, 87, 88, 89, 629, 289, 947, 639, 609, - 587, 852, 862, 1534, 1285, 1287, 1574, 1031, 75, 1575, - 577, 1573, 589, 619, 590, 617, 593, 1519, 614, 615, - 1486, 1484, 604, 1494, 1030, 1257, 1030, 1255, 1322, 1078, - 287, 619, 755, 557, 1503, 558, 294, 613, 559, 87, - 88, 89, 554, 1296, 1080, 1357, 76, 562, 949, 566, - 567, 568, 933, 569, 1133, 651, 652, 933, 576, 571, - 651, 652, 817, 280, 632, 633, 634, 635, 636, 629, - 1217, 1034, 639, 859, 612, 610, 611, 1035, 620, 1247, - 712, 85, 1524, 275, 275, 275, 55, 853, 948, 711, - 291, 283, 85, 292, 293, 299, 952, 953, 85, 284, - 286, 296, 720, 281, 298, 297, 884, 618, 617, 1540, - 1030, 1243, 1244, 1245, 312, 1027, 1025, 416, 1026, 1439, - 882, 883, 881, 677, 619, 1023, 1029, 1438, 717, 682, - 684, 686, 688, 690, 692, 693, 683, 685, 1232, 689, - 691, 575, 694, 1231, 707, 710, 713, 731, 1581, 618, - 617, 1220, 1542, 740, 630, 631, 632, 633, 634, 635, - 636, 629, 745, 750, 639, 703, 619, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 87, 88, 89, - 25, 1321, 1246, 730, 59, 739, 1520, 1251, 1248, 1239, - 1249, 1242, 1582, 1238, 549, 1455, 880, 1240, 1241, 628, - 627, 637, 638, 630, 631, 632, 633, 634, 635, 636, - 629, 1250, 542, 639, 618, 617, 1436, 1121, 1229, 1120, - 1099, 1298, 843, 275, 1491, 618, 617, 813, 85, 1490, - 816, 619, 818, 275, 275, 85, 85, 85, 618, 617, - 260, 275, 619, 1353, 275, 383, 1402, 275, 836, 837, - 1032, 275, 1156, 85, 1309, 619, 1109, 1321, 85, 85, - 85, 275, 85, 85, 1482, 1558, 1122, 1408, 715, 872, - 874, 875, 85, 85, 814, 873, 551, 552, 1101, 1102, - 1103, 821, 822, 823, 842, 962, 628, 627, 637, 638, - 630, 631, 632, 633, 634, 635, 636, 629, 972, 841, - 639, 87, 88, 89, 845, 846, 847, 840, 849, 850, - 402, 403, 832, 87, 88, 89, 878, 902, 854, 855, - 901, 618, 617, 763, 87, 88, 89, 616, 1202, 903, - 1544, 703, 961, 819, 820, 1482, 1532, 995, 619, 742, - 844, 829, 1493, 85, 407, 1482, 703, 835, 338, 337, - 340, 341, 342, 343, 1482, 1511, 1361, 339, 344, 921, - 924, 848, 972, 916, 860, 934, 1482, 1481, 1428, 1427, - 911, 1415, 703, 1412, 703, 1156, 85, 85, 1363, 1362, - 868, 869, 870, 977, 980, 981, 982, 978, 912, 979, - 983, 1359, 1360, 1325, 1326, 85, 971, 1359, 1358, 961, - 703, 913, 275, 972, 703, 85, 904, 905, 27, 27, - 275, 616, 703, 954, 762, 761, 743, 1203, 275, 275, - 1004, 1321, 275, 275, 972, 1139, 275, 275, 275, 85, - 1138, 312, 1162, 911, 919, 920, 942, 943, 1163, 1462, - 961, 742, 85, 544, 63, 950, 830, 27, 748, 59, - 1550, 967, 385, 963, 416, 1445, 1039, 1420, 1059, 59, - 59, 744, 1261, 746, 913, 876, 1349, 1016, 885, 886, - 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, - 897, 898, 899, 743, 840, 996, 994, 961, 1206, 998, - 965, 1046, 1047, 1048, 1055, 1003, 275, 85, 59, 85, - 1002, 1081, 964, 59, 1050, 275, 275, 275, 275, 275, - 970, 275, 275, 1019, 999, 275, 85, 1060, 1049, 1010, - 1325, 1326, 1446, 997, 1062, 938, 1567, 1331, 744, 1563, - 742, 1351, 275, 1328, 1309, 1233, 863, 275, 1330, 275, - 275, 834, 703, 1064, 275, 1066, 1176, 917, 918, 1175, - 1554, 923, 926, 927, 1056, 1057, 1040, 1041, 1042, 1043, - 1547, 1302, 1093, 977, 980, 981, 982, 978, 1096, 979, - 983, 1145, 1051, 1052, 1053, 878, 941, 714, 1552, 944, - 945, 628, 627, 637, 638, 630, 631, 632, 633, 634, - 635, 636, 629, 1179, 1177, 639, 1063, 1154, 1180, 1178, - 393, 1181, 1153, 981, 982, 1083, 1084, 1085, 1086, 1087, - 1224, 1090, 1091, 393, 394, 1092, 929, 705, 760, 573, - 1216, 718, 719, 396, 1104, 395, 1406, 394, 1526, 706, - 930, 1525, 1094, 1460, 390, 391, 396, 1095, 395, 1214, - 1208, 1441, 1065, 275, 1100, 833, 985, 386, 387, 380, - 1405, 1152, 381, 275, 275, 275, 275, 275, 1169, 1151, - 63, 1404, 1305, 1156, 1164, 275, 600, 1127, 275, 1569, - 1568, 67, 275, 1132, 1124, 856, 275, 721, 1569, 1507, - 1434, 1396, 946, 916, 65, 60, 1, 1561, 1372, 1442, - 1071, 1148, 1527, 1201, 1149, 85, 1475, 1134, 1343, 1159, - 1157, 1022, 1013, 74, 1207, 1204, 1158, 377, 1212, 1212, - 541, 73, 1146, 1147, 710, 1191, 1518, 1193, 1182, 1194, - 1016, 1171, 1172, 851, 1174, 1190, 1105, 1106, 1107, 586, - 1021, 1020, 1483, 1432, 1033, 1170, 1213, 1196, 1173, 1192, - 1218, 1036, 86, 85, 85, 1350, 276, 1215, 1223, 276, - 1225, 1226, 1227, 1523, 276, 1221, 1222, 768, 1209, 1210, - 628, 627, 637, 638, 630, 631, 632, 633, 634, 635, - 636, 629, 766, 85, 639, 767, 765, 1236, 770, 276, - 86, 1230, 769, 764, 276, 288, 276, 1113, 1114, 411, - 1235, 984, 756, 937, 1061, 722, 77, 85, 1252, 1254, - 1253, 1067, 901, 861, 285, 594, 595, 1130, 290, 647, - 1150, 322, 1197, 417, 410, 1316, 951, 708, 1403, 1266, - 1267, 1268, 1276, 1304, 1131, 676, 931, 321, 871, 336, - 1269, 275, 333, 334, 956, 1161, 1289, 1295, 621, 319, - 313, 85, 1299, 735, 728, 976, 85, 85, 974, 1169, - 1310, 1288, 973, 1275, 406, 1327, 1323, 1313, 734, 960, - 912, 1315, 389, 1398, 1501, 388, 1276, 928, 46, 605, - 85, 303, 29, 913, 64, 397, 20, 19, 18, 22, - 17, 16, 15, 561, 85, 33, 85, 85, 1320, 24, - 1212, 1212, 1329, 23, 14, 13, 1342, 1297, 1336, 12, - 11, 10, 1335, 9, 8, 1356, 4, 608, 21, 1016, - 382, 1016, 26, 1337, 275, 2, 1346, 1347, 1348, 0, - 1306, 1341, 0, 0, 0, 1354, 1355, 0, 0, 0, - 0, 1303, 0, 0, 275, 0, 0, 0, 0, 0, - 85, 0, 1373, 85, 85, 85, 275, 1365, 0, 0, - 0, 0, 0, 1271, 1272, 0, 0, 0, 0, 0, - 0, 0, 1366, 0, 1368, 0, 0, 1290, 1291, 276, - 1292, 1293, 0, 0, 276, 0, 0, 0, 1378, 1379, - 276, 0, 1300, 1301, 0, 0, 276, 1386, 0, 0, - 0, 86, 0, 0, 0, 86, 0, 86, 0, 0, - 0, 0, 0, 86, 0, 0, 0, 0, 1169, 0, - 86, 1407, 0, 0, 1364, 0, 0, 0, 0, 0, - 350, 53, 85, 0, 1417, 0, 0, 1416, 0, 0, - 85, 0, 1204, 0, 1367, 0, 0, 0, 1426, 0, - 0, 0, 0, 0, 0, 85, 1377, 1016, 0, 0, + 375, 1566, 1523, 1367, 1556, 1255, 1006, 319, 1440, 1472, + 1341, 1180, 584, 1309, 1162, 334, 1163, 1310, 700, 1306, + 348, 665, 979, 1015, 1002, 64, 3, 1206, 377, 1049, + 943, 1005, 1315, 1427, 1035, 84, 418, 1150, 1272, 274, + 1321, 294, 274, 893, 1099, 850, 573, 274, 745, 831, + 1232, 731, 900, 1223, 1019, 981, 967, 391, 305, 938, + 709, 924, 726, 870, 1045, 725, 412, 542, 744, 317, + 960, 274, 84, 582, 310, 543, 274, 407, 274, 734, + 404, 857, 65, 61, 415, 7, 6, 5, 1068, 716, + 272, 1559, 1543, 1554, 677, 724, 25, 1531, 301, 1551, + 562, 678, 1067, 1368, 1542, 1530, 1289, 306, 1396, 547, + 309, 67, 68, 69, 70, 71, 270, 266, 267, 268, + 1335, 27, 406, 55, 30, 31, 996, 544, 397, 546, + 1336, 1337, 308, 86, 87, 88, 86, 87, 88, 997, + 998, 746, 602, 747, 1066, 1498, 627, 626, 636, 637, + 629, 630, 631, 632, 633, 634, 635, 628, 307, 1214, + 638, 1028, 1430, 360, 314, 366, 367, 364, 365, 363, + 362, 361, 54, 1257, 86, 87, 88, 1036, 262, 368, + 369, 260, 1387, 264, 1385, 300, 820, 600, 27, 28, + 55, 30, 31, 590, 591, 1259, 1063, 1060, 1061, 929, + 1059, 601, 819, 817, 1553, 597, 579, 59, 581, 598, + 595, 596, 32, 49, 50, 1194, 52, 1550, 1193, 1524, + 1254, 1195, 961, 1516, 1020, 1574, 1258, 821, 1570, 563, + 858, 859, 860, 1070, 1073, 41, 1481, 269, 818, 54, + 578, 580, 549, 627, 626, 636, 637, 629, 630, 631, + 632, 633, 634, 635, 628, 587, 1473, 638, 264, 1260, + 824, 274, 554, 555, 385, 808, 274, 1331, 564, 1022, + 1065, 1475, 274, 1330, 1329, 545, 552, 263, 274, 571, + 1181, 1183, 577, 84, 1251, 277, 265, 84, 1080, 84, + 1253, 1079, 1064, 650, 651, 84, 1116, 1505, 1410, 261, + 1100, 1273, 84, 1113, 34, 35, 37, 36, 39, 1029, + 51, 1036, 553, 1190, 1155, 1126, 1107, 561, 740, 1499, + 720, 663, 1529, 568, 569, 559, 576, 628, 608, 570, + 638, 1003, 1069, 40, 58, 57, 638, 992, 47, 48, + 38, 1474, 1275, 1568, 1482, 1480, 1569, 1071, 1567, 1136, + 778, 1022, 851, 586, 42, 43, 845, 44, 45, 855, + 589, 1182, 592, 74, 575, 588, 613, 614, 603, 565, + 566, 567, 1021, 56, 617, 616, 1277, 1111, 1281, 1110, + 1276, 1293, 1274, 86, 87, 88, 1514, 1279, 611, 609, + 610, 618, 556, 1252, 557, 1250, 1278, 558, 617, 616, + 84, 75, 274, 274, 274, 650, 651, 704, 703, 1280, + 1282, 84, 650, 651, 706, 618, 616, 84, 86, 87, + 88, 877, 618, 415, 629, 630, 631, 632, 633, 634, + 635, 628, 618, 766, 638, 875, 876, 874, 852, 1291, + 56, 1490, 846, 1319, 748, 925, 664, 574, 612, 710, + 925, 810, 1123, 723, 1021, 732, 680, 682, 684, 686, + 688, 690, 691, 681, 683, 705, 687, 689, 1212, 692, + 1025, 1354, 1519, 1575, 779, 713, 1026, 743, 631, 632, + 633, 634, 635, 628, 733, 738, 638, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 792, 795, 796, + 797, 798, 799, 800, 548, 801, 802, 803, 804, 805, + 780, 781, 782, 783, 764, 765, 793, 1576, 767, 1534, + 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, + 784, 785, 786, 787, 788, 789, 790, 791, 86, 87, + 88, 1436, 274, 259, 1112, 1536, 806, 84, 1138, 809, + 54, 811, 274, 274, 84, 84, 84, 617, 616, 1435, + 274, 1227, 873, 274, 1022, 1226, 274, 829, 830, 1215, + 274, 1515, 84, 541, 618, 1452, 1433, 84, 84, 84, + 274, 84, 84, 1141, 1142, 550, 551, 1224, 1137, 794, + 1090, 84, 84, 756, 386, 836, 86, 87, 88, 617, + 616, 1478, 1552, 812, 813, 53, 833, 617, 616, 1538, + 386, 822, 401, 402, 406, 1487, 618, 828, 1318, 835, + 807, 1092, 1093, 1094, 618, 1478, 1527, 814, 815, 816, + 1486, 841, 86, 87, 88, 1307, 617, 616, 1318, 894, + 1478, 386, 871, 825, 1350, 834, 1478, 1506, 896, 1023, + 838, 839, 840, 618, 842, 843, 1406, 865, 867, 868, + 1478, 1477, 84, 866, 847, 848, 378, 1021, 380, 1425, + 1424, 615, 1018, 1016, 1489, 1017, 904, 1358, 913, 916, + 1412, 386, 1014, 1020, 926, 1409, 386, 337, 336, 339, + 340, 341, 342, 63, 84, 84, 338, 343, 1360, 1359, + 906, 86, 87, 88, 964, 895, 1356, 1357, 84, 953, + 86, 87, 88, 905, 1197, 274, 1356, 1355, 84, 1198, + 897, 898, 945, 274, 736, 947, 953, 386, 27, 1242, + 27, 274, 274, 904, 995, 274, 274, 964, 386, 274, + 274, 274, 84, 615, 386, 963, 664, 386, 1139, 934, + 935, 986, 1157, 735, 415, 84, 543, 906, 1158, 54, + 1459, 1238, 1239, 1240, 755, 754, 956, 1007, 955, 737, + 959, 739, 1129, 964, 962, 1128, 953, 833, 735, 54, + 1544, 54, 1561, 823, 741, 869, 736, 988, 878, 879, + 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, + 890, 891, 892, 985, 1037, 1038, 1039, 957, 993, 274, + 84, 994, 84, 1151, 1072, 27, 1151, 990, 274, 274, + 274, 274, 274, 1010, 274, 274, 978, 664, 274, 84, + 987, 737, 1241, 735, 989, 1051, 382, 1246, 1243, 1234, + 1244, 1237, 954, 1233, 930, 274, 1442, 1235, 1236, 1030, + 274, 1417, 274, 274, 1050, 1346, 1201, 274, 1256, 964, + 1054, 1245, 1318, 1046, 907, 908, 54, 1047, 1048, 1074, + 1075, 1076, 1077, 1078, 1041, 1081, 1082, 1322, 1323, 1083, + 1040, 1443, 1053, 1055, 1557, 1057, 376, 54, 1348, 953, + 1325, 1307, 1228, 856, 827, 871, 1085, 1087, 1328, 1327, + 1174, 1086, 1084, 386, 946, 1175, 1171, 1170, 1091, 1393, + 626, 636, 637, 629, 630, 631, 632, 633, 634, 635, + 628, 85, 1172, 638, 1548, 275, 1541, 1173, 275, 1176, + 1400, 973, 974, 275, 1297, 707, 1546, 1149, 1095, 1148, + 903, 1219, 627, 626, 636, 637, 629, 630, 631, 632, + 633, 634, 635, 628, 753, 274, 638, 275, 85, 572, + 1211, 1521, 275, 1520, 275, 274, 274, 274, 274, 274, + 921, 1164, 969, 972, 973, 974, 970, 274, 971, 975, + 1457, 321, 1209, 274, 922, 1122, 1159, 274, 627, 626, + 636, 637, 629, 630, 631, 632, 633, 634, 635, 628, + 1203, 1404, 638, 1438, 1196, 1143, 84, 1144, 1056, 939, + 826, 977, 1199, 1154, 1152, 1202, 383, 384, 1007, 1207, + 1207, 940, 701, 1186, 1403, 1188, 1147, 1189, 1166, 1167, + 1165, 1169, 1177, 1168, 1146, 702, 378, 1402, 1185, 1303, + 1096, 1097, 1098, 1151, 1191, 599, 1117, 1208, 1563, 1562, + 1153, 1114, 849, 714, 84, 84, 1563, 1503, 1431, 1135, + 1218, 382, 1220, 1221, 1222, 63, 1216, 1217, 66, 60, + 1, 1555, 1204, 1205, 1031, 1032, 1033, 1034, 1369, 1439, + 392, 1062, 1187, 1522, 84, 1471, 1340, 1013, 1004, 73, + 1042, 1043, 1044, 540, 393, 1225, 1102, 72, 1513, 844, + 1103, 711, 712, 395, 585, 394, 1012, 1011, 84, 1108, + 1109, 1247, 894, 1479, 1429, 1115, 1024, 1231, 1118, 1119, + 1271, 1213, 1027, 1347, 1210, 1518, 1125, 761, 1230, 759, + 1127, 1262, 1263, 1130, 1131, 1132, 1133, 1134, 760, 1294, + 758, 1264, 763, 762, 757, 287, 274, 275, 410, 1290, + 976, 1284, 275, 749, 1052, 1283, 84, 1261, 275, 1270, + 715, 84, 84, 906, 275, 1164, 76, 1249, 1271, 85, + 1300, 1248, 1308, 85, 1058, 85, 905, 854, 1179, 1311, + 284, 85, 593, 594, 289, 84, 646, 1145, 85, 1192, + 416, 409, 1313, 1140, 942, 1401, 1302, 1301, 1121, 84, + 1317, 84, 84, 674, 923, 1207, 1207, 1339, 320, 1326, + 864, 1007, 335, 1007, 392, 1333, 332, 1332, 333, 948, + 1353, 1156, 620, 318, 312, 1334, 1343, 728, 393, 274, + 1338, 721, 1344, 1345, 968, 389, 390, 395, 966, 394, + 965, 1351, 1352, 405, 1324, 1320, 727, 952, 388, 274, + 1395, 1497, 387, 920, 46, 84, 604, 1370, 84, 84, + 84, 274, 302, 29, 62, 1266, 1267, 396, 20, 19, + 18, 22, 17, 1399, 16, 15, 560, 33, 1285, 1286, + 1361, 1287, 1288, 24, 23, 14, 85, 13, 275, 275, + 275, 1362, 12, 1295, 1296, 11, 10, 85, 648, 9, + 1364, 8, 4, 85, 1268, 1269, 1363, 1383, 1365, 1375, + 1376, 607, 1374, 627, 626, 636, 637, 629, 630, 631, + 632, 633, 634, 635, 628, 21, 1164, 638, 1405, 708, + 969, 972, 973, 974, 970, 1414, 971, 975, 379, 84, + 1322, 1323, 2, 399, 0, 1199, 1413, 84, 0, 0, + 0, 1007, 1423, 0, 0, 0, 0, 0, 1398, 0, + 0, 0, 84, 0, 0, 0, 0, 0, 0, 84, + 0, 0, 0, 0, 0, 0, 1349, 0, 0, 0, + 0, 1441, 1445, 0, 729, 0, 0, 0, 0, 0, + 1432, 0, 1434, 0, 0, 0, 311, 0, 627, 626, + 636, 637, 629, 630, 631, 632, 633, 634, 635, 628, + 84, 84, 638, 84, 1451, 0, 1444, 0, 84, 0, + 84, 84, 84, 274, 1458, 1456, 84, 1311, 275, 0, + 1377, 0, 1464, 85, 1460, 1437, 1476, 0, 275, 275, + 85, 85, 85, 84, 274, 1470, 275, 1483, 0, 275, + 0, 1465, 275, 1466, 1468, 1469, 275, 1484, 85, 1485, + 0, 0, 0, 85, 85, 85, 275, 85, 85, 0, + 1378, 0, 1379, 1504, 1512, 0, 1491, 85, 85, 84, + 1311, 1511, 1510, 1388, 1389, 0, 0, 0, 0, 0, + 84, 84, 0, 0, 0, 1492, 0, 1526, 1525, 0, + 0, 0, 1441, 1007, 0, 0, 84, 0, 0, 0, + 0, 1164, 1407, 1408, 0, 1411, 0, 274, 1532, 0, + 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, + 0, 0, 1422, 1540, 0, 0, 0, 0, 0, 0, + 0, 1545, 349, 26, 1547, 84, 0, 0, 85, 0, + 0, 0, 0, 0, 0, 1446, 1447, 1448, 1449, 1450, + 1560, 0, 0, 1453, 1454, 1571, 0, 0, 1535, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 1549, 0, + 85, 85, 0, 1380, 1381, 0, 1382, 0, 0, 1384, + 0, 1386, 0, 0, 85, 0, 0, 0, 0, 0, + 0, 275, 0, 872, 85, 381, 0, 909, 910, 275, + 0, 915, 918, 919, 86, 87, 88, 275, 275, 1467, + 0, 275, 275, 0, 0, 275, 275, 275, 85, 0, + 0, 0, 0, 0, 0, 0, 933, 0, 0, 936, + 937, 85, 0, 0, 0, 0, 1493, 1494, 1495, 1496, + 0, 1500, 1426, 1501, 1502, 0, 0, 619, 0, 0, + 0, 0, 0, 0, 0, 0, 1507, 278, 1508, 1509, + 0, 0, 0, 1392, 0, 0, 281, 0, 0, 0, + 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, + 0, 0, 0, 311, 0, 275, 85, 1528, 85, 0, + 0, 0, 675, 0, 275, 275, 275, 275, 275, 0, + 275, 275, 729, 0, 275, 85, 729, 0, 286, 0, + 729, 0, 1537, 1564, 293, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 275, 0, 275, 275, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 279, 627, 626, 636, 637, 629, 630, 631, 632, + 633, 634, 635, 628, 1572, 1573, 638, 0, 636, 637, + 629, 630, 631, 632, 633, 634, 635, 628, 290, 282, + 638, 291, 292, 298, 0, 0, 0, 283, 285, 295, + 0, 280, 297, 296, 622, 0, 625, 0, 0, 0, + 0, 0, 639, 640, 641, 642, 643, 644, 645, 0, + 623, 624, 621, 627, 626, 636, 637, 629, 630, 631, + 632, 633, 634, 635, 628, 583, 0, 638, 0, 583, + 0, 583, 0, 0, 0, 0, 0, 583, 0, 0, + 0, 275, 1104, 1105, 0, 26, 0, 0, 0, 0, + 0, 275, 275, 275, 275, 275, 872, 0, 647, 649, + 0, 1120, 0, 275, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 346, 0, 0, 0, 0, 0, 662, + 0, 0, 85, 666, 667, 668, 669, 670, 671, 672, + 673, 0, 676, 679, 679, 679, 685, 679, 679, 685, + 679, 693, 694, 695, 696, 697, 698, 699, 83, 837, + 0, 1391, 0, 0, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 729, 1390, 0, 0, + 85, 85, 0, 853, 0, 730, 729, 729, 729, 729, + 729, 1265, 0, 0, 0, 417, 0, 0, 0, 861, + 862, 863, 0, 0, 0, 0, 0, 0, 729, 0, + 85, 627, 626, 636, 637, 629, 630, 631, 632, 633, + 634, 635, 628, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, + 627, 626, 636, 637, 629, 630, 631, 632, 633, 634, + 635, 628, 911, 912, 638, 0, 627, 626, 636, 637, + 629, 630, 631, 632, 633, 634, 635, 628, 0, 1101, + 638, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 85, 0, 0, 941, 944, 85, 85, 627, + 626, 636, 637, 629, 630, 631, 632, 633, 634, 635, + 628, 0, 0, 638, 0, 0, 0, 0, 0, 0, + 0, 85, 627, 626, 636, 637, 629, 630, 631, 632, + 633, 634, 635, 628, 0, 85, 638, 85, 85, 583, + 0, 0, 1001, 0, 0, 0, 583, 583, 583, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 583, 275, 0, 0, 0, 583, + 583, 583, 0, 583, 583, 0, 0, 0, 0, 0, + 0, 0, 0, 583, 583, 275, 0, 0, 0, 0, + 0, 85, 0, 0, 85, 85, 85, 275, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, + 417, 0, 417, 0, 0, 0, 0, 0, 417, 0, + 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, + 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, + 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1124, + 0, 0, 0, 730, 0, 0, 0, 730, 0, 0, + 0, 730, 0, 718, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 417, 0, 85, 85, 0, 85, + 750, 0, 0, 0, 85, 0, 85, 85, 85, 275, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, - 1352, 0, 1400, 1383, 1384, 1448, 1385, 0, 0, 1387, - 0, 1389, 0, 1435, 53, 1437, 0, 1444, 312, 0, - 0, 0, 0, 0, 0, 384, 1418, 0, 0, 1419, - 0, 1440, 1421, 85, 85, 0, 85, 0, 0, 1447, - 1454, 85, 1313, 85, 85, 85, 275, 1463, 86, 85, - 276, 276, 276, 1469, 1380, 1470, 1472, 1473, 1468, 86, - 1461, 0, 1459, 0, 1474, 86, 85, 275, 1480, 649, - 1429, 0, 1487, 0, 0, 0, 0, 0, 1495, 1488, - 0, 1489, 627, 637, 638, 630, 631, 632, 633, 634, - 635, 636, 629, 0, 0, 639, 1313, 1508, 1517, 0, - 1509, 0, 0, 85, 0, 1516, 1515, 0, 1458, 312, - 0, 0, 702, 0, 85, 85, 0, 0, 0, 0, - 0, 0, 1530, 0, 0, 1531, 0, 0, 0, 0, - 0, 85, 0, 0, 1169, 1537, 0, 0, 0, 1444, - 1016, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 85, 0, 0, 0, 0, 736, 0, 0, 1546, 0, - 0, 0, 0, 0, 0, 0, 0, 1496, 0, 1551, - 1553, 85, 0, 0, 0, 0, 0, 1449, 1450, 1451, - 1452, 1453, 0, 1555, 1566, 1456, 1457, 0, 0, 0, - 276, 1577, 0, 0, 0, 86, 0, 0, 0, 0, - 276, 276, 86, 86, 86, 0, 0, 0, 276, 0, - 0, 276, 0, 0, 276, 0, 0, 0, 276, 0, - 86, 0, 0, 0, 0, 86, 86, 86, 276, 86, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 86, - 86, 0, 1541, 0, 584, 0, 0, 0, 584, 0, - 584, 0, 0, 0, 0, 785, 584, 0, 0, 0, - 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, - 0, 623, 0, 626, 0, 0, 0, 648, 650, 640, - 641, 642, 643, 644, 645, 646, 0, 624, 625, 622, - 628, 627, 637, 638, 630, 631, 632, 633, 634, 635, - 636, 629, 0, 0, 639, 0, 0, 0, 663, 1401, - 86, 667, 668, 669, 670, 671, 672, 673, 674, 675, - 0, 678, 681, 681, 681, 687, 681, 681, 687, 681, - 695, 696, 697, 698, 699, 700, 701, 0, 773, 0, - 0, 0, 0, 86, 86, 53, 0, 0, 1570, 628, - 627, 637, 638, 630, 631, 632, 633, 634, 635, 636, - 629, 0, 86, 639, 737, 0, 0, 0, 1395, 276, - 0, 0, 86, 0, 879, 0, 0, 276, 0, 786, - 0, 0, 0, 0, 0, 276, 276, 0, 0, 276, - 276, 0, 0, 276, 276, 276, 86, 0, 0, 914, - 915, 0, 799, 802, 803, 804, 805, 806, 807, 86, - 808, 809, 810, 811, 812, 787, 788, 789, 790, 771, - 772, 800, 0, 774, 0, 775, 776, 777, 778, 779, - 780, 781, 782, 783, 784, 791, 792, 793, 794, 795, - 796, 797, 798, 0, 0, 0, 955, 628, 627, 637, - 638, 630, 631, 632, 633, 634, 635, 636, 629, 0, - 0, 639, 0, 276, 86, 0, 86, 0, 0, 0, - 0, 0, 276, 276, 276, 276, 276, 1394, 276, 276, - 0, 0, 276, 86, 0, 0, 0, 0, 0, 736, - 0, 0, 1393, 736, 801, 0, 0, 736, 1270, 276, - 0, 0, 0, 0, 276, 0, 276, 276, 584, 0, - 0, 276, 0, 0, 0, 584, 584, 584, 628, 627, - 637, 638, 630, 631, 632, 633, 634, 635, 636, 629, - 0, 0, 639, 584, 0, 0, 0, 0, 584, 584, - 584, 0, 584, 584, 0, 0, 0, 0, 0, 0, - 0, 0, 584, 584, 347, 0, 628, 627, 637, 638, - 630, 631, 632, 633, 634, 635, 636, 629, 0, 0, - 639, 628, 627, 637, 638, 630, 631, 632, 633, 634, - 635, 636, 629, 0, 0, 639, 0, 0, 0, 84, - 628, 627, 637, 638, 630, 631, 632, 633, 634, 635, - 636, 629, 0, 0, 639, 0, 0, 0, 0, 0, - 276, 53, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 276, 276, 276, 276, 0, 0, 418, 667, 0, - 0, 0, 276, 879, 0, 276, 0, 1111, 0, 276, - 0, 1112, 0, 276, 0, 0, 0, 0, 0, 0, - 1117, 1118, 1119, 0, 0, 0, 0, 1125, 0, 0, - 1128, 1129, 86, 1110, 0, 0, 0, 0, 1135, 0, - 0, 0, 1137, 0, 0, 1140, 1141, 1142, 1143, 1144, - 0, 0, 0, 628, 627, 637, 638, 630, 631, 632, - 633, 634, 635, 636, 629, 0, 0, 639, 987, 0, - 0, 0, 737, 0, 0, 0, 737, 0, 0, 0, - 86, 86, 0, 0, 736, 0, 0, 0, 0, 0, - 1184, 0, 0, 0, 736, 736, 736, 736, 736, 637, - 638, 630, 631, 632, 633, 634, 635, 636, 629, 736, - 86, 639, 0, 0, 0, 0, 0, 736, 27, 28, - 54, 30, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 58, 0, 0, - 0, 0, 32, 49, 50, 0, 52, 584, 0, 584, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 584, 0, 276, 59, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 0, 0, 86, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86, 418, 0, - 0, 0, 418, 0, 418, 0, 0, 1273, 1274, 0, - 418, 86, 0, 86, 86, 0, 0, 606, 0, 0, - 0, 0, 0, 0, 34, 35, 37, 36, 39, 0, - 51, 0, 1115, 0, 0, 0, 0, 0, 0, 0, - 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 40, 57, 56, 0, 0, 47, 48, - 38, 276, 0, 0, 0, 0, 0, 86, 0, 0, - 86, 86, 86, 276, 42, 43, 0, 44, 45, 0, - 0, 0, 0, 737, 0, 0, 0, 0, 0, 1165, - 1166, 0, 0, 737, 737, 737, 737, 737, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 987, 0, - 1189, 0, 0, 0, 0, 725, 737, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, - 0, 0, 757, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, - 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 1381, - 0, 1382, 86, 0, 0, 0, 0, 0, 0, 86, - 0, 0, 1391, 1392, 584, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1409, 1410, - 1411, 0, 1414, 584, 0, 0, 0, 0, 0, 0, - 86, 86, 0, 86, 0, 0, 0, 0, 86, 1425, - 86, 86, 86, 276, 0, 0, 86, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 276, 0, 0, 0, 0, 0, - 0, 0, 418, 0, 0, 0, 0, 0, 0, 418, - 418, 418, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1314, 0, 53, 418, 0, 0, - 86, 0, 418, 418, 418, 0, 418, 418, 0, 0, - 0, 86, 86, 0, 0, 0, 418, 418, 0, 0, - 0, 0, 0, 0, 0, 0, 1471, 0, 86, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, - 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, - 0, 0, 0, 1497, 1498, 1499, 1500, 0, 1504, 0, - 1505, 1506, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 0, 0, 0, 1512, 0, 1513, 1514, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 906, 0, 418, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 935, 0, 1533, 0, 0, 0, 0, - 0, 0, 0, 1538, 0, 0, 0, 0, 0, 0, - 939, 940, 0, 0, 0, 1397, 0, 0, 0, 0, - 0, 1543, 0, 0, 0, 0, 0, 0, 0, 957, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 725, - 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1422, 1423, 1424, 0, 0, 0, 0, - 0, 0, 0, 418, 1578, 1579, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, - 0, 0, 0, 0, 0, 584, 0, 0, 348, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 1314, - 300, 418, 1464, 418, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 418, 0, 0, 0, 0, 0, 0, 401, 0, 0, - 409, 0, 1492, 0, 0, 274, 0, 274, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1314, 0, 53, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 583, 0, 583, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, + 0, 583, 0, 0, 0, 0, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1564, 0, 0, 0, 0, 0, 935, 0, 0, 0, + 417, 85, 0, 0, 0, 0, 0, 417, 417, 417, + 0, 0, 0, 0, 0, 0, 0, 1106, 0, 0, + 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, + 417, 417, 417, 0, 417, 417, 0, 1292, 0, 0, + 0, 0, 0, 0, 417, 417, 0, 0, 0, 0, + 0, 1298, 1299, 944, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1304, 0, 730, 0, 0, + 0, 0, 0, 1160, 1161, 0, 0, 730, 730, 730, + 730, 730, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1184, 0, 0, 0, 347, 0, 730, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 899, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 927, 0, 0, 0, 0, 0, 273, 0, 0, 299, + 0, 0, 0, 0, 273, 0, 0, 931, 932, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, + 0, 949, 0, 0, 0, 400, 0, 583, 408, 0, + 0, 718, 0, 273, 417, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 417, 583, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1397, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 274, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1234, 418, 0, + 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, + 0, 0, 0, 1415, 0, 0, 1416, 0, 0, 1418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, + 0, 0, 0, 417, 0, 417, 0, 0, 0, 0, + 0, 1312, 0, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1455, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 418, 0, 935, 401, 0, - 1317, 1319, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 274, 274, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1319, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, - 418, 1345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, + 0, 0, 0, 273, 0, 0, 0, 0, 0, 273, + 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1394, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1369, 0, 0, 1374, 1375, 1376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1419, 1420, 1421, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 583, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, + 273, 273, 0, 0, 0, 0, 0, 1229, 417, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, + 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1488, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1312, 0, 0, 0, 0, 0, 0, 0, + 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, + 0, 927, 0, 0, 1314, 1316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 935, 0, 0, 0, - 0, 274, 274, 0, 0, 0, 0, 0, 0, 274, - 0, 0, 274, 0, 0, 274, 418, 0, 0, 839, - 0, 0, 0, 0, 1431, 0, 0, 0, 0, 274, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1316, 273, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, + 273, 0, 417, 0, 417, 1342, 0, 273, 0, 0, + 273, 0, 0, 273, 0, 0, 1558, 832, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1366, 0, + 0, 1371, 1372, 1373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1465, 1466, 0, - 1467, 0, 0, 0, 0, 1431, 0, 1431, 1431, 1431, - 0, 0, 0, 1345, 0, 0, 0, 0, 0, 0, - 0, 0, 401, 839, 0, 0, 0, 401, 401, 0, - 1431, 401, 401, 401, 0, 0, 0, 936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 401, 401, 401, 401, - 401, 0, 0, 0, 0, 0, 0, 1522, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 418, 418, - 274, 0, 0, 0, 0, 0, 839, 0, 274, 0, - 0, 0, 935, 0, 0, 1539, 274, 992, 0, 0, - 274, 274, 0, 0, 274, 1000, 839, 0, 0, 0, - 0, 0, 0, 0, 1545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 400, 832, 0, 0, 400, 400, 0, 0, 400, 400, + 400, 0, 927, 0, 928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 417, 400, 400, 400, 400, 400, 0, 0, + 1428, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 273, 0, 0, 417, 0, 0, 832, 0, + 273, 0, 417, 0, 0, 0, 0, 0, 273, 983, + 0, 0, 273, 273, 0, 0, 273, 991, 832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 274, 274, 274, 274, 0, 274, - 274, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 274, 0, 1097, 1098, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1461, 1462, 0, 1463, 0, 0, 0, + 0, 1428, 0, 1428, 1428, 1428, 0, 0, 0, 1342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1428, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 0, 0, 0, 0, 273, 273, 273, 273, 273, + 0, 273, 273, 0, 0, 273, 0, 0, 0, 0, + 0, 0, 1517, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 273, 417, 417, 0, 0, 273, 0, 1088, + 1089, 0, 0, 0, 273, 0, 0, 927, 0, 1533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 401, 401, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1428, 400, + 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 400, 273, 0, 0, 0, 0, 0, 0, 0, + 0, 928, 273, 273, 273, 273, 273, 0, 0, 0, + 0, 0, 0, 0, 1178, 0, 0, 0, 0, 0, + 983, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 401, 274, 0, 0, 0, 0, 0, 0, 0, 0, - 936, 274, 274, 274, 274, 274, 0, 0, 0, 0, - 0, 0, 0, 1183, 0, 0, 274, 0, 0, 0, - 992, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1297,29 +1258,29 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 839, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, + 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1329,1357 +1290,1388 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 992, 0, 0, 0, 0, 0, + 983, 0, 0, 0, 0, 0, 527, 515, 0, 472, + 530, 445, 462, 538, 463, 466, 503, 430, 485, 174, + 460, 273, 449, 425, 456, 426, 447, 474, 118, 478, + 444, 517, 488, 529, 146, 0, 450, 536, 148, 494, + 0, 220, 162, 0, 0, 0, 476, 519, 483, 512, + 471, 504, 435, 493, 531, 461, 501, 532, 0, 0, + 0, 86, 87, 88, 0, 1008, 1009, 0, 0, 0, + 0, 0, 108, 0, 498, 526, 458, 500, 502, 424, + 495, 928, 428, 431, 537, 522, 453, 454, 1200, 0, + 0, 0, 0, 0, 273, 475, 484, 509, 469, 0, + 0, 0, 0, 0, 0, 0, 0, 451, 0, 492, + 0, 0, 0, 432, 429, 0, 0, 0, 0, 473, + 0, 0, 0, 434, 0, 452, 510, 0, 422, 127, + 514, 521, 470, 276, 525, 468, 467, 528, 193, 0, + 224, 130, 145, 104, 142, 90, 100, 0, 129, 171, + 200, 204, 518, 448, 457, 112, 455, 202, 181, 240, + 491, 183, 201, 149, 230, 194, 239, 249, 250, 227, + 247, 254, 217, 93, 226, 238, 109, 212, 95, 236, + 223, 160, 139, 140, 94, 0, 198, 117, 125, 114, + 173, 233, 234, 113, 257, 101, 246, 97, 102, 245, + 167, 229, 237, 161, 154, 96, 235, 159, 153, 144, + 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, + 427, 0, 221, 243, 258, 106, 443, 228, 252, 253, + 0, 0, 107, 126, 120, 190, 124, 166, 103, 135, + 218, 143, 150, 197, 256, 180, 203, 110, 242, 219, + 439, 442, 437, 438, 486, 487, 533, 534, 535, 511, + 433, 0, 440, 441, 0, 516, 523, 524, 490, 89, + 98, 147, 255, 195, 123, 244, 423, 436, 116, 446, + 0, 0, 459, 464, 465, 477, 479, 480, 481, 482, + 489, 496, 497, 499, 505, 506, 507, 508, 513, 520, + 539, 91, 92, 99, 105, 111, 115, 119, 122, 128, + 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, + 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, + 182, 184, 185, 186, 187, 188, 189, 196, 199, 205, + 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, + 222, 225, 231, 232, 241, 248, 251, 527, 515, 0, + 472, 530, 445, 462, 538, 463, 466, 503, 430, 485, + 174, 460, 0, 449, 425, 456, 426, 447, 474, 118, + 478, 444, 517, 488, 529, 146, 0, 450, 536, 148, + 494, 0, 220, 162, 0, 0, 0, 476, 519, 483, + 512, 471, 504, 435, 493, 531, 461, 501, 532, 0, + 0, 0, 86, 87, 88, 0, 1008, 1009, 0, 0, + 0, 0, 0, 108, 0, 498, 526, 458, 500, 502, + 424, 495, 0, 428, 431, 537, 522, 453, 454, 0, + 0, 0, 0, 0, 0, 0, 475, 484, 509, 469, + 0, 0, 0, 0, 0, 0, 0, 0, 451, 0, + 492, 0, 0, 0, 432, 429, 0, 0, 0, 0, + 473, 0, 0, 0, 434, 0, 452, 510, 0, 422, + 127, 514, 521, 470, 276, 525, 468, 467, 528, 193, + 0, 224, 130, 145, 104, 142, 90, 100, 0, 129, + 171, 200, 204, 518, 448, 457, 112, 455, 202, 181, + 240, 491, 183, 201, 149, 230, 194, 239, 249, 250, + 227, 247, 254, 217, 93, 226, 238, 109, 212, 95, + 236, 223, 160, 139, 140, 94, 0, 198, 117, 125, + 114, 173, 233, 234, 113, 257, 101, 246, 97, 102, + 245, 167, 229, 237, 161, 154, 96, 235, 159, 153, + 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, + 0, 427, 0, 221, 243, 258, 106, 443, 228, 252, + 253, 0, 0, 107, 126, 120, 190, 124, 166, 103, + 135, 218, 143, 150, 197, 256, 180, 203, 110, 242, + 219, 439, 442, 437, 438, 486, 487, 533, 534, 535, + 511, 433, 0, 440, 441, 0, 516, 523, 524, 490, + 89, 98, 147, 255, 195, 123, 244, 423, 436, 116, + 446, 0, 0, 459, 464, 465, 477, 479, 480, 481, + 482, 489, 496, 497, 499, 505, 506, 507, 508, 513, + 520, 539, 91, 92, 99, 105, 111, 115, 119, 122, + 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, + 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, + 179, 182, 184, 185, 186, 187, 188, 189, 196, 199, + 205, 206, 207, 208, 209, 210, 211, 213, 214, 215, + 216, 222, 225, 231, 232, 241, 248, 251, 527, 515, + 0, 472, 530, 445, 462, 538, 463, 466, 503, 430, + 485, 174, 460, 0, 449, 425, 456, 426, 447, 474, + 118, 478, 444, 517, 488, 529, 146, 0, 450, 536, + 148, 494, 0, 220, 162, 0, 0, 0, 476, 519, + 483, 512, 471, 504, 435, 493, 531, 461, 501, 532, + 54, 0, 0, 86, 87, 88, 0, 0, 0, 0, + 0, 0, 0, 0, 108, 0, 498, 526, 458, 500, + 502, 424, 495, 0, 428, 431, 537, 522, 453, 454, + 0, 0, 0, 0, 0, 0, 0, 475, 484, 509, + 469, 0, 0, 0, 0, 0, 0, 0, 0, 451, + 0, 492, 0, 0, 0, 432, 429, 0, 0, 0, + 0, 473, 0, 0, 0, 434, 0, 452, 510, 0, + 422, 127, 514, 521, 470, 276, 525, 468, 467, 528, + 193, 0, 224, 130, 145, 104, 142, 90, 100, 0, + 129, 171, 200, 204, 518, 448, 457, 112, 455, 202, + 181, 240, 491, 183, 201, 149, 230, 194, 239, 249, + 250, 227, 247, 254, 217, 93, 226, 238, 109, 212, + 95, 236, 223, 160, 139, 140, 94, 0, 198, 117, + 125, 114, 173, 233, 234, 113, 257, 101, 246, 97, + 102, 245, 167, 229, 237, 161, 154, 96, 235, 159, + 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, + 165, 0, 427, 0, 221, 243, 258, 106, 443, 228, + 252, 253, 0, 0, 107, 126, 120, 190, 124, 166, + 103, 135, 218, 143, 150, 197, 256, 180, 203, 110, + 242, 219, 439, 442, 437, 438, 486, 487, 533, 534, + 535, 511, 433, 0, 440, 441, 0, 516, 523, 524, + 490, 89, 98, 147, 255, 195, 123, 244, 423, 436, + 116, 446, 0, 0, 459, 464, 465, 477, 479, 480, + 481, 482, 489, 496, 497, 499, 505, 506, 507, 508, + 513, 520, 539, 91, 92, 99, 105, 111, 115, 119, + 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, + 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, + 178, 179, 182, 184, 185, 186, 187, 188, 189, 196, + 199, 205, 206, 207, 208, 209, 210, 211, 213, 214, + 215, 216, 222, 225, 231, 232, 241, 248, 251, 527, + 515, 0, 472, 530, 445, 462, 538, 463, 466, 503, + 430, 485, 174, 460, 0, 449, 425, 456, 426, 447, + 474, 118, 478, 444, 517, 488, 529, 146, 0, 450, + 536, 148, 494, 0, 220, 162, 0, 0, 0, 476, + 519, 483, 512, 471, 504, 435, 493, 531, 461, 501, + 532, 0, 0, 0, 86, 87, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 108, 0, 498, 526, 458, + 500, 502, 424, 495, 0, 428, 431, 537, 522, 453, + 454, 0, 0, 0, 0, 0, 0, 0, 475, 484, + 509, 469, 0, 0, 0, 0, 0, 0, 1305, 0, + 451, 0, 492, 0, 0, 0, 432, 429, 0, 0, + 0, 0, 473, 0, 0, 0, 434, 0, 452, 510, + 0, 422, 127, 514, 521, 470, 276, 525, 468, 467, + 528, 193, 0, 224, 130, 145, 104, 142, 90, 100, + 0, 129, 171, 200, 204, 518, 448, 457, 112, 455, + 202, 181, 240, 491, 183, 201, 149, 230, 194, 239, + 249, 250, 227, 247, 254, 217, 93, 226, 238, 109, + 212, 95, 236, 223, 160, 139, 140, 94, 0, 198, + 117, 125, 114, 173, 233, 234, 113, 257, 101, 246, + 97, 102, 245, 167, 229, 237, 161, 154, 96, 235, + 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, + 163, 165, 0, 427, 0, 221, 243, 258, 106, 443, + 228, 252, 253, 0, 0, 107, 126, 120, 190, 124, + 166, 103, 135, 218, 143, 150, 197, 256, 180, 203, + 110, 242, 219, 439, 442, 437, 438, 486, 487, 533, + 534, 535, 511, 433, 0, 440, 441, 0, 516, 523, + 524, 490, 89, 98, 147, 255, 195, 123, 244, 423, + 436, 116, 446, 0, 0, 459, 464, 465, 477, 479, + 480, 481, 482, 489, 496, 497, 499, 505, 506, 507, + 508, 513, 520, 539, 91, 92, 99, 105, 111, 115, + 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, + 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, + 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, + 196, 199, 205, 206, 207, 208, 209, 210, 211, 213, + 214, 215, 216, 222, 225, 231, 232, 241, 248, 251, + 527, 515, 0, 472, 530, 445, 462, 538, 463, 466, + 503, 430, 485, 174, 460, 0, 449, 425, 456, 426, + 447, 474, 118, 478, 444, 517, 488, 529, 146, 0, + 450, 536, 148, 494, 0, 220, 162, 0, 0, 0, + 476, 519, 483, 512, 471, 504, 435, 493, 531, 461, + 501, 532, 0, 0, 0, 86, 87, 88, 0, 0, + 0, 0, 0, 0, 0, 0, 108, 0, 498, 526, + 458, 500, 502, 424, 495, 0, 428, 431, 537, 522, + 453, 454, 0, 0, 0, 0, 0, 0, 0, 475, + 484, 509, 469, 0, 0, 0, 0, 0, 0, 992, + 0, 451, 0, 492, 0, 0, 0, 432, 429, 0, + 0, 0, 0, 473, 0, 0, 0, 434, 0, 452, + 510, 0, 422, 127, 514, 521, 470, 276, 525, 468, + 467, 528, 193, 0, 224, 130, 145, 104, 142, 90, + 100, 0, 129, 171, 200, 204, 518, 448, 457, 112, + 455, 202, 181, 240, 491, 183, 201, 149, 230, 194, + 239, 249, 250, 227, 247, 254, 217, 93, 226, 238, + 109, 212, 95, 236, 223, 160, 139, 140, 94, 0, + 198, 117, 125, 114, 173, 233, 234, 113, 257, 101, + 246, 97, 102, 245, 167, 229, 237, 161, 154, 96, + 235, 159, 153, 144, 121, 132, 191, 151, 192, 133, + 164, 163, 165, 0, 427, 0, 221, 243, 258, 106, + 443, 228, 252, 253, 0, 0, 107, 126, 120, 190, + 124, 166, 103, 135, 218, 143, 150, 197, 256, 180, + 203, 110, 242, 219, 439, 442, 437, 438, 486, 487, + 533, 534, 535, 511, 433, 0, 440, 441, 0, 516, + 523, 524, 490, 89, 98, 147, 255, 195, 123, 244, + 423, 436, 116, 446, 0, 0, 459, 464, 465, 477, + 479, 480, 481, 482, 489, 496, 497, 499, 505, 506, + 507, 508, 513, 520, 539, 91, 92, 99, 105, 111, + 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, + 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, + 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, + 189, 196, 199, 205, 206, 207, 208, 209, 210, 211, + 213, 214, 215, 216, 222, 225, 231, 232, 241, 248, + 251, 527, 515, 0, 472, 530, 445, 462, 538, 463, + 466, 503, 430, 485, 174, 460, 0, 449, 425, 456, + 426, 447, 474, 118, 478, 444, 517, 488, 529, 146, + 0, 450, 536, 148, 494, 0, 220, 162, 0, 0, + 0, 476, 519, 483, 512, 471, 504, 435, 493, 531, + 461, 501, 532, 0, 0, 0, 86, 87, 88, 0, + 0, 0, 0, 0, 0, 0, 0, 108, 0, 498, + 526, 458, 500, 502, 424, 495, 0, 428, 431, 537, + 522, 453, 454, 0, 0, 0, 0, 0, 0, 0, + 475, 484, 509, 469, 0, 0, 0, 0, 0, 0, + 958, 0, 451, 0, 492, 0, 0, 0, 432, 429, + 0, 0, 0, 0, 473, 0, 0, 0, 434, 0, + 452, 510, 0, 422, 127, 514, 521, 470, 276, 525, + 468, 467, 528, 193, 0, 224, 130, 145, 104, 142, + 90, 100, 0, 129, 171, 200, 204, 518, 448, 457, + 112, 455, 202, 181, 240, 491, 183, 201, 149, 230, + 194, 239, 249, 250, 227, 247, 254, 217, 93, 226, + 238, 109, 212, 95, 236, 223, 160, 139, 140, 94, + 0, 198, 117, 125, 114, 173, 233, 234, 113, 257, + 101, 246, 97, 102, 245, 167, 229, 237, 161, 154, + 96, 235, 159, 153, 144, 121, 132, 191, 151, 192, + 133, 164, 163, 165, 0, 427, 0, 221, 243, 258, + 106, 443, 228, 252, 253, 0, 0, 107, 126, 120, + 190, 124, 166, 103, 135, 218, 143, 150, 197, 256, + 180, 203, 110, 242, 219, 439, 442, 437, 438, 486, + 487, 533, 534, 535, 511, 433, 0, 440, 441, 0, + 516, 523, 524, 490, 89, 98, 147, 255, 195, 123, + 244, 423, 436, 116, 446, 0, 0, 459, 464, 465, + 477, 479, 480, 481, 482, 489, 496, 497, 499, 505, + 506, 507, 508, 513, 520, 539, 91, 92, 99, 105, + 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, + 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, + 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, + 188, 189, 196, 199, 205, 206, 207, 208, 209, 210, + 211, 213, 214, 215, 216, 222, 225, 231, 232, 241, + 248, 251, 527, 515, 0, 472, 530, 445, 462, 538, + 463, 466, 503, 430, 485, 174, 460, 0, 449, 425, + 456, 426, 447, 474, 118, 478, 444, 517, 488, 529, + 146, 0, 450, 536, 148, 494, 0, 220, 162, 0, + 0, 0, 476, 519, 483, 512, 471, 504, 435, 493, + 531, 461, 501, 532, 0, 0, 0, 86, 87, 88, + 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, + 498, 526, 458, 500, 502, 424, 495, 0, 428, 431, + 537, 522, 453, 454, 0, 0, 0, 0, 0, 0, + 0, 475, 484, 509, 469, 0, 0, 0, 0, 0, + 0, 0, 0, 451, 0, 492, 0, 0, 0, 432, + 429, 0, 0, 0, 0, 473, 0, 0, 0, 434, + 0, 452, 510, 0, 422, 127, 514, 521, 470, 276, + 525, 468, 467, 528, 193, 0, 224, 130, 145, 104, + 142, 90, 100, 0, 129, 171, 200, 204, 518, 448, + 457, 112, 455, 202, 181, 240, 491, 183, 201, 149, + 230, 194, 239, 249, 250, 227, 247, 254, 217, 93, + 226, 238, 109, 212, 95, 236, 223, 160, 139, 140, + 94, 0, 198, 117, 125, 114, 173, 233, 234, 113, + 257, 101, 246, 97, 102, 245, 167, 229, 237, 161, + 154, 96, 235, 159, 153, 144, 121, 132, 191, 151, + 192, 133, 164, 163, 165, 0, 427, 0, 221, 243, + 258, 106, 443, 228, 252, 253, 0, 0, 107, 126, + 120, 190, 124, 166, 103, 135, 218, 143, 150, 197, + 256, 180, 203, 110, 242, 219, 439, 442, 437, 438, + 486, 487, 533, 534, 535, 511, 433, 0, 440, 441, + 0, 516, 523, 524, 490, 89, 98, 147, 255, 195, + 123, 244, 423, 436, 116, 446, 0, 0, 459, 464, + 465, 477, 479, 480, 481, 482, 489, 496, 497, 499, + 505, 506, 507, 508, 513, 520, 539, 91, 92, 99, + 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, + 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, + 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, + 187, 188, 189, 196, 199, 205, 206, 207, 208, 209, + 210, 211, 213, 214, 215, 216, 222, 225, 231, 232, + 241, 248, 251, 527, 515, 0, 472, 530, 445, 462, + 538, 463, 466, 503, 430, 485, 174, 460, 0, 449, + 425, 456, 426, 447, 474, 118, 478, 444, 517, 488, + 529, 146, 0, 450, 536, 148, 494, 0, 220, 162, + 0, 0, 0, 476, 519, 483, 512, 471, 504, 435, + 493, 531, 461, 501, 532, 0, 0, 0, 86, 87, + 88, 0, 0, 0, 0, 0, 0, 0, 0, 108, + 0, 498, 526, 458, 500, 502, 424, 495, 0, 428, + 431, 537, 522, 453, 454, 0, 0, 0, 0, 0, + 0, 0, 475, 484, 509, 469, 0, 0, 0, 0, + 0, 0, 0, 0, 451, 0, 492, 0, 0, 0, + 432, 429, 0, 0, 0, 0, 473, 0, 0, 0, + 434, 0, 452, 510, 0, 422, 127, 514, 521, 470, + 276, 525, 468, 467, 528, 193, 0, 224, 130, 145, + 104, 142, 90, 100, 0, 129, 171, 200, 204, 518, + 448, 457, 112, 455, 202, 181, 240, 491, 183, 201, + 149, 230, 194, 239, 249, 250, 227, 247, 254, 217, + 93, 226, 238, 109, 212, 95, 236, 223, 160, 139, + 140, 94, 0, 198, 117, 125, 114, 173, 233, 234, + 113, 257, 101, 246, 97, 420, 245, 167, 229, 237, + 161, 154, 96, 235, 159, 153, 144, 121, 132, 191, + 151, 192, 133, 164, 163, 165, 0, 427, 0, 221, + 243, 258, 106, 443, 228, 252, 253, 0, 0, 107, + 126, 120, 190, 124, 421, 419, 135, 218, 143, 150, + 197, 256, 180, 203, 110, 242, 219, 439, 442, 437, + 438, 486, 487, 533, 534, 535, 511, 433, 0, 440, + 441, 0, 516, 523, 524, 490, 89, 98, 147, 255, + 195, 123, 244, 423, 436, 116, 446, 0, 0, 459, + 464, 465, 477, 479, 480, 481, 482, 489, 496, 497, + 499, 505, 506, 507, 508, 513, 520, 539, 91, 92, + 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, + 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, + 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, + 186, 187, 188, 189, 196, 199, 205, 206, 207, 208, + 209, 210, 211, 213, 214, 215, 216, 222, 225, 231, + 232, 241, 248, 251, 527, 515, 0, 472, 530, 445, + 462, 538, 463, 466, 503, 430, 485, 174, 460, 0, + 449, 425, 456, 426, 447, 474, 118, 478, 444, 517, + 488, 529, 146, 0, 450, 536, 148, 494, 0, 220, + 162, 0, 0, 0, 476, 519, 483, 512, 471, 504, + 435, 493, 531, 461, 501, 532, 0, 0, 0, 86, + 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 0, 498, 526, 458, 500, 502, 424, 495, 0, + 428, 431, 537, 522, 453, 454, 0, 0, 0, 0, + 0, 0, 0, 475, 484, 509, 469, 0, 0, 0, + 0, 0, 0, 0, 0, 451, 0, 492, 0, 0, + 0, 432, 429, 0, 0, 0, 0, 473, 0, 0, + 0, 434, 0, 452, 510, 0, 422, 127, 514, 521, + 470, 276, 525, 468, 467, 528, 193, 0, 224, 130, + 145, 104, 142, 90, 100, 0, 129, 171, 200, 204, + 518, 448, 457, 112, 455, 202, 181, 240, 491, 183, + 201, 149, 230, 194, 239, 249, 250, 227, 247, 254, + 217, 93, 226, 742, 109, 212, 95, 236, 223, 160, + 139, 140, 94, 0, 198, 117, 125, 114, 173, 233, + 234, 113, 257, 101, 246, 97, 420, 245, 167, 229, + 237, 161, 154, 96, 235, 159, 153, 144, 121, 132, + 191, 151, 192, 133, 164, 163, 165, 0, 427, 0, + 221, 243, 258, 106, 443, 228, 252, 253, 0, 0, + 107, 126, 120, 190, 124, 421, 419, 135, 218, 143, + 150, 197, 256, 180, 203, 110, 242, 219, 439, 442, + 437, 438, 486, 487, 533, 534, 535, 511, 433, 0, + 440, 441, 0, 516, 523, 524, 490, 89, 98, 147, + 255, 195, 123, 244, 423, 436, 116, 446, 0, 0, + 459, 464, 465, 477, 479, 480, 481, 482, 489, 496, + 497, 499, 505, 506, 507, 508, 513, 520, 539, 91, + 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, + 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, + 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, + 185, 186, 187, 188, 189, 196, 199, 205, 206, 207, + 208, 209, 210, 211, 213, 214, 215, 216, 222, 225, + 231, 232, 241, 248, 251, 527, 515, 0, 472, 530, + 445, 462, 538, 463, 466, 503, 430, 485, 174, 460, + 0, 449, 425, 456, 426, 447, 474, 118, 478, 444, + 517, 488, 529, 146, 0, 450, 536, 148, 494, 0, + 220, 162, 0, 0, 0, 476, 519, 483, 512, 471, + 504, 435, 493, 531, 461, 501, 532, 0, 0, 0, + 86, 87, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 108, 0, 498, 526, 458, 500, 502, 424, 495, + 0, 428, 431, 537, 522, 453, 454, 0, 0, 0, + 0, 0, 0, 0, 475, 484, 509, 469, 0, 0, + 0, 0, 0, 0, 0, 0, 451, 0, 492, 0, + 0, 0, 432, 429, 0, 0, 0, 0, 473, 0, + 0, 0, 434, 0, 452, 510, 0, 422, 127, 514, + 521, 470, 276, 525, 468, 467, 528, 193, 0, 224, + 130, 145, 104, 142, 90, 100, 0, 129, 171, 200, + 204, 518, 448, 457, 112, 455, 202, 181, 240, 491, + 183, 201, 149, 230, 194, 239, 249, 250, 227, 247, + 254, 217, 93, 226, 411, 109, 212, 95, 236, 223, + 160, 139, 140, 94, 0, 198, 117, 125, 114, 173, + 233, 234, 113, 257, 101, 246, 97, 420, 245, 167, + 229, 237, 161, 154, 96, 235, 159, 153, 144, 121, + 132, 191, 151, 192, 133, 164, 163, 165, 0, 427, + 0, 221, 243, 258, 106, 443, 228, 252, 253, 0, + 0, 107, 126, 120, 190, 124, 421, 419, 414, 413, + 143, 150, 197, 256, 180, 203, 110, 242, 219, 439, + 442, 437, 438, 486, 487, 533, 534, 535, 511, 433, + 0, 440, 441, 0, 516, 523, 524, 490, 89, 98, + 147, 255, 195, 123, 244, 423, 436, 116, 446, 0, + 0, 459, 464, 465, 477, 479, 480, 481, 482, 489, + 496, 497, 499, 505, 506, 507, 508, 513, 520, 539, + 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, + 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, + 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, + 184, 185, 186, 187, 188, 189, 196, 199, 205, 206, + 207, 208, 209, 210, 211, 213, 214, 215, 216, 222, + 225, 231, 232, 241, 248, 251, 174, 0, 0, 901, + 0, 316, 0, 0, 0, 118, 0, 315, 0, 0, + 0, 146, 0, 902, 359, 148, 0, 0, 220, 162, + 0, 0, 0, 0, 0, 350, 351, 0, 0, 0, + 0, 0, 0, 0, 0, 54, 0, 0, 86, 87, + 88, 337, 336, 339, 340, 341, 342, 0, 0, 108, + 338, 343, 344, 345, 0, 0, 0, 313, 330, 0, + 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 327, 328, 398, 0, 0, 0, 373, 0, 329, 0, + 0, 322, 323, 325, 324, 326, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 372, 0, 0, + 276, 0, 0, 370, 0, 193, 0, 224, 130, 145, + 104, 142, 90, 100, 0, 129, 171, 200, 204, 0, + 0, 0, 112, 0, 202, 181, 240, 0, 183, 201, + 149, 230, 194, 239, 249, 250, 227, 247, 254, 217, + 93, 226, 238, 109, 212, 95, 236, 223, 160, 139, + 140, 94, 0, 198, 117, 125, 114, 173, 233, 234, + 113, 257, 101, 246, 97, 102, 245, 167, 229, 237, + 161, 154, 96, 235, 159, 153, 144, 121, 132, 191, + 151, 192, 133, 164, 163, 165, 0, 0, 0, 221, + 243, 258, 106, 0, 228, 252, 253, 0, 0, 107, + 126, 120, 190, 124, 166, 103, 135, 218, 143, 150, + 197, 256, 180, 203, 110, 242, 219, 360, 371, 366, + 367, 364, 365, 363, 362, 361, 374, 352, 353, 354, + 355, 357, 0, 368, 369, 356, 89, 98, 147, 255, + 195, 123, 244, 0, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, + 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, + 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, + 186, 187, 188, 189, 196, 199, 205, 206, 207, 208, + 209, 210, 211, 213, 214, 215, 216, 222, 225, 231, + 232, 241, 248, 251, 174, 0, 0, 0, 0, 316, + 0, 0, 0, 118, 0, 315, 0, 0, 0, 146, + 0, 0, 359, 148, 0, 0, 220, 162, 0, 0, + 0, 0, 0, 350, 351, 0, 0, 0, 0, 0, + 0, 999, 0, 54, 0, 0, 86, 87, 88, 337, + 336, 339, 340, 341, 342, 0, 0, 108, 338, 343, + 344, 345, 1000, 0, 0, 313, 330, 0, 358, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, + 0, 0, 0, 0, 373, 0, 329, 0, 0, 322, + 323, 325, 324, 326, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 372, 0, 0, 276, 0, + 0, 370, 0, 193, 0, 224, 130, 145, 104, 142, + 90, 100, 0, 129, 171, 200, 204, 0, 0, 0, + 112, 0, 202, 181, 240, 0, 183, 201, 149, 230, + 194, 239, 249, 250, 227, 247, 254, 217, 93, 226, + 238, 109, 212, 95, 236, 223, 160, 139, 140, 94, + 0, 198, 117, 125, 114, 173, 233, 234, 113, 257, + 101, 246, 97, 102, 245, 167, 229, 237, 161, 154, + 96, 235, 159, 153, 144, 121, 132, 191, 151, 192, + 133, 164, 163, 165, 0, 0, 0, 221, 243, 258, + 106, 0, 228, 252, 253, 0, 0, 107, 126, 120, + 190, 124, 166, 103, 135, 218, 143, 150, 197, 256, + 180, 203, 110, 242, 219, 360, 371, 366, 367, 364, + 365, 363, 362, 361, 374, 352, 353, 354, 355, 357, + 0, 368, 369, 356, 89, 98, 147, 255, 195, 123, + 244, 0, 0, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 99, 105, + 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, + 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, + 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, + 188, 189, 196, 199, 205, 206, 207, 208, 209, 210, + 211, 213, 214, 215, 216, 222, 225, 231, 232, 241, + 248, 251, 174, 0, 0, 0, 0, 316, 0, 0, + 0, 118, 0, 315, 0, 0, 0, 146, 0, 0, + 359, 148, 0, 0, 220, 162, 0, 0, 0, 0, + 0, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 0, 386, 86, 87, 88, 337, 336, 339, + 340, 341, 342, 0, 0, 108, 338, 343, 344, 345, + 0, 0, 0, 313, 330, 0, 358, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 327, 328, 0, 0, + 0, 0, 373, 0, 329, 0, 0, 322, 323, 325, + 324, 326, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 372, 0, 0, 276, 0, 0, 370, + 0, 193, 0, 224, 130, 145, 104, 142, 90, 100, + 0, 129, 171, 200, 204, 0, 0, 0, 112, 0, + 202, 181, 240, 0, 183, 201, 149, 230, 194, 239, + 249, 250, 227, 247, 254, 217, 93, 226, 238, 109, + 212, 95, 236, 223, 160, 139, 140, 94, 0, 198, + 117, 125, 114, 173, 233, 234, 113, 257, 101, 246, + 97, 102, 245, 167, 229, 237, 161, 154, 96, 235, + 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, + 163, 165, 0, 0, 0, 221, 243, 258, 106, 0, + 228, 252, 253, 0, 0, 107, 126, 120, 190, 124, + 166, 103, 135, 218, 143, 150, 197, 256, 180, 203, + 110, 242, 219, 360, 371, 366, 367, 364, 365, 363, + 362, 361, 374, 352, 353, 354, 355, 357, 0, 368, + 369, 356, 89, 98, 147, 255, 195, 123, 244, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 99, 105, 111, 115, + 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, + 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, + 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, + 196, 199, 205, 206, 207, 208, 209, 210, 211, 213, + 214, 215, 216, 222, 225, 231, 232, 241, 248, 251, + 174, 0, 0, 0, 0, 316, 0, 0, 0, 118, + 0, 315, 0, 0, 0, 146, 0, 0, 359, 148, + 0, 0, 220, 162, 0, 0, 0, 0, 0, 350, + 351, 0, 0, 0, 0, 0, 0, 0, 0, 54, + 0, 0, 86, 87, 88, 337, 336, 339, 340, 341, + 342, 0, 0, 108, 338, 343, 344, 345, 0, 0, + 0, 313, 330, 0, 358, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 327, 328, 398, 0, 0, 0, + 373, 0, 329, 0, 0, 322, 323, 325, 324, 326, + 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 372, 0, 0, 276, 0, 0, 370, 0, 193, + 0, 224, 130, 145, 104, 142, 90, 100, 0, 129, + 171, 200, 204, 0, 0, 0, 112, 0, 202, 181, + 240, 0, 183, 201, 149, 230, 194, 239, 249, 250, + 227, 247, 254, 217, 93, 226, 238, 109, 212, 95, + 236, 223, 160, 139, 140, 94, 0, 198, 117, 125, + 114, 173, 233, 234, 113, 257, 101, 246, 97, 102, + 245, 167, 229, 237, 161, 154, 96, 235, 159, 153, + 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, + 0, 0, 0, 221, 243, 258, 106, 0, 228, 252, + 253, 0, 0, 107, 126, 120, 190, 124, 166, 103, + 135, 218, 143, 150, 197, 256, 180, 203, 110, 242, + 219, 360, 371, 366, 367, 364, 365, 363, 362, 361, + 374, 352, 353, 354, 355, 357, 0, 368, 369, 356, + 89, 98, 147, 255, 195, 123, 244, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 91, 92, 99, 105, 111, 115, 119, 122, + 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, + 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, + 179, 182, 184, 185, 186, 187, 188, 189, 196, 199, + 205, 206, 207, 208, 209, 210, 211, 213, 214, 215, + 216, 222, 225, 231, 232, 241, 248, 251, 174, 0, + 0, 0, 0, 316, 0, 0, 0, 118, 0, 315, + 0, 0, 0, 146, 0, 0, 359, 148, 0, 0, + 220, 162, 0, 0, 0, 0, 0, 350, 351, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, + 86, 87, 88, 337, 917, 339, 340, 341, 342, 0, + 0, 108, 338, 343, 344, 345, 0, 0, 0, 313, + 330, 0, 358, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 327, 328, 398, 0, 0, 0, 373, 0, + 329, 0, 0, 322, 323, 325, 324, 326, 331, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 127, 372, + 0, 0, 276, 0, 0, 370, 0, 193, 0, 224, + 130, 145, 104, 142, 90, 100, 0, 129, 171, 200, + 204, 0, 0, 0, 112, 0, 202, 181, 240, 0, + 183, 201, 149, 230, 194, 239, 249, 250, 227, 247, + 254, 217, 93, 226, 238, 109, 212, 95, 236, 223, + 160, 139, 140, 94, 0, 198, 117, 125, 114, 173, + 233, 234, 113, 257, 101, 246, 97, 102, 245, 167, + 229, 237, 161, 154, 96, 235, 159, 153, 144, 121, + 132, 191, 151, 192, 133, 164, 163, 165, 0, 0, + 0, 221, 243, 258, 106, 0, 228, 252, 253, 0, + 0, 107, 126, 120, 190, 124, 166, 103, 135, 218, + 143, 150, 197, 256, 180, 203, 110, 242, 219, 360, + 371, 366, 367, 364, 365, 363, 362, 361, 374, 352, + 353, 354, 355, 357, 0, 368, 369, 356, 89, 98, + 147, 255, 195, 123, 244, 0, 0, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, + 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, + 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, + 184, 185, 186, 187, 188, 189, 196, 199, 205, 206, + 207, 208, 209, 210, 211, 213, 214, 215, 216, 222, + 225, 231, 232, 241, 248, 251, 174, 0, 0, 0, + 0, 316, 0, 0, 0, 118, 0, 315, 0, 0, + 0, 146, 0, 0, 359, 148, 0, 0, 220, 162, + 0, 0, 0, 0, 0, 350, 351, 0, 0, 0, + 0, 0, 0, 0, 0, 54, 0, 0, 86, 87, + 88, 337, 914, 339, 340, 341, 342, 0, 0, 108, + 338, 343, 344, 345, 0, 0, 0, 313, 330, 0, + 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 327, 328, 398, 0, 0, 0, 373, 0, 329, 0, + 0, 322, 323, 325, 324, 326, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 372, 0, 0, + 276, 0, 0, 370, 0, 193, 0, 224, 130, 145, + 104, 142, 90, 100, 0, 129, 171, 200, 204, 0, + 0, 0, 112, 0, 202, 181, 240, 0, 183, 201, + 149, 230, 194, 239, 249, 250, 227, 247, 254, 217, + 93, 226, 238, 109, 212, 95, 236, 223, 160, 139, + 140, 94, 0, 198, 117, 125, 114, 173, 233, 234, + 113, 257, 101, 246, 97, 102, 245, 167, 229, 237, + 161, 154, 96, 235, 159, 153, 144, 121, 132, 191, + 151, 192, 133, 164, 163, 165, 0, 0, 0, 221, + 243, 258, 106, 0, 228, 252, 253, 0, 0, 107, + 126, 120, 190, 124, 166, 103, 135, 218, 143, 150, + 197, 256, 180, 203, 110, 242, 219, 360, 371, 366, + 367, 364, 365, 363, 362, 361, 374, 352, 353, 354, + 355, 357, 0, 368, 369, 356, 89, 98, 147, 255, + 195, 123, 244, 0, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, + 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, + 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, + 186, 187, 188, 189, 196, 199, 205, 206, 207, 208, + 209, 210, 211, 213, 214, 215, 216, 222, 225, 231, + 232, 241, 248, 251, 382, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, + 0, 316, 0, 0, 0, 118, 0, 315, 0, 0, + 0, 146, 0, 0, 359, 148, 0, 0, 220, 162, + 0, 0, 0, 0, 0, 350, 351, 0, 0, 0, + 0, 0, 0, 0, 0, 54, 0, 0, 86, 87, + 88, 337, 336, 339, 340, 341, 342, 0, 0, 108, + 338, 343, 344, 345, 0, 0, 0, 313, 330, 0, + 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 327, 328, 0, 0, 0, 0, 373, 0, 329, 0, + 0, 322, 323, 325, 324, 326, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 372, 0, 0, + 276, 0, 0, 370, 0, 193, 0, 224, 130, 145, + 104, 142, 90, 100, 0, 129, 171, 200, 204, 0, + 0, 0, 112, 0, 202, 181, 240, 0, 183, 201, + 149, 230, 194, 239, 249, 250, 227, 247, 254, 217, + 93, 226, 238, 109, 212, 95, 236, 223, 160, 139, + 140, 94, 0, 198, 117, 125, 114, 173, 233, 234, + 113, 257, 101, 246, 97, 102, 245, 167, 229, 237, + 161, 154, 96, 235, 159, 153, 144, 121, 132, 191, + 151, 192, 133, 164, 163, 165, 0, 0, 0, 221, + 243, 258, 106, 0, 228, 252, 253, 0, 0, 107, + 126, 120, 190, 124, 166, 103, 135, 218, 143, 150, + 197, 256, 180, 203, 110, 242, 219, 360, 371, 366, + 367, 364, 365, 363, 362, 361, 374, 352, 353, 354, + 355, 357, 0, 368, 369, 356, 89, 98, 147, 255, + 195, 123, 244, 0, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, + 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, + 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, + 186, 187, 188, 189, 196, 199, 205, 206, 207, 208, + 209, 210, 211, 213, 214, 215, 216, 222, 225, 231, + 232, 241, 248, 251, 174, 0, 0, 0, 0, 316, + 0, 0, 0, 118, 0, 315, 0, 0, 0, 146, + 0, 0, 359, 148, 0, 0, 220, 162, 0, 0, + 0, 0, 0, 350, 351, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 0, 0, 86, 87, 88, 337, + 336, 339, 340, 341, 342, 0, 0, 108, 338, 343, + 344, 345, 0, 0, 0, 313, 330, 0, 358, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, + 0, 0, 0, 0, 373, 0, 329, 0, 0, 322, + 323, 325, 324, 326, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 372, 0, 0, 276, 0, + 0, 370, 0, 193, 0, 224, 130, 145, 104, 142, + 90, 100, 0, 129, 171, 200, 204, 0, 0, 0, + 112, 0, 202, 181, 240, 0, 183, 201, 149, 230, + 194, 239, 249, 250, 227, 247, 254, 217, 93, 226, + 238, 109, 212, 95, 236, 223, 160, 139, 140, 94, + 0, 198, 117, 125, 114, 173, 233, 234, 113, 257, + 101, 246, 97, 102, 245, 167, 229, 237, 161, 154, + 96, 235, 159, 153, 144, 121, 132, 191, 151, 192, + 133, 164, 163, 165, 0, 0, 0, 221, 243, 258, + 106, 0, 228, 252, 253, 0, 0, 107, 126, 120, + 190, 124, 166, 103, 135, 218, 143, 150, 197, 256, + 180, 203, 110, 242, 219, 360, 371, 366, 367, 364, + 365, 363, 362, 361, 374, 352, 353, 354, 355, 357, + 0, 368, 369, 356, 89, 98, 147, 255, 195, 123, + 244, 0, 0, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 99, 105, + 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, + 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, + 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, + 188, 189, 196, 199, 205, 206, 207, 208, 209, 210, + 211, 213, 214, 215, 216, 222, 225, 231, 232, 241, + 248, 251, 174, 0, 0, 0, 0, 0, 0, 0, + 0, 118, 0, 0, 0, 0, 0, 146, 0, 0, + 359, 148, 0, 0, 220, 162, 0, 0, 0, 0, + 0, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 0, 0, 86, 87, 88, 337, 336, 339, + 340, 341, 342, 0, 0, 108, 338, 343, 344, 345, + 0, 0, 0, 0, 330, 0, 358, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 327, 328, 0, 0, + 0, 0, 373, 0, 329, 0, 0, 322, 323, 325, + 324, 326, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 372, 0, 0, 276, 0, 0, 370, + 0, 193, 0, 224, 130, 145, 104, 142, 90, 100, + 0, 129, 171, 200, 204, 0, 0, 0, 112, 0, + 202, 181, 240, 1565, 183, 201, 149, 230, 194, 239, + 249, 250, 227, 247, 254, 217, 93, 226, 238, 109, + 212, 95, 236, 223, 160, 139, 140, 94, 0, 198, + 117, 125, 114, 173, 233, 234, 113, 257, 101, 246, + 97, 102, 245, 167, 229, 237, 161, 154, 96, 235, + 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, + 163, 165, 0, 0, 0, 221, 243, 258, 106, 0, + 228, 252, 253, 0, 0, 107, 126, 120, 190, 124, + 166, 103, 135, 218, 143, 150, 197, 256, 180, 203, + 110, 242, 219, 360, 371, 366, 367, 364, 365, 363, + 362, 361, 374, 352, 353, 354, 355, 357, 0, 368, + 369, 356, 89, 98, 147, 255, 195, 123, 244, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 99, 105, 111, 115, + 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, + 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, + 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, + 196, 199, 205, 206, 207, 208, 209, 210, 211, 213, + 214, 215, 216, 222, 225, 231, 232, 241, 248, 251, + 174, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 0, 0, 0, 0, 0, 146, 0, 0, 359, 148, + 0, 0, 220, 162, 0, 0, 0, 0, 0, 350, + 351, 0, 0, 0, 0, 0, 0, 0, 0, 54, + 0, 386, 86, 87, 88, 337, 336, 339, 340, 341, + 342, 0, 0, 108, 338, 343, 344, 345, 0, 0, + 0, 0, 330, 0, 358, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 327, 328, 0, 0, 0, 0, + 373, 0, 329, 0, 0, 322, 323, 325, 324, 326, + 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127, 372, 0, 0, 276, 0, 0, 370, 0, 193, + 0, 224, 130, 145, 104, 142, 90, 100, 0, 129, + 171, 200, 204, 0, 0, 0, 112, 0, 202, 181, + 240, 0, 183, 201, 149, 230, 194, 239, 249, 250, + 227, 247, 254, 217, 93, 226, 238, 109, 212, 95, + 236, 223, 160, 139, 140, 94, 0, 198, 117, 125, + 114, 173, 233, 234, 113, 257, 101, 246, 97, 102, + 245, 167, 229, 237, 161, 154, 96, 235, 159, 153, + 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, + 0, 0, 0, 221, 243, 258, 106, 0, 228, 252, + 253, 0, 0, 107, 126, 120, 190, 124, 166, 103, + 135, 218, 143, 150, 197, 256, 180, 203, 110, 242, + 219, 360, 371, 366, 367, 364, 365, 363, 362, 361, + 374, 352, 353, 354, 355, 357, 0, 368, 369, 356, + 89, 98, 147, 255, 195, 123, 244, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 91, 92, 99, 105, 111, 115, 119, 122, + 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, + 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, + 179, 182, 184, 185, 186, 187, 188, 189, 196, 199, + 205, 206, 207, 208, 209, 210, 211, 213, 214, 215, + 216, 222, 225, 231, 232, 241, 248, 251, 174, 0, + 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, + 0, 0, 0, 146, 0, 0, 359, 148, 0, 0, + 220, 162, 0, 0, 0, 0, 0, 350, 351, 0, + 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, + 86, 87, 88, 337, 336, 339, 340, 341, 342, 0, + 0, 108, 338, 343, 344, 345, 0, 0, 0, 0, + 330, 0, 358, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 327, 328, 0, 0, 0, 0, 373, 0, + 329, 0, 0, 322, 323, 325, 324, 326, 331, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 127, 372, + 0, 0, 276, 0, 0, 370, 0, 193, 0, 224, + 130, 145, 104, 142, 90, 100, 0, 129, 171, 200, + 204, 0, 0, 0, 112, 0, 202, 181, 240, 0, + 183, 201, 149, 230, 194, 239, 249, 250, 227, 247, + 254, 217, 93, 226, 238, 109, 212, 95, 236, 223, + 160, 139, 140, 94, 0, 198, 117, 125, 114, 173, + 233, 234, 113, 257, 101, 246, 97, 102, 245, 167, + 229, 237, 161, 154, 96, 235, 159, 153, 144, 121, + 132, 191, 151, 192, 133, 164, 163, 165, 0, 0, + 0, 221, 243, 258, 106, 0, 228, 252, 253, 0, + 0, 107, 126, 120, 190, 124, 166, 103, 135, 218, + 143, 150, 197, 256, 180, 203, 110, 242, 219, 360, + 371, 366, 367, 364, 365, 363, 362, 361, 374, 352, + 353, 354, 355, 357, 0, 368, 369, 356, 89, 98, + 147, 255, 195, 123, 244, 0, 0, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, + 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, + 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, + 184, 185, 186, 187, 188, 189, 196, 199, 205, 206, + 207, 208, 209, 210, 211, 213, 214, 215, 216, 222, + 225, 231, 232, 241, 248, 251, 174, 0, 0, 0, + 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, + 0, 146, 0, 0, 0, 148, 0, 0, 220, 162, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, + 88, 0, 0, 0, 0, 0, 0, 0, 0, 108, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 627, 626, 636, 637, + 629, 630, 631, 632, 633, 634, 635, 628, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, + 276, 0, 0, 0, 0, 193, 0, 224, 130, 145, + 104, 142, 90, 100, 0, 129, 171, 200, 204, 0, + 0, 0, 112, 0, 202, 181, 240, 0, 183, 201, + 149, 230, 194, 239, 249, 250, 227, 247, 254, 217, + 93, 226, 238, 109, 212, 95, 236, 223, 160, 139, + 140, 94, 0, 198, 117, 125, 114, 173, 233, 234, + 113, 257, 101, 246, 97, 102, 245, 167, 229, 237, + 161, 154, 96, 235, 159, 153, 144, 121, 132, 191, + 151, 192, 133, 164, 163, 165, 0, 0, 0, 221, + 243, 258, 106, 0, 228, 252, 253, 0, 0, 107, + 126, 120, 190, 124, 166, 103, 135, 218, 143, 150, + 197, 256, 180, 203, 110, 242, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 89, 98, 147, 255, + 195, 123, 244, 0, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, + 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, + 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, + 186, 187, 188, 189, 196, 199, 205, 206, 207, 208, + 209, 210, 211, 213, 214, 215, 216, 222, 225, 231, + 232, 241, 248, 251, 174, 0, 0, 0, 717, 0, + 0, 0, 0, 118, 0, 0, 0, 0, 0, 146, + 0, 0, 0, 148, 0, 0, 220, 162, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 86, 87, 88, 0, + 719, 0, 0, 0, 0, 0, 0, 108, 0, 0, + 0, 0, 0, 617, 616, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 0, 0, 0, 276, 0, + 0, 0, 0, 193, 0, 224, 130, 145, 104, 142, + 90, 100, 0, 129, 171, 200, 204, 0, 0, 0, + 112, 0, 202, 181, 240, 0, 183, 201, 149, 230, + 194, 239, 249, 250, 227, 247, 254, 217, 93, 226, + 238, 109, 212, 95, 236, 223, 160, 139, 140, 94, + 0, 198, 117, 125, 114, 173, 233, 234, 113, 257, + 101, 246, 97, 102, 245, 167, 229, 237, 161, 154, + 96, 235, 159, 153, 144, 121, 132, 191, 151, 192, + 133, 164, 163, 165, 0, 0, 0, 221, 243, 258, + 106, 0, 228, 252, 253, 0, 0, 107, 126, 120, + 190, 124, 166, 103, 135, 218, 143, 150, 197, 256, + 180, 203, 110, 242, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 89, 98, 147, 255, 195, 123, + 244, 0, 0, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 99, 105, + 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, + 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, + 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, + 188, 189, 196, 199, 205, 206, 207, 208, 209, 210, + 211, 213, 214, 215, 216, 222, 225, 231, 232, 241, + 248, 251, 174, 0, 0, 0, 0, 0, 0, 0, + 0, 118, 0, 0, 0, 0, 0, 146, 0, 0, + 0, 148, 0, 0, 220, 162, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86, 87, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, + 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 80, 81, 0, 77, 0, 0, 0, + 82, 193, 0, 224, 130, 145, 104, 142, 90, 100, + 0, 129, 171, 200, 204, 0, 0, 0, 112, 0, + 202, 181, 240, 0, 183, 201, 149, 230, 194, 239, + 249, 250, 227, 247, 254, 217, 93, 226, 238, 109, + 212, 95, 236, 223, 160, 139, 140, 94, 0, 198, + 117, 125, 114, 173, 233, 234, 113, 257, 101, 246, + 97, 102, 245, 167, 229, 237, 161, 154, 96, 235, + 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, + 163, 165, 0, 0, 0, 221, 243, 258, 106, 0, + 228, 252, 253, 0, 0, 107, 126, 120, 190, 124, + 166, 103, 135, 218, 143, 150, 197, 256, 180, 203, + 110, 242, 219, 0, 79, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 89, 98, 147, 255, 195, 123, 244, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 99, 105, 111, 115, + 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, + 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, + 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, + 196, 199, 205, 206, 207, 208, 209, 210, 211, 213, + 214, 215, 216, 222, 225, 231, 232, 241, 248, 251, + 174, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 0, 0, 0, 0, 0, 146, 0, 0, 0, 148, + 0, 0, 220, 162, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 86, 87, 88, 0, 0, 0, 0, 0, + 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, + 127, 0, 0, 0, 276, 0, 0, 0, 0, 193, + 0, 224, 130, 145, 104, 142, 90, 100, 0, 129, + 171, 200, 204, 0, 0, 0, 112, 0, 202, 181, + 240, 0, 183, 201, 149, 230, 194, 239, 249, 250, + 227, 247, 254, 217, 93, 226, 238, 109, 212, 95, + 236, 223, 160, 139, 140, 94, 0, 198, 117, 125, + 114, 173, 233, 234, 113, 257, 101, 246, 97, 102, + 245, 167, 229, 237, 161, 154, 96, 235, 159, 153, + 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, + 0, 0, 0, 221, 243, 258, 106, 0, 228, 252, + 253, 0, 0, 107, 126, 120, 190, 124, 166, 103, + 135, 218, 143, 150, 197, 256, 180, 203, 110, 242, + 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 98, 147, 255, 195, 123, 244, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 91, 92, 99, 105, 111, 115, 119, 122, + 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, + 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, + 179, 182, 184, 185, 186, 187, 188, 189, 196, 199, + 205, 206, 207, 208, 209, 210, 211, 213, 214, 215, + 216, 222, 225, 231, 232, 241, 248, 251, 303, 174, + 0, 0, 0, 982, 0, 0, 0, 0, 118, 0, + 0, 0, 0, 0, 146, 0, 0, 0, 148, 0, + 0, 220, 162, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 86, 87, 88, 0, 984, 0, 0, 0, 0, + 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, + 0, 0, 0, 276, 0, 0, 0, 0, 193, 0, + 224, 130, 145, 104, 142, 90, 100, 0, 129, 171, + 200, 204, 0, 0, 0, 112, 0, 202, 181, 240, + 0, 183, 201, 149, 230, 194, 239, 249, 250, 227, + 247, 254, 217, 93, 226, 238, 109, 212, 95, 236, + 223, 160, 139, 140, 94, 0, 198, 117, 125, 114, + 173, 233, 234, 113, 257, 101, 246, 97, 102, 245, + 167, 229, 237, 161, 154, 96, 235, 159, 153, 144, + 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, + 0, 0, 221, 243, 258, 106, 0, 228, 252, 253, + 0, 0, 107, 126, 120, 190, 124, 166, 103, 135, + 218, 143, 150, 197, 256, 180, 203, 110, 242, 219, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 98, 147, 255, 195, 123, 244, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 91, 92, 99, 105, 111, 115, 119, 122, 128, + 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, + 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, + 182, 184, 185, 186, 187, 188, 189, 196, 199, 205, + 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, + 222, 225, 231, 232, 241, 248, 251, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 0, 0, 0, 0, 146, 0, 0, 0, 148, 0, + 0, 220, 162, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 86, 87, 88, 0, 0, 0, 0, 0, 0, + 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, + 0, 0, 0, 276, 0, 0, 0, 0, 193, 0, + 224, 130, 145, 104, 142, 90, 100, 0, 129, 171, + 200, 204, 0, 0, 0, 112, 0, 202, 181, 240, + 0, 183, 201, 149, 230, 194, 239, 249, 250, 227, + 247, 254, 217, 93, 226, 238, 109, 212, 95, 236, + 223, 160, 139, 140, 94, 0, 198, 117, 125, 114, + 173, 233, 234, 113, 257, 101, 246, 97, 102, 245, + 167, 229, 237, 161, 154, 96, 235, 159, 153, 144, + 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, + 0, 0, 221, 243, 258, 106, 0, 228, 252, 253, + 0, 0, 107, 126, 120, 190, 124, 166, 103, 135, + 218, 143, 150, 197, 256, 180, 203, 110, 242, 219, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 98, 147, 255, 195, 123, 244, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 91, 92, 99, 105, 111, 115, 119, 122, 128, + 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, + 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, + 182, 184, 185, 186, 187, 188, 189, 196, 199, 205, + 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, + 222, 225, 231, 232, 241, 248, 251, 174, 0, 0, + 0, 982, 0, 0, 0, 0, 118, 0, 0, 0, + 0, 0, 146, 0, 0, 0, 148, 0, 0, 220, + 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, + 87, 88, 0, 984, 0, 0, 0, 0, 0, 0, + 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, + 0, 276, 0, 0, 0, 0, 193, 0, 224, 130, + 145, 104, 142, 90, 100, 0, 129, 171, 200, 204, + 0, 0, 0, 112, 0, 202, 181, 240, 0, 980, + 201, 149, 230, 194, 239, 249, 250, 227, 247, 254, + 217, 93, 226, 238, 109, 212, 95, 236, 223, 160, + 139, 140, 94, 0, 198, 117, 125, 114, 173, 233, + 234, 113, 257, 101, 246, 97, 102, 245, 167, 229, + 237, 161, 154, 96, 235, 159, 153, 144, 121, 132, + 191, 151, 192, 133, 164, 163, 165, 0, 0, 0, + 221, 243, 258, 106, 0, 228, 252, 253, 0, 0, + 107, 126, 120, 190, 124, 166, 103, 135, 218, 143, + 150, 197, 256, 180, 203, 110, 242, 219, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 98, 147, + 255, 195, 123, 244, 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, + 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, + 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, + 185, 186, 187, 188, 189, 196, 199, 205, 206, 207, + 208, 209, 210, 211, 213, 214, 215, 216, 222, 225, + 231, 232, 241, 248, 251, 382, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, + 0, 0, 146, 0, 0, 0, 148, 0, 0, 220, + 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 54, 0, 0, 86, + 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, + 0, 276, 0, 0, 0, 0, 193, 0, 224, 130, + 145, 104, 142, 90, 100, 0, 129, 171, 200, 204, + 0, 0, 0, 112, 0, 202, 181, 240, 0, 183, + 201, 149, 230, 194, 239, 249, 250, 227, 247, 254, + 217, 93, 226, 238, 109, 212, 95, 236, 223, 160, + 139, 140, 94, 0, 198, 117, 125, 114, 173, 233, + 234, 113, 257, 101, 246, 97, 102, 245, 167, 229, + 237, 161, 154, 96, 235, 159, 153, 144, 121, 132, + 191, 151, 192, 133, 164, 163, 165, 0, 0, 0, + 221, 243, 258, 106, 0, 228, 252, 253, 0, 0, + 107, 126, 120, 190, 124, 166, 103, 135, 218, 143, + 150, 197, 256, 180, 203, 110, 242, 219, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 98, 147, + 255, 195, 123, 244, 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, + 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, + 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, + 185, 186, 187, 188, 189, 196, 199, 205, 206, 207, + 208, 209, 210, 211, 213, 214, 215, 216, 222, 225, + 231, 232, 241, 248, 251, 174, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, + 146, 0, 0, 0, 148, 0, 0, 220, 162, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 86, 87, 88, + 0, 0, 950, 0, 0, 951, 0, 0, 108, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 127, 0, 0, 0, 276, + 0, 0, 0, 0, 193, 0, 224, 130, 145, 104, + 142, 90, 100, 0, 129, 171, 200, 204, 0, 0, + 0, 112, 0, 202, 181, 240, 0, 183, 201, 149, + 230, 194, 239, 249, 250, 227, 247, 254, 217, 93, + 226, 238, 109, 212, 95, 236, 223, 160, 139, 140, + 94, 0, 198, 117, 125, 114, 173, 233, 234, 113, + 257, 101, 246, 97, 102, 245, 167, 229, 237, 161, + 154, 96, 235, 159, 153, 144, 121, 132, 191, 151, + 192, 133, 164, 163, 165, 0, 0, 0, 221, 243, + 258, 106, 0, 228, 252, 253, 0, 0, 107, 126, + 120, 190, 124, 166, 103, 135, 218, 143, 150, 197, + 256, 180, 203, 110, 242, 219, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 89, 98, 147, 255, 195, + 123, 244, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, + 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, + 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, + 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, + 187, 188, 189, 196, 199, 205, 206, 207, 208, 209, + 210, 211, 213, 214, 215, 216, 222, 225, 231, 232, + 241, 248, 251, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 118, 0, 752, 0, 0, 0, 146, 0, + 0, 0, 148, 0, 0, 220, 162, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 87, 88, 0, 751, + 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 127, 0, 0, 0, 276, 0, 0, + 0, 0, 193, 0, 224, 130, 145, 104, 142, 90, + 100, 0, 129, 171, 200, 204, 0, 0, 0, 112, + 0, 202, 181, 240, 0, 183, 201, 149, 230, 194, + 239, 249, 250, 227, 247, 254, 217, 93, 226, 238, + 109, 212, 95, 236, 223, 160, 139, 140, 94, 0, + 198, 117, 125, 114, 173, 233, 234, 113, 257, 101, + 246, 97, 102, 245, 167, 229, 237, 161, 154, 96, + 235, 159, 153, 144, 121, 132, 191, 151, 192, 133, + 164, 163, 165, 0, 0, 0, 221, 243, 258, 106, + 0, 228, 252, 253, 0, 0, 107, 126, 120, 190, + 124, 166, 103, 135, 218, 143, 150, 197, 256, 180, + 203, 110, 242, 219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 89, 98, 147, 255, 195, 123, 244, + 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 92, 99, 105, 111, + 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, + 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, + 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, + 189, 196, 199, 205, 206, 207, 208, 209, 210, 211, + 213, 214, 215, 216, 222, 225, 231, 232, 241, 248, + 251, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 0, 0, 0, 0, 0, 146, 0, 0, 0, + 148, 0, 0, 220, 162, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 86, 87, 88, 0, 0, 0, 0, + 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 127, 0, 0, 0, 276, 0, 0, 0, 0, + 193, 0, 224, 130, 145, 104, 142, 90, 100, 0, + 129, 171, 200, 204, 0, 0, 0, 112, 0, 202, + 181, 240, 0, 183, 201, 149, 230, 194, 239, 249, + 250, 227, 247, 254, 217, 93, 226, 238, 109, 212, + 95, 236, 223, 160, 139, 140, 94, 0, 198, 117, + 125, 114, 173, 233, 234, 113, 257, 101, 246, 97, + 102, 245, 167, 229, 237, 161, 154, 96, 235, 159, + 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, + 165, 0, 0, 0, 221, 243, 258, 106, 0, 228, + 252, 253, 0, 0, 107, 126, 120, 190, 124, 166, + 103, 135, 218, 143, 150, 197, 256, 180, 203, 110, + 242, 219, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 98, 147, 255, 195, 123, 244, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 91, 92, 99, 105, 111, 115, 119, + 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, + 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, + 178, 179, 182, 184, 185, 186, 187, 188, 189, 196, + 199, 205, 206, 207, 208, 209, 210, 211, 213, 214, + 215, 216, 222, 225, 231, 232, 241, 248, 251, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 0, 0, 0, 0, 146, 0, 0, 0, 148, 0, + 0, 220, 162, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 86, 87, 88, 0, 0, 0, 0, 0, 0, + 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, + 0, 0, 0, 276, 0, 0, 0, 0, 193, 0, + 224, 130, 145, 104, 142, 90, 100, 0, 129, 171, + 200, 204, 0, 0, 0, 112, 0, 202, 181, 240, + 0, 183, 201, 149, 230, 194, 239, 249, 250, 227, + 247, 254, 217, 93, 226, 238, 109, 212, 95, 236, + 223, 160, 139, 140, 94, 0, 198, 117, 125, 114, + 173, 233, 234, 113, 257, 101, 246, 97, 102, 245, + 167, 229, 237, 161, 154, 96, 235, 159, 153, 144, + 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, + 0, 0, 221, 243, 258, 106, 0, 228, 252, 253, + 0, 0, 107, 126, 120, 190, 124, 166, 103, 135, + 218, 143, 150, 197, 256, 180, 203, 110, 242, 219, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 98, 147, 255, 195, 123, 244, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 91, 92, 99, 105, 111, 115, 119, 122, 128, + 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, + 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, + 182, 184, 185, 186, 187, 188, 189, 196, 199, 205, + 206, 207, 208, 209, 210, 211, 213, 214, 215, 216, + 222, 225, 231, 232, 241, 248, 251, 174, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, + 0, 0, 146, 0, 0, 0, 148, 0, 0, 220, + 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, + 87, 88, 0, 984, 0, 0, 0, 0, 0, 0, + 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 528, 516, 0, 473, 531, 446, 463, - 539, 464, 467, 504, 431, 486, 175, 461, 0, 450, - 426, 457, 427, 448, 475, 119, 479, 445, 518, 489, - 530, 147, 0, 451, 537, 149, 495, 0, 221, 163, - 0, 0, 0, 477, 520, 484, 513, 472, 505, 436, - 494, 532, 462, 502, 533, 0, 936, 0, 87, 88, - 89, 0, 1017, 1018, 0, 0, 0, 0, 0, 109, - 274, 499, 527, 459, 501, 503, 425, 496, 0, 429, - 432, 538, 523, 454, 455, 1205, 0, 0, 0, 0, - 0, 0, 476, 485, 510, 470, 0, 0, 0, 0, - 0, 0, 0, 0, 452, 0, 493, 0, 0, 0, - 433, 430, 0, 0, 0, 0, 474, 0, 0, 0, - 435, 0, 453, 511, 0, 423, 128, 515, 522, 471, - 277, 526, 469, 468, 529, 194, 0, 225, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 201, 205, 519, - 449, 458, 113, 456, 203, 182, 241, 492, 184, 202, - 150, 231, 195, 240, 250, 251, 228, 248, 255, 218, - 94, 227, 239, 110, 213, 96, 237, 224, 161, 140, - 141, 95, 0, 199, 118, 126, 115, 174, 234, 235, - 114, 258, 102, 247, 98, 103, 246, 168, 230, 238, - 162, 155, 97, 236, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 428, 0, 222, - 244, 259, 107, 444, 229, 253, 254, 0, 0, 108, - 127, 121, 191, 125, 167, 104, 136, 219, 144, 151, - 198, 257, 181, 204, 111, 243, 220, 440, 443, 438, - 439, 487, 488, 534, 535, 536, 512, 434, 0, 441, - 442, 0, 517, 524, 525, 491, 90, 99, 148, 256, - 196, 124, 245, 424, 437, 117, 447, 0, 0, 460, - 465, 466, 478, 480, 481, 482, 483, 490, 497, 498, - 500, 506, 507, 508, 509, 514, 521, 540, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 528, 516, 0, 473, 531, 446, - 463, 539, 464, 467, 504, 431, 486, 175, 461, 0, - 450, 426, 457, 427, 448, 475, 119, 479, 445, 518, - 489, 530, 147, 0, 451, 537, 149, 495, 0, 221, - 163, 0, 0, 0, 477, 520, 484, 513, 472, 505, - 436, 494, 532, 462, 502, 533, 0, 0, 0, 87, - 88, 89, 0, 1017, 1018, 0, 0, 0, 0, 0, - 109, 0, 499, 527, 459, 501, 503, 425, 496, 0, - 429, 432, 538, 523, 454, 455, 0, 0, 0, 0, - 0, 0, 0, 476, 485, 510, 470, 0, 0, 0, - 0, 0, 0, 0, 0, 452, 0, 493, 0, 0, - 0, 433, 430, 0, 0, 0, 0, 474, 0, 0, - 0, 435, 0, 453, 511, 0, 423, 128, 515, 522, - 471, 277, 526, 469, 468, 529, 194, 0, 225, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 201, 205, - 519, 449, 458, 113, 456, 203, 182, 241, 492, 184, - 202, 150, 231, 195, 240, 250, 251, 228, 248, 255, - 218, 94, 227, 239, 110, 213, 96, 237, 224, 161, - 140, 141, 95, 0, 199, 118, 126, 115, 174, 234, - 235, 114, 258, 102, 247, 98, 103, 246, 168, 230, - 238, 162, 155, 97, 236, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 428, 0, - 222, 244, 259, 107, 444, 229, 253, 254, 0, 0, - 108, 127, 121, 191, 125, 167, 104, 136, 219, 144, - 151, 198, 257, 181, 204, 111, 243, 220, 440, 443, - 438, 439, 487, 488, 534, 535, 536, 512, 434, 0, - 441, 442, 0, 517, 524, 525, 491, 90, 99, 148, - 256, 196, 124, 245, 424, 437, 117, 447, 0, 0, - 460, 465, 466, 478, 480, 481, 482, 483, 490, 497, - 498, 500, 506, 507, 508, 509, 514, 521, 540, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 528, 516, 0, 473, 531, - 446, 463, 539, 464, 467, 504, 431, 486, 175, 461, - 0, 450, 426, 457, 427, 448, 475, 119, 479, 445, - 518, 489, 530, 147, 0, 451, 537, 149, 495, 0, - 221, 163, 0, 0, 0, 477, 520, 484, 513, 472, - 505, 436, 494, 532, 462, 502, 533, 59, 0, 0, - 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 109, 0, 499, 527, 459, 501, 503, 425, 496, - 0, 429, 432, 538, 523, 454, 455, 0, 0, 0, - 0, 0, 0, 0, 476, 485, 510, 470, 0, 0, - 0, 0, 0, 0, 0, 0, 452, 0, 493, 0, - 0, 0, 433, 430, 0, 0, 0, 0, 474, 0, - 0, 0, 435, 0, 453, 511, 0, 423, 128, 515, - 522, 471, 277, 526, 469, 468, 529, 194, 0, 225, - 131, 146, 105, 143, 91, 101, 0, 130, 172, 201, - 205, 519, 449, 458, 113, 456, 203, 182, 241, 492, - 184, 202, 150, 231, 195, 240, 250, 251, 228, 248, - 255, 218, 94, 227, 239, 110, 213, 96, 237, 224, - 161, 140, 141, 95, 0, 199, 118, 126, 115, 174, - 234, 235, 114, 258, 102, 247, 98, 103, 246, 168, - 230, 238, 162, 155, 97, 236, 160, 154, 145, 122, - 133, 192, 152, 193, 134, 165, 164, 166, 0, 428, - 0, 222, 244, 259, 107, 444, 229, 253, 254, 0, - 0, 108, 127, 121, 191, 125, 167, 104, 136, 219, - 144, 151, 198, 257, 181, 204, 111, 243, 220, 440, - 443, 438, 439, 487, 488, 534, 535, 536, 512, 434, - 0, 441, 442, 0, 517, 524, 525, 491, 90, 99, - 148, 256, 196, 124, 245, 424, 437, 117, 447, 0, - 0, 460, 465, 466, 478, 480, 481, 482, 483, 490, - 497, 498, 500, 506, 507, 508, 509, 514, 521, 540, - 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 528, 516, 0, 473, - 531, 446, 463, 539, 464, 467, 504, 431, 486, 175, - 461, 0, 450, 426, 457, 427, 448, 475, 119, 479, - 445, 518, 489, 530, 147, 0, 451, 537, 149, 495, - 0, 221, 163, 0, 0, 0, 477, 520, 484, 513, - 472, 505, 436, 494, 532, 462, 502, 533, 0, 0, - 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 499, 527, 459, 501, 503, 425, - 496, 0, 429, 432, 538, 523, 454, 455, 0, 0, - 0, 0, 0, 0, 0, 476, 485, 510, 470, 0, - 0, 0, 0, 0, 0, 1307, 0, 452, 0, 493, - 0, 0, 0, 433, 430, 0, 0, 0, 0, 474, - 0, 0, 0, 435, 0, 453, 511, 0, 423, 128, - 515, 522, 471, 277, 526, 469, 468, 529, 194, 0, - 225, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 201, 205, 519, 449, 458, 113, 456, 203, 182, 241, - 492, 184, 202, 150, 231, 195, 240, 250, 251, 228, - 248, 255, 218, 94, 227, 239, 110, 213, 96, 237, - 224, 161, 140, 141, 95, 0, 199, 118, 126, 115, - 174, 234, 235, 114, 258, 102, 247, 98, 103, 246, - 168, 230, 238, 162, 155, 97, 236, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 428, 0, 222, 244, 259, 107, 444, 229, 253, 254, - 0, 0, 108, 127, 121, 191, 125, 167, 104, 136, - 219, 144, 151, 198, 257, 181, 204, 111, 243, 220, - 440, 443, 438, 439, 487, 488, 534, 535, 536, 512, - 434, 0, 441, 442, 0, 517, 524, 525, 491, 90, - 99, 148, 256, 196, 124, 245, 424, 437, 117, 447, - 0, 0, 460, 465, 466, 478, 480, 481, 482, 483, - 490, 497, 498, 500, 506, 507, 508, 509, 514, 521, - 540, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 528, 516, 0, - 473, 531, 446, 463, 539, 464, 467, 504, 431, 486, - 175, 461, 0, 450, 426, 457, 427, 448, 475, 119, - 479, 445, 518, 489, 530, 147, 0, 451, 537, 149, - 495, 0, 221, 163, 0, 0, 0, 477, 520, 484, - 513, 472, 505, 436, 494, 532, 462, 502, 533, 0, - 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 0, 499, 527, 459, 501, 503, - 425, 496, 0, 429, 432, 538, 523, 454, 455, 0, - 0, 0, 0, 0, 0, 0, 476, 485, 510, 470, - 0, 0, 0, 0, 0, 0, 1001, 0, 452, 0, - 493, 0, 0, 0, 433, 430, 0, 0, 0, 0, - 474, 0, 0, 0, 435, 0, 453, 511, 0, 423, - 128, 515, 522, 471, 277, 526, 469, 468, 529, 194, - 0, 225, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 201, 205, 519, 449, 458, 113, 456, 203, 182, - 241, 492, 184, 202, 150, 231, 195, 240, 250, 251, - 228, 248, 255, 218, 94, 227, 239, 110, 213, 96, - 237, 224, 161, 140, 141, 95, 0, 199, 118, 126, - 115, 174, 234, 235, 114, 258, 102, 247, 98, 103, - 246, 168, 230, 238, 162, 155, 97, 236, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 428, 0, 222, 244, 259, 107, 444, 229, 253, - 254, 0, 0, 108, 127, 121, 191, 125, 167, 104, - 136, 219, 144, 151, 198, 257, 181, 204, 111, 243, - 220, 440, 443, 438, 439, 487, 488, 534, 535, 536, - 512, 434, 0, 441, 442, 0, 517, 524, 525, 491, - 90, 99, 148, 256, 196, 124, 245, 424, 437, 117, - 447, 0, 0, 460, 465, 466, 478, 480, 481, 482, - 483, 490, 497, 498, 500, 506, 507, 508, 509, 514, - 521, 540, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 197, 200, - 206, 207, 208, 209, 210, 211, 212, 214, 215, 216, - 217, 223, 226, 232, 233, 242, 249, 252, 528, 516, - 0, 473, 531, 446, 463, 539, 464, 467, 504, 431, - 486, 175, 461, 0, 450, 426, 457, 427, 448, 475, - 119, 479, 445, 518, 489, 530, 147, 0, 451, 537, - 149, 495, 0, 221, 163, 0, 0, 0, 477, 520, - 484, 513, 472, 505, 436, 494, 532, 462, 502, 533, - 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 499, 527, 459, 501, - 503, 425, 496, 0, 429, 432, 538, 523, 454, 455, - 0, 0, 0, 0, 0, 0, 0, 476, 485, 510, - 470, 0, 0, 0, 0, 0, 0, 966, 0, 452, - 0, 493, 0, 0, 0, 433, 430, 0, 0, 0, - 0, 474, 0, 0, 0, 435, 0, 453, 511, 0, - 423, 128, 515, 522, 471, 277, 526, 469, 468, 529, - 194, 0, 225, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 201, 205, 519, 449, 458, 113, 456, 203, - 182, 241, 492, 184, 202, 150, 231, 195, 240, 250, - 251, 228, 248, 255, 218, 94, 227, 239, 110, 213, - 96, 237, 224, 161, 140, 141, 95, 0, 199, 118, - 126, 115, 174, 234, 235, 114, 258, 102, 247, 98, - 103, 246, 168, 230, 238, 162, 155, 97, 236, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 428, 0, 222, 244, 259, 107, 444, 229, - 253, 254, 0, 0, 108, 127, 121, 191, 125, 167, - 104, 136, 219, 144, 151, 198, 257, 181, 204, 111, - 243, 220, 440, 443, 438, 439, 487, 488, 534, 535, - 536, 512, 434, 0, 441, 442, 0, 517, 524, 525, - 491, 90, 99, 148, 256, 196, 124, 245, 424, 437, - 117, 447, 0, 0, 460, 465, 466, 478, 480, 481, - 482, 483, 490, 497, 498, 500, 506, 507, 508, 509, - 514, 521, 540, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 528, - 516, 0, 473, 531, 446, 463, 539, 464, 467, 504, - 431, 486, 175, 461, 0, 450, 426, 457, 427, 448, - 475, 119, 479, 445, 518, 489, 530, 147, 0, 451, - 537, 149, 495, 0, 221, 163, 0, 0, 0, 477, - 520, 484, 513, 472, 505, 436, 494, 532, 462, 502, - 533, 0, 0, 0, 87, 88, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 499, 527, 459, - 501, 503, 425, 496, 0, 429, 432, 538, 523, 454, - 455, 0, 0, 0, 0, 0, 0, 0, 476, 485, - 510, 470, 0, 0, 0, 0, 0, 0, 0, 0, - 452, 0, 493, 0, 0, 0, 433, 430, 0, 0, - 0, 0, 474, 0, 0, 0, 435, 0, 453, 511, - 0, 423, 128, 515, 522, 471, 277, 526, 469, 468, - 529, 194, 0, 225, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 201, 205, 519, 449, 458, 113, 456, - 203, 182, 241, 492, 184, 202, 150, 231, 195, 240, - 250, 251, 228, 248, 255, 218, 94, 227, 239, 110, - 213, 96, 237, 224, 161, 140, 141, 95, 0, 199, - 118, 126, 115, 174, 234, 235, 114, 258, 102, 247, - 98, 103, 246, 168, 230, 238, 162, 155, 97, 236, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 428, 0, 222, 244, 259, 107, 444, - 229, 253, 254, 0, 0, 108, 127, 121, 191, 125, - 167, 104, 136, 219, 144, 151, 198, 257, 181, 204, - 111, 243, 220, 440, 443, 438, 439, 487, 488, 534, - 535, 536, 512, 434, 0, 441, 442, 0, 517, 524, - 525, 491, 90, 99, 148, 256, 196, 124, 245, 424, - 437, 117, 447, 0, 0, 460, 465, 466, 478, 480, - 481, 482, 483, 490, 497, 498, 500, 506, 507, 508, - 509, 514, 521, 540, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 197, 200, 206, 207, 208, 209, 210, 211, 212, 214, - 215, 216, 217, 223, 226, 232, 233, 242, 249, 252, - 528, 516, 0, 473, 531, 446, 463, 539, 464, 467, - 504, 431, 486, 175, 461, 0, 450, 426, 457, 427, - 448, 475, 119, 479, 445, 518, 489, 530, 147, 0, - 451, 537, 149, 495, 0, 221, 163, 0, 0, 0, - 477, 520, 484, 513, 472, 505, 436, 494, 532, 462, - 502, 533, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 499, 527, - 459, 501, 503, 425, 496, 0, 429, 432, 538, 523, - 454, 455, 0, 0, 0, 0, 0, 0, 0, 476, - 485, 510, 470, 0, 0, 0, 0, 0, 0, 0, - 0, 452, 0, 493, 0, 0, 0, 433, 430, 0, - 0, 0, 0, 474, 0, 0, 0, 435, 0, 453, - 511, 0, 423, 128, 515, 522, 471, 277, 526, 469, - 468, 529, 194, 0, 225, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 201, 205, 519, 449, 458, 113, - 456, 203, 182, 241, 492, 184, 202, 150, 231, 195, - 240, 250, 251, 228, 248, 255, 218, 94, 227, 239, - 110, 213, 96, 237, 224, 161, 140, 141, 95, 0, - 199, 118, 126, 115, 174, 234, 235, 114, 258, 102, - 247, 98, 421, 246, 168, 230, 238, 162, 155, 97, - 236, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 428, 0, 222, 244, 259, 107, - 444, 229, 253, 254, 0, 0, 108, 127, 121, 191, - 125, 422, 420, 136, 219, 144, 151, 198, 257, 181, - 204, 111, 243, 220, 440, 443, 438, 439, 487, 488, - 534, 535, 536, 512, 434, 0, 441, 442, 0, 517, - 524, 525, 491, 90, 99, 148, 256, 196, 124, 245, - 424, 437, 117, 447, 0, 0, 460, 465, 466, 478, - 480, 481, 482, 483, 490, 497, 498, 500, 506, 507, - 508, 509, 514, 521, 540, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 528, 516, 0, 473, 531, 446, 463, 539, 464, - 467, 504, 431, 486, 175, 461, 0, 450, 426, 457, - 427, 448, 475, 119, 479, 445, 518, 489, 530, 147, - 0, 451, 537, 149, 495, 0, 221, 163, 0, 0, - 0, 477, 520, 484, 513, 472, 505, 436, 494, 532, - 462, 502, 533, 0, 0, 0, 87, 88, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 0, 499, - 527, 459, 501, 503, 425, 496, 0, 429, 432, 538, - 523, 454, 455, 0, 0, 0, 0, 0, 0, 0, - 476, 485, 510, 470, 0, 0, 0, 0, 0, 0, - 0, 0, 452, 0, 493, 0, 0, 0, 433, 430, - 0, 0, 0, 0, 474, 0, 0, 0, 435, 0, - 453, 511, 0, 423, 128, 515, 522, 471, 277, 526, - 469, 468, 529, 194, 0, 225, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 201, 205, 519, 449, 458, - 113, 456, 203, 182, 241, 492, 184, 202, 150, 231, - 195, 240, 250, 251, 228, 248, 255, 218, 94, 227, - 749, 110, 213, 96, 237, 224, 161, 140, 141, 95, - 0, 199, 118, 126, 115, 174, 234, 235, 114, 258, - 102, 247, 98, 421, 246, 168, 230, 238, 162, 155, - 97, 236, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 428, 0, 222, 244, 259, - 107, 444, 229, 253, 254, 0, 0, 108, 127, 121, - 191, 125, 422, 420, 136, 219, 144, 151, 198, 257, - 181, 204, 111, 243, 220, 440, 443, 438, 439, 487, - 488, 534, 535, 536, 512, 434, 0, 441, 442, 0, - 517, 524, 525, 491, 90, 99, 148, 256, 196, 124, - 245, 424, 437, 117, 447, 0, 0, 460, 465, 466, - 478, 480, 481, 482, 483, 490, 497, 498, 500, 506, - 507, 508, 509, 514, 521, 540, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 197, 200, 206, 207, 208, 209, 210, 211, - 212, 214, 215, 216, 217, 223, 226, 232, 233, 242, - 249, 252, 528, 516, 0, 473, 531, 446, 463, 539, - 464, 467, 504, 431, 486, 175, 461, 0, 450, 426, - 457, 427, 448, 475, 119, 479, 445, 518, 489, 530, - 147, 0, 451, 537, 149, 495, 0, 221, 163, 0, - 0, 0, 477, 520, 484, 513, 472, 505, 436, 494, - 532, 462, 502, 533, 0, 0, 0, 87, 88, 89, - 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, - 499, 527, 459, 501, 503, 425, 496, 0, 429, 432, - 538, 523, 454, 455, 0, 0, 0, 0, 0, 0, - 0, 476, 485, 510, 470, 0, 0, 0, 0, 0, - 0, 0, 0, 452, 0, 493, 0, 0, 0, 433, - 430, 0, 0, 0, 0, 474, 0, 0, 0, 435, - 0, 453, 511, 0, 423, 128, 515, 522, 471, 277, - 526, 469, 468, 529, 194, 0, 225, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 201, 205, 519, 449, - 458, 113, 456, 203, 182, 241, 492, 184, 202, 150, - 231, 195, 240, 250, 251, 228, 248, 255, 218, 94, - 227, 412, 110, 213, 96, 237, 224, 161, 140, 141, - 95, 0, 199, 118, 126, 115, 174, 234, 235, 114, - 258, 102, 247, 98, 421, 246, 168, 230, 238, 162, - 155, 97, 236, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 428, 0, 222, 244, - 259, 107, 444, 229, 253, 254, 0, 0, 108, 127, - 121, 191, 125, 422, 420, 415, 414, 144, 151, 198, - 257, 181, 204, 111, 243, 220, 440, 443, 438, 439, - 487, 488, 534, 535, 536, 512, 434, 0, 441, 442, - 0, 517, 524, 525, 491, 90, 99, 148, 256, 196, - 124, 245, 424, 437, 117, 447, 0, 0, 460, 465, - 466, 478, 480, 481, 482, 483, 490, 497, 498, 500, - 506, 507, 508, 509, 514, 521, 540, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 175, 0, 0, 908, 0, 317, 0, - 0, 0, 119, 0, 316, 0, 0, 0, 147, 0, - 909, 360, 149, 0, 0, 221, 163, 0, 0, 0, - 0, 0, 351, 352, 0, 0, 0, 0, 0, 0, - 0, 0, 59, 0, 0, 87, 88, 89, 338, 337, - 340, 341, 342, 343, 0, 0, 109, 339, 344, 345, - 346, 0, 0, 0, 314, 331, 0, 359, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 328, 329, 399, - 0, 0, 0, 374, 0, 330, 0, 0, 323, 324, - 326, 325, 327, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 373, 0, 0, 277, 0, 0, - 371, 0, 194, 0, 225, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 201, 205, 0, 0, 0, 113, - 0, 203, 182, 241, 0, 184, 202, 150, 231, 195, - 240, 250, 251, 228, 248, 255, 218, 94, 227, 239, - 110, 213, 96, 237, 224, 161, 140, 141, 95, 0, - 199, 118, 126, 115, 174, 234, 235, 114, 258, 102, - 247, 98, 103, 246, 168, 230, 238, 162, 155, 97, - 236, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 222, 244, 259, 107, - 0, 229, 253, 254, 0, 0, 108, 127, 121, 191, - 125, 167, 104, 136, 219, 144, 151, 198, 257, 181, - 204, 111, 243, 220, 361, 372, 367, 368, 365, 366, - 364, 363, 362, 375, 353, 354, 355, 356, 358, 0, - 369, 370, 357, 90, 99, 148, 256, 196, 124, 245, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 175, 0, 0, 0, 0, 317, 0, 0, 0, - 119, 0, 316, 0, 0, 0, 147, 0, 0, 360, - 149, 0, 0, 221, 163, 0, 0, 0, 0, 0, - 351, 352, 0, 0, 0, 0, 0, 0, 1008, 0, - 59, 0, 0, 87, 88, 89, 338, 337, 340, 341, - 342, 343, 0, 0, 109, 339, 344, 345, 346, 1009, - 0, 0, 314, 331, 0, 359, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 328, 329, 0, 0, 0, - 0, 374, 0, 330, 0, 0, 323, 324, 326, 325, - 327, 332, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 373, 0, 0, 277, 0, 0, 371, 0, - 194, 0, 225, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 201, 205, 0, 0, 0, 113, 0, 203, - 182, 241, 0, 184, 202, 150, 231, 195, 240, 250, - 251, 228, 248, 255, 218, 94, 227, 239, 110, 213, - 96, 237, 224, 161, 140, 141, 95, 0, 199, 118, - 126, 115, 174, 234, 235, 114, 258, 102, 247, 98, - 103, 246, 168, 230, 238, 162, 155, 97, 236, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 222, 244, 259, 107, 0, 229, - 253, 254, 0, 0, 108, 127, 121, 191, 125, 167, - 104, 136, 219, 144, 151, 198, 257, 181, 204, 111, - 243, 220, 361, 372, 367, 368, 365, 366, 364, 363, - 362, 375, 353, 354, 355, 356, 358, 0, 369, 370, - 357, 90, 99, 148, 256, 196, 124, 245, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 175, - 0, 0, 0, 0, 317, 0, 0, 0, 119, 0, - 316, 0, 0, 0, 147, 0, 0, 360, 149, 0, - 0, 221, 163, 0, 0, 0, 0, 0, 351, 352, - 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, - 703, 87, 88, 89, 338, 337, 340, 341, 342, 343, - 0, 0, 109, 339, 344, 345, 346, 0, 0, 0, - 314, 331, 0, 359, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 328, 329, 0, 0, 0, 0, 374, - 0, 330, 0, 0, 323, 324, 326, 325, 327, 332, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 373, 0, 0, 277, 0, 0, 371, 0, 194, 0, - 225, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 201, 205, 0, 0, 0, 113, 0, 203, 182, 241, - 0, 184, 202, 150, 231, 195, 240, 250, 251, 228, - 248, 255, 218, 94, 227, 239, 110, 213, 96, 237, - 224, 161, 140, 141, 95, 0, 199, 118, 126, 115, - 174, 234, 235, 114, 258, 102, 247, 98, 103, 246, - 168, 230, 238, 162, 155, 97, 236, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 222, 244, 259, 107, 0, 229, 253, 254, - 0, 0, 108, 127, 121, 191, 125, 167, 104, 136, - 219, 144, 151, 198, 257, 181, 204, 111, 243, 220, - 361, 372, 367, 368, 365, 366, 364, 363, 362, 375, - 353, 354, 355, 356, 358, 0, 369, 370, 357, 90, - 99, 148, 256, 196, 124, 245, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 175, 0, 0, - 0, 0, 317, 0, 0, 0, 119, 0, 316, 0, - 0, 0, 147, 0, 0, 360, 149, 0, 0, 221, - 163, 0, 0, 0, 0, 0, 351, 352, 0, 0, - 0, 0, 0, 0, 0, 0, 59, 0, 0, 87, - 88, 89, 338, 337, 340, 341, 342, 343, 0, 0, - 109, 339, 344, 345, 346, 0, 0, 0, 314, 331, - 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 328, 329, 399, 0, 0, 0, 374, 0, 330, - 0, 0, 323, 324, 326, 325, 327, 332, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 373, 0, - 0, 277, 0, 0, 371, 0, 194, 0, 225, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 201, 205, - 0, 0, 0, 113, 0, 203, 182, 241, 0, 184, - 202, 150, 231, 195, 240, 250, 251, 228, 248, 255, - 218, 94, 227, 239, 110, 213, 96, 237, 224, 161, - 140, 141, 95, 0, 199, 118, 126, 115, 174, 234, - 235, 114, 258, 102, 247, 98, 103, 246, 168, 230, - 238, 162, 155, 97, 236, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 222, 244, 259, 107, 0, 229, 253, 254, 0, 0, - 108, 127, 121, 191, 125, 167, 104, 136, 219, 144, - 151, 198, 257, 181, 204, 111, 243, 220, 361, 372, - 367, 368, 365, 366, 364, 363, 362, 375, 353, 354, - 355, 356, 358, 0, 369, 370, 357, 90, 99, 148, - 256, 196, 124, 245, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 175, 0, 0, 0, 0, - 317, 0, 0, 0, 119, 0, 316, 0, 0, 0, - 147, 0, 0, 360, 149, 0, 0, 221, 163, 0, - 0, 0, 0, 0, 351, 352, 0, 0, 0, 0, - 0, 0, 0, 0, 59, 0, 0, 87, 88, 89, - 338, 925, 340, 341, 342, 343, 0, 0, 109, 339, - 344, 345, 346, 0, 0, 0, 314, 331, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, - 329, 399, 0, 0, 0, 374, 0, 330, 0, 0, - 323, 324, 326, 325, 327, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 373, 0, 0, 277, - 0, 0, 371, 0, 194, 0, 225, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 201, 205, 0, 0, - 0, 113, 0, 203, 182, 241, 0, 184, 202, 150, - 231, 195, 240, 250, 251, 228, 248, 255, 218, 94, - 227, 239, 110, 213, 96, 237, 224, 161, 140, 141, - 95, 0, 199, 118, 126, 115, 174, 234, 235, 114, - 258, 102, 247, 98, 103, 246, 168, 230, 238, 162, - 155, 97, 236, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 0, 0, 222, 244, - 259, 107, 0, 229, 253, 254, 0, 0, 108, 127, - 121, 191, 125, 167, 104, 136, 219, 144, 151, 198, - 257, 181, 204, 111, 243, 220, 361, 372, 367, 368, - 365, 366, 364, 363, 362, 375, 353, 354, 355, 356, - 358, 0, 369, 370, 357, 90, 99, 148, 256, 196, - 124, 245, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 175, 0, 0, 0, 0, 317, 0, - 0, 0, 119, 0, 316, 0, 0, 0, 147, 0, - 0, 360, 149, 0, 0, 221, 163, 0, 0, 0, - 0, 0, 351, 352, 0, 0, 0, 0, 0, 0, - 0, 0, 59, 0, 0, 87, 88, 89, 338, 922, - 340, 341, 342, 343, 0, 0, 109, 339, 344, 345, - 346, 0, 0, 0, 314, 331, 0, 359, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 328, 329, 399, - 0, 0, 0, 374, 0, 330, 0, 0, 323, 324, - 326, 325, 327, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 373, 0, 0, 277, 0, 0, - 371, 0, 194, 0, 225, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 201, 205, 0, 0, 0, 113, - 0, 203, 182, 241, 0, 184, 202, 150, 231, 195, - 240, 250, 251, 228, 248, 255, 218, 94, 227, 239, - 110, 213, 96, 237, 224, 161, 140, 141, 95, 0, - 199, 118, 126, 115, 174, 234, 235, 114, 258, 102, - 247, 98, 103, 246, 168, 230, 238, 162, 155, 97, - 236, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 222, 244, 259, 107, - 0, 229, 253, 254, 0, 0, 108, 127, 121, 191, - 125, 167, 104, 136, 219, 144, 151, 198, 257, 181, - 204, 111, 243, 220, 361, 372, 367, 368, 365, 366, - 364, 363, 362, 375, 353, 354, 355, 356, 358, 0, - 369, 370, 357, 90, 99, 148, 256, 196, 124, 245, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 175, 0, 0, 0, 0, 317, 0, - 0, 0, 119, 0, 316, 0, 0, 0, 147, 0, - 0, 360, 149, 0, 0, 221, 163, 0, 0, 0, - 0, 0, 351, 352, 0, 0, 0, 0, 0, 0, - 0, 0, 59, 0, 0, 87, 88, 89, 338, 337, - 340, 341, 342, 343, 0, 0, 109, 339, 344, 345, - 346, 0, 0, 0, 314, 331, 0, 359, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 328, 329, 0, - 0, 0, 0, 374, 0, 330, 0, 0, 323, 324, - 326, 325, 327, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 373, 0, 0, 277, 0, 0, - 371, 0, 194, 0, 225, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 201, 205, 0, 0, 0, 113, - 0, 203, 182, 241, 0, 184, 202, 150, 231, 195, - 240, 250, 251, 228, 248, 255, 218, 94, 227, 239, - 110, 213, 96, 237, 224, 161, 140, 141, 95, 0, - 199, 118, 126, 115, 174, 234, 235, 114, 258, 102, - 247, 98, 103, 246, 168, 230, 238, 162, 155, 97, - 236, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 222, 244, 259, 107, - 0, 229, 253, 254, 0, 0, 108, 127, 121, 191, - 125, 167, 104, 136, 219, 144, 151, 198, 257, 181, - 204, 111, 243, 220, 361, 372, 367, 368, 365, 366, - 364, 363, 362, 375, 353, 354, 355, 356, 358, 0, - 369, 370, 357, 90, 99, 148, 256, 196, 124, 245, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 175, 0, 0, 0, 0, 317, 0, 0, 0, - 119, 0, 316, 0, 0, 0, 147, 0, 0, 360, - 149, 0, 0, 221, 163, 0, 0, 0, 0, 0, - 351, 352, 0, 0, 0, 0, 0, 0, 0, 0, - 59, 0, 0, 87, 88, 89, 338, 337, 340, 341, - 342, 343, 0, 0, 109, 339, 344, 345, 346, 0, - 0, 0, 314, 331, 0, 359, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 328, 329, 0, 0, 0, - 0, 374, 0, 330, 0, 0, 323, 324, 326, 325, - 327, 332, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 373, 0, 0, 277, 0, 0, 371, 0, - 194, 0, 225, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 201, 205, 0, 0, 0, 113, 0, 203, - 182, 241, 0, 184, 202, 150, 231, 195, 240, 250, - 251, 228, 248, 255, 218, 94, 227, 239, 110, 213, - 96, 237, 224, 161, 140, 141, 95, 0, 199, 118, - 126, 115, 174, 234, 235, 114, 258, 102, 247, 98, - 103, 246, 168, 230, 238, 162, 155, 97, 236, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 222, 244, 259, 107, 0, 229, - 253, 254, 0, 0, 108, 127, 121, 191, 125, 167, - 104, 136, 219, 144, 151, 198, 257, 181, 204, 111, - 243, 220, 361, 372, 367, 368, 365, 366, 364, 363, - 362, 375, 353, 354, 355, 356, 358, 0, 369, 370, - 357, 90, 99, 148, 256, 196, 124, 245, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 175, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, - 0, 0, 0, 0, 147, 0, 0, 360, 149, 0, - 0, 221, 163, 0, 0, 0, 0, 0, 351, 352, - 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, - 0, 87, 88, 89, 338, 337, 340, 341, 342, 343, - 0, 0, 109, 339, 344, 345, 346, 0, 0, 0, - 0, 331, 0, 359, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 328, 329, 0, 0, 0, 0, 374, - 0, 330, 0, 0, 323, 324, 326, 325, 327, 332, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 373, 0, 0, 277, 0, 0, 371, 0, 194, 0, - 225, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 201, 205, 0, 0, 0, 113, 0, 203, 182, 241, - 1571, 184, 202, 150, 231, 195, 240, 250, 251, 228, - 248, 255, 218, 94, 227, 239, 110, 213, 96, 237, - 224, 161, 140, 141, 95, 0, 199, 118, 126, 115, - 174, 234, 235, 114, 258, 102, 247, 98, 103, 246, - 168, 230, 238, 162, 155, 97, 236, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 222, 244, 259, 107, 0, 229, 253, 254, - 0, 0, 108, 127, 121, 191, 125, 167, 104, 136, - 219, 144, 151, 198, 257, 181, 204, 111, 243, 220, - 361, 372, 367, 368, 365, 366, 364, 363, 362, 375, - 353, 354, 355, 356, 358, 0, 369, 370, 357, 90, - 99, 148, 256, 196, 124, 245, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 175, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, - 0, 0, 147, 0, 0, 360, 149, 0, 0, 221, - 163, 0, 0, 0, 0, 0, 351, 352, 0, 0, - 0, 0, 0, 0, 0, 0, 59, 0, 703, 87, - 88, 89, 338, 337, 340, 341, 342, 343, 0, 0, - 109, 339, 344, 345, 346, 0, 0, 0, 0, 331, - 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 328, 329, 0, 0, 0, 0, 374, 0, 330, - 0, 0, 323, 324, 326, 325, 327, 332, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 373, 0, - 0, 277, 0, 0, 371, 0, 194, 0, 225, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 201, 205, - 0, 0, 0, 113, 0, 203, 182, 241, 0, 184, - 202, 150, 231, 195, 240, 250, 251, 228, 248, 255, - 218, 94, 227, 239, 110, 213, 96, 237, 224, 161, - 140, 141, 95, 0, 199, 118, 126, 115, 174, 234, - 235, 114, 258, 102, 247, 98, 103, 246, 168, 230, - 238, 162, 155, 97, 236, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 222, 244, 259, 107, 0, 229, 253, 254, 0, 0, - 108, 127, 121, 191, 125, 167, 104, 136, 219, 144, - 151, 198, 257, 181, 204, 111, 243, 220, 361, 372, - 367, 368, 365, 366, 364, 363, 362, 375, 353, 354, - 355, 356, 358, 0, 369, 370, 357, 90, 99, 148, - 256, 196, 124, 245, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 175, 0, 0, 0, 0, - 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, - 147, 0, 0, 360, 149, 0, 0, 221, 163, 0, - 0, 0, 0, 0, 351, 352, 0, 0, 0, 0, - 0, 0, 0, 0, 59, 0, 0, 87, 88, 89, - 338, 337, 340, 341, 342, 343, 0, 0, 109, 339, - 344, 345, 346, 0, 0, 0, 0, 331, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, - 329, 0, 0, 0, 0, 374, 0, 330, 0, 0, - 323, 324, 326, 325, 327, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 373, 0, 0, 277, - 0, 0, 371, 0, 194, 0, 225, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 201, 205, 0, 0, - 0, 113, 0, 203, 182, 241, 0, 184, 202, 150, - 231, 195, 240, 250, 251, 228, 248, 255, 218, 94, - 227, 239, 110, 213, 96, 237, 224, 161, 140, 141, - 95, 0, 199, 118, 126, 115, 174, 234, 235, 114, - 258, 102, 247, 98, 103, 246, 168, 230, 238, 162, - 155, 97, 236, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 0, 0, 222, 244, - 259, 107, 0, 229, 253, 254, 0, 0, 108, 127, - 121, 191, 125, 167, 104, 136, 219, 144, 151, 198, - 257, 181, 204, 111, 243, 220, 361, 372, 367, 368, - 365, 366, 364, 363, 362, 375, 353, 354, 355, 356, - 358, 0, 369, 370, 357, 90, 99, 148, 256, 196, - 124, 245, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 175, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, - 0, 0, 149, 0, 0, 221, 163, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 628, 627, 637, 638, 630, 631, 632, - 633, 634, 635, 636, 629, 0, 0, 639, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 0, 0, 0, 277, 0, 0, - 0, 0, 194, 0, 225, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 201, 205, 0, 0, 0, 113, - 0, 203, 182, 241, 0, 184, 202, 150, 231, 195, - 240, 250, 251, 228, 248, 255, 218, 94, 227, 239, - 110, 213, 96, 237, 224, 161, 140, 141, 95, 0, - 199, 118, 126, 115, 174, 234, 235, 114, 258, 102, - 247, 98, 103, 246, 168, 230, 238, 162, 155, 97, - 236, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 222, 244, 259, 107, - 0, 229, 253, 254, 0, 0, 108, 127, 121, 191, - 125, 167, 104, 136, 219, 144, 151, 198, 257, 181, - 204, 111, 243, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 99, 148, 256, 196, 124, 245, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 175, 0, 0, 0, 724, 0, 0, 0, 0, - 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, - 149, 0, 0, 221, 163, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 88, 89, 0, 726, 0, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, - 618, 617, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 277, 0, 0, 0, 0, - 194, 0, 225, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 201, 205, 0, 0, 0, 113, 0, 203, - 182, 241, 0, 184, 202, 150, 231, 195, 240, 250, - 251, 228, 248, 255, 218, 94, 227, 239, 110, 213, - 96, 237, 224, 161, 140, 141, 95, 0, 199, 118, - 126, 115, 174, 234, 235, 114, 258, 102, 247, 98, - 103, 246, 168, 230, 238, 162, 155, 97, 236, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 222, 244, 259, 107, 0, 229, - 253, 254, 0, 0, 108, 127, 121, 191, 125, 167, - 104, 136, 219, 144, 151, 198, 257, 181, 204, 111, - 243, 220, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 99, 148, 256, 196, 124, 245, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 175, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, - 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, - 0, 221, 163, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 79, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 81, 82, 0, 78, 0, 0, 0, 83, 194, 0, - 225, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 201, 205, 0, 0, 0, 113, 0, 203, 182, 241, - 0, 184, 202, 150, 231, 195, 240, 250, 251, 228, - 248, 255, 218, 94, 227, 239, 110, 213, 96, 237, - 224, 161, 140, 141, 95, 0, 199, 118, 126, 115, - 174, 234, 235, 114, 258, 102, 247, 98, 103, 246, - 168, 230, 238, 162, 155, 97, 236, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 222, 244, 259, 107, 0, 229, 253, 254, - 0, 0, 108, 127, 121, 191, 125, 167, 104, 136, - 219, 144, 151, 198, 257, 181, 204, 111, 243, 220, - 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 99, 148, 256, 196, 124, 245, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 175, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, - 0, 0, 147, 0, 0, 0, 149, 0, 0, 221, - 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, - 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 305, 0, 128, 0, 0, - 0, 277, 0, 0, 0, 0, 194, 0, 225, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 201, 205, - 0, 0, 0, 113, 0, 203, 182, 241, 0, 184, - 202, 150, 231, 195, 240, 250, 251, 228, 248, 255, - 218, 94, 227, 239, 110, 213, 96, 237, 224, 161, - 140, 141, 95, 0, 199, 118, 126, 115, 174, 234, - 235, 114, 258, 102, 247, 98, 103, 246, 168, 230, - 238, 162, 155, 97, 236, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 222, 244, 259, 107, 0, 229, 253, 254, 0, 0, - 108, 127, 121, 191, 125, 167, 104, 136, 219, 144, - 151, 198, 257, 181, 204, 111, 243, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 99, 148, - 256, 196, 124, 245, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 304, 175, 0, 0, 0, - 991, 0, 0, 0, 0, 119, 0, 0, 0, 0, - 0, 147, 0, 0, 0, 149, 0, 0, 221, 163, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, - 89, 0, 993, 0, 0, 0, 0, 0, 0, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 277, 0, 0, 0, 0, 194, 0, 225, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 201, 205, 0, - 0, 0, 113, 0, 203, 182, 241, 0, 184, 202, - 150, 231, 195, 240, 250, 251, 228, 248, 255, 218, - 94, 227, 239, 110, 213, 96, 237, 224, 161, 140, - 141, 95, 0, 199, 118, 126, 115, 174, 234, 235, - 114, 258, 102, 247, 98, 103, 246, 168, 230, 238, - 162, 155, 97, 236, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 0, 0, 222, - 244, 259, 107, 0, 229, 253, 254, 0, 0, 108, - 127, 121, 191, 125, 167, 104, 136, 219, 144, 151, - 198, 257, 181, 204, 111, 243, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 99, 148, 256, - 196, 124, 245, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 27, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, - 0, 147, 0, 0, 0, 149, 0, 0, 221, 163, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 59, 0, 0, 87, 88, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 277, 0, 0, 0, 0, 194, 0, 225, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 201, 205, 0, - 0, 0, 113, 0, 203, 182, 241, 0, 184, 202, - 150, 231, 195, 240, 250, 251, 228, 248, 255, 218, - 94, 227, 239, 110, 213, 96, 237, 224, 161, 140, - 141, 95, 0, 199, 118, 126, 115, 174, 234, 235, - 114, 258, 102, 247, 98, 103, 246, 168, 230, 238, - 162, 155, 97, 236, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 0, 0, 222, - 244, 259, 107, 0, 229, 253, 254, 0, 0, 108, - 127, 121, 191, 125, 167, 104, 136, 219, 144, 151, - 198, 257, 181, 204, 111, 243, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 99, 148, 256, - 196, 124, 245, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 175, 0, 0, 0, 991, 0, - 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 149, 0, 0, 221, 163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, - 993, 0, 0, 0, 0, 0, 0, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 277, 0, - 0, 0, 0, 194, 0, 225, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 201, 205, 0, 0, 0, - 113, 0, 203, 182, 241, 0, 989, 202, 150, 231, - 195, 240, 250, 251, 228, 248, 255, 218, 94, 227, - 239, 110, 213, 96, 237, 224, 161, 140, 141, 95, - 0, 199, 118, 126, 115, 174, 234, 235, 114, 258, - 102, 247, 98, 103, 246, 168, 230, 238, 162, 155, - 97, 236, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 0, 0, 222, 244, 259, - 107, 0, 229, 253, 254, 0, 0, 108, 127, 121, - 191, 125, 167, 104, 136, 219, 144, 151, 198, 257, - 181, 204, 111, 243, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 99, 148, 256, 196, 124, - 245, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 197, 200, 206, 207, 208, 209, 210, 211, - 212, 214, 215, 216, 217, 223, 226, 232, 233, 242, - 249, 252, 175, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, - 0, 149, 0, 0, 221, 163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 88, 89, 0, 0, 958, - 0, 0, 959, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 277, 0, 0, 0, - 0, 194, 0, 225, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 201, 205, 0, 0, 0, 113, 0, - 203, 182, 241, 0, 184, 202, 150, 231, 195, 240, - 250, 251, 228, 248, 255, 218, 94, 227, 239, 110, - 213, 96, 237, 224, 161, 140, 141, 95, 0, 199, - 118, 126, 115, 174, 234, 235, 114, 258, 102, 247, - 98, 103, 246, 168, 230, 238, 162, 155, 97, 236, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 0, 0, 222, 244, 259, 107, 0, - 229, 253, 254, 0, 0, 108, 127, 121, 191, 125, - 167, 104, 136, 219, 144, 151, 198, 257, 181, 204, - 111, 243, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 99, 148, 256, 196, 124, 245, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 197, 200, 206, 207, 208, 209, 210, 211, 212, 214, - 215, 216, 217, 223, 226, 232, 233, 242, 249, 252, - 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, - 0, 759, 0, 0, 0, 147, 0, 0, 0, 149, - 0, 0, 221, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 88, 89, 0, 758, 0, 0, 0, - 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 277, 0, 0, 0, 0, 194, - 0, 225, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 201, 205, 0, 0, 0, 113, 0, 203, 182, - 241, 0, 184, 202, 150, 231, 195, 240, 250, 251, - 228, 248, 255, 218, 94, 227, 239, 110, 213, 96, - 237, 224, 161, 140, 141, 95, 0, 199, 118, 126, - 115, 174, 234, 235, 114, 258, 102, 247, 98, 103, - 246, 168, 230, 238, 162, 155, 97, 236, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 0, 0, 222, 244, 259, 107, 0, 229, 253, - 254, 0, 0, 108, 127, 121, 191, 125, 167, 104, - 136, 219, 144, 151, 198, 257, 181, 204, 111, 243, - 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 99, 148, 256, 196, 124, 245, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 197, 200, - 206, 207, 208, 209, 210, 211, 212, 214, 215, 216, - 217, 223, 226, 232, 233, 242, 249, 252, 175, 0, - 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, - 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, - 221, 163, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 703, - 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 0, 0, 277, 0, 0, 0, 0, 194, 0, 225, - 131, 146, 105, 143, 91, 101, 0, 130, 172, 201, - 205, 0, 0, 0, 113, 0, 203, 182, 241, 0, - 184, 202, 150, 231, 195, 240, 250, 251, 228, 248, - 255, 218, 94, 227, 239, 110, 213, 96, 237, 224, - 161, 140, 141, 95, 0, 199, 118, 126, 115, 174, - 234, 235, 114, 258, 102, 247, 98, 103, 246, 168, - 230, 238, 162, 155, 97, 236, 160, 154, 145, 122, - 133, 192, 152, 193, 134, 165, 164, 166, 0, 0, - 0, 222, 244, 259, 107, 0, 229, 253, 254, 0, - 0, 108, 127, 121, 191, 125, 167, 104, 136, 219, - 144, 151, 198, 257, 181, 204, 111, 243, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, - 148, 256, 196, 124, 245, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 175, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, - 0, 147, 0, 0, 0, 149, 0, 0, 221, 163, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 59, 0, 0, 87, 88, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 277, 0, 0, 0, 0, 194, 0, 225, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 201, 205, 0, - 0, 0, 113, 0, 203, 182, 241, 0, 184, 202, - 150, 231, 195, 240, 250, 251, 228, 248, 255, 218, - 94, 227, 239, 110, 213, 96, 237, 224, 161, 140, - 141, 95, 0, 199, 118, 126, 115, 174, 234, 235, - 114, 258, 102, 247, 98, 103, 246, 168, 230, 238, - 162, 155, 97, 236, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 0, 0, 222, - 244, 259, 107, 0, 229, 253, 254, 0, 0, 108, - 127, 121, 191, 125, 167, 104, 136, 219, 144, 151, - 198, 257, 181, 204, 111, 243, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 99, 148, 256, - 196, 124, 245, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 175, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 149, 0, 0, 221, 163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, - 993, 0, 0, 0, 0, 0, 0, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 277, 0, - 0, 0, 0, 194, 0, 225, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 201, 205, 0, 0, 0, - 113, 0, 203, 182, 241, 0, 184, 202, 150, 231, - 195, 240, 250, 251, 228, 248, 255, 218, 94, 227, - 239, 110, 213, 96, 237, 224, 161, 140, 141, 95, - 0, 199, 118, 126, 115, 174, 234, 235, 114, 258, - 102, 247, 98, 103, 246, 168, 230, 238, 162, 155, - 97, 236, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 0, 0, 222, 244, 259, - 107, 0, 229, 253, 254, 0, 0, 108, 127, 121, - 191, 125, 167, 104, 136, 219, 144, 151, 198, 257, - 181, 204, 111, 243, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 99, 148, 256, 196, 124, - 245, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 197, 200, 206, 207, 208, 209, 210, 211, - 212, 214, 215, 216, 217, 223, 226, 232, 233, 242, - 249, 252, 175, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, - 0, 149, 0, 0, 221, 163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 88, 89, 0, 726, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 277, 0, 0, 0, - 0, 194, 0, 225, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 201, 205, 0, 0, 0, 113, 0, - 203, 182, 241, 0, 184, 202, 150, 231, 195, 240, - 250, 251, 228, 248, 255, 218, 94, 227, 239, 110, - 213, 96, 237, 224, 161, 140, 141, 95, 0, 199, - 118, 126, 115, 174, 234, 235, 114, 258, 102, 247, - 98, 103, 246, 168, 230, 238, 162, 155, 97, 236, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 0, 0, 222, 244, 259, 107, 0, - 229, 253, 254, 0, 0, 108, 127, 121, 191, 125, - 167, 104, 136, 219, 144, 151, 198, 257, 181, 204, - 111, 243, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 99, 148, 256, 196, 124, 245, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 197, 200, 206, 207, 208, 209, 210, 211, 212, 214, - 215, 216, 217, 223, 226, 232, 233, 242, 249, 252, - 175, 0, 0, 0, 0, 0, 0, 0, 729, 119, - 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, - 0, 0, 221, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 277, 0, 0, 0, 0, 194, - 0, 225, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 201, 205, 0, 0, 0, 113, 0, 203, 182, - 241, 0, 184, 202, 150, 231, 195, 240, 250, 251, - 228, 248, 255, 218, 94, 227, 239, 110, 213, 96, - 237, 224, 161, 140, 141, 95, 0, 199, 118, 126, - 115, 174, 234, 235, 114, 258, 102, 247, 98, 103, - 246, 168, 230, 238, 162, 155, 97, 236, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 0, 0, 222, 244, 259, 107, 0, 229, 253, - 254, 0, 0, 108, 127, 121, 191, 125, 167, 104, - 136, 219, 144, 151, 198, 257, 181, 204, 111, 243, - 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 99, 148, 256, 196, 124, 245, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 197, 200, - 206, 207, 208, 209, 210, 211, 212, 214, 215, 216, - 217, 223, 226, 232, 233, 242, 249, 252, 175, 0, - 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, - 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, - 221, 163, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 88, 89, 0, 607, 0, 0, 0, 0, 0, - 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 0, 0, 277, 0, 0, 0, 0, 194, 0, 225, - 131, 146, 105, 143, 91, 101, 0, 130, 172, 201, - 205, 0, 0, 0, 113, 0, 203, 182, 241, 0, - 184, 202, 150, 231, 195, 240, 250, 251, 228, 248, - 255, 218, 94, 227, 239, 110, 213, 96, 237, 224, - 161, 140, 141, 95, 0, 199, 118, 126, 115, 174, - 234, 235, 114, 258, 102, 247, 98, 103, 246, 168, - 230, 238, 162, 155, 97, 236, 160, 154, 145, 122, - 133, 192, 152, 193, 134, 165, 164, 166, 0, 0, - 0, 222, 244, 259, 107, 0, 229, 253, 254, 0, - 0, 108, 127, 121, 191, 125, 167, 104, 136, 219, - 144, 151, 198, 257, 181, 204, 111, 243, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, - 148, 256, 196, 124, 245, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 404, 0, 0, 0, - 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, - 0, 0, 149, 0, 0, 221, 163, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 0, 0, 0, 277, 0, 0, - 0, 0, 194, 0, 225, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 201, 205, 0, 0, 0, 113, - 0, 203, 182, 241, 0, 184, 202, 150, 231, 195, - 240, 250, 251, 228, 248, 255, 218, 94, 227, 239, - 110, 213, 96, 237, 224, 161, 140, 141, 95, 0, - 199, 118, 126, 115, 174, 234, 235, 114, 258, 102, - 247, 98, 103, 246, 168, 230, 238, 162, 155, 97, - 236, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 222, 244, 259, 107, - 0, 229, 253, 254, 0, 0, 108, 127, 121, 191, - 125, 167, 104, 136, 219, 144, 151, 198, 257, 181, - 204, 111, 243, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 99, 148, 256, 196, 124, 245, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, - 149, 0, 0, 221, 163, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 272, 0, 277, 0, 0, 0, 0, - 194, 0, 225, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 201, 205, 0, 0, 0, 113, 0, 203, - 182, 241, 0, 184, 202, 150, 231, 195, 240, 250, - 251, 228, 248, 255, 218, 94, 227, 239, 110, 213, - 96, 237, 224, 161, 140, 141, 95, 0, 199, 118, - 126, 115, 174, 234, 235, 114, 258, 102, 247, 98, - 103, 246, 168, 230, 238, 162, 155, 97, 236, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 222, 244, 259, 107, 0, 229, - 253, 254, 0, 0, 108, 127, 121, 191, 125, 167, - 104, 136, 219, 144, 151, 198, 257, 181, 204, 111, - 243, 220, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 99, 148, 256, 196, 124, 245, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 175, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, - 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, - 0, 221, 163, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 0, 0, 0, 277, 0, 0, 0, 0, 194, 0, - 225, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 201, 205, 0, 0, 0, 113, 0, 203, 182, 241, - 0, 184, 202, 150, 231, 195, 240, 250, 251, 228, - 248, 255, 218, 94, 227, 239, 110, 213, 96, 237, - 224, 161, 140, 141, 95, 0, 199, 118, 126, 115, - 174, 234, 235, 114, 258, 102, 247, 98, 103, 246, - 168, 230, 238, 162, 155, 97, 236, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 222, 244, 259, 107, 0, 229, 253, 254, - 0, 0, 108, 127, 121, 191, 125, 167, 104, 136, - 219, 144, 151, 198, 257, 181, 204, 111, 243, 220, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 99, 148, 256, 196, 124, 245, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, + 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, + 0, 276, 0, 0, 0, 0, 193, 0, 224, 130, + 145, 104, 142, 90, 100, 0, 129, 171, 200, 204, + 0, 0, 0, 112, 0, 202, 181, 240, 0, 183, + 201, 149, 230, 194, 239, 249, 250, 227, 247, 254, + 217, 93, 226, 238, 109, 212, 95, 236, 223, 160, + 139, 140, 94, 0, 198, 117, 125, 114, 173, 233, + 234, 113, 257, 101, 246, 97, 102, 245, 167, 229, + 237, 161, 154, 96, 235, 159, 153, 144, 121, 132, + 191, 151, 192, 133, 164, 163, 165, 0, 0, 0, + 221, 243, 258, 106, 0, 228, 252, 253, 0, 0, + 107, 126, 120, 190, 124, 166, 103, 135, 218, 143, + 150, 197, 256, 180, 203, 110, 242, 219, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 98, 147, + 255, 195, 123, 244, 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, + 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, + 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, + 185, 186, 187, 188, 189, 196, 199, 205, 206, 207, + 208, 209, 210, 211, 213, 214, 215, 216, 222, 225, + 231, 232, 241, 248, 251, 174, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, + 146, 0, 0, 0, 148, 0, 0, 220, 162, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 86, 87, 88, + 0, 719, 0, 0, 0, 0, 0, 0, 108, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 127, 0, 0, 0, 276, + 0, 0, 0, 0, 193, 0, 224, 130, 145, 104, + 142, 90, 100, 0, 129, 171, 200, 204, 0, 0, + 0, 112, 0, 202, 181, 240, 0, 183, 201, 149, + 230, 194, 239, 249, 250, 227, 247, 254, 217, 93, + 226, 238, 109, 212, 95, 236, 223, 160, 139, 140, + 94, 0, 198, 117, 125, 114, 173, 233, 234, 113, + 257, 101, 246, 97, 102, 245, 167, 229, 237, 161, + 154, 96, 235, 159, 153, 144, 121, 132, 191, 151, + 192, 133, 164, 163, 165, 0, 0, 0, 221, 243, + 258, 106, 0, 228, 252, 253, 0, 0, 107, 126, + 120, 190, 124, 166, 103, 135, 218, 143, 150, 197, + 256, 180, 203, 110, 242, 219, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 89, 98, 147, 255, 195, + 123, 244, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, + 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, + 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, + 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, + 187, 188, 189, 196, 199, 205, 206, 207, 208, 209, + 210, 211, 213, 214, 215, 216, 222, 225, 231, 232, + 241, 248, 251, 174, 0, 0, 0, 0, 0, 0, + 0, 722, 118, 0, 0, 0, 0, 0, 146, 0, + 0, 0, 148, 0, 0, 220, 162, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 87, 88, 0, 0, + 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 127, 0, 0, 0, 276, 0, 0, + 0, 0, 193, 0, 224, 130, 145, 104, 142, 90, + 100, 0, 129, 171, 200, 204, 0, 0, 0, 112, + 0, 202, 181, 240, 0, 183, 201, 149, 230, 194, + 239, 249, 250, 227, 247, 254, 217, 93, 226, 238, + 109, 212, 95, 236, 223, 160, 139, 140, 94, 0, + 198, 117, 125, 114, 173, 233, 234, 113, 257, 101, + 246, 97, 102, 245, 167, 229, 237, 161, 154, 96, + 235, 159, 153, 144, 121, 132, 191, 151, 192, 133, + 164, 163, 165, 0, 0, 0, 221, 243, 258, 106, + 0, 228, 252, 253, 0, 0, 107, 126, 120, 190, + 124, 166, 103, 135, 218, 143, 150, 197, 256, 180, + 203, 110, 242, 219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 89, 98, 147, 255, 195, 123, 244, + 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 92, 99, 105, 111, + 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, + 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, + 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, + 189, 196, 199, 205, 206, 207, 208, 209, 210, 211, + 213, 214, 215, 216, 222, 225, 231, 232, 241, 248, + 251, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 0, 0, 0, 0, 0, 146, 0, 0, 0, + 148, 0, 0, 220, 162, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 86, 87, 88, 0, 606, 0, 0, + 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 127, 0, 0, 0, 276, 0, 0, 0, 0, + 193, 0, 224, 130, 145, 104, 142, 90, 100, 0, + 129, 171, 200, 204, 0, 0, 0, 112, 0, 202, + 181, 240, 0, 183, 201, 149, 230, 194, 239, 249, + 250, 227, 247, 254, 217, 93, 226, 238, 109, 212, + 95, 236, 223, 160, 139, 140, 94, 0, 198, 117, + 125, 114, 173, 233, 234, 113, 257, 101, 246, 97, + 102, 245, 167, 229, 237, 161, 154, 96, 235, 159, + 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, + 165, 0, 0, 0, 221, 243, 258, 106, 0, 228, + 252, 253, 0, 0, 107, 126, 120, 190, 124, 166, + 103, 135, 218, 143, 150, 197, 256, 180, 203, 110, + 242, 219, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 98, 147, 255, 195, 123, 244, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 91, 92, 99, 105, 111, 115, 119, + 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, + 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, + 178, 179, 182, 184, 185, 186, 187, 188, 189, 196, + 199, 205, 206, 207, 208, 209, 210, 211, 213, 214, + 215, 216, 222, 225, 231, 232, 241, 248, 251, 403, + 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, + 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, + 0, 146, 0, 0, 0, 148, 0, 0, 220, 162, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, + 88, 0, 0, 0, 0, 0, 0, 0, 0, 108, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, + 276, 0, 0, 0, 0, 193, 0, 224, 130, 145, + 104, 142, 90, 100, 0, 129, 171, 200, 204, 0, + 0, 0, 112, 0, 202, 181, 240, 0, 183, 201, + 149, 230, 194, 239, 249, 250, 227, 247, 254, 217, + 93, 226, 238, 109, 212, 95, 236, 223, 160, 139, + 140, 94, 0, 198, 117, 125, 114, 173, 233, 234, + 113, 257, 101, 246, 97, 102, 245, 167, 229, 237, + 161, 154, 96, 235, 159, 153, 144, 121, 132, 191, + 151, 192, 133, 164, 163, 165, 0, 0, 0, 221, + 243, 258, 106, 0, 228, 252, 253, 0, 0, 107, + 126, 120, 190, 124, 166, 103, 135, 218, 143, 150, + 197, 256, 180, 203, 110, 242, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 89, 98, 147, 255, + 195, 123, 244, 0, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, + 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, + 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, + 186, 187, 188, 189, 196, 199, 205, 206, 207, 208, + 209, 210, 211, 213, 214, 215, 216, 222, 225, 231, + 232, 241, 248, 251, 174, 0, 0, 0, 0, 0, + 0, 0, 0, 118, 0, 0, 0, 0, 0, 146, + 0, 0, 0, 148, 0, 0, 220, 162, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 86, 87, 88, 0, + 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127, 0, 271, 0, 276, 0, + 0, 0, 0, 193, 0, 224, 130, 145, 104, 142, + 90, 100, 0, 129, 171, 200, 204, 0, 0, 0, + 112, 0, 202, 181, 240, 0, 183, 201, 149, 230, + 194, 239, 249, 250, 227, 247, 254, 217, 93, 226, + 238, 109, 212, 95, 236, 223, 160, 139, 140, 94, + 0, 198, 117, 125, 114, 173, 233, 234, 113, 257, + 101, 246, 97, 102, 245, 167, 229, 237, 161, 154, + 96, 235, 159, 153, 144, 121, 132, 191, 151, 192, + 133, 164, 163, 165, 0, 0, 0, 221, 243, 258, + 106, 0, 228, 252, 253, 0, 0, 107, 126, 120, + 190, 124, 166, 103, 135, 218, 143, 150, 197, 256, + 180, 203, 110, 242, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 89, 98, 147, 255, 195, 123, + 244, 0, 0, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 99, 105, + 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, + 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, + 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, + 188, 189, 196, 199, 205, 206, 207, 208, 209, 210, + 211, 213, 214, 215, 216, 222, 225, 231, 232, 241, + 248, 251, 174, 0, 0, 0, 0, 0, 0, 0, + 0, 118, 0, 0, 0, 0, 0, 146, 0, 0, + 0, 148, 0, 0, 220, 162, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86, 87, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 276, 0, 0, 0, + 0, 193, 0, 224, 130, 145, 104, 142, 90, 100, + 0, 129, 171, 200, 204, 0, 0, 0, 112, 0, + 202, 181, 240, 0, 183, 201, 149, 230, 194, 239, + 249, 250, 227, 247, 254, 217, 93, 226, 238, 109, + 212, 95, 236, 223, 160, 139, 140, 94, 0, 198, + 117, 125, 114, 173, 233, 234, 113, 257, 101, 246, + 97, 102, 245, 167, 229, 237, 161, 154, 96, 235, + 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, + 163, 165, 0, 0, 0, 221, 243, 258, 106, 0, + 228, 252, 253, 0, 0, 107, 126, 120, 190, 124, + 166, 103, 135, 218, 143, 150, 197, 256, 180, 203, + 110, 242, 219, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 89, 98, 147, 255, 195, 123, 244, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 99, 105, 111, 115, + 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, + 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, + 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, + 196, 199, 205, 206, 207, 208, 209, 210, 211, 213, + 214, 215, 216, 222, 225, 231, 232, 241, 248, 251, } var yyPact = [...]int{ - 2122, -1000, -272, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 965, 999, -1000, -1000, -1000, - -1000, -1000, -1000, 271, 12061, 42, 128, -1, 16813, 126, - 186, 17151, -1000, 19, -1000, -1000, 12399, -1000, -1000, -81, - -82, -1000, 10033, 761, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 952, 956, 766, 947, 912, -1000, 8669, 94, - 94, 16475, 7317, -1000, -1000, 437, 17151, 124, 17151, -144, - 92, 92, 92, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 182, -1000, -277, 1060, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 809, -1000, -1000, -1000, + -1000, -1000, -1000, 306, 11854, 49, 156, -13, 16956, 155, + 1554, 17294, -1000, 11, -1000, -1000, 12192, -1000, -1000, -68, + -94, -1000, 9826, 1021, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 830, 996, 688, 1193, -1000, 8462, 124, 124, + 16618, 7110, -1000, -1000, 478, 17294, 144, 17294, -149, 107, + 107, 107, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2696,23 +2688,24 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 109, 17151, 561, 561, 231, -1000, 17151, 91, 561, 91, - 91, 91, 17151, -1000, 182, -1000, -1000, -1000, 17151, 561, - 909, 366, 80, 4860, -1000, 189, -1000, 4860, 31, 4860, - -66, 974, 25, -29, -1000, 4860, -1000, -1000, -1000, -1000, - -1000, -1000, 16130, 148, 270, -1000, -1000, -1000, -1000, -1000, - -1000, 589, 468, -1000, 10033, 1572, 712, 712, -1000, -1000, - 139, -1000, -1000, 11047, 11047, 11047, 11047, 11047, 11047, 11047, - 11047, 11047, 11047, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 712, 179, -1000, - 9695, 712, 712, 712, 712, 712, 712, 712, 712, 10033, - 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, - 712, 712, 712, 712, 712, 712, -1000, -1000, 426, 918, - 10033, 10033, 965, -1000, 761, -1000, -1000, -1000, 859, 8669, - -1000, -1000, 899, -1000, -1000, -1000, -1000, 352, 986, -1000, - 11723, 175, 15792, 14778, 17151, 792, 725, -1000, -1000, 166, - 710, 6966, -87, -1000, -1000, -1000, 265, 14102, -1000, -1000, - -1000, 908, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 146, + 17294, 572, 572, 270, -1000, 17294, 94, 572, 94, 94, + 94, 17294, -1000, 205, -1000, -1000, -1000, 17294, 572, 929, + 352, 76, 4653, -1000, 222, -1000, 4653, 25, 4653, -21, + 1033, 18, -25, -1000, 4653, -1000, -1000, -1000, -1000, -1000, + -1000, 16273, 115, 361, -1000, -1000, -1000, -1000, -1000, -1000, + 613, 480, -1000, 9826, 1715, 702, 702, -1000, -1000, 173, + -1000, -1000, 10840, 10840, 10840, 10840, 10840, 10840, 10840, 10840, + 10840, 10840, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 702, 202, -1000, 9488, + 702, 702, 702, 702, 702, 702, 702, 702, 9826, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, -1000, -1000, 1005, 1019, 1021, + -1000, 809, -1000, -1000, -1000, 1021, -1000, 897, 8462, -1000, + -1000, 1059, -1000, -1000, -1000, -1000, 405, 1042, -1000, 11516, + 201, 15935, 14921, 17294, 775, 713, -1000, -1000, 199, 726, + 6759, -99, -1000, -1000, -1000, 357, 14245, -1000, -1000, -1000, + 924, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2724,142 +2717,141 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 676, 17151, -1000, 1605, -1000, 561, 4860, 99, 561, - 303, 561, 17151, 17151, 4860, 4860, 4860, 37, 72, 66, - 17151, 708, 97, 17151, 942, 806, 17151, 561, 561, -1000, - 6264, -1000, 4860, 366, -1000, 478, 10033, 4860, 4860, 4860, - 17151, 4860, 4860, -1000, -1000, -1000, 310, -1000, -1000, -1000, - -1000, 4860, 4860, -1000, 984, 296, -1000, -1000, -1000, -1000, - 10033, 227, -1000, 801, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -124, -1000, -1000, 10033, 10033, 10033, 516, - 239, 11047, 447, 345, 11047, 11047, 11047, 11047, 11047, 11047, - 11047, 11047, 11047, 11047, 11047, 11047, 11047, 11047, 11047, 573, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 561, -1000, - 761, 605, 605, 188, 188, 188, 188, 188, 188, 188, - 188, 188, 11385, 7655, 6264, 426, 673, 9695, 8669, 8669, - 10033, 10033, 9345, 9007, 8669, 915, 294, 468, 17151, -1000, - -1000, 10709, -1000, -1000, -1000, -1000, -1000, 426, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 17151, 17151, 8669, 8669, 8669, - 8669, 8669, -1000, -1000, -1000, 993, 220, 350, 707, -1000, - 392, 952, 426, 899, 13764, 594, -1000, 899, -1000, -1000, - -1000, 17151, -1000, -1000, 15454, -1000, -1000, 5913, 49, 17151, - -1000, 686, 838, -1000, -1000, -1000, 944, 13088, 13426, 49, - 601, 14778, 17151, -1000, -1000, 14778, 17151, 5562, 6615, -87, - -1000, 682, -1000, -104, -111, 7993, 177, -1000, -1000, -1000, - -1000, 4509, 299, 511, 318, -63, -1000, -1000, -1000, 719, - -1000, 719, 719, 719, 719, -24, -24, -24, -24, -1000, - -1000, -1000, -1000, -1000, 781, 767, -1000, 719, 719, 719, + 706, 17294, -1000, 320, -1000, 572, 4653, 133, 572, 372, + 572, 17294, 17294, 4653, 4653, 4653, 37, 72, 56, 17294, + 725, 127, 17294, 987, 839, 17294, 572, 572, -1000, 6057, + -1000, 4653, 352, -1000, 531, 9826, 4653, 4653, 4653, 17294, + 4653, 4653, -1000, -1000, -1000, 345, -1000, -1000, -1000, -1000, + 4653, 4653, -1000, 1041, 341, -1000, -1000, -1000, -1000, 9826, + 264, -1000, 838, -1000, -1000, -1000, -1000, -1000, 1060, -1000, + -1000, -1000, -127, -1000, -1000, 9826, 9826, 9826, 584, 328, + 10840, 493, 340, 10840, 10840, 10840, 10840, 10840, 10840, 10840, + 10840, 10840, 10840, 10840, 10840, 10840, 10840, 10840, 641, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 572, -1000, 1055, + 624, 624, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 11178, 7448, 6057, 535, 685, 8462, 8462, 9826, 9826, + 9138, 8800, 8462, 949, 362, 480, 17294, -1000, -1000, 10502, + -1000, -1000, -1000, -1000, -1000, 535, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 17294, 17294, 8462, 8462, 8462, 8462, 8462, + 990, 9826, 9826, 1005, 688, 1059, 1005, 13907, 831, -1000, + 1059, -1000, -1000, -1000, 17294, -1000, -1000, 15597, -1000, -1000, + 5706, 62, 17294, -1000, 715, 927, -1000, -1000, -1000, 989, + 13569, 13219, 62, 695, 14921, 17294, -1000, -1000, 14921, 17294, + 5355, 6408, -99, -1000, 676, -1000, -115, -104, 7786, 219, + -1000, -1000, -1000, -1000, 4302, 536, 590, 397, -61, -1000, + -1000, -1000, 792, -1000, 792, 792, 792, 792, -20, -20, + -20, -20, -1000, -1000, -1000, -1000, -1000, 823, 817, -1000, + 792, 792, 792, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 757, 757, - 757, 721, 721, 788, -1000, 17151, 4860, 939, 4860, -1000, - 90, -1000, -1000, -1000, 17151, 17151, 17151, 17151, 17151, 141, - 17151, 17151, 703, -1000, 17151, 4860, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 468, -1000, -1000, -1000, -1000, -1000, - -1000, 17151, -1000, -1000, -1000, -1000, 17151, 366, 17151, 17151, - 468, -1000, 476, 17151, -1000, -1000, -1000, -1000, 468, 239, - 257, -1000, -1000, 525, -1000, -1000, 1872, -1000, -1000, -1000, - -1000, 447, 11047, 11047, 11047, 421, 1872, 1965, 2009, 1363, - 188, 280, 280, 206, 206, 206, 206, 206, 372, 372, - -1000, -1000, -1000, 426, -1000, -1000, -1000, 426, 8669, 8669, - 702, 712, 163, -1000, -1000, -1000, 426, 661, 661, 481, - 564, 260, 983, 661, 255, 976, 661, 661, 8669, -1000, - -1000, 289, -1000, 10033, 426, -1000, 162, -1000, 803, 692, - 687, 661, 426, 426, 661, 661, -1000, 851, 10033, 10033, - 10033, -1000, -1000, -1000, 918, -1000, 960, -1000, 886, 881, - 971, 8669, 14778, 899, -1000, -1000, -1000, 159, 722, 712, - -1000, 17151, 14778, 14778, 14778, 14778, 14778, -1000, 824, 821, - -1000, 869, 868, 876, 17151, -1000, 665, 13088, 170, 712, - -1000, 15116, -1000, -1000, 971, 14778, 560, -1000, 560, -1000, - 155, -1000, -1000, 682, -87, -99, -1000, -1000, -1000, -1000, - 468, -1000, 584, 679, 4158, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 751, 561, -1000, 932, 213, 215, 561, 931, - -1000, -1000, -1000, 911, -1000, 317, -75, -1000, -1000, 406, - -24, -24, -1000, -1000, 177, 900, 177, 177, 177, 474, - 474, -1000, -1000, -1000, -1000, 398, -1000, -1000, -1000, 393, - -1000, 800, 17151, 4860, -1000, -1000, -1000, -1000, 371, 371, - 214, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 48, 726, -1000, -1000, -1000, -1000, 1, 35, - 96, -1000, 4860, -1000, 296, 296, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 421, 1872, 1800, -1000, 11047, - 11047, -1000, -1000, 661, 661, 8669, 6264, -1000, -1000, -1000, - 103, 573, 103, 11047, 11047, -1000, 11047, 11047, -1000, -161, - 749, 277, -1000, 10033, 457, -1000, 6264, -1000, 11047, 11047, - -1000, -1000, -1000, -1000, -1000, 840, 468, 468, -1000, -1000, - 17151, -1000, -1000, -1000, -1000, 969, 10033, -1000, 624, -1000, - 5211, 799, 17151, 712, -1000, 13088, 17151, 683, -1000, 261, - 838, 785, 798, 658, -1000, -1000, -1000, -1000, 813, -1000, - 802, -1000, -1000, -1000, -1000, -1000, 123, 122, 121, 17151, - -1000, 965, 560, -1000, -1000, 202, -1000, -1000, -127, -130, - -1000, -1000, -1000, 4509, -1000, 4509, 17151, 74, -1000, 561, - 561, -1000, -1000, -1000, 729, 796, 11047, -1000, -1000, -1000, - 504, 177, 177, -1000, 252, -1000, -1000, -1000, 659, -1000, - 653, 618, 640, 17151, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 806, 806, 806, 797, 797, 826, -1000, 17294, 4653, + 985, 4653, -1000, 73, -1000, -1000, -1000, 17294, 17294, 17294, + 17294, 17294, 164, 17294, 17294, 720, -1000, 17294, 4653, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 480, -1000, -1000, + -1000, -1000, -1000, -1000, 17294, -1000, -1000, -1000, -1000, 17294, + 352, 17294, 17294, 480, -1000, 526, 17294, -1000, -1000, -1000, + -1000, 480, 328, 338, -1000, -1000, 548, -1000, -1000, 1974, + -1000, -1000, -1000, -1000, 493, 10840, 10840, 10840, 145, 1974, + 1951, 1668, 811, 224, 374, 374, 218, 218, 218, 218, + 218, 322, 322, -1000, -1000, -1000, 535, -1000, -1000, -1000, + 535, 8462, 8462, 718, 702, 197, -1000, -1000, -1000, 668, + 668, 321, 522, 292, 1040, 668, 285, 1035, 668, 668, + 8462, -1000, -1000, 367, -1000, 9826, 535, -1000, 196, -1000, + 844, 717, 714, 668, 535, 535, 668, 668, -1000, 1050, + 252, 530, 690, -1000, 559, 990, -1000, 990, 1015, -1000, + 903, 901, 1031, 8462, 14921, 1059, -1000, -1000, -1000, 195, + 722, 702, -1000, 17294, 14921, 14921, 14921, 14921, 14921, -1000, + 862, 861, -1000, 877, 855, 884, 17294, -1000, 679, 227, + 702, -1000, 15259, -1000, -1000, 1031, 14921, 801, -1000, 801, + -1000, 194, -1000, -1000, 676, -99, -27, -1000, -1000, -1000, + -1000, 480, -1000, 650, 661, 3951, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 799, 572, -1000, 972, 241, 323, 572, + 954, -1000, -1000, -1000, 931, -1000, 395, -64, -1000, -1000, + 504, -20, -20, -1000, -1000, 219, 911, 219, 219, 219, + 523, 523, -1000, -1000, -1000, -1000, 500, -1000, -1000, -1000, + 496, -1000, 837, 17294, 4653, -1000, -1000, -1000, -1000, 701, + 701, 262, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 60, 802, -1000, -1000, -1000, -1000, 7, + 29, 126, -1000, 4653, -1000, 341, 341, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 145, 1974, 1873, -1000, + 10840, 10840, -1000, -1000, 668, 668, 8462, 6057, -1000, -1000, + 188, 641, 188, 10840, 10840, -1000, 10840, 10840, -1000, -162, + 651, 353, -1000, 9826, 297, -1000, 6057, -1000, 10840, 10840, + -1000, -1000, -1000, -1000, -1000, -1000, 894, 9826, 9826, 9826, + -1000, -1000, -1000, -1000, -1000, 17294, -1000, -1000, -1000, -1000, + 1026, 9826, -1000, 646, -1000, 5004, 836, 17294, 702, 1060, + 12881, 17294, 804, -1000, 356, 927, 822, 835, 1285, -1000, + -1000, -1000, -1000, 854, -1000, 853, -1000, -1000, -1000, -1000, + -1000, 143, 142, 136, 17294, -1000, 1021, 801, -1000, -1000, + 233, -1000, -1000, -122, -116, -1000, -1000, -1000, 4302, -1000, + 4302, 17294, 77, -1000, 572, 572, -1000, -1000, -1000, 798, + 833, 10840, -1000, -1000, -1000, 585, 219, 219, -1000, 358, + -1000, -1000, -1000, 658, -1000, 648, 619, 640, 17294, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 17151, -1000, -1000, -1000, -1000, -1000, 17151, - -169, 561, 17151, 17151, 17151, 17151, -1000, 366, 366, -1000, - 11047, 1872, 1872, -1000, -1000, 426, -1000, 426, 719, 719, - -1000, 719, 721, -1000, 719, -4, 719, -7, 426, 426, - 1853, 1838, 1729, 982, 712, -156, -1000, 468, 10033, -1000, - 1631, 508, -1000, -1000, 967, 954, 468, -1000, -1000, 919, - 519, 529, -1000, -1000, 8331, 426, 635, 153, 633, -1000, - 965, 17151, 10033, -1000, -1000, 10033, 720, -1000, 10033, -1000, - -1000, -1000, 712, 712, 712, 633, 952, -1000, -1000, -1000, - -1000, 4158, -1000, 630, -1000, 719, -1000, -1000, -1000, 17151, - -57, 991, 1872, -1000, -1000, -1000, -1000, -1000, -24, 472, - -24, 382, -1000, 374, 4860, -1000, -1000, -1000, -1000, 935, - -1000, 6264, -1000, -1000, 718, 786, -1000, -1000, -1000, -1000, - 1872, -1000, -1000, -1000, 108, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 11047, 11047, 11047, 11047, 11047, 952, 451, - 468, 11047, 11047, -1000, 10033, 10033, 925, -1000, 712, -1000, - -1000, 723, 17151, 17151, -1000, 17151, 952, -1000, 468, 468, - 17151, 468, 14440, 17151, 17151, 12738, -1000, 169, 17151, -1000, - 628, -1000, 204, -1000, -131, 177, -1000, 177, 490, 485, - -1000, 712, 604, -1000, 256, 17151, 17151, -1000, -1000, 803, - 803, 803, 803, 83, 426, -1000, 803, 803, 468, 589, - 990, -1000, 712, -1000, 761, 142, -1000, -1000, -1000, 616, - 607, -1000, 607, 607, 170, 169, -1000, 561, 250, 442, - -1000, 69, 17151, 331, 923, -1000, 920, -1000, -1000, -1000, - -1000, -1000, 47, 6264, 4509, 597, -1000, -1000, -1000, -1000, - -1000, 426, 54, -175, -1000, -1000, -1000, 17151, 529, 426, - 17151, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 364, -1000, - -1000, 17151, -1000, -1000, 408, -1000, -1000, 592, -1000, 17151, - -1000, -1000, 726, -1000, 839, -167, -178, 443, -1000, -1000, - -1000, 713, -1000, -1000, 47, 862, -169, -1000, 829, -1000, - 17151, -1000, 44, -1000, -170, 526, 41, -176, 794, 712, - -179, 791, -1000, 980, 10371, -1000, -1000, 989, 181, 181, - 803, 426, -1000, -1000, -1000, 75, 439, -1000, -1000, -1000, - -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17294, -1000, + -1000, -1000, -1000, -1000, 17294, -168, 572, 17294, 17294, 17294, + 17294, -1000, 352, 352, -1000, 10840, 1974, 1974, -1000, -1000, + 535, -1000, 535, 792, 792, -1000, 792, 797, -1000, 792, + 2, 792, 0, 535, 535, 1918, 1902, 1654, 890, 702, + -156, -1000, 480, 9826, -1000, 1300, 1215, 889, 480, 480, + -1000, -1000, 1023, 1008, 480, -1000, -1000, 974, 580, 598, + -1000, -1000, 8124, 627, 179, 622, -1000, 1021, 17294, 9826, + -1000, -1000, 9826, 794, -1000, 9826, -1000, -1000, -1000, 702, + 702, 702, 622, 1005, -1000, -1000, -1000, -1000, 3951, -1000, + 611, -1000, 792, -1000, -1000, -1000, 17294, -57, 1049, 1974, + -1000, -1000, -1000, -1000, -1000, -20, 512, -20, 494, -1000, + 476, 4653, -1000, -1000, -1000, -1000, 977, -1000, 6057, -1000, + -1000, 789, 825, -1000, -1000, -1000, -1000, 1974, -1000, -1000, + -1000, 114, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 10840, 10840, 10840, 10840, 10840, 1005, 511, 480, 10840, 10840, + -1000, -1000, 9826, 9826, 952, -1000, 702, -1000, 724, 17294, + 17294, -1000, 17294, 1005, -1000, 480, 480, 17294, 480, 14583, + 17294, 17294, 12531, -1000, 200, 17294, -1000, 602, -1000, 208, + -1000, -86, 219, -1000, 219, 571, 556, -1000, 702, 616, + -1000, 354, 17294, 17294, -1000, -1000, 844, 844, 844, 844, + 48, 535, -1000, 844, 844, 480, 613, 1048, -1000, 702, + 1060, 178, -1000, -1000, -1000, 588, 582, -1000, 582, 582, + 227, 200, -1000, 572, 299, 507, -1000, 74, 17294, 401, + 935, -1000, 933, -1000, -1000, -1000, -1000, -1000, 59, 6057, + 4302, 567, -1000, -1000, -1000, -1000, -1000, 535, 53, -175, + -1000, -1000, -1000, 17294, 598, 17294, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 454, -1000, -1000, 17294, -1000, -1000, 481, + -1000, -1000, 551, -1000, 17294, -1000, -1000, 802, -1000, 885, + -166, -181, 560, -1000, -1000, 723, -1000, -1000, 59, 900, + -168, -1000, 883, -1000, 17294, -1000, 55, -1000, -172, 543, + 41, -179, 829, 702, -182, 727, -1000, 1039, 10164, -1000, + -1000, 1047, 198, 198, 844, 535, -1000, -1000, -1000, 81, + 444, -1000, -1000, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1235, 15, 500, 1232, 1230, 1228, 1227, 1226, 92, - 91, 90, 1224, 1223, 1221, 1220, 1219, 1215, 1214, 1213, - 1209, 1205, 1203, 1202, 1201, 1200, 1199, 1198, 1197, 1196, - 80, 1195, 1194, 1192, 1191, 1189, 1188, 1187, 1185, 1184, - 1183, 44, 198, 57, 58, 1182, 55, 83, 1179, 63, - 82, 67, 1178, 38, 1176, 1175, 68, 1174, 1172, 54, - 1168, 1165, 100, 1164, 87, 1163, 11, 40, 1160, 1159, - 1158, 1155, 74, 163, 1154, 1153, 17, 1152, 1149, 93, - 1148, 62, 36, 14, 13, 31, 1147, 1131, 6, 1146, - 61, 1145, 1144, 1143, 1138, 26, 1137, 60, 1136, 21, - 59, 1135, 12, 66, 32, 20, 7, 1134, 1133, 22, - 71, 52, 65, 1132, 1130, 560, 1129, 1128, 45, 1126, - 1125, 1124, 30, 1123, 99, 514, 1121, 1120, 1119, 1116, - 56, 1027, 1934, 25, 85, 1115, 1114, 1112, 2708, 43, - 53, 18, 1111, 29, 46, 49, 1109, 1105, 33, 1103, - 1102, 1098, 1096, 1095, 1092, 1077, 104, 1073, 1067, 1065, - 34, 23, 1061, 1060, 64, 24, 1054, 1053, 1052, 50, - 70, 1051, 1050, 51, 1049, 1043, 27, 1036, 1031, 1030, - 1023, 1022, 37, 10, 1021, 19, 1018, 9, 1016, 28, - 1012, 4, 1010, 8, 1009, 3, 0, 1008, 5, 48, - 1, 1007, 2, 1006, 1005, 1340, 1113, 75, 991, 86, + 0, 1342, 96, 25, 605, 1338, 1325, 1311, 1302, 87, + 86, 85, 1301, 1299, 1296, 1295, 1292, 1287, 1285, 1284, + 1283, 1277, 1276, 1275, 1274, 1272, 1271, 1270, 1269, 1268, + 82, 1267, 1264, 1263, 1262, 1256, 1254, 1253, 1252, 1251, + 1250, 44, 940, 52, 60, 1248, 57, 1343, 1247, 95, + 65, 62, 1246, 40, 1245, 1244, 80, 1243, 1240, 56, + 1238, 1234, 51, 1231, 77, 1227, 11, 37, 1224, 1223, + 1222, 1221, 69, 164, 1219, 1218, 15, 1216, 1212, 101, + 1210, 63, 21, 13, 20, 17, 1208, 981, 7, 1204, + 61, 1203, 1198, 1196, 1195, 28, 1194, 30, 1193, 18, + 59, 1192, 33, 70, 32, 19, 14, 1191, 1190, 16, + 66, 48, 68, 1189, 1187, 543, 1186, 1184, 45, 1183, + 1182, 1180, 46, 1177, 100, 504, 1174, 1171, 1167, 1166, + 36, 886, 1883, 12, 89, 1160, 1154, 1153, 2527, 49, + 55, 22, 1150, 58, 73, 43, 1148, 1145, 38, 1144, + 1143, 1142, 1140, 1138, 1129, 1127, 309, 1125, 1124, 1123, + 34, 24, 1122, 1121, 64, 29, 1116, 1114, 1113, 53, + 67, 1107, 1106, 54, 1104, 1099, 27, 1098, 1097, 1093, + 1089, 1088, 31, 6, 1087, 10, 1086, 9, 1085, 23, + 1083, 2, 1081, 8, 1079, 3, 0, 1078, 5, 50, + 1, 1071, 4, 1070, 1069, 1542, 199, 79, 1068, 94, } var yyR1 = [...]int{ 0, 203, 204, 204, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 196, 196, 196, - 20, 2, 2, 2, 8, 3, 4, 4, 5, 5, + 20, 3, 3, 3, 3, 2, 8, 4, 5, 5, 9, 9, 33, 33, 10, 11, 11, 11, 11, 207, 207, 56, 56, 57, 57, 103, 103, 12, 13, 13, 112, 112, 111, 111, 111, 113, 113, 113, 113, 146, @@ -2918,14 +2910,13 @@ var yyR1 = [...]int{ 88, 72, 72, 72, 72, 72, 72, 72, 72, 74, 74, 74, 93, 93, 94, 94, 95, 95, 96, 96, 97, 98, 98, 98, 99, 99, 99, 99, 100, 100, - 100, 71, 71, 71, 71, 71, 71, 101, 101, 101, - 101, 105, 105, 83, 83, 85, 85, 84, 86, 106, - 106, 109, 107, 107, 107, 110, 110, 110, 110, 108, - 108, 108, 137, 137, 137, 114, 114, 124, 124, 125, - 125, 115, 115, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 127, 127, 127, 128, 128, 129, 129, - 129, 136, 136, 132, 132, 133, 133, 138, 138, 139, - 139, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 100, 71, 71, 71, 71, 101, 101, 101, 101, 105, + 105, 83, 83, 85, 85, 84, 86, 106, 106, 109, + 107, 107, 107, 110, 110, 110, 110, 108, 108, 108, + 137, 137, 137, 114, 114, 124, 124, 125, 125, 115, + 115, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 127, 127, 127, 128, 128, 129, 129, 129, 136, + 136, 132, 132, 133, 133, 138, 138, 139, 139, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, @@ -2936,8 +2927,8 @@ var yyR1 = [...]int{ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2954,14 +2945,15 @@ var yyR1 = [...]int{ 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 205, 206, 143, 144, 144, 144, + 131, 131, 131, 131, 131, 131, 131, 131, 205, 206, + 143, 144, 144, 144, } var yyR2 = [...]int{ 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 2, 4, 6, 7, 5, 8, 1, 3, 1, 3, + 2, 1, 6, 6, 7, 4, 5, 8, 1, 3, 7, 8, 1, 1, 9, 8, 7, 6, 6, 1, 1, 1, 3, 1, 3, 0, 4, 3, 5, 4, 1, 3, 3, 2, 2, 2, 2, 2, 1, 1, @@ -3020,14 +3012,13 @@ var yyR2 = [...]int{ 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 3, 0, 2, 0, 3, 1, 3, 2, 0, 1, 1, 0, 2, 4, 4, 0, 2, - 4, 2, 1, 3, 5, 4, 6, 1, 3, 3, - 5, 0, 5, 1, 3, 1, 2, 3, 1, 1, - 3, 3, 1, 2, 3, 3, 3, 3, 3, 1, - 2, 1, 1, 1, 1, 1, 1, 0, 2, 0, - 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, - 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, + 4, 2, 1, 5, 4, 1, 3, 3, 5, 0, + 5, 1, 3, 1, 2, 3, 1, 1, 3, 3, + 1, 2, 3, 3, 3, 3, 3, 1, 2, 1, + 1, 1, 1, 1, 1, 0, 2, 0, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3056,331 +3047,330 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -203, -1, -2, -8, -9, -10, -11, -12, -13, + -1000, -203, -1, -3, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -23, -24, -25, -27, -28, - -29, -6, -26, -19, -20, -3, -4, 6, 7, -33, + -29, -6, -26, -19, -20, -2, -205, 6, 7, -33, 9, 10, 30, -21, 122, 123, 125, 124, 158, 126, 151, 53, 172, 173, 175, 176, -36, 156, 157, 31, - 32, 128, 34, -205, 8, 258, 153, 152, 25, 57, - -204, 360, -95, 15, -32, 5, -30, -208, -30, -30, - -30, -30, -30, -178, -180, 57, 95, -129, 132, 77, - 250, 129, 130, 136, -132, -196, -131, 60, 61, 62, - 268, 144, 300, 301, 172, 183, 177, 204, 196, 269, - 302, 145, 194, 197, 237, 142, 303, 224, 231, 71, - 175, 246, 304, 154, 192, 188, 305, 277, 186, 27, - 306, 233, 209, 307, 273, 235, 187, 232, 128, 308, - 147, 140, 309, 210, 214, 310, 238, 311, 312, 313, - 181, 182, 314, 143, 240, 208, 141, 33, 270, 37, - 162, 241, 212, 315, 207, 203, 316, 317, 318, 319, - 206, 180, 202, 41, 216, 215, 217, 236, 199, 320, - 321, 322, 148, 323, 189, 18, 324, 325, 326, 327, - 328, 244, 157, 329, 160, 330, 331, 332, 333, 334, - 335, 234, 211, 213, 137, 164, 272, 336, 242, 185, - 337, 149, 161, 156, 245, 150, 338, 339, 340, 341, - 342, 343, 344, 176, 345, 346, 347, 348, 171, 239, - 248, 40, 221, 349, 179, 139, 350, 173, 168, 226, - 200, 163, 351, 352, 190, 191, 205, 178, 201, 174, - 165, 158, 353, 247, 222, 274, 198, 195, 169, 354, - 166, 167, 355, 227, 228, 170, 271, 243, 193, 223, - -115, 132, 250, 129, 228, 134, 130, 130, 131, 132, - 250, 129, 130, -62, -138, -196, -131, 132, 130, 113, - 197, 237, 122, 225, 233, -121, 234, 164, -147, 130, - -117, 224, 227, 228, 170, -196, 235, 239, 238, 229, - -138, 174, -62, -34, 356, 126, -143, -143, 226, 226, - -143, -82, -47, -68, 79, -73, 29, 23, -72, -69, - -88, -86, -87, 113, 114, 116, 115, 117, 102, 103, - 110, 80, 118, -77, -75, -76, -78, 64, 63, 72, - 65, 66, 67, 68, 73, 74, 75, -132, -138, -84, - -205, 47, 48, 259, 260, 261, 262, 267, 263, 82, - 36, 249, 257, 256, 255, 253, 254, 251, 252, 265, - 266, 135, 250, 129, 108, 258, -196, -131, -2, -99, - 17, 16, -5, -3, -205, 6, 20, 21, -38, -45, - 42, 43, -46, 21, 35, 46, 44, -31, -44, 104, - -47, -138, -115, -115, 11, -56, -57, -62, -64, -138, - -107, -146, 174, -110, 239, 238, -133, -108, -132, -130, - 237, 197, 236, 127, 275, 78, 22, 24, 219, 81, - 113, 16, 82, 112, 259, 122, 51, 276, 251, 252, - 249, 261, 262, 250, 225, 29, 10, 278, 25, 152, - 21, 35, 106, 124, 85, 86, 155, 23, 153, 75, - 281, 19, 54, 11, 13, 282, 283, 14, 135, 134, - 97, 131, 49, 8, 118, 26, 94, 45, 284, 28, - 285, 286, 287, 288, 47, 95, 17, 253, 254, 31, - 289, 267, 159, 108, 52, 38, 79, 290, 291, 73, - 292, 76, 55, 77, 15, 50, 293, 294, 295, 296, - 96, 125, 258, 48, 297, 129, 6, 264, 30, 151, - 46, 298, 130, 84, 265, 266, 133, 74, 5, 136, - 32, 9, 53, 56, 255, 256, 257, 36, 83, 12, - 299, -179, 95, -170, -196, -62, 131, -62, 258, -125, - 135, -125, -125, 130, -62, -196, -196, 122, 124, 127, - 55, -22, -62, -124, 135, -196, -124, -124, -124, -62, - 119, -62, -196, 30, -122, 95, 12, 250, -196, 164, - 130, 165, 132, -144, -205, -133, -174, 131, 33, 143, - -144, 168, 169, -144, -120, -119, 231, 232, 226, 230, - 12, 169, 226, 167, -144, -35, -132, 64, -7, -2, - -10, -9, -11, 87, -143, -143, 58, 78, 77, 94, - -47, -70, 97, 79, 95, 96, 81, 99, 98, 109, - 102, 103, 104, 105, 106, 107, 108, 100, 101, 112, - 87, 88, 89, 90, 91, 92, 93, -116, -205, -87, - -205, 120, 121, -73, -73, -73, -73, -73, -73, -73, - -73, -73, -73, -205, 119, -2, -82, -205, -205, -205, - -205, -205, -205, -205, -205, -205, -91, -47, -205, -209, - -79, -205, -209, -79, -209, -79, -209, -205, -209, -79, - -209, -79, -209, -209, -79, -205, -205, -205, -205, -205, - -205, -205, -206, 59, -100, 19, 31, -47, -96, -97, - -47, -95, -2, -30, 38, -42, -44, -46, 42, 43, - 70, 11, -135, -134, 22, -132, 64, 119, -63, 26, - -62, -49, -50, -51, -52, -65, -87, -205, -62, -62, - -56, -207, 58, 11, 56, -207, 58, 119, 58, 174, - -110, -112, -111, 240, 242, 87, -137, -132, 64, 29, - 30, 59, 58, -62, -149, -152, -154, -153, -155, -150, - -151, 194, 195, 113, 198, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 30, 154, 190, 191, 192, - 193, 210, 211, 212, 213, 214, 215, 216, 217, 177, - 196, 269, 178, 179, 180, 181, 182, 183, 185, 186, - 187, 188, 189, -196, -144, 132, -196, 79, -196, -62, - -62, -144, -144, -144, 166, 166, 130, 130, 171, -62, - 58, 133, -56, 23, 55, -62, -196, -196, -139, -138, - -130, -144, -122, 64, -47, -144, -144, -144, -62, -144, - -144, -175, 11, 97, -144, -144, 11, -118, 11, 97, - -47, -123, 95, 55, 208, 357, 358, 359, -47, -47, - -47, -80, 73, 79, 74, 75, -73, -81, -84, -87, - 69, 97, 95, 96, 81, -73, -73, -73, -73, -73, + 32, 128, 34, -4, 57, 8, 258, 153, 152, 25, + -204, 360, -32, 5, -3, -30, -208, -30, -30, -30, + -30, -30, -178, -180, 57, 95, -129, 132, 77, 250, + 129, 130, 136, -132, -196, -131, 60, 61, 62, 268, + 144, 300, 301, 172, 183, 177, 204, 196, 269, 302, + 145, 194, 197, 237, 142, 303, 224, 231, 71, 175, + 246, 304, 154, 192, 188, 305, 277, 186, 27, 306, + 233, 209, 307, 273, 235, 187, 232, 128, 308, 147, + 140, 309, 210, 214, 310, 238, 311, 312, 313, 181, + 182, 314, 143, 240, 208, 141, 33, 270, 37, 162, + 241, 212, 315, 207, 203, 316, 317, 318, 319, 206, + 180, 202, 41, 216, 215, 217, 236, 199, 320, 321, + 322, 148, 323, 189, 18, 324, 325, 326, 327, 328, + 244, 157, 329, 160, 330, 331, 332, 333, 334, 335, + 234, 211, 213, 137, 164, 272, 336, 242, 185, 337, + 149, 161, 156, 245, 150, 338, 339, 340, 341, 342, + 343, 344, 176, 345, 346, 347, 348, 171, 239, 248, + 40, 221, 349, 179, 139, 350, 173, 168, 226, 200, + 163, 351, 352, 190, 191, 205, 178, 201, 174, 165, + 158, 353, 247, 222, 274, 198, 195, 169, 354, 166, + 167, 355, 227, 228, 170, 271, 243, 193, 223, -115, + 132, 250, 129, 228, 134, 130, 130, 131, 132, 250, + 129, 130, -62, -138, -196, -131, 132, 130, 113, 197, + 237, 122, 225, 233, -121, 234, 164, -147, 130, -117, + 224, 227, 228, 170, -196, 235, 239, 238, 229, -138, + 174, -62, -34, 356, 126, -143, -143, 226, 226, -143, + -82, -47, -68, 79, -73, 29, 23, -72, -69, -88, + -86, -87, 113, 114, 116, 115, 117, 102, 103, 110, + 80, 118, -77, -75, -76, -78, 64, 63, 72, 65, + 66, 67, 68, 73, 74, 75, -132, -138, -84, -205, + 47, 48, 259, 260, 261, 262, 267, 263, 82, 36, + 249, 257, 256, 255, 253, 254, 251, 252, 265, 266, + 135, 250, 129, 108, 258, -196, -131, -95, 15, -5, + -4, -205, 6, 20, 21, -206, 59, -38, -45, 42, + 43, -46, 21, 35, 46, 44, -31, -44, 104, -47, + -138, -115, -115, 11, -56, -57, -62, -64, -138, -107, + -146, 174, -110, 239, 238, -133, -108, -132, -130, 237, + 197, 236, 127, 275, 78, 22, 24, 219, 81, 113, + 16, 82, 112, 259, 122, 51, 276, 251, 252, 249, + 261, 262, 250, 225, 29, 10, 278, 25, 152, 21, + 35, 106, 124, 85, 86, 155, 23, 153, 75, 281, + 19, 54, 11, 13, 282, 283, 14, 135, 134, 97, + 131, 49, 8, 118, 26, 94, 45, 284, 28, 285, + 286, 287, 288, 47, 95, 17, 253, 254, 31, 289, + 267, 159, 108, 52, 38, 79, 290, 291, 73, 292, + 76, 55, 77, 15, 50, 293, 294, 295, 296, 96, + 125, 258, 48, 297, 129, 6, 264, 30, 151, 46, + 298, 130, 84, 265, 266, 133, 74, 5, 136, 32, + 9, 53, 56, 255, 256, 257, 36, 83, 12, 299, + -179, 95, -170, -196, -62, 131, -62, 258, -125, 135, + -125, -125, 130, -62, -196, -196, 122, 124, 127, 55, + -22, -62, -124, 135, -196, -124, -124, -124, -62, 119, + -62, -196, 30, -122, 95, 12, 250, -196, 164, 130, + 165, 132, -144, -205, -133, -174, 131, 33, 143, -144, + 168, 169, -144, -120, -119, 231, 232, 226, 230, 12, + 169, 226, 167, -144, -35, -132, 64, -7, -3, -10, + -9, -11, 87, -143, -143, 58, 78, 77, 94, -47, + -70, 97, 79, 95, 96, 81, 99, 98, 109, 102, + 103, 104, 105, 106, 107, 108, 100, 101, 112, 87, + 88, 89, 90, 91, 92, 93, -116, -205, -87, -205, + 120, 121, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -73, -205, 119, -2, -82, -205, -205, -205, -205, + -205, -205, -205, -205, -91, -47, -205, -209, -79, -205, + -209, -79, -209, -79, -209, -205, -209, -79, -209, -79, + -209, -209, -79, -205, -205, -205, -205, -205, -205, -205, + -99, 17, 16, -95, -3, -30, -95, 38, -42, -44, + -46, 42, 43, 70, 11, -135, -134, 22, -132, 64, + 119, -63, 26, -62, -49, -50, -51, -52, -65, -87, + -205, -62, -62, -56, -207, 58, 11, 56, -207, 58, + 119, 58, 174, -110, -112, -111, 240, 242, 87, -137, + -132, 64, 29, 30, 59, 58, -62, -149, -152, -154, + -153, -155, -150, -151, 194, 195, 113, 198, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 30, 154, + 190, 191, 192, 193, 210, 211, 212, 213, 214, 215, + 216, 217, 177, 196, 269, 178, 179, 180, 181, 182, + 183, 185, 186, 187, 188, 189, -196, -144, 132, -196, + 79, -196, -62, -62, -144, -144, -144, 166, 166, 130, + 130, 171, -62, 58, 133, -56, 23, 55, -62, -196, + -196, -139, -138, -130, -144, -122, 64, -47, -144, -144, + -144, -62, -144, -144, -175, 11, 97, -144, -144, 11, + -118, 11, 97, -47, -123, 95, 55, 208, 357, 358, + 359, -47, -47, -47, -80, 73, 79, 74, 75, -73, + -81, -84, -87, 69, 97, 95, 96, 81, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, - -145, -196, 64, -196, -72, -72, -132, -43, 21, 35, - -42, -133, -139, -130, -206, -206, -2, -42, -42, -47, - -47, -88, 64, -42, -88, 64, -42, -42, -37, 21, - 35, -89, -90, 83, -88, -132, -138, -206, -73, -132, - -132, -42, -43, -43, -42, -42, 9, 97, 58, 18, - 58, -98, 24, 25, -99, -206, -74, -132, 65, 68, - -48, 58, 11, -46, -62, -134, 104, -139, -103, 160, - -62, 30, 58, -58, -60, -59, -61, 45, 49, 51, - 46, 47, 48, 52, -142, 22, -49, -205, -141, 160, - -140, 22, -138, 64, -103, 56, -49, -62, -49, -64, - -138, 104, -110, -112, 58, 241, 243, 244, 55, 76, - -47, -161, 112, -181, -182, -183, -133, 64, 65, -170, - -171, -172, -184, 146, -189, 137, 139, 136, -173, 147, - 131, 28, 59, -166, 73, 79, -162, 222, -156, 57, - -156, -156, -156, -156, -160, 197, -160, -160, -160, 57, - 57, -156, -156, -156, -164, 57, -164, -164, -165, 57, - -165, -136, 56, -62, -144, 23, -144, -126, 127, 124, - 125, -192, 123, 219, 197, 71, 29, 15, 259, 160, - 274, -196, 161, -62, -62, -62, -62, -62, 127, 124, - -62, -62, -62, -144, -62, -62, -122, -138, -138, 64, - -62, 73, 74, 75, -81, -73, -73, -73, -41, 155, - 78, -206, -206, -42, -42, -205, 119, -206, -206, -206, + -73, -73, -73, -145, -196, 64, -196, -72, -72, -132, + -43, 21, 35, -42, -133, -139, -130, -206, -206, -42, + -42, -47, -47, -88, 64, -42, -88, 64, -42, -42, + -37, 21, 35, -89, -90, 83, -88, -132, -138, -206, + -73, -132, -132, -42, -43, -43, -42, -42, -100, 19, + 31, -47, -96, -97, -47, -99, -206, -99, -74, -132, + 65, 68, -48, 58, 11, -46, -62, -134, 104, -139, + -103, 160, -62, 30, 58, -58, -60, -59, -61, 45, + 49, 51, 46, 47, 48, 52, -142, 22, -49, -141, + 160, -140, 22, -138, 64, -103, 56, -49, -62, -49, + -64, -138, 104, -110, -112, 58, 241, 243, 244, 55, + 76, -47, -161, 112, -181, -182, -183, -133, 64, 65, + -170, -171, -172, -184, 146, -189, 137, 139, 136, -173, + 147, 131, 28, 59, -166, 73, 79, -162, 222, -156, + 57, -156, -156, -156, -156, -160, 197, -160, -160, -160, + 57, 57, -156, -156, -156, -164, 57, -164, -164, -165, + 57, -165, -136, 56, -62, -144, 23, -144, -126, 127, + 124, 125, -192, 123, 219, 197, 71, 29, 15, 259, + 160, 274, -196, 161, -62, -62, -62, -62, -62, 127, + 124, -62, -62, -62, -144, -62, -62, -122, -138, -138, + 64, -62, 73, 74, 75, -81, -73, -73, -73, -41, + 155, 78, -206, -206, -42, -42, -205, 119, -206, -206, 58, 56, 22, 11, 11, -206, 11, 11, -206, -206, -42, -92, -90, 85, -47, -206, 119, -206, 58, 58, - -206, -206, -206, -206, -206, 40, -47, -47, -97, -100, - -114, 19, 11, 36, 36, -67, 12, -44, -49, -46, - 119, -71, 30, 36, -2, -205, -205, -106, -109, -88, - -50, -51, -51, -50, -51, 45, 45, 45, 50, 45, - 50, 45, -59, -138, -206, -66, 53, 134, 54, -205, - -140, -67, -49, -67, -67, 119, -111, -113, 245, 242, - 248, -196, 64, 58, -183, 87, 57, -196, 28, -173, - -173, -176, -196, -176, 28, -158, 29, 73, -163, 223, - 65, -160, -160, -161, 30, -161, -161, -161, -169, 64, - -169, 65, 65, 55, -132, -144, -143, -199, 142, 138, - 146, 147, 140, 60, 61, 62, 131, 28, 137, 139, - 160, 136, -199, -127, -128, 133, 22, 131, 28, 160, - -198, 56, 166, 219, 166, 133, -144, -118, -118, -41, - 78, -73, -73, -206, -206, -43, -133, -148, 113, 194, - 154, 192, 188, 208, 199, 221, 190, 222, -145, -148, - -73, -73, -73, -73, 268, -95, 86, -47, 84, -133, - -73, -73, 41, -62, -93, 13, -47, 104, -105, 55, - -106, -83, -85, -84, -205, -2, -101, -132, -104, -132, - -67, 58, 87, -54, -53, 55, 56, -55, 55, -53, - 45, 45, 131, 131, 131, -104, -95, -67, 242, 246, - 247, -182, -183, -186, -185, -132, -189, -176, -176, 57, - -159, 55, -73, 59, -161, -161, -196, 113, 59, 58, - 59, 58, 59, 58, -62, -143, -143, -62, -143, -132, - -195, 271, -197, -196, -132, -132, -132, -62, -122, -122, - -73, -206, -206, -156, -156, -156, -165, -156, 182, -156, - 182, -206, -206, 19, 19, 19, 19, -205, -40, 264, - -47, 58, 58, -94, 14, 16, 27, -105, 58, -206, - -206, -206, 58, 119, -206, 58, -95, -109, -47, -47, - 57, -47, -205, -205, -205, -206, -99, 59, 58, -156, - -102, -132, -167, 219, 9, -160, 64, -160, 65, 65, - -144, 26, -194, -193, -133, 57, 56, -160, -196, -73, - -73, -73, -73, -73, -99, 64, -73, -73, -47, -82, - 28, -85, 36, -2, -205, -132, -132, -132, -99, -102, - -102, -206, -102, -102, -141, -188, -187, 56, 141, 71, - -185, 59, 58, -168, 137, 28, 136, -76, -161, -161, - 59, 59, -205, 58, 87, -102, -62, -206, -206, -206, - -206, -39, 97, 271, -206, -206, -206, 9, -83, -2, - 119, 59, -206, -206, -206, -66, -187, -196, -177, 87, - 64, 149, -132, -157, 71, 28, 28, -190, -191, 160, - -193, -183, 59, -206, 269, 52, 272, -106, -206, -132, - 65, -62, 64, -206, 58, -132, -198, 41, 270, 273, - 57, -191, 36, -195, 41, -102, 162, 271, 59, 163, - 272, -201, -202, 55, -205, 273, -202, 55, 10, 9, - -73, 159, -200, 150, 145, 148, 30, -200, -206, -206, - 144, 29, 73, + -206, -206, -206, -206, -206, 9, 97, 58, 18, 58, + -98, 24, 25, -100, -100, -114, 19, 11, 36, 36, + -67, 12, -44, -49, -46, 119, -71, 30, 36, -3, + -205, -205, -106, -109, -88, -50, -51, -51, -50, -51, + 45, 45, 45, 50, 45, 50, 45, -59, -138, -206, + -66, 53, 134, 54, -205, -140, -67, -49, -67, -67, + 119, -111, -113, 245, 242, 248, -196, 64, 58, -183, + 87, 57, -196, 28, -173, -173, -176, -196, -176, 28, + -158, 29, 73, -163, 223, 65, -160, -160, -161, 30, + -161, -161, -161, -169, 64, -169, 65, 65, 55, -132, + -144, -143, -199, 142, 138, 146, 147, 140, 60, 61, + 62, 131, 28, 137, 139, 160, 136, -199, -127, -128, + 133, 22, 131, 28, 160, -198, 56, 166, 219, 166, + 133, -144, -118, -118, -41, 78, -73, -73, -206, -206, + -43, -133, -148, 113, 194, 154, 192, 188, 208, 199, + 221, 190, 222, -145, -148, -73, -73, -73, -73, 268, + -95, 86, -47, 84, -133, -73, -73, 40, -47, -47, + -97, -62, -93, 13, -47, 104, -105, 55, -106, -83, + -85, -84, -205, -101, -132, -104, -132, -67, 58, 87, + -54, -53, 55, 56, -55, 55, -53, 45, 45, 131, + 131, 131, -104, -95, -67, 242, 246, 247, -182, -183, + -186, -185, -132, -189, -176, -176, 57, -159, 55, -73, + 59, -161, -161, -196, 113, 59, 58, 59, 58, 59, + 58, -62, -143, -143, -62, -143, -132, -195, 271, -197, + -196, -132, -132, -132, -62, -122, -122, -73, -206, -206, + -156, -156, -156, -165, -156, 182, -156, 182, -206, -206, + 19, 19, 19, 19, -205, -40, 264, -47, 58, 58, + 41, -94, 14, 16, 27, -105, 58, -206, -206, 58, + 119, -206, 58, -95, -109, -47, -47, 57, -47, -205, + -205, -205, -206, -99, 59, 58, -156, -102, -132, -167, + 219, 9, -160, 64, -160, 65, 65, -144, 26, -194, + -193, -133, 57, 56, -160, -196, -73, -73, -73, -73, + -73, -99, 64, -73, -73, -47, -82, 28, -85, 36, + -3, -132, -132, -132, -99, -102, -102, -206, -102, -102, + -141, -188, -187, 56, 141, 71, -185, 59, 58, -168, + 137, 28, 136, -76, -161, -161, 59, 59, -205, 58, + 87, -102, -62, -206, -206, -206, -206, -39, 97, 271, + -206, -206, -206, 9, -83, 119, 59, -206, -206, -206, + -66, -187, -196, -177, 87, 64, 149, -132, -157, 71, + 28, 28, -190, -191, 160, -193, -183, 59, -206, 269, + 52, 272, -106, -132, 65, -62, 64, -206, 58, -132, + -198, 41, 270, 273, 57, -191, 36, -195, 41, -102, + 162, 271, 59, 163, 272, -201, -202, 55, -205, 273, + -202, 55, 10, 9, -73, 159, -200, 150, 145, 148, + 30, -200, -206, -206, 144, 29, 73, } var yyDef = [...]int{ - 26, -2, 2, -2, 5, 6, 7, 8, 9, 10, + 26, -2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 606, 0, 348, 348, 348, - 348, 348, 348, 0, 678, 661, 0, 0, 0, 0, - -2, 320, 321, 0, 323, 324, 325, 982, 982, 0, - 0, 982, 0, 0, 42, 43, 331, 332, 333, 980, - 1, 3, 614, 0, 0, 352, -2, 350, 0, 661, - 661, 0, 0, 71, 72, 0, 0, 0, 969, 0, - 659, 659, 659, 679, 680, 683, 684, 27, 28, 29, - 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, - 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, - 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, - 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, - 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, - 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, - 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, - 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, - 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, - 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, - 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, - 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, - 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, - 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, - 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, - 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 0, 0, 0, 0, 0, 662, 0, 657, 0, 657, - 657, 657, 0, 271, 430, 687, 688, 969, 0, 0, - 0, 311, 0, 983, 283, 0, 285, 983, 0, 983, - 0, 292, 0, 0, 298, 983, 303, 317, 318, 305, - 319, 322, 338, 0, 0, 330, 343, 344, 982, 982, - 347, 30, 480, 440, 0, 445, 447, 0, 482, 483, - 484, 485, 486, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 512, 513, 514, 515, 591, 592, 593, - 594, 595, 596, 597, 598, 449, 450, 588, 0, 638, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 579, - 0, 549, 549, 549, 549, 549, 549, 549, 549, 0, - 0, 0, 0, 0, 0, 0, -2, -2, 36, 618, - 0, 0, 606, 38, 0, 348, 353, 354, 0, 0, - -2, -2, 364, 370, 371, 372, 373, 349, 0, 376, - 380, 0, 0, 0, 0, 0, 0, 51, 53, 430, - 57, 0, 958, 642, -2, -2, 0, 0, 685, 686, - -2, 822, -2, 691, 692, 693, 694, 695, 696, 697, - 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, - 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, - 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, - 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, - 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, - 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, - 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, - 808, 0, 0, 90, 0, 88, 0, 983, 0, 0, - 0, 0, 0, 0, 983, 983, 983, 0, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 270, - 0, 272, 983, 311, 275, 0, 0, 983, 983, 983, - 0, 983, 983, 282, 984, 985, 0, 192, 193, 194, - 286, 983, 983, 288, 0, 308, 306, 307, 300, 301, - 0, 314, 295, 296, 299, 341, 339, 340, 342, -2, - 335, 336, 337, 0, 345, 346, 0, 0, 0, 0, - 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 467, 468, 469, 470, 471, 472, 473, 446, 0, 460, - 0, 0, 0, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 0, 361, 0, 36, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 358, 0, 580, 0, 533, - 541, 0, 534, 542, 535, 543, 536, 0, 537, 544, - 538, 545, 539, 540, 546, 0, 0, 0, 361, 361, - 0, 0, 37, 981, 31, 0, 0, 615, 607, 608, - 611, 614, 36, 363, 0, 385, 374, 365, 368, 369, - 351, 0, 377, 381, 0, 383, 384, 0, 55, 0, - 429, 0, 387, 389, 390, 391, -2, 0, 413, -2, - 0, 0, 0, 49, 50, 0, 0, 0, 0, 958, - 643, 59, 60, 0, 0, 0, 168, 652, 653, 654, - 650, 217, 0, 0, 156, 152, 96, 97, 98, 145, - 100, 145, 145, 145, 145, 165, 165, 165, 165, 128, - 129, 130, 131, 132, 0, 0, 115, 145, 145, 145, - 119, 135, 136, 137, 138, 139, 140, 141, 142, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 147, 147, - 147, 149, 149, 681, 74, 0, 983, 0, 983, 86, - 0, 231, 233, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 265, 658, 0, 983, 268, 269, 431, 689, - 690, 273, 274, 312, 313, 276, 277, 278, 279, 280, - 281, 0, 195, 196, 287, 291, 0, 311, 0, 0, - 293, 294, 0, 0, 326, 327, 328, 329, 481, 441, - 442, 444, 461, 0, 463, 465, 451, 452, 476, 477, - 478, 0, 0, 0, 0, 474, 456, 0, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 501, 564, 565, 0, 499, 500, 511, 0, 0, 0, - 362, 589, 0, -2, 479, 637, 36, 0, 0, 0, - 0, 484, 591, 0, 484, 591, 0, 0, 0, 359, - 360, 586, 583, 0, 0, 588, 0, 550, 0, 0, - 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, - 0, 610, 612, 613, 618, 39, 0, 599, 0, 0, - 438, 0, 0, 366, 34, 382, 378, 0, 0, 0, - 428, 0, 0, 0, 0, 0, 0, 418, 0, 0, - 421, 0, 0, 0, 0, 412, 0, 0, 433, 903, - 414, 0, 416, 417, 438, 0, 438, 52, 438, 54, - 0, 432, 644, 58, 0, 0, 63, 64, 645, 646, - 647, 648, 0, 87, 218, 220, 223, 224, 225, 91, - 92, 93, 0, 0, 205, 0, 0, 199, 199, 0, - 197, 198, 89, 159, 157, 0, 154, 153, 99, 0, - 165, 165, 122, 123, 168, 0, 168, 168, 168, 0, - 0, 116, 117, 118, 110, 0, 111, 112, 113, 0, - 114, 0, 0, 983, 76, 660, 77, 982, 0, 0, - 673, 232, 663, 664, 665, 666, 667, 668, 669, 670, - 671, 672, 0, 78, 236, 238, 237, 241, 0, 0, - 0, 263, 983, 267, 308, 308, 290, 309, 310, 315, - 297, 462, 464, 466, 453, 474, 457, 0, 454, 0, - 0, 448, 516, 0, 0, 361, 0, -2, 520, 521, + 21, 22, 23, 24, 25, 31, 0, 348, 348, 348, + 348, 348, 348, 0, 676, 659, 0, 0, 0, 0, + -2, 320, 321, 0, 323, 324, 325, 980, 980, 0, + 0, 980, 0, 606, 978, 42, 43, 331, 332, 333, + 1, 3, 0, 352, 0, -2, 350, 0, 659, 659, + 0, 0, 71, 72, 0, 0, 0, 967, 0, 657, + 657, 657, 677, 678, 681, 682, 27, 28, 29, 807, + 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, + 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, + 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, + 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, + 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, + 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, + 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, + 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 0, + 0, 0, 0, 0, 660, 0, 655, 0, 655, 655, + 655, 0, 271, 430, 685, 686, 967, 0, 0, 0, + 311, 0, 981, 283, 0, 285, 981, 0, 981, 0, + 292, 0, 0, 298, 981, 303, 317, 318, 305, 319, + 322, 338, 0, 0, 330, 343, 344, 980, 980, 347, + 30, 480, 440, 0, 445, 447, 0, 482, 483, 484, + 485, 486, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 512, 513, 514, 515, 591, 592, 593, 594, + 595, 596, 597, 598, 449, 450, 588, 0, 636, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, + 549, 549, 549, 549, 549, 549, 549, 549, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 614, 0, 606, + 38, 0, 348, 353, 354, 606, 979, 0, 0, -2, + -2, 364, 370, 371, 372, 373, 349, 0, 376, 380, + 0, 0, 0, 0, 0, 0, 51, 53, 430, 57, + 0, 956, 640, -2, -2, 0, 0, 683, 684, -2, + 820, -2, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, + 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, + 0, 0, 90, 0, 88, 0, 981, 0, 0, 0, + 0, 0, 0, 981, 981, 981, 0, 0, 0, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 270, 0, + 272, 981, 311, 275, 0, 0, 981, 981, 981, 0, + 981, 981, 282, 982, 983, 0, 192, 193, 194, 286, + 981, 981, 288, 0, 308, 306, 307, 300, 301, 0, + 314, 295, 296, 299, 341, 339, 340, 342, 334, 335, + 336, 337, 0, 345, 346, 0, 0, 0, 0, 443, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, + 468, 469, 470, 471, 472, 473, 446, 0, 460, 0, + 0, 0, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 0, 361, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 358, 0, 580, 0, 533, 541, 0, + 534, 542, 535, 543, 536, 0, 537, 544, 538, 545, + 539, 540, 546, 0, 0, 0, 361, 361, 0, 0, + 618, 0, 0, 614, 0, 363, 614, 0, 385, 374, + 365, 368, 369, 351, 0, 377, 381, 0, 383, 384, + 0, 55, 0, 429, 0, 387, 389, 390, 391, -2, + 0, 413, -2, 0, 0, 0, 49, 50, 0, 0, + 0, 0, 956, 641, 59, 60, 0, 0, 0, 168, + 650, 651, 652, 648, 217, 0, 0, 156, 152, 96, + 97, 98, 145, 100, 145, 145, 145, 145, 165, 165, + 165, 165, 128, 129, 130, 131, 132, 0, 0, 115, + 145, 145, 145, 119, 135, 136, 137, 138, 139, 140, + 141, 142, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 147, 147, 147, 149, 149, 679, 74, 0, 981, + 0, 981, 86, 0, 231, 233, 234, 0, 0, 0, + 0, 0, 0, 0, 0, 265, 656, 0, 981, 268, + 269, 431, 687, 688, 273, 274, 312, 313, 276, 277, + 278, 279, 280, 281, 0, 195, 196, 287, 291, 0, + 311, 0, 0, 293, 294, 0, 0, 326, 327, 328, + 329, 481, 441, 442, 444, 461, 0, 463, 465, 451, + 452, 476, 477, 478, 0, 0, 0, 0, 474, 456, + 0, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 501, 564, 565, 0, 499, 500, 511, + 0, 0, 0, 362, 589, 0, -2, 479, 635, 0, + 0, 0, 0, 484, 591, 0, 484, 591, 0, 0, + 0, 359, 360, 586, 583, 0, 0, 588, 0, 550, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 615, 607, 608, 611, 618, 39, 618, 0, 599, + 0, 0, 438, 0, 0, 366, 36, 382, 378, 0, + 0, 0, 428, 0, 0, 0, 0, 0, 0, 418, + 0, 0, 421, 0, 0, 0, 0, 412, 0, 433, + 901, 414, 0, 416, 417, 438, 0, 438, 52, 438, + 54, 0, 432, 642, 58, 0, 0, 63, 64, 643, + 644, 645, 646, 0, 87, 218, 220, 223, 224, 225, + 91, 92, 93, 0, 0, 205, 0, 0, 199, 199, + 0, 197, 198, 89, 159, 157, 0, 154, 153, 99, + 0, 165, 165, 122, 123, 168, 0, 168, 168, 168, + 0, 0, 116, 117, 118, 110, 0, 111, 112, 113, + 0, 114, 0, 0, 981, 76, 658, 77, 980, 0, + 0, 671, 232, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 0, 78, 236, 238, 237, 241, 0, + 0, 0, 263, 981, 267, 308, 308, 290, 309, 310, + 315, 297, 462, 464, 466, 453, 474, 457, 0, 454, + 0, 0, 448, 516, 0, 0, 361, 0, 520, 521, 0, 0, 0, 0, 0, 557, 0, 0, 558, 0, 606, 0, 584, 0, 0, 532, 0, 551, 0, 0, - 552, 553, 554, 555, 556, 0, 616, 617, 609, 32, - 0, 655, 656, 600, 601, 602, 0, 375, 386, 367, - 0, 631, 0, 0, -2, 0, 0, 438, 639, 0, - 388, 407, 409, 0, 404, 419, 420, 422, 0, 424, - 0, 426, 427, 392, 394, 395, 0, 0, 0, 0, - 415, 606, 438, 47, 48, 0, 61, 62, 0, 0, - 68, 169, 170, 0, 221, 0, 0, 0, 187, 199, - 199, 190, 200, 191, 0, 161, 0, 158, 95, 155, - 0, 168, 168, 124, 0, 125, 126, 127, 0, 143, - 0, 0, 0, 0, 682, 75, 226, 982, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 982, 0, 982, 674, 675, 676, 677, 0, - 81, 0, 0, 0, 0, 0, 266, 311, 311, 455, - 0, 475, 458, 517, 518, 0, 590, 0, 145, 145, - 569, 145, 149, 572, 145, 574, 145, 577, 0, 0, - 0, 0, 0, 0, 0, 581, 531, 587, 0, 589, - 0, 0, 620, 33, 604, 0, 439, 379, 40, 0, - 631, 621, 633, 635, 0, 36, 0, 627, 0, 399, - 606, 0, 0, 401, 408, 0, 0, 402, 0, 403, - 423, 425, 0, 0, 0, 0, 614, 46, 65, 66, - 67, 219, 222, 0, 201, 145, 204, 188, 189, 0, - 163, 0, 160, 146, 120, 121, 166, 167, 165, 0, - 165, 0, 150, 0, 983, 227, 228, 229, 230, 0, - 235, 0, 79, 80, 0, 0, 240, 264, 284, 289, - 459, 519, 522, 566, 165, 570, 571, 573, 575, 576, - 578, 524, 523, 0, 0, 0, 0, 0, 614, 0, - 585, 0, 0, 35, 0, 0, 0, 41, 0, 636, - -2, 0, 0, 0, 56, 0, 614, 640, 641, 405, - 0, 410, 0, 0, 0, 413, 45, 179, 0, 203, - 0, 397, 171, 164, 0, 168, 144, 168, 0, 0, - 73, 0, 82, 83, 0, 0, 0, 567, 568, 0, - 0, 0, 0, 559, 0, 582, 0, 0, 605, 603, - 0, 634, 0, -2, 0, 629, 628, 400, 44, 0, - 0, 435, 0, 0, 433, 178, 180, 0, 185, 0, - 202, 0, 0, 176, 0, 173, 175, 162, 133, 134, - 148, 151, 0, 0, 0, 0, 242, 525, 527, 526, - 528, 0, 0, 0, 530, 547, 548, 0, 624, 36, - 0, 406, 434, 436, 437, 396, 181, 182, 0, 186, - 184, 0, 398, 94, 0, 172, 174, 0, 258, 0, - 84, 85, 78, 529, 0, 0, 0, 632, -2, 630, - 183, 0, 177, 257, 0, 0, 81, 560, 0, 563, - 0, 259, 0, 239, 561, 0, 0, 0, 206, 0, - 0, 207, 208, 0, 0, 562, 209, 0, 0, 0, - 0, 0, 210, 212, 213, 0, 0, 211, 260, 261, - 214, 215, 216, + 552, 553, 554, 555, 556, 619, 0, 0, 0, 0, + 610, 612, 613, 33, 32, 0, 653, 654, 600, 601, + 602, 0, 375, 386, 367, 0, 629, 0, 0, 622, + 0, 0, 438, 637, 0, 388, 407, 409, 0, 404, + 419, 420, 422, 0, 424, 0, 426, 427, 392, 394, + 395, 0, 0, 0, 0, 415, 606, 438, 47, 48, + 0, 61, 62, 0, 0, 68, 169, 170, 0, 221, + 0, 0, 0, 187, 199, 199, 190, 200, 191, 0, + 161, 0, 158, 95, 155, 0, 168, 168, 124, 0, + 125, 126, 127, 0, 143, 0, 0, 0, 0, 680, + 75, 226, 980, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 980, 0, 980, + 672, 673, 674, 675, 0, 81, 0, 0, 0, 0, + 0, 266, 311, 311, 455, 0, 475, 458, 517, 518, + 0, 590, 0, 145, 145, 569, 145, 149, 572, 145, + 574, 145, 577, 0, 0, 0, 0, 0, 0, 0, + 581, 531, 587, 0, 589, 0, 0, 0, 616, 617, + 609, 34, 604, 0, 439, 379, 40, 0, 629, 621, + 631, 633, 0, 0, 625, 0, 399, 606, 0, 0, + 401, 408, 0, 0, 402, 0, 403, 423, 425, 0, + 0, 0, 0, 614, 46, 65, 66, 67, 219, 222, + 0, 201, 145, 204, 188, 189, 0, 163, 0, 160, + 146, 120, 121, 166, 167, 165, 0, 165, 0, 150, + 0, 981, 227, 228, 229, 230, 0, 235, 0, 79, + 80, 0, 0, 240, 264, 284, 289, 459, 519, 522, + 566, 165, 570, 571, 573, 575, 576, 578, 524, 523, + 0, 0, 0, 0, 0, 614, 0, 585, 0, 0, + 620, 37, 0, 0, 0, 41, 0, 634, 0, 0, + 0, 56, 0, 614, 638, 639, 405, 0, 410, 0, + 0, 0, 413, 45, 179, 0, 203, 0, 397, 171, + 164, 0, 168, 144, 168, 0, 0, 73, 0, 82, + 83, 0, 0, 0, 567, 568, 0, 0, 0, 0, + 559, 0, 582, 0, 0, 605, 603, 0, 632, 0, + 624, 627, 626, 400, 44, 0, 0, 435, 0, 0, + 433, 178, 180, 0, 185, 0, 202, 0, 0, 176, + 0, 173, 175, 162, 133, 134, 148, 151, 0, 0, + 0, 0, 242, 525, 527, 526, 528, 0, 0, 0, + 530, 547, 548, 0, 623, 0, 406, 434, 436, 437, + 396, 181, 182, 0, 186, 184, 0, 398, 94, 0, + 172, 174, 0, 258, 0, 84, 85, 78, 529, 0, + 0, 0, 630, 628, 183, 0, 177, 257, 0, 0, + 81, 560, 0, 563, 0, 259, 0, 239, 561, 0, + 0, 0, 206, 0, 0, 207, 208, 0, 0, 562, + 209, 0, 0, 0, 0, 0, 210, 212, 213, 0, + 0, 211, 260, 261, 214, 215, 216, } var yyTok1 = [...]int{ @@ -3838,66 +3828,67 @@ yydefault: yyVAL.statement = &OtherAdmin{} } case 31: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:397 { - sel := yyDollar[1].selStmt.(*Select) - sel.OrderBy = yyDollar[2].orderBy - sel.Limit = yyDollar[3].limit - sel.Lock = yyDollar[4].str - yyVAL.selStmt = sel + yyVAL.selStmt = yyDollar[1].selStmt } case 32: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:405 +//line sql.y:401 { - yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} + // TODO(sougou): may potentially need a new AST node for this. + yyVAL.selStmt = nil } case 33: - yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:409 + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:406 { - yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) + yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} } case 34: - yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:415 + yyDollar = yyS[yypt-7 : yypt+1] +//line sql.y:410 { - yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} + yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } case 35: - yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:423 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:433 { - yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereStr, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingStr, yyDollar[8].expr)) + sel := yyDollar[1].selStmt.(*Select) + sel.OrderBy = yyDollar[2].orderBy + sel.Limit = yyDollar[3].limit + sel.Lock = yyDollar[4].str + yyVAL.selStmt = sel } case 36: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:429 + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:443 { - yyVAL.selStmt = yyDollar[1].selStmt + yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} } case 37: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:433 + yyDollar = yyS[yypt-8 : yypt+1] +//line sql.y:451 { - yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} + yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereStr, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingStr, yyDollar[8].expr)) } case 38: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:439 +//line sql.y:457 { yyVAL.selStmt = yyDollar[1].selStmt } case 39: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:443 +//line sql.y:461 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 40: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:450 +//line sql.y:468 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -3911,7 +3902,7 @@ yydefault: } case 41: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:462 +//line sql.y:480 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -3923,186 +3914,186 @@ yydefault: } case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:474 +//line sql.y:492 { yyVAL.str = InsertStr } case 43: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:478 +//line sql.y:496 { yyVAL.str = ReplaceStr } case 44: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:484 +//line sql.y:502 { yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, TableExprs: yyDollar[4].tableExprs, Exprs: yyDollar[6].updateExprs, Where: NewWhere(WhereStr, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } case 45: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:490 +//line sql.y:508 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Partitions: yyDollar[5].partitions, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} } case 46: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:494 +//line sql.y:512 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereStr, yyDollar[7].expr)} } case 47: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:498 +//line sql.y:516 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } case 48: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:502 +//line sql.y:520 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } case 49: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:507 +//line sql.y:525 { } case 50: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:508 +//line sql.y:526 { } case 51: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:512 +//line sql.y:530 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 52: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:516 +//line sql.y:534 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 53: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:522 +//line sql.y:540 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 54: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:526 +//line sql.y:544 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 55: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:531 +//line sql.y:549 { yyVAL.partitions = nil } case 56: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:535 +//line sql.y:553 { yyVAL.partitions = yyDollar[3].partitions } case 57: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:541 +//line sql.y:559 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } case 58: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:547 +//line sql.y:565 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Characteristics: yyDollar[5].characteristics} } case 59: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:551 +//line sql.y:569 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Characteristics: yyDollar[4].characteristics} } case 60: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:557 +//line sql.y:575 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } case 61: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:561 +//line sql.y:579 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } case 62: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:567 +//line sql.y:585 { yyVAL.characteristic = &IsolationLevel{Level: string(yyDollar[3].str)} } case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:571 +//line sql.y:589 { yyVAL.characteristic = &AccessMode{Mode: TxReadWrite} } case 64: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:575 +//line sql.y:593 { yyVAL.characteristic = &AccessMode{Mode: TxReadOnly} } case 65: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:581 +//line sql.y:599 { yyVAL.str = RepeatableRead } case 66: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:585 +//line sql.y:603 { yyVAL.str = ReadCommitted } case 67: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:589 +//line sql.y:607 { yyVAL.str = ReadUncommitted } case 68: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:593 +//line sql.y:611 { yyVAL.str = Serializable } case 69: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:599 +//line sql.y:617 { yyVAL.str = SessionStr } case 70: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:603 +//line sql.y:621 { yyVAL.str = GlobalStr } case 71: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:609 +//line sql.y:627 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } case 72: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:614 +//line sql.y:632 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike @@ -4110,139 +4101,139 @@ yydefault: } case 73: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:620 +//line sql.y:638 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName} } case 74: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:625 +//line sql.y:643 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[3].tableName.ToViewName()} } case 75: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:629 +//line sql.y:647 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[5].tableName.ToViewName()} } case 76: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:633 +//line sql.y:651 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } case 77: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:637 +//line sql.y:655 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } case 78: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:642 +//line sql.y:660 { yyVAL.colIdent = NewColIdent("") } case 79: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:646 +//line sql.y:664 { yyVAL.colIdent = yyDollar[2].colIdent } case 80: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:652 +//line sql.y:670 { yyVAL.colIdent = yyDollar[1].colIdent } case 81: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:657 +//line sql.y:675 { var v []VindexParam yyVAL.vindexParams = v } case 82: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:662 +//line sql.y:680 { yyVAL.vindexParams = yyDollar[2].vindexParams } case 83: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:668 +//line sql.y:686 { yyVAL.vindexParams = make([]VindexParam, 0, 4) yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) } case 84: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:673 +//line sql.y:691 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } case 85: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:679 +//line sql.y:697 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } case 86: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:685 +//line sql.y:703 { yyVAL.ddl = &DDL{Action: CreateStr, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } case 87: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:692 +//line sql.y:710 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } case 88: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:699 +//line sql.y:717 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } case 89: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:703 +//line sql.y:721 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } case 90: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:709 +//line sql.y:727 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } case 91: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:714 +//line sql.y:732 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } case 92: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:718 +//line sql.y:736 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } case 93: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:722 +//line sql.y:740 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } case 94: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:728 +//line sql.y:746 { yyDollar[2].columnType.NotNull = yyDollar[3].boolVal yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4254,7 +4245,7 @@ yydefault: } case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:739 +//line sql.y:757 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolVal @@ -4262,74 +4253,74 @@ yydefault: } case 99: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:750 +//line sql.y:768 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].sqlVal } case 100: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:755 +//line sql.y:773 { yyVAL.columnType = yyDollar[1].columnType } case 101: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:761 +//line sql.y:779 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 102: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:765 +//line sql.y:783 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 103: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:769 +//line sql.y:787 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 104: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:773 +//line sql.y:791 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:777 +//line sql.y:795 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:781 +//line sql.y:799 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:785 +//line sql.y:803 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:789 +//line sql.y:807 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:793 +//line sql.y:811 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:799 +//line sql.y:817 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4337,7 +4328,7 @@ yydefault: } case 111: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:805 +//line sql.y:823 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4345,7 +4336,7 @@ yydefault: } case 112: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:811 +//line sql.y:829 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4353,7 +4344,7 @@ yydefault: } case 113: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:817 +//line sql.y:835 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4361,7 +4352,7 @@ yydefault: } case 114: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:823 +//line sql.y:841 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4369,206 +4360,206 @@ yydefault: } case 115: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:831 +//line sql.y:849 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 116: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:835 +//line sql.y:853 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:839 +//line sql.y:857 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 118: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:843 +//line sql.y:861 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 119: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:847 +//line sql.y:865 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 120: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:853 +//line sql.y:871 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 121: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:857 +//line sql.y:875 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:861 +//line sql.y:879 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:865 +//line sql.y:883 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 124: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:869 +//line sql.y:887 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 125: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:873 +//line sql.y:891 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 126: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:877 +//line sql.y:895 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:881 +//line sql.y:899 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 128: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:885 +//line sql.y:903 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 129: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:889 +//line sql.y:907 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 130: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:893 +//line sql.y:911 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 131: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:897 +//line sql.y:915 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 132: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:901 +//line sql.y:919 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 133: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:905 +//line sql.y:923 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 134: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:910 +//line sql.y:928 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:916 +//line sql.y:934 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 136: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:920 +//line sql.y:938 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 137: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:924 +//line sql.y:942 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:928 +//line sql.y:946 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 139: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:932 +//line sql.y:950 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 140: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:936 +//line sql.y:954 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:940 +//line sql.y:958 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:944 +//line sql.y:962 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:950 +//line sql.y:968 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") } case 144: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:955 +//line sql.y:973 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } case 145: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:960 +//line sql.y:978 { yyVAL.sqlVal = nil } case 146: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:964 +//line sql.y:982 { yyVAL.sqlVal = NewIntVal(yyDollar[2].bytes) } case 147: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:969 +//line sql.y:987 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 148: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:973 +//line sql.y:991 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4577,13 +4568,13 @@ yydefault: } case 149: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:981 +//line sql.y:999 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 150: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:985 +//line sql.y:1003 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4591,7 +4582,7 @@ yydefault: } case 151: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:991 +//line sql.y:1009 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4600,508 +4591,508 @@ yydefault: } case 152: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:999 +//line sql.y:1017 { yyVAL.boolVal = BoolVal(false) } case 153: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1003 +//line sql.y:1021 { yyVAL.boolVal = BoolVal(true) } case 154: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1008 +//line sql.y:1026 { yyVAL.boolVal = BoolVal(false) } case 155: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1012 +//line sql.y:1030 { yyVAL.boolVal = BoolVal(true) } case 156: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1018 +//line sql.y:1036 { yyVAL.boolVal = BoolVal(false) } case 157: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1022 +//line sql.y:1040 { yyVAL.boolVal = BoolVal(false) } case 158: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1026 +//line sql.y:1044 { yyVAL.boolVal = BoolVal(true) } case 159: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1031 +//line sql.y:1049 { yyVAL.optVal = nil } case 160: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1035 +//line sql.y:1053 { yyVAL.optVal = yyDollar[2].expr } case 161: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1040 +//line sql.y:1058 { yyVAL.optVal = nil } case 162: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1044 +//line sql.y:1062 { yyVAL.optVal = yyDollar[3].expr } case 163: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1049 +//line sql.y:1067 { yyVAL.boolVal = BoolVal(false) } case 164: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1053 +//line sql.y:1071 { yyVAL.boolVal = BoolVal(true) } case 165: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1058 +//line sql.y:1076 { yyVAL.str = "" } case 166: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1062 +//line sql.y:1080 { yyVAL.str = string(yyDollar[3].colIdent.String()) } case 167: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1066 +//line sql.y:1084 { yyVAL.str = string(yyDollar[3].bytes) } case 168: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1071 +//line sql.y:1089 { yyVAL.str = "" } case 169: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1075 +//line sql.y:1093 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 170: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1079 +//line sql.y:1097 { yyVAL.str = string(yyDollar[2].bytes) } case 171: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1084 +//line sql.y:1102 { yyVAL.colKeyOpt = colKeyNone } case 172: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1088 +//line sql.y:1106 { yyVAL.colKeyOpt = colKeyPrimary } case 173: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1092 +//line sql.y:1110 { yyVAL.colKeyOpt = colKey } case 174: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1096 +//line sql.y:1114 { yyVAL.colKeyOpt = colKeyUniqueKey } case 175: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1100 +//line sql.y:1118 { yyVAL.colKeyOpt = colKeyUnique } case 176: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1105 +//line sql.y:1123 { yyVAL.sqlVal = nil } case 177: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1109 +//line sql.y:1127 { yyVAL.sqlVal = NewStrVal(yyDollar[2].bytes) } case 178: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1115 +//line sql.y:1133 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} } case 179: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1119 +//line sql.y:1137 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } case 180: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1125 +//line sql.y:1143 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } case 181: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1129 +//line sql.y:1147 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } case 182: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1135 +//line sql.y:1153 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].colIdent.String())} } case 183: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1139 +//line sql.y:1157 { // should not be string yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntVal(yyDollar[3].bytes)} } case 184: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1144 +//line sql.y:1162 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrVal(yyDollar[2].bytes)} } case 185: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1150 +//line sql.y:1168 { yyVAL.str = "" } case 186: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1154 +//line sql.y:1172 { yyVAL.str = string(yyDollar[1].bytes) } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1160 +//line sql.y:1178 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } case 188: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1164 +//line sql.y:1182 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } case 189: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1168 +//line sql.y:1186 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Unique: true} } case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1172 +//line sql.y:1190 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(yyDollar[2].str), Unique: true} } case 191: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1176 +//line sql.y:1194 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } case 192: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1182 +//line sql.y:1200 { yyVAL.str = string(yyDollar[1].bytes) } case 193: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1186 +//line sql.y:1204 { yyVAL.str = string(yyDollar[1].bytes) } case 194: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1190 +//line sql.y:1208 { yyVAL.str = string(yyDollar[1].bytes) } case 195: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1197 +//line sql.y:1215 { yyVAL.str = string(yyDollar[1].bytes) } case 196: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1201 +//line sql.y:1219 { yyVAL.str = string(yyDollar[1].bytes) } case 197: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1207 +//line sql.y:1225 { yyVAL.str = string(yyDollar[1].bytes) } case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1211 +//line sql.y:1229 { yyVAL.str = string(yyDollar[1].bytes) } case 199: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1216 +//line sql.y:1234 { yyVAL.str = "" } case 200: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1220 +//line sql.y:1238 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1226 +//line sql.y:1244 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } case 202: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1230 +//line sql.y:1248 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } case 203: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1236 +//line sql.y:1254 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].sqlVal} } case 204: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1242 +//line sql.y:1260 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } case 205: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1246 +//line sql.y:1264 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } case 206: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1253 +//line sql.y:1271 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns} } case 207: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1257 +//line sql.y:1275 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction} } case 208: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1261 +//line sql.y:1279 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnUpdate: yyDollar[11].ReferenceAction} } case 209: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1265 +//line sql.y:1283 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction, OnUpdate: yyDollar[12].ReferenceAction} } case 210: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1271 +//line sql.y:1289 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 211: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1277 +//line sql.y:1295 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 212: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1283 +//line sql.y:1301 { yyVAL.ReferenceAction = Restrict } case 213: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1287 +//line sql.y:1305 { yyVAL.ReferenceAction = Cascade } case 214: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1291 +//line sql.y:1309 { yyVAL.ReferenceAction = NoAction } case 215: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1295 +//line sql.y:1313 { yyVAL.ReferenceAction = SetDefault } case 216: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1299 +//line sql.y:1317 { yyVAL.ReferenceAction = SetNull } case 217: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1304 +//line sql.y:1322 { yyVAL.str = "" } case 218: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1308 +//line sql.y:1326 { yyVAL.str = " " + string(yyDollar[1].str) } case 219: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1312 +//line sql.y:1330 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } case 220: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1320 +//line sql.y:1338 { yyVAL.str = yyDollar[1].str } case 221: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1324 +//line sql.y:1342 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } case 222: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1328 +//line sql.y:1346 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1334 +//line sql.y:1352 { yyVAL.str = yyDollar[1].colIdent.String() } case 224: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1338 +//line sql.y:1356 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } case 225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1342 +//line sql.y:1360 { yyVAL.str = string(yyDollar[1].bytes) } case 226: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1348 +//line sql.y:1366 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 227: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1352 +//line sql.y:1370 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 228: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1356 +//line sql.y:1374 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 229: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1360 +//line sql.y:1378 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[4].tableName}, ToTables: TableNames{yyDollar[7].tableName}} } case 230: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1365 +//line sql.y:1383 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 231: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1370 +//line sql.y:1388 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName()} } case 232: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1374 +//line sql.y:1392 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } case 233: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1378 +//line sql.y:1396 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } case 234: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1382 +//line sql.y:1400 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } case 235: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1386 +//line sql.y:1404 { yyVAL.statement = &DDL{ Action: CreateVindexStr, @@ -5115,7 +5106,7 @@ yydefault: } case 236: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1398 +//line sql.y:1416 { yyVAL.statement = &DDL{ Action: DropVindexStr, @@ -5127,19 +5118,19 @@ yydefault: } case 237: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1408 +//line sql.y:1426 { yyVAL.statement = &DDL{Action: AddVschemaTableStr, Table: yyDollar[5].tableName} } case 238: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1412 +//line sql.y:1430 { yyVAL.statement = &DDL{Action: DropVschemaTableStr, Table: yyDollar[5].tableName} } case 239: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1416 +//line sql.y:1434 { yyVAL.statement = &DDL{ Action: AddColVindexStr, @@ -5154,7 +5145,7 @@ yydefault: } case 240: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1429 +//line sql.y:1447 { yyVAL.statement = &DDL{ Action: DropColVindexStr, @@ -5166,13 +5157,13 @@ yydefault: } case 241: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1439 +//line sql.y:1457 { yyVAL.statement = &DDL{Action: AddSequenceStr, Table: yyDollar[5].tableName} } case 242: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1443 +//line sql.y:1461 { yyVAL.statement = &DDL{ Action: AddAutoIncStr, @@ -5185,49 +5176,49 @@ yydefault: } case 257: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1472 +//line sql.y:1490 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeStr, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1478 +//line sql.y:1496 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } case 259: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1482 +//line sql.y:1500 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } case 260: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1488 +//line sql.y:1506 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } case 261: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1492 +//line sql.y:1510 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } case 262: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1498 +//line sql.y:1516 { yyVAL.statement = yyDollar[3].ddl } case 263: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1504 +//line sql.y:1522 { yyVAL.ddl = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[1].tableName}, ToTables: TableNames{yyDollar[3].tableName}} } case 264: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1508 +//line sql.y:1526 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) @@ -5235,7 +5226,7 @@ yydefault: } case 265: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1516 +//line sql.y:1534 { var exists bool if yyDollar[3].byt != 0 { @@ -5245,14 +5236,14 @@ yydefault: } case 266: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1524 +//line sql.y:1542 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName} } case 267: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1529 +//line sql.y:1547 { var exists bool if yyDollar[3].byt != 0 { @@ -5262,143 +5253,143 @@ yydefault: } case 268: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1537 +//line sql.y:1555 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } case 269: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1541 +//line sql.y:1559 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } case 270: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1547 +//line sql.y:1565 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[3].tableName} } case 271: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1551 +//line sql.y:1569 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[2].tableName} } case 272: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1556 +//line sql.y:1574 { yyVAL.statement = &OtherRead{} } case 273: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1562 +//line sql.y:1580 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } case 274: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1567 +//line sql.y:1585 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Type: CharsetStr, ShowTablesOpt: showTablesOpt} } case 275: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1572 +//line sql.y:1590 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt} } case 276: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1577 +//line sql.y:1595 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 277: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1582 +//line sql.y:1600 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } case 278: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1586 +//line sql.y:1604 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 279: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1590 +//line sql.y:1608 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName} } case 280: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1594 +//line sql.y:1612 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 281: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1598 +//line sql.y:1616 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 282: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1602 +//line sql.y:1620 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 283: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1606 +//line sql.y:1624 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 284: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1610 +//line sql.y:1628 { showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } case 285: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1615 +//line sql.y:1633 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 286: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1619 +//line sql.y:1637 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 287: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1623 +//line sql.y:1641 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } case 288: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1627 +//line sql.y:1645 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 289: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1631 +//line sql.y:1649 { showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } case 290: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1636 +//line sql.y:1654 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5410,603 +5401,603 @@ yydefault: } case 291: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1646 +//line sql.y:1664 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } case 292: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1650 +//line sql.y:1668 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 293: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1654 +//line sql.y:1672 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowCollationFilterOpt: yyDollar[4].expr} } case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1658 +//line sql.y:1676 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Scope: string(yyDollar[2].bytes), Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt} } case 295: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1663 +//line sql.y:1681 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 296: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1667 +//line sql.y:1685 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 297: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1671 +//line sql.y:1689 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName} } case 298: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1675 +//line sql.y:1693 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 299: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1689 +//line sql.y:1707 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String())} } case 300: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1695 +//line sql.y:1713 { yyVAL.str = string(yyDollar[1].bytes) } case 301: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1699 +//line sql.y:1717 { yyVAL.str = string(yyDollar[1].bytes) } case 302: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1705 +//line sql.y:1723 { yyVAL.str = "" } case 303: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1709 +//line sql.y:1727 { yyVAL.str = "extended " } case 304: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1715 +//line sql.y:1733 { yyVAL.str = "" } case 305: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1719 +//line sql.y:1737 { yyVAL.str = "full " } case 306: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1725 +//line sql.y:1743 { yyVAL.str = string(yyDollar[1].bytes) } case 307: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1729 +//line sql.y:1747 { yyVAL.str = string(yyDollar[1].bytes) } case 308: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1735 +//line sql.y:1753 { yyVAL.str = "" } case 309: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1739 +//line sql.y:1757 { yyVAL.str = yyDollar[2].tableIdent.v } case 310: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1743 +//line sql.y:1761 { yyVAL.str = yyDollar[2].tableIdent.v } case 311: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1749 +//line sql.y:1767 { yyVAL.showFilter = nil } case 312: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1753 +//line sql.y:1771 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1757 +//line sql.y:1775 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } case 314: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1763 +//line sql.y:1781 { yyVAL.showFilter = nil } case 315: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1767 +//line sql.y:1785 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 316: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1773 +//line sql.y:1791 { yyVAL.str = "" } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1777 +//line sql.y:1795 { yyVAL.str = SessionStr } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1781 +//line sql.y:1799 { yyVAL.str = GlobalStr } case 319: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1787 +//line sql.y:1805 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1791 +//line sql.y:1809 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1797 +//line sql.y:1815 { yyVAL.statement = &Begin{} } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1801 +//line sql.y:1819 { yyVAL.statement = &Begin{} } case 323: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1807 +//line sql.y:1825 { yyVAL.statement = &Commit{} } case 324: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1813 +//line sql.y:1831 { yyVAL.statement = &Rollback{} } case 325: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1818 +//line sql.y:1836 { yyVAL.str = "" } case 326: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1822 +//line sql.y:1840 { yyVAL.str = JSONStr } case 327: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1826 +//line sql.y:1844 { yyVAL.str = TreeStr } case 328: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1830 +//line sql.y:1848 { yyVAL.str = VitessStr } case 329: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1834 +//line sql.y:1852 { yyVAL.str = TraditionalStr } case 330: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1838 +//line sql.y:1856 { yyVAL.str = AnalyzeStr } case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1844 +//line sql.y:1862 { yyVAL.bytes = yyDollar[1].bytes } case 332: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1848 +//line sql.y:1866 { yyVAL.bytes = yyDollar[1].bytes } case 333: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1852 +//line sql.y:1870 { yyVAL.bytes = yyDollar[1].bytes } case 334: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1858 +//line sql.y:1876 { yyVAL.statement = yyDollar[1].selStmt } case 335: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1862 +//line sql.y:1880 { yyVAL.statement = yyDollar[1].statement } case 336: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1866 +//line sql.y:1884 { yyVAL.statement = yyDollar[1].statement } case 337: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1870 +//line sql.y:1888 { yyVAL.statement = yyDollar[1].statement } case 338: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1875 +//line sql.y:1893 { yyVAL.str = "" } case 339: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1879 +//line sql.y:1897 { yyVAL.str = "" } case 340: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1883 +//line sql.y:1901 { yyVAL.str = "" } case 341: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1889 +//line sql.y:1907 { yyVAL.statement = &OtherRead{} } case 342: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1893 +//line sql.y:1911 { yyVAL.statement = &Explain{Type: yyDollar[2].str, Statement: yyDollar[3].statement} } case 343: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1899 +//line sql.y:1917 { yyVAL.statement = &OtherAdmin{} } case 344: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1903 +//line sql.y:1921 { yyVAL.statement = &OtherAdmin{} } case 345: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1907 +//line sql.y:1925 { yyVAL.statement = &OtherAdmin{} } case 346: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1911 +//line sql.y:1929 { yyVAL.statement = &OtherAdmin{} } case 347: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1917 +//line sql.y:1935 { yyVAL.statement = &DDL{Action: FlushStr} } case 348: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1921 +//line sql.y:1939 { setAllowComments(yylex, true) } case 349: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1925 +//line sql.y:1943 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } case 350: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1931 +//line sql.y:1949 { yyVAL.bytes2 = nil } case 351: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1935 +//line sql.y:1953 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1941 +//line sql.y:1959 { yyVAL.str = UnionStr } case 353: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1945 +//line sql.y:1963 { yyVAL.str = UnionAllStr } case 354: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1949 +//line sql.y:1967 { yyVAL.str = UnionDistinctStr } case 355: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1954 +//line sql.y:1972 { yyVAL.str = "" } case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1958 +//line sql.y:1976 { yyVAL.str = SQLNoCacheStr } case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1962 +//line sql.y:1980 { yyVAL.str = SQLCacheStr } case 358: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1967 +//line sql.y:1985 { yyVAL.str = "" } case 359: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1971 +//line sql.y:1989 { yyVAL.str = DistinctStr } case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1975 +//line sql.y:1993 { yyVAL.str = DistinctStr } case 361: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1980 +//line sql.y:1998 { yyVAL.selectExprs = nil } case 362: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1984 +//line sql.y:2002 { yyVAL.selectExprs = yyDollar[1].selectExprs } case 363: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1989 +//line sql.y:2007 { yyVAL.strs = nil } case 364: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1993 +//line sql.y:2011 { yyVAL.strs = []string{yyDollar[1].str} } case 365: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1997 +//line sql.y:2015 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } case 366: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2001 +//line sql.y:2019 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } case 367: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2005 +//line sql.y:2023 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } case 368: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2011 +//line sql.y:2029 { yyVAL.str = SQLNoCacheStr } case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2015 +//line sql.y:2033 { yyVAL.str = SQLCacheStr } case 370: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2019 +//line sql.y:2037 { yyVAL.str = DistinctStr } case 371: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2023 +//line sql.y:2041 { yyVAL.str = DistinctStr } case 372: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2027 +//line sql.y:2045 { yyVAL.str = StraightJoinHint } case 373: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2031 +//line sql.y:2049 { yyVAL.str = SQLCalcFoundRowsStr } case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2037 +//line sql.y:2055 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } case 375: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2041 +//line sql.y:2059 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } case 376: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2047 +//line sql.y:2065 { yyVAL.selectExpr = &StarExpr{} } case 377: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2051 +//line sql.y:2069 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } case 378: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2055 +//line sql.y:2073 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } case 379: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2059 +//line sql.y:2077 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } case 380: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2064 +//line sql.y:2082 { yyVAL.colIdent = ColIdent{} } case 381: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2068 +//line sql.y:2086 { yyVAL.colIdent = yyDollar[1].colIdent } case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2072 +//line sql.y:2090 { yyVAL.colIdent = yyDollar[2].colIdent } case 384: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2079 +//line sql.y:2097 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 385: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2084 +//line sql.y:2102 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } case 386: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2088 +//line sql.y:2106 { yyVAL.tableExprs = yyDollar[2].tableExprs } case 387: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2094 +//line sql.y:2112 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } case 388: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2098 +//line sql.y:2116 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } case 391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2108 +//line sql.y:2126 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } case 392: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2112 +//line sql.y:2130 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 393: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2116 +//line sql.y:2134 { // missed alias for subquery yylex.Error("Every derived table must have its own alias") @@ -6014,199 +6005,199 @@ yydefault: } case 394: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2122 +//line sql.y:2140 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2128 +//line sql.y:2146 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } case 396: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2132 +//line sql.y:2150 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } case 397: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2138 +//line sql.y:2156 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 398: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2142 +//line sql.y:2160 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 399: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2148 +//line sql.y:2166 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } case 400: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2152 +//line sql.y:2170 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } case 401: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2165 +//line sql.y:2183 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 402: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2169 +//line sql.y:2187 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 403: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2173 +//line sql.y:2191 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 404: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2177 +//line sql.y:2195 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } case 405: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2183 +//line sql.y:2201 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 406: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2185 +//line sql.y:2203 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } case 407: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2189 +//line sql.y:2207 { yyVAL.joinCondition = JoinCondition{} } case 408: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2191 +//line sql.y:2209 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 409: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2195 +//line sql.y:2213 { yyVAL.joinCondition = JoinCondition{} } case 410: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2197 +//line sql.y:2215 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 411: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2200 +//line sql.y:2218 { yyVAL.empty = struct{}{} } case 412: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2202 +//line sql.y:2220 { yyVAL.empty = struct{}{} } case 413: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2205 +//line sql.y:2223 { yyVAL.tableIdent = NewTableIdent("") } case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2209 +//line sql.y:2227 { yyVAL.tableIdent = yyDollar[1].tableIdent } case 415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2213 +//line sql.y:2231 { yyVAL.tableIdent = yyDollar[2].tableIdent } case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2220 +//line sql.y:2238 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 418: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2226 +//line sql.y:2244 { yyVAL.str = JoinStr } case 419: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2230 +//line sql.y:2248 { yyVAL.str = JoinStr } case 420: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2234 +//line sql.y:2252 { yyVAL.str = JoinStr } case 421: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2240 +//line sql.y:2258 { yyVAL.str = StraightJoinStr } case 422: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2246 +//line sql.y:2264 { yyVAL.str = LeftJoinStr } case 423: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2250 +//line sql.y:2268 { yyVAL.str = LeftJoinStr } case 424: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2254 +//line sql.y:2272 { yyVAL.str = RightJoinStr } case 425: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2258 +//line sql.y:2276 { yyVAL.str = RightJoinStr } case 426: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2264 +//line sql.y:2282 { yyVAL.str = NaturalJoinStr } case 427: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2268 +//line sql.y:2286 { if yyDollar[2].str == LeftJoinStr { yyVAL.str = NaturalLeftJoinStr @@ -6216,481 +6207,481 @@ yydefault: } case 428: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2278 +//line sql.y:2296 { yyVAL.tableName = yyDollar[2].tableName } case 429: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2282 +//line sql.y:2300 { yyVAL.tableName = yyDollar[1].tableName } case 430: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2288 +//line sql.y:2306 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 431: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2292 +//line sql.y:2310 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } case 432: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2298 +//line sql.y:2316 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 433: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2303 +//line sql.y:2321 { yyVAL.indexHints = nil } case 434: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2307 +//line sql.y:2325 { yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].columns} } case 435: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2311 +//line sql.y:2329 { yyVAL.indexHints = &IndexHints{Type: UseStr} } case 436: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2315 +//line sql.y:2333 { yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].columns} } case 437: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2319 +//line sql.y:2337 { yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].columns} } case 438: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2324 +//line sql.y:2342 { yyVAL.expr = nil } case 439: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2328 +//line sql.y:2346 { yyVAL.expr = yyDollar[2].expr } case 440: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2334 +//line sql.y:2352 { yyVAL.expr = yyDollar[1].expr } case 441: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2338 +//line sql.y:2356 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2342 +//line sql.y:2360 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 443: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2346 +//line sql.y:2364 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } case 444: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2350 +//line sql.y:2368 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } case 445: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2354 +//line sql.y:2372 { yyVAL.expr = yyDollar[1].expr } case 446: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2358 +//line sql.y:2376 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } case 447: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2364 +//line sql.y:2382 { yyVAL.str = "" } case 448: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2368 +//line sql.y:2386 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 449: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2374 +//line sql.y:2392 { yyVAL.boolVal = BoolVal(true) } case 450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2378 +//line sql.y:2396 { yyVAL.boolVal = BoolVal(false) } case 451: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2384 +//line sql.y:2402 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } case 452: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2388 +//line sql.y:2406 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } case 453: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2392 +//line sql.y:2410 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } case 454: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2396 +//line sql.y:2414 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } case 455: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2400 +//line sql.y:2418 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } case 456: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2404 +//line sql.y:2422 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } case 457: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2408 +//line sql.y:2426 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } case 458: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2412 +//line sql.y:2430 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } case 459: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2416 +//line sql.y:2434 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } case 460: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2420 +//line sql.y:2438 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } case 461: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2426 +//line sql.y:2444 { yyVAL.str = IsNullStr } case 462: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2430 +//line sql.y:2448 { yyVAL.str = IsNotNullStr } case 463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2434 +//line sql.y:2452 { yyVAL.str = IsTrueStr } case 464: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2438 +//line sql.y:2456 { yyVAL.str = IsNotTrueStr } case 465: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2442 +//line sql.y:2460 { yyVAL.str = IsFalseStr } case 466: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2446 +//line sql.y:2464 { yyVAL.str = IsNotFalseStr } case 467: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2452 +//line sql.y:2470 { yyVAL.str = EqualStr } case 468: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2456 +//line sql.y:2474 { yyVAL.str = LessThanStr } case 469: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2460 +//line sql.y:2478 { yyVAL.str = GreaterThanStr } case 470: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2464 +//line sql.y:2482 { yyVAL.str = LessEqualStr } case 471: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2468 +//line sql.y:2486 { yyVAL.str = GreaterEqualStr } case 472: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2472 +//line sql.y:2490 { yyVAL.str = NotEqualStr } case 473: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2476 +//line sql.y:2494 { yyVAL.str = NullSafeEqualStr } case 474: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2481 +//line sql.y:2499 { yyVAL.expr = nil } case 475: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2485 +//line sql.y:2503 { yyVAL.expr = yyDollar[2].expr } case 476: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2491 +//line sql.y:2509 { yyVAL.colTuple = yyDollar[1].valTuple } case 477: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2495 +//line sql.y:2513 { yyVAL.colTuple = yyDollar[1].subquery } case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2499 +//line sql.y:2517 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } case 479: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2505 +//line sql.y:2523 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 480: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2511 +//line sql.y:2529 { yyVAL.exprs = Exprs{yyDollar[1].expr} } case 481: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2515 +//line sql.y:2533 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } case 482: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2521 +//line sql.y:2539 { yyVAL.expr = yyDollar[1].expr } case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2525 +//line sql.y:2543 { yyVAL.expr = yyDollar[1].boolVal } case 484: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2529 +//line sql.y:2547 { yyVAL.expr = yyDollar[1].colName } case 485: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2533 +//line sql.y:2551 { yyVAL.expr = yyDollar[1].expr } case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2537 +//line sql.y:2555 { yyVAL.expr = yyDollar[1].subquery } case 487: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2541 +//line sql.y:2559 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } case 488: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2545 +//line sql.y:2563 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } case 489: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2549 +//line sql.y:2567 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } case 490: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2553 +//line sql.y:2571 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } case 491: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2557 +//line sql.y:2575 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } case 492: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2561 +//line sql.y:2579 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } case 493: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2565 +//line sql.y:2583 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } case 494: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2569 +//line sql.y:2587 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } case 495: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2573 +//line sql.y:2591 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } case 496: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2577 +//line sql.y:2595 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2581 +//line sql.y:2599 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } case 498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2585 +//line sql.y:2603 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2589 +//line sql.y:2607 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } case 500: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2593 +//line sql.y:2611 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } case 501: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2597 +//line sql.y:2615 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } case 502: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2601 +//line sql.y:2619 { yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} } case 503: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2605 +//line sql.y:2623 { yyVAL.expr = &UnaryExpr{Operator: UBinaryStr, Expr: yyDollar[2].expr} } case 504: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2609 +//line sql.y:2627 { yyVAL.expr = &UnaryExpr{Operator: Utf8Str, Expr: yyDollar[2].expr} } case 505: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2613 +//line sql.y:2631 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Str, Expr: yyDollar[2].expr} } case 506: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2617 +//line sql.y:2635 { yyVAL.expr = &UnaryExpr{Operator: Latin1Str, Expr: yyDollar[2].expr} } case 507: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2621 +//line sql.y:2639 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6700,7 +6691,7 @@ yydefault: } case 508: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2629 +//line sql.y:2647 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -6716,19 +6707,19 @@ yydefault: } case 509: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2643 +//line sql.y:2661 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } case 510: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2647 +//line sql.y:2665 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2651 +//line sql.y:2669 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6738,325 +6729,325 @@ yydefault: } case 516: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2669 +//line sql.y:2687 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } case 517: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2673 +//line sql.y:2691 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 518: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2677 +//line sql.y:2695 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 519: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2681 +//line sql.y:2699 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } case 520: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2691 +//line sql.y:2709 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } case 521: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2695 +//line sql.y:2713 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } case 522: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2699 +//line sql.y:2717 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 523: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2703 +//line sql.y:2721 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 524: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2707 +//line sql.y:2725 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } case 525: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2711 +//line sql.y:2729 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } case 526: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2715 +//line sql.y:2733 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } case 527: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2719 +//line sql.y:2737 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } case 528: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2723 +//line sql.y:2741 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } case 529: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:2727 +//line sql.y:2745 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].str} } case 530: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2731 +//line sql.y:2749 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } case 531: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2735 +//line sql.y:2753 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } case 532: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2739 +//line sql.y:2757 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } case 533: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2749 +//line sql.y:2767 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } case 534: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2753 +//line sql.y:2771 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } case 535: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2757 +//line sql.y:2775 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } case 536: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2762 +//line sql.y:2780 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } case 537: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2767 +//line sql.y:2785 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } case 538: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2772 +//line sql.y:2790 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } case 539: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2778 +//line sql.y:2796 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } case 540: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2783 +//line sql.y:2801 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } case 541: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2788 +//line sql.y:2806 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } case 542: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2792 +//line sql.y:2810 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } case 543: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2796 +//line sql.y:2814 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } case 544: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2801 +//line sql.y:2819 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } case 545: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2806 +//line sql.y:2824 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } case 546: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2811 +//line sql.y:2829 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } case 547: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2815 +//line sql.y:2833 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } case 548: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2819 +//line sql.y:2837 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } case 551: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2829 +//line sql.y:2847 { yyVAL.expr = yyDollar[2].expr } case 552: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2839 +//line sql.y:2857 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } case 553: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2843 +//line sql.y:2861 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } case 554: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2847 +//line sql.y:2865 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } case 555: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2851 +//line sql.y:2869 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } case 556: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2855 +//line sql.y:2873 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } case 557: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2859 +//line sql.y:2877 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 558: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2863 +//line sql.y:2881 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 559: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2869 +//line sql.y:2887 { yyVAL.str = "" } case 560: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2873 +//line sql.y:2891 { yyVAL.str = BooleanModeStr } case 561: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2877 +//line sql.y:2895 { yyVAL.str = NaturalLanguageModeStr } case 562: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2881 +//line sql.y:2899 { yyVAL.str = NaturalLanguageModeWithQueryExpansionStr } case 563: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2885 +//line sql.y:2903 { yyVAL.str = QueryExpansionStr } case 564: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2891 +//line sql.y:2909 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 565: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2895 +//line sql.y:2913 { yyVAL.str = string(yyDollar[1].bytes) } case 566: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2901 +//line sql.y:2919 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 567: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2905 +//line sql.y:2923 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Operator: CharacterSetStr} } case 568: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2909 +//line sql.y:2927 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: string(yyDollar[3].colIdent.String())} } case 569: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2913 +//line sql.y:2931 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 570: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2917 +//line sql.y:2935 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2921 +//line sql.y:2939 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length @@ -7064,169 +7055,169 @@ yydefault: } case 572: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2927 +//line sql.y:2945 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 573: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2931 +//line sql.y:2949 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 574: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2935 +//line sql.y:2953 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 575: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2939 +//line sql.y:2957 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 576: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2943 +//line sql.y:2961 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 577: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2947 +//line sql.y:2965 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 578: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2951 +//line sql.y:2969 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 579: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2956 +//line sql.y:2974 { yyVAL.expr = nil } case 580: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2960 +//line sql.y:2978 { yyVAL.expr = yyDollar[1].expr } case 581: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2965 +//line sql.y:2983 { yyVAL.str = string("") } case 582: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2969 +//line sql.y:2987 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } case 583: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2975 +//line sql.y:2993 { yyVAL.whens = []*When{yyDollar[1].when} } case 584: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2979 +//line sql.y:2997 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } case 585: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2985 +//line sql.y:3003 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } case 586: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2990 +//line sql.y:3008 { yyVAL.expr = nil } case 587: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2994 +//line sql.y:3012 { yyVAL.expr = yyDollar[2].expr } case 588: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3000 +//line sql.y:3018 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } case 589: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3004 +//line sql.y:3022 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } case 590: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3008 +//line sql.y:3026 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } case 591: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3014 +//line sql.y:3032 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } case 592: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3018 +//line sql.y:3036 { yyVAL.expr = NewHexVal(yyDollar[1].bytes) } case 593: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3022 +//line sql.y:3040 { yyVAL.expr = NewBitVal(yyDollar[1].bytes) } case 594: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3026 +//line sql.y:3044 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } case 595: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3030 +//line sql.y:3048 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } case 596: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3034 +//line sql.y:3052 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } case 597: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3038 +//line sql.y:3056 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } case 598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3042 +//line sql.y:3060 { yyVAL.expr = &NullVal{} } case 599: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3048 +//line sql.y:3066 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7237,237 +7228,223 @@ yydefault: } case 600: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3057 +//line sql.y:3075 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } case 601: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3061 +//line sql.y:3079 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } case 602: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3066 +//line sql.y:3084 { yyVAL.exprs = nil } case 603: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3070 +//line sql.y:3088 { yyVAL.exprs = yyDollar[3].exprs } case 604: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3075 +//line sql.y:3093 { yyVAL.expr = nil } case 605: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3079 +//line sql.y:3097 { yyVAL.expr = yyDollar[2].expr } case 606: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3084 +//line sql.y:3102 { yyVAL.orderBy = nil } case 607: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3088 +//line sql.y:3106 { yyVAL.orderBy = yyDollar[3].orderBy } case 608: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3094 +//line sql.y:3112 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } case 609: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3098 +//line sql.y:3116 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } case 610: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3104 +//line sql.y:3122 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } case 611: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3109 +//line sql.y:3127 { yyVAL.str = AscScr } case 612: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3113 +//line sql.y:3131 { yyVAL.str = AscScr } case 613: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3117 +//line sql.y:3135 { yyVAL.str = DescScr } case 614: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3122 +//line sql.y:3140 { yyVAL.limit = nil } case 615: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3126 +//line sql.y:3144 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } case 616: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3130 +//line sql.y:3148 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } case 617: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3134 +//line sql.y:3152 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } case 618: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3139 +//line sql.y:3157 { yyVAL.str = "" } case 619: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3143 +//line sql.y:3161 { yyVAL.str = ForUpdateStr } case 620: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3147 +//line sql.y:3165 { yyVAL.str = ShareModeStr } case 621: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3160 +//line sql.y:3178 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } case 622: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3164 +//line sql.y:3182 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } case 623: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3168 - { - // Drop the redundant parenthesis. - yyVAL.ins = &Insert{Rows: yyDollar[2].selStmt} - } - case 624: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3173 +//line sql.y:3186 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 625: + case 624: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3177 +//line sql.y:3190 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 626: - yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:3181 - { - // Drop the redundant parenthesis. - yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].selStmt} - } - case 627: + case 625: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3188 +//line sql.y:3196 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 628: + case 626: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3192 +//line sql.y:3200 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 629: + case 627: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3196 +//line sql.y:3204 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 630: + case 628: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3200 +//line sql.y:3208 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 631: + case 629: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3205 +//line sql.y:3213 { yyVAL.updateExprs = nil } - case 632: + case 630: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3209 +//line sql.y:3217 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 633: + case 631: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3215 +//line sql.y:3223 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 634: + case 632: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3219 +//line sql.y:3227 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 635: + case 633: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3225 +//line sql.y:3233 { yyVAL.valTuple = yyDollar[1].valTuple } - case 636: + case 634: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3229 +//line sql.y:3237 { yyVAL.valTuple = ValTuple{} } - case 637: + case 635: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3235 +//line sql.y:3243 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 638: + case 636: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3241 +//line sql.y:3249 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7475,319 +7452,319 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 639: + case 637: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3251 +//line sql.y:3259 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 640: + case 638: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3255 +//line sql.y:3263 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 641: + case 639: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3261 +//line sql.y:3269 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 642: + case 640: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3267 +//line sql.y:3275 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 643: + case 641: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3271 +//line sql.y:3279 { yyDollar[2].setExpr.Scope = yyDollar[1].str yyVAL.setExprs = SetExprs{yyDollar[2].setExpr} } - case 644: + case 642: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3276 +//line sql.y:3284 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 645: + case 643: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3282 +//line sql.y:3290 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("on"))} } - case 646: + case 644: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3286 +//line sql.y:3294 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("off"))} } - case 647: + case 645: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3290 +//line sql.y:3298 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: yyDollar[3].expr} } - case 648: + case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3294 +//line sql.y:3302 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Expr: yyDollar[2].expr} } - case 650: + case 648: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3301 +//line sql.y:3309 { yyVAL.bytes = []byte("charset") } - case 652: + case 650: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3308 +//line sql.y:3316 { yyVAL.expr = NewStrVal([]byte(yyDollar[1].colIdent.String())) } - case 653: + case 651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3312 +//line sql.y:3320 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 654: + case 652: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3316 +//line sql.y:3324 { yyVAL.expr = &Default{} } - case 657: + case 655: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3325 +//line sql.y:3333 { yyVAL.byt = 0 } - case 658: + case 656: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3327 +//line sql.y:3335 { yyVAL.byt = 1 } - case 659: + case 657: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3330 +//line sql.y:3338 { yyVAL.empty = struct{}{} } - case 660: + case 658: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3332 +//line sql.y:3340 { yyVAL.empty = struct{}{} } - case 661: + case 659: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3335 +//line sql.y:3343 { yyVAL.str = "" } - case 662: + case 660: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3337 +//line sql.y:3345 { yyVAL.str = IgnoreStr } + case 661: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3349 + { + yyVAL.empty = struct{}{} + } + case 662: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3351 + { + yyVAL.empty = struct{}{} + } case 663: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3341 +//line sql.y:3353 { yyVAL.empty = struct{}{} } case 664: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3343 +//line sql.y:3355 { yyVAL.empty = struct{}{} } case 665: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3345 +//line sql.y:3357 { yyVAL.empty = struct{}{} } case 666: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3347 +//line sql.y:3359 { yyVAL.empty = struct{}{} } case 667: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3349 +//line sql.y:3361 { yyVAL.empty = struct{}{} } case 668: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3351 +//line sql.y:3363 { yyVAL.empty = struct{}{} } case 669: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3353 +//line sql.y:3365 { yyVAL.empty = struct{}{} } case 670: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3355 +//line sql.y:3367 { yyVAL.empty = struct{}{} } case 671: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3357 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3370 { yyVAL.empty = struct{}{} } case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3359 +//line sql.y:3372 { yyVAL.empty = struct{}{} } case 673: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3362 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3374 { yyVAL.empty = struct{}{} } case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3364 +//line sql.y:3378 { yyVAL.empty = struct{}{} } case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3366 +//line sql.y:3380 { yyVAL.empty = struct{}{} } case 676: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3370 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3383 { yyVAL.empty = struct{}{} } case 677: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3372 +//line sql.y:3385 { yyVAL.empty = struct{}{} } case 678: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3375 - { - yyVAL.empty = struct{}{} - } - case 679: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3377 - { - yyVAL.empty = struct{}{} - } - case 680: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3379 +//line sql.y:3387 { yyVAL.empty = struct{}{} } - case 681: + case 679: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3382 +//line sql.y:3390 { yyVAL.colIdent = ColIdent{} } - case 682: + case 680: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3384 +//line sql.y:3392 { yyVAL.colIdent = yyDollar[2].colIdent } - case 683: + case 681: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3388 +//line sql.y:3396 { yyVAL.colIdent = yyDollar[1].colIdent } - case 684: + case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3392 +//line sql.y:3400 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 686: + case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3399 +//line sql.y:3407 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 687: + case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3405 +//line sql.y:3413 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 688: + case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3409 +//line sql.y:3417 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 690: + case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3416 +//line sql.y:3424 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 980: + case 978: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3731 +//line sql.y:3739 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 981: + case 979: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3740 +//line sql.y:3748 { decNesting(yylex) } - case 982: + case 980: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3745 +//line sql.y:3753 { skipToEnd(yylex) } - case 983: + case 981: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3750 +//line sql.y:3758 { skipToEnd(yylex) } - case 984: + case 982: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3754 +//line sql.y:3762 { skipToEnd(yylex) } - case 985: + case 983: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3758 +//line sql.y:3766 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 505248c90ef..df1d8f09211 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -217,7 +217,7 @@ func skipToEnd(yylex interface{}) { %token FORMAT TREE VITESS TRADITIONAL %type command -%type select_statement base_select union_lhs union_rhs +%type simple_select select_statement base_select union_rhs %type explain_statement explainable_statement %type stream_statement insert_statement update_statement delete_statement set_statement set_transaction_statement %type create_statement alter_statement rename_statement drop_statement truncate_statement flush_statement do_statement @@ -393,15 +393,16 @@ do_statement: } select_statement: - base_select order_by_opt limit_opt lock_opt + simple_select { - sel := $1.(*Select) - sel.OrderBy = $2 - sel.Limit = $3 - sel.Lock = $4 - $$ = sel + $$ = $1 + } +| openb select_statement closeb order_by_opt limit_opt lock_opt + { + // TODO(sougou): may potentially need a new AST node for this. + $$ = nil } -| union_lhs union_op union_rhs order_by_opt limit_opt lock_opt +| select_statement union_op union_rhs order_by_opt limit_opt lock_opt { $$ = &Union{Type: $2, Left: $1, Right: $3, OrderBy: $4, Limit: $5, Lock: $6} } @@ -410,6 +411,33 @@ select_statement: $$ = NewSelect(Comments($2), SelectExprs{Nextval{Expr: $5}}, []string{$3}/*options*/, TableExprs{&AliasedTableExpr{Expr: $7}}, nil/*where*/, nil/*groupBy*/, nil/*having*/) } +// simple_select is an unparenthesized select used for subquery. +// Allowing parenthesis for subqueries leads to grammar ambiguity. +// MySQL also seems to have run into this and resolved it the same way. +// The specific ambiguity comes from the fact that parenthesis means +// many things: +// 1. Grouping: (select id from t) order by id +// 2. Tuple: id in (1, 2, 3) +// 3. Subquery: id in (select id from t) +// Example: +// ((select id from t)) +// Interpretation 1: inner () is for subquery (rule 3), and outer () +// is Tuple (rule 2), which degenerates to a simple expression +// for single value expressions. +// Interpretation 2: inner () is for grouping (rule 1), and outer +// is for subquery. +// Not allowing parenthesis for subselects will force the above +// construct to use the first interpretation. +simple_select: + base_select order_by_opt limit_opt lock_opt + { + sel := $1.(*Select) + sel.OrderBy = $2 + sel.Limit = $3 + sel.Lock = $4 + $$ = sel + } + stream_statement: STREAM comment_opt select_expression FROM table_name { @@ -424,16 +452,6 @@ base_select: $$ = NewSelect(Comments($2), $4/*SelectExprs*/, $3/*options*/, $5/*from*/, NewWhere(WhereStr, $6), GroupBy($7), NewWhere(HavingStr, $8)) } -union_lhs: - select_statement - { - $$ = $1 - } -| openb select_statement closeb - { - $$ = &ParenSelect{Select: $2} - } - union_rhs: base_select { @@ -2501,7 +2519,7 @@ col_tuple: } subquery: - openb select_statement closeb + openb simple_select closeb { $$ = &Subquery{$2} } @@ -3164,11 +3182,6 @@ insert_data: { $$ = &Insert{Rows: $1} } -| openb select_statement closeb - { - // Drop the redundant parenthesis. - $$ = &Insert{Rows: $2} - } | openb ins_column_list closeb VALUES tuple_list { $$ = &Insert{Columns: $2, Rows: $5} @@ -3177,11 +3190,6 @@ insert_data: { $$ = &Insert{Columns: $2, Rows: $4} } -| openb ins_column_list closeb openb select_statement closeb - { - // Drop the redundant parenthesis. - $$ = &Insert{Columns: $2, Rows: $5} - } ins_column_list: sql_id From 245d708620f4aa86a6fa5a9184f91369011d64cf Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Wed, 17 Jun 2020 14:30:47 -0700 Subject: [PATCH 040/430] tm revamp: address review comments Signed-off-by: Sugu Sougoumarane --- go/cmd/vttablet/healthz.go | 2 +- go/cmd/vttablet/vttablet.go | 2 +- go/vt/vttablet/tabletmanager/tm_init.go | 8 +++----- go/vt/vttablet/tabletmanager/tm_init_test.go | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/go/cmd/vttablet/healthz.go b/go/cmd/vttablet/healthz.go index 610e73a113d..22d2985ef1a 100644 --- a/go/cmd/vttablet/healthz.go +++ b/go/cmd/vttablet/healthz.go @@ -30,7 +30,7 @@ func init() { servenv.OnRun(func() { http.Handle("/healthz", http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { if _, err := tm.Healthy(); err != nil { - http.Error(rw, fmt.Sprintf("500 internal server error: tm not healthy: %v", err), http.StatusInternalServerError) + http.Error(rw, fmt.Sprintf("500 internal server error: tablet manager not healthy: %v", err), http.StatusInternalServerError) return } diff --git a/go/cmd/vttablet/vttablet.go b/go/cmd/vttablet/vttablet.go index c71d650f4b2..c1e70e115b4 100644 --- a/go/cmd/vttablet/vttablet.go +++ b/go/cmd/vttablet/vttablet.go @@ -69,7 +69,7 @@ func main() { log.Exitf("failed to parse -tablet-path: %v", err) } - // config and mycnf intializatin is intertwined. + // config and mycnf intializations are intertwined. config, mycnf := initConfig(tabletAlias) ts := topo.Open() diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index a68abcfbfae..80ee3a5c11d 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -73,7 +73,7 @@ import ( ) const ( - // slaveStoppedFile is the file name for the file whose existence informs + // slaveStoppedFile is the name of the file whose existence informs // vttablet to NOT try to repair replication. slaveStoppedFile = "do_not_replicate" ) @@ -324,11 +324,10 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet) error { return err } + // The following initializations don't need to be done + // in any specific order. tm.startShardSync() - tm.exportStats() - - // Start periodic Orchestrator self-registration, if configured. orc, err := newOrcClient() if err != nil { return err @@ -337,7 +336,6 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet) error { tm.orc = orc go tm.orc.DiscoverLoop(tm) } - servenv.OnRun(tm.registerTabletManager) // Temporary glue code to keep things working. diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index 1d6246f8dca..d1bf8275580 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -74,7 +74,7 @@ func TestStartBuildTabletFromInput(t *testing.T) { require.NoError(t, err) assert.NotEqual(t, "", gotTablet.Hostname) - // Cannonicalize shard name and compute keyrange. + // Canonicalize shard name and compute keyrange. *tabletHostname = "foo" *initShard = "-C0" wantTablet.Shard = "-c0" From ca4567fac04446df95560ec8482c9cdb282d023b Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 18 Jun 2020 09:38:14 +0200 Subject: [PATCH 041/430] Changed the union AST Signed-off-by: Andres Taylor --- go/vt/sqlparser/ast.go | 20 ++++++++++----- go/vt/sqlparser/ast_funcs.go | 15 +++++++++++ go/vt/sqlparser/impossible_query.go | 2 -- go/vt/sqlparser/parse_test.go | 2 ++ go/vt/sqlparser/rewriter.go | 22 ++++++++++------ go/vt/sqlparser/sql.go | 2 +- go/vt/sqlparser/sql.y | 2 +- go/vt/vtexplain/vtexplain_vttablet.go | 2 +- go/vt/vtgate/planbuilder/union.go | 37 ++++++++++++++++++--------- 9 files changed, 72 insertions(+), 32 deletions(-) diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 355a42e68af..3ec82c55b2d 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -72,11 +72,11 @@ type ( // Union represents a UNION statement. Union struct { - Type string - Left, Right SelectStatement - OrderBy OrderBy - Limit *Limit - Lock string + Types []string + Statements []SelectStatement + OrderBy OrderBy + Limit *Limit + Lock string } // Stream represents a SELECT statement. @@ -874,8 +874,14 @@ func (node *ParenSelect) Format(buf *TrackedBuffer) { // Format formats the node. func (node *Union) Format(buf *TrackedBuffer) { - buf.astPrintf(node, "%v %s %v%v%v%s", node.Left, node.Type, node.Right, - node.OrderBy, node.Limit, node.Lock) + for i, stmt := range node.Statements { + if i == 0 { + buf.astPrintf(node, "%v", stmt) + } else { + buf.astPrintf(node, " %s %v", node.Types[(i-1)], stmt) + } + } + buf.astPrintf(node, "%v%v%s", node.OrderBy, node.Limit, node.Lock) } // Format formats the node. diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index dc37b3f48d5..35166ca3f89 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -769,6 +769,21 @@ func (node *Union) SetLimit(limit *Limit) { node.Limit = limit } +//Unionize returns a UNION, either creating one or adding SELECT to an existing one +func Unionize(lhs, rhs SelectStatement, typ string, by OrderBy, limit *Limit, lock string) *Union { + union, isUnion := lhs.(*Union) + if isUnion { + union.Statements = append(union.Statements, rhs) + union.Types = append(union.Types, typ) + union.OrderBy = by + union.Limit = limit + union.Lock = lock + return union + } + + return &Union{Types: []string{typ}, Statements: []SelectStatement{lhs, rhs}, OrderBy: by, Limit: limit, Lock: lock} +} + // AtCount represents the '@' count in ColIdent type AtCount int diff --git a/go/vt/sqlparser/impossible_query.go b/go/vt/sqlparser/impossible_query.go index 785cb36bebb..bedc38e4699 100644 --- a/go/vt/sqlparser/impossible_query.go +++ b/go/vt/sqlparser/impossible_query.go @@ -31,8 +31,6 @@ func FormatImpossibleQuery(buf *TrackedBuffer, node SQLNode) { if node.GroupBy != nil { node.GroupBy.Format(buf) } - case *Union: - buf.Myprintf("%v %s %v", node.Left, node.Type, node.Right) default: node.Format(buf) } diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 278ff48958f..3638c55b5bc 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -141,6 +141,8 @@ var ( input: "select * from t1 where col in (select 1 from dual union select 2 from dual)", }, { input: "select * from t1 where exists (select a from t2 union select b from t3)", + }, { + input: "select 1 from dual union select 2 from dual union all select 3 from dual union select 4 from dual union all select 5 from dual", }, { input: "select /* distinct */ distinct 1 from t", }, { diff --git a/go/vt/sqlparser/rewriter.go b/go/vt/sqlparser/rewriter.go index d35f96d9526..af671467e2d 100644 --- a/go/vt/sqlparser/rewriter.go +++ b/go/vt/sqlparser/rewriter.go @@ -721,10 +721,6 @@ func replaceUnaryExprExpr(newNode, parent SQLNode) { parent.(*UnaryExpr).Expr = newNode.(Expr) } -func replaceUnionLeft(newNode, parent SQLNode) { - parent.(*Union).Left = newNode.(SelectStatement) -} - func replaceUnionLimit(newNode, parent SQLNode) { parent.(*Union).Limit = newNode.(*Limit) } @@ -733,8 +729,14 @@ func replaceUnionOrderBy(newNode, parent SQLNode) { parent.(*Union).OrderBy = newNode.(OrderBy) } -func replaceUnionRight(newNode, parent SQLNode) { - parent.(*Union).Right = newNode.(SelectStatement) +type replaceUnionStatements int + +func (r *replaceUnionStatements) replace(newNode, container SQLNode) { + container.(*Union).Statements[int(*r)] = newNode.(SelectStatement) +} + +func (r *replaceUnionStatements) inc() { + *r++ } func replaceUpdateComments(newNode, parent SQLNode) { @@ -1271,10 +1273,14 @@ func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { a.apply(node, n.Expr, replaceUnaryExprExpr) case *Union: - a.apply(node, n.Left, replaceUnionLeft) a.apply(node, n.Limit, replaceUnionLimit) a.apply(node, n.OrderBy, replaceUnionOrderBy) - a.apply(node, n.Right, replaceUnionRight) + replacerStatements := replaceUnionStatements(0) + replacerStatementsB := &replacerStatements + for _, item := range n.Statements { + a.apply(node, item, replacerStatementsB.replace) + replacerStatementsB.inc() + } case *Update: a.apply(node, n.Comments, replaceUpdateComments) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 7033a0d933d..dc087acab41 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -3837,7 +3837,7 @@ yydefault: yyDollar = yyS[yypt-6 : yypt+1] //line sql.y:405 { - yyVAL.selStmt = &Union{Type: yyDollar[2].str, Left: yyDollar[1].selStmt, Right: yyDollar[3].selStmt, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} + yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } case 33: yyDollar = yyS[yypt-7 : yypt+1] diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 22a32323b03..6074001d837 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -403,7 +403,7 @@ select_statement: } | union_lhs union_op union_rhs order_by_opt limit_opt lock_opt { - $$ = &Union{Type: $2, Left: $1, Right: $3, OrderBy: $4, Limit: $5, Lock: $6} + $$ = Unionize($1, $3, $2, $4, $5, $6) } | SELECT comment_opt cache_opt NEXT num_val for_from table_name { diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 26724bc0684..d621763dcb3 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -454,7 +454,7 @@ func (t *explainTablet) HandleQuery(c *mysql.Conn, query string, callback func(* case *sqlparser.Select: selStmt = stmt case *sqlparser.Union: - selStmt = stmt.Right.(*sqlparser.Select) + selStmt = stmt.Statements[1].(*sqlparser.Select) default: return fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) } diff --git a/go/vt/vtgate/planbuilder/union.go b/go/vt/vtgate/planbuilder/union.go index 71fb9e4182d..20681ecd607 100644 --- a/go/vt/vtgate/planbuilder/union.go +++ b/go/vt/vtgate/planbuilder/union.go @@ -20,6 +20,9 @@ import ( "errors" "fmt" + "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/engine" ) @@ -38,18 +41,28 @@ func buildUnionPlan(stmt sqlparser.Statement, vschema ContextVSchema) (engine.Pr } func (pb *primitiveBuilder) processUnion(union *sqlparser.Union, outer *symtab) error { - if err := pb.processPart(union.Left, outer); err != nil { - return err - } - rpb := newPrimitiveBuilder(pb.vschema, pb.jt) - if err := rpb.processPart(union.Right, outer); err != nil { - return err - } + for i, stmt := range union.Statements { + if i == 0 { + if err := pb.processPart(stmt, outer); err != nil { + return err + } + } else { + rpb := newPrimitiveBuilder(pb.vschema, pb.jt) + if err := rpb.processPart(stmt, outer); err != nil { + return err + } - if err := unionRouteMerge(union, pb.bldr, rpb.bldr); err != nil { - return err + if err := unionRouteMerge(pb.bldr, rpb.bldr); err != nil { + return err + } + pb.st.Outer = outer + } + } + unionRoute, ok := pb.bldr.(*route) + if !ok { + return vterrors.Errorf(vtrpc.Code_INTERNAL, "expected union to produce a route") } - pb.st.Outer = outer + unionRoute.Select = &sqlparser.Union{Types: union.Types, Statements: union.Statements, Lock: union.Lock} if err := pb.pushOrderBy(union.OrderBy); err != nil { return err @@ -69,7 +82,7 @@ func (pb *primitiveBuilder) processPart(part sqlparser.SelectStatement, outer *s return fmt.Errorf("BUG: unexpected SELECT type: %T", part) } -func unionRouteMerge(union *sqlparser.Union, left, right builder) error { +func unionRouteMerge(left, right builder) error { lroute, ok := left.(*route) if !ok { return errors.New("unsupported: SELECT of UNION is non-trivial") @@ -81,6 +94,6 @@ func unionRouteMerge(union *sqlparser.Union, left, right builder) error { if !lroute.MergeUnion(rroute) { return errors.New("unsupported: UNION cannot be executed as a single route") } - lroute.Select = &sqlparser.Union{Type: union.Type, Left: union.Left, Right: union.Right, Lock: union.Lock} + return nil } From 914ec24e642cf8707eeb0b90ec36aee76e570cf4 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Thu, 18 Jun 2020 09:52:28 +0200 Subject: [PATCH 042/430] Added more logs to track down race Signed-off-by: Rohit Nayak --- .../tabletserver/vstreamer/uvstreamer_test.go | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go index 36a3813c0e1..e202fb88680 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go @@ -267,12 +267,8 @@ func TestVStreamCopyCompleteFlow(t *testing.T) { } muAllEvents.Lock() defer muAllEvents.Unlock() - printAllEvents("End of test") if len(allEvents) != numExpectedEvents { - log.Errorf("Received %d events, expected %d", len(allEvents), numExpectedEvents) - for _, ev := range allEvents { - log.Errorf("\t%s", ev) - } + printAllEvents(fmt.Sprintf("Received %d events, expected %d", len(allEvents), numExpectedEvents)) t.Fatalf("Received %d events, expected %d", len(allEvents), numExpectedEvents) } else { log.Infof("Successfully received %d events", numExpectedEvents) @@ -281,14 +277,12 @@ func TestVStreamCopyCompleteFlow(t *testing.T) { } func validateReceivedEvents(t *testing.T) { - if len(allEvents) != len(expectedEvents) { - t.Fatalf("Received events not equal to expected events, wanted %d, got %d", len(expectedEvents), len(allEvents)) - } for i, ev := range allEvents { ev.Timestamp = 0 got := ev.String() want := expectedEvents[i] if !strings.HasPrefix(got, want) { + printAllEvents("Events not received in the right order") t.Fatalf("Event %d did not match, want %s, got %s", i, want, got) } } @@ -364,9 +358,9 @@ func insertRow(t *testing.T, table string, idx int, id int) { } func printAllEvents(msg string) { - log.Infof("%s: Received %d events", msg, len(allEvents)) - for _, ev := range allEvents { - log.Infof("\t%s", ev) + log.Errorf("%s: Received %d events", msg, len(allEvents)) + for i, ev := range allEvents { + log.Errorf("%d:\t%s", i, ev) } } From 475510010f276132843f4f81628c1534c23aeef6 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 18 Jun 2020 14:12:56 +0530 Subject: [PATCH 043/430] union-list: changed union ast struct to be safer to use Signed-off-by: Harshit Gangal --- go/vt/sqlparser/ast.go | 30 ++++++++++++++++++----------- go/vt/sqlparser/ast_funcs.go | 5 ++--- go/vt/sqlparser/impossible_query.go | 5 +++++ go/vt/sqlparser/rewriter.go | 30 ++++++++++++++++++++--------- go/vt/vtgate/planbuilder/union.go | 27 ++++++++++++-------------- 5 files changed, 59 insertions(+), 38 deletions(-) diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 3ec82c55b2d..66b22e67489 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -70,13 +70,19 @@ type ( Lock string } + // UnionSelect represents union type and select statement after first select statement. + UnionSelect struct { + Type string + Statement SelectStatement + } + // Union represents a UNION statement. Union struct { - Types []string - Statements []SelectStatement - OrderBy OrderBy - Limit *Limit - Lock string + FirstStatement SelectStatement + UnionSelects []*UnionSelect + OrderBy OrderBy + Limit *Limit + Lock string } // Stream represents a SELECT statement. @@ -874,16 +880,18 @@ func (node *ParenSelect) Format(buf *TrackedBuffer) { // Format formats the node. func (node *Union) Format(buf *TrackedBuffer) { - for i, stmt := range node.Statements { - if i == 0 { - buf.astPrintf(node, "%v", stmt) - } else { - buf.astPrintf(node, " %s %v", node.Types[(i-1)], stmt) - } + buf.astPrintf(node, "%v", node.FirstStatement) + for _, us := range node.UnionSelects { + buf.astPrintf(node, "%v", us) } buf.astPrintf(node, "%v%v%s", node.OrderBy, node.Limit, node.Lock) } +// Format formats the node. +func (node *UnionSelect) Format(buf *TrackedBuffer) { + buf.astPrintf(node, " %s %v", node.Type, node.Statement) +} + // Format formats the node. func (node *Stream) Format(buf *TrackedBuffer) { buf.astPrintf(node, "stream %v%v from %v", diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 35166ca3f89..82844737e46 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -773,15 +773,14 @@ func (node *Union) SetLimit(limit *Limit) { func Unionize(lhs, rhs SelectStatement, typ string, by OrderBy, limit *Limit, lock string) *Union { union, isUnion := lhs.(*Union) if isUnion { - union.Statements = append(union.Statements, rhs) - union.Types = append(union.Types, typ) + union.UnionSelects = append(union.UnionSelects, &UnionSelect{Type: typ, Statement: rhs}) union.OrderBy = by union.Limit = limit union.Lock = lock return union } - return &Union{Types: []string{typ}, Statements: []SelectStatement{lhs, rhs}, OrderBy: by, Limit: limit, Lock: lock} + return &Union{FirstStatement: lhs, UnionSelects: []*UnionSelect{{Type: typ, Statement: rhs}}, OrderBy: by, Limit: limit, Lock: lock} } // AtCount represents the '@' count in ColIdent diff --git a/go/vt/sqlparser/impossible_query.go b/go/vt/sqlparser/impossible_query.go index bedc38e4699..2437b551587 100644 --- a/go/vt/sqlparser/impossible_query.go +++ b/go/vt/sqlparser/impossible_query.go @@ -31,6 +31,11 @@ func FormatImpossibleQuery(buf *TrackedBuffer, node SQLNode) { if node.GroupBy != nil { node.GroupBy.Format(buf) } + case *Union: + buf.astPrintf(node, "%v", node.FirstStatement) + for _, us := range node.UnionSelects { + buf.astPrintf(node, "%v", us) + } default: node.Format(buf) } diff --git a/go/vt/sqlparser/rewriter.go b/go/vt/sqlparser/rewriter.go index af671467e2d..79227efaa06 100644 --- a/go/vt/sqlparser/rewriter.go +++ b/go/vt/sqlparser/rewriter.go @@ -721,6 +721,10 @@ func replaceUnaryExprExpr(newNode, parent SQLNode) { parent.(*UnaryExpr).Expr = newNode.(Expr) } +func replaceUnionFirstStatement(newNode, parent SQLNode) { + parent.(*Union).FirstStatement = newNode.(SelectStatement) +} + func replaceUnionLimit(newNode, parent SQLNode) { parent.(*Union).Limit = newNode.(*Limit) } @@ -729,16 +733,20 @@ func replaceUnionOrderBy(newNode, parent SQLNode) { parent.(*Union).OrderBy = newNode.(OrderBy) } -type replaceUnionStatements int +type replaceUnionUnionSelects int -func (r *replaceUnionStatements) replace(newNode, container SQLNode) { - container.(*Union).Statements[int(*r)] = newNode.(SelectStatement) +func (r *replaceUnionUnionSelects) replace(newNode, container SQLNode) { + container.(*Union).UnionSelects[int(*r)] = newNode.(*UnionSelect) } -func (r *replaceUnionStatements) inc() { +func (r *replaceUnionUnionSelects) inc() { *r++ } +func replaceUnionSelectStatement(newNode, parent SQLNode) { + parent.(*UnionSelect).Statement = newNode.(SelectStatement) +} + func replaceUpdateComments(newNode, parent SQLNode) { parent.(*Update).Comments = newNode.(Comments) } @@ -1273,15 +1281,19 @@ func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { a.apply(node, n.Expr, replaceUnaryExprExpr) case *Union: + a.apply(node, n.FirstStatement, replaceUnionFirstStatement) a.apply(node, n.Limit, replaceUnionLimit) a.apply(node, n.OrderBy, replaceUnionOrderBy) - replacerStatements := replaceUnionStatements(0) - replacerStatementsB := &replacerStatements - for _, item := range n.Statements { - a.apply(node, item, replacerStatementsB.replace) - replacerStatementsB.inc() + replacerUnionSelects := replaceUnionUnionSelects(0) + replacerUnionSelectsB := &replacerUnionSelects + for _, item := range n.UnionSelects { + a.apply(node, item, replacerUnionSelectsB.replace) + replacerUnionSelectsB.inc() } + case *UnionSelect: + a.apply(node, n.Statement, replaceUnionSelectStatement) + case *Update: a.apply(node, n.Comments, replaceUpdateComments) a.apply(node, n.Exprs, replaceUpdateExprs) diff --git a/go/vt/vtgate/planbuilder/union.go b/go/vt/vtgate/planbuilder/union.go index 20681ecd607..fb3845bc198 100644 --- a/go/vt/vtgate/planbuilder/union.go +++ b/go/vt/vtgate/planbuilder/union.go @@ -41,28 +41,25 @@ func buildUnionPlan(stmt sqlparser.Statement, vschema ContextVSchema) (engine.Pr } func (pb *primitiveBuilder) processUnion(union *sqlparser.Union, outer *symtab) error { - for i, stmt := range union.Statements { - if i == 0 { - if err := pb.processPart(stmt, outer); err != nil { - return err - } - } else { - rpb := newPrimitiveBuilder(pb.vschema, pb.jt) - if err := rpb.processPart(stmt, outer); err != nil { - return err - } + if err := pb.processPart(union.FirstStatement, outer); err != nil { + return err + } + for _, us := range union.UnionSelects { + rpb := newPrimitiveBuilder(pb.vschema, pb.jt) + if err := rpb.processPart(us.Statement, outer); err != nil { + return err + } - if err := unionRouteMerge(pb.bldr, rpb.bldr); err != nil { - return err - } - pb.st.Outer = outer + if err := unionRouteMerge(pb.bldr, rpb.bldr); err != nil { + return err } + pb.st.Outer = outer } unionRoute, ok := pb.bldr.(*route) if !ok { return vterrors.Errorf(vtrpc.Code_INTERNAL, "expected union to produce a route") } - unionRoute.Select = &sqlparser.Union{Types: union.Types, Statements: union.Statements, Lock: union.Lock} + unionRoute.Select = &sqlparser.Union{FirstStatement: union.FirstStatement, UnionSelects: union.UnionSelects, Lock: union.Lock} if err := pb.pushOrderBy(union.OrderBy); err != nil { return err From 3d1f01fbc5bc24c91372675bae276f84c2578934 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 18 Jun 2020 11:36:05 +0200 Subject: [PATCH 044/430] Added support for (select ...) order by Signed-off-by: Andres Taylor --- go/vt/sqlparser/parse_test.go | 7 +- go/vt/sqlparser/sql.go | 1261 ++++++++++++++++----------------- go/vt/sqlparser/sql.y | 3 +- 3 files changed, 635 insertions(+), 636 deletions(-) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 3638c55b5bc..473fca8493d 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -26,7 +26,6 @@ import ( "sync" "testing" - "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" ) @@ -143,6 +142,8 @@ var ( input: "select * from t1 where exists (select a from t2 union select b from t3)", }, { input: "select 1 from dual union select 2 from dual union all select 3 from dual union select 4 from dual union all select 5 from dual", + }, { + input: "(select 1 from dual) order by 1 asc limit 2", }, { input: "select /* distinct */ distinct 1 from t", }, { @@ -1655,8 +1656,8 @@ func TestValid(t *testing.T) { tree, err := Parse(tcase.input) require.NoError(t, err, tcase.input) out := String(tree) - if diff := cmp.Diff(tcase.output, out); diff != "" { - t.Errorf("Parse(%q):\n%s", tcase.input, diff) + if tcase.output != out { + t.Errorf("Parsing failed. \nExpected/Got:\n%s\n%s", tcase.output, out) } // This test just exercises the tree walking functionality. // There's no way automated way to verify that a node calls diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index a77e494f3d5..60fba8958ee 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -3825,24 +3825,23 @@ yydefault: yyDollar = yyS[yypt-6 : yypt+1] //line sql.y:401 { - // TODO(sougou): may potentially need a new AST node for this. - yyVAL.selStmt = nil + yyVAL.selStmt = &Union{FirstStatement: &ParenSelect{Select: yyDollar[2].selStmt}, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} } case 33: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:406 +//line sql.y:405 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } case 34: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:410 +//line sql.y:409 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } case 35: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:433 +//line sql.y:432 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3852,31 +3851,31 @@ yydefault: } case 36: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:443 +//line sql.y:442 { yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} } case 37: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:451 +//line sql.y:450 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereStr, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingStr, yyDollar[8].expr)) } case 38: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:457 +//line sql.y:456 { yyVAL.selStmt = yyDollar[1].selStmt } case 39: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:461 +//line sql.y:460 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 40: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:468 +//line sql.y:467 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -3890,7 +3889,7 @@ yydefault: } case 41: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:480 +//line sql.y:479 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -3902,186 +3901,186 @@ yydefault: } case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:492 +//line sql.y:491 { yyVAL.str = InsertStr } case 43: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:496 +//line sql.y:495 { yyVAL.str = ReplaceStr } case 44: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:502 +//line sql.y:501 { yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, TableExprs: yyDollar[4].tableExprs, Exprs: yyDollar[6].updateExprs, Where: NewWhere(WhereStr, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } case 45: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:508 +//line sql.y:507 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Partitions: yyDollar[5].partitions, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} } case 46: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:512 +//line sql.y:511 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereStr, yyDollar[7].expr)} } case 47: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:516 +//line sql.y:515 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } case 48: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:520 +//line sql.y:519 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } case 49: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:525 +//line sql.y:524 { } case 50: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:526 +//line sql.y:525 { } case 51: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:530 +//line sql.y:529 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 52: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:534 +//line sql.y:533 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 53: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:540 +//line sql.y:539 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 54: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:544 +//line sql.y:543 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 55: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:549 +//line sql.y:548 { yyVAL.partitions = nil } case 56: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:553 +//line sql.y:552 { yyVAL.partitions = yyDollar[3].partitions } case 57: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:559 +//line sql.y:558 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } case 58: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:565 +//line sql.y:564 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Characteristics: yyDollar[5].characteristics} } case 59: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:569 +//line sql.y:568 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Characteristics: yyDollar[4].characteristics} } case 60: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:575 +//line sql.y:574 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } case 61: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:579 +//line sql.y:578 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } case 62: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:585 +//line sql.y:584 { yyVAL.characteristic = &IsolationLevel{Level: string(yyDollar[3].str)} } case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:589 +//line sql.y:588 { yyVAL.characteristic = &AccessMode{Mode: TxReadWrite} } case 64: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:593 +//line sql.y:592 { yyVAL.characteristic = &AccessMode{Mode: TxReadOnly} } case 65: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:599 +//line sql.y:598 { yyVAL.str = RepeatableRead } case 66: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:603 +//line sql.y:602 { yyVAL.str = ReadCommitted } case 67: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:607 +//line sql.y:606 { yyVAL.str = ReadUncommitted } case 68: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:611 +//line sql.y:610 { yyVAL.str = Serializable } case 69: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:617 +//line sql.y:616 { yyVAL.str = SessionStr } case 70: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:621 +//line sql.y:620 { yyVAL.str = GlobalStr } case 71: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:627 +//line sql.y:626 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } case 72: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:632 +//line sql.y:631 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike @@ -4089,139 +4088,139 @@ yydefault: } case 73: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:638 +//line sql.y:637 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName} } case 74: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:643 +//line sql.y:642 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[3].tableName.ToViewName()} } case 75: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:647 +//line sql.y:646 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[5].tableName.ToViewName()} } case 76: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:651 +//line sql.y:650 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } case 77: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:655 +//line sql.y:654 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } case 78: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:660 +//line sql.y:659 { yyVAL.colIdent = NewColIdent("") } case 79: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:664 +//line sql.y:663 { yyVAL.colIdent = yyDollar[2].colIdent } case 80: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:670 +//line sql.y:669 { yyVAL.colIdent = yyDollar[1].colIdent } case 81: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:675 +//line sql.y:674 { var v []VindexParam yyVAL.vindexParams = v } case 82: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:680 +//line sql.y:679 { yyVAL.vindexParams = yyDollar[2].vindexParams } case 83: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:686 +//line sql.y:685 { yyVAL.vindexParams = make([]VindexParam, 0, 4) yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) } case 84: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:691 +//line sql.y:690 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } case 85: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:697 +//line sql.y:696 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } case 86: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:703 +//line sql.y:702 { yyVAL.ddl = &DDL{Action: CreateStr, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } case 87: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:710 +//line sql.y:709 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } case 88: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:717 +//line sql.y:716 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } case 89: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:721 +//line sql.y:720 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } case 90: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:727 +//line sql.y:726 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } case 91: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:732 +//line sql.y:731 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } case 92: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:736 +//line sql.y:735 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } case 93: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:740 +//line sql.y:739 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } case 94: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:746 +//line sql.y:745 { yyDollar[2].columnType.NotNull = yyDollar[3].boolVal yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4233,7 +4232,7 @@ yydefault: } case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:757 +//line sql.y:756 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolVal @@ -4241,74 +4240,74 @@ yydefault: } case 99: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:768 +//line sql.y:767 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].sqlVal } case 100: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:773 +//line sql.y:772 { yyVAL.columnType = yyDollar[1].columnType } case 101: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:779 +//line sql.y:778 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 102: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:783 +//line sql.y:782 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 103: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:787 +//line sql.y:786 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 104: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:791 +//line sql.y:790 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:795 +//line sql.y:794 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:799 +//line sql.y:798 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:803 +//line sql.y:802 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:807 +//line sql.y:806 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:811 +//line sql.y:810 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:817 +//line sql.y:816 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4316,7 +4315,7 @@ yydefault: } case 111: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:823 +//line sql.y:822 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4324,7 +4323,7 @@ yydefault: } case 112: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:829 +//line sql.y:828 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4332,7 +4331,7 @@ yydefault: } case 113: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:835 +//line sql.y:834 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4340,7 +4339,7 @@ yydefault: } case 114: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:841 +//line sql.y:840 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4348,206 +4347,206 @@ yydefault: } case 115: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:849 +//line sql.y:848 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 116: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:853 +//line sql.y:852 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:857 +//line sql.y:856 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 118: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:861 +//line sql.y:860 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 119: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:865 +//line sql.y:864 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 120: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:871 +//line sql.y:870 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 121: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:875 +//line sql.y:874 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:879 +//line sql.y:878 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:883 +//line sql.y:882 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 124: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:887 +//line sql.y:886 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 125: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:891 +//line sql.y:890 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 126: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:895 +//line sql.y:894 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:899 +//line sql.y:898 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 128: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:903 +//line sql.y:902 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 129: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:907 +//line sql.y:906 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 130: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:911 +//line sql.y:910 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 131: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:915 +//line sql.y:914 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 132: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:919 +//line sql.y:918 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 133: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:923 +//line sql.y:922 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 134: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:928 +//line sql.y:927 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:934 +//line sql.y:933 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 136: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:938 +//line sql.y:937 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 137: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:942 +//line sql.y:941 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:946 +//line sql.y:945 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 139: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:950 +//line sql.y:949 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 140: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:954 +//line sql.y:953 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:958 +//line sql.y:957 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:962 +//line sql.y:961 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:968 +//line sql.y:967 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") } case 144: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:973 +//line sql.y:972 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } case 145: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:978 +//line sql.y:977 { yyVAL.sqlVal = nil } case 146: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:982 +//line sql.y:981 { yyVAL.sqlVal = NewIntVal(yyDollar[2].bytes) } case 147: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:987 +//line sql.y:986 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 148: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:991 +//line sql.y:990 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4556,13 +4555,13 @@ yydefault: } case 149: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:999 +//line sql.y:998 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 150: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1003 +//line sql.y:1002 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4570,7 +4569,7 @@ yydefault: } case 151: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1009 +//line sql.y:1008 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4579,508 +4578,508 @@ yydefault: } case 152: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1017 +//line sql.y:1016 { yyVAL.boolVal = BoolVal(false) } case 153: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1021 +//line sql.y:1020 { yyVAL.boolVal = BoolVal(true) } case 154: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1026 +//line sql.y:1025 { yyVAL.boolVal = BoolVal(false) } case 155: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1030 +//line sql.y:1029 { yyVAL.boolVal = BoolVal(true) } case 156: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1036 +//line sql.y:1035 { yyVAL.boolVal = BoolVal(false) } case 157: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1040 +//line sql.y:1039 { yyVAL.boolVal = BoolVal(false) } case 158: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1044 +//line sql.y:1043 { yyVAL.boolVal = BoolVal(true) } case 159: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1049 +//line sql.y:1048 { yyVAL.optVal = nil } case 160: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1053 +//line sql.y:1052 { yyVAL.optVal = yyDollar[2].expr } case 161: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1058 +//line sql.y:1057 { yyVAL.optVal = nil } case 162: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1062 +//line sql.y:1061 { yyVAL.optVal = yyDollar[3].expr } case 163: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1067 +//line sql.y:1066 { yyVAL.boolVal = BoolVal(false) } case 164: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1071 +//line sql.y:1070 { yyVAL.boolVal = BoolVal(true) } case 165: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1076 +//line sql.y:1075 { yyVAL.str = "" } case 166: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1080 +//line sql.y:1079 { yyVAL.str = string(yyDollar[3].colIdent.String()) } case 167: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1084 +//line sql.y:1083 { yyVAL.str = string(yyDollar[3].bytes) } case 168: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1089 +//line sql.y:1088 { yyVAL.str = "" } case 169: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1093 +//line sql.y:1092 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 170: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1097 +//line sql.y:1096 { yyVAL.str = string(yyDollar[2].bytes) } case 171: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1102 +//line sql.y:1101 { yyVAL.colKeyOpt = colKeyNone } case 172: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1106 +//line sql.y:1105 { yyVAL.colKeyOpt = colKeyPrimary } case 173: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1110 +//line sql.y:1109 { yyVAL.colKeyOpt = colKey } case 174: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1114 +//line sql.y:1113 { yyVAL.colKeyOpt = colKeyUniqueKey } case 175: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1118 +//line sql.y:1117 { yyVAL.colKeyOpt = colKeyUnique } case 176: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1123 +//line sql.y:1122 { yyVAL.sqlVal = nil } case 177: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1127 +//line sql.y:1126 { yyVAL.sqlVal = NewStrVal(yyDollar[2].bytes) } case 178: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1133 +//line sql.y:1132 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} } case 179: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1137 +//line sql.y:1136 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } case 180: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1143 +//line sql.y:1142 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } case 181: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1147 +//line sql.y:1146 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } case 182: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1153 +//line sql.y:1152 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].colIdent.String())} } case 183: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1157 +//line sql.y:1156 { // should not be string yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntVal(yyDollar[3].bytes)} } case 184: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1162 +//line sql.y:1161 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrVal(yyDollar[2].bytes)} } case 185: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1168 +//line sql.y:1167 { yyVAL.str = "" } case 186: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1172 +//line sql.y:1171 { yyVAL.str = string(yyDollar[1].bytes) } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1178 +//line sql.y:1177 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } case 188: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1182 +//line sql.y:1181 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } case 189: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1186 +//line sql.y:1185 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Unique: true} } case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1190 +//line sql.y:1189 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(yyDollar[2].str), Unique: true} } case 191: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1194 +//line sql.y:1193 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } case 192: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1200 +//line sql.y:1199 { yyVAL.str = string(yyDollar[1].bytes) } case 193: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1204 +//line sql.y:1203 { yyVAL.str = string(yyDollar[1].bytes) } case 194: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1208 +//line sql.y:1207 { yyVAL.str = string(yyDollar[1].bytes) } case 195: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1215 +//line sql.y:1214 { yyVAL.str = string(yyDollar[1].bytes) } case 196: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1219 +//line sql.y:1218 { yyVAL.str = string(yyDollar[1].bytes) } case 197: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1225 +//line sql.y:1224 { yyVAL.str = string(yyDollar[1].bytes) } case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1229 +//line sql.y:1228 { yyVAL.str = string(yyDollar[1].bytes) } case 199: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1234 +//line sql.y:1233 { yyVAL.str = "" } case 200: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1238 +//line sql.y:1237 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1244 +//line sql.y:1243 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } case 202: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1248 +//line sql.y:1247 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } case 203: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1254 +//line sql.y:1253 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].sqlVal} } case 204: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1260 +//line sql.y:1259 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } case 205: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1264 +//line sql.y:1263 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } case 206: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1271 +//line sql.y:1270 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns} } case 207: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1275 +//line sql.y:1274 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction} } case 208: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1279 +//line sql.y:1278 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnUpdate: yyDollar[11].ReferenceAction} } case 209: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1283 +//line sql.y:1282 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction, OnUpdate: yyDollar[12].ReferenceAction} } case 210: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1289 +//line sql.y:1288 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 211: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1295 +//line sql.y:1294 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 212: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1301 +//line sql.y:1300 { yyVAL.ReferenceAction = Restrict } case 213: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1305 +//line sql.y:1304 { yyVAL.ReferenceAction = Cascade } case 214: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1309 +//line sql.y:1308 { yyVAL.ReferenceAction = NoAction } case 215: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1313 +//line sql.y:1312 { yyVAL.ReferenceAction = SetDefault } case 216: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1317 +//line sql.y:1316 { yyVAL.ReferenceAction = SetNull } case 217: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1322 +//line sql.y:1321 { yyVAL.str = "" } case 218: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1326 +//line sql.y:1325 { yyVAL.str = " " + string(yyDollar[1].str) } case 219: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1330 +//line sql.y:1329 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } case 220: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1338 +//line sql.y:1337 { yyVAL.str = yyDollar[1].str } case 221: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1342 +//line sql.y:1341 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } case 222: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1346 +//line sql.y:1345 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1352 +//line sql.y:1351 { yyVAL.str = yyDollar[1].colIdent.String() } case 224: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1356 +//line sql.y:1355 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } case 225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1360 +//line sql.y:1359 { yyVAL.str = string(yyDollar[1].bytes) } case 226: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1366 +//line sql.y:1365 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 227: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1370 +//line sql.y:1369 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 228: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1374 +//line sql.y:1373 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 229: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1378 +//line sql.y:1377 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[4].tableName}, ToTables: TableNames{yyDollar[7].tableName}} } case 230: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1383 +//line sql.y:1382 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 231: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1388 +//line sql.y:1387 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName()} } case 232: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1392 +//line sql.y:1391 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } case 233: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1396 +//line sql.y:1395 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } case 234: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1400 +//line sql.y:1399 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } case 235: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1404 +//line sql.y:1403 { yyVAL.statement = &DDL{ Action: CreateVindexStr, @@ -5094,7 +5093,7 @@ yydefault: } case 236: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1416 +//line sql.y:1415 { yyVAL.statement = &DDL{ Action: DropVindexStr, @@ -5106,19 +5105,19 @@ yydefault: } case 237: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1426 +//line sql.y:1425 { yyVAL.statement = &DDL{Action: AddVschemaTableStr, Table: yyDollar[5].tableName} } case 238: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1430 +//line sql.y:1429 { yyVAL.statement = &DDL{Action: DropVschemaTableStr, Table: yyDollar[5].tableName} } case 239: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1434 +//line sql.y:1433 { yyVAL.statement = &DDL{ Action: AddColVindexStr, @@ -5133,7 +5132,7 @@ yydefault: } case 240: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1447 +//line sql.y:1446 { yyVAL.statement = &DDL{ Action: DropColVindexStr, @@ -5145,13 +5144,13 @@ yydefault: } case 241: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1457 +//line sql.y:1456 { yyVAL.statement = &DDL{Action: AddSequenceStr, Table: yyDollar[5].tableName} } case 242: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1461 +//line sql.y:1460 { yyVAL.statement = &DDL{ Action: AddAutoIncStr, @@ -5164,49 +5163,49 @@ yydefault: } case 257: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1490 +//line sql.y:1489 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeStr, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1496 +//line sql.y:1495 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } case 259: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1500 +//line sql.y:1499 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } case 260: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1506 +//line sql.y:1505 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } case 261: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1510 +//line sql.y:1509 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } case 262: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1516 +//line sql.y:1515 { yyVAL.statement = yyDollar[3].ddl } case 263: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1522 +//line sql.y:1521 { yyVAL.ddl = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[1].tableName}, ToTables: TableNames{yyDollar[3].tableName}} } case 264: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1526 +//line sql.y:1525 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) @@ -5214,7 +5213,7 @@ yydefault: } case 265: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1534 +//line sql.y:1533 { var exists bool if yyDollar[3].byt != 0 { @@ -5224,14 +5223,14 @@ yydefault: } case 266: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1542 +//line sql.y:1541 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName} } case 267: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1547 +//line sql.y:1546 { var exists bool if yyDollar[3].byt != 0 { @@ -5241,143 +5240,143 @@ yydefault: } case 268: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1555 +//line sql.y:1554 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } case 269: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1559 +//line sql.y:1558 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } case 270: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1565 +//line sql.y:1564 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[3].tableName} } case 271: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1569 +//line sql.y:1568 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[2].tableName} } case 272: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1574 +//line sql.y:1573 { yyVAL.statement = &OtherRead{} } case 273: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1580 +//line sql.y:1579 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } case 274: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1585 +//line sql.y:1584 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Type: CharsetStr, ShowTablesOpt: showTablesOpt} } case 275: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1590 +//line sql.y:1589 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt} } case 276: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1595 +//line sql.y:1594 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 277: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1600 +//line sql.y:1599 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } case 278: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1604 +//line sql.y:1603 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 279: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1608 +//line sql.y:1607 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName} } case 280: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1612 +//line sql.y:1611 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 281: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1616 +//line sql.y:1615 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 282: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1620 +//line sql.y:1619 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 283: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1624 +//line sql.y:1623 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 284: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1628 +//line sql.y:1627 { showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } case 285: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1633 +//line sql.y:1632 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 286: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1637 +//line sql.y:1636 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 287: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1641 +//line sql.y:1640 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } case 288: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1645 +//line sql.y:1644 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 289: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1649 +//line sql.y:1648 { showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } case 290: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1654 +//line sql.y:1653 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5389,603 +5388,603 @@ yydefault: } case 291: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1664 +//line sql.y:1663 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } case 292: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1668 +//line sql.y:1667 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 293: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1672 +//line sql.y:1671 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowCollationFilterOpt: yyDollar[4].expr} } case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1676 +//line sql.y:1675 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Scope: string(yyDollar[2].bytes), Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt} } case 295: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1681 +//line sql.y:1680 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 296: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1685 +//line sql.y:1684 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 297: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1689 +//line sql.y:1688 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName} } case 298: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1693 +//line sql.y:1692 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 299: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1707 +//line sql.y:1706 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String())} } case 300: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1713 +//line sql.y:1712 { yyVAL.str = string(yyDollar[1].bytes) } case 301: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1717 +//line sql.y:1716 { yyVAL.str = string(yyDollar[1].bytes) } case 302: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1723 +//line sql.y:1722 { yyVAL.str = "" } case 303: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1727 +//line sql.y:1726 { yyVAL.str = "extended " } case 304: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1733 +//line sql.y:1732 { yyVAL.str = "" } case 305: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1737 +//line sql.y:1736 { yyVAL.str = "full " } case 306: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1743 +//line sql.y:1742 { yyVAL.str = string(yyDollar[1].bytes) } case 307: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1747 +//line sql.y:1746 { yyVAL.str = string(yyDollar[1].bytes) } case 308: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1753 +//line sql.y:1752 { yyVAL.str = "" } case 309: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1757 +//line sql.y:1756 { yyVAL.str = yyDollar[2].tableIdent.v } case 310: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1761 +//line sql.y:1760 { yyVAL.str = yyDollar[2].tableIdent.v } case 311: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1767 +//line sql.y:1766 { yyVAL.showFilter = nil } case 312: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1771 +//line sql.y:1770 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1775 +//line sql.y:1774 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } case 314: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1781 +//line sql.y:1780 { yyVAL.showFilter = nil } case 315: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1785 +//line sql.y:1784 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 316: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1791 +//line sql.y:1790 { yyVAL.str = "" } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1795 +//line sql.y:1794 { yyVAL.str = SessionStr } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1799 +//line sql.y:1798 { yyVAL.str = GlobalStr } case 319: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1805 +//line sql.y:1804 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1809 +//line sql.y:1808 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1815 +//line sql.y:1814 { yyVAL.statement = &Begin{} } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1819 +//line sql.y:1818 { yyVAL.statement = &Begin{} } case 323: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1825 +//line sql.y:1824 { yyVAL.statement = &Commit{} } case 324: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1831 +//line sql.y:1830 { yyVAL.statement = &Rollback{} } case 325: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1836 +//line sql.y:1835 { yyVAL.str = "" } case 326: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1840 +//line sql.y:1839 { yyVAL.str = JSONStr } case 327: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1844 +//line sql.y:1843 { yyVAL.str = TreeStr } case 328: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1848 +//line sql.y:1847 { yyVAL.str = VitessStr } case 329: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1852 +//line sql.y:1851 { yyVAL.str = TraditionalStr } case 330: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1856 +//line sql.y:1855 { yyVAL.str = AnalyzeStr } case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1862 +//line sql.y:1861 { yyVAL.bytes = yyDollar[1].bytes } case 332: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1866 +//line sql.y:1865 { yyVAL.bytes = yyDollar[1].bytes } case 333: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1870 +//line sql.y:1869 { yyVAL.bytes = yyDollar[1].bytes } case 334: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1876 +//line sql.y:1875 { yyVAL.statement = yyDollar[1].selStmt } case 335: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1880 +//line sql.y:1879 { yyVAL.statement = yyDollar[1].statement } case 336: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1884 +//line sql.y:1883 { yyVAL.statement = yyDollar[1].statement } case 337: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1888 +//line sql.y:1887 { yyVAL.statement = yyDollar[1].statement } case 338: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1893 +//line sql.y:1892 { yyVAL.str = "" } case 339: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1897 +//line sql.y:1896 { yyVAL.str = "" } case 340: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1901 +//line sql.y:1900 { yyVAL.str = "" } case 341: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1907 +//line sql.y:1906 { yyVAL.statement = &OtherRead{} } case 342: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1911 +//line sql.y:1910 { yyVAL.statement = &Explain{Type: yyDollar[2].str, Statement: yyDollar[3].statement} } case 343: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1917 +//line sql.y:1916 { yyVAL.statement = &OtherAdmin{} } case 344: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1921 +//line sql.y:1920 { yyVAL.statement = &OtherAdmin{} } case 345: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1925 +//line sql.y:1924 { yyVAL.statement = &OtherAdmin{} } case 346: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1929 +//line sql.y:1928 { yyVAL.statement = &OtherAdmin{} } case 347: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1935 +//line sql.y:1934 { yyVAL.statement = &DDL{Action: FlushStr} } case 348: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1939 +//line sql.y:1938 { setAllowComments(yylex, true) } case 349: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1943 +//line sql.y:1942 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } case 350: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1949 +//line sql.y:1948 { yyVAL.bytes2 = nil } case 351: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1953 +//line sql.y:1952 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1959 +//line sql.y:1958 { yyVAL.str = UnionStr } case 353: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1963 +//line sql.y:1962 { yyVAL.str = UnionAllStr } case 354: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1967 +//line sql.y:1966 { yyVAL.str = UnionDistinctStr } case 355: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1972 +//line sql.y:1971 { yyVAL.str = "" } case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1976 +//line sql.y:1975 { yyVAL.str = SQLNoCacheStr } case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1980 +//line sql.y:1979 { yyVAL.str = SQLCacheStr } case 358: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1985 +//line sql.y:1984 { yyVAL.str = "" } case 359: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1989 +//line sql.y:1988 { yyVAL.str = DistinctStr } case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1993 +//line sql.y:1992 { yyVAL.str = DistinctStr } case 361: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1998 +//line sql.y:1997 { yyVAL.selectExprs = nil } case 362: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2002 +//line sql.y:2001 { yyVAL.selectExprs = yyDollar[1].selectExprs } case 363: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2007 +//line sql.y:2006 { yyVAL.strs = nil } case 364: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2011 +//line sql.y:2010 { yyVAL.strs = []string{yyDollar[1].str} } case 365: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2015 +//line sql.y:2014 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } case 366: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2019 +//line sql.y:2018 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } case 367: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2023 +//line sql.y:2022 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } case 368: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2029 +//line sql.y:2028 { yyVAL.str = SQLNoCacheStr } case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2033 +//line sql.y:2032 { yyVAL.str = SQLCacheStr } case 370: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2037 +//line sql.y:2036 { yyVAL.str = DistinctStr } case 371: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2041 +//line sql.y:2040 { yyVAL.str = DistinctStr } case 372: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2045 +//line sql.y:2044 { yyVAL.str = StraightJoinHint } case 373: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2049 +//line sql.y:2048 { yyVAL.str = SQLCalcFoundRowsStr } case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2055 +//line sql.y:2054 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } case 375: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2059 +//line sql.y:2058 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } case 376: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2065 +//line sql.y:2064 { yyVAL.selectExpr = &StarExpr{} } case 377: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2069 +//line sql.y:2068 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } case 378: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2073 +//line sql.y:2072 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } case 379: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2077 +//line sql.y:2076 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } case 380: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2082 +//line sql.y:2081 { yyVAL.colIdent = ColIdent{} } case 381: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2086 +//line sql.y:2085 { yyVAL.colIdent = yyDollar[1].colIdent } case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2090 +//line sql.y:2089 { yyVAL.colIdent = yyDollar[2].colIdent } case 384: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2097 +//line sql.y:2096 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 385: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2102 +//line sql.y:2101 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } case 386: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2106 +//line sql.y:2105 { yyVAL.tableExprs = yyDollar[2].tableExprs } case 387: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2112 +//line sql.y:2111 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } case 388: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2116 +//line sql.y:2115 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } case 391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2126 +//line sql.y:2125 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } case 392: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2130 +//line sql.y:2129 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 393: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2134 +//line sql.y:2133 { // missed alias for subquery yylex.Error("Every derived table must have its own alias") @@ -5993,199 +5992,199 @@ yydefault: } case 394: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2140 +//line sql.y:2139 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2146 +//line sql.y:2145 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } case 396: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2150 +//line sql.y:2149 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } case 397: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2156 +//line sql.y:2155 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 398: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2160 +//line sql.y:2159 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 399: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2166 +//line sql.y:2165 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } case 400: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2170 +//line sql.y:2169 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } case 401: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2183 +//line sql.y:2182 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 402: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2187 +//line sql.y:2186 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 403: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2191 +//line sql.y:2190 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 404: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2195 +//line sql.y:2194 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } case 405: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2201 +//line sql.y:2200 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 406: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2203 +//line sql.y:2202 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } case 407: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2207 +//line sql.y:2206 { yyVAL.joinCondition = JoinCondition{} } case 408: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2209 +//line sql.y:2208 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 409: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2213 +//line sql.y:2212 { yyVAL.joinCondition = JoinCondition{} } case 410: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2215 +//line sql.y:2214 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 411: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2218 +//line sql.y:2217 { yyVAL.empty = struct{}{} } case 412: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2220 +//line sql.y:2219 { yyVAL.empty = struct{}{} } case 413: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2223 +//line sql.y:2222 { yyVAL.tableIdent = NewTableIdent("") } case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2227 +//line sql.y:2226 { yyVAL.tableIdent = yyDollar[1].tableIdent } case 415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2231 +//line sql.y:2230 { yyVAL.tableIdent = yyDollar[2].tableIdent } case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2238 +//line sql.y:2237 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 418: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2244 +//line sql.y:2243 { yyVAL.str = JoinStr } case 419: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2248 +//line sql.y:2247 { yyVAL.str = JoinStr } case 420: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2252 +//line sql.y:2251 { yyVAL.str = JoinStr } case 421: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2258 +//line sql.y:2257 { yyVAL.str = StraightJoinStr } case 422: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2264 +//line sql.y:2263 { yyVAL.str = LeftJoinStr } case 423: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2268 +//line sql.y:2267 { yyVAL.str = LeftJoinStr } case 424: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2272 +//line sql.y:2271 { yyVAL.str = RightJoinStr } case 425: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2276 +//line sql.y:2275 { yyVAL.str = RightJoinStr } case 426: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2282 +//line sql.y:2281 { yyVAL.str = NaturalJoinStr } case 427: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2286 +//line sql.y:2285 { if yyDollar[2].str == LeftJoinStr { yyVAL.str = NaturalLeftJoinStr @@ -6195,481 +6194,481 @@ yydefault: } case 428: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2296 +//line sql.y:2295 { yyVAL.tableName = yyDollar[2].tableName } case 429: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2300 +//line sql.y:2299 { yyVAL.tableName = yyDollar[1].tableName } case 430: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2306 +//line sql.y:2305 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 431: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2310 +//line sql.y:2309 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } case 432: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2316 +//line sql.y:2315 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 433: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2321 +//line sql.y:2320 { yyVAL.indexHints = nil } case 434: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2325 +//line sql.y:2324 { yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].columns} } case 435: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2329 +//line sql.y:2328 { yyVAL.indexHints = &IndexHints{Type: UseStr} } case 436: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2333 +//line sql.y:2332 { yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].columns} } case 437: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2337 +//line sql.y:2336 { yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].columns} } case 438: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2342 +//line sql.y:2341 { yyVAL.expr = nil } case 439: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2346 +//line sql.y:2345 { yyVAL.expr = yyDollar[2].expr } case 440: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2352 +//line sql.y:2351 { yyVAL.expr = yyDollar[1].expr } case 441: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2356 +//line sql.y:2355 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2360 +//line sql.y:2359 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 443: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2364 +//line sql.y:2363 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } case 444: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2368 +//line sql.y:2367 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } case 445: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2372 +//line sql.y:2371 { yyVAL.expr = yyDollar[1].expr } case 446: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2376 +//line sql.y:2375 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } case 447: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2382 +//line sql.y:2381 { yyVAL.str = "" } case 448: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2386 +//line sql.y:2385 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 449: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2392 +//line sql.y:2391 { yyVAL.boolVal = BoolVal(true) } case 450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2396 +//line sql.y:2395 { yyVAL.boolVal = BoolVal(false) } case 451: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2402 +//line sql.y:2401 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } case 452: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2406 +//line sql.y:2405 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } case 453: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2410 +//line sql.y:2409 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } case 454: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2414 +//line sql.y:2413 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } case 455: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2418 +//line sql.y:2417 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } case 456: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2422 +//line sql.y:2421 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } case 457: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2426 +//line sql.y:2425 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } case 458: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2430 +//line sql.y:2429 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } case 459: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2434 +//line sql.y:2433 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } case 460: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2438 +//line sql.y:2437 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } case 461: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2444 +//line sql.y:2443 { yyVAL.str = IsNullStr } case 462: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2448 +//line sql.y:2447 { yyVAL.str = IsNotNullStr } case 463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2452 +//line sql.y:2451 { yyVAL.str = IsTrueStr } case 464: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2456 +//line sql.y:2455 { yyVAL.str = IsNotTrueStr } case 465: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2460 +//line sql.y:2459 { yyVAL.str = IsFalseStr } case 466: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2464 +//line sql.y:2463 { yyVAL.str = IsNotFalseStr } case 467: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2470 +//line sql.y:2469 { yyVAL.str = EqualStr } case 468: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2474 +//line sql.y:2473 { yyVAL.str = LessThanStr } case 469: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2478 +//line sql.y:2477 { yyVAL.str = GreaterThanStr } case 470: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2482 +//line sql.y:2481 { yyVAL.str = LessEqualStr } case 471: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2486 +//line sql.y:2485 { yyVAL.str = GreaterEqualStr } case 472: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2490 +//line sql.y:2489 { yyVAL.str = NotEqualStr } case 473: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2494 +//line sql.y:2493 { yyVAL.str = NullSafeEqualStr } case 474: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2499 +//line sql.y:2498 { yyVAL.expr = nil } case 475: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2503 +//line sql.y:2502 { yyVAL.expr = yyDollar[2].expr } case 476: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2509 +//line sql.y:2508 { yyVAL.colTuple = yyDollar[1].valTuple } case 477: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2513 +//line sql.y:2512 { yyVAL.colTuple = yyDollar[1].subquery } case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2517 +//line sql.y:2516 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } case 479: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2523 +//line sql.y:2522 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 480: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2529 +//line sql.y:2528 { yyVAL.exprs = Exprs{yyDollar[1].expr} } case 481: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2533 +//line sql.y:2532 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } case 482: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2539 +//line sql.y:2538 { yyVAL.expr = yyDollar[1].expr } case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2543 +//line sql.y:2542 { yyVAL.expr = yyDollar[1].boolVal } case 484: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2547 +//line sql.y:2546 { yyVAL.expr = yyDollar[1].colName } case 485: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2551 +//line sql.y:2550 { yyVAL.expr = yyDollar[1].expr } case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2555 +//line sql.y:2554 { yyVAL.expr = yyDollar[1].subquery } case 487: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2559 +//line sql.y:2558 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } case 488: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2563 +//line sql.y:2562 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } case 489: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2567 +//line sql.y:2566 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } case 490: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2571 +//line sql.y:2570 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } case 491: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2575 +//line sql.y:2574 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } case 492: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2579 +//line sql.y:2578 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } case 493: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2583 +//line sql.y:2582 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } case 494: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2587 +//line sql.y:2586 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } case 495: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2591 +//line sql.y:2590 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } case 496: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2595 +//line sql.y:2594 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2599 +//line sql.y:2598 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } case 498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2603 +//line sql.y:2602 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2607 +//line sql.y:2606 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } case 500: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2611 +//line sql.y:2610 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } case 501: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2615 +//line sql.y:2614 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } case 502: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2619 +//line sql.y:2618 { yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} } case 503: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2623 +//line sql.y:2622 { yyVAL.expr = &UnaryExpr{Operator: UBinaryStr, Expr: yyDollar[2].expr} } case 504: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2627 +//line sql.y:2626 { yyVAL.expr = &UnaryExpr{Operator: Utf8Str, Expr: yyDollar[2].expr} } case 505: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2631 +//line sql.y:2630 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Str, Expr: yyDollar[2].expr} } case 506: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2635 +//line sql.y:2634 { yyVAL.expr = &UnaryExpr{Operator: Latin1Str, Expr: yyDollar[2].expr} } case 507: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2639 +//line sql.y:2638 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6679,7 +6678,7 @@ yydefault: } case 508: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2647 +//line sql.y:2646 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -6695,19 +6694,19 @@ yydefault: } case 509: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2661 +//line sql.y:2660 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } case 510: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2665 +//line sql.y:2664 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2669 +//line sql.y:2668 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6717,325 +6716,325 @@ yydefault: } case 516: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2687 +//line sql.y:2686 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } case 517: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2691 +//line sql.y:2690 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 518: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2695 +//line sql.y:2694 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 519: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2699 +//line sql.y:2698 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } case 520: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2709 +//line sql.y:2708 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } case 521: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2713 +//line sql.y:2712 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } case 522: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2717 +//line sql.y:2716 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 523: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2721 +//line sql.y:2720 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 524: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2725 +//line sql.y:2724 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } case 525: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2729 +//line sql.y:2728 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } case 526: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2733 +//line sql.y:2732 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } case 527: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2737 +//line sql.y:2736 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } case 528: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2741 +//line sql.y:2740 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } case 529: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:2745 +//line sql.y:2744 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].str} } case 530: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2749 +//line sql.y:2748 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } case 531: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2753 +//line sql.y:2752 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } case 532: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2757 +//line sql.y:2756 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } case 533: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2767 +//line sql.y:2766 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } case 534: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2771 +//line sql.y:2770 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } case 535: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2775 +//line sql.y:2774 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } case 536: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2780 +//line sql.y:2779 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } case 537: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2785 +//line sql.y:2784 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } case 538: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2790 +//line sql.y:2789 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } case 539: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2796 +//line sql.y:2795 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } case 540: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2801 +//line sql.y:2800 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } case 541: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2806 +//line sql.y:2805 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } case 542: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2810 +//line sql.y:2809 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } case 543: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2814 +//line sql.y:2813 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } case 544: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2819 +//line sql.y:2818 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } case 545: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2824 +//line sql.y:2823 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } case 546: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2829 +//line sql.y:2828 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } case 547: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2833 +//line sql.y:2832 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } case 548: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2837 +//line sql.y:2836 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } case 551: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2847 +//line sql.y:2846 { yyVAL.expr = yyDollar[2].expr } case 552: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2857 +//line sql.y:2856 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } case 553: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2861 +//line sql.y:2860 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } case 554: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2865 +//line sql.y:2864 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } case 555: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2869 +//line sql.y:2868 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } case 556: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2873 +//line sql.y:2872 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } case 557: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2877 +//line sql.y:2876 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 558: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2881 +//line sql.y:2880 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 559: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2887 +//line sql.y:2886 { yyVAL.str = "" } case 560: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2891 +//line sql.y:2890 { yyVAL.str = BooleanModeStr } case 561: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2895 +//line sql.y:2894 { yyVAL.str = NaturalLanguageModeStr } case 562: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2899 +//line sql.y:2898 { yyVAL.str = NaturalLanguageModeWithQueryExpansionStr } case 563: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2903 +//line sql.y:2902 { yyVAL.str = QueryExpansionStr } case 564: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2909 +//line sql.y:2908 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 565: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2913 +//line sql.y:2912 { yyVAL.str = string(yyDollar[1].bytes) } case 566: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2919 +//line sql.y:2918 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 567: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2923 +//line sql.y:2922 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Operator: CharacterSetStr} } case 568: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2927 +//line sql.y:2926 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: string(yyDollar[3].colIdent.String())} } case 569: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2931 +//line sql.y:2930 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 570: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2935 +//line sql.y:2934 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2939 +//line sql.y:2938 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length @@ -7043,169 +7042,169 @@ yydefault: } case 572: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2945 +//line sql.y:2944 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 573: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2949 +//line sql.y:2948 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 574: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2953 +//line sql.y:2952 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 575: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2957 +//line sql.y:2956 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 576: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2961 +//line sql.y:2960 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 577: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2965 +//line sql.y:2964 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 578: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2969 +//line sql.y:2968 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 579: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2974 +//line sql.y:2973 { yyVAL.expr = nil } case 580: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2978 +//line sql.y:2977 { yyVAL.expr = yyDollar[1].expr } case 581: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2983 +//line sql.y:2982 { yyVAL.str = string("") } case 582: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2987 +//line sql.y:2986 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } case 583: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2993 +//line sql.y:2992 { yyVAL.whens = []*When{yyDollar[1].when} } case 584: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2997 +//line sql.y:2996 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } case 585: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3003 +//line sql.y:3002 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } case 586: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3008 +//line sql.y:3007 { yyVAL.expr = nil } case 587: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3012 +//line sql.y:3011 { yyVAL.expr = yyDollar[2].expr } case 588: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3018 +//line sql.y:3017 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } case 589: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3022 +//line sql.y:3021 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } case 590: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3026 +//line sql.y:3025 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } case 591: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3032 +//line sql.y:3031 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } case 592: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3036 +//line sql.y:3035 { yyVAL.expr = NewHexVal(yyDollar[1].bytes) } case 593: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3040 +//line sql.y:3039 { yyVAL.expr = NewBitVal(yyDollar[1].bytes) } case 594: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3044 +//line sql.y:3043 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } case 595: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3048 +//line sql.y:3047 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } case 596: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3052 +//line sql.y:3051 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } case 597: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3056 +//line sql.y:3055 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } case 598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3060 +//line sql.y:3059 { yyVAL.expr = &NullVal{} } case 599: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3066 +//line sql.y:3065 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7216,223 +7215,223 @@ yydefault: } case 600: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3075 +//line sql.y:3074 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } case 601: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3079 +//line sql.y:3078 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } case 602: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3084 +//line sql.y:3083 { yyVAL.exprs = nil } case 603: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3088 +//line sql.y:3087 { yyVAL.exprs = yyDollar[3].exprs } case 604: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3093 +//line sql.y:3092 { yyVAL.expr = nil } case 605: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3097 +//line sql.y:3096 { yyVAL.expr = yyDollar[2].expr } case 606: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3102 +//line sql.y:3101 { yyVAL.orderBy = nil } case 607: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3106 +//line sql.y:3105 { yyVAL.orderBy = yyDollar[3].orderBy } case 608: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3112 +//line sql.y:3111 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } case 609: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3116 +//line sql.y:3115 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } case 610: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3122 +//line sql.y:3121 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } case 611: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3127 +//line sql.y:3126 { yyVAL.str = AscScr } case 612: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3131 +//line sql.y:3130 { yyVAL.str = AscScr } case 613: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3135 +//line sql.y:3134 { yyVAL.str = DescScr } case 614: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3140 +//line sql.y:3139 { yyVAL.limit = nil } case 615: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3144 +//line sql.y:3143 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } case 616: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3148 +//line sql.y:3147 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } case 617: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3152 +//line sql.y:3151 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } case 618: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3157 +//line sql.y:3156 { yyVAL.str = "" } case 619: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3161 +//line sql.y:3160 { yyVAL.str = ForUpdateStr } case 620: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3165 +//line sql.y:3164 { yyVAL.str = ShareModeStr } case 621: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3178 +//line sql.y:3177 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } case 622: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3182 +//line sql.y:3181 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } case 623: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3186 +//line sql.y:3185 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } case 624: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3190 +//line sql.y:3189 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } case 625: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3196 +//line sql.y:3195 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 626: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3200 +//line sql.y:3199 { yyVAL.columns = Columns{yyDollar[3].colIdent} } case 627: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3204 +//line sql.y:3203 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 628: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3208 +//line sql.y:3207 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } case 629: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3213 +//line sql.y:3212 { yyVAL.updateExprs = nil } case 630: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3217 +//line sql.y:3216 { yyVAL.updateExprs = yyDollar[5].updateExprs } case 631: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3223 +//line sql.y:3222 { yyVAL.values = Values{yyDollar[1].valTuple} } case 632: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3227 +//line sql.y:3226 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } case 633: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3233 +//line sql.y:3232 { yyVAL.valTuple = yyDollar[1].valTuple } case 634: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3237 +//line sql.y:3236 { yyVAL.valTuple = ValTuple{} } case 635: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3243 +//line sql.y:3242 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } case 636: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3249 +//line sql.y:3248 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7442,284 +7441,284 @@ yydefault: } case 637: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3259 +//line sql.y:3258 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } case 638: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3263 +//line sql.y:3262 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } case 639: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3269 +//line sql.y:3268 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } case 640: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3275 +//line sql.y:3274 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } case 641: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3279 +//line sql.y:3278 { yyDollar[2].setExpr.Scope = yyDollar[1].str yyVAL.setExprs = SetExprs{yyDollar[2].setExpr} } case 642: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3284 +//line sql.y:3283 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } case 643: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3290 +//line sql.y:3289 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("on"))} } case 644: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3294 +//line sql.y:3293 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("off"))} } case 645: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3298 +//line sql.y:3297 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: yyDollar[3].expr} } case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3302 +//line sql.y:3301 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Expr: yyDollar[2].expr} } case 648: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3309 +//line sql.y:3308 { yyVAL.bytes = []byte("charset") } case 650: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3316 +//line sql.y:3315 { yyVAL.expr = NewStrVal([]byte(yyDollar[1].colIdent.String())) } case 651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3320 +//line sql.y:3319 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } case 652: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3324 +//line sql.y:3323 { yyVAL.expr = &Default{} } case 655: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3333 +//line sql.y:3332 { yyVAL.byt = 0 } case 656: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3335 +//line sql.y:3334 { yyVAL.byt = 1 } case 657: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3338 +//line sql.y:3337 { yyVAL.empty = struct{}{} } case 658: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3340 +//line sql.y:3339 { yyVAL.empty = struct{}{} } case 659: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3343 +//line sql.y:3342 { yyVAL.str = "" } case 660: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3345 +//line sql.y:3344 { yyVAL.str = IgnoreStr } case 661: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3349 +//line sql.y:3348 { yyVAL.empty = struct{}{} } case 662: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3351 +//line sql.y:3350 { yyVAL.empty = struct{}{} } case 663: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3353 +//line sql.y:3352 { yyVAL.empty = struct{}{} } case 664: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3355 +//line sql.y:3354 { yyVAL.empty = struct{}{} } case 665: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3357 +//line sql.y:3356 { yyVAL.empty = struct{}{} } case 666: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3359 +//line sql.y:3358 { yyVAL.empty = struct{}{} } case 667: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3361 +//line sql.y:3360 { yyVAL.empty = struct{}{} } case 668: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3363 +//line sql.y:3362 { yyVAL.empty = struct{}{} } case 669: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3365 +//line sql.y:3364 { yyVAL.empty = struct{}{} } case 670: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3367 +//line sql.y:3366 { yyVAL.empty = struct{}{} } case 671: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3370 +//line sql.y:3369 { yyVAL.empty = struct{}{} } case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3372 +//line sql.y:3371 { yyVAL.empty = struct{}{} } case 673: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3374 +//line sql.y:3373 { yyVAL.empty = struct{}{} } case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3378 +//line sql.y:3377 { yyVAL.empty = struct{}{} } case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3380 +//line sql.y:3379 { yyVAL.empty = struct{}{} } case 676: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3383 +//line sql.y:3382 { yyVAL.empty = struct{}{} } case 677: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3385 +//line sql.y:3384 { yyVAL.empty = struct{}{} } case 678: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3387 +//line sql.y:3386 { yyVAL.empty = struct{}{} } case 679: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3390 +//line sql.y:3389 { yyVAL.colIdent = ColIdent{} } case 680: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3392 +//line sql.y:3391 { yyVAL.colIdent = yyDollar[2].colIdent } case 681: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3396 +//line sql.y:3395 { yyVAL.colIdent = yyDollar[1].colIdent } case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3400 +//line sql.y:3399 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3407 +//line sql.y:3406 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3413 +//line sql.y:3412 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3417 +//line sql.y:3416 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3424 +//line sql.y:3423 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 979: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3740 +//line sql.y:3739 { if incNesting(yylex) { yylex.Error("max nesting level reached") @@ -7728,31 +7727,31 @@ yydefault: } case 980: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3749 +//line sql.y:3748 { decNesting(yylex) } case 981: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3754 +//line sql.y:3753 { skipToEnd(yylex) } case 982: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3759 +//line sql.y:3758 { skipToEnd(yylex) } case 983: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3763 +//line sql.y:3762 { skipToEnd(yylex) } case 984: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3767 +//line sql.y:3766 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 2042f386a54..92f29510c1b 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -399,8 +399,7 @@ select_statement: } | openb select_statement closeb order_by_opt limit_opt lock_opt { - // TODO(sougou): may potentially need a new AST node for this. - $$ = nil + $$ = &Union{FirstStatement: &ParenSelect{Select: $2}, OrderBy: $4, Limit:$5, Lock:$6} } | select_statement union_op union_rhs order_by_opt limit_opt lock_opt { From b789e665f67b63006e85eca075e4f462f713ca58 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 18 Jun 2020 10:58:36 +0200 Subject: [PATCH 045/430] Added UNION end to end tests Signed-off-by: Andres Taylor --- go/test/endtoend/vtgate/misc_test.go | 14 ++++++++++++++ go/vt/vtexplain/vtexplain_vttablet.go | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index 95a5a52f400..3ee049f0e6d 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -558,6 +558,20 @@ func TestCastConvert(t *testing.T) { assertMatches(t, conn, `SELECT CAST("test" AS CHAR(60))`, `[[VARCHAR("test")]]`) } +func TestUnion(t *testing.T) { + conn, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + defer conn.Close() + + assertMatches(t, conn, `SELECT 1 UNION SELECT 1 UNION SELECT 1`, `[[INT64(1)]]`) + assertMatches(t, conn, `SELECT 1,'a' UNION SELECT 1,'a' UNION SELECT 1,'a' ORDER BY 1`, `[[INT64(1) VARCHAR("a")]]`) + assertMatches(t, conn, `SELECT 1,'z' UNION SELECT 2,'q' UNION SELECT 3,'b' ORDER BY 2`, `[[INT64(3) VARCHAR("b")] [INT64(2) VARCHAR("q")] [INT64(1) VARCHAR("z")]]`) + assertMatches(t, conn, `SELECT 1,'a' UNION ALL SELECT 1,'a' UNION ALL SELECT 1,'a' ORDER BY 1`, `[[INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")]]`) + assertMatches(t, conn, `(SELECT 1,'a') UNION ALL (SELECT 1,'a') UNION ALL (SELECT 1,'a') ORDER BY 1`, `[[INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")]]`) + assertMatches(t, conn, `(SELECT 1,'a') ORDER BY 1`, `[[INT64(1) VARCHAR("a")]]`) + assertMatches(t, conn, `(SELECT 1,'a' order by 1) union SELECT 1,'a' ORDER BY 1`, `[[INT64(1) VARCHAR("a")]]`) +} + func assertMatches(t *testing.T, conn *mysql.Conn, query, expected string) { t.Helper() qr := exec(t, conn, query) diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index d621763dcb3..6dd19a07beb 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -454,7 +454,7 @@ func (t *explainTablet) HandleQuery(c *mysql.Conn, query string, callback func(* case *sqlparser.Select: selStmt = stmt case *sqlparser.Union: - selStmt = stmt.Statements[1].(*sqlparser.Select) + selStmt = stmt.UnionSelects[1].Statement.(*sqlparser.Select) default: return fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) } From 4bef9274094444a908a37e5b367be31906216e41 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Thu, 18 Jun 2020 13:31:43 +0200 Subject: [PATCH 046/430] Synchronize access to uvstreamer.vschema Signed-off-by: Rohit Nayak --- go/vt/vttablet/tabletserver/vstreamer/copy.go | 4 ++-- .../vttablet/tabletserver/vstreamer/uvstreamer.go | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 22e73cbd67a..97874be6708 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -67,7 +67,7 @@ func (uvs *uvstreamer) catchup(ctx context.Context) error { errch := make(chan error, 1) go func() { startPos := mysql.EncodePosition(uvs.pos) - vs := newVStreamer(ctx, uvs.cp, uvs.se, uvs.sh, startPos, "", uvs.filter, uvs.vschema, uvs.send2) + vs := newVStreamer(ctx, uvs.cp, uvs.se, uvs.sh, startPos, "", uvs.filter, uvs.getVSchema(), uvs.send2) errch <- vs.Stream() uvs.vs = nil log.Infof("catchup vs.stream returned with vs.pos %s", vs.pos.String()) @@ -273,7 +273,7 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { func (uvs *uvstreamer) fastForward(stopPos string) error { log.Infof("starting fastForward from %s upto pos %s", mysql.EncodePosition(uvs.pos), stopPos) uvs.stopPos, _ = mysql.DecodePosition(stopPos) - vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), "", uvs.filter, uvs.vschema, uvs.send2) + vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), "", uvs.filter, uvs.getVSchema(), uvs.send2) uvs.vs = vs return vs.Stream() } diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 0ceb013534b..67f9033a79d 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -57,7 +57,9 @@ type uvstreamer struct { startPos string filter *binlogdatapb.Filter inTablePKs []*binlogdatapb.TableLastPK - vschema *localVSchema + + vschema *localVSchema + muVSchema sync.Mutex //to handle race when WatchSrvVSchema can set VSchema on topo change // map holds tables remaining to be fully copied, it is depleted as each table gets completely copied plans map[string]*tablePlan @@ -368,19 +370,27 @@ func (uvs *uvstreamer) Stream() error { uvs.sendTestEvent("Copy Done") } log.V(2).Infof("Starting replicate in uvstreamer.Stream()") - vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), mysql.EncodePosition(uvs.stopPos), uvs.filter, uvs.vschema, uvs.send) + vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), mysql.EncodePosition(uvs.stopPos), uvs.filter, uvs.getVSchema(), uvs.send) uvs.vs = vs return vs.Stream() } // SetVSchema updates the vstreamer against the new vschema. func (uvs *uvstreamer) SetVSchema(vschema *localVSchema) { + uvs.muVSchema.Lock() + defer uvs.muVSchema.Unlock() uvs.vschema = vschema if uvs.vs != nil { uvs.vs.SetVSchema(vschema) } } +func (uvs *uvstreamer) getVSchema() *localVSchema { + uvs.muVSchema.Lock() + defer uvs.muVSchema.Unlock() + return uvs.vschema +} + func (uvs *uvstreamer) setCopyState(tableName string, qr *querypb.QueryResult) { uvs.plans[tableName].tablePK.Lastpk = qr } From dc415e1265b606bff0bc09ea1d96150c345f8fcc Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Thu, 18 Jun 2020 11:26:57 -0700 Subject: [PATCH 047/430] sqlparser: allow unions in subqueries Signed-off-by: Sugu Sougoumarane --- go/vt/sqlparser/sql.go | 7124 ++++++++++++++++++++-------------------- go/vt/sqlparser/sql.y | 12 +- 2 files changed, 3594 insertions(+), 3542 deletions(-) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 60fba8958ee..b0357e5c57e 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -823,1844 +823,1874 @@ var yyExca = [...]int{ 1, -1, -2, 0, -1, 40, - 33, 302, - 131, 302, - 143, 302, - 168, 316, - 169, 316, - -2, 304, - -1, 65, - 38, 355, - -2, 363, - -1, 376, - 119, 685, - -2, 681, + 33, 303, + 131, 303, + 143, 303, + 168, 317, + 169, 317, + -2, 305, + -1, 66, + 38, 356, + -2, 364, -1, 377, 119, 686, -2, 682, - -1, 390, - 38, 356, - -2, 368, - -1, 391, + -1, 378, + 119, 687, + -2, 683, + -1, 392, 38, 357, -2, 369, - -1, 414, - 87, 937, - -2, 69, - -1, 415, - 87, 853, + -1, 393, + 38, 358, + -2, 370, + -1, 416, + 87, 938, -2, 70, - -1, 420, - 87, 821, - -2, 647, + -1, 417, + 87, 854, + -2, 71, -1, 422, - 87, 884, - -2, 649, - -1, 730, - 1, 393, - 5, 393, - 12, 393, - 13, 393, - 14, 393, - 15, 393, - 17, 393, - 19, 393, - 30, 393, - 31, 393, - 45, 393, - 46, 393, - 47, 393, - 48, 393, - 49, 393, - 51, 393, - 52, 393, - 55, 393, - 56, 393, - 58, 393, - 59, 393, - 360, 393, - -2, 411, - -1, 733, - 56, 51, - 58, 51, - -2, 55, - -1, 907, - 119, 688, - -2, 684, + 87, 822, + -2, 648, + -1, 424, + 87, 885, + -2, 650, + -1, 737, + 1, 394, + 5, 394, + 12, 394, + 13, 394, + 14, 394, + 15, 394, + 17, 394, + 19, 394, + 30, 394, + 31, 394, + 45, 394, + 46, 394, + 47, 394, + 48, 394, + 49, 394, + 51, 394, + 52, 394, + 55, 394, + 56, 394, + 58, 394, + 59, 394, + 360, 394, + -2, 412, + -1, 740, + 56, 52, + 58, 52, + -2, 56, + -1, 914, + 119, 689, + -2, 685, } const yyPrivate = 57344 -const yyLast = 17529 +const yyLast = 17835 var yyAct = [...]int{ - 376, 1557, 1368, 1567, 1441, 1256, 320, 1524, 1473, 1428, - 1163, 1007, 1181, 1310, 335, 1342, 980, 1311, 349, 64, - 3, 701, 585, 1164, 574, 1003, 378, 1036, 666, 1307, - 1050, 1016, 1006, 1316, 306, 84, 944, 1151, 1322, 275, - 832, 295, 275, 894, 1273, 419, 1100, 275, 1207, 851, - 1224, 1020, 901, 1233, 746, 982, 968, 725, 392, 710, - 925, 726, 939, 1046, 871, 745, 408, 961, 727, 413, - 543, 275, 84, 717, 583, 544, 275, 678, 275, 405, - 735, 311, 65, 307, 25, 858, 310, 61, 7, 679, - 6, 5, 1560, 318, 416, 563, 1544, 1555, 1532, 1552, - 1369, 1543, 1531, 1290, 1069, 1397, 27, 322, 55, 30, - 31, 67, 68, 69, 70, 71, 548, 1336, 1068, 86, - 87, 88, 271, 267, 268, 269, 997, 398, 1499, 628, - 627, 637, 638, 630, 631, 632, 633, 634, 635, 636, - 629, 1195, 603, 639, 1194, 998, 999, 1196, 309, 86, - 87, 88, 308, 263, 1337, 1338, 261, 54, 265, 361, - 1067, 367, 368, 365, 366, 364, 363, 362, 747, 1215, - 748, 1029, 1258, 598, 1431, 369, 370, 599, 596, 597, - 86, 87, 88, 1037, 1388, 1386, 301, 821, 601, 580, - 820, 582, 1260, 591, 592, 818, 1554, 1551, 1525, 1255, - 962, 602, 1517, 1021, 564, 1575, 1571, 550, 86, 87, - 88, 265, 1064, 1061, 1062, 1474, 1060, 588, 1261, 825, - 1482, 732, 1243, 579, 581, 1259, 819, 809, 822, 1332, - 1476, 553, 1182, 1184, 859, 860, 861, 1331, 1252, 1023, - 1330, 546, 904, 270, 1254, 278, 266, 1117, 1081, 1071, - 1074, 1080, 264, 1506, 1239, 1240, 1241, 651, 652, 1114, - 273, 279, 275, 555, 556, 1411, 1191, 275, 302, 565, - 282, 1156, 1127, 275, 262, 1108, 741, 721, 289, 275, - 572, 664, 570, 578, 84, 1004, 1066, 639, 84, 993, - 84, 576, 407, 86, 87, 88, 84, 545, 629, 547, - 1475, 639, 1500, 84, 1137, 1023, 1515, 856, 1065, 577, - 852, 846, 287, 1183, 619, 587, 1491, 1037, 294, 1530, - 1292, 1569, 74, 609, 1570, 1242, 1568, 589, 1483, 1481, - 1247, 1244, 1235, 1245, 1238, 617, 1234, 86, 87, 88, - 1236, 1237, 1022, 614, 615, 280, 1355, 1253, 1070, 1251, - 1030, 619, 1274, 1320, 1246, 749, 651, 652, 56, 613, - 75, 926, 590, 1072, 593, 566, 567, 568, 651, 652, - 604, 811, 291, 283, 575, 292, 293, 299, 926, 1213, - 1124, 284, 286, 296, 878, 281, 298, 297, 1023, 1520, - 560, 714, 612, 1276, 610, 611, 853, 847, 876, 877, - 875, 84, 705, 275, 275, 275, 1576, 704, 1022, 1535, - 1142, 1143, 84, 707, 86, 87, 88, 1437, 84, 1537, - 86, 87, 88, 549, 54, 649, 1026, 1278, 1436, 1282, - 1113, 1277, 1027, 1275, 416, 665, 874, 1228, 1280, 1227, - 681, 683, 685, 687, 689, 691, 692, 1279, 1216, 542, - 1577, 711, 682, 684, 1516, 688, 690, 557, 693, 558, - 1281, 1283, 559, 618, 617, 1453, 706, 1434, 628, 627, - 637, 638, 630, 631, 632, 633, 634, 635, 636, 629, - 619, 744, 639, 554, 734, 618, 617, 739, 562, 387, - 1225, 1022, 1266, 1091, 569, 837, 1019, 1017, 387, 1018, - 571, 1488, 619, 53, 551, 552, 1015, 1021, 1093, 1094, - 1095, 730, 628, 627, 637, 638, 630, 631, 632, 633, - 634, 635, 636, 629, 1487, 1101, 639, 379, 628, 627, - 637, 638, 630, 631, 632, 633, 634, 635, 636, 629, - 1351, 1308, 639, 275, 1319, 618, 617, 807, 84, 1024, - 810, 260, 812, 275, 275, 84, 84, 84, 987, 1400, - 736, 275, 619, 1319, 275, 1152, 381, 275, 830, 831, - 954, 275, 1407, 84, 1112, 616, 1111, 1490, 84, 84, - 84, 275, 84, 84, 630, 631, 632, 633, 634, 635, - 636, 629, 84, 84, 639, 618, 617, 1359, 836, 628, - 627, 637, 638, 630, 631, 632, 633, 634, 635, 636, - 629, 965, 619, 639, 1479, 1553, 834, 866, 868, 869, - 402, 403, 808, 867, 724, 1562, 733, 1539, 387, 815, - 816, 817, 709, 965, 632, 633, 634, 635, 636, 629, - 895, 872, 639, 826, 618, 617, 1199, 835, 996, 897, - 63, 1294, 839, 840, 841, 1140, 843, 844, 1139, 1479, - 1528, 619, 1152, 84, 1479, 387, 848, 849, 637, 638, - 630, 631, 632, 633, 634, 635, 636, 629, 914, 917, - 639, 86, 87, 88, 927, 896, 54, 905, 86, 87, - 88, 1130, 1198, 1479, 1507, 84, 84, 1257, 1138, 86, - 87, 88, 1479, 1478, 387, 906, 1426, 1425, 1319, 84, - 907, 1413, 387, 1410, 387, 1129, 275, 618, 617, 84, - 1361, 1360, 1357, 1358, 275, 27, 946, 1357, 1356, 948, - 873, 954, 275, 275, 619, 665, 275, 275, 954, 387, - 275, 275, 275, 84, 905, 898, 899, 965, 387, 1158, - 935, 936, 616, 387, 27, 1159, 84, 544, 756, 755, - 736, 737, 960, 964, 757, 416, 824, 907, 742, 1545, - 956, 955, 1443, 1031, 813, 814, 54, 27, 1008, 1418, - 1051, 1347, 823, 1202, 1460, 407, 1047, 834, 829, 979, - 1444, 965, 958, 988, 383, 1323, 1324, 990, 1038, 1039, - 1040, 986, 842, 737, 1042, 54, 738, 991, 740, 995, - 275, 84, 994, 84, 1041, 1073, 665, 1054, 954, 275, - 275, 275, 275, 275, 377, 275, 275, 1011, 54, 275, - 84, 338, 337, 340, 341, 342, 343, 1052, 1558, 730, - 339, 344, 1349, 730, 1326, 54, 275, 730, 738, 1308, - 736, 275, 1229, 275, 275, 857, 828, 1175, 275, 85, - 1173, 393, 1176, 276, 1549, 1174, 276, 1048, 1049, 1329, - 1177, 276, 974, 975, 1328, 394, 1088, 1399, 1172, 1171, - 1542, 1298, 712, 713, 396, 1056, 395, 1058, 1401, 708, - 1547, 1150, 1149, 922, 872, 276, 85, 940, 1220, 754, - 276, 573, 276, 1212, 1085, 1522, 1405, 923, 1521, 941, - 910, 911, 1458, 1394, 916, 919, 920, 628, 627, 637, - 638, 630, 631, 632, 633, 634, 635, 636, 629, 1210, - 393, 639, 1204, 1439, 1057, 827, 978, 957, 702, 934, - 1096, 1404, 937, 938, 394, 963, 384, 385, 703, 350, - 26, 390, 391, 396, 1148, 395, 275, 379, 989, 1403, - 1304, 1152, 1147, 600, 1564, 1563, 275, 275, 275, 275, - 275, 1165, 1118, 1115, 850, 715, 26, 1564, 275, 1504, - 1432, 1160, 1136, 873, 275, 1123, 383, 63, 275, 66, - 60, 1, 628, 627, 637, 638, 630, 631, 632, 633, - 634, 635, 636, 629, 1556, 1197, 639, 84, 1370, 1144, - 1440, 1145, 382, 1154, 1153, 1155, 1203, 1063, 1200, 1523, - 1208, 1208, 1472, 1341, 1187, 1014, 1189, 1166, 1190, 1008, - 1169, 1055, 1005, 1178, 73, 1167, 1168, 930, 1170, 1186, - 1075, 1076, 1077, 1078, 1079, 1188, 1082, 1083, 541, 72, - 1084, 1192, 1514, 845, 586, 84, 84, 1013, 1012, 1480, - 1217, 1218, 1219, 730, 1221, 1222, 1223, 1086, 1430, 1209, - 1205, 1206, 1087, 730, 730, 730, 730, 730, 1025, 1092, - 1214, 1028, 1348, 1211, 1519, 84, 276, 762, 760, 761, - 759, 276, 764, 1226, 1232, 730, 763, 276, 758, 288, - 411, 977, 386, 276, 750, 1053, 716, 76, 85, 84, - 1250, 1249, 85, 895, 85, 1248, 1032, 1033, 1034, 1035, - 85, 1059, 970, 973, 974, 975, 971, 85, 972, 976, - 1231, 1272, 1043, 1044, 1045, 855, 1263, 1264, 285, 594, - 595, 290, 647, 1146, 1265, 1105, 1106, 275, 1291, 1193, - 1295, 417, 410, 1314, 1141, 943, 1284, 84, 1285, 1262, - 1271, 1402, 84, 84, 1121, 1165, 1303, 1122, 906, 1309, - 675, 924, 321, 907, 865, 336, 333, 1301, 1312, 1272, - 334, 970, 973, 974, 975, 971, 84, 972, 976, 949, - 1157, 1323, 1324, 621, 319, 313, 729, 722, 969, 967, - 84, 1318, 84, 84, 966, 406, 1208, 1208, 1327, 1325, - 1321, 728, 953, 1340, 1334, 389, 1396, 1498, 388, 1333, - 921, 1354, 1008, 46, 1008, 85, 1335, 276, 276, 276, - 275, 605, 1339, 584, 303, 1344, 85, 584, 29, 584, - 62, 397, 85, 1352, 1353, 584, 20, 19, 18, 22, - 275, 17, 16, 26, 1345, 1346, 84, 15, 1371, 84, - 84, 84, 275, 561, 33, 24, 648, 650, 1363, 627, - 637, 638, 630, 631, 632, 633, 634, 635, 636, 629, - 23, 400, 639, 1364, 14, 1366, 13, 12, 1376, 1377, - 11, 10, 9, 8, 4, 608, 21, 663, 380, 2, - 0, 667, 668, 669, 670, 671, 672, 673, 674, 1384, - 677, 680, 680, 680, 686, 680, 680, 686, 680, 694, - 695, 696, 697, 698, 699, 700, 1165, 0, 0, 0, - 0, 0, 26, 0, 312, 0, 0, 0, 0, 1406, - 84, 0, 0, 1415, 0, 1414, 0, 0, 84, 0, - 0, 1200, 0, 731, 0, 0, 1424, 0, 0, 0, - 0, 0, 1008, 84, 0, 0, 0, 276, 1302, 0, - 84, 0, 85, 0, 0, 0, 0, 276, 276, 85, - 85, 85, 0, 1446, 1433, 276, 1435, 0, 276, 0, - 0, 276, 1442, 0, 0, 276, 0, 85, 0, 0, - 0, 0, 85, 85, 85, 276, 85, 85, 0, 0, - 1445, 84, 84, 0, 84, 0, 85, 85, 1452, 84, - 0, 84, 84, 84, 275, 1459, 1312, 84, 1466, 1461, - 1467, 1469, 1470, 1457, 0, 0, 1465, 1438, 0, 0, - 1471, 0, 1477, 0, 84, 275, 0, 1484, 0, 0, - 0, 1362, 0, 1492, 0, 0, 0, 0, 0, 1485, - 0, 1486, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1365, 0, 347, 1505, 1513, 0, 0, 0, 1312, - 84, 1512, 0, 1375, 1511, 0, 0, 85, 0, 0, - 0, 84, 84, 0, 0, 1526, 0, 584, 0, 0, - 0, 0, 0, 1527, 584, 584, 584, 84, 83, 0, - 0, 1165, 0, 1442, 1008, 1533, 0, 0, 275, 85, - 85, 0, 584, 0, 0, 0, 84, 584, 584, 584, - 0, 584, 584, 85, 1541, 0, 0, 0, 0, 0, - 276, 584, 584, 85, 1548, 418, 84, 1546, 276, 0, - 0, 0, 0, 0, 0, 1550, 276, 276, 1561, 0, - 276, 276, 0, 0, 276, 276, 276, 85, 1572, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 85, 623, 0, 626, 0, 0, 0, 0, 0, 640, - 641, 642, 643, 644, 645, 646, 620, 624, 625, 622, - 628, 627, 637, 638, 630, 631, 632, 633, 634, 635, - 636, 629, 0, 0, 639, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1381, 1382, 0, 1383, 0, - 0, 1385, 312, 1387, 276, 85, 0, 85, 0, 0, - 0, 676, 0, 276, 276, 276, 276, 276, 1393, 276, - 276, 0, 0, 276, 85, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1493, 0, 0, 0, - 276, 0, 0, 0, 0, 276, 0, 276, 276, 0, - 0, 731, 276, 0, 0, 731, 0, 0, 0, 731, - 0, 0, 0, 0, 1427, 0, 0, 0, 27, 28, - 55, 30, 31, 908, 909, 628, 627, 637, 638, 630, - 631, 632, 633, 634, 635, 636, 629, 59, 0, 639, - 0, 0, 32, 49, 50, 0, 52, 628, 627, 637, - 638, 630, 631, 632, 633, 634, 635, 636, 629, 1536, - 0, 639, 0, 947, 0, 41, 0, 0, 0, 54, - 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, - 584, 418, 584, 418, 0, 0, 0, 0, 0, 418, - 0, 0, 0, 0, 0, 0, 606, 0, 0, 584, - 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 276, 276, 276, 276, 276, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 276, 0, - 0, 0, 276, 0, 34, 35, 37, 36, 39, 0, - 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 40, 58, 57, 0, 0, 47, 48, - 38, 0, 0, 0, 0, 1107, 0, 0, 838, 0, - 0, 0, 0, 0, 42, 43, 0, 44, 45, 0, - 0, 0, 0, 0, 719, 0, 0, 0, 0, 85, - 85, 0, 854, 0, 0, 418, 0, 0, 0, 0, - 0, 751, 0, 0, 0, 0, 0, 0, 862, 863, - 864, 0, 0, 0, 0, 731, 0, 0, 0, 85, - 1392, 1161, 1162, 0, 0, 731, 731, 731, 731, 731, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1185, 0, 85, 0, 1103, 0, 731, 0, 1104, - 0, 0, 0, 0, 0, 0, 0, 0, 1109, 1110, - 56, 912, 913, 0, 1116, 0, 0, 1119, 1120, 0, - 0, 0, 0, 0, 0, 1126, 0, 0, 0, 1128, - 0, 276, 1131, 1132, 1133, 1134, 1135, 0, 0, 0, - 0, 85, 0, 0, 942, 945, 85, 85, 0, 628, - 627, 637, 638, 630, 631, 632, 633, 634, 635, 636, - 629, 0, 0, 639, 0, 584, 0, 0, 1391, 0, - 85, 0, 0, 0, 0, 0, 0, 1180, 0, 0, - 0, 418, 0, 0, 85, 0, 85, 85, 418, 418, - 418, 1002, 0, 0, 584, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, - 0, 418, 418, 418, 276, 418, 418, 0, 0, 0, - 0, 0, 0, 0, 0, 418, 418, 315, 0, 0, - 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, - 85, 0, 0, 85, 85, 85, 276, 628, 627, 637, - 638, 630, 631, 632, 633, 634, 635, 636, 629, 1102, - 0, 639, 0, 0, 0, 0, 0, 0, 0, 1313, - 0, 26, 0, 0, 0, 0, 0, 0, 0, 628, - 627, 637, 638, 630, 631, 632, 633, 634, 635, 636, - 629, 0, 0, 639, 0, 0, 900, 0, 418, 0, - 0, 0, 0, 1269, 1270, 0, 0, 0, 0, 0, - 0, 928, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 85, 0, 0, 0, 932, 933, - 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 950, 0, 0, 0, 0, 85, 0, 0, - 0, 0, 719, 0, 85, 418, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1125, 0, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, - 0, 0, 0, 0, 0, 85, 85, 0, 85, 0, - 1395, 0, 0, 85, 0, 85, 85, 85, 276, 0, - 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 85, 276, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1420, 1421, 1422, 0, 418, 0, 418, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 418, 85, 0, 0, 0, 0, 1379, - 0, 1380, 584, 0, 0, 85, 85, 0, 0, 0, - 0, 0, 1389, 1390, 0, 0, 0, 0, 0, 0, - 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, - 85, 1408, 1409, 0, 1412, 0, 0, 1313, 0, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 85, 1423, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1489, - 0, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 0, 0, 0, 0, 348, 1293, 0, 0, 0, - 1313, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1299, 1300, 945, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1305, 0, 0, 0, 928, 0, - 0, 0, 0, 0, 274, 0, 0, 300, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 1468, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 401, 0, 0, 409, 0, 0, 0, - 418, 274, 0, 274, 0, 1494, 1495, 1496, 1497, 0, - 1501, 0, 1502, 1503, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1559, 1508, 0, 1509, 1510, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1230, 418, - 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, - 0, 1538, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1398, 0, 0, 0, - 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 779, 312, 0, 0, 0, 0, - 0, 418, 1416, 1573, 1574, 1417, 0, 0, 1419, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 418, 0, 928, 0, 0, 1315, 1317, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1317, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, - 0, 0, 274, 418, 0, 418, 1343, 767, 274, 0, - 0, 0, 0, 0, 274, 1456, 312, 0, 0, 870, - 0, 0, 879, 880, 881, 882, 883, 884, 885, 886, - 887, 888, 889, 890, 891, 892, 893, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 780, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1367, - 0, 0, 1372, 1373, 1374, 0, 0, 0, 0, 0, - 0, 793, 796, 797, 798, 799, 800, 801, 931, 802, - 803, 804, 805, 806, 781, 782, 783, 784, 765, 766, - 794, 0, 768, 0, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 785, 786, 787, 788, 789, 790, - 791, 792, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 928, 0, 401, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 274, - 274, 0, 0, 418, 0, 0, 0, 0, 0, 0, - 0, 1429, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 795, 0, 0, 418, 0, 0, 0, - 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, + 377, 1565, 1575, 1375, 1532, 1171, 321, 1435, 1264, 1448, + 1481, 1317, 587, 1013, 1349, 336, 707, 1017, 1189, 385, + 1314, 1060, 990, 1318, 1046, 1172, 1016, 65, 3, 307, + 668, 576, 350, 1283, 1026, 85, 1323, 901, 421, 276, + 1215, 296, 276, 1329, 839, 1159, 585, 276, 63, 1110, + 858, 908, 1241, 1232, 1030, 992, 978, 717, 732, 734, + 394, 712, 753, 934, 752, 971, 379, 878, 410, 724, + 61, 733, 276, 85, 545, 415, 546, 276, 308, 276, + 25, 311, 1056, 312, 407, 418, 66, 742, 865, 60, + 739, 7, 681, 6, 5, 1568, 1552, 1563, 1540, 1560, + 319, 565, 1376, 682, 1551, 1539, 1300, 1405, 1079, 550, + 1344, 1345, 1040, 1008, 1009, 68, 69, 70, 71, 72, + 1343, 310, 1078, 87, 88, 89, 400, 1203, 1007, 274, + 1202, 323, 27, 1204, 54, 30, 31, 303, 754, 309, + 755, 362, 380, 368, 369, 366, 367, 365, 364, 363, + 605, 1223, 1039, 87, 88, 89, 264, 370, 371, 262, + 1438, 266, 409, 1396, 1077, 1047, 1394, 547, 1266, 549, + 1507, 630, 629, 639, 640, 632, 633, 634, 635, 636, + 637, 638, 631, 53, 302, 641, 272, 268, 269, 270, + 828, 603, 600, 582, 827, 584, 601, 598, 599, 87, + 88, 89, 593, 594, 1268, 911, 825, 1562, 1559, 604, + 1533, 1263, 972, 87, 88, 89, 1074, 1071, 1072, 1284, + 1070, 1267, 1031, 1525, 1583, 1482, 566, 581, 583, 552, + 826, 829, 590, 266, 1190, 1192, 1579, 866, 867, 868, + 1484, 1269, 832, 1033, 816, 1339, 1260, 1338, 1337, 548, + 555, 1490, 1262, 1081, 1084, 265, 1129, 562, 279, 267, + 1286, 653, 654, 276, 557, 558, 280, 1514, 276, 1091, + 567, 1418, 1090, 1199, 276, 283, 1164, 263, 1139, 1118, + 276, 574, 748, 290, 580, 85, 1033, 728, 1003, 85, + 1076, 85, 1126, 666, 1288, 572, 1292, 85, 1287, 631, + 1285, 1014, 641, 641, 85, 1290, 951, 271, 863, 1523, + 1483, 621, 1075, 579, 1289, 1191, 1499, 288, 87, 88, + 89, 578, 1538, 295, 559, 859, 560, 1291, 1293, 561, + 589, 853, 611, 75, 1327, 592, 1047, 595, 756, 616, + 617, 615, 591, 606, 1508, 619, 1032, 87, 88, 89, + 281, 1577, 1080, 556, 1578, 1261, 1576, 1259, 564, 1491, + 1489, 621, 551, 1302, 571, 653, 654, 1082, 620, 619, + 573, 76, 568, 569, 570, 1304, 953, 292, 284, 885, + 293, 294, 300, 935, 55, 621, 285, 287, 297, 1032, + 282, 299, 298, 883, 884, 882, 614, 1251, 612, 613, + 1362, 653, 654, 85, 577, 276, 276, 276, 935, 705, + 1136, 860, 1036, 1528, 85, 1033, 952, 854, 1037, 818, + 85, 873, 875, 876, 1221, 721, 418, 874, 704, 1247, + 1248, 1249, 669, 956, 957, 620, 619, 714, 634, 635, + 636, 637, 638, 631, 553, 554, 641, 87, 88, 89, + 651, 1543, 621, 1444, 1443, 718, 684, 686, 688, 690, + 692, 694, 695, 87, 88, 89, 1125, 685, 687, 706, + 691, 693, 1236, 696, 630, 629, 639, 640, 632, 633, + 634, 635, 636, 637, 638, 631, 620, 619, 641, 751, + 261, 741, 1124, 1235, 1123, 731, 746, 740, 544, 1584, + 1250, 1326, 1224, 621, 1545, 1255, 1252, 1243, 1253, 1246, + 1524, 1242, 1461, 620, 619, 1244, 1245, 1441, 1032, 620, + 619, 620, 619, 1029, 1027, 1233, 1028, 1101, 844, 1254, + 621, 1111, 53, 1025, 1031, 62, 621, 737, 621, 1103, + 1104, 1105, 389, 1585, 881, 276, 87, 88, 89, 814, + 85, 1496, 817, 1495, 819, 276, 276, 85, 85, 85, + 404, 405, 1358, 276, 1487, 1561, 276, 1547, 389, 276, + 837, 838, 1034, 276, 1160, 85, 1487, 1536, 1487, 389, + 85, 85, 85, 276, 85, 85, 87, 88, 89, 389, + 903, 1487, 1515, 1414, 85, 85, 815, 716, 87, 88, + 89, 974, 1206, 822, 823, 824, 1160, 843, 1487, 1486, + 618, 841, 632, 633, 634, 635, 636, 637, 638, 631, + 975, 842, 641, 1433, 1432, 1498, 846, 847, 848, 975, + 850, 851, 1420, 389, 27, 764, 1417, 389, 1368, 1367, + 855, 856, 902, 1364, 1365, 820, 821, 1364, 1363, 744, + 833, 904, 1326, 830, 964, 389, 409, 879, 1166, 836, + 975, 389, 618, 389, 1167, 85, 339, 338, 341, 342, + 343, 344, 744, 849, 27, 340, 345, 763, 762, 912, + 1315, 923, 926, 1326, 64, 53, 997, 936, 743, 965, + 1366, 975, 1207, 402, 745, 1006, 747, 1142, 85, 85, + 1141, 964, 743, 954, 1468, 914, 382, 831, 749, 27, + 53, 913, 1553, 1450, 1041, 1425, 85, 745, 918, 743, + 1061, 1354, 1210, 276, 948, 53, 85, 964, 1330, 1331, + 1265, 276, 1057, 669, 958, 1451, 964, 1052, 915, 276, + 276, 912, 1051, 276, 276, 1064, 313, 276, 276, 276, + 85, 1570, 944, 945, 905, 906, 880, 53, 1557, 1566, + 53, 1356, 418, 85, 546, 1333, 1315, 914, 1237, 864, + 835, 1183, 1181, 970, 1336, 1018, 1184, 1182, 1185, 966, + 984, 985, 980, 983, 984, 985, 981, 841, 982, 986, + 1335, 1180, 1330, 1331, 1179, 968, 1550, 989, 1308, 1149, + 1408, 998, 1048, 1049, 1050, 1000, 996, 715, 1555, 1158, + 1157, 708, 1228, 967, 761, 1005, 1001, 276, 85, 669, + 85, 973, 1083, 709, 575, 1004, 276, 276, 276, 276, + 276, 1220, 276, 276, 999, 1062, 276, 85, 1021, 1530, + 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, + 638, 631, 1529, 276, 641, 931, 1446, 1466, 276, 1218, + 276, 276, 1067, 1212, 1066, 276, 1068, 1412, 834, 932, + 737, 988, 383, 384, 737, 395, 919, 920, 737, 386, + 925, 928, 929, 1095, 1156, 1042, 1043, 1044, 1045, 396, + 1098, 1411, 1155, 1058, 1059, 387, 719, 720, 398, 64, + 397, 1053, 1054, 1055, 1410, 943, 1311, 1065, 946, 947, + 1160, 602, 378, 1572, 1571, 879, 1085, 1086, 1087, 1088, + 1089, 1130, 1092, 1093, 1127, 857, 1094, 629, 639, 640, + 632, 633, 634, 635, 636, 637, 638, 631, 1120, 395, + 641, 722, 1572, 1096, 1512, 1439, 950, 86, 1097, 382, + 1106, 277, 62, 396, 277, 1102, 67, 59, 1, 277, + 392, 393, 398, 1564, 397, 1148, 276, 980, 983, 984, + 985, 981, 1377, 982, 986, 1153, 276, 276, 276, 276, + 276, 1173, 1119, 1447, 277, 86, 1073, 1531, 276, 277, + 1480, 277, 1348, 1024, 276, 1015, 380, 1135, 276, 1168, + 74, 543, 73, 1522, 852, 588, 1023, 1022, 1488, 622, + 1437, 1035, 1222, 1038, 880, 1205, 1152, 85, 1355, 1219, + 1527, 769, 1161, 767, 1162, 768, 1211, 1163, 766, 1018, + 1216, 1216, 771, 770, 1208, 765, 1175, 1176, 289, 1178, + 413, 987, 1195, 1186, 1197, 313, 1198, 1174, 757, 1194, + 1177, 1063, 723, 77, 679, 1258, 1196, 1257, 1069, 862, + 1227, 286, 1229, 1230, 1231, 85, 85, 1225, 1226, 1200, + 596, 1217, 597, 291, 649, 1154, 1201, 419, 412, 1321, + 710, 713, 955, 1213, 1214, 711, 1409, 1310, 1134, 678, + 933, 322, 872, 337, 334, 85, 335, 737, 959, 1240, + 1165, 623, 320, 314, 736, 729, 1234, 737, 737, 737, + 737, 737, 1239, 979, 977, 1115, 1116, 976, 408, 85, + 1332, 1328, 735, 963, 1256, 902, 391, 1404, 1506, 737, + 390, 1280, 930, 46, 607, 304, 1133, 1282, 29, 399, + 20, 1270, 19, 18, 22, 17, 16, 1271, 1272, 15, + 563, 33, 1305, 24, 23, 276, 14, 1273, 13, 1295, + 12, 11, 1294, 10, 9, 85, 8, 4, 1281, 1279, + 85, 85, 1316, 1173, 610, 277, 21, 1280, 914, 667, + 277, 2, 1301, 0, 913, 0, 277, 0, 0, 0, + 0, 0, 277, 0, 85, 0, 0, 86, 0, 0, + 1319, 86, 0, 86, 0, 0, 0, 0, 85, 86, + 85, 85, 0, 0, 1216, 1216, 86, 1325, 0, 0, + 1018, 1334, 1018, 0, 0, 351, 26, 1347, 0, 1361, + 1340, 0, 0, 0, 1346, 0, 0, 0, 276, 1359, + 1360, 0, 1342, 0, 1341, 1309, 1351, 0, 0, 0, + 0, 0, 26, 0, 1352, 1353, 0, 0, 276, 0, + 0, 0, 0, 0, 85, 0, 1378, 85, 85, 85, + 276, 1370, 845, 639, 640, 632, 633, 634, 635, 636, + 637, 638, 631, 0, 0, 641, 1371, 381, 1373, 0, + 0, 0, 0, 0, 0, 0, 861, 0, 0, 0, + 0, 1387, 0, 1383, 1384, 0, 0, 0, 0, 0, + 1392, 0, 869, 870, 871, 86, 0, 277, 277, 277, + 0, 0, 0, 0, 0, 0, 86, 0, 1369, 0, + 0, 0, 86, 1173, 0, 0, 0, 1413, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 85, 1372, 0, + 0, 0, 1422, 0, 0, 85, 0, 0, 0, 1018, + 1382, 1431, 0, 0, 1208, 0, 921, 922, 0, 0, + 85, 0, 0, 0, 1421, 0, 0, 85, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1440, 1449, + 1442, 1454, 0, 0, 0, 0, 0, 1389, 1390, 0, + 1391, 0, 0, 1393, 1452, 1395, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1453, 1445, 0, 85, 85, + 0, 85, 0, 0, 1460, 0, 85, 0, 85, 85, + 85, 276, 0, 1474, 85, 1475, 1477, 1478, 1467, 0, + 0, 1473, 1465, 0, 1469, 0, 0, 1319, 1485, 0, + 1012, 85, 276, 1479, 1493, 1492, 1494, 277, 1500, 0, + 0, 0, 86, 1434, 0, 0, 0, 277, 277, 86, + 86, 86, 0, 0, 0, 277, 0, 0, 277, 0, + 1513, 277, 0, 1521, 0, 277, 0, 86, 85, 0, + 0, 1520, 86, 86, 86, 277, 86, 86, 1519, 85, + 85, 1319, 0, 0, 0, 0, 86, 86, 1534, 0, + 586, 1449, 1018, 0, 586, 85, 586, 1535, 1541, 1173, + 0, 786, 586, 0, 0, 0, 276, 0, 0, 0, + 26, 0, 0, 0, 85, 0, 0, 0, 0, 0, + 0, 0, 1501, 650, 652, 1549, 0, 0, 0, 0, + 0, 0, 1554, 1556, 85, 0, 0, 0, 0, 0, + 0, 1558, 0, 0, 0, 0, 1569, 0, 0, 0, + 0, 348, 0, 0, 665, 1580, 0, 86, 670, 671, + 672, 673, 674, 675, 676, 677, 0, 680, 683, 683, + 683, 689, 683, 683, 689, 683, 697, 698, 699, 700, + 701, 702, 703, 0, 774, 0, 84, 26, 0, 0, + 86, 86, 0, 0, 0, 0, 1544, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 1137, + 1402, 738, 0, 0, 0, 277, 0, 0, 86, 0, + 0, 0, 0, 277, 420, 787, 1150, 1151, 713, 0, + 0, 277, 277, 0, 0, 277, 277, 0, 0, 277, + 277, 277, 86, 0, 0, 0, 0, 0, 800, 803, + 804, 805, 806, 807, 808, 86, 809, 810, 811, 812, + 813, 788, 789, 790, 791, 772, 773, 801, 0, 775, + 0, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 792, 793, 794, 795, 796, 797, 798, 799, 630, + 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, + 631, 0, 0, 641, 0, 0, 0, 0, 0, 277, + 86, 0, 86, 0, 0, 0, 0, 0, 277, 277, + 277, 277, 277, 0, 277, 277, 389, 0, 277, 86, + 0, 0, 0, 0, 0, 939, 0, 0, 0, 0, + 802, 0, 0, 0, 0, 277, 0, 0, 0, 0, + 277, 0, 277, 277, 0, 586, 0, 277, 0, 0, + 0, 0, 586, 586, 586, 630, 629, 639, 640, 632, + 633, 634, 635, 636, 637, 638, 631, 0, 0, 641, + 586, 0, 0, 0, 0, 586, 586, 586, 0, 586, + 586, 0, 0, 0, 0, 625, 0, 628, 0, 586, + 586, 388, 0, 642, 643, 644, 645, 646, 647, 648, + 1303, 626, 627, 624, 630, 629, 639, 640, 632, 633, + 634, 635, 636, 637, 638, 631, 0, 0, 641, 0, + 0, 0, 0, 0, 1312, 0, 420, 1401, 0, 0, + 420, 0, 420, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 1407, 1400, 0, 608, 0, 0, 277, 0, + 0, 0, 316, 27, 28, 54, 30, 31, 277, 277, + 277, 277, 277, 0, 0, 0, 0, 0, 0, 0, + 277, 0, 58, 0, 0, 0, 277, 32, 49, 50, + 277, 52, 630, 629, 639, 640, 632, 633, 634, 635, + 636, 637, 638, 631, 0, 0, 641, 0, 0, 86, + 41, 0, 0, 0, 53, 0, 630, 629, 639, 640, + 632, 633, 634, 635, 636, 637, 638, 631, 0, 0, + 641, 0, 630, 629, 639, 640, 632, 633, 634, 635, + 636, 637, 638, 631, 738, 0, 641, 0, 738, 0, + 0, 0, 738, 0, 726, 0, 0, 86, 86, 0, + 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, + 0, 758, 0, 0, 0, 0, 0, 0, 1406, 34, + 35, 37, 36, 39, 0, 51, 1399, 86, 0, 0, + 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, + 0, 1423, 0, 0, 1424, 0, 0, 1426, 40, 57, + 56, 86, 0, 47, 48, 38, 0, 0, 0, 0, + 0, 0, 0, 586, 0, 586, 0, 0, 0, 42, + 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 586, 0, 0, 0, 0, 277, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, + 0, 0, 86, 86, 0, 630, 629, 639, 640, 632, + 633, 634, 635, 636, 637, 638, 631, 0, 0, 641, + 0, 0, 0, 0, 1464, 313, 86, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 420, 86, 86, 0, 0, 0, 0, 420, 420, + 420, 0, 0, 0, 0, 55, 0, 0, 1117, 0, + 0, 381, 0, 0, 0, 0, 420, 0, 0, 0, + 277, 420, 420, 420, 0, 420, 420, 0, 0, 0, + 0, 0, 0, 0, 0, 420, 420, 0, 0, 0, + 277, 0, 0, 0, 0, 0, 86, 0, 0, 86, + 86, 86, 277, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 0, 0, 0, 1169, 1170, 0, + 0, 738, 738, 738, 738, 738, 0, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 1193, 0, 1274, + 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 907, 0, 420, 630, + 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, + 631, 0, 937, 641, 0, 0, 0, 0, 0, 86, + 0, 0, 0, 0, 0, 0, 0, 86, 0, 941, + 942, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 86, 0, 0, 0, 0, 960, 0, 86, + 0, 586, 0, 0, 0, 0, 0, 726, 0, 0, + 420, 630, 629, 639, 640, 632, 633, 634, 635, 636, + 637, 638, 631, 0, 0, 641, 0, 0, 0, 0, + 586, 420, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 0, 86, 420, 0, 0, 0, 86, 0, + 86, 86, 86, 277, 0, 0, 86, 630, 629, 639, + 640, 632, 633, 634, 635, 636, 637, 638, 631, 0, + 0, 641, 0, 86, 277, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, + 0, 420, 0, 1320, 0, 26, 0, 0, 0, 0, + 86, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 86, 86, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 916, 917, 0, 0, 86, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, + 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 949, 0, 0, 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 877, 0, 0, 886, + 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, + 897, 898, 899, 900, 0, 0, 1403, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1427, 1428, 1429, 940, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1238, 420, 0, 0, + 1320, 0, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1113, 0, 0, 0, 1114, 0, 420, 0, 0, 0, + 0, 0, 1497, 0, 0, 1121, 1122, 0, 0, 0, + 0, 1128, 349, 0, 1131, 1132, 0, 0, 0, 0, + 420, 0, 1138, 0, 1320, 0, 1140, 0, 0, 1143, + 1144, 1145, 1146, 1147, 0, 0, 0, 0, 0, 0, + 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 301, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 420, 0, 937, 0, + 0, 1322, 1324, 0, 0, 1188, 0, 0, 0, 0, + 0, 403, 0, 0, 411, 0, 0, 0, 0, 275, + 0, 275, 0, 0, 0, 1324, 1107, 1108, 1109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, + 0, 420, 1350, 0, 0, 0, 0, 0, 1567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1374, 0, 0, 1379, 1380, + 1381, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1277, 1278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 937, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 0, 1436, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 420, 0, 0, 0, 275, 0, 0, 420, 0, + 275, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1470, + 1471, 0, 1472, 0, 1275, 1276, 0, 1436, 0, 1436, + 1436, 1436, 0, 0, 0, 1350, 0, 0, 0, 1296, + 1297, 0, 1298, 1299, 0, 0, 0, 0, 0, 0, + 0, 0, 1436, 0, 1306, 1307, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1386, 0, 0, 0, 1388, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1397, 1398, 0, 0, 0, 0, 0, 0, 0, 1526, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 420, 0, 0, 403, 0, 1415, 1416, 0, 1419, + 0, 0, 0, 0, 937, 0, 1542, 275, 275, 275, + 0, 0, 0, 0, 0, 0, 1430, 0, 0, 0, + 0, 0, 0, 1357, 0, 1548, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1436, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1462, 1463, 0, 1464, 0, 0, - 0, 0, 1429, 0, 1429, 1429, 1429, 0, 0, 0, - 1343, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1429, 0, 0, + 0, 0, 0, 1476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1097, 1098, 1099, 0, 274, 0, - 0, 0, 0, 1518, 0, 0, 0, 0, 274, 274, - 0, 0, 0, 0, 418, 418, 274, 0, 0, 274, - 0, 0, 274, 0, 0, 0, 833, 0, 928, 0, - 1534, 0, 0, 0, 0, 0, 274, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1540, + 0, 1502, 1503, 1504, 1505, 0, 1509, 0, 1510, 1511, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 1516, 0, 1517, 1518, 0, 0, 275, 275, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 275, 0, + 0, 275, 0, 0, 0, 840, 0, 0, 0, 0, + 0, 0, 1537, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1429, + 0, 0, 1455, 1456, 1457, 1458, 1459, 1546, 0, 0, + 1462, 1463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1581, + 1582, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 403, 840, + 0, 0, 0, 403, 403, 0, 0, 403, 403, 403, + 0, 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 403, 403, 403, 403, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, - 833, 0, 0, 401, 401, 0, 0, 401, 401, 401, - 0, 0, 0, 929, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 840, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 275, 994, 0, 0, 275, 275, 0, 0, 275, + 1002, 840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 401, 401, 401, 401, 401, 0, 0, 0, + 1573, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 833, 0, 274, - 0, 0, 0, 0, 0, 0, 0, 274, 984, 0, - 0, 274, 274, 0, 0, 274, 992, 833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, - 1268, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1286, 1287, 0, 1288, 1289, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1296, 1297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 274, 274, 274, 274, 0, - 274, 274, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 275, + 275, 275, 275, 0, 275, 275, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 274, 0, 1089, 1090, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 275, 0, 1099, 1100, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 401, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, - 0, 0, 0, 0, 1378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 403, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 401, 274, 0, 0, 0, 0, 0, 0, 0, 0, - 929, 274, 274, 274, 274, 274, 0, 0, 0, 0, - 0, 0, 0, 1179, 0, 0, 0, 0, 0, 984, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 403, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 938, 275, 275, + 275, 275, 275, 0, 0, 0, 0, 0, 0, 0, + 1187, 0, 0, 0, 0, 0, 994, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1447, - 1448, 1449, 1450, 1451, 0, 0, 0, 1454, 1455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 840, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1565, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 929, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 984, - 0, 0, 0, 0, 0, 528, 516, 0, 473, 531, - 446, 463, 539, 464, 467, 504, 431, 486, 174, 461, - 274, 450, 426, 457, 427, 448, 475, 118, 479, 445, - 518, 489, 530, 146, 0, 451, 537, 148, 495, 0, - 221, 162, 0, 0, 0, 477, 520, 484, 513, 472, - 505, 436, 494, 532, 462, 502, 533, 0, 0, 0, - 86, 87, 88, 0, 1009, 1010, 0, 0, 0, 0, - 0, 108, 0, 499, 527, 459, 501, 503, 425, 496, - 929, 429, 432, 538, 523, 454, 455, 1201, 0, 0, - 0, 0, 0, 274, 476, 485, 510, 470, 0, 0, - 0, 0, 0, 0, 0, 0, 452, 0, 493, 0, - 0, 0, 433, 430, 0, 0, 0, 0, 474, 0, - 0, 0, 435, 0, 453, 511, 0, 423, 127, 515, - 522, 471, 277, 526, 469, 468, 529, 193, 0, 225, - 130, 145, 104, 142, 90, 100, 0, 129, 171, 201, - 205, 519, 449, 458, 112, 456, 203, 181, 241, 492, - 183, 202, 149, 231, 194, 240, 250, 251, 228, 248, - 255, 218, 93, 227, 239, 109, 213, 95, 237, 224, - 160, 139, 140, 94, 0, 199, 117, 125, 114, 173, - 234, 235, 113, 258, 101, 247, 97, 102, 246, 167, - 230, 238, 161, 154, 96, 236, 159, 153, 144, 121, - 132, 191, 151, 192, 133, 164, 163, 165, 0, 428, - 0, 222, 244, 259, 106, 444, 229, 253, 254, 0, - 195, 107, 126, 120, 190, 124, 166, 103, 135, 219, - 143, 150, 198, 257, 180, 204, 110, 243, 220, 440, - 443, 438, 439, 487, 488, 534, 535, 536, 512, 434, - 0, 441, 442, 0, 517, 524, 525, 491, 89, 98, - 147, 256, 196, 123, 245, 424, 437, 116, 447, 0, - 0, 460, 465, 466, 478, 480, 481, 482, 483, 490, - 497, 498, 500, 506, 507, 508, 509, 514, 521, 540, - 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, - 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, - 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, - 184, 185, 186, 187, 188, 189, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 528, 516, 0, 473, - 531, 446, 463, 539, 464, 467, 504, 431, 486, 174, - 461, 0, 450, 426, 457, 427, 448, 475, 118, 479, - 445, 518, 489, 530, 146, 0, 451, 537, 148, 495, - 0, 221, 162, 0, 0, 0, 477, 520, 484, 513, - 472, 505, 436, 494, 532, 462, 502, 533, 0, 0, - 0, 86, 87, 88, 0, 1009, 1010, 0, 0, 0, - 0, 0, 108, 0, 499, 527, 459, 501, 503, 425, - 496, 0, 429, 432, 538, 523, 454, 455, 0, 0, - 0, 0, 0, 0, 0, 476, 485, 510, 470, 0, - 0, 0, 0, 0, 0, 0, 0, 452, 0, 493, - 0, 0, 0, 433, 430, 0, 0, 0, 0, 474, - 0, 0, 0, 435, 0, 453, 511, 0, 423, 127, - 515, 522, 471, 277, 526, 469, 468, 529, 193, 0, - 225, 130, 145, 104, 142, 90, 100, 0, 129, 171, - 201, 205, 519, 449, 458, 112, 456, 203, 181, 241, - 492, 183, 202, 149, 231, 194, 240, 250, 251, 228, - 248, 255, 218, 93, 227, 239, 109, 213, 95, 237, - 224, 160, 139, 140, 94, 0, 199, 117, 125, 114, - 173, 234, 235, 113, 258, 101, 247, 97, 102, 246, - 167, 230, 238, 161, 154, 96, 236, 159, 153, 144, - 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, - 428, 0, 222, 244, 259, 106, 444, 229, 253, 254, - 0, 195, 107, 126, 120, 190, 124, 166, 103, 135, - 219, 143, 150, 198, 257, 180, 204, 110, 243, 220, - 440, 443, 438, 439, 487, 488, 534, 535, 536, 512, - 434, 0, 441, 442, 0, 517, 524, 525, 491, 89, - 98, 147, 256, 196, 123, 245, 424, 437, 116, 447, - 0, 0, 460, 465, 466, 478, 480, 481, 482, 483, - 490, 497, 498, 500, 506, 507, 508, 509, 514, 521, - 540, 91, 92, 99, 105, 111, 115, 119, 122, 128, - 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, - 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, - 182, 184, 185, 186, 187, 188, 189, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 528, 516, 0, - 473, 531, 446, 463, 539, 464, 467, 504, 431, 486, - 174, 461, 0, 450, 426, 457, 427, 448, 475, 118, - 479, 445, 518, 489, 530, 146, 0, 451, 537, 148, - 495, 0, 221, 162, 0, 0, 0, 477, 520, 484, - 513, 472, 505, 436, 494, 532, 462, 502, 533, 54, - 0, 0, 86, 87, 88, 0, 0, 0, 0, 0, - 0, 0, 0, 108, 0, 499, 527, 459, 501, 503, - 425, 496, 0, 429, 432, 538, 523, 454, 455, 0, - 0, 0, 0, 0, 0, 0, 476, 485, 510, 470, - 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, - 493, 0, 0, 0, 433, 430, 0, 0, 0, 0, - 474, 0, 0, 0, 435, 0, 453, 511, 0, 423, - 127, 515, 522, 471, 277, 526, 469, 468, 529, 193, - 0, 225, 130, 145, 104, 142, 90, 100, 0, 129, - 171, 201, 205, 519, 449, 458, 112, 456, 203, 181, - 241, 492, 183, 202, 149, 231, 194, 240, 250, 251, - 228, 248, 255, 218, 93, 227, 239, 109, 213, 95, - 237, 224, 160, 139, 140, 94, 0, 199, 117, 125, - 114, 173, 234, 235, 113, 258, 101, 247, 97, 102, - 246, 167, 230, 238, 161, 154, 96, 236, 159, 153, - 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, - 0, 428, 0, 222, 244, 259, 106, 444, 229, 253, - 254, 0, 195, 107, 126, 120, 190, 124, 166, 103, - 135, 219, 143, 150, 198, 257, 180, 204, 110, 243, - 220, 440, 443, 438, 439, 487, 488, 534, 535, 536, - 512, 434, 0, 441, 442, 0, 517, 524, 525, 491, - 89, 98, 147, 256, 196, 123, 245, 424, 437, 116, - 447, 0, 0, 460, 465, 466, 478, 480, 481, 482, - 483, 490, 497, 498, 500, 506, 507, 508, 509, 514, - 521, 540, 91, 92, 99, 105, 111, 115, 119, 122, - 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, - 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, - 179, 182, 184, 185, 186, 187, 188, 189, 197, 200, - 206, 207, 208, 209, 210, 211, 212, 214, 215, 216, - 217, 223, 226, 232, 233, 242, 249, 252, 528, 516, - 0, 473, 531, 446, 463, 539, 464, 467, 504, 431, - 486, 174, 461, 0, 450, 426, 457, 427, 448, 475, - 118, 479, 445, 518, 489, 530, 146, 0, 451, 537, - 148, 495, 0, 221, 162, 0, 0, 0, 477, 520, - 484, 513, 472, 505, 436, 494, 532, 462, 502, 533, - 0, 0, 0, 86, 87, 88, 0, 0, 0, 0, - 0, 0, 0, 0, 108, 0, 499, 527, 459, 501, - 503, 425, 496, 0, 429, 432, 538, 523, 454, 455, - 0, 0, 0, 0, 0, 0, 0, 476, 485, 510, - 470, 0, 0, 0, 0, 0, 0, 1306, 0, 452, - 0, 493, 0, 0, 0, 433, 430, 0, 0, 0, - 0, 474, 0, 0, 0, 435, 0, 453, 511, 0, - 423, 127, 515, 522, 471, 277, 526, 469, 468, 529, - 193, 0, 225, 130, 145, 104, 142, 90, 100, 0, - 129, 171, 201, 205, 519, 449, 458, 112, 456, 203, - 181, 241, 492, 183, 202, 149, 231, 194, 240, 250, - 251, 228, 248, 255, 218, 93, 227, 239, 109, 213, - 95, 237, 224, 160, 139, 140, 94, 0, 199, 117, - 125, 114, 173, 234, 235, 113, 258, 101, 247, 97, - 102, 246, 167, 230, 238, 161, 154, 96, 236, 159, - 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, - 165, 0, 428, 0, 222, 244, 259, 106, 444, 229, - 253, 254, 0, 195, 107, 126, 120, 190, 124, 166, - 103, 135, 219, 143, 150, 198, 257, 180, 204, 110, - 243, 220, 440, 443, 438, 439, 487, 488, 534, 535, - 536, 512, 434, 0, 441, 442, 0, 517, 524, 525, - 491, 89, 98, 147, 256, 196, 123, 245, 424, 437, - 116, 447, 0, 0, 460, 465, 466, 478, 480, 481, - 482, 483, 490, 497, 498, 500, 506, 507, 508, 509, - 514, 521, 540, 91, 92, 99, 105, 111, 115, 119, - 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, - 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, - 178, 179, 182, 184, 185, 186, 187, 188, 189, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 528, - 516, 0, 473, 531, 446, 463, 539, 464, 467, 504, - 431, 486, 174, 461, 0, 450, 426, 457, 427, 448, - 475, 118, 479, 445, 518, 489, 530, 146, 0, 451, - 537, 148, 495, 0, 221, 162, 0, 0, 0, 477, - 520, 484, 513, 472, 505, 436, 494, 532, 462, 502, - 533, 0, 0, 0, 86, 87, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 108, 0, 499, 527, 459, - 501, 503, 425, 496, 0, 429, 432, 538, 523, 454, - 455, 0, 0, 0, 0, 0, 0, 0, 476, 485, - 510, 470, 0, 0, 0, 0, 0, 0, 993, 0, - 452, 0, 493, 0, 0, 0, 433, 430, 0, 0, - 0, 0, 474, 0, 0, 0, 435, 0, 453, 511, - 0, 423, 127, 515, 522, 471, 277, 526, 469, 468, - 529, 193, 0, 225, 130, 145, 104, 142, 90, 100, - 0, 129, 171, 201, 205, 519, 449, 458, 112, 456, - 203, 181, 241, 492, 183, 202, 149, 231, 194, 240, - 250, 251, 228, 248, 255, 218, 93, 227, 239, 109, - 213, 95, 237, 224, 160, 139, 140, 94, 0, 199, - 117, 125, 114, 173, 234, 235, 113, 258, 101, 247, - 97, 102, 246, 167, 230, 238, 161, 154, 96, 236, - 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, - 163, 165, 0, 428, 0, 222, 244, 259, 106, 444, - 229, 253, 254, 0, 195, 107, 126, 120, 190, 124, - 166, 103, 135, 219, 143, 150, 198, 257, 180, 204, - 110, 243, 220, 440, 443, 438, 439, 487, 488, 534, - 535, 536, 512, 434, 0, 441, 442, 0, 517, 524, - 525, 491, 89, 98, 147, 256, 196, 123, 245, 424, - 437, 116, 447, 0, 0, 460, 465, 466, 478, 480, - 481, 482, 483, 490, 497, 498, 500, 506, 507, 508, - 509, 514, 521, 540, 91, 92, 99, 105, 111, 115, - 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, - 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, - 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, - 197, 200, 206, 207, 208, 209, 210, 211, 212, 214, - 215, 216, 217, 223, 226, 232, 233, 242, 249, 252, - 528, 516, 0, 473, 531, 446, 463, 539, 464, 467, - 504, 431, 486, 174, 461, 0, 450, 426, 457, 427, - 448, 475, 118, 479, 445, 518, 489, 530, 146, 0, - 451, 537, 148, 495, 0, 221, 162, 0, 0, 0, - 477, 520, 484, 513, 472, 505, 436, 494, 532, 462, - 502, 533, 0, 0, 0, 86, 87, 88, 0, 0, - 0, 0, 0, 0, 0, 0, 108, 0, 499, 527, - 459, 501, 503, 425, 496, 0, 429, 432, 538, 523, - 454, 455, 0, 0, 0, 0, 0, 0, 0, 476, - 485, 510, 470, 0, 0, 0, 0, 0, 0, 959, - 0, 452, 0, 493, 0, 0, 0, 433, 430, 0, - 0, 0, 0, 474, 0, 0, 0, 435, 0, 453, - 511, 0, 423, 127, 515, 522, 471, 277, 526, 469, - 468, 529, 193, 0, 225, 130, 145, 104, 142, 90, - 100, 0, 129, 171, 201, 205, 519, 449, 458, 112, - 456, 203, 181, 241, 492, 183, 202, 149, 231, 194, - 240, 250, 251, 228, 248, 255, 218, 93, 227, 239, - 109, 213, 95, 237, 224, 160, 139, 140, 94, 0, - 199, 117, 125, 114, 173, 234, 235, 113, 258, 101, - 247, 97, 102, 246, 167, 230, 238, 161, 154, 96, - 236, 159, 153, 144, 121, 132, 191, 151, 192, 133, - 164, 163, 165, 0, 428, 0, 222, 244, 259, 106, - 444, 229, 253, 254, 0, 195, 107, 126, 120, 190, - 124, 166, 103, 135, 219, 143, 150, 198, 257, 180, - 204, 110, 243, 220, 440, 443, 438, 439, 487, 488, - 534, 535, 536, 512, 434, 0, 441, 442, 0, 517, - 524, 525, 491, 89, 98, 147, 256, 196, 123, 245, - 424, 437, 116, 447, 0, 0, 460, 465, 466, 478, - 480, 481, 482, 483, 490, 497, 498, 500, 506, 507, - 508, 509, 514, 521, 540, 91, 92, 99, 105, 111, - 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, - 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, - 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, - 189, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 528, 516, 0, 473, 531, 446, 463, 539, 464, - 467, 504, 431, 486, 174, 461, 0, 450, 426, 457, - 427, 448, 475, 118, 479, 445, 518, 489, 530, 146, - 0, 451, 537, 148, 495, 0, 221, 162, 0, 0, - 0, 477, 520, 484, 513, 472, 505, 436, 494, 532, - 462, 502, 533, 0, 0, 0, 86, 87, 88, 0, - 0, 0, 0, 0, 0, 0, 0, 108, 0, 499, - 527, 459, 501, 503, 425, 496, 0, 429, 432, 538, - 523, 454, 455, 0, 0, 0, 0, 0, 0, 0, - 476, 485, 510, 470, 0, 0, 0, 0, 0, 0, - 0, 0, 452, 0, 493, 0, 0, 0, 433, 430, - 0, 0, 0, 0, 474, 0, 0, 0, 435, 0, - 453, 511, 0, 423, 127, 515, 522, 471, 277, 526, - 469, 468, 529, 193, 0, 225, 130, 145, 104, 142, - 90, 100, 0, 129, 171, 201, 205, 519, 449, 458, - 112, 456, 203, 181, 241, 492, 183, 202, 149, 231, - 194, 240, 250, 251, 228, 248, 255, 218, 93, 227, - 239, 109, 213, 95, 237, 224, 160, 139, 140, 94, - 0, 199, 117, 125, 114, 173, 234, 235, 113, 258, - 101, 247, 97, 102, 246, 167, 230, 238, 161, 154, - 96, 236, 159, 153, 144, 121, 132, 191, 151, 192, - 133, 164, 163, 165, 0, 428, 0, 222, 244, 259, - 106, 444, 229, 253, 254, 0, 195, 107, 126, 120, - 190, 124, 166, 103, 135, 219, 143, 150, 198, 257, - 180, 204, 110, 243, 220, 440, 443, 438, 439, 487, - 488, 534, 535, 536, 512, 434, 0, 441, 442, 0, - 517, 524, 525, 491, 89, 98, 147, 256, 196, 123, - 245, 424, 437, 116, 447, 0, 0, 460, 465, 466, - 478, 480, 481, 482, 483, 490, 497, 498, 500, 506, - 507, 508, 509, 514, 521, 540, 91, 92, 99, 105, - 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, - 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, - 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, - 188, 189, 197, 200, 206, 207, 208, 209, 210, 211, - 212, 214, 215, 216, 217, 223, 226, 232, 233, 242, - 249, 252, 528, 516, 0, 473, 531, 446, 463, 539, - 464, 467, 504, 431, 486, 174, 461, 0, 450, 426, - 457, 427, 448, 475, 118, 479, 445, 518, 489, 530, - 146, 0, 451, 537, 148, 495, 0, 221, 162, 0, - 0, 0, 477, 520, 484, 513, 472, 505, 436, 494, - 532, 462, 502, 533, 0, 0, 0, 86, 87, 88, - 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, - 499, 527, 459, 501, 503, 425, 496, 0, 429, 432, - 538, 523, 454, 455, 0, 0, 0, 0, 0, 0, - 0, 476, 485, 510, 470, 0, 0, 0, 0, 0, - 0, 0, 0, 452, 0, 493, 0, 0, 0, 433, - 430, 0, 0, 0, 0, 474, 0, 0, 0, 435, - 0, 453, 511, 0, 423, 127, 515, 522, 471, 277, - 526, 469, 468, 529, 193, 0, 225, 130, 145, 104, - 142, 90, 100, 0, 129, 171, 201, 205, 519, 449, - 458, 112, 456, 203, 181, 241, 492, 183, 202, 149, - 231, 194, 240, 250, 251, 228, 248, 255, 218, 93, - 227, 239, 109, 213, 95, 237, 224, 160, 139, 140, - 94, 0, 199, 117, 125, 114, 173, 234, 235, 113, - 258, 101, 247, 97, 421, 246, 167, 230, 238, 161, - 154, 96, 236, 159, 153, 144, 121, 132, 191, 151, - 192, 133, 164, 163, 165, 0, 428, 0, 222, 244, - 259, 106, 444, 229, 253, 254, 0, 195, 107, 126, - 120, 190, 124, 422, 420, 135, 219, 143, 150, 198, - 257, 180, 204, 110, 243, 220, 440, 443, 438, 439, - 487, 488, 534, 535, 536, 512, 434, 0, 441, 442, - 0, 517, 524, 525, 491, 89, 98, 147, 256, 196, - 123, 245, 424, 437, 116, 447, 0, 0, 460, 465, - 466, 478, 480, 481, 482, 483, 490, 497, 498, 500, - 506, 507, 508, 509, 514, 521, 540, 91, 92, 99, - 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, - 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, - 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, - 187, 188, 189, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 528, 516, 0, 473, 531, 446, 463, - 539, 464, 467, 504, 431, 486, 174, 461, 0, 450, - 426, 457, 427, 448, 475, 118, 479, 445, 518, 489, - 530, 146, 0, 451, 537, 148, 495, 0, 221, 162, - 0, 0, 0, 477, 520, 484, 513, 472, 505, 436, - 494, 532, 462, 502, 533, 0, 0, 0, 86, 87, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 108, - 0, 499, 527, 459, 501, 503, 425, 496, 0, 429, - 432, 538, 523, 454, 455, 0, 0, 0, 0, 0, - 0, 0, 476, 485, 510, 470, 0, 0, 0, 0, - 0, 0, 0, 0, 452, 0, 493, 0, 0, 0, - 433, 430, 0, 0, 0, 0, 474, 0, 0, 0, - 435, 0, 453, 511, 0, 423, 127, 515, 522, 471, - 277, 526, 469, 468, 529, 193, 0, 225, 130, 145, - 104, 142, 90, 100, 0, 129, 171, 201, 205, 519, - 449, 458, 112, 456, 203, 181, 241, 492, 183, 202, - 149, 231, 194, 240, 250, 251, 228, 248, 255, 218, - 93, 227, 743, 109, 213, 95, 237, 224, 160, 139, - 140, 94, 0, 199, 117, 125, 114, 173, 234, 235, - 113, 258, 101, 247, 97, 421, 246, 167, 230, 238, - 161, 154, 96, 236, 159, 153, 144, 121, 132, 191, - 151, 192, 133, 164, 163, 165, 0, 428, 0, 222, - 244, 259, 106, 444, 229, 253, 254, 0, 195, 107, - 126, 120, 190, 124, 422, 420, 135, 219, 143, 150, - 198, 257, 180, 204, 110, 243, 220, 440, 443, 438, - 439, 487, 488, 534, 535, 536, 512, 434, 0, 441, - 442, 0, 517, 524, 525, 491, 89, 98, 147, 256, - 196, 123, 245, 424, 437, 116, 447, 0, 0, 460, - 465, 466, 478, 480, 481, 482, 483, 490, 497, 498, - 500, 506, 507, 508, 509, 514, 521, 540, 91, 92, - 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, - 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, - 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, - 186, 187, 188, 189, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 528, 516, 0, 473, 531, 446, - 463, 539, 464, 467, 504, 431, 486, 174, 461, 0, - 450, 426, 457, 427, 448, 475, 118, 479, 445, 518, - 489, 530, 146, 0, 451, 537, 148, 495, 0, 221, - 162, 0, 0, 0, 477, 520, 484, 513, 472, 505, - 436, 494, 532, 462, 502, 533, 0, 0, 0, 86, - 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 0, 499, 527, 459, 501, 503, 425, 496, 0, - 429, 432, 538, 523, 454, 455, 0, 0, 0, 0, - 0, 0, 0, 476, 485, 510, 470, 0, 0, 0, - 0, 0, 0, 0, 0, 452, 0, 493, 0, 0, - 0, 433, 430, 0, 0, 0, 0, 474, 0, 0, - 0, 435, 0, 453, 511, 0, 423, 127, 515, 522, - 471, 277, 526, 469, 468, 529, 193, 0, 225, 130, - 145, 104, 142, 90, 100, 0, 129, 171, 201, 205, - 519, 449, 458, 112, 456, 203, 181, 241, 492, 183, - 202, 149, 231, 194, 240, 250, 251, 228, 248, 255, - 218, 93, 227, 412, 109, 213, 95, 237, 224, 160, - 139, 140, 94, 0, 199, 117, 125, 114, 173, 234, - 235, 113, 258, 101, 247, 97, 421, 246, 167, 230, - 238, 161, 154, 96, 236, 159, 153, 144, 121, 132, - 191, 151, 192, 133, 164, 163, 165, 0, 428, 0, - 222, 244, 259, 106, 444, 229, 253, 254, 0, 195, - 107, 126, 120, 190, 124, 422, 420, 415, 414, 143, - 150, 198, 257, 180, 204, 110, 243, 220, 440, 443, - 438, 439, 487, 488, 534, 535, 536, 512, 434, 0, - 441, 442, 0, 517, 524, 525, 491, 89, 98, 147, - 256, 196, 123, 245, 424, 437, 116, 447, 0, 0, - 460, 465, 466, 478, 480, 481, 482, 483, 490, 497, - 498, 500, 506, 507, 508, 509, 514, 521, 540, 91, - 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, - 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, - 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, - 185, 186, 187, 188, 189, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 174, 0, 0, 902, 0, - 317, 0, 0, 0, 118, 0, 316, 0, 0, 0, - 146, 0, 903, 360, 148, 0, 0, 221, 162, 0, - 0, 0, 0, 0, 351, 352, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 86, 87, 88, - 338, 337, 340, 341, 342, 343, 0, 0, 108, 339, - 344, 345, 346, 0, 0, 0, 314, 331, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, - 329, 399, 0, 0, 0, 374, 0, 330, 0, 0, - 323, 324, 326, 325, 327, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 127, 373, 0, 0, 277, - 0, 0, 371, 0, 193, 0, 225, 130, 145, 104, - 142, 90, 100, 0, 129, 171, 201, 205, 0, 0, - 0, 112, 0, 203, 181, 241, 0, 183, 202, 149, - 231, 194, 240, 250, 251, 228, 248, 255, 218, 93, - 227, 239, 109, 213, 95, 237, 224, 160, 139, 140, - 94, 0, 199, 117, 125, 114, 173, 234, 235, 113, - 258, 101, 247, 97, 102, 246, 167, 230, 238, 161, - 154, 96, 236, 159, 153, 144, 121, 132, 191, 151, - 192, 133, 164, 163, 165, 0, 0, 0, 222, 244, - 259, 106, 0, 229, 253, 254, 0, 195, 107, 126, - 120, 190, 124, 166, 103, 135, 219, 143, 150, 198, - 257, 180, 204, 110, 243, 220, 361, 372, 367, 368, - 365, 366, 364, 363, 362, 375, 353, 354, 355, 356, - 358, 0, 369, 370, 357, 89, 98, 147, 256, 196, - 123, 245, 0, 0, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, - 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, - 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, - 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, - 187, 188, 189, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 174, 0, 0, 0, 0, 317, 0, - 0, 0, 118, 0, 316, 0, 0, 0, 146, 0, - 0, 360, 148, 0, 0, 221, 162, 0, 0, 0, - 0, 0, 351, 352, 0, 0, 0, 0, 0, 0, - 1000, 0, 54, 0, 0, 86, 87, 88, 338, 337, - 340, 341, 342, 343, 0, 0, 108, 339, 344, 345, - 346, 1001, 0, 0, 314, 331, 0, 359, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 328, 329, 0, - 0, 0, 0, 374, 0, 330, 0, 0, 323, 324, - 326, 325, 327, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 127, 373, 0, 0, 277, 0, 0, - 371, 0, 193, 0, 225, 130, 145, 104, 142, 90, - 100, 0, 129, 171, 201, 205, 0, 0, 0, 112, - 0, 203, 181, 241, 0, 183, 202, 149, 231, 194, - 240, 250, 251, 228, 248, 255, 218, 93, 227, 239, - 109, 213, 95, 237, 224, 160, 139, 140, 94, 0, - 199, 117, 125, 114, 173, 234, 235, 113, 258, 101, - 247, 97, 102, 246, 167, 230, 238, 161, 154, 96, - 236, 159, 153, 144, 121, 132, 191, 151, 192, 133, - 164, 163, 165, 0, 0, 0, 222, 244, 259, 106, - 0, 229, 253, 254, 0, 195, 107, 126, 120, 190, - 124, 166, 103, 135, 219, 143, 150, 198, 257, 180, - 204, 110, 243, 220, 361, 372, 367, 368, 365, 366, - 364, 363, 362, 375, 353, 354, 355, 356, 358, 0, - 369, 370, 357, 89, 98, 147, 256, 196, 123, 245, - 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 92, 99, 105, 111, - 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, - 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, - 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, - 189, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 174, 0, 0, 0, 0, 317, 0, 0, 0, - 118, 0, 316, 0, 0, 0, 146, 0, 0, 360, - 148, 0, 0, 221, 162, 0, 0, 0, 0, 0, - 351, 352, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 387, 86, 87, 88, 338, 337, 340, 341, - 342, 343, 0, 0, 108, 339, 344, 345, 346, 0, - 0, 0, 314, 331, 0, 359, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 328, 329, 0, 0, 0, - 0, 374, 0, 330, 0, 0, 323, 324, 326, 325, - 327, 332, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 127, 373, 0, 0, 277, 0, 0, 371, 0, - 193, 0, 225, 130, 145, 104, 142, 90, 100, 0, - 129, 171, 201, 205, 0, 0, 0, 112, 0, 203, - 181, 241, 0, 183, 202, 149, 231, 194, 240, 250, - 251, 228, 248, 255, 218, 93, 227, 239, 109, 213, - 95, 237, 224, 160, 139, 140, 94, 0, 199, 117, - 125, 114, 173, 234, 235, 113, 258, 101, 247, 97, - 102, 246, 167, 230, 238, 161, 154, 96, 236, 159, - 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, - 165, 0, 0, 0, 222, 244, 259, 106, 0, 229, - 253, 254, 0, 195, 107, 126, 120, 190, 124, 166, - 103, 135, 219, 143, 150, 198, 257, 180, 204, 110, - 243, 220, 361, 372, 367, 368, 365, 366, 364, 363, - 362, 375, 353, 354, 355, 356, 358, 0, 369, 370, - 357, 89, 98, 147, 256, 196, 123, 245, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 92, 99, 105, 111, 115, 119, - 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, - 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, - 178, 179, 182, 184, 185, 186, 187, 188, 189, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 174, - 0, 0, 0, 0, 317, 0, 0, 0, 118, 0, - 316, 0, 0, 0, 146, 0, 0, 360, 148, 0, - 0, 221, 162, 0, 0, 0, 0, 0, 351, 352, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 0, 86, 87, 88, 338, 337, 340, 341, 342, 343, - 0, 0, 108, 339, 344, 345, 346, 0, 0, 0, - 314, 331, 0, 359, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 328, 329, 399, 0, 0, 0, 374, - 0, 330, 0, 0, 323, 324, 326, 325, 327, 332, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, - 373, 0, 0, 277, 0, 0, 371, 0, 193, 0, - 225, 130, 145, 104, 142, 90, 100, 0, 129, 171, - 201, 205, 0, 0, 0, 112, 0, 203, 181, 241, - 0, 183, 202, 149, 231, 194, 240, 250, 251, 228, - 248, 255, 218, 93, 227, 239, 109, 213, 95, 237, - 224, 160, 139, 140, 94, 0, 199, 117, 125, 114, - 173, 234, 235, 113, 258, 101, 247, 97, 102, 246, - 167, 230, 238, 161, 154, 96, 236, 159, 153, 144, - 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, - 0, 0, 222, 244, 259, 106, 0, 229, 253, 254, - 0, 195, 107, 126, 120, 190, 124, 166, 103, 135, - 219, 143, 150, 198, 257, 180, 204, 110, 243, 220, - 361, 372, 367, 368, 365, 366, 364, 363, 362, 375, - 353, 354, 355, 356, 358, 0, 369, 370, 357, 89, - 98, 147, 256, 196, 123, 245, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 91, 92, 99, 105, 111, 115, 119, 122, 128, - 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, - 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, - 182, 184, 185, 186, 187, 188, 189, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 174, 0, 0, - 0, 0, 317, 0, 0, 0, 118, 0, 316, 0, - 0, 0, 146, 0, 0, 360, 148, 0, 0, 221, - 162, 0, 0, 0, 0, 0, 351, 352, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 86, - 87, 88, 338, 918, 340, 341, 342, 343, 0, 0, - 108, 339, 344, 345, 346, 0, 0, 0, 314, 331, - 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 328, 329, 399, 0, 0, 0, 374, 0, 330, - 0, 0, 323, 324, 326, 325, 327, 332, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 127, 373, 0, - 0, 277, 0, 0, 371, 0, 193, 0, 225, 130, - 145, 104, 142, 90, 100, 0, 129, 171, 201, 205, - 0, 0, 0, 112, 0, 203, 181, 241, 0, 183, - 202, 149, 231, 194, 240, 250, 251, 228, 248, 255, - 218, 93, 227, 239, 109, 213, 95, 237, 224, 160, - 139, 140, 94, 0, 199, 117, 125, 114, 173, 234, - 235, 113, 258, 101, 247, 97, 102, 246, 167, 230, - 238, 161, 154, 96, 236, 159, 153, 144, 121, 132, - 191, 151, 192, 133, 164, 163, 165, 0, 0, 0, - 222, 244, 259, 106, 0, 229, 253, 254, 0, 195, - 107, 126, 120, 190, 124, 166, 103, 135, 219, 143, - 150, 198, 257, 180, 204, 110, 243, 220, 361, 372, - 367, 368, 365, 366, 364, 363, 362, 375, 353, 354, - 355, 356, 358, 0, 369, 370, 357, 89, 98, 147, - 256, 196, 123, 245, 0, 0, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, - 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, - 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, - 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, - 185, 186, 187, 188, 189, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 174, 0, 0, 0, 0, - 317, 0, 0, 0, 118, 0, 316, 0, 0, 0, - 146, 0, 0, 360, 148, 0, 0, 221, 162, 0, - 0, 0, 0, 0, 351, 352, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 86, 87, 88, - 338, 915, 340, 341, 342, 343, 0, 0, 108, 339, - 344, 345, 346, 0, 0, 0, 314, 331, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, - 329, 399, 0, 0, 0, 374, 0, 330, 0, 0, - 323, 324, 326, 325, 327, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 127, 373, 0, 0, 277, - 0, 0, 371, 0, 193, 0, 225, 130, 145, 104, - 142, 90, 100, 0, 129, 171, 201, 205, 0, 0, - 0, 112, 0, 203, 181, 241, 0, 183, 202, 149, - 231, 194, 240, 250, 251, 228, 248, 255, 218, 93, - 227, 239, 109, 213, 95, 237, 224, 160, 139, 140, - 94, 0, 199, 117, 125, 114, 173, 234, 235, 113, - 258, 101, 247, 97, 102, 246, 167, 230, 238, 161, - 154, 96, 236, 159, 153, 144, 121, 132, 191, 151, - 192, 133, 164, 163, 165, 0, 0, 0, 222, 244, - 259, 106, 0, 229, 253, 254, 0, 195, 107, 126, - 120, 190, 124, 166, 103, 135, 219, 143, 150, 198, - 257, 180, 204, 110, 243, 220, 361, 372, 367, 368, - 365, 366, 364, 363, 362, 375, 353, 354, 355, 356, - 358, 0, 369, 370, 357, 89, 98, 147, 256, 196, - 123, 245, 0, 0, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, - 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, - 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, - 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, - 187, 188, 189, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 383, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, - 317, 0, 0, 0, 118, 0, 316, 0, 0, 0, - 146, 0, 0, 360, 148, 0, 0, 221, 162, 0, - 0, 0, 0, 0, 351, 352, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 0, 0, 86, 87, 88, - 338, 337, 340, 341, 342, 343, 0, 0, 108, 339, - 344, 345, 346, 0, 0, 0, 314, 331, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, - 329, 0, 0, 0, 0, 374, 0, 330, 0, 0, - 323, 324, 326, 325, 327, 332, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 127, 373, 0, 0, 277, - 0, 0, 371, 0, 193, 0, 225, 130, 145, 104, - 142, 90, 100, 0, 129, 171, 201, 205, 0, 0, - 0, 112, 0, 203, 181, 241, 0, 183, 202, 149, - 231, 194, 240, 250, 251, 228, 248, 255, 218, 93, - 227, 239, 109, 213, 95, 237, 224, 160, 139, 140, - 94, 0, 199, 117, 125, 114, 173, 234, 235, 113, - 258, 101, 247, 97, 102, 246, 167, 230, 238, 161, - 154, 96, 236, 159, 153, 144, 121, 132, 191, 151, - 192, 133, 164, 163, 165, 0, 0, 0, 222, 244, - 259, 106, 0, 229, 253, 254, 0, 195, 107, 126, - 120, 190, 124, 166, 103, 135, 219, 143, 150, 198, - 257, 180, 204, 110, 243, 220, 361, 372, 367, 368, - 365, 366, 364, 363, 362, 375, 353, 354, 355, 356, - 358, 0, 369, 370, 357, 89, 98, 147, 256, 196, - 123, 245, 0, 0, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, - 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, - 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, - 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, - 187, 188, 189, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 174, 0, 0, 0, 0, 317, 0, - 0, 0, 118, 0, 316, 0, 0, 0, 146, 0, - 0, 360, 148, 0, 0, 221, 162, 0, 0, 0, - 0, 0, 351, 352, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 86, 87, 88, 338, 337, - 340, 341, 342, 343, 0, 0, 108, 339, 344, 345, - 346, 0, 0, 0, 314, 331, 0, 359, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 328, 329, 0, - 0, 0, 0, 374, 0, 330, 0, 0, 323, 324, - 326, 325, 327, 332, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 127, 373, 0, 0, 277, 0, 0, - 371, 0, 193, 0, 225, 130, 145, 104, 142, 90, - 100, 0, 129, 171, 201, 205, 0, 0, 0, 112, - 0, 203, 181, 241, 0, 183, 202, 149, 231, 194, - 240, 250, 251, 228, 248, 255, 218, 93, 227, 239, - 109, 213, 95, 237, 224, 160, 139, 140, 94, 0, - 199, 117, 125, 114, 173, 234, 235, 113, 258, 101, - 247, 97, 102, 246, 167, 230, 238, 161, 154, 96, - 236, 159, 153, 144, 121, 132, 191, 151, 192, 133, - 164, 163, 165, 0, 0, 0, 222, 244, 259, 106, - 0, 229, 253, 254, 0, 195, 107, 126, 120, 190, - 124, 166, 103, 135, 219, 143, 150, 198, 257, 180, - 204, 110, 243, 220, 361, 372, 367, 368, 365, 366, - 364, 363, 362, 375, 353, 354, 355, 356, 358, 0, - 369, 370, 357, 89, 98, 147, 256, 196, 123, 245, - 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 92, 99, 105, 111, - 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, - 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, - 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, - 189, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 174, 0, 0, 0, 0, 0, 0, 0, 0, - 118, 0, 0, 0, 0, 0, 146, 0, 0, 360, - 148, 0, 0, 221, 162, 0, 0, 0, 0, 0, - 351, 352, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 86, 87, 88, 338, 337, 340, 341, - 342, 343, 0, 0, 108, 339, 344, 345, 346, 0, - 0, 0, 0, 331, 0, 359, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 328, 329, 0, 0, 0, - 0, 374, 0, 330, 0, 0, 323, 324, 326, 325, - 327, 332, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 127, 373, 0, 0, 277, 0, 0, 371, 0, - 193, 0, 225, 130, 145, 104, 142, 90, 100, 0, - 129, 171, 201, 205, 0, 0, 0, 112, 0, 203, - 181, 241, 1566, 183, 202, 149, 231, 194, 240, 250, - 251, 228, 248, 255, 218, 93, 227, 239, 109, 213, - 95, 237, 224, 160, 139, 140, 94, 0, 199, 117, - 125, 114, 173, 234, 235, 113, 258, 101, 247, 97, - 102, 246, 167, 230, 238, 161, 154, 96, 236, 159, - 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, - 165, 0, 0, 0, 222, 244, 259, 106, 0, 229, - 253, 254, 0, 195, 107, 126, 120, 190, 124, 166, - 103, 135, 219, 143, 150, 198, 257, 180, 204, 110, - 243, 220, 361, 372, 367, 368, 365, 366, 364, 363, - 362, 375, 353, 354, 355, 356, 358, 0, 369, 370, - 357, 89, 98, 147, 256, 196, 123, 245, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 92, 99, 105, 111, 115, 119, - 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, - 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, - 178, 179, 182, 184, 185, 186, 187, 188, 189, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 174, - 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, - 0, 0, 0, 0, 146, 0, 0, 360, 148, 0, - 0, 221, 162, 0, 0, 0, 0, 0, 351, 352, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 387, 86, 87, 88, 338, 337, 340, 341, 342, 343, - 0, 0, 108, 339, 344, 345, 346, 0, 0, 0, - 0, 331, 0, 359, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 328, 329, 0, 0, 0, 0, 374, - 0, 330, 0, 0, 323, 324, 326, 325, 327, 332, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, - 373, 0, 0, 277, 0, 0, 371, 0, 193, 0, - 225, 130, 145, 104, 142, 90, 100, 0, 129, 171, - 201, 205, 0, 0, 0, 112, 0, 203, 181, 241, - 0, 183, 202, 149, 231, 194, 240, 250, 251, 228, - 248, 255, 218, 93, 227, 239, 109, 213, 95, 237, - 224, 160, 139, 140, 94, 0, 199, 117, 125, 114, - 173, 234, 235, 113, 258, 101, 247, 97, 102, 246, - 167, 230, 238, 161, 154, 96, 236, 159, 153, 144, - 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, - 0, 0, 222, 244, 259, 106, 0, 229, 253, 254, - 0, 195, 107, 126, 120, 190, 124, 166, 103, 135, - 219, 143, 150, 198, 257, 180, 204, 110, 243, 220, - 361, 372, 367, 368, 365, 366, 364, 363, 362, 375, - 353, 354, 355, 356, 358, 0, 369, 370, 357, 89, - 98, 147, 256, 196, 123, 245, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 91, 92, 99, 105, 111, 115, 119, 122, 128, - 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, - 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, - 182, 184, 185, 186, 187, 188, 189, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 174, 0, 0, - 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, - 0, 0, 146, 0, 0, 360, 148, 0, 0, 221, - 162, 0, 0, 0, 0, 0, 351, 352, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 86, - 87, 88, 338, 337, 340, 341, 342, 343, 0, 0, - 108, 339, 344, 345, 346, 0, 0, 0, 0, 331, - 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 328, 329, 0, 0, 0, 0, 374, 0, 330, - 0, 0, 323, 324, 326, 325, 327, 332, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 127, 373, 0, - 0, 277, 0, 0, 371, 0, 193, 0, 225, 130, - 145, 104, 142, 90, 100, 0, 129, 171, 201, 205, - 0, 0, 0, 112, 0, 203, 181, 241, 0, 183, - 202, 149, 231, 194, 240, 250, 251, 228, 248, 255, - 218, 93, 227, 239, 109, 213, 95, 237, 224, 160, - 139, 140, 94, 0, 199, 117, 125, 114, 173, 234, - 235, 113, 258, 101, 247, 97, 102, 246, 167, 230, - 238, 161, 154, 96, 236, 159, 153, 144, 121, 132, - 191, 151, 192, 133, 164, 163, 165, 0, 0, 0, - 222, 244, 259, 106, 0, 229, 253, 254, 0, 195, - 107, 126, 120, 190, 124, 166, 103, 135, 219, 143, - 150, 198, 257, 180, 204, 110, 243, 220, 361, 372, - 367, 368, 365, 366, 364, 363, 362, 375, 353, 354, - 355, 356, 358, 0, 369, 370, 357, 89, 98, 147, - 256, 196, 123, 245, 0, 0, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, - 92, 99, 105, 111, 115, 119, 122, 128, 131, 134, - 136, 137, 138, 141, 152, 155, 156, 157, 158, 168, - 169, 170, 172, 175, 176, 177, 178, 179, 182, 184, - 185, 186, 187, 188, 189, 197, 200, 206, 207, 208, - 209, 210, 211, 212, 214, 215, 216, 217, 223, 226, - 232, 233, 242, 249, 252, 174, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, - 146, 0, 0, 0, 148, 0, 0, 221, 162, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86, 87, 88, - 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 628, 627, 637, 638, 630, - 631, 632, 633, 634, 635, 636, 629, 0, 0, 639, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 127, 0, 0, 0, 277, - 0, 0, 0, 0, 193, 0, 225, 130, 145, 104, - 142, 90, 100, 0, 129, 171, 201, 205, 0, 0, - 0, 112, 0, 203, 181, 241, 0, 183, 202, 149, - 231, 194, 240, 250, 251, 228, 248, 255, 218, 93, - 227, 239, 109, 213, 95, 237, 224, 160, 139, 140, - 94, 0, 199, 117, 125, 114, 173, 234, 235, 113, - 258, 101, 247, 97, 102, 246, 167, 230, 238, 161, - 154, 96, 236, 159, 153, 144, 121, 132, 191, 151, - 192, 133, 164, 163, 165, 0, 0, 0, 222, 244, - 259, 106, 0, 229, 253, 254, 0, 195, 107, 126, - 120, 190, 124, 166, 103, 135, 219, 143, 150, 198, - 257, 180, 204, 110, 243, 220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 89, 98, 147, 256, 196, - 123, 245, 0, 0, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, - 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, - 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, - 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, - 187, 188, 189, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 174, 0, 0, 0, 718, 0, 0, - 0, 0, 118, 0, 0, 0, 0, 0, 146, 0, - 0, 0, 148, 0, 0, 221, 162, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 87, 88, 0, 720, - 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, - 0, 0, 618, 617, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 127, 0, 0, 0, 277, 0, 0, - 0, 0, 193, 0, 225, 130, 145, 104, 142, 90, - 100, 0, 129, 171, 201, 205, 0, 0, 0, 112, - 0, 203, 181, 241, 0, 183, 202, 149, 231, 194, - 240, 250, 251, 228, 248, 255, 218, 93, 227, 239, - 109, 213, 95, 237, 224, 160, 139, 140, 94, 0, - 199, 117, 125, 114, 173, 234, 235, 113, 258, 101, - 247, 97, 102, 246, 167, 230, 238, 161, 154, 96, - 236, 159, 153, 144, 121, 132, 191, 151, 192, 133, - 164, 163, 165, 0, 0, 0, 222, 244, 259, 106, - 0, 229, 253, 254, 0, 195, 107, 126, 120, 190, - 124, 166, 103, 135, 219, 143, 150, 198, 257, 180, - 204, 110, 243, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 89, 98, 147, 256, 196, 123, 245, - 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 92, 99, 105, 111, - 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, - 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, - 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, - 189, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 174, 0, 0, 0, 0, 0, 0, 0, 0, - 118, 0, 0, 0, 0, 0, 146, 0, 0, 0, - 148, 0, 0, 221, 162, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 87, 88, 0, 0, 0, 0, - 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, - 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 127, 80, 81, 0, 77, 0, 0, 0, 82, - 193, 0, 225, 130, 145, 104, 142, 90, 100, 0, - 129, 171, 201, 205, 0, 0, 0, 112, 0, 203, - 181, 241, 0, 183, 202, 149, 231, 194, 240, 250, - 251, 228, 248, 255, 218, 93, 227, 239, 109, 213, - 95, 237, 224, 160, 139, 140, 94, 0, 199, 117, - 125, 114, 173, 234, 235, 113, 258, 101, 247, 97, - 102, 246, 167, 230, 238, 161, 154, 96, 236, 159, - 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, - 165, 0, 0, 0, 222, 244, 259, 106, 0, 229, - 253, 254, 0, 195, 107, 126, 120, 190, 124, 166, - 103, 135, 219, 143, 150, 198, 257, 180, 204, 110, - 243, 220, 0, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 89, 98, 147, 256, 196, 123, 245, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 92, 99, 105, 111, 115, 119, - 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, - 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, - 178, 179, 182, 184, 185, 186, 187, 188, 189, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, 174, - 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, - 0, 0, 0, 0, 146, 0, 0, 0, 148, 0, - 0, 221, 162, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 87, 88, 0, 0, 0, 0, 0, 0, - 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 305, 0, 127, - 0, 0, 0, 277, 0, 0, 0, 0, 193, 0, - 225, 130, 145, 104, 142, 90, 100, 0, 129, 171, - 201, 205, 0, 0, 0, 112, 0, 203, 181, 241, - 0, 183, 202, 149, 231, 194, 240, 250, 251, 228, - 248, 255, 218, 93, 227, 239, 109, 213, 95, 237, - 224, 160, 139, 140, 94, 0, 199, 117, 125, 114, - 173, 234, 235, 113, 258, 101, 247, 97, 102, 246, - 167, 230, 238, 161, 154, 96, 236, 159, 153, 144, - 121, 132, 191, 151, 192, 133, 164, 163, 165, 0, - 0, 0, 222, 244, 259, 106, 0, 229, 253, 254, - 0, 195, 107, 126, 120, 190, 124, 166, 103, 135, - 219, 143, 150, 198, 257, 180, 204, 110, 243, 220, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, - 98, 147, 256, 196, 123, 245, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 91, 92, 99, 105, 111, 115, 119, 122, 128, - 131, 134, 136, 137, 138, 141, 152, 155, 156, 157, - 158, 168, 169, 170, 172, 175, 176, 177, 178, 179, - 182, 184, 185, 186, 187, 188, 189, 197, 200, 206, - 207, 208, 209, 210, 211, 212, 214, 215, 216, 217, - 223, 226, 232, 233, 242, 249, 252, 304, 174, 0, - 0, 0, 983, 0, 0, 0, 0, 118, 0, 0, - 0, 0, 0, 146, 0, 0, 0, 148, 0, 0, - 221, 162, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 87, 88, 0, 985, 0, 0, 0, 0, 0, - 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, - 0, 0, 277, 0, 0, 0, 0, 193, 0, 225, - 130, 145, 104, 142, 90, 100, 0, 129, 171, 201, - 205, 0, 0, 0, 112, 0, 203, 181, 241, 0, - 183, 202, 149, 231, 194, 240, 250, 251, 228, 248, - 255, 218, 93, 227, 239, 109, 213, 95, 237, 224, - 160, 139, 140, 94, 0, 199, 117, 125, 114, 173, - 234, 235, 113, 258, 101, 247, 97, 102, 246, 167, - 230, 238, 161, 154, 96, 236, 159, 153, 144, 121, - 132, 191, 151, 192, 133, 164, 163, 165, 0, 0, - 0, 222, 244, 259, 106, 0, 229, 253, 254, 0, - 195, 107, 126, 120, 190, 124, 166, 103, 135, 219, - 143, 150, 198, 257, 180, 204, 110, 243, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 98, - 147, 256, 196, 123, 245, 0, 0, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, - 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, - 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, - 184, 185, 186, 187, 188, 189, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 27, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, - 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, - 0, 0, 0, 146, 0, 0, 0, 148, 0, 0, - 221, 162, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 86, 87, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, - 0, 0, 277, 0, 0, 0, 0, 193, 0, 225, - 130, 145, 104, 142, 90, 100, 0, 129, 171, 201, - 205, 0, 0, 0, 112, 0, 203, 181, 241, 0, - 183, 202, 149, 231, 194, 240, 250, 251, 228, 248, - 255, 218, 93, 227, 239, 109, 213, 95, 237, 224, - 160, 139, 140, 94, 0, 199, 117, 125, 114, 173, - 234, 235, 113, 258, 101, 247, 97, 102, 246, 167, - 230, 238, 161, 154, 96, 236, 159, 153, 144, 121, - 132, 191, 151, 192, 133, 164, 163, 165, 0, 0, - 0, 222, 244, 259, 106, 0, 229, 253, 254, 0, - 195, 107, 126, 120, 190, 124, 166, 103, 135, 219, - 143, 150, 198, 257, 180, 204, 110, 243, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 98, - 147, 256, 196, 123, 245, 0, 0, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, - 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, - 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, - 184, 185, 186, 187, 188, 189, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 174, 0, 0, 0, - 983, 0, 0, 0, 0, 118, 0, 0, 0, 0, - 0, 146, 0, 0, 0, 148, 0, 0, 221, 162, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, - 88, 0, 985, 0, 0, 0, 0, 0, 0, 108, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, - 277, 0, 0, 0, 0, 193, 0, 225, 130, 145, - 104, 142, 90, 100, 0, 129, 171, 201, 205, 0, - 0, 0, 112, 0, 203, 181, 241, 0, 981, 202, - 149, 231, 194, 240, 250, 251, 228, 248, 255, 218, - 93, 227, 239, 109, 213, 95, 237, 224, 160, 139, - 140, 94, 0, 199, 117, 125, 114, 173, 234, 235, - 113, 258, 101, 247, 97, 102, 246, 167, 230, 238, - 161, 154, 96, 236, 159, 153, 144, 121, 132, 191, - 151, 192, 133, 164, 163, 165, 0, 0, 0, 222, - 244, 259, 106, 0, 229, 253, 254, 0, 195, 107, - 126, 120, 190, 124, 166, 103, 135, 219, 143, 150, - 198, 257, 180, 204, 110, 243, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 98, 147, 256, - 196, 123, 245, 0, 0, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, - 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, - 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, - 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, - 186, 187, 188, 189, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 383, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, - 0, 146, 0, 0, 0, 148, 0, 0, 221, 162, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 86, 87, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 108, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, - 277, 0, 0, 0, 0, 193, 0, 225, 130, 145, - 104, 142, 90, 100, 0, 129, 171, 201, 205, 0, - 0, 0, 112, 0, 203, 181, 241, 0, 183, 202, - 149, 231, 194, 240, 250, 251, 228, 248, 255, 218, - 93, 227, 239, 109, 213, 95, 237, 224, 160, 139, - 140, 94, 0, 199, 117, 125, 114, 173, 234, 235, - 113, 258, 101, 247, 97, 102, 246, 167, 230, 238, - 161, 154, 96, 236, 159, 153, 144, 121, 132, 191, - 151, 192, 133, 164, 163, 165, 0, 0, 0, 222, - 244, 259, 106, 0, 229, 253, 254, 0, 195, 107, - 126, 120, 190, 124, 166, 103, 135, 219, 143, 150, - 198, 257, 180, 204, 110, 243, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 98, 147, 256, - 196, 123, 245, 0, 0, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, - 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, - 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, - 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, - 186, 187, 188, 189, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 174, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 0, 0, 0, 0, 0, 146, - 0, 0, 0, 148, 0, 0, 221, 162, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 87, 88, 0, - 0, 951, 0, 0, 952, 0, 0, 108, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 127, 0, 0, 0, 277, 0, - 0, 0, 0, 193, 0, 225, 130, 145, 104, 142, - 90, 100, 0, 129, 171, 201, 205, 0, 0, 0, - 112, 0, 203, 181, 241, 0, 183, 202, 149, 231, - 194, 240, 250, 251, 228, 248, 255, 218, 93, 227, - 239, 109, 213, 95, 237, 224, 160, 139, 140, 94, - 0, 199, 117, 125, 114, 173, 234, 235, 113, 258, - 101, 247, 97, 102, 246, 167, 230, 238, 161, 154, - 96, 236, 159, 153, 144, 121, 132, 191, 151, 192, - 133, 164, 163, 165, 0, 0, 0, 222, 244, 259, - 106, 0, 229, 253, 254, 0, 195, 107, 126, 120, - 190, 124, 166, 103, 135, 219, 143, 150, 198, 257, - 180, 204, 110, 243, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 98, 147, 256, 196, 123, - 245, 0, 0, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 91, 92, 99, 105, - 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, - 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, - 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, - 188, 189, 197, 200, 206, 207, 208, 209, 210, 211, - 212, 214, 215, 216, 217, 223, 226, 232, 233, 242, - 249, 252, 174, 0, 0, 0, 0, 0, 0, 0, - 0, 118, 0, 753, 0, 0, 0, 146, 0, 0, - 0, 148, 0, 0, 221, 162, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 87, 88, 0, 752, 0, - 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 127, 0, 0, 0, 277, 0, 0, 0, - 0, 193, 0, 225, 130, 145, 104, 142, 90, 100, - 0, 129, 171, 201, 205, 0, 0, 0, 112, 0, - 203, 181, 241, 0, 183, 202, 149, 231, 194, 240, - 250, 251, 228, 248, 255, 218, 93, 227, 239, 109, - 213, 95, 237, 224, 160, 139, 140, 94, 0, 199, - 117, 125, 114, 173, 234, 235, 113, 258, 101, 247, - 97, 102, 246, 167, 230, 238, 161, 154, 96, 236, - 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, - 163, 165, 0, 0, 0, 222, 244, 259, 106, 0, - 229, 253, 254, 0, 195, 107, 126, 120, 190, 124, - 166, 103, 135, 219, 143, 150, 198, 257, 180, 204, - 110, 243, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 98, 147, 256, 196, 123, 245, 0, - 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 92, 99, 105, 111, 115, - 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, - 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, - 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, - 197, 200, 206, 207, 208, 209, 210, 211, 212, 214, - 215, 216, 217, 223, 226, 232, 233, 242, 249, 252, - 174, 0, 0, 0, 0, 0, 0, 0, 0, 118, - 0, 0, 0, 0, 0, 146, 0, 0, 0, 148, - 0, 0, 221, 162, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 387, 86, 87, 88, 0, 0, 0, 0, 0, - 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 0, 0, 0, 277, 0, 0, 0, 0, 193, - 0, 225, 130, 145, 104, 142, 90, 100, 0, 129, - 171, 201, 205, 0, 0, 0, 112, 0, 203, 181, - 241, 0, 183, 202, 149, 231, 194, 240, 250, 251, - 228, 248, 255, 218, 93, 227, 239, 109, 213, 95, - 237, 224, 160, 139, 140, 94, 0, 199, 117, 125, - 114, 173, 234, 235, 113, 258, 101, 247, 97, 102, - 246, 167, 230, 238, 161, 154, 96, 236, 159, 153, - 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, - 0, 0, 0, 222, 244, 259, 106, 0, 229, 253, - 254, 0, 195, 107, 126, 120, 190, 124, 166, 103, - 135, 219, 143, 150, 198, 257, 180, 204, 110, 243, - 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 98, 147, 256, 196, 123, 245, 0, 0, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 91, 92, 99, 105, 111, 115, 119, 122, - 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, - 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, - 179, 182, 184, 185, 186, 187, 188, 189, 197, 200, - 206, 207, 208, 209, 210, 211, 212, 214, 215, 216, - 217, 223, 226, 232, 233, 242, 249, 252, 174, 0, - 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, - 0, 0, 0, 146, 0, 0, 0, 148, 0, 0, - 221, 162, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 86, 87, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, - 0, 0, 277, 0, 0, 0, 0, 193, 0, 225, - 130, 145, 104, 142, 90, 100, 0, 129, 171, 201, - 205, 0, 0, 0, 112, 0, 203, 181, 241, 0, - 183, 202, 149, 231, 194, 240, 250, 251, 228, 248, - 255, 218, 93, 227, 239, 109, 213, 95, 237, 224, - 160, 139, 140, 94, 0, 199, 117, 125, 114, 173, - 234, 235, 113, 258, 101, 247, 97, 102, 246, 167, - 230, 238, 161, 154, 96, 236, 159, 153, 144, 121, - 132, 191, 151, 192, 133, 164, 163, 165, 0, 0, - 0, 222, 244, 259, 106, 0, 229, 253, 254, 0, - 195, 107, 126, 120, 190, 124, 166, 103, 135, 219, - 143, 150, 198, 257, 180, 204, 110, 243, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 98, - 147, 256, 196, 123, 245, 0, 0, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 91, 92, 99, 105, 111, 115, 119, 122, 128, 131, - 134, 136, 137, 138, 141, 152, 155, 156, 157, 158, - 168, 169, 170, 172, 175, 176, 177, 178, 179, 182, - 184, 185, 186, 187, 188, 189, 197, 200, 206, 207, - 208, 209, 210, 211, 212, 214, 215, 216, 217, 223, - 226, 232, 233, 242, 249, 252, 174, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, - 0, 146, 0, 0, 0, 148, 0, 0, 221, 162, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, - 88, 0, 985, 0, 0, 0, 0, 0, 0, 108, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, - 277, 0, 0, 0, 0, 193, 0, 225, 130, 145, - 104, 142, 90, 100, 0, 129, 171, 201, 205, 0, - 0, 0, 112, 0, 203, 181, 241, 0, 183, 202, - 149, 231, 194, 240, 250, 251, 228, 248, 255, 218, - 93, 227, 239, 109, 213, 95, 237, 224, 160, 139, - 140, 94, 0, 199, 117, 125, 114, 173, 234, 235, - 113, 258, 101, 247, 97, 102, 246, 167, 230, 238, - 161, 154, 96, 236, 159, 153, 144, 121, 132, 191, - 151, 192, 133, 164, 163, 165, 0, 0, 0, 222, - 244, 259, 106, 0, 229, 253, 254, 0, 195, 107, - 126, 120, 190, 124, 166, 103, 135, 219, 143, 150, - 198, 257, 180, 204, 110, 243, 220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 98, 147, 256, - 196, 123, 245, 0, 0, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, - 99, 105, 111, 115, 119, 122, 128, 131, 134, 136, - 137, 138, 141, 152, 155, 156, 157, 158, 168, 169, - 170, 172, 175, 176, 177, 178, 179, 182, 184, 185, - 186, 187, 188, 189, 197, 200, 206, 207, 208, 209, - 210, 211, 212, 214, 215, 216, 217, 223, 226, 232, - 233, 242, 249, 252, 174, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 0, 0, 0, 0, 0, 146, - 0, 0, 0, 148, 0, 0, 221, 162, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 87, 88, 0, - 720, 0, 0, 0, 0, 0, 0, 108, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 127, 0, 0, 0, 277, 0, - 0, 0, 0, 193, 0, 225, 130, 145, 104, 142, - 90, 100, 0, 129, 171, 201, 205, 0, 0, 0, - 112, 0, 203, 181, 241, 0, 183, 202, 149, 231, - 194, 240, 250, 251, 228, 248, 255, 218, 93, 227, - 239, 109, 213, 95, 237, 224, 160, 139, 140, 94, - 0, 199, 117, 125, 114, 173, 234, 235, 113, 258, - 101, 247, 97, 102, 246, 167, 230, 238, 161, 154, - 96, 236, 159, 153, 144, 121, 132, 191, 151, 192, - 133, 164, 163, 165, 0, 0, 0, 222, 244, 259, - 106, 0, 229, 253, 254, 0, 195, 107, 126, 120, - 190, 124, 166, 103, 135, 219, 143, 150, 198, 257, - 180, 204, 110, 243, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 89, 98, 147, 256, 196, 123, - 245, 0, 0, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 91, 92, 99, 105, - 111, 115, 119, 122, 128, 131, 134, 136, 137, 138, - 141, 152, 155, 156, 157, 158, 168, 169, 170, 172, - 175, 176, 177, 178, 179, 182, 184, 185, 186, 187, - 188, 189, 197, 200, 206, 207, 208, 209, 210, 211, - 212, 214, 215, 216, 217, 223, 226, 232, 233, 242, - 249, 252, 174, 0, 0, 0, 0, 0, 0, 0, - 723, 118, 0, 0, 0, 0, 0, 146, 0, 0, - 0, 148, 0, 0, 221, 162, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 87, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 127, 0, 0, 0, 277, 0, 0, 0, - 0, 193, 0, 225, 130, 145, 104, 142, 90, 100, - 0, 129, 171, 201, 205, 0, 0, 0, 112, 0, - 203, 181, 241, 0, 183, 202, 149, 231, 194, 240, - 250, 251, 228, 248, 255, 218, 93, 227, 239, 109, - 213, 95, 237, 224, 160, 139, 140, 94, 0, 199, - 117, 125, 114, 173, 234, 235, 113, 258, 101, 247, - 97, 102, 246, 167, 230, 238, 161, 154, 96, 236, - 159, 153, 144, 121, 132, 191, 151, 192, 133, 164, - 163, 165, 0, 0, 0, 222, 244, 259, 106, 0, - 229, 253, 254, 0, 195, 107, 126, 120, 190, 124, - 166, 103, 135, 219, 143, 150, 198, 257, 180, 204, - 110, 243, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 89, 98, 147, 256, 196, 123, 245, 0, - 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 92, 99, 105, 111, 115, - 119, 122, 128, 131, 134, 136, 137, 138, 141, 152, - 155, 156, 157, 158, 168, 169, 170, 172, 175, 176, - 177, 178, 179, 182, 184, 185, 186, 187, 188, 189, - 197, 200, 206, 207, 208, 209, 210, 211, 212, 214, - 215, 216, 217, 223, 226, 232, 233, 242, 249, 252, - 174, 0, 0, 0, 0, 0, 0, 0, 0, 118, - 0, 0, 0, 0, 0, 146, 0, 0, 0, 148, - 0, 0, 221, 162, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 87, 88, 0, 607, 0, 0, 0, - 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 0, 0, 0, 277, 0, 0, 0, 0, 193, - 0, 225, 130, 145, 104, 142, 90, 100, 0, 129, - 171, 201, 205, 0, 0, 0, 112, 0, 203, 181, - 241, 0, 183, 202, 149, 231, 194, 240, 250, 251, - 228, 248, 255, 218, 93, 227, 239, 109, 213, 95, - 237, 224, 160, 139, 140, 94, 0, 199, 117, 125, - 114, 173, 234, 235, 113, 258, 101, 247, 97, 102, - 246, 167, 230, 238, 161, 154, 96, 236, 159, 153, - 144, 121, 132, 191, 151, 192, 133, 164, 163, 165, - 0, 0, 0, 222, 244, 259, 106, 0, 229, 253, - 254, 0, 195, 107, 126, 120, 190, 124, 166, 103, - 135, 219, 143, 150, 198, 257, 180, 204, 110, 243, - 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 98, 147, 256, 196, 123, 245, 0, 0, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 91, 92, 99, 105, 111, 115, 119, 122, - 128, 131, 134, 136, 137, 138, 141, 152, 155, 156, - 157, 158, 168, 169, 170, 172, 175, 176, 177, 178, - 179, 182, 184, 185, 186, 187, 188, 189, 197, 200, - 206, 207, 208, 209, 210, 211, 212, 214, 215, 216, - 217, 223, 226, 232, 233, 242, 249, 252, 404, 0, - 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, - 146, 0, 0, 0, 148, 0, 0, 221, 162, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86, 87, 88, - 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 127, 0, 0, 0, 277, - 0, 0, 0, 0, 193, 0, 225, 130, 145, 104, - 142, 90, 100, 0, 129, 171, 201, 205, 0, 0, - 0, 112, 0, 203, 181, 241, 0, 183, 202, 149, - 231, 194, 240, 250, 251, 228, 248, 255, 218, 93, - 227, 239, 109, 213, 95, 237, 224, 160, 139, 140, - 94, 0, 199, 117, 125, 114, 173, 234, 235, 113, - 258, 101, 247, 97, 102, 246, 167, 230, 238, 161, - 154, 96, 236, 159, 153, 144, 121, 132, 191, 151, - 192, 133, 164, 163, 165, 0, 0, 0, 222, 244, - 259, 106, 0, 229, 253, 254, 0, 195, 107, 126, - 120, 190, 124, 166, 103, 135, 219, 143, 150, 198, - 257, 180, 204, 110, 243, 220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 89, 98, 147, 256, 196, - 123, 245, 0, 0, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 92, 99, - 105, 111, 115, 119, 122, 128, 131, 134, 136, 137, - 138, 141, 152, 155, 156, 157, 158, 168, 169, 170, - 172, 175, 176, 177, 178, 179, 182, 184, 185, 186, - 187, 188, 189, 197, 200, 206, 207, 208, 209, 210, - 211, 212, 214, 215, 216, 217, 223, 226, 232, 233, - 242, 249, 252, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 118, 0, 0, 0, 0, 0, 146, 0, - 0, 0, 148, 0, 0, 221, 162, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 87, 88, 0, 0, - 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 127, 0, 272, 0, 277, 0, 0, - 0, 0, 193, 0, 225, 130, 145, 104, 142, 90, - 100, 0, 129, 171, 201, 205, 0, 0, 0, 112, - 0, 203, 181, 241, 0, 183, 202, 149, 231, 194, - 240, 250, 251, 228, 248, 255, 218, 93, 227, 239, - 109, 213, 95, 237, 224, 160, 139, 140, 94, 0, - 199, 117, 125, 114, 173, 234, 235, 113, 258, 101, - 247, 97, 102, 246, 167, 230, 238, 161, 154, 96, - 236, 159, 153, 144, 121, 132, 191, 151, 192, 133, - 164, 163, 165, 0, 0, 0, 222, 244, 259, 106, - 0, 229, 253, 254, 0, 195, 107, 126, 120, 190, - 124, 166, 103, 135, 219, 143, 150, 198, 257, 180, - 204, 110, 243, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 89, 98, 147, 256, 196, 123, 245, - 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 92, 99, 105, 111, - 115, 119, 122, 128, 131, 134, 136, 137, 138, 141, - 152, 155, 156, 157, 158, 168, 169, 170, 172, 175, - 176, 177, 178, 179, 182, 184, 185, 186, 187, 188, - 189, 197, 200, 206, 207, 208, 209, 210, 211, 212, - 214, 215, 216, 217, 223, 226, 232, 233, 242, 249, - 252, 174, 0, 0, 0, 0, 0, 0, 0, 0, - 118, 0, 0, 0, 0, 0, 146, 0, 0, 0, - 148, 0, 0, 221, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 87, 88, 0, 0, 0, 0, - 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 127, 0, 0, 0, 277, 0, 0, 0, 0, - 193, 0, 225, 130, 145, 104, 142, 90, 100, 0, - 129, 171, 201, 205, 0, 0, 0, 112, 0, 203, - 181, 241, 0, 183, 202, 149, 231, 194, 240, 250, - 251, 228, 248, 255, 218, 93, 227, 239, 109, 213, - 95, 237, 224, 160, 139, 140, 94, 0, 199, 117, - 125, 114, 173, 234, 235, 113, 258, 101, 247, 97, - 102, 246, 167, 230, 238, 161, 154, 96, 236, 159, - 153, 144, 121, 132, 191, 151, 192, 133, 164, 163, - 165, 0, 0, 0, 222, 244, 259, 106, 0, 229, - 253, 254, 0, 195, 107, 126, 120, 190, 124, 166, - 103, 135, 219, 143, 150, 198, 257, 180, 204, 110, - 243, 220, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 89, 98, 147, 256, 196, 123, 245, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 92, 99, 105, 111, 115, 119, - 122, 128, 131, 134, 136, 137, 138, 141, 152, 155, - 156, 157, 158, 168, 169, 170, 172, 175, 176, 177, - 178, 179, 182, 184, 185, 186, 187, 188, 189, 197, - 200, 206, 207, 208, 209, 210, 211, 212, 214, 215, - 216, 217, 223, 226, 232, 233, 242, 249, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 994, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 530, 518, 0, 475, 533, 448, 465, 541, 466, + 469, 506, 433, 488, 175, 463, 0, 452, 428, 459, + 429, 450, 477, 119, 481, 447, 520, 491, 532, 147, + 0, 453, 539, 149, 497, 0, 222, 163, 0, 0, + 0, 479, 522, 486, 515, 474, 507, 438, 496, 534, + 464, 504, 535, 0, 0, 938, 87, 88, 89, 0, + 1019, 1020, 0, 0, 0, 0, 0, 109, 275, 501, + 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, + 525, 456, 457, 1209, 0, 0, 0, 0, 0, 0, + 478, 487, 512, 472, 0, 0, 0, 0, 0, 0, + 0, 0, 454, 0, 495, 0, 0, 0, 435, 432, + 0, 0, 0, 0, 476, 0, 0, 0, 437, 0, + 455, 513, 0, 425, 128, 517, 524, 473, 278, 528, + 471, 470, 531, 194, 0, 226, 131, 146, 105, 143, + 91, 101, 0, 130, 172, 202, 206, 521, 451, 460, + 113, 458, 204, 182, 242, 494, 184, 203, 150, 232, + 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, + 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, + 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, + 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, + 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, + 134, 165, 164, 166, 0, 430, 0, 223, 245, 260, + 107, 446, 230, 254, 255, 0, 196, 108, 127, 121, + 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, + 181, 205, 111, 244, 221, 442, 445, 440, 441, 489, + 490, 536, 537, 538, 514, 436, 0, 443, 444, 0, + 519, 526, 527, 493, 90, 99, 148, 257, 197, 124, + 246, 426, 439, 117, 449, 0, 0, 462, 467, 468, + 480, 482, 483, 484, 485, 492, 499, 500, 502, 508, + 509, 510, 511, 516, 523, 542, 92, 93, 100, 106, + 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, + 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, + 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, + 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, + 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, + 250, 253, 530, 518, 0, 475, 533, 448, 465, 541, + 466, 469, 506, 433, 488, 175, 463, 0, 452, 428, + 459, 429, 450, 477, 119, 481, 447, 520, 491, 532, + 147, 0, 453, 539, 149, 497, 0, 222, 163, 0, + 0, 0, 479, 522, 486, 515, 474, 507, 438, 496, + 534, 464, 504, 535, 0, 0, 0, 87, 88, 89, + 0, 1019, 1020, 0, 0, 0, 0, 0, 109, 0, + 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, + 540, 525, 456, 457, 0, 0, 0, 0, 0, 0, + 0, 478, 487, 512, 472, 0, 0, 0, 0, 0, + 0, 0, 0, 454, 0, 495, 0, 0, 0, 435, + 432, 0, 0, 0, 0, 476, 0, 0, 0, 437, + 0, 455, 513, 0, 425, 128, 517, 524, 473, 278, + 528, 471, 470, 531, 194, 0, 226, 131, 146, 105, + 143, 91, 101, 0, 130, 172, 202, 206, 521, 451, + 460, 113, 458, 204, 182, 242, 494, 184, 203, 150, + 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, + 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, + 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, + 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, + 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, + 193, 134, 165, 164, 166, 0, 430, 0, 223, 245, + 260, 107, 446, 230, 254, 255, 0, 196, 108, 127, + 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, + 258, 181, 205, 111, 244, 221, 442, 445, 440, 441, + 489, 490, 536, 537, 538, 514, 436, 0, 443, 444, + 0, 519, 526, 527, 493, 90, 99, 148, 257, 197, + 124, 246, 426, 439, 117, 449, 0, 0, 462, 467, + 468, 480, 482, 483, 484, 485, 492, 499, 500, 502, + 508, 509, 510, 511, 516, 523, 542, 92, 93, 100, + 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, + 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, + 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, + 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, + 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, + 243, 250, 253, 530, 518, 0, 475, 533, 448, 465, + 541, 466, 469, 506, 433, 488, 175, 463, 0, 452, + 428, 459, 429, 450, 477, 119, 481, 447, 520, 491, + 532, 147, 0, 453, 539, 149, 497, 0, 222, 163, + 0, 0, 0, 479, 522, 486, 515, 474, 507, 438, + 496, 534, 464, 504, 535, 53, 0, 0, 87, 88, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, + 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, + 434, 540, 525, 456, 457, 0, 0, 0, 0, 0, + 0, 0, 478, 487, 512, 472, 0, 0, 0, 0, + 0, 0, 0, 0, 454, 0, 495, 0, 0, 0, + 435, 432, 0, 0, 0, 0, 476, 0, 0, 0, + 437, 0, 455, 513, 0, 425, 128, 517, 524, 473, + 278, 528, 471, 470, 531, 194, 0, 226, 131, 146, + 105, 143, 91, 101, 0, 130, 172, 202, 206, 521, + 451, 460, 113, 458, 204, 182, 242, 494, 184, 203, + 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, + 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, + 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, + 114, 259, 102, 248, 98, 103, 247, 168, 231, 239, + 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, + 152, 193, 134, 165, 164, 166, 0, 430, 0, 223, + 245, 260, 107, 446, 230, 254, 255, 0, 196, 108, + 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, + 199, 258, 181, 205, 111, 244, 221, 442, 445, 440, + 441, 489, 490, 536, 537, 538, 514, 436, 0, 443, + 444, 0, 519, 526, 527, 493, 90, 99, 148, 257, + 197, 124, 246, 426, 439, 117, 449, 0, 0, 462, + 467, 468, 480, 482, 483, 484, 485, 492, 499, 500, + 502, 508, 509, 510, 511, 516, 523, 542, 92, 93, + 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, + 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, + 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, + 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, + 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, + 234, 243, 250, 253, 530, 518, 0, 475, 533, 448, + 465, 541, 466, 469, 506, 433, 488, 175, 463, 0, + 452, 428, 459, 429, 450, 477, 119, 481, 447, 520, + 491, 532, 147, 0, 453, 539, 149, 497, 0, 222, + 163, 0, 0, 0, 479, 522, 486, 515, 474, 507, + 438, 496, 534, 464, 504, 535, 0, 0, 0, 87, + 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, + 431, 434, 540, 525, 456, 457, 0, 0, 0, 0, + 0, 0, 0, 478, 487, 512, 472, 0, 0, 0, + 0, 0, 0, 1313, 0, 454, 0, 495, 0, 0, + 0, 435, 432, 0, 0, 0, 0, 476, 0, 0, + 0, 437, 0, 455, 513, 0, 425, 128, 517, 524, + 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, + 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, + 521, 451, 460, 113, 458, 204, 182, 242, 494, 184, + 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, + 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, + 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, + 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, + 192, 152, 193, 134, 165, 164, 166, 0, 430, 0, + 223, 245, 260, 107, 446, 230, 254, 255, 0, 196, + 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 151, 199, 258, 181, 205, 111, 244, 221, 442, 445, + 440, 441, 489, 490, 536, 537, 538, 514, 436, 0, + 443, 444, 0, 519, 526, 527, 493, 90, 99, 148, + 257, 197, 124, 246, 426, 439, 117, 449, 0, 0, + 462, 467, 468, 480, 482, 483, 484, 485, 492, 499, + 500, 502, 508, 509, 510, 511, 516, 523, 542, 92, + 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, + 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, + 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, + 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, + 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, + 233, 234, 243, 250, 253, 530, 518, 0, 475, 533, + 448, 465, 541, 466, 469, 506, 433, 488, 175, 463, + 0, 452, 428, 459, 429, 450, 477, 119, 481, 447, + 520, 491, 532, 147, 0, 453, 539, 149, 497, 0, + 222, 163, 0, 0, 0, 479, 522, 486, 515, 474, + 507, 438, 496, 534, 464, 504, 535, 0, 0, 0, + 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, + 0, 109, 0, 501, 529, 461, 503, 505, 427, 498, + 0, 431, 434, 540, 525, 456, 457, 0, 0, 0, + 0, 0, 0, 0, 478, 487, 512, 472, 0, 0, + 0, 0, 0, 0, 1003, 0, 454, 0, 495, 0, + 0, 0, 435, 432, 0, 0, 0, 0, 476, 0, + 0, 0, 437, 0, 455, 513, 0, 425, 128, 517, + 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, + 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, + 206, 521, 451, 460, 113, 458, 204, 182, 242, 494, + 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, + 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, + 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, + 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, + 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, + 133, 192, 152, 193, 134, 165, 164, 166, 0, 430, + 0, 223, 245, 260, 107, 446, 230, 254, 255, 0, + 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, + 144, 151, 199, 258, 181, 205, 111, 244, 221, 442, + 445, 440, 441, 489, 490, 536, 537, 538, 514, 436, + 0, 443, 444, 0, 519, 526, 527, 493, 90, 99, + 148, 257, 197, 124, 246, 426, 439, 117, 449, 0, + 0, 462, 467, 468, 480, 482, 483, 484, 485, 492, + 499, 500, 502, 508, 509, 510, 511, 516, 523, 542, + 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, + 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, + 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, + 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, + 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, + 227, 233, 234, 243, 250, 253, 530, 518, 0, 475, + 533, 448, 465, 541, 466, 469, 506, 433, 488, 175, + 463, 0, 452, 428, 459, 429, 450, 477, 119, 481, + 447, 520, 491, 532, 147, 0, 453, 539, 149, 497, + 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, + 474, 507, 438, 496, 534, 464, 504, 535, 0, 0, + 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, + 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, + 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, + 0, 0, 0, 0, 0, 969, 0, 454, 0, 495, + 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, + 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, + 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, + 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, + 202, 206, 521, 451, 460, 113, 458, 204, 182, 242, + 494, 184, 203, 150, 232, 195, 241, 251, 252, 229, + 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, + 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, + 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, + 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, + 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, + 430, 0, 223, 245, 260, 107, 446, 230, 254, 255, + 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, + 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, + 442, 445, 440, 441, 489, 490, 536, 537, 538, 514, + 436, 0, 443, 444, 0, 519, 526, 527, 493, 90, + 99, 148, 257, 197, 124, 246, 426, 439, 117, 449, + 0, 0, 462, 467, 468, 480, 482, 483, 484, 485, + 492, 499, 500, 502, 508, 509, 510, 511, 516, 523, + 542, 92, 93, 100, 106, 112, 116, 120, 123, 129, + 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, + 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, + 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, + 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, + 224, 227, 233, 234, 243, 250, 253, 530, 518, 0, + 475, 533, 448, 465, 541, 466, 469, 506, 433, 488, + 175, 463, 0, 452, 428, 459, 429, 450, 477, 119, + 481, 447, 520, 491, 532, 147, 0, 453, 539, 149, + 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, + 515, 474, 507, 438, 496, 534, 464, 504, 535, 0, + 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, + 0, 0, 0, 109, 0, 501, 529, 461, 503, 505, + 427, 498, 0, 431, 434, 540, 525, 456, 457, 0, + 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, + 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, + 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, + 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, + 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, + 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, + 172, 202, 206, 521, 451, 460, 113, 458, 204, 182, + 242, 494, 184, 203, 150, 232, 195, 241, 251, 252, + 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, + 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, + 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, + 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, + 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, + 0, 430, 0, 223, 245, 260, 107, 446, 230, 254, + 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, + 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, + 221, 442, 445, 440, 441, 489, 490, 536, 537, 538, + 514, 436, 0, 443, 444, 0, 519, 526, 527, 493, + 90, 99, 148, 257, 197, 124, 246, 426, 439, 117, + 449, 0, 0, 462, 467, 468, 480, 482, 483, 484, + 485, 492, 499, 500, 502, 508, 509, 510, 511, 516, + 523, 542, 92, 93, 100, 106, 112, 116, 120, 123, + 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, + 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, + 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, + 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, + 218, 224, 227, 233, 234, 243, 250, 253, 530, 518, + 0, 475, 533, 448, 465, 541, 466, 469, 506, 433, + 488, 175, 463, 0, 452, 428, 459, 429, 450, 477, + 119, 481, 447, 520, 491, 532, 147, 0, 453, 539, + 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, + 486, 515, 474, 507, 438, 496, 534, 464, 504, 535, + 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, + 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, + 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, + 472, 0, 0, 0, 0, 0, 0, 0, 0, 454, + 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, + 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, + 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 521, 451, 460, 113, 458, 204, + 182, 242, 494, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 423, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 430, 0, 223, 245, 260, 107, 446, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 424, + 422, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 442, 445, 440, 441, 489, 490, 536, 537, + 538, 514, 436, 0, 443, 444, 0, 519, 526, 527, + 493, 90, 99, 148, 257, 197, 124, 246, 426, 439, + 117, 449, 0, 0, 462, 467, 468, 480, 482, 483, + 484, 485, 492, 499, 500, 502, 508, 509, 510, 511, + 516, 523, 542, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 530, + 518, 0, 475, 533, 448, 465, 541, 466, 469, 506, + 433, 488, 175, 463, 0, 452, 428, 459, 429, 450, + 477, 119, 481, 447, 520, 491, 532, 147, 0, 453, + 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, + 522, 486, 515, 474, 507, 438, 496, 534, 464, 504, + 535, 0, 0, 0, 87, 88, 89, 0, 0, 0, + 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, + 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, + 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, + 512, 472, 0, 0, 0, 0, 0, 0, 0, 0, + 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, + 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, + 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, + 531, 194, 0, 226, 131, 146, 105, 143, 91, 101, + 0, 130, 172, 202, 206, 521, 451, 460, 113, 458, + 204, 182, 242, 494, 184, 203, 150, 232, 195, 241, + 251, 252, 229, 249, 256, 219, 94, 228, 750, 110, + 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, + 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, + 98, 423, 247, 168, 231, 239, 162, 155, 97, 237, + 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, + 164, 166, 0, 430, 0, 223, 245, 260, 107, 446, + 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, + 424, 422, 136, 220, 144, 151, 199, 258, 181, 205, + 111, 244, 221, 442, 445, 440, 441, 489, 490, 536, + 537, 538, 514, 436, 0, 443, 444, 0, 519, 526, + 527, 493, 90, 99, 148, 257, 197, 124, 246, 426, + 439, 117, 449, 0, 0, 462, 467, 468, 480, 482, + 483, 484, 485, 492, 499, 500, 502, 508, 509, 510, + 511, 516, 523, 542, 92, 93, 100, 106, 112, 116, + 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, + 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, + 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, + 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, + 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, + 530, 518, 0, 475, 533, 448, 465, 541, 466, 469, + 506, 433, 488, 175, 463, 0, 452, 428, 459, 429, + 450, 477, 119, 481, 447, 520, 491, 532, 147, 0, + 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, + 479, 522, 486, 515, 474, 507, 438, 496, 534, 464, + 504, 535, 0, 0, 0, 87, 88, 89, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, + 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, + 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, + 487, 512, 472, 0, 0, 0, 0, 0, 0, 0, + 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, + 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, + 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, + 470, 531, 194, 0, 226, 131, 146, 105, 143, 91, + 101, 0, 130, 172, 202, 206, 521, 451, 460, 113, + 458, 204, 182, 242, 494, 184, 203, 150, 232, 195, + 241, 251, 252, 229, 249, 256, 219, 94, 228, 414, + 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, + 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, + 248, 98, 423, 247, 168, 231, 239, 162, 155, 97, + 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, + 165, 164, 166, 0, 430, 0, 223, 245, 260, 107, + 446, 230, 254, 255, 0, 196, 108, 127, 121, 191, + 125, 424, 422, 417, 416, 144, 151, 199, 258, 181, + 205, 111, 244, 221, 442, 445, 440, 441, 489, 490, + 536, 537, 538, 514, 436, 0, 443, 444, 0, 519, + 526, 527, 493, 90, 99, 148, 257, 197, 124, 246, + 426, 439, 117, 449, 0, 0, 462, 467, 468, 480, + 482, 483, 484, 485, 492, 499, 500, 502, 508, 509, + 510, 511, 516, 523, 542, 92, 93, 100, 106, 112, + 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, + 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, + 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, + 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, + 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, + 253, 175, 0, 0, 909, 0, 318, 0, 0, 0, + 119, 0, 317, 0, 0, 0, 147, 0, 910, 361, + 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, + 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, + 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 330, 401, 0, 0, + 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, + 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, + 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, + 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, + 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, + 0, 0, 0, 0, 318, 0, 0, 0, 119, 0, + 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, + 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, + 0, 0, 0, 0, 0, 0, 1010, 0, 53, 0, + 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, + 0, 0, 109, 340, 345, 346, 347, 1011, 0, 0, + 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, + 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, + 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, + 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, + 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, + 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, + 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, + 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, + 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, + 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, + 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, + 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, + 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, + 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, + 362, 373, 368, 369, 366, 367, 365, 364, 363, 376, + 354, 355, 356, 357, 359, 0, 370, 371, 358, 90, + 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, + 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, + 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, + 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, + 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, + 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, + 0, 0, 318, 0, 0, 0, 119, 0, 317, 0, + 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, + 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, + 0, 0, 0, 0, 0, 0, 53, 0, 389, 87, + 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, + 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, + 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, + 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, + 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, + 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, + 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, + 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, + 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, + 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, + 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, + 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, + 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, + 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 151, 199, 258, 181, 205, 111, 244, 221, 362, 373, + 368, 369, 366, 367, 365, 364, 363, 376, 354, 355, + 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, + 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, + 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, + 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, + 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, + 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, + 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, + 318, 0, 0, 0, 119, 0, 317, 0, 0, 0, + 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, + 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, + 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, + 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, + 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, + 330, 401, 0, 0, 0, 375, 0, 331, 0, 0, + 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, + 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, + 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, + 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, + 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, + 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, + 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, + 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, + 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, + 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, + 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, + 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, + 258, 181, 205, 111, 244, 221, 362, 373, 368, 369, + 366, 367, 365, 364, 363, 376, 354, 355, 356, 357, + 359, 0, 370, 371, 358, 90, 99, 148, 257, 197, + 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, + 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, + 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, + 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, + 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, + 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, + 243, 250, 253, 175, 0, 0, 0, 0, 318, 0, + 0, 0, 119, 0, 317, 0, 0, 0, 147, 0, + 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, + 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, + 0, 0, 53, 0, 0, 87, 88, 89, 339, 927, + 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, + 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 329, 330, 401, + 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, + 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, + 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, + 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, + 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, + 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, + 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, + 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, + 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, + 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, + 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, + 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, + 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, + 205, 111, 244, 221, 362, 373, 368, 369, 366, 367, + 365, 364, 363, 376, 354, 355, 356, 357, 359, 0, + 370, 371, 358, 90, 99, 148, 257, 197, 124, 246, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, + 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, + 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, + 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, + 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, + 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, + 253, 175, 0, 0, 0, 0, 318, 0, 0, 0, + 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, + 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 87, 88, 89, 339, 924, 341, 342, + 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, + 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 330, 401, 0, 0, + 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, + 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, + 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, + 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, + 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 382, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 175, 0, 0, 0, 0, 318, 0, 0, 0, + 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, + 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, + 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, + 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, + 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, + 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, + 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, + 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, + 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, + 0, 0, 0, 0, 318, 0, 0, 0, 119, 0, + 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, + 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, + 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, + 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, + 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, + 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, + 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, + 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, + 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, + 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, + 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, + 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, + 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, + 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, + 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, + 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, + 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, + 362, 373, 368, 369, 366, 367, 365, 364, 363, 376, + 354, 355, 356, 357, 359, 0, 370, 371, 358, 90, + 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, + 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, + 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, + 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, + 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, + 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, + 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, + 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, + 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, + 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, + 109, 340, 345, 346, 347, 0, 0, 0, 0, 332, + 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, + 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, + 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, + 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, + 0, 0, 0, 113, 0, 204, 182, 242, 1574, 184, + 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, + 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, + 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, + 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, + 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, + 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, + 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 151, 199, 258, 181, 205, 111, 244, 221, 362, 373, + 368, 369, 366, 367, 365, 364, 363, 376, 354, 355, + 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, + 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, + 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, + 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, + 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, + 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, + 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, + 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, + 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, + 0, 0, 0, 0, 53, 0, 389, 87, 88, 89, + 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, + 345, 346, 347, 0, 0, 0, 0, 332, 0, 360, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, + 330, 0, 0, 0, 0, 375, 0, 331, 0, 0, + 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, + 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, + 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, + 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, + 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, + 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, + 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, + 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, + 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, + 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, + 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, + 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, + 258, 181, 205, 111, 244, 221, 362, 373, 368, 369, + 366, 367, 365, 364, 363, 376, 354, 355, 356, 357, + 359, 0, 370, 371, 358, 90, 99, 148, 257, 197, + 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, + 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, + 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, + 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, + 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, + 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, + 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, + 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, + 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, + 0, 0, 53, 0, 0, 87, 88, 89, 339, 338, + 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, + 347, 0, 0, 0, 0, 332, 0, 360, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 329, 330, 0, + 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, + 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, + 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, + 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, + 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, + 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, + 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, + 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, + 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, + 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, + 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, + 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, + 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, + 205, 111, 244, 221, 362, 373, 368, 369, 366, 367, + 365, 364, 363, 376, 354, 355, 356, 357, 359, 0, + 370, 371, 358, 90, 99, 148, 257, 197, 124, 246, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, + 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, + 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, + 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, + 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, + 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, + 253, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, + 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 630, 629, 639, 640, 632, 633, 634, 635, 636, + 637, 638, 631, 0, 0, 641, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, + 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, + 0, 0, 0, 725, 0, 0, 0, 0, 119, 0, + 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, + 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 87, 88, 89, 0, 727, 0, 0, 0, 0, + 0, 0, 109, 0, 0, 0, 0, 0, 620, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 621, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 278, 0, 0, 0, 0, 194, 0, + 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, + 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, + 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, + 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, + 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, + 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, + 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, + 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, + 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, + 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, + 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, + 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, + 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, + 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, + 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, + 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, + 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, + 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, + 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 0, 0, 0, 0, 0, 79, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 81, 82, + 0, 78, 0, 0, 0, 83, 194, 0, 226, 131, + 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, + 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, + 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, + 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, + 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, + 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, + 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, + 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, + 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 151, 199, 258, 181, 205, 111, 244, 221, 0, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 99, 148, + 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, + 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, + 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, + 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, + 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, + 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 88, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 306, 0, 128, 0, 0, 0, 278, + 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, + 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, + 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, + 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, + 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, + 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, + 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, + 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, + 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, + 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, + 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, + 258, 181, 205, 111, 244, 221, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 99, 148, 257, 197, + 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, + 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, + 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, + 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, + 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, + 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, + 243, 250, 253, 305, 175, 0, 0, 0, 993, 0, + 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, + 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, + 995, 0, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, + 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, + 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, + 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, + 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, + 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, + 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, + 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, + 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, + 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, + 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, + 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, + 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, + 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, + 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, + 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, + 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, + 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, + 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, + 250, 253, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, + 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 87, 88, 89, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, + 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, + 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, + 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, + 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, + 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, + 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, + 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, + 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, + 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, + 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, + 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, + 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, + 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, + 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, + 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, + 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, + 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, + 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, + 250, 253, 175, 0, 0, 0, 993, 0, 0, 0, + 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 88, 89, 0, 995, 0, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, + 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, + 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, + 204, 182, 242, 0, 991, 203, 150, 232, 195, 241, + 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, + 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, + 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, + 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, + 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, + 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, + 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, + 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, + 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, + 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, + 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, + 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, + 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, + 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, + 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, + 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 53, 0, 0, 87, 88, 89, 0, 0, 0, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, + 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, + 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, + 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, + 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, + 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, + 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, + 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, + 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, + 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, + 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, + 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, + 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, + 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, + 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, + 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, + 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, + 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, + 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, + 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 88, 89, 0, 0, 961, 0, 0, + 962, 0, 0, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, + 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, + 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, + 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, + 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, + 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, + 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, + 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, + 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, + 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, + 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, + 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, + 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, + 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, + 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, + 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, + 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, + 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 760, + 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, + 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 88, 89, 0, 759, 0, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, + 0, 0, 278, 0, 0, 0, 0, 194, 0, 226, + 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, + 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, + 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, + 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, + 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, + 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, + 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, + 133, 192, 152, 193, 134, 165, 164, 166, 0, 0, + 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, + 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, + 144, 151, 199, 258, 181, 205, 111, 244, 221, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, + 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, + 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, + 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, + 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, + 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, + 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 389, 87, 88, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, + 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, + 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, + 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, + 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, + 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, + 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, + 114, 259, 102, 248, 98, 103, 247, 168, 231, 239, + 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, + 152, 193, 134, 165, 164, 166, 0, 0, 0, 223, + 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, + 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, + 199, 258, 181, 205, 111, 244, 221, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 90, 99, 148, 257, + 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, + 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, + 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, + 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, + 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, + 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, + 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, + 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 87, 88, 89, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, + 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, + 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, + 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, + 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, + 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, + 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, + 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, + 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, + 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, + 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, + 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, + 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, + 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, + 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, + 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, + 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, + 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, + 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, + 250, 253, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 88, 89, 0, 995, 0, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, + 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, + 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, + 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, + 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, + 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, + 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, + 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, + 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, + 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, + 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, + 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, + 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, + 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, + 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, + 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, + 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, + 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, + 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, + 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 88, 89, 0, 727, 0, 0, 0, + 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, + 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, + 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, + 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, + 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, + 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, + 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, + 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, + 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, + 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, + 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, + 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, + 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, + 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, + 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, + 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, + 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, + 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, + 0, 0, 0, 0, 0, 0, 730, 119, 0, 0, + 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, + 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, + 0, 0, 278, 0, 0, 0, 0, 194, 0, 226, + 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, + 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, + 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, + 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, + 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, + 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, + 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, + 133, 192, 152, 193, 134, 165, 164, 166, 0, 0, + 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, + 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, + 144, 151, 199, 258, 181, 205, 111, 244, 221, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, + 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, + 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, + 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, + 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, + 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, + 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, + 89, 0, 609, 0, 0, 0, 0, 0, 0, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, + 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, + 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, + 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, + 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, + 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, + 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, + 114, 259, 102, 248, 98, 103, 247, 168, 231, 239, + 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, + 152, 193, 134, 165, 164, 166, 0, 0, 0, 223, + 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, + 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, + 199, 258, 181, 205, 111, 244, 221, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 90, 99, 148, 257, + 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, + 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, + 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, + 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, + 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, + 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, + 234, 243, 250, 253, 406, 0, 0, 0, 0, 0, + 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, + 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, + 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, + 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, + 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, + 0, 273, 0, 278, 0, 0, 0, 0, 194, 0, + 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, + 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, + 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, + 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, + 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, + 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, + 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, + 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, + 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, + 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, + 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, + 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, + 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, + 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, + 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, + 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, + 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, + 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, + 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 278, 0, 0, 0, 0, 194, 0, 226, 131, + 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, + 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, + 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, + 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, + 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, + 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, + 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, + 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, + 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 151, 199, 258, 181, 205, 111, 244, 221, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 99, 148, + 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, + 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, + 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, + 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, + 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, + 233, 234, 243, 250, 253, } var yyPact = [...]int{ - 1692, -1000, -273, 982, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 771, -1000, -1000, -1000, - -1000, -1000, -1000, 265, 11733, 24, 116, -7, 16835, 115, - 148, 17173, -1000, 12, -1000, -1000, 12071, -1000, -1000, -74, - -78, -1000, 9705, 942, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 788, 926, 645, 909, -1000, 8341, 77, 77, - 16497, 6989, -1000, -1000, 354, 17173, 110, 17173, -142, 72, - 72, 72, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1877, -1000, -271, 947, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 884, 703, -1000, -1000, -1000, + -1000, -1000, -1000, 276, 12039, 27, 129, 57, 17141, 128, + 153, 17479, -1000, 10, -1000, -1000, 12377, -1000, -1000, -87, + -105, -1000, 10011, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 700, 852, 862, 879, 530, 918, -1000, 8647, 99, + 99, 16803, 7295, -1000, -1000, 403, 17479, 118, 17479, -149, + 94, 94, 94, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2677,24 +2707,24 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 101, 17173, 639, 639, 335, -1000, 17173, 69, 639, 69, - 69, 69, 17173, -1000, 163, -1000, -1000, -1000, 17173, 639, - 871, 279, 59, 4532, -1000, 184, -1000, 4532, 25, 4532, - -53, 951, 19, -25, -1000, 4532, -1000, -1000, -1000, -1000, - -1000, -1000, 16152, 100, 272, -1000, -1000, -1000, -1000, -1000, - -1000, 517, 468, -1000, 9705, 1502, 629, 629, -1000, -1000, - 137, -1000, -1000, 10719, 10719, 10719, 10719, 10719, 10719, 10719, - 10719, 10719, 10719, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 629, 162, -1000, - 9367, 629, 629, 629, 629, 629, 629, 629, 629, 9705, - 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, - 629, 629, 629, 629, 629, 629, -1000, -1000, 921, 932, - 942, -1000, 771, -1000, -1000, -1000, 942, -1000, 851, 8341, - -1000, -1000, 840, -1000, -1000, -1000, -1000, 321, 964, -1000, - 11395, 158, 15814, 14800, 17173, 792, 750, -1000, -1000, 157, - 710, 6638, -72, -1000, -1000, -1000, 268, 14124, -1000, -1000, - -1000, 869, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 120, 17479, 486, 486, 202, -1000, 17479, 91, 486, + 91, 91, 91, 17479, -1000, 176, -1000, -1000, -1000, 17479, + 486, 794, 309, 63, 4838, -1000, 199, -1000, 4838, 34, + 4838, -34, 899, 22, -17, -1000, 4838, -1000, -1000, -1000, + -1000, -1000, -1000, 16458, 126, 254, -1000, -1000, -1000, -1000, + -1000, -1000, 552, 442, -1000, 10011, 1736, 653, 653, -1000, + -1000, 141, -1000, -1000, 11025, 11025, 11025, 11025, 11025, 11025, + 11025, 11025, 11025, 11025, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 653, 174, + -1000, 9673, 653, 653, 653, 653, 653, 653, 653, 653, + 10011, 653, 653, 653, 653, 653, 653, 653, 653, 653, + 653, 653, 653, 653, 653, 653, 653, -1000, -1000, 884, + -1000, 703, -1000, -1000, -1000, 792, 10011, 10011, 884, -1000, + 769, 8647, -1000, -1000, 854, -1000, -1000, -1000, -1000, 355, + 930, -1000, 11701, 168, 16120, 15106, 17479, 661, 638, -1000, + -1000, 163, 650, 6944, -102, -1000, -1000, -1000, 251, 14430, + -1000, -1000, -1000, 784, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2705,206 +2735,208 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 700, 17173, -1000, 2564, -1000, 639, 4532, 95, 639, - 292, 639, 17173, 17173, 4532, 4532, 4532, 29, 60, 57, - 17173, 708, 86, 17173, 912, 801, 17173, 639, 639, -1000, - 5936, -1000, 4532, 279, -1000, 431, 9705, 4532, 4532, 4532, - 17173, 4532, 4532, -1000, -1000, -1000, 300, -1000, -1000, -1000, - -1000, 4532, 4532, -1000, 963, 299, -1000, -1000, -1000, -1000, - 9705, 212, -1000, 800, -1000, -1000, -1000, -1000, -1000, 982, - -1000, -1000, -1000, -123, -1000, -1000, 9705, 9705, 9705, 544, - 220, 10719, 367, 303, 10719, 10719, 10719, 10719, 10719, 10719, - 10719, 10719, 10719, 10719, 10719, 10719, 10719, 10719, 10719, 621, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 639, -1000, - 980, 768, 768, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 11057, 7327, 5936, 439, 694, 8341, 8341, 9705, - 9705, 9017, 8679, 8341, 872, 278, 468, 17173, -1000, -1000, - 10381, -1000, -1000, -1000, -1000, -1000, 439, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 17173, 17173, 8341, 8341, 8341, 8341, - 8341, 878, 9705, 9705, 921, 645, 840, 921, 13786, 760, - -1000, 840, -1000, -1000, -1000, 17173, -1000, -1000, 15476, -1000, - -1000, 5585, 40, 17173, -1000, 733, 1077, -1000, -1000, -1000, - 914, 13448, 13098, 40, 502, 14800, 17173, -1000, -1000, 14800, - 17173, 5234, 6287, -72, -1000, 590, -1000, -115, -98, 7665, - 173, -1000, -1000, -1000, -1000, 4181, 360, 490, 353, -51, - -1000, -1000, -1000, 716, -1000, 716, 716, 716, 716, -14, - -14, -14, -14, -1000, -1000, -1000, -1000, -1000, 757, 747, - -1000, 716, 716, 716, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 729, 729, 729, 723, 723, 761, -1000, 17173, - 4532, 911, 4532, -1000, 89, -1000, -1000, -1000, 17173, 17173, - 17173, 17173, 17173, 124, 17173, 17173, 702, -1000, 17173, 4532, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 468, -1000, - -1000, -1000, -1000, -1000, -1000, 17173, -1000, -1000, -1000, -1000, - 17173, 279, 17173, 17173, 468, -1000, 429, 17173, -1000, -1000, - -1000, -1000, 468, 220, 257, -1000, -1000, 435, -1000, -1000, - 1607, -1000, -1000, -1000, -1000, 367, 10719, 10719, 10719, 370, - 1607, 2021, 568, 1170, 175, 530, 530, 189, 189, 189, - 189, 189, 482, 482, -1000, -1000, -1000, 439, -1000, -1000, - -1000, 439, 8341, 8341, 673, 629, 156, -1000, -1000, -1000, - 680, 680, 518, 408, 248, 962, 680, 236, 961, 680, - 680, 8341, -1000, -1000, 295, -1000, 9705, 439, -1000, 153, - -1000, 430, 657, 633, 680, 439, 439, 680, 680, -1000, - 973, 207, 640, 597, -1000, 386, 878, -1000, 878, 943, - -1000, 856, 855, 949, 8341, 14800, 840, -1000, -1000, -1000, - 152, 719, 629, -1000, 17173, 14800, 14800, 14800, 14800, 14800, - -1000, 834, 833, -1000, 815, 812, 825, 17173, -1000, 689, - 179, 629, -1000, 15138, -1000, -1000, 949, 14800, 553, -1000, - 553, -1000, 147, -1000, -1000, 590, -72, -101, -1000, -1000, - -1000, -1000, 468, -1000, 628, 588, 3830, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 726, 639, -1000, 904, 211, 277, - 639, 901, -1000, -1000, -1000, 874, -1000, 306, -54, -1000, - -1000, 383, -14, -14, -1000, -1000, 173, 868, 173, 173, - 173, 426, 426, -1000, -1000, -1000, -1000, 374, -1000, -1000, - -1000, 372, -1000, 797, 17173, 4532, -1000, -1000, -1000, -1000, - 194, 194, 216, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 39, 641, -1000, -1000, -1000, -1000, - 6, 26, 85, -1000, 4532, -1000, 299, 299, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 370, 1607, 414, - -1000, 10719, 10719, -1000, -1000, 680, 680, 8341, 5936, -1000, - -1000, 239, 621, 239, 10719, 10719, -1000, 10719, 10719, -1000, - -165, 512, 234, -1000, 9705, 567, -1000, 5936, -1000, 10719, - 10719, -1000, -1000, -1000, -1000, -1000, -1000, 841, 9705, 9705, - 9705, -1000, -1000, -1000, -1000, -1000, 17173, -1000, -1000, -1000, - -1000, 947, 9705, -1000, 575, -1000, 4883, 794, 17173, 629, - 982, 12760, 17173, 650, -1000, 266, 1077, 740, 789, 1136, - -1000, -1000, -1000, -1000, 829, -1000, 824, -1000, -1000, -1000, - -1000, -1000, 109, 106, 98, 17173, -1000, 942, 553, -1000, - -1000, 185, -1000, -1000, -125, -92, -1000, -1000, -1000, 4181, - -1000, 4181, 17173, 56, -1000, 639, 639, -1000, -1000, -1000, - 724, 787, 10719, -1000, -1000, -1000, 481, 173, 173, -1000, - 233, -1000, -1000, -1000, 669, -1000, 664, 539, 662, 17173, + -1000, -1000, -1000, 619, 17479, -1000, 1491, -1000, 486, 4838, + 112, 486, 340, 486, 17479, 17479, 4838, 4838, 4838, 40, + 64, 60, 17479, 649, 109, 17479, 845, 715, 17479, 486, + 486, -1000, 6242, -1000, 4838, 309, -1000, 464, 10011, 4838, + 4838, 4838, 17479, 4838, 4838, -1000, -1000, -1000, 320, -1000, + -1000, -1000, -1000, 4838, 4838, -1000, 914, 314, -1000, -1000, + -1000, -1000, 10011, 213, -1000, 714, -1000, -1000, -1000, -1000, + -1000, 947, -1000, -1000, -1000, -120, -1000, -1000, 10011, 10011, + 10011, 348, 217, 11025, 475, 298, 11025, 11025, 11025, 11025, + 11025, 11025, 11025, 11025, 11025, 11025, 11025, 11025, 11025, 11025, + 11025, 526, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 486, -1000, 943, 603, 603, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 11363, 7633, 6242, 530, 604, 884, + 8647, 8647, 10011, 10011, 9323, 8985, 8647, 834, 300, 442, + 17479, -1000, -1000, 10687, -1000, -1000, -1000, -1000, -1000, 483, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17479, 17479, 8647, + 8647, 8647, 8647, 8647, 862, 530, 854, -1000, 937, 209, + 358, 645, -1000, 409, 862, 14092, 678, -1000, 854, -1000, + -1000, -1000, 17479, -1000, -1000, 15782, -1000, -1000, 5891, 52, + 17479, -1000, 571, 922, -1000, -1000, -1000, 849, 13754, 13404, + 52, 630, 15106, 17479, -1000, -1000, 15106, 17479, 5540, 6593, + -102, -1000, 637, -1000, -113, -130, 7971, 189, -1000, -1000, + -1000, -1000, 4487, 387, 513, 339, -70, -1000, -1000, -1000, + 657, -1000, 657, 657, 657, 657, -32, -32, -32, -32, + -1000, -1000, -1000, -1000, -1000, 685, 680, -1000, 657, 657, + 657, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 675, + 675, 675, 663, 663, 689, -1000, 17479, 4838, 839, 4838, + -1000, 93, -1000, -1000, -1000, 17479, 17479, 17479, 17479, 17479, + 145, 17479, 17479, 644, -1000, 17479, 4838, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 442, -1000, -1000, -1000, -1000, + -1000, -1000, 17479, -1000, -1000, -1000, -1000, 17479, 309, 17479, + 17479, 442, -1000, 463, 17479, -1000, -1000, -1000, -1000, 442, + 217, 267, -1000, -1000, 466, -1000, -1000, 2249, -1000, -1000, + -1000, -1000, 475, 11025, 11025, 11025, 376, 2249, 2203, 1173, + 828, 191, 334, 334, 190, 190, 190, 190, 190, 510, + 510, -1000, -1000, -1000, 483, -1000, -1000, -1000, 483, 8647, + 8647, 643, 653, 160, -1000, 700, -1000, -1000, 862, 596, + 596, 436, 444, 281, 913, 596, 245, 910, 596, 596, + 8647, -1000, -1000, 325, -1000, 10011, 483, -1000, 159, -1000, + 1687, 642, 639, 596, 483, 483, 596, 596, 792, -1000, + -1000, 759, 10011, 10011, 10011, -1000, -1000, -1000, 792, 873, + -1000, 774, 773, 898, 8647, 15106, 854, -1000, -1000, -1000, + 157, 628, 653, -1000, 17479, 15106, 15106, 15106, 15106, 15106, + -1000, 749, 746, -1000, 727, 726, 733, 17479, -1000, 602, + 181, 653, -1000, 15444, -1000, -1000, 898, 15106, 562, -1000, + 562, -1000, 154, -1000, -1000, 637, -102, -115, -1000, -1000, + -1000, -1000, 442, -1000, 538, 634, 4136, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 665, 486, -1000, 835, 215, 258, + 486, 831, -1000, -1000, -1000, 802, -1000, 351, -72, -1000, + -1000, 437, -32, -32, -1000, -1000, 189, 782, 189, 189, + 189, 461, 461, -1000, -1000, -1000, -1000, 428, -1000, -1000, + -1000, 407, -1000, 713, 17479, 4838, -1000, -1000, -1000, -1000, + 369, 369, 224, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 51, 674, -1000, -1000, -1000, -1000, + 2, 38, 108, -1000, 4838, -1000, 314, 314, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 376, 2249, 2141, + -1000, 11025, 11025, -1000, -1000, 596, 596, 8647, 6242, 884, + 792, -1000, -1000, 106, 526, 106, 11025, 11025, -1000, 11025, + 11025, -1000, -162, 669, 277, -1000, 10011, 291, -1000, 6242, + -1000, 11025, 11025, -1000, -1000, -1000, -1000, -1000, -1000, 757, + 442, 442, -1000, -1000, 17479, -1000, -1000, -1000, -1000, 893, + 10011, -1000, 633, -1000, 5189, 711, 17479, 653, 947, 13066, + 17479, 594, -1000, 247, 922, 673, 710, 737, -1000, -1000, + -1000, -1000, 745, -1000, 729, -1000, -1000, -1000, -1000, -1000, + 117, 116, 114, 17479, -1000, 884, 562, -1000, -1000, 184, + -1000, -1000, -122, -136, -1000, -1000, -1000, 4487, -1000, 4487, + 17479, 75, -1000, 486, 486, -1000, -1000, -1000, 664, 706, + 11025, -1000, -1000, -1000, 503, 189, 189, -1000, 287, -1000, + -1000, -1000, 589, -1000, 585, 632, 580, 17479, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17173, - -1000, -1000, -1000, -1000, -1000, 17173, -171, 639, 17173, 17173, - 17173, 17173, -1000, 279, 279, -1000, 10719, 1607, 1607, -1000, - -1000, 439, -1000, 439, 716, 716, -1000, 716, 723, -1000, - 716, 3, 716, 2, 439, 439, 1989, 1891, 1629, 894, - 629, -159, -1000, 468, 9705, -1000, 819, 501, 847, 468, - 468, -1000, -1000, 945, 925, 468, -1000, -1000, 879, 486, - 514, -1000, -1000, 8003, 655, 146, 653, -1000, 942, 17173, - 9705, -1000, -1000, 9705, 722, -1000, 9705, -1000, -1000, -1000, - 629, 629, 629, 653, 921, -1000, -1000, -1000, -1000, 3830, - -1000, 648, -1000, 716, -1000, -1000, -1000, 17173, -45, 971, - 1607, -1000, -1000, -1000, -1000, -1000, -14, 403, -14, 363, - -1000, 352, 4532, -1000, -1000, -1000, -1000, 907, -1000, 5936, - -1000, -1000, 715, 734, -1000, -1000, -1000, -1000, 1607, -1000, - -1000, -1000, 120, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 10719, 10719, 10719, 10719, 10719, 921, 401, 468, 10719, - 10719, -1000, -1000, 9705, 9705, 884, -1000, 629, -1000, 748, - 17173, 17173, -1000, 17173, 921, -1000, 468, 468, 17173, 468, - 14462, 17173, 17173, 12410, -1000, 159, 17173, -1000, 644, -1000, - 192, -1000, -90, 173, -1000, 173, 465, 442, -1000, 629, - 519, -1000, 229, 17173, 17173, -1000, -1000, 430, 430, 430, - 430, 31, 439, -1000, 430, 430, 468, 517, 970, -1000, - 629, 982, 134, -1000, -1000, -1000, 635, 606, -1000, 606, - 606, 179, 159, -1000, 639, 219, 390, -1000, 53, 17173, - 318, 880, -1000, 877, -1000, -1000, -1000, -1000, -1000, 38, - 5936, 4181, 601, -1000, -1000, -1000, -1000, -1000, 439, 50, - -174, -1000, -1000, -1000, 17173, 514, 17173, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 344, -1000, -1000, 17173, -1000, -1000, - 355, -1000, -1000, 569, -1000, 17173, -1000, -1000, 641, -1000, - 839, -169, -177, 505, -1000, -1000, 712, -1000, -1000, 38, - 854, -171, -1000, 823, -1000, 17173, -1000, 35, -1000, -172, - 556, 33, -175, 783, 629, -181, 570, -1000, 955, 10043, - -1000, -1000, 968, 176, 176, 430, 439, -1000, -1000, -1000, - 61, 377, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17479, -1000, -1000, + -1000, -1000, -1000, 17479, -169, 486, 17479, 17479, 17479, 17479, + -1000, 309, 309, -1000, 11025, 2249, 2249, -1000, -1000, 483, + -1000, 862, -1000, 483, 657, 657, -1000, 657, 663, -1000, + 657, -16, 657, -19, 483, 483, 1987, 1854, 1838, 1611, + 653, -157, -1000, 442, 10011, -1000, 1814, 742, -1000, -1000, + 890, 875, 442, -1000, -1000, 840, 625, 535, -1000, -1000, + 8309, 578, 152, 574, -1000, 884, 17479, 10011, -1000, -1000, + 10011, 658, -1000, 10011, -1000, -1000, -1000, 653, 653, 653, + 574, 862, -1000, -1000, -1000, -1000, 4136, -1000, 565, -1000, + 657, -1000, -1000, -1000, 17479, -59, 936, 2249, -1000, -1000, + -1000, -1000, -1000, -32, 453, -32, 389, -1000, 388, 4838, + -1000, -1000, -1000, -1000, 830, -1000, 6242, -1000, -1000, 656, + 679, -1000, -1000, -1000, -1000, 2249, -1000, 792, -1000, -1000, + 139, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 11025, + 11025, 11025, 11025, 11025, 862, 448, 442, 11025, 11025, -1000, + 10011, 10011, 829, -1000, 653, -1000, 668, 17479, 17479, -1000, + 17479, 862, -1000, 442, 442, 17479, 442, 14768, 17479, 17479, + 12716, -1000, 169, 17479, -1000, 550, -1000, 223, -1000, -108, + 189, -1000, 189, 494, 492, -1000, 653, 567, -1000, 229, + 17479, 17479, -1000, -1000, -1000, 1687, 1687, 1687, 1687, 73, + 483, -1000, 1687, 1687, 442, 552, 935, -1000, 653, 947, + 148, -1000, -1000, -1000, 533, 520, -1000, 520, 520, 181, + 169, -1000, 486, 222, 446, -1000, 74, 17479, 342, 824, + -1000, 811, -1000, -1000, -1000, -1000, -1000, 50, 6242, 4487, + 518, -1000, -1000, -1000, -1000, -1000, 483, 53, -174, -1000, + -1000, -1000, 17479, 535, 17479, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 386, -1000, -1000, 17479, -1000, -1000, 440, -1000, + -1000, 509, -1000, 17479, -1000, -1000, 674, -1000, 755, -166, + -177, 443, -1000, -1000, 655, -1000, -1000, 50, 772, -169, + -1000, 717, -1000, 17479, -1000, 46, -1000, -172, 506, 44, + -175, 704, 653, -178, 696, -1000, 904, 10349, -1000, -1000, + 933, 206, 206, 1687, 483, -1000, -1000, -1000, 80, 470, + -1000, -1000, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1299, 84, 19, 503, 1298, 1296, 1295, 1294, 91, - 90, 88, 1293, 1292, 1291, 1290, 1287, 1286, 1284, 1280, - 1265, 1264, 1263, 1257, 1252, 1251, 1249, 1248, 1247, 1246, - 82, 1241, 1240, 1238, 1234, 1231, 1223, 1220, 1218, 1217, - 1216, 46, 242, 52, 59, 1215, 58, 1281, 1212, 57, - 61, 68, 1211, 38, 1210, 1209, 79, 1205, 1204, 56, - 1199, 1198, 221, 1197, 66, 1196, 12, 37, 1195, 1194, - 1193, 1190, 93, 2067, 1189, 1180, 14, 1176, 1175, 89, - 1174, 64, 28, 13, 18, 17, 1172, 107, 6, 1171, - 60, 1170, 1167, 1166, 1161, 26, 1155, 36, 1154, 21, - 62, 1153, 9, 67, 33, 29, 10, 1152, 1151, 23, - 69, 54, 65, 1149, 1143, 551, 1142, 1141, 49, 1140, - 1139, 1138, 24, 1135, 95, 423, 1121, 1111, 1110, 1107, - 45, 824, 1473, 22, 73, 1106, 1105, 1104, 2405, 40, - 55, 16, 1101, 34, 74, 43, 1100, 1099, 44, 1098, - 1096, 1092, 1090, 1089, 1088, 1087, 350, 1084, 1083, 1082, - 27, 25, 1081, 1080, 63, 30, 1078, 1068, 1059, 50, - 70, 1058, 1057, 51, 1054, 1053, 48, 1052, 1049, 1048, - 1034, 1032, 32, 11, 1025, 15, 1023, 8, 1022, 31, - 1019, 7, 1017, 4, 1010, 2, 0, 1008, 5, 53, - 3, 1004, 1, 991, 990, 949, 1037, 80, 989, 77, + 0, 1181, 1179, 27, 80, 66, 1176, 1174, 1167, 94, + 93, 91, 1166, 1164, 1163, 1161, 1160, 1158, 1156, 1154, + 1153, 1151, 1150, 1149, 1146, 1145, 1144, 1143, 1142, 1140, + 86, 1139, 70, 1138, 1135, 1134, 1133, 1132, 1130, 1128, + 1127, 49, 205, 51, 57, 1126, 60, 693, 1123, 58, + 71, 59, 1122, 43, 1121, 1120, 84, 1118, 1117, 56, + 1114, 1113, 90, 1105, 68, 1104, 18, 45, 1103, 1102, + 1101, 1100, 100, 1882, 1098, 1096, 15, 1094, 1093, 103, + 1092, 67, 30, 11, 32, 23, 1091, 131, 6, 1090, + 63, 1089, 1088, 1087, 1086, 48, 1085, 61, 1082, 19, + 16, 1079, 7, 65, 36, 20, 5, 1078, 1077, 25, + 75, 62, 64, 1076, 1075, 490, 1074, 1073, 50, 1072, + 1070, 1061, 31, 1059, 101, 362, 1058, 1057, 1055, 1053, + 38, 912, 1571, 12, 69, 1052, 1051, 1048, 2682, 44, + 55, 22, 1041, 29, 46, 37, 1040, 1038, 33, 1035, + 1033, 1032, 1028, 1025, 1023, 1021, 112, 1020, 1019, 1018, + 24, 13, 1013, 1012, 82, 21, 1011, 1010, 1008, 53, + 74, 1007, 1006, 54, 1005, 1004, 40, 1003, 1002, 1001, + 1000, 995, 26, 17, 993, 14, 992, 10, 990, 34, + 987, 4, 986, 9, 983, 3, 0, 972, 8, 52, + 2, 963, 1, 958, 957, 1225, 1755, 87, 956, 92, } var yyR1 = [...]int{ 0, 203, 204, 204, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 196, 196, 196, - 20, 3, 3, 3, 3, 2, 8, 4, 5, 5, - 9, 9, 33, 33, 10, 11, 11, 11, 11, 207, - 207, 56, 56, 57, 57, 103, 103, 12, 13, 13, - 112, 112, 111, 111, 111, 113, 113, 113, 113, 146, - 146, 14, 14, 14, 14, 14, 14, 14, 198, 198, - 197, 195, 195, 194, 194, 193, 21, 178, 180, 180, - 179, 179, 179, 179, 170, 149, 149, 149, 149, 152, - 152, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 151, 151, 151, 151, 151, 153, 153, 153, 153, 153, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, - 155, 155, 155, 169, 169, 156, 156, 164, 164, 165, - 165, 165, 162, 162, 163, 163, 166, 166, 166, 158, - 158, 159, 159, 167, 167, 160, 160, 160, 161, 161, - 161, 168, 168, 168, 168, 168, 157, 157, 171, 171, - 188, 188, 187, 187, 187, 177, 177, 184, 184, 184, - 184, 184, 174, 174, 174, 175, 175, 173, 173, 176, - 176, 186, 186, 185, 172, 172, 189, 189, 189, 189, - 201, 202, 200, 200, 200, 200, 200, 181, 181, 181, - 182, 182, 182, 183, 183, 183, 15, 15, 15, 15, + 20, 3, 3, 3, 3, 2, 2, 8, 4, 5, + 5, 9, 9, 33, 33, 10, 11, 11, 11, 11, + 207, 207, 56, 56, 57, 57, 103, 103, 12, 13, + 13, 112, 112, 111, 111, 111, 113, 113, 113, 113, + 146, 146, 14, 14, 14, 14, 14, 14, 14, 198, + 198, 197, 195, 195, 194, 194, 193, 21, 178, 180, + 180, 179, 179, 179, 179, 170, 149, 149, 149, 149, + 152, 152, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 151, 151, 151, 151, 151, 153, 153, 153, 153, + 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, + 155, 155, 155, 155, 169, 169, 156, 156, 164, 164, + 165, 165, 165, 162, 162, 163, 163, 166, 166, 166, + 158, 158, 159, 159, 167, 167, 160, 160, 160, 161, + 161, 161, 168, 168, 168, 168, 168, 157, 157, 171, + 171, 188, 188, 187, 187, 187, 177, 177, 184, 184, + 184, 184, 184, 174, 174, 174, 175, 175, 173, 173, + 176, 176, 186, 186, 185, 172, 172, 189, 189, 189, + 189, 201, 202, 200, 200, 200, 200, 200, 181, 181, + 181, 182, 182, 182, 183, 183, 183, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 192, 190, 190, - 191, 191, 16, 22, 22, 17, 17, 17, 17, 17, - 18, 18, 23, 24, 24, 24, 24, 24, 24, 24, + 15, 15, 15, 15, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 192, 190, + 190, 191, 191, 16, 22, 22, 17, 17, 17, 17, + 17, 18, 18, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 119, 119, 121, 121, 117, 117, 120, 120, 118, 118, - 118, 122, 122, 122, 123, 123, 147, 147, 147, 25, - 25, 27, 27, 28, 29, 34, 34, 34, 34, 34, - 34, 36, 36, 36, 7, 7, 7, 7, 35, 35, - 35, 6, 6, 26, 26, 26, 26, 19, 208, 30, - 31, 31, 32, 32, 32, 38, 38, 38, 37, 37, - 37, 43, 43, 45, 45, 45, 45, 45, 46, 46, - 46, 46, 46, 46, 42, 42, 44, 44, 44, 44, - 135, 135, 135, 134, 134, 48, 48, 49, 49, 50, - 50, 51, 51, 51, 51, 65, 65, 102, 102, 104, - 104, 52, 52, 52, 52, 53, 53, 54, 54, 55, - 55, 142, 142, 141, 141, 141, 140, 140, 58, 58, - 58, 60, 59, 59, 59, 59, 61, 61, 63, 63, - 62, 62, 64, 66, 66, 66, 66, 66, 67, 67, - 47, 47, 47, 47, 47, 47, 47, 116, 116, 69, - 69, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 80, 80, 80, 80, 80, 80, 70, 70, 70, - 70, 70, 70, 70, 41, 41, 81, 81, 81, 87, - 82, 82, 73, 73, 73, 73, 73, 73, 73, 73, + 24, 119, 119, 121, 121, 117, 117, 120, 120, 118, + 118, 118, 122, 122, 122, 123, 123, 147, 147, 147, + 25, 25, 27, 27, 28, 29, 34, 34, 34, 34, + 34, 34, 36, 36, 36, 7, 7, 7, 7, 35, + 35, 35, 6, 6, 26, 26, 26, 26, 19, 208, + 30, 31, 31, 32, 32, 32, 38, 38, 38, 37, + 37, 37, 43, 43, 45, 45, 45, 45, 45, 46, + 46, 46, 46, 46, 46, 42, 42, 44, 44, 44, + 44, 135, 135, 135, 134, 134, 48, 48, 49, 49, + 50, 50, 51, 51, 51, 51, 65, 65, 102, 102, + 104, 104, 52, 52, 52, 52, 53, 53, 54, 54, + 55, 55, 142, 142, 141, 141, 141, 140, 140, 58, + 58, 58, 60, 59, 59, 59, 59, 61, 61, 63, + 63, 62, 62, 64, 66, 66, 66, 66, 66, 67, + 67, 47, 47, 47, 47, 47, 47, 47, 116, 116, + 69, 69, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 80, 80, 80, 80, 80, 80, 70, 70, + 70, 70, 70, 70, 70, 41, 41, 81, 81, 81, + 87, 82, 82, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 77, 77, 77, 77, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 209, - 209, 79, 78, 78, 78, 78, 78, 78, 78, 39, - 39, 39, 39, 39, 145, 145, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 91, - 91, 40, 40, 89, 89, 90, 92, 92, 88, 88, - 88, 72, 72, 72, 72, 72, 72, 72, 72, 74, - 74, 74, 93, 93, 94, 94, 95, 95, 96, 96, - 97, 98, 98, 98, 99, 99, 99, 99, 100, 100, - 100, 71, 71, 71, 71, 101, 101, 101, 101, 105, - 105, 83, 83, 85, 85, 84, 86, 106, 106, 109, - 107, 107, 107, 110, 110, 110, 110, 108, 108, 108, - 137, 137, 137, 114, 114, 124, 124, 125, 125, 115, - 115, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 127, 127, 127, 128, 128, 129, 129, 129, 136, - 136, 132, 132, 133, 133, 138, 138, 139, 139, 130, + 73, 73, 73, 73, 73, 73, 73, 77, 77, 77, + 77, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 209, 209, 79, 78, 78, 78, 78, 78, 78, 78, + 39, 39, 39, 39, 39, 145, 145, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 91, 91, 40, 40, 89, 89, 90, 92, 92, 88, + 88, 88, 72, 72, 72, 72, 72, 72, 72, 72, + 74, 74, 74, 93, 93, 94, 94, 95, 95, 96, + 96, 97, 98, 98, 98, 99, 99, 99, 99, 100, + 100, 100, 71, 71, 71, 71, 101, 101, 101, 101, + 105, 105, 83, 83, 85, 85, 84, 86, 106, 106, + 109, 107, 107, 107, 110, 110, 110, 110, 108, 108, + 108, 137, 137, 137, 114, 114, 124, 124, 125, 125, + 115, 115, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 127, 127, 127, 128, 128, 129, 129, 129, + 136, 136, 132, 132, 133, 133, 138, 138, 139, 139, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, @@ -2916,7 +2948,7 @@ var yyR1 = [...]int{ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, + 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2933,80 +2965,80 @@ var yyR1 = [...]int{ 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 205, - 206, 143, 144, 144, 144, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 205, 206, 143, 144, 144, 144, } var yyR2 = [...]int{ 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 2, 1, 6, 6, 7, 4, 5, 8, 1, 3, - 7, 8, 1, 1, 9, 8, 7, 6, 6, 1, - 1, 1, 3, 1, 3, 0, 4, 3, 5, 4, - 1, 3, 3, 2, 2, 2, 2, 2, 1, 1, - 1, 2, 2, 8, 4, 6, 5, 5, 0, 2, - 1, 0, 2, 1, 3, 3, 4, 4, 2, 4, - 1, 3, 3, 3, 8, 3, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, - 4, 4, 2, 2, 3, 3, 3, 3, 1, 1, - 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 0, 3, 0, 5, 0, - 3, 5, 0, 1, 0, 1, 0, 1, 2, 0, - 2, 0, 3, 0, 1, 0, 3, 3, 0, 2, - 2, 0, 2, 1, 2, 1, 0, 2, 5, 4, - 1, 2, 2, 3, 2, 0, 1, 2, 3, 3, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 3, 2, 3, 1, 10, 11, 11, 12, - 3, 3, 1, 1, 2, 2, 2, 0, 1, 3, - 1, 2, 3, 1, 1, 1, 6, 7, 7, 7, - 7, 4, 5, 4, 4, 7, 5, 5, 5, 12, - 7, 5, 9, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 7, 1, 3, - 8, 8, 3, 3, 5, 4, 6, 5, 4, 4, - 3, 2, 3, 4, 4, 3, 4, 4, 4, 4, - 4, 4, 3, 2, 7, 2, 3, 4, 3, 7, - 5, 4, 2, 4, 4, 3, 3, 5, 2, 3, - 1, 1, 0, 1, 0, 1, 1, 1, 0, 2, - 2, 0, 2, 2, 0, 2, 0, 1, 1, 2, - 1, 1, 2, 1, 1, 0, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 3, 3, 2, 2, 3, 3, 2, 0, 2, - 0, 2, 1, 2, 2, 0, 1, 1, 0, 1, - 1, 0, 1, 0, 1, 2, 3, 4, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 2, 3, 5, - 0, 1, 2, 1, 1, 0, 2, 1, 3, 1, - 1, 1, 3, 1, 3, 3, 7, 1, 3, 1, - 3, 4, 4, 4, 3, 2, 4, 0, 1, 0, - 2, 0, 1, 0, 1, 2, 1, 1, 1, 2, - 2, 1, 2, 3, 2, 3, 2, 2, 2, 1, - 1, 3, 3, 0, 5, 4, 5, 5, 0, 2, - 1, 3, 3, 2, 3, 1, 2, 0, 3, 1, - 1, 3, 3, 4, 4, 5, 3, 4, 5, 6, - 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 0, 2, 1, 1, 1, 3, - 1, 3, 1, 1, 1, 1, 1, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 1, 1, 1, 1, 4, 5, 5, 6, - 4, 4, 6, 6, 6, 8, 8, 8, 8, 9, - 8, 5, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 8, 8, 0, - 2, 3, 4, 4, 4, 4, 4, 4, 4, 0, - 3, 4, 7, 3, 1, 1, 2, 3, 3, 1, - 2, 2, 1, 2, 1, 2, 2, 1, 2, 0, - 1, 0, 2, 1, 2, 4, 0, 2, 1, 3, - 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 0, 3, 0, 2, 0, 3, 1, 3, - 2, 0, 1, 1, 0, 2, 4, 4, 0, 2, - 4, 2, 1, 5, 4, 1, 3, 3, 5, 0, - 5, 1, 3, 1, 2, 3, 1, 1, 3, 3, - 1, 2, 3, 3, 3, 3, 3, 1, 2, 1, - 1, 1, 1, 1, 1, 0, 2, 0, 3, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, + 2, 4, 6, 6, 7, 4, 6, 5, 8, 1, + 3, 7, 8, 1, 1, 9, 8, 7, 6, 6, + 1, 1, 1, 3, 1, 3, 0, 4, 3, 5, + 4, 1, 3, 3, 2, 2, 2, 2, 2, 1, + 1, 1, 2, 2, 8, 4, 6, 5, 5, 0, + 2, 1, 0, 2, 1, 3, 3, 4, 4, 2, + 4, 1, 3, 3, 3, 8, 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, + 1, 4, 4, 2, 2, 3, 3, 3, 3, 1, + 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 3, 0, 5, + 0, 3, 5, 0, 1, 0, 1, 0, 1, 2, + 0, 2, 0, 3, 0, 1, 0, 3, 3, 0, + 2, 2, 0, 2, 1, 2, 1, 0, 2, 5, + 4, 1, 2, 2, 3, 2, 0, 1, 2, 3, + 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 3, 2, 3, 1, 10, 11, 11, + 12, 3, 3, 1, 1, 2, 2, 2, 0, 1, + 3, 1, 2, 3, 1, 1, 1, 6, 7, 7, + 7, 7, 4, 5, 4, 4, 7, 5, 5, 5, + 12, 7, 5, 9, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, + 3, 8, 8, 3, 3, 5, 4, 6, 5, 4, + 4, 3, 2, 3, 4, 4, 3, 4, 4, 4, + 4, 4, 4, 3, 2, 7, 2, 3, 4, 3, + 7, 5, 4, 2, 4, 4, 3, 3, 5, 2, + 3, 1, 1, 0, 1, 0, 1, 1, 1, 0, + 2, 2, 0, 2, 2, 0, 2, 0, 1, 1, + 2, 1, 1, 2, 1, 1, 0, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 3, 3, 2, 2, 3, 3, 2, 0, + 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, + 1, 1, 0, 1, 0, 1, 2, 3, 4, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 2, 3, + 5, 0, 1, 2, 1, 1, 0, 2, 1, 3, + 1, 1, 1, 3, 1, 3, 3, 7, 1, 3, + 1, 3, 4, 4, 4, 3, 2, 4, 0, 1, + 0, 2, 0, 1, 0, 1, 2, 1, 1, 1, + 2, 2, 1, 2, 3, 2, 3, 2, 2, 2, + 1, 1, 3, 3, 0, 5, 4, 5, 5, 0, + 2, 1, 3, 3, 2, 3, 1, 2, 0, 3, + 1, 1, 3, 3, 4, 4, 5, 3, 4, 5, + 6, 2, 1, 2, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, + 3, 1, 3, 1, 1, 1, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 1, 1, 1, 1, 4, 5, 5, + 6, 4, 4, 6, 6, 6, 8, 8, 8, 8, + 9, 8, 5, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 0, 2, 3, 4, 4, 4, 4, 4, 4, 4, + 0, 3, 4, 7, 3, 1, 1, 2, 3, 3, + 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, + 0, 1, 0, 2, 1, 2, 4, 0, 2, 1, + 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 0, 3, 0, 2, 0, 3, 1, + 3, 2, 0, 1, 1, 0, 2, 4, 4, 0, + 2, 4, 2, 1, 5, 4, 1, 3, 3, 5, + 0, 5, 1, 3, 1, 2, 3, 1, 1, 3, + 3, 1, 2, 3, 3, 3, 3, 3, 1, 2, + 1, 1, 1, 1, 1, 1, 0, 2, 0, 3, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3036,105 +3068,106 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 1, 1, + 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ -1000, -203, -1, -3, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -23, -24, -25, -27, -28, - -29, -6, -26, -19, -20, -2, -205, 6, 7, -33, + -29, -6, -26, -19, -20, -4, -205, 6, 7, -33, 9, 10, 30, -21, 122, 123, 125, 124, 158, 126, 151, 53, 172, 173, 175, 176, -36, 156, 157, 31, - 32, 128, 34, -4, 57, 8, 258, 153, 152, 25, - -204, 360, -32, 5, -3, -30, -208, -30, -30, -30, - -30, -30, -178, -180, 57, 95, -129, 132, 77, 250, - 129, 130, 136, -132, -196, -131, 60, 61, 62, 268, - 144, 300, 301, 172, 183, 177, 204, 196, 269, 302, - 145, 194, 197, 237, 142, 303, 224, 231, 71, 175, - 246, 304, 154, 192, 188, 305, 277, 186, 27, 306, - 233, 209, 307, 273, 235, 187, 232, 128, 308, 147, - 140, 309, 210, 214, 310, 238, 311, 312, 313, 181, - 182, 314, 143, 240, 208, 141, 33, 270, 37, 162, - 241, 212, 315, 207, 203, 316, 317, 318, 319, 206, - 180, 202, 41, 216, 215, 217, 236, 199, 320, 321, - 322, 148, 323, 189, 18, 324, 325, 326, 327, 328, - 244, 157, 329, 160, 330, 331, 332, 333, 334, 335, - 234, 211, 213, 137, 164, 230, 272, 336, 242, 185, - 337, 149, 161, 156, 245, 150, 338, 339, 340, 341, - 342, 343, 344, 176, 345, 346, 347, 348, 171, 239, - 248, 40, 221, 349, 179, 139, 350, 173, 168, 226, - 200, 163, 351, 352, 190, 191, 205, 178, 201, 174, - 165, 158, 353, 247, 222, 274, 198, 195, 169, 354, - 166, 167, 355, 227, 228, 170, 271, 243, 193, 223, - -115, 132, 250, 129, 228, 134, 130, 130, 131, 132, - 250, 129, 130, -62, -138, -196, -131, 132, 130, 113, - 197, 237, 122, 225, 233, -121, 234, 164, -147, 130, - -117, 224, 227, 228, 170, -196, 235, 239, 238, 229, - -138, 174, -62, -34, 356, 126, -143, -143, 226, 226, - -143, -82, -47, -68, 79, -73, 29, 23, -72, -69, - -88, -86, -87, 113, 114, 116, 115, 117, 102, 103, - 110, 80, 118, -77, -75, -76, -78, 64, 63, 72, - 65, 66, 67, 68, 73, 74, 75, -132, -138, -84, - -205, 47, 48, 259, 260, 261, 262, 267, 263, 82, - 36, 249, 257, 256, 255, 253, 254, 251, 252, 265, - 266, 135, 250, 129, 108, 258, -196, -131, -95, 15, - -5, -4, -205, 6, 20, 21, -206, 59, -38, -45, - 42, 43, -46, 21, 35, 46, 44, -31, -44, 104, - -47, -138, -115, -115, 11, -56, -57, -62, -64, -138, - -107, -146, 174, -110, 239, 238, -133, -108, -132, -130, - 237, 197, 236, 127, 275, 78, 22, 24, 219, 81, - 113, 16, 82, 112, 259, 122, 51, 276, 251, 252, - 249, 261, 262, 250, 225, 29, 10, 278, 25, 152, - 21, 35, 106, 124, 85, 86, 155, 23, 153, 75, - 281, 19, 54, 11, 13, 282, 283, 14, 135, 134, - 97, 131, 49, 8, 118, 26, 94, 45, 284, 28, - 285, 286, 287, 288, 47, 95, 17, 253, 254, 31, - 289, 267, 159, 108, 52, 38, 79, 290, 291, 73, - 292, 76, 55, 77, 15, 50, 293, 294, 295, 296, - 96, 125, 258, 48, 297, 129, 6, 264, 30, 151, - 46, 298, 130, 84, 265, 266, 133, 74, 5, 136, - 32, 9, 53, 56, 255, 256, 257, 36, 83, 12, - 299, -179, 95, -170, -196, -62, 131, -62, 258, -125, - 135, -125, -125, 130, -62, -196, -196, 122, 124, 127, - 55, -22, -62, -124, 135, -196, -124, -124, -124, -62, - 119, -62, -196, 30, -122, 95, 12, 250, -196, 164, - 130, 165, 132, -144, -205, -133, -174, 131, 33, 143, - -144, 168, 169, -144, -120, -119, 231, 232, 226, 230, - 12, 169, 226, 167, -144, -35, -132, 64, -7, -3, - -10, -9, -11, 87, -143, -143, 58, 78, 77, 94, - -47, -70, 97, 79, 95, 96, 81, 99, 98, 109, - 102, 103, 104, 105, 106, 107, 108, 100, 101, 112, - 87, 88, 89, 90, 91, 92, 93, -116, -205, -87, - -205, 120, 121, -73, -73, -73, -73, -73, -73, -73, - -73, -73, -73, -205, 119, -2, -82, -205, -205, -205, - -205, -205, -205, -205, -205, -91, -47, -205, -209, -79, - -205, -209, -79, -209, -79, -209, -205, -209, -79, -209, - -79, -209, -209, -79, -205, -205, -205, -205, -205, -205, - -205, -99, 17, 16, -95, -3, -30, -95, 38, -42, - -44, -46, 42, 43, 70, 11, -135, -134, 22, -132, - 64, 119, -63, 26, -62, -49, -50, -51, -52, -65, - -87, -205, -62, -62, -56, -207, 58, 11, 56, -207, - 58, 119, 58, 174, -110, -112, -111, 240, 242, 87, - -137, -132, 64, 29, 30, 59, 58, -62, -149, -152, - -154, -153, -155, -150, -151, 194, 195, 113, 198, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 30, - 154, 190, 191, 192, 193, 210, 211, 212, 213, 214, - 215, 216, 217, 177, 196, 269, 178, 179, 180, 181, - 182, 183, 185, 186, 187, 188, 189, -196, -144, 132, - -196, 79, -196, -62, -62, -144, -144, -144, 166, 166, - 130, 130, 171, -62, 58, 133, -56, 23, 55, -62, - -196, -196, -139, -138, -130, -144, -122, 64, -47, -144, - -144, -144, -62, -144, -144, -175, 11, 97, -144, -144, - 11, -118, 11, 97, -47, -123, 95, 55, 208, 357, - 358, 359, -47, -47, -47, -80, 73, 79, 74, 75, - -73, -81, -84, -87, 69, 97, 95, 96, 81, -73, + 32, 128, 34, 57, 8, 258, 153, 152, 25, -204, + 360, -32, 5, -95, 15, -3, -30, -208, -30, -30, + -30, -30, -30, -178, -180, 57, 95, -129, 132, 77, + 250, 129, 130, 136, -132, -196, -131, 60, 61, 62, + 268, 144, 300, 301, 172, 183, 177, 204, 196, 269, + 302, 145, 194, 197, 237, 142, 303, 224, 231, 71, + 175, 246, 304, 154, 192, 188, 305, 277, 186, 27, + 306, 233, 209, 307, 273, 235, 187, 232, 128, 308, + 147, 140, 309, 210, 214, 310, 238, 311, 312, 313, + 181, 182, 314, 143, 240, 208, 141, 33, 270, 37, + 162, 241, 212, 315, 207, 203, 316, 317, 318, 319, + 206, 180, 202, 41, 216, 215, 217, 236, 199, 320, + 321, 322, 148, 323, 189, 18, 324, 325, 326, 327, + 328, 244, 157, 329, 160, 330, 331, 332, 333, 334, + 335, 234, 211, 213, 137, 164, 230, 272, 336, 242, + 185, 337, 149, 161, 156, 245, 150, 338, 339, 340, + 341, 342, 343, 344, 176, 345, 346, 347, 348, 171, + 239, 248, 40, 221, 349, 179, 139, 350, 173, 168, + 226, 200, 163, 351, 352, 190, 191, 205, 178, 201, + 174, 165, 158, 353, 247, 222, 274, 198, 195, 169, + 354, 166, 167, 355, 227, 228, 170, 271, 243, 193, + 223, -115, 132, 250, 129, 228, 134, 130, 130, 131, + 132, 250, 129, 130, -62, -138, -196, -131, 132, 130, + 113, 197, 237, 122, 225, 233, -121, 234, 164, -147, + 130, -117, 224, 227, 228, 170, -196, 235, 239, 238, + 229, -138, 174, -62, -34, 356, 126, -143, -143, 226, + 226, -143, -82, -47, -68, 79, -73, 29, 23, -72, + -69, -88, -86, -87, 113, 114, 116, 115, 117, 102, + 103, 110, 80, 118, -77, -75, -76, -78, 64, 63, + 72, 65, 66, 67, 68, 73, 74, 75, -132, -138, + -84, -205, 47, 48, 259, 260, 261, 262, 267, 263, + 82, 36, 249, 257, 256, 255, 253, 254, 251, 252, + 265, 266, 135, 250, 129, 108, 258, -196, -131, -5, + -4, -205, 6, 20, 21, -99, 17, 16, -206, 59, + -38, -45, 42, 43, -46, 21, 35, 46, 44, -31, + -44, 104, -47, -138, -115, -115, 11, -56, -57, -62, + -64, -138, -107, -146, 174, -110, 239, 238, -133, -108, + -132, -130, 237, 197, 236, 127, 275, 78, 22, 24, + 219, 81, 113, 16, 82, 112, 259, 122, 51, 276, + 251, 252, 249, 261, 262, 250, 225, 29, 10, 278, + 25, 152, 21, 35, 106, 124, 85, 86, 155, 23, + 153, 75, 281, 19, 54, 11, 13, 282, 283, 14, + 135, 134, 97, 131, 49, 8, 118, 26, 94, 45, + 284, 28, 285, 286, 287, 288, 47, 95, 17, 253, + 254, 31, 289, 267, 159, 108, 52, 38, 79, 290, + 291, 73, 292, 76, 55, 77, 15, 50, 293, 294, + 295, 296, 96, 125, 258, 48, 297, 129, 6, 264, + 30, 151, 46, 298, 130, 84, 265, 266, 133, 74, + 5, 136, 32, 9, 53, 56, 255, 256, 257, 36, + 83, 12, 299, -179, 95, -170, -196, -62, 131, -62, + 258, -125, 135, -125, -125, 130, -62, -196, -196, 122, + 124, 127, 55, -22, -62, -124, 135, -196, -124, -124, + -124, -62, 119, -62, -196, 30, -122, 95, 12, 250, + -196, 164, 130, 165, 132, -144, -205, -133, -174, 131, + 33, 143, -144, 168, 169, -144, -120, -119, 231, 232, + 226, 230, 12, 169, 226, 167, -144, -35, -132, 64, + -7, -3, -10, -9, -11, 87, -143, -143, 58, 78, + 77, 94, -47, -70, 97, 79, 95, 96, 81, 99, + 98, 109, 102, 103, 104, 105, 106, 107, 108, 100, + 101, 112, 87, 88, 89, 90, 91, 92, 93, -116, + -205, -87, -205, 120, 121, -73, -73, -73, -73, -73, + -73, -73, -73, -73, -73, -205, 119, -2, -82, -4, + -205, -205, -205, -205, -205, -205, -205, -205, -91, -47, + -205, -209, -79, -205, -209, -79, -209, -79, -209, -205, + -209, -79, -209, -79, -209, -209, -79, -205, -205, -205, + -205, -205, -205, -205, -95, -3, -30, -100, 19, 31, + -47, -96, -97, -47, -95, 38, -42, -44, -46, 42, + 43, 70, 11, -135, -134, 22, -132, 64, 119, -63, + 26, -62, -49, -50, -51, -52, -65, -87, -205, -62, + -62, -56, -207, 58, 11, 56, -207, 58, 119, 58, + 174, -110, -112, -111, 240, 242, 87, -137, -132, 64, + 29, 30, 59, 58, -62, -149, -152, -154, -153, -155, + -150, -151, 194, 195, 113, 198, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 30, 154, 190, 191, + 192, 193, 210, 211, 212, 213, 214, 215, 216, 217, + 177, 196, 269, 178, 179, 180, 181, 182, 183, 185, + 186, 187, 188, 189, -196, -144, 132, -196, 79, -196, + -62, -62, -144, -144, -144, 166, 166, 130, 130, 171, + -62, 58, 133, -56, 23, 55, -62, -196, -196, -139, + -138, -130, -144, -122, 64, -47, -144, -144, -144, -62, + -144, -144, -175, 11, 97, -144, -144, 11, -118, 11, + 97, -47, -123, 95, 55, 208, 357, 358, 359, -47, + -47, -47, -80, 73, 79, 74, 75, -73, -81, -84, + -87, 69, 97, 95, 96, 81, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, - -73, -73, -73, -73, -145, -196, 64, -196, -72, -72, - -132, -43, 21, 35, -42, -133, -139, -130, -206, -206, - -42, -42, -47, -47, -88, 64, -42, -88, 64, -42, - -42, -37, 21, 35, -89, -90, 83, -88, -132, -138, - -206, -73, -132, -132, -42, -43, -43, -42, -42, -100, - 19, 31, -47, -96, -97, -47, -99, -206, -99, -74, + -73, -145, -196, 64, -196, -72, -72, -132, -43, 21, + 35, -42, -133, -139, -130, -32, -206, -206, -95, -42, + -42, -47, -47, -88, 64, -42, -88, 64, -42, -42, + -37, 21, 35, -89, -90, 83, -88, -132, -138, -206, + -73, -132, -132, -42, -43, -43, -42, -42, -99, -206, + 9, 97, 58, 18, 58, -98, 24, 25, -99, -74, -132, 65, 68, -48, 58, 11, -46, -62, -134, 104, -139, -103, 160, -62, 30, 58, -58, -60, -59, -61, 45, 49, 51, 46, 47, 48, 52, -142, 22, -49, @@ -3150,66 +3183,66 @@ var yyChk = [...]int{ 259, 160, 274, -196, 161, -62, -62, -62, -62, -62, 127, 124, -62, -62, -62, -144, -62, -62, -122, -138, -138, 64, -62, 73, 74, 75, -81, -73, -73, -73, - -41, 155, 78, -206, -206, -42, -42, -205, 119, -206, - -206, 58, 56, 22, 11, 11, -206, 11, 11, -206, - -206, -42, -92, -90, 85, -47, -206, 119, -206, 58, - 58, -206, -206, -206, -206, -206, 9, 97, 58, 18, - 58, -98, 24, 25, -100, -100, -114, 19, 11, 36, - 36, -67, 12, -44, -49, -46, 119, -71, 30, 36, - -3, -205, -205, -106, -109, -88, -50, -51, -51, -50, - -51, 45, 45, 45, 50, 45, 50, 45, -59, -138, - -206, -66, 53, 134, 54, -205, -140, -67, -49, -67, - -67, 119, -111, -113, 245, 242, 248, -196, 64, 58, - -183, 87, 57, -196, 28, -173, -173, -176, -196, -176, - 28, -158, 29, 73, -163, 223, 65, -160, -160, -161, - 30, -161, -161, -161, -169, 64, -169, 65, 65, 55, - -132, -144, -143, -199, 142, 138, 146, 147, 140, 60, - 61, 62, 131, 28, 137, 139, 160, 136, -199, -127, - -128, 133, 22, 131, 28, 160, -198, 56, 166, 219, - 166, 133, -144, -118, -118, -41, 78, -73, -73, -206, - -206, -43, -133, -148, 113, 194, 154, 192, 188, 208, + -41, 155, 78, -206, -206, -42, -42, -205, 119, -5, + -99, -206, -206, 58, 56, 22, 11, 11, -206, 11, + 11, -206, -206, -42, -92, -90, 85, -47, -206, 119, + -206, 58, 58, -206, -206, -206, -206, -206, -100, 40, + -47, -47, -97, -100, -114, 19, 11, 36, 36, -67, + 12, -44, -49, -46, 119, -71, 30, 36, -3, -205, + -205, -106, -109, -88, -50, -51, -51, -50, -51, 45, + 45, 45, 50, 45, 50, 45, -59, -138, -206, -66, + 53, 134, 54, -205, -140, -67, -49, -67, -67, 119, + -111, -113, 245, 242, 248, -196, 64, 58, -183, 87, + 57, -196, 28, -173, -173, -176, -196, -176, 28, -158, + 29, 73, -163, 223, 65, -160, -160, -161, 30, -161, + -161, -161, -169, 64, -169, 65, 65, 55, -132, -144, + -143, -199, 142, 138, 146, 147, 140, 60, 61, 62, + 131, 28, 137, 139, 160, 136, -199, -127, -128, 133, + 22, 131, 28, 160, -198, 56, 166, 219, 166, 133, + -144, -118, -118, -41, 78, -73, -73, -206, -206, -43, + -133, -95, -100, -148, 113, 194, 154, 192, 188, 208, 199, 221, 190, 222, -145, -148, -73, -73, -73, -73, - 268, -95, 86, -47, 84, -133, -73, -73, 40, -47, - -47, -97, -62, -93, 13, -47, 104, -105, 55, -106, - -83, -85, -84, -205, -101, -132, -104, -132, -67, 58, - 87, -54, -53, 55, 56, -55, 55, -53, 45, 45, - 131, 131, 131, -104, -95, -67, 242, 246, 247, -182, - -183, -186, -185, -132, -189, -176, -176, 57, -159, 55, - -73, 59, -161, -161, -196, 113, 59, 58, 59, 58, - 59, 58, -62, -143, -143, -62, -143, -132, -195, 271, - -197, -196, -132, -132, -132, -62, -122, -122, -73, -206, - -206, -156, -156, -156, -165, -156, 182, -156, 182, -206, - -206, 19, 19, 19, 19, -205, -40, 264, -47, 58, - 58, 41, -94, 14, 16, 27, -105, 58, -206, -206, - 58, 119, -206, 58, -95, -109, -47, -47, 57, -47, - -205, -205, -205, -206, -99, 59, 58, -156, -102, -132, - -167, 219, 9, -160, 64, -160, 65, 65, -144, 26, - -194, -193, -133, 57, 56, -160, -196, -73, -73, -73, - -73, -73, -99, 64, -73, -73, -47, -82, 28, -85, - 36, -3, -132, -132, -132, -99, -102, -102, -206, -102, - -102, -141, -188, -187, 56, 141, 71, -185, 59, 58, - -168, 137, 28, 136, -76, -161, -161, 59, 59, -205, - 58, 87, -102, -62, -206, -206, -206, -206, -39, 97, - 271, -206, -206, -206, 9, -83, 119, 59, -206, -206, - -206, -66, -187, -196, -177, 87, 64, 149, -132, -157, - 71, 28, 28, -190, -191, 160, -193, -183, 59, -206, - 269, 52, 272, -106, -132, 65, -62, 64, -206, 58, - -132, -198, 41, 270, 273, 57, -191, 36, -195, 41, - -102, 162, 271, 59, 163, 272, -201, -202, 55, -205, - 273, -202, 55, 10, 9, -73, 159, -200, 150, 145, - 148, 30, -200, -206, -206, 144, 29, 73, + 268, -95, 86, -47, 84, -133, -73, -73, 41, -62, + -93, 13, -47, 104, -105, 55, -106, -83, -85, -84, + -205, -101, -132, -104, -132, -67, 58, 87, -54, -53, + 55, 56, -55, 55, -53, 45, 45, 131, 131, 131, + -104, -95, -67, 242, 246, 247, -182, -183, -186, -185, + -132, -189, -176, -176, 57, -159, 55, -73, 59, -161, + -161, -196, 113, 59, 58, 59, 58, 59, 58, -62, + -143, -143, -62, -143, -132, -195, 271, -197, -196, -132, + -132, -132, -62, -122, -122, -73, -206, -99, -206, -156, + -156, -156, -165, -156, 182, -156, 182, -206, -206, 19, + 19, 19, 19, -205, -40, 264, -47, 58, 58, -94, + 14, 16, 27, -105, 58, -206, -206, 58, 119, -206, + 58, -95, -109, -47, -47, 57, -47, -205, -205, -205, + -206, -99, 59, 58, -156, -102, -132, -167, 219, 9, + -160, 64, -160, 65, 65, -144, 26, -194, -193, -133, + 57, 56, -100, -160, -196, -73, -73, -73, -73, -73, + -99, 64, -73, -73, -47, -82, 28, -85, 36, -3, + -132, -132, -132, -99, -102, -102, -206, -102, -102, -141, + -188, -187, 56, 141, 71, -185, 59, 58, -168, 137, + 28, 136, -76, -161, -161, 59, 59, -205, 58, 87, + -102, -62, -206, -206, -206, -206, -39, 97, 271, -206, + -206, -206, 9, -83, 119, 59, -206, -206, -206, -66, + -187, -196, -177, 87, 64, 149, -132, -157, 71, 28, + 28, -190, -191, 160, -193, -183, 59, -206, 269, 52, + 272, -106, -132, 65, -62, 64, -206, 58, -132, -198, + 41, 270, 273, 57, -191, 36, -195, 41, -102, 162, + 271, 59, 163, 272, -201, -202, 55, -205, 273, -202, + 55, 10, 9, -73, 159, -200, 150, 145, 148, 30, + -200, -206, -206, 144, 29, 73, } var yyDef = [...]int{ 26, -2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 31, 0, 348, 348, 348, - 348, 348, 348, 0, 676, 659, 0, 0, 0, 0, - -2, 320, 321, 0, 323, 324, 325, 981, 981, 0, - 0, 981, 0, 606, 979, 42, 43, 331, 332, 333, - 1, 3, 0, 352, 0, -2, 350, 0, 659, 659, - 0, 0, 71, 72, 0, 0, 0, 968, 0, 657, - 657, 657, 677, 678, 681, 682, 27, 28, 29, 807, + 21, 22, 23, 24, 25, 607, 0, 349, 349, 349, + 349, 349, 349, 0, 677, 660, 0, 0, 0, 0, + -2, 321, 322, 0, 324, 325, 326, 982, 982, 0, + 0, 982, 0, 980, 43, 44, 332, 333, 334, 1, + 3, 0, 353, 615, 0, 0, -2, 351, 0, 660, + 660, 0, 0, 72, 73, 0, 0, 0, 969, 0, + 658, 658, 658, 678, 679, 682, 683, 27, 28, 29, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, @@ -3226,139 +3259,140 @@ var yyDef = [...]int{ 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 0, 0, 0, 0, 0, 660, 0, 655, 0, 655, - 655, 655, 0, 271, 430, 685, 686, 968, 0, 0, - 0, 311, 0, 982, 283, 0, 285, 982, 0, 982, - 0, 292, 0, 0, 298, 982, 303, 317, 318, 305, - 319, 322, 338, 0, 0, 330, 343, 344, 981, 981, - 347, 30, 480, 440, 0, 445, 447, 0, 482, 483, - 484, 485, 486, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 512, 513, 514, 515, 591, 592, 593, - 594, 595, 596, 597, 598, 449, 450, 588, 0, 636, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 579, - 0, 549, 549, 549, 549, 549, 549, 549, 549, 0, - 0, 0, 0, 0, 0, 0, -2, -2, 614, 0, - 606, 38, 0, 348, 353, 354, 606, 980, 0, 0, - -2, -2, 364, 370, 371, 372, 373, 349, 0, 376, - 380, 0, 0, 0, 0, 0, 0, 51, 53, 430, - 57, 0, 957, 640, -2, -2, 0, 0, 683, 684, - -2, 820, -2, 689, 690, 691, 692, 693, 694, 695, - 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, - 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, - 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, - 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, - 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, - 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, - 806, 0, 0, 90, 0, 88, 0, 982, 0, 0, - 0, 0, 0, 0, 982, 982, 982, 0, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 270, - 0, 272, 982, 311, 275, 0, 0, 982, 982, 982, - 0, 982, 982, 282, 983, 984, 0, 192, 193, 194, - 286, 982, 982, 288, 0, 308, 306, 307, 300, 301, - 0, 314, 295, 296, 299, 341, 339, 340, 342, 334, - 335, 336, 337, 0, 345, 346, 0, 0, 0, 0, - 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 467, 468, 469, 470, 471, 472, 473, 446, 0, 460, - 0, 0, 0, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 0, 361, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 358, 0, 580, 0, 533, 541, - 0, 534, 542, 535, 543, 536, 0, 537, 544, 538, - 545, 539, 540, 546, 0, 0, 0, 361, 361, 0, - 0, 618, 0, 0, 614, 0, 363, 614, 0, 385, - 374, 365, 368, 369, 351, 0, 377, 381, 0, 383, - 384, 0, 55, 0, 429, 0, 387, 389, 390, 391, - -2, 0, 413, -2, 0, 0, 0, 49, 50, 0, - 0, 0, 0, 957, 641, 59, 60, 0, 0, 0, - 168, 650, 651, 652, 648, 217, 0, 0, 156, 152, - 96, 97, 98, 145, 100, 145, 145, 145, 145, 165, - 165, 165, 165, 128, 129, 130, 131, 132, 0, 0, - 115, 145, 145, 145, 119, 135, 136, 137, 138, 139, - 140, 141, 142, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 147, 147, 147, 149, 149, 679, 74, 0, - 982, 0, 982, 86, 0, 231, 233, 234, 0, 0, - 0, 0, 0, 0, 0, 0, 265, 656, 0, 982, - 268, 269, 431, 687, 688, 273, 274, 312, 313, 276, - 277, 278, 279, 280, 281, 0, 195, 196, 287, 291, - 0, 311, 0, 0, 293, 294, 0, 0, 326, 327, - 328, 329, 481, 441, 442, 444, 461, 0, 463, 465, - 451, 452, 476, 477, 478, 0, 0, 0, 0, 474, - 456, 0, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, 501, 564, 565, 0, 499, 500, - 511, 0, 0, 0, 362, 589, 0, -2, 479, 635, - 0, 0, 0, 0, 484, 591, 0, 484, 591, 0, - 0, 0, 359, 360, 586, 583, 0, 0, 588, 0, - 550, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 0, 615, 607, 608, 611, 618, 39, 618, 0, - 599, 0, 0, 438, 0, 0, 366, 36, 382, 378, - 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, - 418, 0, 0, 421, 0, 0, 0, 0, 412, 0, - 433, 901, 414, 0, 416, 417, 438, 0, 438, 52, - 438, 54, 0, 432, 642, 58, 0, 0, 63, 64, - 643, 644, 645, 646, 0, 87, 218, 220, 223, 224, - 225, 91, 92, 93, 0, 0, 205, 0, 0, 199, - 199, 0, 197, 198, 89, 159, 157, 0, 154, 153, - 99, 0, 165, 165, 122, 123, 168, 0, 168, 168, - 168, 0, 0, 116, 117, 118, 110, 0, 111, 112, - 113, 0, 114, 0, 0, 982, 76, 658, 77, 981, - 0, 0, 671, 232, 661, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 0, 78, 236, 238, 237, 241, - 0, 0, 0, 263, 982, 267, 308, 308, 290, 309, - 310, 315, 297, 462, 464, 466, 453, 474, 457, 0, - 454, 0, 0, 448, 516, 0, 0, 361, 0, 520, - 521, 0, 0, 0, 0, 0, 557, 0, 0, 558, - 0, 606, 0, 584, 0, 0, 532, 0, 551, 0, - 0, 552, 553, 554, 555, 556, 619, 0, 0, 0, - 0, 610, 612, 613, 33, 32, 0, 653, 654, 600, - 601, 602, 0, 375, 386, 367, 0, 629, 0, 0, - 622, 0, 0, 438, 637, 0, 388, 407, 409, 0, - 404, 419, 420, 422, 0, 424, 0, 426, 427, 392, - 394, 395, 0, 0, 0, 0, 415, 606, 438, 47, - 48, 0, 61, 62, 0, 0, 68, 169, 170, 0, - 221, 0, 0, 0, 187, 199, 199, 190, 200, 191, - 0, 161, 0, 158, 95, 155, 0, 168, 168, 124, - 0, 125, 126, 127, 0, 143, 0, 0, 0, 0, - 680, 75, 226, 981, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 981, 0, - 981, 672, 673, 674, 675, 0, 81, 0, 0, 0, - 0, 0, 266, 311, 311, 455, 0, 475, 458, 517, - 518, 0, 590, 0, 145, 145, 569, 145, 149, 572, - 145, 574, 145, 577, 0, 0, 0, 0, 0, 0, - 0, 581, 531, 587, 0, 589, 0, 0, 0, 616, - 617, 609, 34, 604, 0, 439, 379, 40, 0, 629, - 621, 631, 633, 0, 0, 625, 0, 399, 606, 0, - 0, 401, 408, 0, 0, 402, 0, 403, 423, 425, - 0, 0, 0, 0, 614, 46, 65, 66, 67, 219, - 222, 0, 201, 145, 204, 188, 189, 0, 163, 0, - 160, 146, 120, 121, 166, 167, 165, 0, 165, 0, - 150, 0, 982, 227, 228, 229, 230, 0, 235, 0, - 79, 80, 0, 0, 240, 264, 284, 289, 459, 519, - 522, 566, 165, 570, 571, 573, 575, 576, 578, 524, - 523, 0, 0, 0, 0, 0, 614, 0, 585, 0, - 0, 620, 37, 0, 0, 0, 41, 0, 634, 0, - 0, 0, 56, 0, 614, 638, 639, 405, 0, 410, - 0, 0, 0, 413, 45, 179, 0, 203, 0, 397, - 171, 164, 0, 168, 144, 168, 0, 0, 73, 0, - 82, 83, 0, 0, 0, 567, 568, 0, 0, 0, - 0, 559, 0, 582, 0, 0, 605, 603, 0, 632, - 0, 624, 627, 626, 400, 44, 0, 0, 435, 0, - 0, 433, 178, 180, 0, 185, 0, 202, 0, 0, - 176, 0, 173, 175, 162, 133, 134, 148, 151, 0, - 0, 0, 0, 242, 525, 527, 526, 528, 0, 0, - 0, 530, 547, 548, 0, 623, 0, 406, 434, 436, - 437, 396, 181, 182, 0, 186, 184, 0, 398, 94, - 0, 172, 174, 0, 258, 0, 84, 85, 78, 529, - 0, 0, 0, 630, 628, 183, 0, 177, 257, 0, - 0, 81, 560, 0, 563, 0, 259, 0, 239, 561, - 0, 0, 0, 206, 0, 0, 207, 208, 0, 0, - 562, 209, 0, 0, 0, 0, 0, 210, 212, 213, - 0, 0, 211, 260, 261, 214, 215, 216, + 968, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 0, 0, 0, 0, 0, 661, 0, 656, 0, + 656, 656, 656, 0, 272, 431, 686, 687, 969, 0, + 0, 0, 312, 0, 983, 284, 0, 286, 983, 0, + 983, 0, 293, 0, 0, 299, 983, 304, 318, 319, + 306, 320, 323, 339, 0, 0, 331, 344, 345, 982, + 982, 348, 30, 481, 441, 0, 446, 448, 0, 483, + 484, 485, 486, 487, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 513, 514, 515, 516, 592, 593, + 594, 595, 596, 597, 598, 599, 450, 451, 589, 0, + 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 580, 0, 550, 550, 550, 550, 550, 550, 550, 550, + 0, 0, 0, 0, 0, 0, 0, -2, -2, 607, + 39, 0, 349, 354, 355, 619, 0, 0, 607, 981, + 0, 0, -2, -2, 365, 371, 372, 373, 374, 350, + 0, 377, 381, 0, 0, 0, 0, 0, 0, 52, + 54, 431, 58, 0, 958, 641, -2, -2, 0, 0, + 684, 685, -2, 821, -2, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, + 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, + 805, 806, 807, 0, 0, 91, 0, 89, 0, 983, + 0, 0, 0, 0, 0, 0, 983, 983, 983, 0, + 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, + 0, 271, 0, 273, 983, 312, 276, 0, 0, 983, + 983, 983, 0, 983, 983, 283, 984, 985, 0, 193, + 194, 195, 287, 983, 983, 289, 0, 309, 307, 308, + 301, 302, 0, 315, 296, 297, 300, 342, 340, 341, + 343, 335, 336, 337, 338, 0, 346, 347, 0, 0, + 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 468, 469, 470, 471, 472, 473, 474, 447, + 0, 461, 0, 0, 0, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 0, 362, 0, 0, 0, 607, + 0, 0, 0, 0, 0, 0, 0, 359, 0, 581, + 0, 534, 542, 0, 535, 543, 536, 544, 537, 0, + 538, 545, 539, 546, 540, 541, 547, 0, 0, 0, + 362, 362, 0, 0, 615, 0, 364, 31, 0, 0, + 616, 608, 609, 612, 615, 0, 386, 375, 366, 369, + 370, 352, 0, 378, 382, 0, 384, 385, 0, 56, + 0, 430, 0, 388, 390, 391, 392, -2, 0, 414, + -2, 0, 0, 0, 50, 51, 0, 0, 0, 0, + 958, 642, 60, 61, 0, 0, 0, 169, 651, 652, + 653, 649, 218, 0, 0, 157, 153, 97, 98, 99, + 146, 101, 146, 146, 146, 146, 166, 166, 166, 166, + 129, 130, 131, 132, 133, 0, 0, 116, 146, 146, + 146, 120, 136, 137, 138, 139, 140, 141, 142, 143, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 148, + 148, 148, 150, 150, 680, 75, 0, 983, 0, 983, + 87, 0, 232, 234, 235, 0, 0, 0, 0, 0, + 0, 0, 0, 266, 657, 0, 983, 269, 270, 432, + 688, 689, 274, 275, 313, 314, 277, 278, 279, 280, + 281, 282, 0, 196, 197, 288, 292, 0, 312, 0, + 0, 294, 295, 0, 0, 327, 328, 329, 330, 482, + 442, 443, 445, 462, 0, 464, 466, 452, 453, 477, + 478, 479, 0, 0, 0, 0, 475, 457, 0, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 502, 565, 566, 0, 500, 501, 512, 0, 0, + 0, 363, 590, 0, -2, 0, 480, 636, 615, 0, + 0, 0, 0, 485, 592, 0, 485, 592, 0, 0, + 0, 360, 361, 587, 584, 0, 0, 589, 0, 551, + 0, 0, 0, 0, 0, 0, 0, 0, 619, 40, + 620, 0, 0, 0, 0, 611, 613, 614, 619, 0, + 600, 0, 0, 439, 0, 0, 367, 37, 383, 379, + 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, + 419, 0, 0, 422, 0, 0, 0, 0, 413, 0, + 434, 902, 415, 0, 417, 418, 439, 0, 439, 53, + 439, 55, 0, 433, 643, 59, 0, 0, 64, 65, + 644, 645, 646, 647, 0, 88, 219, 221, 224, 225, + 226, 92, 93, 94, 0, 0, 206, 0, 0, 200, + 200, 0, 198, 199, 90, 160, 158, 0, 155, 154, + 100, 0, 166, 166, 123, 124, 169, 0, 169, 169, + 169, 0, 0, 117, 118, 119, 111, 0, 112, 113, + 114, 0, 115, 0, 0, 983, 77, 659, 78, 982, + 0, 0, 672, 233, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 0, 79, 237, 239, 238, 242, + 0, 0, 0, 264, 983, 268, 309, 309, 291, 310, + 311, 316, 298, 463, 465, 467, 454, 475, 458, 0, + 455, 0, 0, 449, 517, 0, 0, 362, 0, 607, + 619, 521, 522, 0, 0, 0, 0, 0, 558, 0, + 0, 559, 0, 607, 0, 585, 0, 0, 533, 0, + 552, 0, 0, 553, 554, 555, 556, 557, 33, 0, + 617, 618, 610, 32, 0, 654, 655, 601, 602, 603, + 0, 376, 387, 368, 0, 630, 0, 0, 623, 0, + 0, 439, 638, 0, 389, 408, 410, 0, 405, 420, + 421, 423, 0, 425, 0, 427, 428, 393, 395, 396, + 0, 0, 0, 0, 416, 607, 439, 48, 49, 0, + 62, 63, 0, 0, 69, 170, 171, 0, 222, 0, + 0, 0, 188, 200, 200, 191, 201, 192, 0, 162, + 0, 159, 96, 156, 0, 169, 169, 125, 0, 126, + 127, 128, 0, 144, 0, 0, 0, 0, 681, 76, + 227, 982, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 982, 0, 982, 673, + 674, 675, 676, 0, 82, 0, 0, 0, 0, 0, + 267, 312, 312, 456, 0, 476, 459, 518, 519, 0, + 591, 615, 35, 0, 146, 146, 570, 146, 150, 573, + 146, 575, 146, 578, 0, 0, 0, 0, 0, 0, + 0, 582, 532, 588, 0, 590, 0, 0, 621, 34, + 605, 0, 440, 380, 41, 0, 630, 622, 632, 634, + 0, 0, 626, 0, 400, 607, 0, 0, 402, 409, + 0, 0, 403, 0, 404, 424, 426, 0, 0, 0, + 0, 615, 47, 66, 67, 68, 220, 223, 0, 202, + 146, 205, 189, 190, 0, 164, 0, 161, 147, 121, + 122, 167, 168, 166, 0, 166, 0, 151, 0, 983, + 228, 229, 230, 231, 0, 236, 0, 80, 81, 0, + 0, 241, 265, 285, 290, 460, 520, 619, 523, 567, + 166, 571, 572, 574, 576, 577, 579, 525, 524, 0, + 0, 0, 0, 0, 615, 0, 586, 0, 0, 38, + 0, 0, 0, 42, 0, 635, 0, 0, 0, 57, + 0, 615, 639, 640, 406, 0, 411, 0, 0, 0, + 414, 46, 180, 0, 204, 0, 398, 172, 165, 0, + 169, 145, 169, 0, 0, 74, 0, 83, 84, 0, + 0, 0, 36, 568, 569, 0, 0, 0, 0, 560, + 0, 583, 0, 0, 606, 604, 0, 633, 0, 625, + 628, 627, 401, 45, 0, 0, 436, 0, 0, 434, + 179, 181, 0, 186, 0, 203, 0, 0, 177, 0, + 174, 176, 163, 134, 135, 149, 152, 0, 0, 0, + 0, 243, 526, 528, 527, 529, 0, 0, 0, 531, + 548, 549, 0, 624, 0, 407, 435, 437, 438, 397, + 182, 183, 0, 187, 185, 0, 399, 95, 0, 173, + 175, 0, 259, 0, 85, 86, 79, 530, 0, 0, + 0, 631, 629, 184, 0, 178, 258, 0, 0, 82, + 561, 0, 564, 0, 260, 0, 240, 562, 0, 0, + 0, 207, 0, 0, 208, 209, 0, 0, 563, 210, + 0, 0, 0, 0, 0, 211, 213, 214, 0, 0, + 212, 261, 262, 215, 216, 217, } var yyTok1 = [...]int{ @@ -3816,32 +3850,36 @@ yydefault: yyVAL.statement = &OtherAdmin{} } case 31: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:397 { - yyVAL.selStmt = yyDollar[1].selStmt + sel := yyDollar[1].selStmt.(*Select) + sel.OrderBy = yyDollar[2].orderBy + sel.Limit = yyDollar[3].limit + sel.Lock = yyDollar[4].str + yyVAL.selStmt = sel } case 32: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:401 +//line sql.y:405 { yyVAL.selStmt = &Union{FirstStatement: &ParenSelect{Select: yyDollar[2].selStmt}, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} } case 33: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:405 +//line sql.y:409 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } case 34: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:409 +//line sql.y:413 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } case 35: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:432 +//line sql.y:436 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3850,32 +3888,38 @@ yydefault: yyVAL.selStmt = sel } case 36: + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:444 + { + yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) + } + case 37: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:442 +//line sql.y:450 { yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} } - case 37: + case 38: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:450 +//line sql.y:458 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereStr, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingStr, yyDollar[8].expr)) } - case 38: + case 39: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:456 +//line sql.y:464 { yyVAL.selStmt = yyDollar[1].selStmt } - case 39: + case 40: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:460 +//line sql.y:468 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } - case 40: + case 41: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:467 +//line sql.y:475 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -3887,9 +3931,9 @@ yydefault: ins.OnDup = OnDup(yyDollar[7].updateExprs) yyVAL.statement = ins } - case 41: + case 42: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:479 +//line sql.y:487 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -3899,328 +3943,328 @@ yydefault: } yyVAL.statement = &Insert{Action: yyDollar[1].str, Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, Table: yyDollar[4].tableName, Partitions: yyDollar[5].partitions, Columns: cols, Rows: Values{vals}, OnDup: OnDup(yyDollar[8].updateExprs)} } - case 42: + case 43: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:491 +//line sql.y:499 { yyVAL.str = InsertStr } - case 43: + case 44: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:495 +//line sql.y:503 { yyVAL.str = ReplaceStr } - case 44: + case 45: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:501 +//line sql.y:509 { yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, TableExprs: yyDollar[4].tableExprs, Exprs: yyDollar[6].updateExprs, Where: NewWhere(WhereStr, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } - case 45: + case 46: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:507 +//line sql.y:515 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Partitions: yyDollar[5].partitions, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} } - case 46: + case 47: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:511 +//line sql.y:519 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereStr, yyDollar[7].expr)} } - case 47: + case 48: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:515 +//line sql.y:523 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } - case 48: + case 49: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:519 +//line sql.y:527 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } - case 49: + case 50: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:524 +//line sql.y:532 { } - case 50: + case 51: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:525 +//line sql.y:533 { } - case 51: + case 52: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:529 +//line sql.y:537 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } - case 52: + case 53: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:533 +//line sql.y:541 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } - case 53: + case 54: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:539 +//line sql.y:547 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } - case 54: + case 55: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:543 +//line sql.y:551 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } - case 55: + case 56: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:548 +//line sql.y:556 { yyVAL.partitions = nil } - case 56: + case 57: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:552 +//line sql.y:560 { yyVAL.partitions = yyDollar[3].partitions } - case 57: + case 58: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:558 +//line sql.y:566 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } - case 58: + case 59: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:564 +//line sql.y:572 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Characteristics: yyDollar[5].characteristics} } - case 59: + case 60: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:568 +//line sql.y:576 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Characteristics: yyDollar[4].characteristics} } - case 60: + case 61: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:574 +//line sql.y:582 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } - case 61: + case 62: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:578 +//line sql.y:586 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } - case 62: + case 63: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:584 +//line sql.y:592 { yyVAL.characteristic = &IsolationLevel{Level: string(yyDollar[3].str)} } - case 63: + case 64: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:588 +//line sql.y:596 { yyVAL.characteristic = &AccessMode{Mode: TxReadWrite} } - case 64: + case 65: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:592 +//line sql.y:600 { yyVAL.characteristic = &AccessMode{Mode: TxReadOnly} } - case 65: + case 66: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:598 +//line sql.y:606 { yyVAL.str = RepeatableRead } - case 66: + case 67: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:602 +//line sql.y:610 { yyVAL.str = ReadCommitted } - case 67: + case 68: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:606 +//line sql.y:614 { yyVAL.str = ReadUncommitted } - case 68: + case 69: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:610 +//line sql.y:618 { yyVAL.str = Serializable } - case 69: + case 70: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:616 +//line sql.y:624 { yyVAL.str = SessionStr } - case 70: + case 71: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:620 +//line sql.y:628 { yyVAL.str = GlobalStr } - case 71: + case 72: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:626 +//line sql.y:634 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } - case 72: + case 73: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:631 +//line sql.y:639 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike yyVAL.statement = yyDollar[1].ddl } - case 73: + case 74: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:637 +//line sql.y:645 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName} } - case 74: + case 75: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:642 +//line sql.y:650 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[3].tableName.ToViewName()} } - case 75: + case 76: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:646 +//line sql.y:654 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[5].tableName.ToViewName()} } - case 76: + case 77: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:650 +//line sql.y:658 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } - case 77: + case 78: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:654 +//line sql.y:662 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } - case 78: + case 79: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:659 +//line sql.y:667 { yyVAL.colIdent = NewColIdent("") } - case 79: + case 80: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:663 +//line sql.y:671 { yyVAL.colIdent = yyDollar[2].colIdent } - case 80: + case 81: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:669 +//line sql.y:677 { yyVAL.colIdent = yyDollar[1].colIdent } - case 81: + case 82: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:674 +//line sql.y:682 { var v []VindexParam yyVAL.vindexParams = v } - case 82: + case 83: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:679 +//line sql.y:687 { yyVAL.vindexParams = yyDollar[2].vindexParams } - case 83: + case 84: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:685 +//line sql.y:693 { yyVAL.vindexParams = make([]VindexParam, 0, 4) yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) } - case 84: + case 85: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:690 +//line sql.y:698 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } - case 85: + case 86: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:696 +//line sql.y:704 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } - case 86: + case 87: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:702 +//line sql.y:710 { yyVAL.ddl = &DDL{Action: CreateStr, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } - case 87: + case 88: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:709 +//line sql.y:717 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } - case 88: + case 89: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:716 +//line sql.y:724 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } - case 89: + case 90: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:720 +//line sql.y:728 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } - case 90: + case 91: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:726 +//line sql.y:734 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } - case 91: + case 92: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:731 +//line sql.y:739 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } - case 92: + case 93: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:735 +//line sql.y:743 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } - case 93: + case 94: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:739 +//line sql.y:747 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } - case 94: + case 95: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:745 +//line sql.y:753 { yyDollar[2].columnType.NotNull = yyDollar[3].boolVal yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4230,92 +4274,84 @@ yydefault: yyDollar[2].columnType.Comment = yyDollar[8].sqlVal yyVAL.columnDefinition = &ColumnDefinition{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType} } - case 95: + case 96: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:756 +//line sql.y:764 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolVal yyVAL.columnType.Zerofill = yyDollar[3].boolVal } - case 99: + case 100: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:767 +//line sql.y:775 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].sqlVal } - case 100: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:772 - { - yyVAL.columnType = yyDollar[1].columnType - } case 101: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:778 +//line sql.y:780 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType = yyDollar[1].columnType } case 102: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:782 +//line sql.y:786 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 103: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:786 +//line sql.y:790 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 104: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:790 +//line sql.y:794 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:794 +//line sql.y:798 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:798 +//line sql.y:802 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:802 +//line sql.y:806 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:806 +//line sql.y:810 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:810 +//line sql.y:814 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:816 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:818 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 111: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:822 +//line sql.y:824 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4323,7 +4359,7 @@ yydefault: } case 112: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:828 +//line sql.y:830 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4331,7 +4367,7 @@ yydefault: } case 113: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:834 +//line sql.y:836 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4339,747 +4375,755 @@ yydefault: } case 114: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:840 +//line sql.y:842 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 115: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:848 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 116: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:852 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:856 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:856 +//line sql.y:860 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 118: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:860 +//line sql.y:864 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 119: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:864 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:868 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 120: - yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:870 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:872 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 121: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:874 +//line sql.y:878 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 122: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:878 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:882 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:882 +//line sql.y:886 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 124: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:886 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:890 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 125: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:890 +//line sql.y:894 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 126: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:894 +//line sql.y:898 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:898 +//line sql.y:902 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 128: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:902 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:906 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 129: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:906 +//line sql.y:910 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 130: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:910 +//line sql.y:914 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 131: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:914 +//line sql.y:918 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 132: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:918 +//line sql.y:922 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 133: - yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:922 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:926 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 134: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:927 +//line sql.y:930 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 135: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:933 + yyDollar = yyS[yypt-6 : yypt+1] +//line sql.y:935 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 136: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:937 +//line sql.y:941 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 137: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:941 +//line sql.y:945 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:945 +//line sql.y:949 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 139: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:949 +//line sql.y:953 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 140: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:953 +//line sql.y:957 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:957 +//line sql.y:961 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:961 +//line sql.y:965 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:967 +//line sql.y:969 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 144: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:975 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") } - case 144: + case 145: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:972 +//line sql.y:980 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } - case 145: + case 146: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:977 +//line sql.y:985 { yyVAL.sqlVal = nil } - case 146: + case 147: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:981 +//line sql.y:989 { yyVAL.sqlVal = NewIntVal(yyDollar[2].bytes) } - case 147: + case 148: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:986 +//line sql.y:994 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 148: + case 149: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:990 +//line sql.y:998 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), Scale: NewIntVal(yyDollar[4].bytes), } } - case 149: + case 150: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:998 +//line sql.y:1006 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 150: + case 151: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1002 +//line sql.y:1010 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), } } - case 151: + case 152: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1008 +//line sql.y:1016 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), Scale: NewIntVal(yyDollar[4].bytes), } } - case 152: + case 153: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1016 +//line sql.y:1024 { yyVAL.boolVal = BoolVal(false) } - case 153: + case 154: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1020 +//line sql.y:1028 { yyVAL.boolVal = BoolVal(true) } - case 154: + case 155: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1025 +//line sql.y:1033 { yyVAL.boolVal = BoolVal(false) } - case 155: + case 156: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1029 +//line sql.y:1037 { yyVAL.boolVal = BoolVal(true) } - case 156: + case 157: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1035 +//line sql.y:1043 { yyVAL.boolVal = BoolVal(false) } - case 157: + case 158: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1039 +//line sql.y:1047 { yyVAL.boolVal = BoolVal(false) } - case 158: + case 159: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1043 +//line sql.y:1051 { yyVAL.boolVal = BoolVal(true) } - case 159: + case 160: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1048 +//line sql.y:1056 { yyVAL.optVal = nil } - case 160: + case 161: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1052 +//line sql.y:1060 { yyVAL.optVal = yyDollar[2].expr } - case 161: + case 162: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1057 +//line sql.y:1065 { yyVAL.optVal = nil } - case 162: + case 163: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1061 +//line sql.y:1069 { yyVAL.optVal = yyDollar[3].expr } - case 163: + case 164: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1066 +//line sql.y:1074 { yyVAL.boolVal = BoolVal(false) } - case 164: + case 165: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1070 +//line sql.y:1078 { yyVAL.boolVal = BoolVal(true) } - case 165: + case 166: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1075 +//line sql.y:1083 { yyVAL.str = "" } - case 166: + case 167: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1079 +//line sql.y:1087 { yyVAL.str = string(yyDollar[3].colIdent.String()) } - case 167: + case 168: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1083 +//line sql.y:1091 { yyVAL.str = string(yyDollar[3].bytes) } - case 168: + case 169: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1088 +//line sql.y:1096 { yyVAL.str = "" } - case 169: + case 170: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1092 +//line sql.y:1100 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 170: + case 171: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1096 +//line sql.y:1104 { yyVAL.str = string(yyDollar[2].bytes) } - case 171: + case 172: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1101 +//line sql.y:1109 { yyVAL.colKeyOpt = colKeyNone } - case 172: + case 173: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1105 +//line sql.y:1113 { yyVAL.colKeyOpt = colKeyPrimary } - case 173: + case 174: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1109 +//line sql.y:1117 { yyVAL.colKeyOpt = colKey } - case 174: + case 175: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1113 +//line sql.y:1121 { yyVAL.colKeyOpt = colKeyUniqueKey } - case 175: + case 176: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1117 +//line sql.y:1125 { yyVAL.colKeyOpt = colKeyUnique } - case 176: + case 177: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1122 +//line sql.y:1130 { yyVAL.sqlVal = nil } - case 177: + case 178: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1126 +//line sql.y:1134 { yyVAL.sqlVal = NewStrVal(yyDollar[2].bytes) } - case 178: + case 179: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1132 +//line sql.y:1140 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} } - case 179: + case 180: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1136 +//line sql.y:1144 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } - case 180: + case 181: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1142 +//line sql.y:1150 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } - case 181: + case 182: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1146 +//line sql.y:1154 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } - case 182: + case 183: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1152 +//line sql.y:1160 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].colIdent.String())} } - case 183: + case 184: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1156 +//line sql.y:1164 { // should not be string yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntVal(yyDollar[3].bytes)} } - case 184: + case 185: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1161 +//line sql.y:1169 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrVal(yyDollar[2].bytes)} } - case 185: + case 186: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1167 +//line sql.y:1175 { yyVAL.str = "" } - case 186: + case 187: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1171 +//line sql.y:1179 { yyVAL.str = string(yyDollar[1].bytes) } - case 187: + case 188: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1177 +//line sql.y:1185 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } - case 188: + case 189: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1181 +//line sql.y:1189 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } - case 189: + case 190: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1185 +//line sql.y:1193 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Unique: true} } - case 190: + case 191: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1189 +//line sql.y:1197 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(yyDollar[2].str), Unique: true} } - case 191: + case 192: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1193 +//line sql.y:1201 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } - case 192: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1199 - { - yyVAL.str = string(yyDollar[1].bytes) - } case 193: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1203 +//line sql.y:1207 { yyVAL.str = string(yyDollar[1].bytes) } case 194: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1207 +//line sql.y:1211 { yyVAL.str = string(yyDollar[1].bytes) } case 195: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1214 +//line sql.y:1215 { yyVAL.str = string(yyDollar[1].bytes) } case 196: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1218 +//line sql.y:1222 { yyVAL.str = string(yyDollar[1].bytes) } case 197: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1224 +//line sql.y:1226 { yyVAL.str = string(yyDollar[1].bytes) } case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1228 +//line sql.y:1232 { yyVAL.str = string(yyDollar[1].bytes) } case 199: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1236 + { + yyVAL.str = string(yyDollar[1].bytes) + } + case 200: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1233 +//line sql.y:1241 { yyVAL.str = "" } - case 200: + case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1237 +//line sql.y:1245 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 201: + case 202: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1243 +//line sql.y:1251 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } - case 202: + case 203: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1247 +//line sql.y:1255 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } - case 203: + case 204: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1253 +//line sql.y:1261 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].sqlVal} } - case 204: + case 205: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1259 +//line sql.y:1267 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } - case 205: + case 206: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1263 +//line sql.y:1271 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } - case 206: + case 207: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1270 +//line sql.y:1278 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns} } - case 207: + case 208: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1274 +//line sql.y:1282 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction} } - case 208: + case 209: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1278 +//line sql.y:1286 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnUpdate: yyDollar[11].ReferenceAction} } - case 209: + case 210: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1282 +//line sql.y:1290 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction, OnUpdate: yyDollar[12].ReferenceAction} } - case 210: + case 211: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1288 +//line sql.y:1296 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } - case 211: + case 212: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1294 +//line sql.y:1302 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } - case 212: + case 213: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1300 +//line sql.y:1308 { yyVAL.ReferenceAction = Restrict } - case 213: + case 214: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1304 +//line sql.y:1312 { yyVAL.ReferenceAction = Cascade } - case 214: + case 215: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1308 +//line sql.y:1316 { yyVAL.ReferenceAction = NoAction } - case 215: + case 216: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1312 +//line sql.y:1320 { yyVAL.ReferenceAction = SetDefault } - case 216: + case 217: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1316 +//line sql.y:1324 { yyVAL.ReferenceAction = SetNull } - case 217: + case 218: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1321 +//line sql.y:1329 { yyVAL.str = "" } - case 218: + case 219: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1325 +//line sql.y:1333 { yyVAL.str = " " + string(yyDollar[1].str) } - case 219: + case 220: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1329 +//line sql.y:1337 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } - case 220: + case 221: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1337 +//line sql.y:1345 { yyVAL.str = yyDollar[1].str } - case 221: + case 222: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1341 +//line sql.y:1349 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } - case 222: + case 223: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1345 +//line sql.y:1353 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } - case 223: + case 224: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1351 +//line sql.y:1359 { yyVAL.str = yyDollar[1].colIdent.String() } - case 224: + case 225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1355 +//line sql.y:1363 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } - case 225: + case 226: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1359 +//line sql.y:1367 { yyVAL.str = string(yyDollar[1].bytes) } - case 226: + case 227: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1365 +//line sql.y:1373 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 227: + case 228: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1369 +//line sql.y:1377 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 228: + case 229: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1373 +//line sql.y:1381 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 229: + case 230: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1377 +//line sql.y:1385 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[4].tableName}, ToTables: TableNames{yyDollar[7].tableName}} } - case 230: + case 231: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1382 +//line sql.y:1390 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 231: + case 232: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1387 +//line sql.y:1395 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName()} } - case 232: + case 233: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1391 +//line sql.y:1399 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } - case 233: + case 234: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1395 +//line sql.y:1403 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } - case 234: + case 235: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1399 +//line sql.y:1407 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } - case 235: + case 236: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1403 +//line sql.y:1411 { yyVAL.statement = &DDL{ Action: CreateVindexStr, @@ -5091,9 +5135,9 @@ yydefault: }, } } - case 236: + case 237: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1415 +//line sql.y:1423 { yyVAL.statement = &DDL{ Action: DropVindexStr, @@ -5103,21 +5147,21 @@ yydefault: }, } } - case 237: + case 238: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1425 +//line sql.y:1433 { yyVAL.statement = &DDL{Action: AddVschemaTableStr, Table: yyDollar[5].tableName} } - case 238: + case 239: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1429 +//line sql.y:1437 { yyVAL.statement = &DDL{Action: DropVschemaTableStr, Table: yyDollar[5].tableName} } - case 239: + case 240: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1433 +//line sql.y:1441 { yyVAL.statement = &DDL{ Action: AddColVindexStr, @@ -5130,9 +5174,9 @@ yydefault: VindexCols: yyDollar[9].columns, } } - case 240: + case 241: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1446 +//line sql.y:1454 { yyVAL.statement = &DDL{ Action: DropColVindexStr, @@ -5142,15 +5186,15 @@ yydefault: }, } } - case 241: + case 242: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1456 +//line sql.y:1464 { yyVAL.statement = &DDL{Action: AddSequenceStr, Table: yyDollar[5].tableName} } - case 242: + case 243: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1460 +//line sql.y:1468 { yyVAL.statement = &DDL{ Action: AddAutoIncStr, @@ -5161,59 +5205,59 @@ yydefault: }, } } - case 257: + case 258: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1489 +//line sql.y:1497 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeStr, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } - case 258: + case 259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1495 +//line sql.y:1503 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } - case 259: + case 260: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1499 +//line sql.y:1507 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } - case 260: + case 261: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1505 +//line sql.y:1513 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } - case 261: + case 262: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1509 +//line sql.y:1517 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } - case 262: + case 263: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1515 +//line sql.y:1523 { yyVAL.statement = yyDollar[3].ddl } - case 263: + case 264: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1521 +//line sql.y:1529 { yyVAL.ddl = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[1].tableName}, ToTables: TableNames{yyDollar[3].tableName}} } - case 264: + case 265: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1525 +//line sql.y:1533 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) yyVAL.ddl.ToTables = append(yyVAL.ddl.ToTables, yyDollar[5].tableName) } - case 265: + case 266: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1533 +//line sql.y:1541 { var exists bool if yyDollar[3].byt != 0 { @@ -5221,16 +5265,16 @@ yydefault: } yyVAL.statement = &DDL{Action: DropStr, FromTables: yyDollar[4].tableNames, IfExists: exists} } - case 266: + case 267: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1541 +//line sql.y:1549 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName} } - case 267: + case 268: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1546 +//line sql.y:1554 { var exists bool if yyDollar[3].byt != 0 { @@ -5238,145 +5282,145 @@ yydefault: } yyVAL.statement = &DDL{Action: DropStr, FromTables: TableNames{yyDollar[4].tableName.ToViewName()}, IfExists: exists} } - case 268: + case 269: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1554 +//line sql.y:1562 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } - case 269: + case 270: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1558 +//line sql.y:1566 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } - case 270: + case 271: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1564 +//line sql.y:1572 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[3].tableName} } - case 271: + case 272: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1568 +//line sql.y:1576 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[2].tableName} } - case 272: + case 273: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1573 +//line sql.y:1581 { yyVAL.statement = &OtherRead{} } - case 273: + case 274: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1579 +//line sql.y:1587 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } - case 274: + case 275: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1584 +//line sql.y:1592 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Type: CharsetStr, ShowTablesOpt: showTablesOpt} } - case 275: + case 276: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1589 +//line sql.y:1597 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt} } - case 276: + case 277: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1594 +//line sql.y:1602 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 277: + case 278: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1599 +//line sql.y:1607 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } - case 278: + case 279: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1603 +//line sql.y:1611 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 279: + case 280: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1607 +//line sql.y:1615 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName} } - case 280: + case 281: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1611 +//line sql.y:1619 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 281: + case 282: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1615 +//line sql.y:1623 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 282: + case 283: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1619 +//line sql.y:1627 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 283: + case 284: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1623 +//line sql.y:1631 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 284: + case 285: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1627 +//line sql.y:1635 { showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } - case 285: + case 286: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1632 +//line sql.y:1640 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 286: + case 287: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1636 +//line sql.y:1644 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 287: + case 288: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1640 +//line sql.y:1648 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } - case 288: + case 289: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1644 +//line sql.y:1652 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 289: + case 290: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1648 +//line sql.y:1656 { showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } - case 290: + case 291: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1653 +//line sql.y:1661 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5386,805 +5430,805 @@ yydefault: yyVAL.statement = &Show{Type: yyDollar[3].str, ShowTablesOpt: showTablesOpt} } } - case 291: + case 292: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1663 +//line sql.y:1671 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } - case 292: + case 293: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1667 +//line sql.y:1675 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 293: + case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1671 +//line sql.y:1679 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowCollationFilterOpt: yyDollar[4].expr} } - case 294: + case 295: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1675 +//line sql.y:1683 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Scope: string(yyDollar[2].bytes), Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt} } - case 295: + case 296: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1680 +//line sql.y:1688 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 296: + case 297: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1684 +//line sql.y:1692 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 297: + case 298: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1688 +//line sql.y:1696 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName} } - case 298: + case 299: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1692 +//line sql.y:1700 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 299: + case 300: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1706 +//line sql.y:1714 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String())} } - case 300: + case 301: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1712 +//line sql.y:1720 { yyVAL.str = string(yyDollar[1].bytes) } - case 301: + case 302: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1716 +//line sql.y:1724 { yyVAL.str = string(yyDollar[1].bytes) } - case 302: + case 303: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1722 +//line sql.y:1730 { yyVAL.str = "" } - case 303: + case 304: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1726 +//line sql.y:1734 { yyVAL.str = "extended " } - case 304: + case 305: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1732 +//line sql.y:1740 { yyVAL.str = "" } - case 305: + case 306: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1736 +//line sql.y:1744 { yyVAL.str = "full " } - case 306: + case 307: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1742 +//line sql.y:1750 { yyVAL.str = string(yyDollar[1].bytes) } - case 307: + case 308: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1746 +//line sql.y:1754 { yyVAL.str = string(yyDollar[1].bytes) } - case 308: + case 309: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1752 +//line sql.y:1760 { yyVAL.str = "" } - case 309: + case 310: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1756 +//line sql.y:1764 { yyVAL.str = yyDollar[2].tableIdent.v } - case 310: + case 311: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1760 +//line sql.y:1768 { yyVAL.str = yyDollar[2].tableIdent.v } - case 311: + case 312: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1766 +//line sql.y:1774 { yyVAL.showFilter = nil } - case 312: + case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1770 +//line sql.y:1778 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } - case 313: + case 314: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1774 +//line sql.y:1782 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } - case 314: + case 315: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1780 +//line sql.y:1788 { yyVAL.showFilter = nil } - case 315: + case 316: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1784 +//line sql.y:1792 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } - case 316: + case 317: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1790 +//line sql.y:1798 { yyVAL.str = "" } - case 317: + case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1794 +//line sql.y:1802 { yyVAL.str = SessionStr } - case 318: + case 319: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1798 +//line sql.y:1806 { yyVAL.str = GlobalStr } - case 319: + case 320: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1804 +//line sql.y:1812 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } - case 320: + case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1808 +//line sql.y:1816 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } - case 321: + case 322: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1814 +//line sql.y:1822 { yyVAL.statement = &Begin{} } - case 322: + case 323: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1818 +//line sql.y:1826 { yyVAL.statement = &Begin{} } - case 323: + case 324: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1824 +//line sql.y:1832 { yyVAL.statement = &Commit{} } - case 324: + case 325: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1830 +//line sql.y:1838 { yyVAL.statement = &Rollback{} } - case 325: + case 326: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1835 +//line sql.y:1843 { yyVAL.str = "" } - case 326: + case 327: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1839 +//line sql.y:1847 { yyVAL.str = JSONStr } - case 327: + case 328: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1843 +//line sql.y:1851 { yyVAL.str = TreeStr } - case 328: + case 329: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1847 +//line sql.y:1855 { yyVAL.str = VitessStr } - case 329: + case 330: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1851 +//line sql.y:1859 { yyVAL.str = TraditionalStr } - case 330: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1855 - { - yyVAL.str = AnalyzeStr - } case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1861 +//line sql.y:1863 { - yyVAL.bytes = yyDollar[1].bytes + yyVAL.str = AnalyzeStr } case 332: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1865 +//line sql.y:1869 { yyVAL.bytes = yyDollar[1].bytes } case 333: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1869 +//line sql.y:1873 { yyVAL.bytes = yyDollar[1].bytes } case 334: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1875 +//line sql.y:1877 { - yyVAL.statement = yyDollar[1].selStmt + yyVAL.bytes = yyDollar[1].bytes } case 335: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1879 +//line sql.y:1883 { - yyVAL.statement = yyDollar[1].statement + yyVAL.statement = yyDollar[1].selStmt } case 336: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1883 +//line sql.y:1887 { yyVAL.statement = yyDollar[1].statement } case 337: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1887 +//line sql.y:1891 { yyVAL.statement = yyDollar[1].statement } case 338: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1892 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1895 { - yyVAL.str = "" + yyVAL.statement = yyDollar[1].statement } case 339: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1896 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:1900 { yyVAL.str = "" } case 340: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1900 +//line sql.y:1904 { yyVAL.str = "" } case 341: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1906 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1908 { - yyVAL.statement = &OtherRead{} + yyVAL.str = "" } case 342: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1910 +//line sql.y:1914 { - yyVAL.statement = &Explain{Type: yyDollar[2].str, Statement: yyDollar[3].statement} + yyVAL.statement = &OtherRead{} } case 343: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1916 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:1918 { - yyVAL.statement = &OtherAdmin{} + yyVAL.statement = &Explain{Type: yyDollar[2].str, Statement: yyDollar[3].statement} } case 344: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1920 +//line sql.y:1924 { yyVAL.statement = &OtherAdmin{} } case 345: - yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1924 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1928 { yyVAL.statement = &OtherAdmin{} } case 346: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1928 +//line sql.y:1932 { yyVAL.statement = &OtherAdmin{} } case 347: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1934 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:1936 { - yyVAL.statement = &DDL{Action: FlushStr} + yyVAL.statement = &OtherAdmin{} } case 348: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1942 + { + yyVAL.statement = &DDL{Action: FlushStr} + } + case 349: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1938 +//line sql.y:1946 { setAllowComments(yylex, true) } - case 349: + case 350: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1942 +//line sql.y:1950 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } - case 350: + case 351: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1948 +//line sql.y:1956 { yyVAL.bytes2 = nil } - case 351: + case 352: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1952 +//line sql.y:1960 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } - case 352: + case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1958 +//line sql.y:1966 { yyVAL.str = UnionStr } - case 353: + case 354: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1962 +//line sql.y:1970 { yyVAL.str = UnionAllStr } - case 354: + case 355: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1966 +//line sql.y:1974 { yyVAL.str = UnionDistinctStr } - case 355: + case 356: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1971 +//line sql.y:1979 { yyVAL.str = "" } - case 356: + case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1975 +//line sql.y:1983 { yyVAL.str = SQLNoCacheStr } - case 357: + case 358: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1979 +//line sql.y:1987 { yyVAL.str = SQLCacheStr } - case 358: + case 359: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1984 +//line sql.y:1992 { yyVAL.str = "" } - case 359: + case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1988 +//line sql.y:1996 { yyVAL.str = DistinctStr } - case 360: + case 361: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1992 +//line sql.y:2000 { yyVAL.str = DistinctStr } - case 361: + case 362: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1997 +//line sql.y:2005 { yyVAL.selectExprs = nil } - case 362: + case 363: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2001 +//line sql.y:2009 { yyVAL.selectExprs = yyDollar[1].selectExprs } - case 363: + case 364: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2006 +//line sql.y:2014 { yyVAL.strs = nil } - case 364: + case 365: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2010 +//line sql.y:2018 { yyVAL.strs = []string{yyDollar[1].str} } - case 365: + case 366: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2014 +//line sql.y:2022 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } - case 366: + case 367: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2018 +//line sql.y:2026 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 367: + case 368: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2022 +//line sql.y:2030 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 368: + case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2028 +//line sql.y:2036 { yyVAL.str = SQLNoCacheStr } - case 369: + case 370: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2032 +//line sql.y:2040 { yyVAL.str = SQLCacheStr } - case 370: + case 371: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2036 +//line sql.y:2044 { yyVAL.str = DistinctStr } - case 371: + case 372: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2040 +//line sql.y:2048 { yyVAL.str = DistinctStr } - case 372: + case 373: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2044 +//line sql.y:2052 { yyVAL.str = StraightJoinHint } - case 373: + case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2048 +//line sql.y:2056 { yyVAL.str = SQLCalcFoundRowsStr } - case 374: + case 375: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2054 +//line sql.y:2062 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } - case 375: + case 376: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2058 +//line sql.y:2066 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } - case 376: + case 377: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2064 +//line sql.y:2072 { yyVAL.selectExpr = &StarExpr{} } - case 377: + case 378: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2068 +//line sql.y:2076 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } - case 378: + case 379: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2072 +//line sql.y:2080 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } - case 379: + case 380: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2076 +//line sql.y:2084 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } - case 380: + case 381: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2081 +//line sql.y:2089 { yyVAL.colIdent = ColIdent{} } - case 381: + case 382: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2085 +//line sql.y:2093 { yyVAL.colIdent = yyDollar[1].colIdent } - case 382: + case 383: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2089 +//line sql.y:2097 { yyVAL.colIdent = yyDollar[2].colIdent } - case 384: + case 385: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2096 +//line sql.y:2104 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 385: + case 386: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2101 +//line sql.y:2109 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } - case 386: + case 387: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2105 +//line sql.y:2113 { yyVAL.tableExprs = yyDollar[2].tableExprs } - case 387: + case 388: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2111 +//line sql.y:2119 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } - case 388: + case 389: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2115 +//line sql.y:2123 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } - case 391: + case 392: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2125 +//line sql.y:2133 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } - case 392: + case 393: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2129 +//line sql.y:2137 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } - case 393: + case 394: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2133 +//line sql.y:2141 { // missed alias for subquery yylex.Error("Every derived table must have its own alias") return 1 } - case 394: + case 395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2139 +//line sql.y:2147 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } - case 395: + case 396: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2145 +//line sql.y:2153 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } - case 396: + case 397: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2149 +//line sql.y:2157 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } - case 397: + case 398: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2155 +//line sql.y:2163 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 398: + case 399: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2159 +//line sql.y:2167 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 399: + case 400: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2165 +//line sql.y:2173 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } - case 400: + case 401: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2169 +//line sql.y:2177 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } - case 401: + case 402: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2182 +//line sql.y:2190 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 402: + case 403: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2186 +//line sql.y:2194 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 403: + case 404: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2190 +//line sql.y:2198 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 404: + case 405: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2194 +//line sql.y:2202 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } - case 405: + case 406: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2200 +//line sql.y:2208 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 406: + case 407: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2202 +//line sql.y:2210 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } - case 407: + case 408: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2206 +//line sql.y:2214 { yyVAL.joinCondition = JoinCondition{} } - case 408: + case 409: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2208 +//line sql.y:2216 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 409: + case 410: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2212 +//line sql.y:2220 { yyVAL.joinCondition = JoinCondition{} } - case 410: + case 411: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2214 +//line sql.y:2222 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 411: + case 412: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2217 +//line sql.y:2225 { yyVAL.empty = struct{}{} } - case 412: + case 413: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2219 +//line sql.y:2227 { yyVAL.empty = struct{}{} } - case 413: + case 414: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2222 +//line sql.y:2230 { yyVAL.tableIdent = NewTableIdent("") } - case 414: + case 415: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2226 +//line sql.y:2234 { yyVAL.tableIdent = yyDollar[1].tableIdent } - case 415: + case 416: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2230 +//line sql.y:2238 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 417: + case 418: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2237 +//line sql.y:2245 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 418: + case 419: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2243 +//line sql.y:2251 { yyVAL.str = JoinStr } - case 419: + case 420: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2247 +//line sql.y:2255 { yyVAL.str = JoinStr } - case 420: + case 421: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2251 +//line sql.y:2259 { yyVAL.str = JoinStr } - case 421: + case 422: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2257 +//line sql.y:2265 { yyVAL.str = StraightJoinStr } - case 422: + case 423: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2263 +//line sql.y:2271 { yyVAL.str = LeftJoinStr } - case 423: + case 424: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2267 +//line sql.y:2275 { yyVAL.str = LeftJoinStr } - case 424: + case 425: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2271 +//line sql.y:2279 { yyVAL.str = RightJoinStr } - case 425: + case 426: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2275 +//line sql.y:2283 { yyVAL.str = RightJoinStr } - case 426: + case 427: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2281 +//line sql.y:2289 { yyVAL.str = NaturalJoinStr } - case 427: + case 428: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2285 +//line sql.y:2293 { if yyDollar[2].str == LeftJoinStr { yyVAL.str = NaturalLeftJoinStr @@ -6192,483 +6236,483 @@ yydefault: yyVAL.str = NaturalRightJoinStr } } - case 428: + case 429: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2295 +//line sql.y:2303 { yyVAL.tableName = yyDollar[2].tableName } - case 429: + case 430: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2299 +//line sql.y:2307 { yyVAL.tableName = yyDollar[1].tableName } - case 430: + case 431: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2305 +//line sql.y:2313 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 431: + case 432: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2309 +//line sql.y:2317 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } - case 432: + case 433: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2315 +//line sql.y:2323 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 433: + case 434: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2320 +//line sql.y:2328 { yyVAL.indexHints = nil } - case 434: + case 435: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2324 +//line sql.y:2332 { yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].columns} } - case 435: + case 436: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2328 +//line sql.y:2336 { yyVAL.indexHints = &IndexHints{Type: UseStr} } - case 436: + case 437: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2332 +//line sql.y:2340 { yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].columns} } - case 437: + case 438: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2336 +//line sql.y:2344 { yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].columns} } - case 438: + case 439: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2341 +//line sql.y:2349 { yyVAL.expr = nil } - case 439: + case 440: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2345 +//line sql.y:2353 { yyVAL.expr = yyDollar[2].expr } - case 440: + case 441: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2351 +//line sql.y:2359 { yyVAL.expr = yyDollar[1].expr } - case 441: + case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2355 +//line sql.y:2363 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 442: + case 443: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2359 +//line sql.y:2367 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 443: + case 444: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2363 +//line sql.y:2371 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } - case 444: + case 445: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2367 +//line sql.y:2375 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } - case 445: + case 446: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2371 +//line sql.y:2379 { yyVAL.expr = yyDollar[1].expr } - case 446: + case 447: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2375 +//line sql.y:2383 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } - case 447: + case 448: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2381 +//line sql.y:2389 { yyVAL.str = "" } - case 448: + case 449: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2385 +//line sql.y:2393 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 449: + case 450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2391 +//line sql.y:2399 { yyVAL.boolVal = BoolVal(true) } - case 450: + case 451: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2395 +//line sql.y:2403 { yyVAL.boolVal = BoolVal(false) } - case 451: + case 452: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2401 +//line sql.y:2409 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } - case 452: + case 453: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2405 +//line sql.y:2413 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } - case 453: + case 454: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2409 +//line sql.y:2417 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } - case 454: + case 455: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2413 +//line sql.y:2421 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } - case 455: + case 456: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2417 +//line sql.y:2425 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } - case 456: + case 457: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2421 +//line sql.y:2429 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } - case 457: + case 458: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2425 +//line sql.y:2433 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } - case 458: + case 459: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2429 +//line sql.y:2437 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } - case 459: + case 460: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2433 +//line sql.y:2441 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } - case 460: + case 461: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2437 +//line sql.y:2445 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } - case 461: + case 462: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2443 +//line sql.y:2451 { yyVAL.str = IsNullStr } - case 462: + case 463: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2447 +//line sql.y:2455 { yyVAL.str = IsNotNullStr } - case 463: + case 464: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2451 +//line sql.y:2459 { yyVAL.str = IsTrueStr } - case 464: + case 465: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2455 +//line sql.y:2463 { yyVAL.str = IsNotTrueStr } - case 465: + case 466: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2459 +//line sql.y:2467 { yyVAL.str = IsFalseStr } - case 466: + case 467: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2463 +//line sql.y:2471 { yyVAL.str = IsNotFalseStr } - case 467: + case 468: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2469 +//line sql.y:2477 { yyVAL.str = EqualStr } - case 468: + case 469: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2473 +//line sql.y:2481 { yyVAL.str = LessThanStr } - case 469: + case 470: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2477 +//line sql.y:2485 { yyVAL.str = GreaterThanStr } - case 470: + case 471: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2481 +//line sql.y:2489 { yyVAL.str = LessEqualStr } - case 471: + case 472: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2485 +//line sql.y:2493 { yyVAL.str = GreaterEqualStr } - case 472: + case 473: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2489 +//line sql.y:2497 { yyVAL.str = NotEqualStr } - case 473: + case 474: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2493 +//line sql.y:2501 { yyVAL.str = NullSafeEqualStr } - case 474: + case 475: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2498 +//line sql.y:2506 { yyVAL.expr = nil } - case 475: + case 476: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2502 +//line sql.y:2510 { yyVAL.expr = yyDollar[2].expr } - case 476: + case 477: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2508 +//line sql.y:2516 { yyVAL.colTuple = yyDollar[1].valTuple } - case 477: + case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2512 +//line sql.y:2520 { yyVAL.colTuple = yyDollar[1].subquery } - case 478: + case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2516 +//line sql.y:2524 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } - case 479: + case 480: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2522 +//line sql.y:2530 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } - case 480: + case 481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2528 +//line sql.y:2536 { yyVAL.exprs = Exprs{yyDollar[1].expr} } - case 481: + case 482: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2532 +//line sql.y:2540 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } - case 482: + case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2538 +//line sql.y:2546 { yyVAL.expr = yyDollar[1].expr } - case 483: + case 484: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2542 +//line sql.y:2550 { yyVAL.expr = yyDollar[1].boolVal } - case 484: + case 485: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2546 +//line sql.y:2554 { yyVAL.expr = yyDollar[1].colName } - case 485: + case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2550 +//line sql.y:2558 { yyVAL.expr = yyDollar[1].expr } - case 486: + case 487: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2554 +//line sql.y:2562 { yyVAL.expr = yyDollar[1].subquery } - case 487: + case 488: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2558 +//line sql.y:2566 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } - case 488: + case 489: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2562 +//line sql.y:2570 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } - case 489: + case 490: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2566 +//line sql.y:2574 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } - case 490: + case 491: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2570 +//line sql.y:2578 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } - case 491: + case 492: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2574 +//line sql.y:2582 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } - case 492: + case 493: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2578 +//line sql.y:2586 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } - case 493: + case 494: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2582 +//line sql.y:2590 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } - case 494: + case 495: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2586 +//line sql.y:2594 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } - case 495: + case 496: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2590 +//line sql.y:2598 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 496: + case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2594 +//line sql.y:2602 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 497: + case 498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2598 +//line sql.y:2606 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } - case 498: + case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2602 +//line sql.y:2610 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } - case 499: + case 500: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2606 +//line sql.y:2614 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } - case 500: + case 501: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2610 +//line sql.y:2618 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } - case 501: + case 502: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2614 +//line sql.y:2622 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } - case 502: + case 503: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2618 +//line sql.y:2626 { yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} } - case 503: + case 504: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2622 +//line sql.y:2630 { yyVAL.expr = &UnaryExpr{Operator: UBinaryStr, Expr: yyDollar[2].expr} } - case 504: + case 505: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2626 +//line sql.y:2634 { yyVAL.expr = &UnaryExpr{Operator: Utf8Str, Expr: yyDollar[2].expr} } - case 505: + case 506: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2630 +//line sql.y:2638 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Str, Expr: yyDollar[2].expr} } - case 506: + case 507: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2634 +//line sql.y:2642 { yyVAL.expr = &UnaryExpr{Operator: Latin1Str, Expr: yyDollar[2].expr} } - case 507: + case 508: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2638 +//line sql.y:2646 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6676,9 +6720,9 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UPlusStr, Expr: yyDollar[2].expr} } } - case 508: + case 509: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2646 +//line sql.y:2654 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -6692,21 +6736,21 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UMinusStr, Expr: yyDollar[2].expr} } } - case 509: + case 510: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2660 +//line sql.y:2668 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } - case 510: + case 511: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2664 +//line sql.y:2672 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } - case 511: + case 512: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2668 +//line sql.y:2676 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6714,497 +6758,497 @@ yydefault: // will be non-trivial because of grammar conflicts. yyVAL.expr = &IntervalExpr{Expr: yyDollar[2].expr, Unit: yyDollar[3].colIdent.String()} } - case 516: + case 517: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2686 +//line sql.y:2694 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } - case 517: + case 518: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2690 +//line sql.y:2698 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 518: + case 519: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2694 +//line sql.y:2702 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 519: + case 520: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2698 +//line sql.y:2706 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } - case 520: + case 521: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2708 +//line sql.y:2716 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } - case 521: + case 522: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2712 +//line sql.y:2720 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } - case 522: + case 523: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2716 +//line sql.y:2724 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 523: + case 524: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2720 +//line sql.y:2728 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 524: + case 525: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2724 +//line sql.y:2732 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } - case 525: + case 526: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2728 +//line sql.y:2736 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 526: + case 527: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2732 +//line sql.y:2740 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 527: + case 528: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2736 +//line sql.y:2744 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 528: + case 529: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2740 +//line sql.y:2748 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 529: + case 530: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:2744 +//line sql.y:2752 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].str} } - case 530: + case 531: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2748 +//line sql.y:2756 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } - case 531: + case 532: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2752 +//line sql.y:2760 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } - case 532: + case 533: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2756 +//line sql.y:2764 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } - case 533: + case 534: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2766 +//line sql.y:2774 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } - case 534: + case 535: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2770 +//line sql.y:2778 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } - case 535: + case 536: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2774 +//line sql.y:2782 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } - case 536: + case 537: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2779 +//line sql.y:2787 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } - case 537: + case 538: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2784 +//line sql.y:2792 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } - case 538: + case 539: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2789 +//line sql.y:2797 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } - case 539: + case 540: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2795 +//line sql.y:2803 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } - case 540: + case 541: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2800 +//line sql.y:2808 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } - case 541: + case 542: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2805 +//line sql.y:2813 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } - case 542: + case 543: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2809 +//line sql.y:2817 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } - case 543: + case 544: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2813 +//line sql.y:2821 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } - case 544: + case 545: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2818 +//line sql.y:2826 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } - case 545: + case 546: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2823 +//line sql.y:2831 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } - case 546: + case 547: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2828 +//line sql.y:2836 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } - case 547: + case 548: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2832 +//line sql.y:2840 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 548: + case 549: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2836 +//line sql.y:2844 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 551: + case 552: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2846 +//line sql.y:2854 { yyVAL.expr = yyDollar[2].expr } - case 552: + case 553: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2856 +//line sql.y:2864 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } - case 553: + case 554: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2860 +//line sql.y:2868 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } - case 554: + case 555: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2864 +//line sql.y:2872 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } - case 555: + case 556: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2868 +//line sql.y:2876 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } - case 556: + case 557: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2872 +//line sql.y:2880 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } - case 557: + case 558: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2876 +//line sql.y:2884 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 558: + case 559: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2880 +//line sql.y:2888 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 559: + case 560: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2886 +//line sql.y:2894 { yyVAL.str = "" } - case 560: + case 561: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2890 +//line sql.y:2898 { yyVAL.str = BooleanModeStr } - case 561: + case 562: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2894 +//line sql.y:2902 { yyVAL.str = NaturalLanguageModeStr } - case 562: + case 563: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2898 +//line sql.y:2906 { yyVAL.str = NaturalLanguageModeWithQueryExpansionStr } - case 563: + case 564: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2902 +//line sql.y:2910 { yyVAL.str = QueryExpansionStr } - case 564: + case 565: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2908 +//line sql.y:2916 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 565: + case 566: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2912 +//line sql.y:2920 { yyVAL.str = string(yyDollar[1].bytes) } - case 566: + case 567: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2918 +//line sql.y:2926 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 567: + case 568: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2922 +//line sql.y:2930 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Operator: CharacterSetStr} } - case 568: + case 569: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2926 +//line sql.y:2934 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: string(yyDollar[3].colIdent.String())} } - case 569: + case 570: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2930 +//line sql.y:2938 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 570: + case 571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2934 +//line sql.y:2942 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 571: + case 572: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2938 +//line sql.y:2946 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.convertType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 572: + case 573: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2944 +//line sql.y:2952 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 573: + case 574: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2948 +//line sql.y:2956 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 574: + case 575: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2952 +//line sql.y:2960 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 575: + case 576: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2956 +//line sql.y:2964 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 576: + case 577: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2960 +//line sql.y:2968 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 577: + case 578: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2964 +//line sql.y:2972 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 578: + case 579: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2968 +//line sql.y:2976 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 579: + case 580: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2973 +//line sql.y:2981 { yyVAL.expr = nil } - case 580: + case 581: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2977 +//line sql.y:2985 { yyVAL.expr = yyDollar[1].expr } - case 581: + case 582: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2982 +//line sql.y:2990 { yyVAL.str = string("") } - case 582: + case 583: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2986 +//line sql.y:2994 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } - case 583: + case 584: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2992 +//line sql.y:3000 { yyVAL.whens = []*When{yyDollar[1].when} } - case 584: + case 585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2996 +//line sql.y:3004 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } - case 585: + case 586: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3002 +//line sql.y:3010 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } - case 586: + case 587: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3007 +//line sql.y:3015 { yyVAL.expr = nil } - case 587: + case 588: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3011 +//line sql.y:3019 { yyVAL.expr = yyDollar[2].expr } - case 588: + case 589: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3017 +//line sql.y:3025 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } - case 589: + case 590: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3021 +//line sql.y:3029 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } - case 590: + case 591: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3025 +//line sql.y:3033 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } - case 591: + case 592: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3031 +//line sql.y:3039 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 592: + case 593: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3035 +//line sql.y:3043 { yyVAL.expr = NewHexVal(yyDollar[1].bytes) } - case 593: + case 594: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3039 +//line sql.y:3047 { yyVAL.expr = NewBitVal(yyDollar[1].bytes) } - case 594: + case 595: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3043 +//line sql.y:3051 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 595: + case 596: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3047 +//line sql.y:3055 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } - case 596: + case 597: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3051 +//line sql.y:3059 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } - case 597: + case 598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3055 +//line sql.y:3063 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 598: + case 599: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3059 +//line sql.y:3067 { yyVAL.expr = &NullVal{} } - case 599: + case 600: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3065 +//line sql.y:3073 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7213,225 +7257,225 @@ yydefault: } yyVAL.expr = NewIntVal([]byte("1")) } - case 600: + case 601: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3074 +//line sql.y:3082 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 601: + case 602: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3078 +//line sql.y:3086 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 602: + case 603: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3083 +//line sql.y:3091 { yyVAL.exprs = nil } - case 603: + case 604: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3087 +//line sql.y:3095 { yyVAL.exprs = yyDollar[3].exprs } - case 604: + case 605: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3092 +//line sql.y:3100 { yyVAL.expr = nil } - case 605: + case 606: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3096 +//line sql.y:3104 { yyVAL.expr = yyDollar[2].expr } - case 606: + case 607: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3101 +//line sql.y:3109 { yyVAL.orderBy = nil } - case 607: + case 608: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3105 +//line sql.y:3113 { yyVAL.orderBy = yyDollar[3].orderBy } - case 608: + case 609: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3111 +//line sql.y:3119 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } - case 609: + case 610: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3115 +//line sql.y:3123 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } - case 610: + case 611: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3121 +//line sql.y:3129 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } - case 611: + case 612: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3126 +//line sql.y:3134 { yyVAL.str = AscScr } - case 612: + case 613: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3130 +//line sql.y:3138 { yyVAL.str = AscScr } - case 613: + case 614: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3134 +//line sql.y:3142 { yyVAL.str = DescScr } - case 614: + case 615: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3139 +//line sql.y:3147 { yyVAL.limit = nil } - case 615: + case 616: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3143 +//line sql.y:3151 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } - case 616: + case 617: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3147 +//line sql.y:3155 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } - case 617: + case 618: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3151 +//line sql.y:3159 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } - case 618: + case 619: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3156 +//line sql.y:3164 { yyVAL.str = "" } - case 619: + case 620: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3160 +//line sql.y:3168 { yyVAL.str = ForUpdateStr } - case 620: + case 621: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3164 +//line sql.y:3172 { yyVAL.str = ShareModeStr } - case 621: + case 622: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3177 +//line sql.y:3185 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 622: + case 623: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3181 +//line sql.y:3189 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 623: + case 624: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3185 +//line sql.y:3193 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 624: + case 625: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3189 +//line sql.y:3197 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 625: + case 626: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3195 +//line sql.y:3203 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 626: + case 627: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3199 +//line sql.y:3207 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 627: + case 628: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3203 +//line sql.y:3211 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 628: + case 629: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3207 +//line sql.y:3215 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 629: + case 630: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3212 +//line sql.y:3220 { yyVAL.updateExprs = nil } - case 630: + case 631: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3216 +//line sql.y:3224 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 631: + case 632: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3222 +//line sql.y:3230 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 632: + case 633: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3226 +//line sql.y:3234 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 633: + case 634: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3232 +//line sql.y:3240 { yyVAL.valTuple = yyDollar[1].valTuple } - case 634: + case 635: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3236 +//line sql.y:3244 { yyVAL.valTuple = ValTuple{} } - case 635: + case 636: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3242 +//line sql.y:3250 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 636: + case 637: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3248 +//line sql.y:3256 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7439,319 +7483,319 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 637: + case 638: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3258 +//line sql.y:3266 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 638: + case 639: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3262 +//line sql.y:3270 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 639: + case 640: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3268 +//line sql.y:3276 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 640: + case 641: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3274 +//line sql.y:3282 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 641: + case 642: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3278 +//line sql.y:3286 { yyDollar[2].setExpr.Scope = yyDollar[1].str yyVAL.setExprs = SetExprs{yyDollar[2].setExpr} } - case 642: + case 643: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3283 +//line sql.y:3291 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 643: + case 644: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3289 +//line sql.y:3297 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("on"))} } - case 644: + case 645: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3293 +//line sql.y:3301 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("off"))} } - case 645: + case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3297 +//line sql.y:3305 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: yyDollar[3].expr} } - case 646: + case 647: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3301 +//line sql.y:3309 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Expr: yyDollar[2].expr} } - case 648: + case 649: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3308 +//line sql.y:3316 { yyVAL.bytes = []byte("charset") } - case 650: + case 651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3315 +//line sql.y:3323 { yyVAL.expr = NewStrVal([]byte(yyDollar[1].colIdent.String())) } - case 651: + case 652: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3319 +//line sql.y:3327 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 652: + case 653: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3323 +//line sql.y:3331 { yyVAL.expr = &Default{} } - case 655: + case 656: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3332 +//line sql.y:3340 { yyVAL.byt = 0 } - case 656: + case 657: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3334 +//line sql.y:3342 { yyVAL.byt = 1 } - case 657: + case 658: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3337 +//line sql.y:3345 { yyVAL.empty = struct{}{} } - case 658: + case 659: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3339 +//line sql.y:3347 { yyVAL.empty = struct{}{} } - case 659: + case 660: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3342 +//line sql.y:3350 { yyVAL.str = "" } - case 660: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3344 - { - yyVAL.str = IgnoreStr - } case 661: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3348 +//line sql.y:3352 { - yyVAL.empty = struct{}{} + yyVAL.str = IgnoreStr } case 662: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3350 +//line sql.y:3356 { yyVAL.empty = struct{}{} } case 663: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3352 +//line sql.y:3358 { yyVAL.empty = struct{}{} } case 664: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3354 +//line sql.y:3360 { yyVAL.empty = struct{}{} } case 665: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3356 +//line sql.y:3362 { yyVAL.empty = struct{}{} } case 666: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3358 +//line sql.y:3364 { yyVAL.empty = struct{}{} } case 667: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3360 +//line sql.y:3366 { yyVAL.empty = struct{}{} } case 668: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3362 +//line sql.y:3368 { yyVAL.empty = struct{}{} } case 669: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3364 +//line sql.y:3370 { yyVAL.empty = struct{}{} } case 670: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3366 +//line sql.y:3372 { yyVAL.empty = struct{}{} } case 671: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3369 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3374 { yyVAL.empty = struct{}{} } case 672: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3371 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3377 { yyVAL.empty = struct{}{} } case 673: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3373 +//line sql.y:3379 { yyVAL.empty = struct{}{} } case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3377 +//line sql.y:3381 { yyVAL.empty = struct{}{} } case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3379 +//line sql.y:3385 { yyVAL.empty = struct{}{} } case 676: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3382 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3387 { yyVAL.empty = struct{}{} } case 677: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3384 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3390 { yyVAL.empty = struct{}{} } case 678: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3386 +//line sql.y:3392 { yyVAL.empty = struct{}{} } case 679: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3394 + { + yyVAL.empty = struct{}{} + } + case 680: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3389 +//line sql.y:3397 { yyVAL.colIdent = ColIdent{} } - case 680: + case 681: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3391 +//line sql.y:3399 { yyVAL.colIdent = yyDollar[2].colIdent } - case 681: + case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3395 +//line sql.y:3403 { yyVAL.colIdent = yyDollar[1].colIdent } - case 682: + case 683: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3399 +//line sql.y:3407 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 684: + case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3406 +//line sql.y:3414 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 685: + case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3412 +//line sql.y:3420 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 686: + case 687: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3416 +//line sql.y:3424 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 688: + case 689: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3423 +//line sql.y:3431 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 979: + case 980: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3739 +//line sql.y:3747 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 980: + case 981: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3748 +//line sql.y:3756 { decNesting(yylex) } - case 981: + case 982: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3753 +//line sql.y:3761 { skipToEnd(yylex) } - case 982: + case 983: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3758 +//line sql.y:3766 { skipToEnd(yylex) } - case 983: + case 984: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3762 +//line sql.y:3770 { skipToEnd(yylex) } - case 984: + case 985: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3766 +//line sql.y:3774 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 92f29510c1b..f23a6f3ba5a 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -393,9 +393,13 @@ do_statement: } select_statement: - simple_select + base_select order_by_opt limit_opt lock_opt { - $$ = $1 + sel := $1.(*Select) + sel.OrderBy = $2 + sel.Limit = $3 + sel.Lock = $4 + $$ = sel } | openb select_statement closeb order_by_opt limit_opt lock_opt { @@ -436,6 +440,10 @@ simple_select: sel.Lock = $4 $$ = sel } +| simple_select union_op union_rhs order_by_opt limit_opt lock_opt + { + $$ = Unionize($1, $3, $2, $4, $5, $6) + } stream_statement: STREAM comment_opt select_expression FROM table_name From dab94d1a82efe370632d4136455eda33b0e133c2 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Fri, 19 Jun 2020 10:21:15 +0200 Subject: [PATCH 048/430] Fix test expactations Signed-off-by: Andres Taylor --- go/vt/sqlparser/parse_test.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 473fca8493d..bfee8c355f8 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -684,11 +684,9 @@ var ( input: "insert /* it accepts columns with keyword action */ into a(action, b) values (1, 2)", output: "insert /* it accepts columns with keyword action */ into a(`action`, b) values (1, 2)", }, { - input: "insert /* no cols & paren select */ into a(select * from t)", - output: "insert /* no cols & paren select */ into a select * from t", + input: "insert /* no cols & paren select */ into a (select * from t)", }, { - input: "insert /* cols & paren select */ into a(a,b,c) (select * from t)", - output: "insert /* cols & paren select */ into a(a, b, c) select * from t", + input: "insert /* cols & paren select */ into a(a, b, c) (select * from t)", }, { input: "insert /* cols & union with paren select */ into a(b, c) (select d, e from f) union (select g from h)", }, { @@ -2697,9 +2695,6 @@ var ( }, { input: "select /* vitess-reserved keyword as unqualified column */ * from t where escape = 'test'", output: "syntax error at position 81 near 'escape'", - }, { - input: "(select /* parenthesized select */ * from t)", - output: "syntax error at position 45", }, { input: "select * from t where id = ((select a from t1 union select b from t2) order by a limit 1)", output: "syntax error at position 76 near 'order'", @@ -2723,10 +2718,10 @@ var ( func TestErrors(t *testing.T) { for _, tcase := range invalidSQL { - _, err := Parse(tcase.input) - if err == nil || err.Error() != tcase.output { - t.Errorf("%s: %v, want %s", tcase.input, err, tcase.output) - } + t.Run(tcase.input, func(t *testing.T) { + _, err := Parse(tcase.input) + require.Error(t, err, tcase.output) + }) } } From c0014eb586a7a4d905e7ef9bb1b04019a8641089 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Fri, 19 Jun 2020 12:19:58 +0200 Subject: [PATCH 049/430] Handle races in uvstreamer and refactor tests to wait for streams to teardown Signed-off-by: Rohit Nayak --- go/vt/vttablet/tabletserver/vstreamer/copy.go | 4 +- .../tabletserver/vstreamer/uvstreamer.go | 30 +++++++++--- .../tabletserver/vstreamer/vstreamer_test.go | 49 ++++++++++++------- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 97874be6708..898a37dadc3 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -69,7 +69,7 @@ func (uvs *uvstreamer) catchup(ctx context.Context) error { startPos := mysql.EncodePosition(uvs.pos) vs := newVStreamer(ctx, uvs.cp, uvs.se, uvs.sh, startPos, "", uvs.filter, uvs.getVSchema(), uvs.send2) errch <- vs.Stream() - uvs.vs = nil + uvs.setVs(nil) log.Infof("catchup vs.stream returned with vs.pos %s", vs.pos.String()) }() @@ -274,6 +274,6 @@ func (uvs *uvstreamer) fastForward(stopPos string) error { log.Infof("starting fastForward from %s upto pos %s", mysql.EncodePosition(uvs.pos), stopPos) uvs.stopPos, _ = mysql.DecodePosition(stopPos) vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), "", uvs.filter, uvs.getVSchema(), uvs.send2) - uvs.vs = vs + uvs.setVs(vs) return vs.Stream() } diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 67f9033a79d..48f5741afdc 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -58,8 +58,7 @@ type uvstreamer struct { filter *binlogdatapb.Filter inTablePKs []*binlogdatapb.TableLastPK - vschema *localVSchema - muVSchema sync.Mutex //to handle race when WatchSrvVSchema can set VSchema on topo change + vschema *localVSchema // map holds tables remaining to be fully copied, it is depleted as each table gets completely copied plans map[string]*tablePlan @@ -371,14 +370,31 @@ func (uvs *uvstreamer) Stream() error { } log.V(2).Infof("Starting replicate in uvstreamer.Stream()") vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), mysql.EncodePosition(uvs.stopPos), uvs.filter, uvs.getVSchema(), uvs.send) - uvs.vs = vs + + uvs.setVs(vs) return vs.Stream() } +func (uvs *uvstreamer) lock(msg string) { + log.V(2).Infof("Acquiring uvs lock: %s", msg) + uvs.mu.Lock() +} + +func (uvs *uvstreamer) unlock(msg string) { + log.V(2).Infof("Releasing uvs lock: %s", msg) + uvs.mu.Unlock() +} + +func (uvs *uvstreamer) setVs(vs *vstreamer) { + uvs.lock("setVs") + defer uvs.unlock("setVs") + uvs.vs = vs +} + // SetVSchema updates the vstreamer against the new vschema. func (uvs *uvstreamer) SetVSchema(vschema *localVSchema) { - uvs.muVSchema.Lock() - defer uvs.muVSchema.Unlock() + uvs.lock("SetVSchema") + defer uvs.unlock("SetVSchema") uvs.vschema = vschema if uvs.vs != nil { uvs.vs.SetVSchema(vschema) @@ -386,8 +402,8 @@ func (uvs *uvstreamer) SetVSchema(vschema *localVSchema) { } func (uvs *uvstreamer) getVSchema() *localVSchema { - uvs.muVSchema.Lock() - defer uvs.muVSchema.Unlock() + uvs.lock("getVSchema") + defer uvs.unlock("getVSchema") return uvs.vschema } diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go index 83ecf289db8..2d87d812795 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go @@ -519,8 +519,8 @@ func TestOther(t *testing.T) { t.Logf("Run mode: %v", mode) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - ch := startStream(ctx, t, nil, "", nil) - + wg, ch := startStream(ctx, t, nil, "", nil) + defer wg.Wait() want := [][]string{{ `gtid`, `type:OTHER `, @@ -623,8 +623,8 @@ func TestREKeyRange(t *testing.T) { Filter: "-80", }}, } - ch := startStream(ctx, t, filter, "", nil) - + wg, ch := startStream(ctx, t, filter, "", nil) + defer wg.Wait() // 1, 2, 3 and 5 are in shard -80. // 4 and 6 are in shard 80-. input := []string{ @@ -686,6 +686,7 @@ func TestREKeyRange(t *testing.T) { `gtid`, `commit`, }}) + cancel() } func TestInKeyRangeMultiColumn(t *testing.T) { @@ -713,7 +714,8 @@ func TestInKeyRangeMultiColumn(t *testing.T) { Filter: "select id, region, val, keyspace_id() from t1 where in_keyrange('-80')", }}, } - ch := startStream(ctx, t, filter, "", nil) + wg, ch := startStream(ctx, t, filter, "", nil) + defer wg.Wait() // 1, 2, 3 and 5 are in shard -80. // 4 and 6 are in shard 80-. @@ -741,6 +743,7 @@ func TestInKeyRangeMultiColumn(t *testing.T) { `gtid`, `commit`, }}) + cancel() } func TestREMultiColumnVindex(t *testing.T) { @@ -768,7 +771,8 @@ func TestREMultiColumnVindex(t *testing.T) { Filter: "-80", }}, } - ch := startStream(ctx, t, filter, "", nil) + wg, ch := startStream(ctx, t, filter, "", nil) + defer wg.Wait() // 1, 2, 3 and 5 are in shard -80. // 4 and 6 are in shard 80-. @@ -795,6 +799,7 @@ func TestREMultiColumnVindex(t *testing.T) { `gtid`, `commit`, }}) + cancel() } func TestSelectFilter(t *testing.T) { @@ -1448,10 +1453,12 @@ func TestHeartbeat(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - ch := startStream(ctx, t, nil, "", nil) + wg, ch := startStream(ctx, t, nil, "", nil) + defer wg.Wait() evs := <-ch require.Equal(t, 1, len(evs)) assert.Equal(t, binlogdatapb.VEventType_HEARTBEAT, evs[0].Type) + cancel() } func TestNoFutureGTID(t *testing.T) { @@ -1544,8 +1551,8 @@ func runCases(t *testing.T, filter *binlogdatapb.Filter, testcases []testcase, p t.Helper() ctx, cancel := context.WithCancel(context.Background()) defer cancel() - ch := startStream(ctx, t, filter, position, tablePK) - + wg, ch := startStream(ctx, t, filter, position, tablePK) + defer wg.Wait() // If position is 'current', we wait for a heartbeat to be // sure the vstreamer has started. if position == "current" { @@ -1553,6 +1560,7 @@ func runCases(t *testing.T, filter *binlogdatapb.Filter, testcases []testcase, p expectLog(ctx, t, "current pos", ch, [][]string{{`gtid`, `type:OTHER `}}) } + log.Infof("Starting to run test cases") for _, tcase := range testcases { switch input := tcase.input.(type) { case []string: @@ -1564,10 +1572,12 @@ func runCases(t *testing.T, filter *binlogdatapb.Filter, testcases []testcase, p } expectLog(ctx, t, tcase.input, ch, tcase.output) } + cancel() if evs, ok := <-ch; ok { t.Fatalf("unexpected evs: %v", evs) } + log.Infof("Last line of runCases") } func expectLog(ctx context.Context, t *testing.T, input interface{}, ch <-chan []*binlogdatapb.VEvent, output [][]string) { @@ -1633,23 +1643,26 @@ func expectLog(ctx context.Context, t *testing.T, input interface{}, ch <-chan [ var lastPos string -func startStream(ctx context.Context, t *testing.T, filter *binlogdatapb.Filter, position string, tablePKs []*binlogdatapb.TableLastPK) <-chan []*binlogdatapb.VEvent { - if position == "" { +func startStream(ctx context.Context, t *testing.T, filter *binlogdatapb.Filter, position string, tablePKs []*binlogdatapb.TableLastPK) (*sync.WaitGroup, <-chan []*binlogdatapb.VEvent) { + switch position { + case "": position = masterPosition(t) - } - if position == "vscopy" { + case "vscopy": position = "" } + wg := sync.WaitGroup{} + wg.Add(1) ch := make(chan []*binlogdatapb.VEvent) + go func() { defer close(ch) - err := vstream(ctx, t, position, tablePKs, filter, ch) - if len(tablePKs) == 0 { - require.Nil(t, err) - } + defer wg.Done() + log.Infof(">>>>>>>>>>> before vstream") + vstream(ctx, t, position, tablePKs, filter, ch) + log.Infof(">>>>>>>>>> after vstream") }() - return ch + return &wg, ch } func vstream(ctx context.Context, t *testing.T, pos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, ch chan []*binlogdatapb.VEvent) error { From d4b5265588ddec96521a5eb1dfb982a91394780f Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 20 Jun 2020 12:09:35 +0200 Subject: [PATCH 050/430] Bug fix. Removed V logs Signed-off-by: Rohit Nayak --- go/vt/vttablet/tabletserver/vstreamer/copy.go | 3 +++ go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 898a37dadc3..4c2d90c122f 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -68,6 +68,7 @@ func (uvs *uvstreamer) catchup(ctx context.Context) error { go func() { startPos := mysql.EncodePosition(uvs.pos) vs := newVStreamer(ctx, uvs.cp, uvs.se, uvs.sh, startPos, "", uvs.filter, uvs.getVSchema(), uvs.send2) + uvs.setVs(vs) errch <- vs.Stream() uvs.setVs(nil) log.Infof("catchup vs.stream returned with vs.pos %s", vs.pos.String()) @@ -207,9 +208,11 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { pos, _ := mysql.DecodePosition(rows.Gtid) if !uvs.pos.IsZero() && !uvs.pos.AtLeast(pos) { if err := uvs.fastForward(rows.Gtid); err != nil { + uvs.setVs(nil) log.Infof("fastForward returned error %v", err) return err } + uvs.setVs(nil) if mysql.EncodePosition(uvs.pos) != rows.Gtid { return fmt.Errorf("position after fastforward was %s but stopPos was %s", uvs.pos, rows.Gtid) } diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 48f5741afdc..9450189f777 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -81,7 +81,7 @@ type uvstreamer struct { config *uvstreamerConfig - vs *vstreamer //last vstreamer created in uvstreamer: FIXME currently used only for setting vschema, find another way? + vs *vstreamer //last vstreamer created in uvstreamer } type uvstreamerConfig struct { @@ -368,7 +368,6 @@ func (uvs *uvstreamer) Stream() error { } uvs.sendTestEvent("Copy Done") } - log.V(2).Infof("Starting replicate in uvstreamer.Stream()") vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), mysql.EncodePosition(uvs.stopPos), uvs.filter, uvs.getVSchema(), uvs.send) uvs.setVs(vs) @@ -376,12 +375,10 @@ func (uvs *uvstreamer) Stream() error { } func (uvs *uvstreamer) lock(msg string) { - log.V(2).Infof("Acquiring uvs lock: %s", msg) uvs.mu.Lock() } func (uvs *uvstreamer) unlock(msg string) { - log.V(2).Infof("Releasing uvs lock: %s", msg) uvs.mu.Unlock() } From 09329336ace70bec1b8e2ef67cb95c2cfe77b54b Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 20 Jun 2020 23:17:04 +0200 Subject: [PATCH 051/430] Insert catchup events in a transaction to avoid valid race during catchup Signed-off-by: Rohit Nayak --- .../tabletserver/vstreamer/uvstreamer_test.go | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go index e202fb88680..c65a1c3a6f5 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go @@ -236,10 +236,9 @@ func TestVStreamCopyCompleteFlow(t *testing.T) { numCopyEvents += 2 /* GTID + Test event after all copy is done */ numCatchupEvents := 3 * 5 /*2 t1, 1 t2 : BEGIN+FIELD+ROW+GTID+COMMIT*/ numFastForwardEvents := 5 /*t1:FIELD+ROW*/ - numIgnored := 3 // empty events numMisc := 1 /* t2 insert during t1 catchup that comes in t2 copy */ numReplicateEvents := 3*5 /* insert into t1/t2/t3 */ + 4 /* second insert into t3, no FieldEvent */ - numExpectedEvents := numCopyEvents + numCatchupEvents + numFastForwardEvents + numIgnored + numMisc + numReplicateEvents + numExpectedEvents := numCopyEvents + numCatchupEvents + numFastForwardEvents + numMisc + numReplicateEvents var lastRowEventSeen bool @@ -315,11 +314,24 @@ func initTables(t *testing.T, tables []string) { positions[fmt.Sprintf("%sBulkInsert", table)] = masterPosition(t) callbacks[fmt.Sprintf("LASTPK.*%s.*%d", table, numInitialRows)] = func() { + ctx := context.Background() if tableName == "t1" { - insertRow(t, "t1", 1, numInitialRows+1) - //should result in empty commit ignored during catchup since t2 copy has not started - insertRow(t, "t2", 2, numInitialRows+1) - log.Infof("Position after first insert into t1 (and t2/t3): %s", masterPosition(t)) + idx := 1 + id := numInitialRows + 1 + table := "t1" + query1 := fmt.Sprintf(insertQuery, table, idx, idx, id, id*idx*10) + idx = 2 + table = "t2" + query2 := fmt.Sprintf(insertQuery, table, idx, idx, id, id*idx*10) + + queries := []string{ + "begin", + query1, + query2, + "commit", + } + env.Mysqld.ExecuteSuperQueryList(ctx, queries) + log.Infof("Position after first insert into t1 and t2: %s", masterPosition(t)) } } } @@ -422,10 +434,7 @@ var expectedEvents = []string{ "type:FIELD field_event: fields: > ", "type:ROW row_event: > > ", "type:GTID", - "type:COMMIT", - "type:BEGIN", //empty commit for insert into t3 - "type:GTID", - "type:COMMIT", + "type:COMMIT", //insert for t2 done along with t1 does not generate an event since t2 is not yet copied "type:OTHER gtid:\"Copy Start t2\"", "type:BEGIN", "type:FIELD field_event: fields: > ", From 93e60c7aba5f00755801f63ecc9aeee741cfc64c Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 20 Jun 2020 23:39:30 +0200 Subject: [PATCH 052/430] Trigger rebuild Signed-off-by: Rohit Nayak From 61965380acf1e94d650a91c90f0e2f5563eb9e8b Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Fri, 19 Jun 2020 21:46:03 -0400 Subject: [PATCH 053/430] Use the same error recorder in backupengine as backuphandle (Yes, I need to document, and also fix the interface implementation for all the other implementations of BackupHandle) Signed-off-by: Andrew Mason --- go/vt/mysqlctl/backupstorage/interface.go | 5 +++++ go/vt/mysqlctl/builtinbackupengine.go | 18 +++++++++++++----- go/vt/mysqlctl/s3backupstorage/s3.go | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/go/vt/mysqlctl/backupstorage/interface.go b/go/vt/mysqlctl/backupstorage/interface.go index e4c2e6bc18d..78720a12e08 100644 --- a/go/vt/mysqlctl/backupstorage/interface.go +++ b/go/vt/mysqlctl/backupstorage/interface.go @@ -24,6 +24,7 @@ import ( "io" "golang.org/x/net/context" + "vitess.io/vitess/go/vt/concurrency" ) var ( @@ -74,6 +75,10 @@ type BackupHandle interface { // The context is valid for the duration of the reads, until the // ReadCloser is closed. ReadFile(ctx context.Context, filename string) (io.ReadCloser, error) + + // concurrency.ErrorRecorder is embedded here to coordinate reporting and + // handling of errors among all the components involved in taking a backup. + concurrency.ErrorRecorder } // BackupStorage is the interface to the storage system diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go index f49f8fdf780..d0d2087cc59 100644 --- a/go/vt/mysqlctl/builtinbackupengine.go +++ b/go/vt/mysqlctl/builtinbackupengine.go @@ -276,7 +276,6 @@ func (be *BuiltinBackupEngine) backupFiles(ctx context.Context, params BackupPar // Backup with the provided concurrency. sema := sync2.NewSemaphore(params.Concurrency, 0) - rec := concurrency.AllErrorRecorder{} wg := sync.WaitGroup{} for i := range fes { wg.Add(1) @@ -287,19 +286,28 @@ func (be *BuiltinBackupEngine) backupFiles(ctx context.Context, params BackupPar // encountered an error. sema.Acquire() defer sema.Release() - if rec.HasErrors() { + if bh.HasErrors() { return } // Backup the individual file. name := fmt.Sprintf("%v", i) - rec.RecordError(be.backupFile(ctx, params, bh, &fes[i], name)) + bh.RecordError(be.backupFile(ctx, params, bh, &fes[i], name)) }(i) } wg.Wait() - if rec.HasErrors() { - return rec.Error() + + // BackupHandles now support the ErrorRecorder interface for tracking errors + // across any goroutines that fan out to take the backup. This means that we + // can discard the local error recorder and put everything through the bh. + // + // This mitigates the scenario where bh.AddFile() encounters an error asynchronously, + // which ordinarily would be lost in the context of `be.backupFile`, i.e. if an + // error were encoutered + // [here](https://github.com/vitessio/vitess/blob/d26b6c7975b12a87364e471e2e2dfa4e253c2a5b/go/vt/mysqlctl/s3backupstorage/s3.go#L139-L142). + if bh.HasErrors() { + return bh.Error() } // open the MANIFEST diff --git a/go/vt/mysqlctl/s3backupstorage/s3.go b/go/vt/mysqlctl/s3backupstorage/s3.go index 55fe11f6942..ab15f163398 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3.go +++ b/go/vt/mysqlctl/s3backupstorage/s3.go @@ -104,6 +104,21 @@ func (bh *S3BackupHandle) Name() string { return bh.name } +// RecordError is part of the concurrency.ErrorRecorder interface. +func (bh *S3BackupHandle) RecordError(err error) { + bh.errors.RecordError(err) +} + +// HasErrors is part of the concurrency.ErrorRecorder interface. +func (bh *S3BackupHandle) HasErrors() bool { + return bh.errors.HasErrors() +} + +// Error is part of the concurrency.ErrorRecorder interface. +func (bh *S3BackupHandle) Error() error { + return bh.errors.Error() +} + // AddFile is part of the backupstorage.BackupHandle interface. func (bh *S3BackupHandle) AddFile(ctx context.Context, filename string, filesize int64) (io.WriteCloser, error) { if bh.readOnly { From cd34835e7548fda01641d150918bad23583338ea Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sat, 20 Jun 2020 15:39:25 -0400 Subject: [PATCH 054/430] Update the rest of the backupstorage implementations Signed-off-by: Andrew Mason --- go/vt/mysqlctl/azblobbackupstorage/azblob.go | 15 +++++++++++++++ go/vt/mysqlctl/cephbackupstorage/ceph.go | 15 +++++++++++++++ go/vt/mysqlctl/filebackupstorage/file.go | 17 +++++++++++++++++ go/vt/mysqlctl/gcsbackupstorage/gcs.go | 17 +++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/go/vt/mysqlctl/azblobbackupstorage/azblob.go b/go/vt/mysqlctl/azblobbackupstorage/azblob.go index a9346506e82..81a03fdc9e7 100644 --- a/go/vt/mysqlctl/azblobbackupstorage/azblob.go +++ b/go/vt/mysqlctl/azblobbackupstorage/azblob.go @@ -127,6 +127,21 @@ func (bh *AZBlobBackupHandle) Name() string { return bh.name } +// RecordError is part of the concurrency.ErrorRecorder interface. +func (bh *AZBlobBackupHandle) RecordError(err error) { + bh.errors.RecordError(err) +} + +// HasErrors is part of the concurrency.ErrorRecorder interface. +func (bh *AZBlobBackupHandle) HasErrors() bool { + return bh.errors.HasErrors() +} + +// Error is part of the concurrency.ErrorRecorder interface. +func (bh *AZBlobBackupHandle) Error() error { + return bh.errors.Error() +} + // AddFile implements BackupHandle. func (bh *AZBlobBackupHandle) AddFile(ctx context.Context, filename string, filesize int64) (io.WriteCloser, error) { if bh.readOnly { diff --git a/go/vt/mysqlctl/cephbackupstorage/ceph.go b/go/vt/mysqlctl/cephbackupstorage/ceph.go index 80c37ceb828..5880f0db026 100644 --- a/go/vt/mysqlctl/cephbackupstorage/ceph.go +++ b/go/vt/mysqlctl/cephbackupstorage/ceph.go @@ -62,6 +62,21 @@ type CephBackupHandle struct { waitGroup sync.WaitGroup } +// RecordError is part of the concurrency.ErrorRecorder interface. +func (bh *CephBackupHandle) RecordError(err error) { + bh.errors.RecordError(err) +} + +// HasErrors is part of the concurrency.ErrorRecorder interface. +func (bh *CephBackupHandle) HasErrors() bool { + return bh.errors.HasErrors() +} + +// Error is part of the concurrency.ErrorRecorder interface. +func (bh *CephBackupHandle) Error() error { + return bh.errors.Error() +} + // Directory implements BackupHandle. func (bh *CephBackupHandle) Directory() string { return bh.dir diff --git a/go/vt/mysqlctl/filebackupstorage/file.go b/go/vt/mysqlctl/filebackupstorage/file.go index c99a0ee6b0a..be5810c1a94 100644 --- a/go/vt/mysqlctl/filebackupstorage/file.go +++ b/go/vt/mysqlctl/filebackupstorage/file.go @@ -28,6 +28,7 @@ import ( "golang.org/x/net/context" + "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" ) @@ -43,6 +44,22 @@ type FileBackupHandle struct { dir string name string readOnly bool + errors concurrency.AllErrorRecorder +} + +// RecordError is part of the concurrency.ErrorRecorder interface. +func (fbh *FileBackupHandle) RecordError(err error) { + fbh.errors.RecordError(err) +} + +// HasErrors is part of the concurrency.ErrorRecorder interface. +func (fbh *FileBackupHandle) HasErrors() bool { + return fbh.errors.HasErrors() +} + +// Error is part of the concurrency.ErrorRecorder interface. +func (fbh *FileBackupHandle) Error() error { + return fbh.errors.Error() } // Directory is part of the BackupHandle interface diff --git a/go/vt/mysqlctl/gcsbackupstorage/gcs.go b/go/vt/mysqlctl/gcsbackupstorage/gcs.go index 5473be3217a..7ca9f4796d6 100644 --- a/go/vt/mysqlctl/gcsbackupstorage/gcs.go +++ b/go/vt/mysqlctl/gcsbackupstorage/gcs.go @@ -33,6 +33,7 @@ import ( "google.golang.org/api/option" "vitess.io/vitess/go/trace" + "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" ) @@ -51,6 +52,22 @@ type GCSBackupHandle struct { dir string name string readOnly bool + errors concurrency.AllErrorRecorder +} + +// RecordError is part of the concurrency.ErrorRecorder interface. +func (bh *GCSBackupHandle) RecordError(err error) { + bh.errors.RecordError(err) +} + +// HasErrors is part of the concurrency.ErrorRecorder interface. +func (bh *GCSBackupHandle) HasErrors() bool { + return bh.errors.HasErrors() +} + +// Error is part of the concurrency.ErrorRecorder interface. +func (bh *GCSBackupHandle) Error() error { + return bh.errors.Error() } // Directory implements BackupHandle. From d7e084ee26ad5f705e5965011385774f0e6a2fa7 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 21 Jun 2020 08:39:40 -0400 Subject: [PATCH 055/430] Change type of s3 client from the `s3.S3` struct to `s3iface.S3API` The `s3iface` type is an interface listing all the methods that the `s3` struct implements, with the added benefit of being able to swap in mock implementations in tests. Signed-off-by: Andrew Mason --- go/vt/mysqlctl/s3backupstorage/s3.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/go/vt/mysqlctl/s3backupstorage/s3.go b/go/vt/mysqlctl/s3backupstorage/s3.go index ab15f163398..a92a87652fe 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3.go +++ b/go/vt/mysqlctl/s3backupstorage/s3.go @@ -41,6 +41,7 @@ import ( "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/aws/aws-sdk-go/service/s3/s3manager" "golang.org/x/net/context" @@ -85,7 +86,7 @@ var logNameMap logNameToLogLevel // S3BackupHandle implements the backupstorage.BackupHandle interface. type S3BackupHandle struct { - client *s3.S3 + client s3iface.S3API bs *S3BackupStorage dir string name string From 0b7d4a0a51de7d1d25e4c9b6a598e2012b568e70 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 21 Jun 2020 08:41:04 -0400 Subject: [PATCH 056/430] Add a test for AddFile error tracking Signed-off-by: Andrew Mason --- go/vt/mysqlctl/s3backupstorage/s3_test.go | 55 +++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 go/vt/mysqlctl/s3backupstorage/s3_test.go diff --git a/go/vt/mysqlctl/s3backupstorage/s3_test.go b/go/vt/mysqlctl/s3backupstorage/s3_test.go new file mode 100644 index 00000000000..ac46a1376e3 --- /dev/null +++ b/go/vt/mysqlctl/s3backupstorage/s3_test.go @@ -0,0 +1,55 @@ +package s3backupstorage + +import ( + "errors" + "net/http" + "testing" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3iface" +) + +type s3ErrorClient struct{ s3iface.S3API } + +func (s3errclient *s3ErrorClient) PutObjectRequest(in *s3.PutObjectInput) (*request.Request, *s3.PutObjectOutput) { + req := request.Request{ + HTTPRequest: &http.Request{}, // without this we segfault \_(ツ)_/¯ (see https://github.com/aws/aws-sdk-go/blob/v1.28.8/aws/request/request_context.go#L13) + Error: errors.New("some error"), // this forces req.Send() (which is called by the uploader) to always return non-nil error + } + + return &req, &s3.PutObjectOutput{} +} + +func TestAddFileError(t *testing.T) { + bh := &S3BackupHandle{client: &s3ErrorClient{}, readOnly: false} + wc, err := bh.AddFile(aws.BackgroundContext(), "somefile", 100000) + + if err != nil { + t.Errorf("AddFile() expected no error, got %s", err) + return + } + + if wc == nil { + t.Errorf("AddFile() expected non-nil WriteCloser") + return + } + + n, err := wc.Write([]byte("here are some bytes")) + if err != nil { + t.Errorf("TestAddFile() could not write to uploader, got %d bytes written, err %s", n, err) + return + } + + if err := wc.Close(); err != nil { + t.Errorf("TestAddFile() could not close writer, got %s", err) + return + } + + bh.waitGroup.Wait() // wait for the goroutine to finish, at which point it should have recorded an error + + if !bh.HasErrors() { + t.Errorf("AddFile() expected bh to record async error but did not") + } +} From 3e3104970b31e847a9ff8bd1fd8b4adcb8864fdf Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 21 Jun 2020 11:40:00 -0400 Subject: [PATCH 057/430] Update these callsites Signed-off-by: Andrew Mason --- go/vt/mysqlctl/azblobbackupstorage/azblob.go | 4 ++-- go/vt/mysqlctl/cephbackupstorage/ceph.go | 4 ++-- go/vt/mysqlctl/s3backupstorage/s3.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/vt/mysqlctl/azblobbackupstorage/azblob.go b/go/vt/mysqlctl/azblobbackupstorage/azblob.go index 81a03fdc9e7..19a8ab331a0 100644 --- a/go/vt/mysqlctl/azblobbackupstorage/azblob.go +++ b/go/vt/mysqlctl/azblobbackupstorage/azblob.go @@ -171,7 +171,7 @@ func (bh *AZBlobBackupHandle) AddFile(ctx context.Context, filename string, file }) if err != nil { reader.CloseWithError(err) - bh.errors.RecordError(err) + bh.RecordError(err) } }() @@ -184,7 +184,7 @@ func (bh *AZBlobBackupHandle) EndBackup(ctx context.Context) error { return fmt.Errorf("EndBackup cannot be called on read-only backup") } bh.waitGroup.Wait() - return bh.errors.Error() + return bh.Error() } // AbortBackup implements BackupHandle. diff --git a/go/vt/mysqlctl/cephbackupstorage/ceph.go b/go/vt/mysqlctl/cephbackupstorage/ceph.go index 5880f0db026..085ecd94828 100644 --- a/go/vt/mysqlctl/cephbackupstorage/ceph.go +++ b/go/vt/mysqlctl/cephbackupstorage/ceph.go @@ -109,7 +109,7 @@ func (bh *CephBackupHandle) AddFile(ctx context.Context, filename string, filesi // Signal the writer that an error occurred, in case it's not done writing yet. reader.CloseWithError(err) // In case the error happened after the writer finished, we need to remember it. - bh.errors.RecordError(err) + bh.RecordError(err) } }() // Give our caller the write end of the pipe. @@ -123,7 +123,7 @@ func (bh *CephBackupHandle) EndBackup(ctx context.Context) error { } bh.waitGroup.Wait() // Return the saved PutObject() errors, if any. - return bh.errors.Error() + return bh.Error() } // AbortBackup implements BackupHandle. diff --git a/go/vt/mysqlctl/s3backupstorage/s3.go b/go/vt/mysqlctl/s3backupstorage/s3.go index a92a87652fe..e01c8c678a5 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3.go +++ b/go/vt/mysqlctl/s3backupstorage/s3.go @@ -159,7 +159,7 @@ func (bh *S3BackupHandle) AddFile(ctx context.Context, filename string, filesize }) if err != nil { reader.CloseWithError(err) - bh.errors.RecordError(err) + bh.RecordError(err) } }() @@ -172,7 +172,7 @@ func (bh *S3BackupHandle) EndBackup(ctx context.Context) error { return fmt.Errorf("EndBackup cannot be called on read-only backup") } bh.waitGroup.Wait() - return bh.errors.Error() + return bh.Error() } // AbortBackup is part of the backupstorage.BackupHandle interface. From 3de3739bf587bd7c4a8026e16eb46cb94ac0c882 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 22 Jun 2020 09:42:56 +0200 Subject: [PATCH 058/430] Added more tests Signed-off-by: Andres Taylor --- go/vt/sqlparser/parse_test.go | 16 ++++++++++++++++ .../planbuilder/testdata/unsupported_cases.txt | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index bfee8c355f8..cbf2facf9d1 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -26,6 +26,7 @@ import ( "sync" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -144,6 +145,16 @@ var ( input: "select 1 from dual union select 2 from dual union all select 3 from dual union select 4 from dual union all select 5 from dual", }, { input: "(select 1 from dual) order by 1 asc limit 2", + }, { + input: "(select 1 from dual order by 1 desc) order by 1 asc limit 2", + }, { + input: "(select 1 from dual)", + }, { + input: "((select 1 from dual))", + }, { + input: "select 1 from (select 1 from dual) as t", + }, { + input: "select 1 from (select 1 from dual union select 2 from dual) as t", }, { input: "select /* distinct */ distinct 1 from t", }, { @@ -1698,6 +1709,11 @@ func TestParallelValid(t *testing.T) { wg.Wait() } +func TestUnsupported(t *testing.T) { + _, err := Parse("select 1 from ((select 1 from dual) union select 2 from dual) as t") + assert.Error(t, err) // This should really work, but it doesn't currently +} + func TestInvalid(t *testing.T) { invalidSQL := []struct { input string diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt index 9dfbcdf0bad..8b993727db2 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt @@ -411,3 +411,11 @@ # Database DDL "create database foo" "unsupported: Database DDL create database foo" + +# stupid query is not supported +"(select 1 from user order by 1 desc) order by 1 asc limit 2" +"expected union to produce a route" + +# stupid query is not supported +"(select 1 from user order by 1 desc) union (select 1 from user order by 1 asc) order by 1 asc limit 2" +"unsupported: SELECT of UNION is non-trivial" From 40b054623237244b00361cb81d5a0c62275e222e Mon Sep 17 00:00:00 2001 From: Carson Anderson Date: Mon, 22 Jun 2020 09:11:17 -0600 Subject: [PATCH 059/430] Only check for k3s binary on Linux Signed-off-by: Carson Anderson --- tools/dependency_check.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/dependency_check.sh b/tools/dependency_check.sh index 058e702ae67..cfaa912f954 100755 --- a/tools/dependency_check.sh +++ b/tools/dependency_check.sh @@ -21,9 +21,14 @@ function fail() { exit 1 } +PLATFORM_BINARIES="" +case "$(uname -s)" in + Linux*) PLATFORM_BINARIES="k3s";; +esac + # These binaries are required to 'make test' # mysqld might be in /usr/sbin which will not be in the default PATH PATH="/usr/sbin:$PATH" -for binary in k3s mysqld consul etcd etcdctl zksrv.sh javadoc mvn ant curl wget zip unzip; do +for binary in mysqld consul etcd etcdctl zksrv.sh javadoc mvn ant curl wget zip unzip $PLATFORM_BINARIES; do command -v "$binary" > /dev/null || fail "${binary} is not installed in PATH. See https://vitess.io/contributing/build-from-source for install instructions." done; From 66273d656dcfba3503a90d48204f9a5a731903e7 Mon Sep 17 00:00:00 2001 From: Serry Park Date: Wed, 29 Apr 2020 11:30:42 -0700 Subject: [PATCH 060/430] add support for query payload limit Signed-off-by: Serry Park --- go/vt/sqlparser/comments.go | 2 + go/vt/vtgate/planbuilder/insert.go | 42 +++++++++++++++++ go/vt/vtgate/planbuilder/route.go | 21 +++++++++ .../vtgate/planbuilder/testdata/dml_cases.txt | 46 +++++++++++++++++++ 4 files changed, 111 insertions(+) diff --git a/go/vt/sqlparser/comments.go b/go/vt/sqlparser/comments.go index 497b95e5366..6ecc47d0718 100644 --- a/go/vt/sqlparser/comments.go +++ b/go/vt/sqlparser/comments.go @@ -32,6 +32,8 @@ const ( DirectiveQueryTimeout = "QUERY_TIMEOUT_MS" // DirectiveScatterErrorsAsWarnings enables partial success scatter select queries DirectiveScatterErrorsAsWarnings = "SCATTER_ERRORS_AS_WARNINGS" + // DirectiveMaxPayloadSize sets a maximum payload size in bytes. Only supported for INSERTS. + DirectiveMaxPayloadSize = "MAX_PAYLOAD_SIZE" ) func isNonSpace(r rune) bool { diff --git a/go/vt/vtgate/planbuilder/insert.go b/go/vt/vtgate/planbuilder/insert.go index aa584b19284..78a44c25414 100644 --- a/go/vt/vtgate/planbuilder/insert.go +++ b/go/vt/vtgate/planbuilder/insert.go @@ -67,6 +67,9 @@ func buildInsertUnshardedPlan(ins *sqlparser.Insert, table *vindexes.Table) (eng return nil, errors.New("unsupported: auto-inc and select in insert") } eins.Query = generateQuery(ins) + if err := validatePayloadSize(ins, eins); err != nil { + return nil, err + } return eins, nil case sqlparser.Values: rows = insertValues @@ -95,6 +98,9 @@ func buildInsertUnshardedPlan(ins *sqlparser.Insert, table *vindexes.Table) (eng eins.Query = generateQuery(ins) } + if err := validatePayloadSize(ins, eins); err != nil { + return nil, err + } return eins, nil } @@ -180,6 +186,10 @@ func buildInsertShardedPlan(ins *sqlparser.Insert, table *vindexes.Table) (engin eins.VindexValues = routeValues eins.Query = generateQuery(ins) generateInsertShardedQuery(ins, eins, rows) + if err := validatePayloadSize(ins, eins); err != nil { + return nil, err + } + return eins, nil } @@ -273,3 +283,35 @@ func isVindexChanging(setClauses sqlparser.UpdateExprs, colVindexes []*vindexes. } return false } + +// isAboveMaxPayloadSize returns true if an insert payload is within the +// configured DirectiveMaxPayloadSize threshold. Otherwise, returns false. +func isAboveMaxPayloadSize(eins *engine.Insert, threshold int) bool { + switch eins.Opcode { + case engine.InsertUnsharded: + totalBytes := len(eins.Query) + return totalBytes > threshold + default: + totalBytes := len(eins.Prefix) + len(eins.Suffix) + for _, m := range eins.Mid { + totalBytes += len(m) + } + return totalBytes > threshold + } +} + +// validatePayloadSize validates whether an insert payload is above the +// configured DirectiveMaxPayloadSize threshold, if set. +func validatePayloadSize(ins *sqlparser.Insert, eins *engine.Insert) error { + directives := sqlparser.ExtractCommentDirectives(ins.Comments) + threshold, isSet := maxPayloadSize(directives) + if isSet { + if threshold == 0 { + return errors.New("invalid DirectiveMaxPayloadSize value") + } + if isAboveMaxPayloadSize(eins, threshold) { + return errors.New("unsupported: payload size above threshold") + } + } + return nil +} diff --git a/go/vt/vtgate/planbuilder/route.go b/go/vt/vtgate/planbuilder/route.go index 6a7488e8441..bac7188cdd2 100644 --- a/go/vt/vtgate/planbuilder/route.go +++ b/go/vt/vtgate/planbuilder/route.go @@ -534,3 +534,24 @@ func queryTimeout(d sqlparser.CommentDirectives) int { } return 0 } + +// maxPayloadSize returns an int maxPayloadSize value, if set, +// and a boolean indicating whether a maxPayloadSize value was set. +// Otherwise, returns 0 and false. +func maxPayloadSize(d sqlparser.CommentDirectives) (int, bool) { + if d == nil { + return 0, false + } + + val, ok := d[sqlparser.DirectiveMaxPayloadSize] + if !ok { + return 0, ok + } + + intVal, ok := val.(int) + if ok { + return intVal, ok + } + + return 0, true +} diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt index d2b6d946592..4fc32bd524d 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt @@ -667,6 +667,29 @@ } } +# simple insert unsharded -- within max payload size +"insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into unsharded values(1, 2)" +{ + "QueryType": "INSERT", + "Original": "insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into unsharded values(1, 2)", + "Instructions": { + "OperatorType": "Insert", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetTabletType": "MASTER", + "MultiShardAutocommit": false, + "Query": "insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into unsharded values (1, 2)", + "TableName": "unsharded" + } +} + +# simple insert unsharded -- above max payload size +"insert /*vt+ MAX_PAYLOAD_SIZE=10 */ into unsharded values(1, 2)" +"unsupported: payload size above threshold" + # simple upsert unsharded "insert into unsharded values(1, 2) on duplicate key update x = 3" { @@ -1209,6 +1232,29 @@ } } +# insert with multiple rows sharded -- within max payload size +"insert /*vt+ MAX_PAYLOAD_SIZE=150 */ into user(id) values (1), (2)" +{ + "QueryType": "INSERT", + "Original": "insert /*vt+ MAX_PAYLOAD_SIZE=150 */ into user(id) values (1), (2)", + "Instructions": { + "OperatorType": "Insert", + "Variant": "Sharded", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetTabletType": "MASTER", + "MultiShardAutocommit": false, + "Query": "insert /*vt+ MAX_PAYLOAD_SIZE=150 */ into user(id, Name, Costly) values (:_Id0, :_Name0, :_Costly0), (:_Id1, :_Name1, :_Costly1)", + "TableName": "user" + } +} + +# insert with multiple rows sharded -- within max payload size +"insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into user(id) values (1), (2)" +"unsupported: payload size above threshold" + # insert into a vindex not allowed "insert into user_index(id) values(1)" "unsupported: multi-shard or vindex write statement" From 04d117ad6151afc2c03dbcccb6fe1bc3807a7030 Mon Sep 17 00:00:00 2001 From: Serry Park Date: Tue, 12 May 2020 13:43:43 -0700 Subject: [PATCH 061/430] user flag and apply to all operations before query plan building Signed-off-by: Serry Park --- go/vt/sqlparser/comments.go | 2 - go/vt/vtgate/executor.go | 16 +++++++ go/vt/vtgate/executor_test.go | 22 +++++++++ go/vt/vtgate/planbuilder/insert.go | 42 ----------------- go/vt/vtgate/planbuilder/route.go | 21 --------- .../vtgate/planbuilder/testdata/dml_cases.txt | 46 ------------------- go/vt/vtgate/vtgate.go | 1 + 7 files changed, 39 insertions(+), 111 deletions(-) diff --git a/go/vt/sqlparser/comments.go b/go/vt/sqlparser/comments.go index 6ecc47d0718..497b95e5366 100644 --- a/go/vt/sqlparser/comments.go +++ b/go/vt/sqlparser/comments.go @@ -32,8 +32,6 @@ const ( DirectiveQueryTimeout = "QUERY_TIMEOUT_MS" // DirectiveScatterErrorsAsWarnings enables partial success scatter select queries DirectiveScatterErrorsAsWarnings = "SCATTER_ERRORS_AS_WARNINGS" - // DirectiveMaxPayloadSize sets a maximum payload size in bytes. Only supported for INSERTS. - DirectiveMaxPayloadSize = "MAX_PAYLOAD_SIZE" ) func isNonSpace(r rune) bool { diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index a3e5942c6f6..348e79dec7f 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -1285,6 +1285,9 @@ func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, comments sqlparser. // Normalize if possible and retry. query := sql + if err = validatePayloadSize(query); err != nil { + return nil, err + } statement := stmt bindVarNeeds := sqlparser.BindVarNeeds{} if (e.normalize && sqlparser.CanNormalize(stmt)) || sqlparser.IsSetStatement(stmt) { @@ -1495,6 +1498,19 @@ func checkLikeOpt(likeOpt string, colNames []string) (string, error) { return "", nil } +// validatePayloadSize validates whether a query payload is above the +// configured MaxPayloadSize threshold +func validatePayloadSize(query string) error { + // If maxPayloadSize is the default value of 0, return early. + if *maxPayloadSize == 0 { + return nil + } + if len(query) > *maxPayloadSize { + return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "query payload size above threshold") + } + return nil +} + // Prepare executes a prepare statements. func (e *Executor) Prepare(ctx context.Context, method string, safeSession *SafeSession, sql string, bindVars map[string]*querypb.BindVariable) (fld []*querypb.Field, err error) { logStats := NewLogStats(ctx, method, sql, bindVars) diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 9176022c940..232875015da 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -1869,6 +1869,28 @@ func TestGenerateCharsetRows(t *testing.T) { } } +func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { + save := *maxPayloadSize + *maxPayloadSize = 5 + defer func() { *maxPayloadSize = save }() + + executor, _, _, _ := createExecutorEnv() + session := NewSafeSession(&vtgatepb.Session{TargetString: "@master"}) + testCases := []string{ + "select * from main1", + "insert into main1(id) values (1), (2)", + "update main1 set id=1", + "delete from main1 where id=1", + } + for _, query := range testCases { + _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeExceeded", session, query, nil) + want := "query payload size above threshold" + if err == nil || err.Error() != want { + t.Errorf("got: %v, want %s", err, want) + } + } +} + func TestOlapSelectDatabase(t *testing.T) { executor, _, _, _ := createExecutorEnv() executor.normalize = true diff --git a/go/vt/vtgate/planbuilder/insert.go b/go/vt/vtgate/planbuilder/insert.go index 78a44c25414..aa584b19284 100644 --- a/go/vt/vtgate/planbuilder/insert.go +++ b/go/vt/vtgate/planbuilder/insert.go @@ -67,9 +67,6 @@ func buildInsertUnshardedPlan(ins *sqlparser.Insert, table *vindexes.Table) (eng return nil, errors.New("unsupported: auto-inc and select in insert") } eins.Query = generateQuery(ins) - if err := validatePayloadSize(ins, eins); err != nil { - return nil, err - } return eins, nil case sqlparser.Values: rows = insertValues @@ -98,9 +95,6 @@ func buildInsertUnshardedPlan(ins *sqlparser.Insert, table *vindexes.Table) (eng eins.Query = generateQuery(ins) } - if err := validatePayloadSize(ins, eins); err != nil { - return nil, err - } return eins, nil } @@ -186,10 +180,6 @@ func buildInsertShardedPlan(ins *sqlparser.Insert, table *vindexes.Table) (engin eins.VindexValues = routeValues eins.Query = generateQuery(ins) generateInsertShardedQuery(ins, eins, rows) - if err := validatePayloadSize(ins, eins); err != nil { - return nil, err - } - return eins, nil } @@ -283,35 +273,3 @@ func isVindexChanging(setClauses sqlparser.UpdateExprs, colVindexes []*vindexes. } return false } - -// isAboveMaxPayloadSize returns true if an insert payload is within the -// configured DirectiveMaxPayloadSize threshold. Otherwise, returns false. -func isAboveMaxPayloadSize(eins *engine.Insert, threshold int) bool { - switch eins.Opcode { - case engine.InsertUnsharded: - totalBytes := len(eins.Query) - return totalBytes > threshold - default: - totalBytes := len(eins.Prefix) + len(eins.Suffix) - for _, m := range eins.Mid { - totalBytes += len(m) - } - return totalBytes > threshold - } -} - -// validatePayloadSize validates whether an insert payload is above the -// configured DirectiveMaxPayloadSize threshold, if set. -func validatePayloadSize(ins *sqlparser.Insert, eins *engine.Insert) error { - directives := sqlparser.ExtractCommentDirectives(ins.Comments) - threshold, isSet := maxPayloadSize(directives) - if isSet { - if threshold == 0 { - return errors.New("invalid DirectiveMaxPayloadSize value") - } - if isAboveMaxPayloadSize(eins, threshold) { - return errors.New("unsupported: payload size above threshold") - } - } - return nil -} diff --git a/go/vt/vtgate/planbuilder/route.go b/go/vt/vtgate/planbuilder/route.go index bac7188cdd2..6a7488e8441 100644 --- a/go/vt/vtgate/planbuilder/route.go +++ b/go/vt/vtgate/planbuilder/route.go @@ -534,24 +534,3 @@ func queryTimeout(d sqlparser.CommentDirectives) int { } return 0 } - -// maxPayloadSize returns an int maxPayloadSize value, if set, -// and a boolean indicating whether a maxPayloadSize value was set. -// Otherwise, returns 0 and false. -func maxPayloadSize(d sqlparser.CommentDirectives) (int, bool) { - if d == nil { - return 0, false - } - - val, ok := d[sqlparser.DirectiveMaxPayloadSize] - if !ok { - return 0, ok - } - - intVal, ok := val.(int) - if ok { - return intVal, ok - } - - return 0, true -} diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt index 4fc32bd524d..d2b6d946592 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt @@ -667,29 +667,6 @@ } } -# simple insert unsharded -- within max payload size -"insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into unsharded values(1, 2)" -{ - "QueryType": "INSERT", - "Original": "insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into unsharded values(1, 2)", - "Instructions": { - "OperatorType": "Insert", - "Variant": "Unsharded", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "TargetTabletType": "MASTER", - "MultiShardAutocommit": false, - "Query": "insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into unsharded values (1, 2)", - "TableName": "unsharded" - } -} - -# simple insert unsharded -- above max payload size -"insert /*vt+ MAX_PAYLOAD_SIZE=10 */ into unsharded values(1, 2)" -"unsupported: payload size above threshold" - # simple upsert unsharded "insert into unsharded values(1, 2) on duplicate key update x = 3" { @@ -1232,29 +1209,6 @@ } } -# insert with multiple rows sharded -- within max payload size -"insert /*vt+ MAX_PAYLOAD_SIZE=150 */ into user(id) values (1), (2)" -{ - "QueryType": "INSERT", - "Original": "insert /*vt+ MAX_PAYLOAD_SIZE=150 */ into user(id) values (1), (2)", - "Instructions": { - "OperatorType": "Insert", - "Variant": "Sharded", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "TargetTabletType": "MASTER", - "MultiShardAutocommit": false, - "Query": "insert /*vt+ MAX_PAYLOAD_SIZE=150 */ into user(id, Name, Costly) values (:_Id0, :_Name0, :_Costly0), (:_Id1, :_Name1, :_Costly1)", - "TableName": "user" - } -} - -# insert with multiple rows sharded -- within max payload size -"insert /*vt+ MAX_PAYLOAD_SIZE=100 */ into user(id) values (1), (2)" -"unsupported: payload size above threshold" - # insert into a vindex not allowed "insert into user_index(id) values(1)" "unsupported: multi-shard or vindex write statement" diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index cd04de6dbc1..2df576f1278 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -67,6 +67,7 @@ var ( HealthCheckRetryDelay = flag.Duration("healthcheck_retry_delay", 2*time.Millisecond, "health check retry delay") // HealthCheckTimeout is the timeout on the RPC call to tablets HealthCheckTimeout = flag.Duration("healthcheck_timeout", time.Minute, "the health check timeout period") + maxPayloadSize = flag.Int("max_payload_size", 0, "The threshold for query payloads in bytes. A payload greater than this threshold will result in a failure to handle the query.") ) func getTxMode() vtgatepb.TransactionMode { From c82a3f2a10c69d7820ed4ac609965102886ecf8b Mon Sep 17 00:00:00 2001 From: Serry Park Date: Mon, 18 May 2020 15:33:27 -0700 Subject: [PATCH 062/430] add query comment override Signed-off-by: Serry Park --- go/vt/sqlparser/comments.go | 23 ++++++++++++++++ go/vt/sqlparser/comments_test.go | 20 ++++++++++++++ go/vt/vtgate/executor.go | 29 +++++++++++--------- go/vt/vtgate/executor_test.go | 46 ++++++++++++++++++++++++++++---- go/vt/vtgate/vtgate.go | 3 ++- 5 files changed, 102 insertions(+), 19 deletions(-) diff --git a/go/vt/sqlparser/comments.go b/go/vt/sqlparser/comments.go index 497b95e5366..b5ee4802062 100644 --- a/go/vt/sqlparser/comments.go +++ b/go/vt/sqlparser/comments.go @@ -32,6 +32,8 @@ const ( DirectiveQueryTimeout = "QUERY_TIMEOUT_MS" // DirectiveScatterErrorsAsWarnings enables partial success scatter select queries DirectiveScatterErrorsAsWarnings = "SCATTER_ERRORS_AS_WARNINGS" + // DirectiveMaxPayloadSizeOverride skips payload size validation when set. + DirectiveMaxPayloadSizeOverride = "MAX_PAYLOAD_SIZE_OVERRIDE" ) func isNonSpace(r rune) bool { @@ -298,3 +300,24 @@ func SkipQueryPlanCacheDirective(stmt Statement) bool { } return false } + +// MaxPayloadSizeOverrideDirective returns true if the max payload size override +// directive is set to true. +func MaxPayloadSizeOverrideDirective(stmt Statement) bool { + switch stmt := stmt.(type) { + case *Select: + directives := ExtractCommentDirectives(stmt.Comments) + return directives.IsSet(DirectiveMaxPayloadSizeOverride) + case *Insert: + directives := ExtractCommentDirectives(stmt.Comments) + return directives.IsSet(DirectiveMaxPayloadSizeOverride) + case *Update: + directives := ExtractCommentDirectives(stmt.Comments) + return directives.IsSet(DirectiveMaxPayloadSizeOverride) + case *Delete: + directives := ExtractCommentDirectives(stmt.Comments) + return directives.IsSet(DirectiveMaxPayloadSizeOverride) + default: + return false + } +} diff --git a/go/vt/sqlparser/comments_test.go b/go/vt/sqlparser/comments_test.go index 3d875faf1cb..7dbfca53b06 100644 --- a/go/vt/sqlparser/comments_test.go +++ b/go/vt/sqlparser/comments_test.go @@ -385,3 +385,23 @@ func TestSkipQueryPlanCacheDirective(t *testing.T) { t.Errorf("d.SkipQueryPlanCacheDirective(stmt) should be true") } } + +func TestMaxPayloadSizeOverrideDirective(t *testing.T) { + testCases := []struct { + query string + expected bool + }{ + {"insert /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ into user(id) values (1), (2)", true}, + {"insert into user(id) values (1), (2)", false}, + {"update /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ users set name=1", true}, + {"select /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ * from users", true}, + {"delete /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ from users", true}, + } + + for _, test := range testCases { + stmt, _ := Parse(test.query) + if got := MaxPayloadSizeOverrideDirective(stmt); got != test.expected { + t.Errorf("d.MaxPayloadSizeOverrideDirective(stmt) returned %v but expected %v", got, test.expected) + } + } +} diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index 348e79dec7f..edb74fd30de 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -1283,13 +1283,14 @@ func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, comments sqlparser. return nil, err } - // Normalize if possible and retry. query := sql - if err = validatePayloadSize(query); err != nil { - return nil, err - } statement := stmt bindVarNeeds := sqlparser.BindVarNeeds{} + if !sqlparser.MaxPayloadSizeOverrideDirective(statement) && !isValidPayloadSize(query) { + return nil, vterrors.New(vtrpcpb.Code_RESOURCE_EXHAUSTED, "query payload size above threshold") + } + + // Normalize if possible and retry. if (e.normalize && sqlparser.CanNormalize(stmt)) || sqlparser.IsSetStatement(stmt) { parameterize := e.normalize // the public flag is called normalize result, err := sqlparser.PrepareAST(stmt, bindVars, "vtg", parameterize) @@ -1498,17 +1499,19 @@ func checkLikeOpt(likeOpt string, colNames []string) (string, error) { return "", nil } -// validatePayloadSize validates whether a query payload is above the -// configured MaxPayloadSize threshold -func validatePayloadSize(query string) error { - // If maxPayloadSize is the default value of 0, return early. - if *maxPayloadSize == 0 { - return nil +// isValidPayloadSize validates whether a query payload is above the +// configured MaxPayloadSize threshold. The PayloadSizeExceeded will increment +// if the payload size exceeds the warnPayloadSize. + +func isValidPayloadSize(query string) bool { + payloadSize := len(query) + if *maxPayloadSize > 0 && payloadSize > *maxPayloadSize { + return false } - if len(query) > *maxPayloadSize { - return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "query payload size above threshold") + if *warnPayloadSize > 0 && payloadSize > *warnPayloadSize { + warnings.Add("PayloadSizeExceeded", 1) } - return nil + return true } // Prepare executes a prepare statements. diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 232875015da..2122925e0fe 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -1870,25 +1870,61 @@ func TestGenerateCharsetRows(t *testing.T) { } func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { - save := *maxPayloadSize - *maxPayloadSize = 5 - defer func() { *maxPayloadSize = save }() + saveMax := *maxPayloadSize + saveWarn := *warnPayloadSize + *maxPayloadSize = 10 + *warnPayloadSize = 5 + defer func() { + *maxPayloadSize = saveMax + *warnPayloadSize = saveWarn + }() executor, _, _, _ := createExecutorEnv() session := NewSafeSession(&vtgatepb.Session{TargetString: "@master"}) - testCases := []string{ + warningCount := warnings.Counts()["PayloadSizeExceeded"] + testMaxPayloadSizeExceeded := []string{ "select * from main1", "insert into main1(id) values (1), (2)", "update main1 set id=1", "delete from main1 where id=1", } - for _, query := range testCases { + for _, query := range testMaxPayloadSizeExceeded { _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeExceeded", session, query, nil) want := "query payload size above threshold" if err == nil || err.Error() != want { t.Errorf("got: %v, want %s", err, want) } } + if got, want := warnings.Counts()["PayloadSizeExceeded"], warningCount; got != want { + t.Errorf("warnings count: %v, want %v", got, want) + } + + testMaxPayloadSizeOverride := []string{ + "select /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ * from main1", + "insert /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ into main1(id) values (1), (2)", + "update /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ main1 set id=1", + "delete /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ from main1 where id=1", + } + for _, query := range testMaxPayloadSizeOverride { + _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeWithOverride", session, query, nil) + if err != nil { + t.Errorf("error should be nil - got: %v", err) + } + } + if got, want := warnings.Counts()["PayloadSizeExceeded"], warningCount; got != want { + t.Errorf("warnings count: %v, want %v", got, want) + } + + *maxPayloadSize = 1000 + for _, query := range testMaxPayloadSizeExceeded { + _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeExceeded", session, query, nil) + if err != nil { + t.Errorf("error should be nil - got: %v", err) + } + } + if got, want := warnings.Counts()["PayloadSizeExceeded"], warningCount+4; got != want { + t.Errorf("warnings count: %v, want %v", got, want) + } } func TestOlapSelectDatabase(t *testing.T) { diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index 2df576f1278..671725bc197 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -68,6 +68,7 @@ var ( // HealthCheckTimeout is the timeout on the RPC call to tablets HealthCheckTimeout = flag.Duration("healthcheck_timeout", time.Minute, "the health check timeout period") maxPayloadSize = flag.Int("max_payload_size", 0, "The threshold for query payloads in bytes. A payload greater than this threshold will result in a failure to handle the query.") + warnPayloadSize = flag.Int("warn_payload_size", 0, "The warning threshold for query payloads in bytes. A payload greater than this threshold will cause the VtGateWarnings.PayloadSizeExceeded counter to be incremented.") ) func getTxMode() vtgatepb.TransactionMode { @@ -195,7 +196,7 @@ func Init(ctx context.Context, serv srvtopo.Server, cell string, tabletTypesToWa _ = stats.NewRates("ErrorsByDbType", stats.CounterForDimension(errorCounts, "DbType"), 15, 1*time.Minute) _ = stats.NewRates("ErrorsByCode", stats.CounterForDimension(errorCounts, "Code"), 15, 1*time.Minute) - warnings = stats.NewCountersWithSingleLabel("VtGateWarnings", "Vtgate warnings", "type", "IgnoredSet", "ResultsExceeded") + warnings = stats.NewCountersWithSingleLabel("VtGateWarnings", "Vtgate warnings", "type", "IgnoredSet", "ResultsExceeded", "PayloadSizeExceeded") servenv.OnRun(func() { for _, f := range RegisterVTGates { From 01b94f826dd8d62a18e8a9bbbb82953bd3f51c8d Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Mon, 22 Jun 2020 09:55:58 -0700 Subject: [PATCH 063/430] sql: allow parenthesis in from subquery Signed-off-by: Sugu Sougoumarane --- go/vt/sqlparser/sql.go | 2574 ++++++++++++++++++++-------------------- go/vt/sqlparser/sql.y | 16 +- 2 files changed, 1269 insertions(+), 1321 deletions(-) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index b0357e5c57e..04d65a35da4 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -856,30 +856,6 @@ var yyExca = [...]int{ -1, 424, 87, 885, -2, 650, - -1, 737, - 1, 394, - 5, 394, - 12, 394, - 13, 394, - 14, 394, - 15, 394, - 17, 394, - 19, 394, - 30, 394, - 31, 394, - 45, 394, - 46, 394, - 47, 394, - 48, 394, - 49, 394, - 51, 394, - 52, 394, - 55, 394, - 56, 394, - 58, 394, - 59, 394, - 360, 394, - -2, 412, -1, 740, 56, 52, 58, 52, @@ -887,383 +863,388 @@ var yyExca = [...]int{ -1, 914, 119, 689, -2, 685, + -1, 1341, + 5, 607, + 17, 607, + 19, 607, + 31, 607, + 59, 607, + -2, 395, } const yyPrivate = 57344 -const yyLast = 17835 +const yyLast = 17461 var yyAct = [...]int{ - 377, 1565, 1575, 1375, 1532, 1171, 321, 1435, 1264, 1448, - 1481, 1317, 587, 1013, 1349, 336, 707, 1017, 1189, 385, - 1314, 1060, 990, 1318, 1046, 1172, 1016, 65, 3, 307, - 668, 576, 350, 1283, 1026, 85, 1323, 901, 421, 276, - 1215, 296, 276, 1329, 839, 1159, 585, 276, 63, 1110, - 858, 908, 1241, 1232, 1030, 992, 978, 717, 732, 734, - 394, 712, 753, 934, 752, 971, 379, 878, 410, 724, - 61, 733, 276, 85, 545, 415, 546, 276, 308, 276, - 25, 311, 1056, 312, 407, 418, 66, 742, 865, 60, - 739, 7, 681, 6, 5, 1568, 1552, 1563, 1540, 1560, - 319, 565, 1376, 682, 1551, 1539, 1300, 1405, 1079, 550, - 1344, 1345, 1040, 1008, 1009, 68, 69, 70, 71, 72, - 1343, 310, 1078, 87, 88, 89, 400, 1203, 1007, 274, - 1202, 323, 27, 1204, 54, 30, 31, 303, 754, 309, - 755, 362, 380, 368, 369, 366, 367, 365, 364, 363, - 605, 1223, 1039, 87, 88, 89, 264, 370, 371, 262, - 1438, 266, 409, 1396, 1077, 1047, 1394, 547, 1266, 549, - 1507, 630, 629, 639, 640, 632, 633, 634, 635, 636, - 637, 638, 631, 53, 302, 641, 272, 268, 269, 270, - 828, 603, 600, 582, 827, 584, 601, 598, 599, 87, - 88, 89, 593, 594, 1268, 911, 825, 1562, 1559, 604, - 1533, 1263, 972, 87, 88, 89, 1074, 1071, 1072, 1284, - 1070, 1267, 1031, 1525, 1583, 1482, 566, 581, 583, 552, - 826, 829, 590, 266, 1190, 1192, 1579, 866, 867, 868, - 1484, 1269, 832, 1033, 816, 1339, 1260, 1338, 1337, 548, - 555, 1490, 1262, 1081, 1084, 265, 1129, 562, 279, 267, - 1286, 653, 654, 276, 557, 558, 280, 1514, 276, 1091, - 567, 1418, 1090, 1199, 276, 283, 1164, 263, 1139, 1118, - 276, 574, 748, 290, 580, 85, 1033, 728, 1003, 85, - 1076, 85, 1126, 666, 1288, 572, 1292, 85, 1287, 631, - 1285, 1014, 641, 641, 85, 1290, 951, 271, 863, 1523, - 1483, 621, 1075, 579, 1289, 1191, 1499, 288, 87, 88, - 89, 578, 1538, 295, 559, 859, 560, 1291, 1293, 561, - 589, 853, 611, 75, 1327, 592, 1047, 595, 756, 616, - 617, 615, 591, 606, 1508, 619, 1032, 87, 88, 89, - 281, 1577, 1080, 556, 1578, 1261, 1576, 1259, 564, 1491, - 1489, 621, 551, 1302, 571, 653, 654, 1082, 620, 619, - 573, 76, 568, 569, 570, 1304, 953, 292, 284, 885, - 293, 294, 300, 935, 55, 621, 285, 287, 297, 1032, - 282, 299, 298, 883, 884, 882, 614, 1251, 612, 613, - 1362, 653, 654, 85, 577, 276, 276, 276, 935, 705, - 1136, 860, 1036, 1528, 85, 1033, 952, 854, 1037, 818, - 85, 873, 875, 876, 1221, 721, 418, 874, 704, 1247, - 1248, 1249, 669, 956, 957, 620, 619, 714, 634, 635, - 636, 637, 638, 631, 553, 554, 641, 87, 88, 89, - 651, 1543, 621, 1444, 1443, 718, 684, 686, 688, 690, - 692, 694, 695, 87, 88, 89, 1125, 685, 687, 706, - 691, 693, 1236, 696, 630, 629, 639, 640, 632, 633, - 634, 635, 636, 637, 638, 631, 620, 619, 641, 751, - 261, 741, 1124, 1235, 1123, 731, 746, 740, 544, 1584, - 1250, 1326, 1224, 621, 1545, 1255, 1252, 1243, 1253, 1246, - 1524, 1242, 1461, 620, 619, 1244, 1245, 1441, 1032, 620, - 619, 620, 619, 1029, 1027, 1233, 1028, 1101, 844, 1254, - 621, 1111, 53, 1025, 1031, 62, 621, 737, 621, 1103, - 1104, 1105, 389, 1585, 881, 276, 87, 88, 89, 814, - 85, 1496, 817, 1495, 819, 276, 276, 85, 85, 85, - 404, 405, 1358, 276, 1487, 1561, 276, 1547, 389, 276, - 837, 838, 1034, 276, 1160, 85, 1487, 1536, 1487, 389, - 85, 85, 85, 276, 85, 85, 87, 88, 89, 389, - 903, 1487, 1515, 1414, 85, 85, 815, 716, 87, 88, - 89, 974, 1206, 822, 823, 824, 1160, 843, 1487, 1486, - 618, 841, 632, 633, 634, 635, 636, 637, 638, 631, - 975, 842, 641, 1433, 1432, 1498, 846, 847, 848, 975, - 850, 851, 1420, 389, 27, 764, 1417, 389, 1368, 1367, - 855, 856, 902, 1364, 1365, 820, 821, 1364, 1363, 744, - 833, 904, 1326, 830, 964, 389, 409, 879, 1166, 836, - 975, 389, 618, 389, 1167, 85, 339, 338, 341, 342, - 343, 344, 744, 849, 27, 340, 345, 763, 762, 912, - 1315, 923, 926, 1326, 64, 53, 997, 936, 743, 965, - 1366, 975, 1207, 402, 745, 1006, 747, 1142, 85, 85, - 1141, 964, 743, 954, 1468, 914, 382, 831, 749, 27, - 53, 913, 1553, 1450, 1041, 1425, 85, 745, 918, 743, - 1061, 1354, 1210, 276, 948, 53, 85, 964, 1330, 1331, - 1265, 276, 1057, 669, 958, 1451, 964, 1052, 915, 276, - 276, 912, 1051, 276, 276, 1064, 313, 276, 276, 276, - 85, 1570, 944, 945, 905, 906, 880, 53, 1557, 1566, - 53, 1356, 418, 85, 546, 1333, 1315, 914, 1237, 864, - 835, 1183, 1181, 970, 1336, 1018, 1184, 1182, 1185, 966, - 984, 985, 980, 983, 984, 985, 981, 841, 982, 986, - 1335, 1180, 1330, 1331, 1179, 968, 1550, 989, 1308, 1149, - 1408, 998, 1048, 1049, 1050, 1000, 996, 715, 1555, 1158, - 1157, 708, 1228, 967, 761, 1005, 1001, 276, 85, 669, - 85, 973, 1083, 709, 575, 1004, 276, 276, 276, 276, - 276, 1220, 276, 276, 999, 1062, 276, 85, 1021, 1530, + 377, 1580, 1570, 1380, 1537, 1268, 1019, 321, 1173, 1453, + 1486, 1321, 1193, 992, 1174, 336, 1354, 385, 350, 65, + 3, 1042, 1322, 1318, 707, 1028, 1048, 1062, 576, 668, + 1333, 1327, 1018, 1219, 1287, 85, 1015, 901, 1440, 276, + 839, 296, 276, 421, 1112, 739, 858, 276, 1245, 1032, + 908, 307, 1161, 753, 994, 1236, 989, 978, 734, 714, + 394, 733, 323, 712, 717, 934, 878, 410, 379, 415, + 545, 407, 276, 85, 25, 971, 546, 276, 1058, 276, + 319, 724, 312, 742, 274, 63, 61, 752, 60, 682, + 865, 7, 303, 6, 5, 1573, 66, 1557, 1568, 681, + 308, 1081, 362, 311, 368, 369, 366, 367, 365, 364, + 363, 585, 565, 1545, 1565, 1080, 1381, 409, 370, 371, + 1556, 1544, 547, 1304, 549, 68, 69, 70, 71, 72, + 1410, 550, 1348, 400, 1349, 1350, 380, 272, 268, 269, + 270, 1010, 1011, 754, 310, 755, 87, 88, 89, 87, + 88, 89, 27, 1009, 54, 30, 31, 1079, 264, 1207, + 309, 262, 1206, 266, 587, 1208, 600, 1227, 1041, 1270, + 601, 598, 599, 605, 1443, 87, 88, 89, 1049, 1401, + 911, 1512, 630, 629, 639, 640, 632, 633, 634, 635, + 636, 637, 638, 631, 1399, 302, 641, 828, 593, 594, + 603, 1272, 825, 53, 1567, 1564, 827, 1538, 1267, 1076, + 1073, 1074, 972, 1072, 1584, 1530, 590, 1033, 1588, 582, + 566, 584, 1271, 552, 27, 28, 54, 30, 31, 266, + 1487, 1273, 604, 832, 1035, 816, 1344, 418, 829, 866, + 867, 868, 826, 58, 1495, 1489, 1083, 1086, 32, 49, + 50, 1343, 52, 581, 583, 1264, 1342, 265, 271, 548, + 1035, 1266, 555, 276, 557, 558, 279, 267, 276, 1093, + 567, 41, 1092, 1519, 276, 53, 1423, 1194, 1196, 263, + 276, 574, 1203, 1078, 580, 85, 653, 654, 1166, 85, + 1141, 85, 87, 88, 89, 1120, 748, 85, 728, 666, + 1131, 572, 939, 631, 85, 1077, 641, 1016, 556, 641, + 951, 1005, 1049, 564, 589, 1488, 1035, 619, 75, 571, + 562, 863, 621, 1128, 611, 573, 591, 1528, 1504, 1582, + 859, 1331, 1583, 621, 1581, 853, 1288, 1034, 1543, 579, + 34, 35, 37, 36, 39, 1082, 51, 786, 87, 88, + 89, 756, 1496, 1494, 578, 1513, 76, 1126, 1195, 1125, + 1084, 616, 617, 1034, 1265, 615, 1263, 1306, 388, 40, + 57, 56, 818, 935, 47, 48, 38, 1290, 620, 619, + 935, 651, 1138, 568, 569, 570, 1225, 559, 721, 560, + 42, 43, 561, 44, 45, 621, 614, 1533, 612, 613, + 592, 705, 595, 85, 55, 276, 276, 276, 606, 653, + 654, 1292, 1038, 1296, 85, 1291, 860, 1289, 1039, 1034, + 85, 854, 1294, 1548, 1031, 1029, 669, 1030, 1449, 1448, + 774, 1293, 653, 654, 1027, 1033, 1589, 577, 1550, 704, + 87, 88, 89, 1240, 1295, 1297, 1105, 1106, 1107, 1239, + 731, 1228, 740, 685, 687, 718, 691, 693, 885, 696, + 620, 619, 732, 684, 686, 688, 690, 692, 694, 695, + 1529, 787, 883, 884, 882, 544, 55, 621, 741, 706, + 1590, 1466, 551, 751, 1446, 634, 635, 636, 637, 638, + 631, 1237, 746, 641, 800, 803, 804, 805, 806, 807, + 808, 1103, 809, 810, 811, 812, 813, 788, 789, 790, + 791, 772, 773, 801, 844, 775, 389, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 792, 793, 794, + 795, 796, 797, 798, 799, 639, 640, 632, 633, 634, + 635, 636, 637, 638, 631, 276, 1501, 641, 1500, 814, + 85, 1363, 817, 1036, 819, 276, 276, 85, 85, 85, + 87, 88, 89, 276, 553, 554, 276, 53, 53, 276, + 837, 838, 716, 276, 261, 85, 1127, 1330, 418, 881, + 85, 85, 85, 276, 85, 85, 802, 87, 88, 89, + 764, 903, 620, 619, 85, 85, 956, 957, 1419, 1308, + 820, 821, 1492, 1566, 843, 87, 88, 89, 830, 621, + 618, 409, 1319, 1367, 836, 1330, 841, 629, 639, 640, + 632, 633, 634, 635, 636, 637, 638, 631, 849, 1503, + 641, 620, 619, 873, 875, 876, 999, 833, 743, 874, + 62, 953, 902, 879, 404, 405, 1552, 389, 621, 620, + 619, 904, 632, 633, 634, 635, 636, 637, 638, 631, + 1371, 815, 641, 1492, 1541, 85, 621, 975, 822, 823, + 824, 1492, 389, 1492, 1520, 339, 338, 341, 342, 343, + 344, 952, 923, 926, 340, 345, 842, 880, 936, 1492, + 1491, 846, 847, 848, 389, 850, 851, 1211, 85, 85, + 620, 619, 1438, 1437, 1008, 855, 856, 913, 1425, 389, + 914, 87, 88, 89, 64, 1210, 85, 621, 1422, 389, + 1373, 1372, 948, 276, 1369, 1370, 85, 669, 1162, 918, + 965, 276, 958, 974, 905, 906, 1369, 1368, 1144, 276, + 276, 964, 389, 276, 276, 975, 389, 276, 276, 276, + 85, 944, 945, 744, 915, 618, 389, 964, 990, 763, + 762, 975, 1162, 85, 546, 1143, 964, 743, 967, 970, + 382, 954, 914, 831, 975, 316, 973, 964, 744, 966, + 980, 983, 984, 985, 981, 749, 982, 986, 27, 1001, + 1334, 1335, 841, 1558, 1044, 1045, 1046, 1047, 745, 1000, + 747, 1455, 1043, 1002, 1050, 1051, 1052, 968, 1330, 1430, + 1055, 1056, 1057, 1063, 1255, 1003, 998, 276, 85, 1006, + 85, 53, 1085, 745, 1269, 743, 276, 276, 276, 276, + 276, 912, 276, 276, 1023, 1359, 276, 85, 1007, 53, + 27, 1064, 1334, 1335, 1575, 1214, 1251, 1252, 1253, 27, + 1059, 919, 920, 276, 1054, 925, 928, 929, 276, 1053, + 276, 276, 1067, 1456, 1168, 276, 1066, 1571, 1361, 1337, + 1169, 1087, 1088, 1089, 1090, 1091, 1319, 1094, 1095, 1473, + 943, 1096, 1241, 946, 947, 864, 835, 1100, 1151, 1060, + 1061, 53, 1185, 912, 1183, 378, 1340, 1186, 1098, 1184, + 53, 879, 1339, 1099, 1182, 980, 983, 984, 985, 981, + 1104, 982, 986, 1187, 418, 984, 985, 1254, 1181, 1562, + 1555, 1312, 1259, 1256, 1247, 1257, 1250, 1020, 1246, 1068, + 86, 1070, 1248, 1249, 277, 715, 1122, 277, 1560, 1160, + 1159, 1232, 277, 761, 575, 880, 1258, 1224, 1097, 1108, 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, - 638, 631, 1529, 276, 641, 931, 1446, 1466, 276, 1218, - 276, 276, 1067, 1212, 1066, 276, 1068, 1412, 834, 932, - 737, 988, 383, 384, 737, 395, 919, 920, 737, 386, - 925, 928, 929, 1095, 1156, 1042, 1043, 1044, 1045, 396, - 1098, 1411, 1155, 1058, 1059, 387, 719, 720, 398, 64, - 397, 1053, 1054, 1055, 1410, 943, 1311, 1065, 946, 947, - 1160, 602, 378, 1572, 1571, 879, 1085, 1086, 1087, 1088, - 1089, 1130, 1092, 1093, 1127, 857, 1094, 629, 639, 640, - 632, 633, 634, 635, 636, 637, 638, 631, 1120, 395, - 641, 722, 1572, 1096, 1512, 1439, 950, 86, 1097, 382, - 1106, 277, 62, 396, 277, 1102, 67, 59, 1, 277, - 392, 393, 398, 1564, 397, 1148, 276, 980, 983, 984, - 985, 981, 1377, 982, 986, 1153, 276, 276, 276, 276, - 276, 1173, 1119, 1447, 277, 86, 1073, 1531, 276, 277, - 1480, 277, 1348, 1024, 276, 1015, 380, 1135, 276, 1168, - 74, 543, 73, 1522, 852, 588, 1023, 1022, 1488, 622, - 1437, 1035, 1222, 1038, 880, 1205, 1152, 85, 1355, 1219, - 1527, 769, 1161, 767, 1162, 768, 1211, 1163, 766, 1018, - 1216, 1216, 771, 770, 1208, 765, 1175, 1176, 289, 1178, - 413, 987, 1195, 1186, 1197, 313, 1198, 1174, 757, 1194, - 1177, 1063, 723, 77, 679, 1258, 1196, 1257, 1069, 862, - 1227, 286, 1229, 1230, 1231, 85, 85, 1225, 1226, 1200, - 596, 1217, 597, 291, 649, 1154, 1201, 419, 412, 1321, - 710, 713, 955, 1213, 1214, 711, 1409, 1310, 1134, 678, - 933, 322, 872, 337, 334, 85, 335, 737, 959, 1240, - 1165, 623, 320, 314, 736, 729, 1234, 737, 737, 737, - 737, 737, 1239, 979, 977, 1115, 1116, 976, 408, 85, - 1332, 1328, 735, 963, 1256, 902, 391, 1404, 1506, 737, - 390, 1280, 930, 46, 607, 304, 1133, 1282, 29, 399, - 20, 1270, 19, 18, 22, 17, 16, 1271, 1272, 15, - 563, 33, 1305, 24, 23, 276, 14, 1273, 13, 1295, - 12, 11, 1294, 10, 9, 85, 8, 4, 1281, 1279, - 85, 85, 1316, 1173, 610, 277, 21, 1280, 914, 667, - 277, 2, 1301, 0, 913, 0, 277, 0, 0, 0, - 0, 0, 277, 0, 85, 0, 0, 86, 0, 0, - 1319, 86, 0, 86, 0, 0, 0, 0, 85, 86, - 85, 85, 0, 0, 1216, 1216, 86, 1325, 0, 0, - 1018, 1334, 1018, 0, 0, 351, 26, 1347, 0, 1361, - 1340, 0, 0, 0, 1346, 0, 0, 0, 276, 1359, - 1360, 0, 1342, 0, 1341, 1309, 1351, 0, 0, 0, - 0, 0, 26, 0, 1352, 1353, 0, 0, 276, 0, - 0, 0, 0, 0, 85, 0, 1378, 85, 85, 85, - 276, 1370, 845, 639, 640, 632, 633, 634, 635, 636, - 637, 638, 631, 0, 0, 641, 1371, 381, 1373, 0, - 0, 0, 0, 0, 0, 0, 861, 0, 0, 0, - 0, 1387, 0, 1383, 1384, 0, 0, 0, 0, 0, - 1392, 0, 869, 870, 871, 86, 0, 277, 277, 277, - 0, 0, 0, 0, 0, 0, 86, 0, 1369, 0, - 0, 0, 86, 1173, 0, 0, 0, 1413, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 85, 1372, 0, - 0, 0, 1422, 0, 0, 85, 0, 0, 0, 1018, - 1382, 1431, 0, 0, 1208, 0, 921, 922, 0, 0, - 85, 0, 0, 0, 1421, 0, 0, 85, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1440, 1449, - 1442, 1454, 0, 0, 0, 0, 0, 1389, 1390, 0, - 1391, 0, 0, 1393, 1452, 1395, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1453, 1445, 0, 85, 85, - 0, 85, 0, 0, 1460, 0, 85, 0, 85, 85, - 85, 276, 0, 1474, 85, 1475, 1477, 1478, 1467, 0, - 0, 1473, 1465, 0, 1469, 0, 0, 1319, 1485, 0, - 1012, 85, 276, 1479, 1493, 1492, 1494, 277, 1500, 0, - 0, 0, 86, 1434, 0, 0, 0, 277, 277, 86, - 86, 86, 0, 0, 0, 277, 0, 0, 277, 0, - 1513, 277, 0, 1521, 0, 277, 0, 86, 85, 0, - 0, 1520, 86, 86, 86, 277, 86, 86, 1519, 85, - 85, 1319, 0, 0, 0, 0, 86, 86, 1534, 0, - 586, 1449, 1018, 0, 586, 85, 586, 1535, 1541, 1173, - 0, 786, 586, 0, 0, 0, 276, 0, 0, 0, - 26, 0, 0, 0, 85, 0, 0, 0, 0, 0, - 0, 0, 1501, 650, 652, 1549, 0, 0, 0, 0, - 0, 0, 1554, 1556, 85, 0, 0, 0, 0, 0, - 0, 1558, 0, 0, 0, 0, 1569, 0, 0, 0, - 0, 348, 0, 0, 665, 1580, 0, 86, 670, 671, - 672, 673, 674, 675, 676, 677, 0, 680, 683, 683, + 638, 631, 1535, 1534, 641, 1471, 276, 277, 86, 1222, + 916, 917, 277, 1150, 277, 931, 276, 276, 276, 276, + 276, 395, 1175, 1155, 1121, 708, 1216, 1451, 276, 932, + 380, 1170, 276, 1069, 1417, 396, 276, 709, 834, 1137, + 276, 988, 719, 720, 398, 1158, 397, 1113, 949, 383, + 384, 1192, 386, 1157, 1416, 1415, 387, 1209, 1154, 85, + 395, 64, 1164, 1315, 1162, 1212, 602, 1165, 1215, 1163, + 1577, 1576, 1220, 1220, 396, 1177, 1178, 1176, 1180, 1132, + 1179, 392, 393, 398, 1188, 397, 1129, 857, 722, 1407, + 1198, 1199, 1577, 1201, 1517, 1202, 1200, 1444, 950, 382, + 62, 67, 1204, 59, 1, 1569, 1221, 85, 85, 1382, + 1452, 1229, 1230, 1075, 1536, 1485, 1353, 1026, 1017, 74, + 1217, 1218, 543, 73, 1527, 1231, 852, 1233, 1234, 1235, + 1117, 1118, 588, 1025, 1024, 1493, 1442, 85, 1037, 1226, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 1238, 1135, 1040, 1360, 1223, 1532, 769, 767, 768, 766, + 771, 85, 1260, 1244, 770, 765, 289, 902, 630, 629, + 639, 640, 632, 633, 634, 635, 636, 637, 638, 631, + 413, 987, 641, 757, 1065, 1275, 1276, 1286, 723, 77, + 1262, 1261, 1071, 862, 1277, 286, 596, 276, 277, 597, + 291, 649, 1299, 277, 1298, 1156, 1205, 85, 419, 277, + 1283, 412, 85, 85, 1325, 277, 1175, 1320, 955, 1243, + 86, 1285, 913, 1020, 86, 914, 86, 711, 1323, 1414, + 1314, 1136, 86, 678, 933, 1305, 322, 872, 85, 86, + 337, 334, 1313, 335, 959, 1167, 623, 1115, 1274, 320, + 1338, 1116, 85, 314, 85, 85, 736, 729, 1220, 1220, + 1352, 979, 1123, 1124, 977, 976, 1329, 408, 1130, 1345, + 1336, 1133, 1134, 1366, 1332, 735, 963, 391, 1409, 1140, + 1511, 1356, 276, 1142, 1351, 390, 1145, 1146, 1147, 1148, + 1149, 1357, 1358, 1347, 930, 46, 607, 304, 29, 1346, + 399, 20, 276, 19, 18, 22, 1364, 1365, 85, 17, + 1383, 85, 85, 85, 276, 16, 15, 563, 33, 24, + 23, 14, 13, 12, 11, 1284, 10, 1374, 9, 8, + 4, 610, 1190, 1191, 21, 667, 737, 1375, 86, 2, + 277, 277, 277, 1392, 1388, 1389, 1309, 1377, 0, 86, + 1394, 1395, 1376, 1396, 1378, 86, 1398, 0, 1400, 1387, + 1397, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1284, 0, 0, 0, 0, 0, 0, 1175, 0, + 0, 0, 0, 0, 1418, 1427, 0, 0, 0, 0, + 0, 0, 85, 0, 0, 0, 0, 0, 1212, 0, + 85, 0, 0, 0, 1436, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 85, 1020, 1439, 1020, 0, + 0, 0, 85, 0, 0, 0, 0, 0, 0, 1426, + 0, 0, 0, 0, 0, 1445, 1459, 1447, 0, 877, + 0, 0, 886, 887, 888, 889, 890, 891, 892, 893, + 894, 895, 896, 897, 898, 899, 900, 1457, 0, 0, + 1281, 1282, 1458, 85, 85, 0, 85, 1465, 0, 0, + 0, 85, 0, 85, 85, 85, 276, 0, 1323, 85, + 277, 1474, 1472, 0, 1478, 86, 1470, 0, 0, 1484, + 277, 277, 86, 86, 86, 1490, 85, 276, 277, 940, + 1497, 277, 0, 0, 277, 0, 0, 0, 277, 1479, + 86, 1480, 1482, 1483, 0, 86, 86, 86, 277, 86, + 86, 0, 1498, 0, 1499, 1518, 1450, 0, 1526, 86, + 86, 0, 1323, 85, 1505, 1341, 1525, 1524, 0, 0, + 0, 0, 1506, 0, 85, 85, 0, 0, 0, 0, + 0, 1540, 0, 1539, 0, 0, 1020, 0, 0, 0, + 85, 0, 0, 0, 0, 1175, 1546, 0, 0, 0, + 0, 276, 0, 0, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 1454, 1554, 0, 0, + 0, 402, 0, 0, 0, 0, 0, 1559, 1561, 85, + 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1574, 0, 0, 0, 1549, 0, 0, 1585, + 0, 0, 0, 0, 0, 0, 1391, 0, 0, 0, + 1393, 0, 0, 86, 86, 0, 0, 1563, 0, 0, + 0, 1402, 1403, 0, 313, 0, 0, 0, 0, 0, + 0, 86, 0, 0, 0, 0, 0, 0, 277, 0, + 0, 86, 0, 0, 0, 0, 277, 1420, 1421, 0, + 1424, 0, 0, 0, 277, 277, 0, 0, 277, 277, + 0, 0, 277, 277, 277, 86, 0, 0, 1435, 0, + 0, 0, 0, 0, 0, 351, 26, 1406, 86, 1109, + 1110, 1111, 0, 0, 0, 0, 0, 0, 1454, 1020, + 0, 0, 0, 0, 0, 625, 0, 628, 0, 0, + 0, 0, 26, 642, 643, 644, 645, 646, 647, 648, + 0, 626, 627, 624, 630, 629, 639, 640, 632, 633, + 634, 635, 636, 637, 638, 631, 0, 0, 641, 0, + 0, 0, 277, 86, 0, 86, 0, 381, 0, 0, + 0, 277, 277, 277, 277, 277, 0, 277, 277, 0, + 0, 277, 86, 0, 0, 1481, 630, 629, 639, 640, + 632, 633, 634, 635, 636, 637, 638, 631, 277, 389, + 641, 0, 0, 277, 0, 277, 277, 0, 0, 0, + 277, 0, 0, 1507, 1508, 1509, 1510, 0, 1514, 0, + 1515, 1516, 0, 0, 0, 1413, 0, 0, 0, 0, + 0, 0, 0, 1521, 0, 1522, 1523, 0, 630, 629, + 639, 640, 632, 633, 634, 635, 636, 637, 638, 631, + 1412, 0, 641, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1542, 630, 629, 639, 640, 632, + 633, 634, 635, 636, 637, 638, 631, 0, 0, 641, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1551, + 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, + 638, 631, 0, 0, 641, 0, 0, 0, 0, 0, + 0, 277, 0, 0, 0, 0, 0, 622, 0, 0, + 0, 277, 277, 277, 277, 277, 0, 0, 0, 0, + 0, 1586, 1587, 277, 0, 0, 0, 277, 0, 1279, + 1280, 277, 0, 0, 0, 277, 0, 0, 0, 0, + 0, 1278, 0, 313, 1300, 1301, 0, 1302, 1303, 0, + 0, 0, 679, 348, 86, 0, 0, 0, 0, 1310, + 1311, 630, 629, 639, 640, 632, 633, 634, 635, 636, + 637, 638, 631, 0, 0, 641, 0, 0, 710, 713, + 586, 0, 0, 0, 586, 0, 586, 0, 84, 0, + 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 86, 86, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 650, 652, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, + 1405, 0, 86, 0, 0, 0, 0, 0, 0, 0, + 1362, 0, 0, 0, 665, 0, 0, 0, 670, 671, + 672, 673, 674, 675, 676, 677, 86, 680, 683, 683, 683, 689, 683, 683, 689, 683, 697, 698, 699, 700, - 701, 702, 703, 0, 774, 0, 84, 26, 0, 0, - 86, 86, 0, 0, 0, 0, 1544, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 1137, - 1402, 738, 0, 0, 0, 277, 0, 0, 86, 0, - 0, 0, 0, 277, 420, 787, 1150, 1151, 713, 0, - 0, 277, 277, 0, 0, 277, 277, 0, 0, 277, - 277, 277, 86, 0, 0, 0, 0, 0, 800, 803, - 804, 805, 806, 807, 808, 86, 809, 810, 811, 812, - 813, 788, 789, 790, 791, 772, 773, 801, 0, 775, - 0, 776, 777, 778, 779, 780, 781, 782, 783, 784, - 785, 792, 793, 794, 795, 796, 797, 798, 799, 630, + 701, 702, 703, 1404, 0, 0, 0, 26, 0, 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, - 631, 0, 0, 641, 0, 0, 0, 0, 0, 277, - 86, 0, 86, 0, 0, 0, 0, 0, 277, 277, - 277, 277, 277, 0, 277, 277, 389, 0, 277, 86, - 0, 0, 0, 0, 0, 939, 0, 0, 0, 0, - 802, 0, 0, 0, 0, 277, 0, 0, 0, 0, - 277, 0, 277, 277, 0, 586, 0, 277, 0, 0, - 0, 0, 586, 586, 586, 630, 629, 639, 640, 632, - 633, 634, 635, 636, 637, 638, 631, 0, 0, 641, + 631, 0, 277, 641, 1390, 0, 0, 0, 0, 0, + 0, 738, 86, 0, 0, 0, 0, 86, 86, 630, + 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, + 631, 0, 0, 641, 0, 0, 0, 0, 0, 87, + 88, 89, 0, 86, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 86, 0, 86, + 86, 0, 630, 629, 639, 640, 632, 633, 634, 635, + 636, 637, 638, 631, 0, 0, 641, 0, 0, 0, + 845, 0, 0, 0, 0, 0, 0, 277, 0, 0, + 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, + 0, 283, 0, 0, 861, 0, 0, 277, 0, 290, + 0, 0, 0, 86, 0, 0, 86, 86, 86, 277, + 869, 870, 871, 0, 0, 0, 0, 0, 0, 0, + 1460, 1461, 1462, 1463, 1464, 0, 0, 0, 1467, 1468, + 0, 0, 0, 288, 0, 0, 0, 0, 420, 295, + 0, 0, 420, 0, 420, 586, 0, 0, 0, 0, + 420, 0, 586, 586, 586, 0, 0, 608, 0, 0, + 0, 0, 0, 0, 921, 922, 281, 0, 0, 0, 586, 0, 0, 0, 0, 586, 586, 586, 0, 586, - 586, 0, 0, 0, 0, 625, 0, 628, 0, 586, - 586, 388, 0, 642, 643, 644, 645, 646, 647, 648, - 1303, 626, 627, 624, 630, 629, 639, 640, 632, 633, - 634, 635, 636, 637, 638, 631, 0, 0, 641, 0, - 0, 0, 0, 0, 1312, 0, 420, 1401, 0, 0, - 420, 0, 420, 0, 0, 0, 0, 0, 420, 0, - 0, 0, 1407, 1400, 0, 608, 0, 0, 277, 0, - 0, 0, 316, 27, 28, 54, 30, 31, 277, 277, - 277, 277, 277, 0, 0, 0, 0, 0, 0, 0, - 277, 0, 58, 0, 0, 0, 277, 32, 49, 50, - 277, 52, 630, 629, 639, 640, 632, 633, 634, 635, - 636, 637, 638, 631, 0, 0, 641, 0, 0, 86, - 41, 0, 0, 0, 53, 0, 630, 629, 639, 640, - 632, 633, 634, 635, 636, 637, 638, 631, 0, 0, - 641, 0, 630, 629, 639, 640, 632, 633, 634, 635, - 636, 637, 638, 631, 738, 0, 641, 0, 738, 0, - 0, 0, 738, 0, 726, 0, 0, 86, 86, 0, - 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, - 0, 758, 0, 0, 0, 0, 0, 0, 1406, 34, - 35, 37, 36, 39, 0, 51, 1399, 86, 0, 0, - 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, - 0, 1423, 0, 0, 1424, 0, 0, 1426, 40, 57, - 56, 86, 0, 47, 48, 38, 0, 0, 0, 0, - 0, 0, 0, 586, 0, 586, 0, 0, 0, 42, - 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, - 0, 0, 586, 0, 0, 0, 0, 277, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, - 0, 0, 86, 86, 0, 630, 629, 639, 640, 632, - 633, 634, 635, 636, 637, 638, 631, 0, 0, 641, - 0, 0, 0, 0, 1464, 313, 86, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 420, 86, 86, 0, 0, 0, 0, 420, 420, - 420, 0, 0, 0, 0, 55, 0, 0, 1117, 0, - 0, 381, 0, 0, 0, 0, 420, 0, 0, 0, - 277, 420, 420, 420, 0, 420, 420, 0, 0, 0, - 0, 0, 0, 0, 0, 420, 420, 0, 0, 0, - 277, 0, 0, 0, 0, 0, 86, 0, 0, 86, - 86, 86, 277, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 1169, 1170, 0, - 0, 738, 738, 738, 738, 738, 0, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 1193, 0, 1274, - 0, 0, 0, 738, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 907, 0, 420, 630, + 586, 0, 0, 0, 0, 0, 0, 86, 0, 586, + 586, 0, 0, 292, 284, 86, 293, 294, 300, 1114, + 0, 0, 285, 287, 297, 0, 282, 299, 298, 0, + 86, 0, 0, 0, 0, 0, 0, 86, 0, 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, - 631, 0, 937, 641, 0, 0, 0, 0, 0, 86, - 0, 0, 0, 0, 0, 0, 0, 86, 0, 941, - 942, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1112, 86, 0, 0, 0, 0, 960, 0, 86, - 0, 586, 0, 0, 0, 0, 0, 726, 0, 0, - 420, 630, 629, 639, 640, 632, 633, 634, 635, 636, - 637, 638, 631, 0, 0, 641, 0, 0, 0, 0, - 586, 420, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 86, 0, 86, 420, 0, 0, 0, 86, 0, - 86, 86, 86, 277, 0, 0, 86, 630, 629, 639, - 640, 632, 633, 634, 635, 636, 637, 638, 631, 0, - 0, 641, 0, 86, 277, 0, 0, 0, 0, 0, + 631, 0, 0, 641, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1014, 0, + 0, 0, 0, 0, 0, 0, 726, 0, 86, 86, + 0, 86, 0, 0, 0, 0, 86, 420, 86, 86, + 86, 277, 0, 758, 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1578, 0, + 0, 86, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, - 0, 420, 0, 1320, 0, 26, 0, 0, 0, 0, - 86, 0, 0, 0, 0, 0, 0, 0, 420, 0, - 0, 86, 86, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 916, 917, 0, 0, 86, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, - 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 949, 0, 0, 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, + 0, 0, 0, 0, 991, 0, 0, 0, 738, 86, + 86, 0, 738, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, + 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, + 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, + 420, 420, 420, 586, 0, 586, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1139, 420, 0, + 0, 0, 586, 420, 420, 420, 0, 420, 420, 0, + 0, 0, 0, 0, 1152, 1153, 713, 420, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 877, 0, 0, 886, - 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, - 897, 898, 899, 900, 0, 0, 1403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1427, 1428, 1429, 940, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, - 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1119, 0, + 0, 381, 0, 0, 0, 0, 0, 0, 907, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1238, 420, 0, 0, - 1320, 0, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 941, 942, 0, 0, 0, 0, 0, 0, 0, + 0, 738, 0, 0, 0, 0, 0, 1171, 1172, 960, + 0, 738, 738, 738, 738, 738, 0, 0, 0, 726, + 0, 0, 420, 0, 0, 0, 0, 991, 0, 1197, + 0, 0, 0, 349, 0, 738, 0, 0, 0, 0, + 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1113, 0, 0, 0, 1114, 0, 420, 0, 0, 0, - 0, 0, 1497, 0, 0, 1121, 1122, 0, 0, 0, - 0, 1128, 349, 0, 1131, 1132, 0, 0, 0, 0, - 420, 0, 1138, 0, 1320, 0, 1140, 0, 0, 1143, - 1144, 1145, 1146, 1147, 0, 0, 0, 0, 0, 0, - 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 275, 0, 0, 301, 0, 0, 0, 0, 275, - 0, 0, 0, 0, 0, 0, 420, 0, 937, 0, - 0, 1322, 1324, 0, 0, 1188, 0, 0, 0, 0, - 0, 403, 0, 0, 411, 0, 0, 0, 0, 275, - 0, 275, 0, 0, 0, 1324, 1107, 1108, 1109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, - 0, 420, 1350, 0, 0, 0, 0, 0, 1567, 0, + 1307, 0, 275, 0, 0, 301, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1316, 0, 0, 0, 0, 0, + 0, 0, 403, 586, 0, 411, 0, 0, 0, 0, + 275, 420, 275, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1374, 0, 0, 1379, 1380, - 1381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1277, 1278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 937, 0, + 0, 0, 0, 0, 0, 1324, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, - 0, 0, 0, 0, 0, 0, 1436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 420, 0, 0, 0, 275, 0, 0, 420, 0, - 275, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1470, - 1471, 0, 1472, 0, 1275, 1276, 0, 1436, 0, 1436, - 1436, 1436, 0, 0, 0, 1350, 0, 0, 0, 1296, - 1297, 0, 1298, 1299, 0, 0, 0, 0, 0, 0, - 0, 0, 1436, 0, 1306, 1307, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1386, 0, 0, 0, 1388, + 1411, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, + 0, 0, 0, 1428, 0, 0, 1429, 0, 937, 1431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1397, 1398, 0, 0, 0, 0, 0, 0, 0, 1526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 420, 420, 0, 0, 403, 0, 1415, 1416, 0, 1419, - 0, 0, 0, 0, 937, 0, 1542, 275, 275, 275, - 0, 0, 0, 0, 0, 0, 1430, 0, 0, 0, - 0, 0, 0, 1357, 0, 1548, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 420, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1408, 0, 0, 0, 0, 0, 0, 1469, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1385, 0, 0, + 1242, 420, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1432, 1433, + 1434, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 586, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 420, 0, 0, 275, 275, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1324, 0, 26, 0, 0, + 420, 0, 937, 0, 0, 1326, 1328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1476, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1502, 0, 0, + 0, 1328, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 420, 0, 420, 1355, 1324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1502, 1503, 1504, 1505, 0, 1509, 0, 1510, 1511, - 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, - 0, 1516, 0, 1517, 1518, 0, 0, 275, 275, 0, - 0, 0, 0, 0, 0, 275, 0, 0, 275, 0, - 0, 275, 0, 0, 0, 840, 0, 0, 0, 0, - 0, 0, 1537, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1455, 1456, 1457, 1458, 1459, 1546, 0, 0, - 1462, 1463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1581, - 1582, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 403, 840, - 0, 0, 0, 403, 403, 0, 0, 403, 403, 403, - 0, 0, 0, 938, 0, 0, 0, 0, 0, 0, + 0, 1379, 0, 0, 1384, 1385, 1386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 275, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 275, + 0, 0, 275, 1572, 0, 0, 840, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 403, 403, 403, 403, 403, 0, 0, 0, + 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, + 0, 0, 0, 1441, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, + 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, - 0, 840, 0, 275, 0, 0, 0, 0, 0, 0, - 0, 275, 994, 0, 0, 275, 275, 0, 0, 275, - 1002, 840, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, + 840, 0, 0, 0, 403, 403, 0, 0, 403, 403, + 403, 0, 0, 0, 938, 0, 1475, 1476, 0, 1477, + 0, 0, 0, 0, 1441, 0, 1441, 1441, 1441, 0, + 0, 0, 1355, 403, 403, 403, 403, 403, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1441, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 840, 0, 275, 0, 0, 0, 0, 0, + 0, 0, 275, 996, 0, 0, 275, 275, 0, 0, + 275, 1004, 840, 0, 0, 0, 1531, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 420, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1573, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 937, 0, 1547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 1441, 0, 0, 0, 0, 0, 0, 275, + 275, 275, 275, 275, 0, 275, 275, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 275, - 275, 275, 275, 0, 275, 275, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 275, 0, 1101, 1102, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, - 275, 0, 1099, 1100, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 403, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 403, 403, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 403, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 938, 275, + 275, 275, 275, 275, 0, 0, 0, 0, 0, 0, + 0, 1189, 0, 0, 0, 275, 0, 0, 0, 996, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 403, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 938, 275, 275, - 275, 275, 275, 0, 0, 0, 0, 0, 0, 0, - 1187, 0, 0, 0, 0, 0, 994, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1274,28 +1255,28 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 840, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 840, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, + 0, 0, 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1305,21 +1286,161 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 994, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 530, 518, 0, 475, 533, 448, 465, 541, 466, + 275, 0, 0, 0, 0, 0, 0, 530, 518, 0, + 475, 533, 448, 465, 541, 466, 469, 506, 433, 488, + 175, 463, 0, 452, 428, 459, 429, 450, 477, 119, + 481, 447, 520, 491, 532, 147, 0, 453, 539, 149, + 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, + 515, 474, 507, 438, 496, 534, 464, 504, 535, 0, + 0, 938, 87, 88, 89, 0, 1021, 1022, 0, 0, + 0, 0, 0, 109, 275, 501, 529, 461, 503, 505, + 427, 498, 0, 431, 434, 540, 525, 456, 457, 1213, + 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, + 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, + 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, + 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, + 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, + 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, + 172, 202, 206, 521, 451, 460, 113, 458, 204, 182, + 242, 494, 184, 203, 150, 232, 195, 241, 251, 252, + 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, + 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, + 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, + 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, + 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, + 0, 430, 0, 223, 245, 260, 107, 446, 230, 254, + 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, + 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, + 221, 442, 445, 440, 441, 489, 490, 536, 537, 538, + 514, 436, 0, 443, 444, 0, 519, 526, 527, 493, + 90, 99, 148, 257, 197, 124, 246, 426, 439, 117, + 449, 0, 0, 462, 467, 468, 480, 482, 483, 484, + 485, 492, 499, 500, 502, 508, 509, 510, 511, 516, + 523, 542, 92, 93, 100, 106, 112, 116, 120, 123, + 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, + 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, + 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, + 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, + 218, 224, 227, 233, 234, 243, 250, 253, 530, 518, + 0, 475, 533, 448, 465, 541, 466, 469, 506, 433, + 488, 175, 463, 0, 452, 428, 459, 429, 450, 477, + 119, 481, 447, 520, 491, 532, 147, 0, 453, 539, + 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, + 486, 515, 474, 507, 438, 496, 534, 464, 504, 535, + 0, 0, 0, 87, 88, 89, 0, 1021, 1022, 0, + 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, + 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, + 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, + 472, 0, 0, 0, 0, 0, 0, 0, 0, 454, + 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, + 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, + 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 521, 451, 460, 113, 458, 204, + 182, 242, 494, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 430, 0, 223, 245, 260, 107, 446, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 442, 445, 440, 441, 489, 490, 536, 537, + 538, 514, 436, 0, 443, 444, 0, 519, 526, 527, + 493, 90, 99, 148, 257, 197, 124, 246, 426, 439, + 117, 449, 0, 0, 462, 467, 468, 480, 482, 483, + 484, 485, 492, 499, 500, 502, 508, 509, 510, 511, + 516, 523, 542, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 530, + 518, 0, 475, 533, 448, 465, 541, 466, 469, 506, + 433, 488, 175, 463, 0, 452, 428, 459, 429, 450, + 477, 119, 481, 447, 520, 491, 532, 147, 0, 453, + 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, + 522, 486, 515, 474, 507, 438, 496, 534, 464, 504, + 535, 53, 0, 0, 87, 88, 89, 0, 0, 0, + 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, + 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, + 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, + 512, 472, 0, 0, 0, 0, 0, 0, 0, 0, + 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, + 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, + 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, + 531, 194, 0, 226, 131, 146, 105, 143, 91, 101, + 0, 130, 172, 202, 206, 521, 451, 460, 113, 458, + 204, 182, 242, 494, 184, 203, 150, 232, 195, 241, + 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, + 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, + 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, + 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, + 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, + 164, 166, 0, 430, 0, 223, 245, 260, 107, 446, + 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, + 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, + 111, 244, 221, 442, 445, 440, 441, 489, 490, 536, + 537, 538, 514, 436, 0, 443, 444, 0, 519, 526, + 527, 493, 90, 99, 148, 257, 197, 124, 246, 426, + 439, 117, 449, 0, 0, 462, 467, 468, 480, 482, + 483, 484, 485, 492, 499, 500, 502, 508, 509, 510, + 511, 516, 523, 542, 92, 93, 100, 106, 112, 116, + 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, + 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, + 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, + 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, + 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, + 530, 518, 0, 475, 533, 448, 465, 541, 466, 469, + 506, 433, 488, 175, 463, 0, 452, 428, 459, 429, + 450, 477, 119, 481, 447, 520, 491, 532, 147, 0, + 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, + 479, 522, 486, 515, 474, 507, 438, 496, 534, 464, + 504, 535, 0, 0, 0, 87, 88, 89, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, + 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, + 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, + 487, 512, 472, 0, 0, 0, 0, 0, 0, 1317, + 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, + 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, + 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, + 470, 531, 194, 0, 226, 131, 146, 105, 143, 91, + 101, 0, 130, 172, 202, 206, 521, 451, 460, 113, + 458, 204, 182, 242, 494, 184, 203, 150, 232, 195, + 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, + 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, + 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, + 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, + 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, + 165, 164, 166, 0, 430, 0, 223, 245, 260, 107, + 446, 230, 254, 255, 0, 196, 108, 127, 121, 191, + 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, + 205, 111, 244, 221, 442, 445, 440, 441, 489, 490, + 536, 537, 538, 514, 436, 0, 443, 444, 0, 519, + 526, 527, 493, 90, 99, 148, 257, 197, 124, 246, + 426, 439, 117, 449, 0, 0, 462, 467, 468, 480, + 482, 483, 484, 485, 492, 499, 500, 502, 508, 509, + 510, 511, 516, 523, 542, 92, 93, 100, 106, 112, + 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, + 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, + 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, + 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, + 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, + 253, 530, 518, 0, 475, 533, 448, 465, 541, 466, 469, 506, 433, 488, 175, 463, 0, 452, 428, 459, 429, 450, 477, 119, 481, 447, 520, 491, 532, 147, 0, 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, 474, 507, 438, 496, 534, - 464, 504, 535, 0, 0, 938, 87, 88, 89, 0, - 1019, 1020, 0, 0, 0, 0, 0, 109, 275, 501, + 464, 504, 535, 0, 0, 0, 87, 88, 89, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, - 525, 456, 457, 1209, 0, 0, 0, 0, 0, 0, + 525, 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, 0, 0, 0, 0, 0, - 0, 0, 454, 0, 495, 0, 0, 0, 435, 432, + 1005, 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, 146, 105, 143, @@ -1350,11 +1471,11 @@ var yyAct = [...]int{ 147, 0, 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, 474, 507, 438, 496, 534, 464, 504, 535, 0, 0, 0, 87, 88, 89, - 0, 1019, 1020, 0, 0, 0, 0, 0, 109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, 0, 0, 0, 0, - 0, 0, 0, 454, 0, 495, 0, 0, 0, 435, + 0, 969, 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, 146, 105, @@ -1384,7 +1505,7 @@ var yyAct = [...]int{ 428, 459, 429, 450, 477, 119, 481, 447, 520, 491, 532, 147, 0, 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, 474, 507, 438, - 496, 534, 464, 504, 535, 53, 0, 0, 87, 88, + 496, 534, 464, 504, 535, 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, 0, 0, 0, @@ -1424,7 +1545,7 @@ var yyAct = [...]int{ 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, 0, 0, - 0, 0, 0, 1313, 0, 454, 0, 495, 0, 0, + 0, 0, 0, 0, 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, @@ -1433,11 +1554,11 @@ var yyAct = [...]int{ 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 236, 114, 259, 102, 248, 98, 423, 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, 430, 0, 223, 245, 260, 107, 446, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 108, 127, 121, 191, 125, 424, 422, 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, 442, 445, 440, 441, 489, 490, 536, 537, 538, 514, 436, 0, 443, 444, 0, 519, 526, 527, 493, 90, 99, 148, @@ -1459,20 +1580,20 @@ var yyAct = [...]int{ 0, 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, 0, - 0, 0, 0, 0, 1003, 0, 454, 0, 495, 0, + 0, 0, 0, 0, 0, 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 521, 451, 460, 113, 458, 204, 182, 242, 494, 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, - 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, + 256, 219, 94, 228, 750, 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, - 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, + 235, 236, 114, 259, 102, 248, 98, 423, 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, 430, 0, 223, 245, 260, 107, 446, 230, 254, 255, 0, - 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, + 196, 108, 127, 121, 191, 125, 424, 422, 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, 442, 445, 440, 441, 489, 490, 536, 537, 538, 514, 436, 0, 443, 444, 0, 519, 526, 527, 493, 90, 99, @@ -1480,263 +1601,55 @@ var yyAct = [...]int{ 0, 462, 467, 468, 480, 482, 483, 484, 485, 492, 499, 500, 502, 508, 509, 510, 511, 516, 523, 542, 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, - 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, - 227, 233, 234, 243, 250, 253, 530, 518, 0, 475, - 533, 448, 465, 541, 466, 469, 506, 433, 488, 175, - 463, 0, 452, 428, 459, 429, 450, 477, 119, 481, - 447, 520, 491, 532, 147, 0, 453, 539, 149, 497, - 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, - 474, 507, 438, 496, 534, 464, 504, 535, 0, 0, - 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, - 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, - 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, - 0, 0, 0, 0, 0, 969, 0, 454, 0, 495, - 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, - 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, - 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, - 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 202, 206, 521, 451, 460, 113, 458, 204, 182, 242, - 494, 184, 203, 150, 232, 195, 241, 251, 252, 229, - 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, - 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, - 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, - 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 430, 0, 223, 245, 260, 107, 446, 230, 254, 255, - 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, - 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, - 442, 445, 440, 441, 489, 490, 536, 537, 538, 514, - 436, 0, 443, 444, 0, 519, 526, 527, 493, 90, - 99, 148, 257, 197, 124, 246, 426, 439, 117, 449, - 0, 0, 462, 467, 468, 480, 482, 483, 484, 485, - 492, 499, 500, 502, 508, 509, 510, 511, 516, 523, - 542, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, - 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, - 224, 227, 233, 234, 243, 250, 253, 530, 518, 0, - 475, 533, 448, 465, 541, 466, 469, 506, 433, 488, - 175, 463, 0, 452, 428, 459, 429, 450, 477, 119, - 481, 447, 520, 491, 532, 147, 0, 453, 539, 149, - 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, - 515, 474, 507, 438, 496, 534, 464, 504, 535, 0, - 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 0, 501, 529, 461, 503, 505, - 427, 498, 0, 431, 434, 540, 525, 456, 457, 0, - 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, - 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, - 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, - 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, - 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, - 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 202, 206, 521, 451, 460, 113, 458, 204, 182, - 242, 494, 184, 203, 150, 232, 195, 241, 251, 252, - 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, - 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, - 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, - 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 430, 0, 223, 245, 260, 107, 446, 230, 254, - 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, - 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, - 221, 442, 445, 440, 441, 489, 490, 536, 537, 538, - 514, 436, 0, 443, 444, 0, 519, 526, 527, 493, - 90, 99, 148, 257, 197, 124, 246, 426, 439, 117, - 449, 0, 0, 462, 467, 468, 480, 482, 483, 484, - 485, 492, 499, 500, 502, 508, 509, 510, 511, 516, - 523, 542, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, - 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, - 218, 224, 227, 233, 234, 243, 250, 253, 530, 518, - 0, 475, 533, 448, 465, 541, 466, 469, 506, 433, - 488, 175, 463, 0, 452, 428, 459, 429, 450, 477, - 119, 481, 447, 520, 491, 532, 147, 0, 453, 539, - 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, - 486, 515, 474, 507, 438, 496, 534, 464, 504, 535, - 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, - 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, - 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, - 472, 0, 0, 0, 0, 0, 0, 0, 0, 454, - 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, - 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, - 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 521, 451, 460, 113, 458, 204, - 182, 242, 494, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 423, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 430, 0, 223, 245, 260, 107, 446, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 424, - 422, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 442, 445, 440, 441, 489, 490, 536, 537, - 538, 514, 436, 0, 443, 444, 0, 519, 526, 527, - 493, 90, 99, 148, 257, 197, 124, 246, 426, 439, - 117, 449, 0, 0, 462, 467, 468, 480, 482, 483, - 484, 485, 492, 499, 500, 502, 508, 509, 510, 511, - 516, 523, 542, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 530, - 518, 0, 475, 533, 448, 465, 541, 466, 469, 506, - 433, 488, 175, 463, 0, 452, 428, 459, 429, 450, - 477, 119, 481, 447, 520, 491, 532, 147, 0, 453, - 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, - 522, 486, 515, 474, 507, 438, 496, 534, 464, 504, - 535, 0, 0, 0, 87, 88, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, - 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, - 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, - 512, 472, 0, 0, 0, 0, 0, 0, 0, 0, - 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, - 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, - 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, - 531, 194, 0, 226, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 202, 206, 521, 451, 460, 113, 458, - 204, 182, 242, 494, 184, 203, 150, 232, 195, 241, - 251, 252, 229, 249, 256, 219, 94, 228, 750, 110, - 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, - 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, - 98, 423, 247, 168, 231, 239, 162, 155, 97, 237, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 430, 0, 223, 245, 260, 107, 446, - 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, - 424, 422, 136, 220, 144, 151, 199, 258, 181, 205, - 111, 244, 221, 442, 445, 440, 441, 489, 490, 536, - 537, 538, 514, 436, 0, 443, 444, 0, 519, 526, - 527, 493, 90, 99, 148, 257, 197, 124, 246, 426, - 439, 117, 449, 0, 0, 462, 467, 468, 480, 482, - 483, 484, 485, 492, 499, 500, 502, 508, 509, 510, - 511, 516, 523, 542, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, - 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, - 530, 518, 0, 475, 533, 448, 465, 541, 466, 469, - 506, 433, 488, 175, 463, 0, 452, 428, 459, 429, - 450, 477, 119, 481, 447, 520, 491, 532, 147, 0, - 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, - 479, 522, 486, 515, 474, 507, 438, 496, 534, 464, - 504, 535, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, - 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, - 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, - 487, 512, 472, 0, 0, 0, 0, 0, 0, 0, - 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, - 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, - 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, - 470, 531, 194, 0, 226, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 202, 206, 521, 451, 460, 113, - 458, 204, 182, 242, 494, 184, 203, 150, 232, 195, - 241, 251, 252, 229, 249, 256, 219, 94, 228, 414, - 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, - 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, - 248, 98, 423, 247, 168, 231, 239, 162, 155, 97, - 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 430, 0, 223, 245, 260, 107, - 446, 230, 254, 255, 0, 196, 108, 127, 121, 191, - 125, 424, 422, 417, 416, 144, 151, 199, 258, 181, - 205, 111, 244, 221, 442, 445, 440, 441, 489, 490, - 536, 537, 538, 514, 436, 0, 443, 444, 0, 519, - 526, 527, 493, 90, 99, 148, 257, 197, 124, 246, - 426, 439, 117, 449, 0, 0, 462, 467, 468, 480, - 482, 483, 484, 485, 492, 499, 500, 502, 508, 509, - 510, 511, 516, 523, 542, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, - 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, - 253, 175, 0, 0, 909, 0, 318, 0, 0, 0, - 119, 0, 317, 0, 0, 0, 147, 0, 910, 361, - 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, - 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, - 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, - 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 329, 330, 401, 0, 0, - 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, - 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, - 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, - 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, - 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, - 0, 0, 0, 0, 318, 0, 0, 0, 119, 0, - 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, - 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, - 0, 0, 0, 0, 0, 0, 1010, 0, 53, 0, - 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, - 0, 0, 109, 340, 345, 346, 347, 1011, 0, 0, - 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, - 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, + 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, + 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, + 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, + 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, + 227, 233, 234, 243, 250, 253, 530, 518, 0, 475, + 533, 448, 465, 541, 466, 469, 506, 433, 488, 175, + 463, 0, 452, 428, 459, 429, 450, 477, 119, 481, + 447, 520, 491, 532, 147, 0, 453, 539, 149, 497, + 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, + 474, 507, 438, 496, 534, 464, 504, 535, 0, 0, + 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, + 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, + 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, + 0, 0, 0, 0, 0, 0, 0, 454, 0, 495, + 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, + 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, + 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, - 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, - 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, + 202, 206, 521, 451, 460, 113, 458, 204, 182, 242, + 494, 184, 203, 150, 232, 195, 241, 251, 252, 229, + 249, 256, 219, 94, 228, 414, 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, - 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, + 174, 235, 236, 114, 259, 102, 248, 98, 423, 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, - 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, - 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, - 362, 373, 368, 369, 366, 367, 365, 364, 363, 376, - 354, 355, 356, 357, 359, 0, 370, 371, 358, 90, - 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, + 430, 0, 223, 245, 260, 107, 446, 230, 254, 255, + 0, 196, 108, 127, 121, 191, 125, 424, 422, 417, + 416, 144, 151, 199, 258, 181, 205, 111, 244, 221, + 442, 445, 440, 441, 489, 490, 536, 537, 538, 514, + 436, 0, 443, 444, 0, 519, 526, 527, 493, 90, + 99, 148, 257, 197, 124, 246, 426, 439, 117, 449, + 0, 0, 462, 467, 468, 480, 482, 483, 484, 485, + 492, 499, 500, 502, 508, 509, 510, 511, 516, 523, + 542, 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, - 0, 0, 318, 0, 0, 0, 119, 0, 317, 0, - 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, + 909, 0, 318, 0, 0, 0, 119, 0, 317, 0, + 0, 0, 147, 0, 910, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 389, 87, + 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, + 0, 329, 330, 401, 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, @@ -1765,12 +1678,12 @@ var yyAct = [...]int{ 318, 0, 0, 0, 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, + 0, 0, 1012, 0, 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, - 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, + 345, 346, 347, 1013, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, - 330, 401, 0, 0, 0, 375, 0, 331, 0, 0, + 330, 0, 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, @@ -1799,11 +1712,11 @@ var yyAct = [...]int{ 0, 0, 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, - 0, 0, 53, 0, 0, 87, 88, 89, 339, 927, + 0, 0, 53, 0, 389, 87, 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 329, 330, 401, + 0, 0, 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, @@ -1833,46 +1746,11 @@ var yyAct = [...]int{ 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 87, 88, 89, 339, 924, 341, 342, - 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, - 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 329, 330, 401, 0, 0, - 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, - 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, - 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, - 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, - 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 382, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 175, 0, 0, 0, 0, 318, 0, 0, 0, - 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, - 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, - 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 330, 401, 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, @@ -1902,11 +1780,11 @@ var yyAct = [...]int{ 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, - 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, + 0, 87, 88, 89, 339, 927, 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, + 0, 0, 0, 329, 330, 401, 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, @@ -1932,12 +1810,47 @@ var yyAct = [...]int{ 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, + 0, 0, 318, 0, 0, 0, 119, 0, 317, 0, + 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, + 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, + 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, + 88, 89, 339, 924, 341, 342, 343, 344, 0, 0, + 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, + 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 329, 330, 401, 0, 0, 0, 375, 0, 331, + 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, + 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, + 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, + 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, + 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, + 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, + 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, + 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, + 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, + 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, + 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, + 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, + 151, 199, 258, 181, 205, 111, 244, 221, 362, 373, + 368, 369, 366, 367, 365, 364, 363, 376, 354, 355, + 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, + 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, + 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, + 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, + 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, + 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, + 233, 234, 243, 250, 253, 382, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, + 0, 0, 318, 0, 0, 0, 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, - 109, 340, 345, 346, 347, 0, 0, 0, 0, 332, + 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, @@ -1945,7 +1858,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 0, 0, 0, 113, 0, 204, 182, 242, 1574, 184, + 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, @@ -1966,12 +1879,12 @@ var yyAct = [...]int{ 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, - 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, + 318, 0, 0, 0, 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 0, 389, 87, 88, 89, + 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, - 345, 346, 347, 0, 0, 0, 0, 332, 0, 360, + 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, 0, 0, @@ -2013,7 +1926,7 @@ var yyAct = [...]int{ 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, - 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, + 0, 204, 182, 242, 1579, 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, @@ -2034,17 +1947,17 @@ var yyAct = [...]int{ 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 389, 87, 88, 89, 339, 338, 341, 342, + 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, + 0, 0, 0, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 630, 629, 639, 640, 632, 633, 634, 635, 636, - 637, 638, 631, 0, 0, 641, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, + 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, + 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, @@ -2056,9 +1969,9 @@ var yyAct = [...]int{ 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, + 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, + 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, @@ -2067,18 +1980,18 @@ var yyAct = [...]int{ 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, - 0, 0, 0, 725, 0, 0, 0, 0, 119, 0, - 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, - 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 88, 89, 0, 727, 0, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 620, 619, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 621, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, + 0, 0, 0, 0, 147, 0, 0, 361, 149, 0, + 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, + 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, + 0, 332, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, + 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 0, 0, 0, 278, 0, 0, 0, 0, 194, 0, + 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, @@ -2090,8 +2003,8 @@ var yyAct = [...]int{ 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 362, 373, 368, 369, 366, 367, 365, 364, 363, 376, + 354, 355, 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2106,13 +2019,13 @@ var yyAct = [...]int{ 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 0, 0, 0, 0, 0, 79, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 81, 82, - 0, 78, 0, 0, 0, 83, 194, 0, 226, 131, + 0, 0, 0, 0, 0, 0, 0, 630, 629, 639, + 640, 632, 633, 634, 635, 636, 637, 638, 631, 0, + 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, + 0, 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, @@ -2123,7 +2036,7 @@ var yyAct = [...]int{ 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 0, 80, + 151, 199, 258, 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, @@ -2134,18 +2047,18 @@ var yyAct = [...]int{ 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, + 233, 234, 243, 250, 253, 175, 0, 0, 0, 725, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, 89, - 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 727, 0, 0, 0, 0, 0, 0, 109, 0, + 0, 0, 0, 0, 620, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 306, 0, 128, 0, 0, 0, 278, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, @@ -2168,150 +2081,115 @@ var yyAct = [...]int{ 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, - 243, 250, 253, 305, 175, 0, 0, 0, 993, 0, - 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, - 995, 0, 0, 0, 0, 0, 0, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, - 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, - 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, - 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, - 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, - 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, - 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, - 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, - 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, - 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, - 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, - 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, - 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, - 250, 253, 27, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, + 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, + 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 53, 0, 0, 87, 88, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 81, 82, 0, 78, 0, 0, + 0, 83, 194, 0, 226, 131, 146, 105, 143, 91, + 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, + 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, + 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, + 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, + 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, + 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, + 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, + 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, + 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, + 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, + 205, 111, 244, 221, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, - 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, - 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, - 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, - 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, - 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, - 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, - 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, - 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, - 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, - 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 99, 148, 257, 197, 124, 246, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, - 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, + 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, + 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, + 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, + 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, + 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, + 253, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, + 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, - 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, - 250, 253, 175, 0, 0, 0, 993, 0, 0, 0, - 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, - 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, + 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, + 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 88, 89, 0, 995, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, + 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, + 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, + 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, + 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, + 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, + 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, + 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, + 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, + 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, + 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, + 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, + 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, + 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, - 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, - 204, 182, 242, 0, 991, 203, 150, 232, 195, 241, - 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, - 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, - 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, - 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, - 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, - 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, - 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, + 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, + 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, + 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, + 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, + 217, 218, 224, 227, 233, 234, 243, 250, 253, 305, + 175, 0, 0, 0, 995, 0, 0, 0, 0, 119, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, + 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 88, 89, 0, 997, 0, 0, 0, + 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, - 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, - 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, - 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 53, 0, 0, 87, 88, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, + 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, + 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, + 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, + 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, + 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, + 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, + 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, + 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, + 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, + 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, + 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, + 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, - 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, - 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, - 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, - 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, - 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, - 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, - 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, - 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, - 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, + 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, + 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, + 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, + 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, + 218, 224, 227, 233, 234, 243, 250, 253, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, - 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 88, 89, 0, 0, 961, 0, 0, - 962, 0, 0, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, + 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, + 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2340,11 +2218,11 @@ var yyAct = [...]int{ 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, - 0, 0, 0, 0, 0, 0, 0, 119, 0, 760, + 0, 0, 995, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 88, 89, 0, 759, 0, 0, 0, 0, 0, + 87, 88, 89, 0, 997, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2354,7 +2232,7 @@ var yyAct = [...]int{ 0, 0, 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, - 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, + 993, 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, @@ -2377,8 +2255,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 389, 87, 88, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, + 89, 0, 0, 961, 0, 0, 962, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2408,11 +2286,11 @@ var yyAct = [...]int{ 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, + 0, 0, 0, 119, 0, 760, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 53, 0, 0, 87, 88, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, + 759, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2445,7 +2323,7 @@ var yyAct = [...]int{ 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 88, 89, 0, 995, 0, + 0, 0, 0, 389, 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2478,8 +2356,8 @@ var yyAct = [...]int{ 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 88, 89, 0, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, + 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2509,11 +2387,11 @@ var yyAct = [...]int{ 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, - 0, 0, 0, 0, 0, 0, 730, 119, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, + 87, 88, 89, 0, 997, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2547,7 +2425,7 @@ var yyAct = [...]int{ 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, - 89, 0, 609, 0, 0, 0, 0, 0, 0, 109, + 89, 0, 727, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2576,75 +2454,75 @@ var yyAct = [...]int{ 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, - 234, 243, 250, 253, 406, 0, 0, 0, 0, 0, - 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, - 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, + 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, + 0, 0, 730, 119, 0, 0, 0, 0, 0, 147, + 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, + 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, - 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, + 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, + 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, + 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, + 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, + 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, + 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, + 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, + 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, + 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, + 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, + 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, + 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, + 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, - 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, - 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, + 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, + 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, + 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, + 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, + 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, + 250, 253, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 88, 89, 0, 609, 0, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 0, 273, 0, 278, 0, 0, 0, 0, 194, 0, - 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, - 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, - 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, - 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, - 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, - 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, - 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, - 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, + 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, + 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, + 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, + 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, + 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, + 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, + 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, + 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, + 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, + 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, + 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, + 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, + 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, + 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, - 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, - 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, + 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, + 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, + 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, + 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, + 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, + 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, + 406, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2678,19 +2556,87 @@ var yyAct = [...]int{ 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, + 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 88, 89, + 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 273, 0, 278, + 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, + 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, + 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, + 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, + 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, + 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, + 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, + 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, + 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, + 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, + 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, + 258, 181, 205, 111, 244, 221, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 99, 148, 257, 197, + 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, + 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, + 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, + 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, + 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, + 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, + 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, + 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 128, 0, 0, 0, 278, 0, 0, + 0, 0, 194, 0, 226, 131, 146, 105, 143, 91, + 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, + 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, + 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, + 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, + 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, + 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, + 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, + 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, + 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, + 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, + 205, 111, 244, 221, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 99, 148, 257, 197, 124, 246, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, + 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, + 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, + 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, + 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, + 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, + 253, } var yyPact = [...]int{ - 1877, -1000, -271, 947, -1000, -1000, -1000, -1000, -1000, -1000, + 218, -1000, -272, 1055, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 884, 703, -1000, -1000, -1000, - -1000, -1000, -1000, 276, 12039, 27, 129, 57, 17141, 128, - 153, 17479, -1000, 10, -1000, -1000, 12377, -1000, -1000, -87, - -105, -1000, 10011, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 700, 852, 862, 879, 530, 918, -1000, 8647, 99, - 99, 16803, 7295, -1000, -1000, 403, 17479, 118, 17479, -149, - 94, 94, 94, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1006, 782, -1000, -1000, -1000, + -1000, -1000, -1000, 261, 12015, 29, 137, 8, 16767, 136, + 2029, 17105, -1000, 21, -1000, -1000, 12353, -1000, -1000, -66, + -82, -1000, 9987, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 764, 989, 995, 1000, 635, 999, -1000, 8623, 95, + 95, 16429, 7271, -1000, -1000, 380, 17105, 128, 17105, -127, + 88, 88, 88, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2708,23 +2654,23 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 120, 17479, 486, 486, 202, -1000, 17479, 91, 486, - 91, 91, 91, 17479, -1000, 176, -1000, -1000, -1000, 17479, - 486, 794, 309, 63, 4838, -1000, 199, -1000, 4838, 34, - 4838, -34, 899, 22, -17, -1000, 4838, -1000, -1000, -1000, - -1000, -1000, -1000, 16458, 126, 254, -1000, -1000, -1000, -1000, - -1000, -1000, 552, 442, -1000, 10011, 1736, 653, 653, -1000, - -1000, 141, -1000, -1000, 11025, 11025, 11025, 11025, 11025, 11025, - 11025, 11025, 11025, 11025, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 653, 174, - -1000, 9673, 653, 653, 653, 653, 653, 653, 653, 653, - 10011, 653, 653, 653, 653, 653, 653, 653, 653, 653, - 653, 653, 653, 653, 653, 653, 653, -1000, -1000, 884, - -1000, 703, -1000, -1000, -1000, 792, 10011, 10011, 884, -1000, - 769, 8647, -1000, -1000, 854, -1000, -1000, -1000, -1000, 355, - 930, -1000, 11701, 168, 16120, 15106, 17479, 661, 638, -1000, - -1000, 163, 650, 6944, -102, -1000, -1000, -1000, 251, 14430, - -1000, -1000, -1000, 784, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 132, 17105, 545, 545, 265, -1000, 17105, 85, 545, + 85, 85, 85, 17105, -1000, 182, -1000, -1000, -1000, 17105, + 545, 914, 342, 89, 4814, -1000, 183, -1000, 4814, 30, + 4814, -60, 1014, 31, 6, -1000, 4814, -1000, -1000, -1000, + -1000, -1000, -1000, 16084, 146, 278, -1000, -1000, -1000, -1000, + -1000, -1000, 552, 383, -1000, 9987, 1596, 511, 511, -1000, + -1000, 166, -1000, -1000, 11001, 11001, 11001, 11001, 11001, 11001, + 11001, 11001, 11001, 11001, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 511, 180, + -1000, 9649, 511, 511, 511, 511, 511, 511, 511, 511, + 9987, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, -1000, -1000, 1006, + -1000, 782, -1000, -1000, -1000, 966, 9987, 9987, 1006, -1000, + 897, 8623, -1000, -1000, 960, -1000, -1000, -1000, -1000, 318, + 1037, -1000, 11677, 179, 15746, 14732, 17105, 767, 742, -1000, + -1000, 177, 727, 6920, -97, -1000, -1000, -1000, 264, 14056, + -1000, -1000, -1000, 913, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2736,221 +2682,209 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 619, 17479, -1000, 1491, -1000, 486, 4838, - 112, 486, 340, 486, 17479, 17479, 4838, 4838, 4838, 40, - 64, 60, 17479, 649, 109, 17479, 845, 715, 17479, 486, - 486, -1000, 6242, -1000, 4838, 309, -1000, 464, 10011, 4838, - 4838, 4838, 17479, 4838, 4838, -1000, -1000, -1000, 320, -1000, - -1000, -1000, -1000, 4838, 4838, -1000, 914, 314, -1000, -1000, - -1000, -1000, 10011, 213, -1000, 714, -1000, -1000, -1000, -1000, - -1000, 947, -1000, -1000, -1000, -120, -1000, -1000, 10011, 10011, - 10011, 348, 217, 11025, 475, 298, 11025, 11025, 11025, 11025, - 11025, 11025, 11025, 11025, 11025, 11025, 11025, 11025, 11025, 11025, - 11025, 526, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 486, -1000, 943, 603, 603, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 11363, 7633, 6242, 530, 604, 884, - 8647, 8647, 10011, 10011, 9323, 8985, 8647, 834, 300, 442, - 17479, -1000, -1000, 10687, -1000, -1000, -1000, -1000, -1000, 483, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17479, 17479, 8647, - 8647, 8647, 8647, 8647, 862, 530, 854, -1000, 937, 209, - 358, 645, -1000, 409, 862, 14092, 678, -1000, 854, -1000, - -1000, -1000, 17479, -1000, -1000, 15782, -1000, -1000, 5891, 52, - 17479, -1000, 571, 922, -1000, -1000, -1000, 849, 13754, 13404, - 52, 630, 15106, 17479, -1000, -1000, 15106, 17479, 5540, 6593, - -102, -1000, 637, -1000, -113, -130, 7971, 189, -1000, -1000, - -1000, -1000, 4487, 387, 513, 339, -70, -1000, -1000, -1000, - 657, -1000, 657, 657, 657, 657, -32, -32, -32, -32, - -1000, -1000, -1000, -1000, -1000, 685, 680, -1000, 657, 657, - 657, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 675, - 675, 675, 663, 663, 689, -1000, 17479, 4838, 839, 4838, - -1000, 93, -1000, -1000, -1000, 17479, 17479, 17479, 17479, 17479, - 145, 17479, 17479, 644, -1000, 17479, 4838, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 442, -1000, -1000, -1000, -1000, - -1000, -1000, 17479, -1000, -1000, -1000, -1000, 17479, 309, 17479, - 17479, 442, -1000, 463, 17479, -1000, -1000, -1000, -1000, 442, - 217, 267, -1000, -1000, 466, -1000, -1000, 2249, -1000, -1000, - -1000, -1000, 475, 11025, 11025, 11025, 376, 2249, 2203, 1173, - 828, 191, 334, 334, 190, 190, 190, 190, 190, 510, - 510, -1000, -1000, -1000, 483, -1000, -1000, -1000, 483, 8647, - 8647, 643, 653, 160, -1000, 700, -1000, -1000, 862, 596, - 596, 436, 444, 281, 913, 596, 245, 910, 596, 596, - 8647, -1000, -1000, 325, -1000, 10011, 483, -1000, 159, -1000, - 1687, 642, 639, 596, 483, 483, 596, 596, 792, -1000, - -1000, 759, 10011, 10011, 10011, -1000, -1000, -1000, 792, 873, - -1000, 774, 773, 898, 8647, 15106, 854, -1000, -1000, -1000, - 157, 628, 653, -1000, 17479, 15106, 15106, 15106, 15106, 15106, - -1000, 749, 746, -1000, 727, 726, 733, 17479, -1000, 602, - 181, 653, -1000, 15444, -1000, -1000, 898, 15106, 562, -1000, - 562, -1000, 154, -1000, -1000, 637, -102, -115, -1000, -1000, - -1000, -1000, 442, -1000, 538, 634, 4136, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 665, 486, -1000, 835, 215, 258, - 486, 831, -1000, -1000, -1000, 802, -1000, 351, -72, -1000, - -1000, 437, -32, -32, -1000, -1000, 189, 782, 189, 189, - 189, 461, 461, -1000, -1000, -1000, -1000, 428, -1000, -1000, - -1000, 407, -1000, 713, 17479, 4838, -1000, -1000, -1000, -1000, - 369, 369, 224, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 51, 674, -1000, -1000, -1000, -1000, - 2, 38, 108, -1000, 4838, -1000, 314, 314, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 376, 2249, 2141, - -1000, 11025, 11025, -1000, -1000, 596, 596, 8647, 6242, 884, - 792, -1000, -1000, 106, 526, 106, 11025, 11025, -1000, 11025, - 11025, -1000, -162, 669, 277, -1000, 10011, 291, -1000, 6242, - -1000, 11025, 11025, -1000, -1000, -1000, -1000, -1000, -1000, 757, - 442, 442, -1000, -1000, 17479, -1000, -1000, -1000, -1000, 893, - 10011, -1000, 633, -1000, 5189, 711, 17479, 653, 947, 13066, - 17479, 594, -1000, 247, 922, 673, 710, 737, -1000, -1000, - -1000, -1000, 745, -1000, 729, -1000, -1000, -1000, -1000, -1000, - 117, 116, 114, 17479, -1000, 884, 562, -1000, -1000, 184, - -1000, -1000, -122, -136, -1000, -1000, -1000, 4487, -1000, 4487, - 17479, 75, -1000, 486, 486, -1000, -1000, -1000, 664, 706, - 11025, -1000, -1000, -1000, 503, 189, 189, -1000, 287, -1000, - -1000, -1000, 589, -1000, 585, 632, 580, 17479, -1000, -1000, + -1000, -1000, -1000, 701, 17105, -1000, 317, -1000, 545, 4814, + 103, 545, 293, 545, 17105, 17105, 4814, 4814, 4814, 36, + 76, 67, 17105, 715, 100, 17105, 975, 831, 17105, 545, + 545, -1000, 6218, -1000, 4814, 342, -1000, 450, 9987, 4814, + 4814, 4814, 17105, 4814, 4814, -1000, -1000, -1000, 324, -1000, + -1000, -1000, -1000, 4814, 4814, -1000, 1036, 319, -1000, -1000, + -1000, -1000, 9987, 226, -1000, 830, -1000, -1000, -1000, -1000, + -1000, 1055, -1000, -1000, -1000, -118, -1000, -1000, 9987, 9987, + 9987, 560, 228, 11001, 510, 377, 11001, 11001, 11001, 11001, + 11001, 11001, 11001, 11001, 11001, 11001, 11001, 11001, 11001, 11001, + 11001, 527, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 545, -1000, 1053, 612, 612, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 11339, 7609, 6218, 635, 697, 1006, + 8623, 8623, 9987, 9987, 9299, 8961, 8623, 954, 290, 383, + 17105, -1000, -1000, 10663, -1000, -1000, -1000, -1000, -1000, 457, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17105, 17105, 8623, + 8623, 8623, 8623, 8623, 995, 635, 960, -1000, 1049, 213, + 623, 713, -1000, 572, 995, 13718, 719, -1000, 960, -1000, + -1000, -1000, 17105, -1000, -1000, 15408, -1000, -1000, 5867, 52, + 17105, -1000, 703, 860, -1000, -1000, -1000, 979, 13042, 13380, + 52, 580, 14732, 17105, -1000, -1000, 14732, 17105, 5516, 6569, + -97, -1000, 646, -1000, -88, -102, 7947, 195, -1000, -1000, + -1000, -1000, 4463, 288, 494, 339, -54, -1000, -1000, -1000, + 745, -1000, 745, 745, 745, 745, -19, -19, -19, -19, + -1000, -1000, -1000, -1000, -1000, 802, 797, -1000, 745, 745, + 745, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 793, + 793, 793, 756, 756, 810, -1000, 17105, 4814, 970, 4814, + -1000, 86, -1000, -1000, -1000, 17105, 17105, 17105, 17105, 17105, + 145, 17105, 17105, 709, -1000, 17105, 4814, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 383, -1000, -1000, -1000, -1000, + -1000, -1000, 17105, -1000, -1000, -1000, -1000, 17105, 342, 17105, + 17105, 383, -1000, 437, 17105, -1000, -1000, -1000, -1000, 383, + 228, 239, -1000, -1000, 373, -1000, -1000, 1941, -1000, -1000, + -1000, -1000, 510, 11001, 11001, 11001, 852, 1941, 2181, 435, + 518, 197, 381, 381, 194, 194, 194, 194, 194, 550, + 550, -1000, -1000, -1000, 457, -1000, -1000, -1000, 457, 8623, + 8623, 708, 511, 176, -1000, 764, -1000, -1000, 995, 683, + 683, 301, 554, 312, 1035, 683, 289, 1028, 683, 683, + 8623, -1000, -1000, 297, -1000, 9987, 457, -1000, 171, -1000, + 1690, 707, 680, 683, 457, 457, 683, 683, 966, -1000, + -1000, 848, 9987, 9987, 9987, -1000, -1000, -1000, 966, 994, + -1000, 904, 903, 1012, 8623, 14732, 960, -1000, -1000, -1000, + 169, 834, 511, -1000, 17105, 14732, 14732, 14732, 14732, 14732, + -1000, 873, 859, -1000, 849, 847, 868, 17105, -1000, 687, + 635, 13042, 224, 511, -1000, 15070, -1000, -1000, 1012, 14732, + 716, -1000, 716, -1000, 163, -1000, -1000, 646, -97, -83, + -1000, -1000, -1000, -1000, 383, -1000, 651, 639, 4112, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 788, 545, -1000, 958, + 206, 232, 545, 941, -1000, -1000, -1000, 918, -1000, 313, + -56, -1000, -1000, 386, -19, -19, -1000, -1000, 195, 911, + 195, 195, 195, 427, 427, -1000, -1000, -1000, -1000, 384, + -1000, -1000, -1000, 378, -1000, 827, 17105, 4814, -1000, -1000, + -1000, -1000, 786, 786, 233, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 48, 768, -1000, -1000, + -1000, -1000, 3, 35, 98, -1000, 4814, -1000, 319, 319, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 852, + 1941, 1823, -1000, 11001, 11001, -1000, -1000, 683, 683, 8623, + 6218, 1006, 966, -1000, -1000, 223, 527, 223, 11001, 11001, + -1000, 11001, 11001, -1000, -145, 699, 281, -1000, 9987, 515, + -1000, 6218, -1000, 11001, 11001, -1000, -1000, -1000, -1000, -1000, + -1000, 880, 383, 383, -1000, -1000, 17105, -1000, -1000, -1000, + -1000, 1010, 9987, -1000, 609, -1000, 5165, 821, 17105, 511, + 1055, 13042, 17105, 750, -1000, 244, 860, 787, 814, 735, + -1000, -1000, -1000, -1000, 857, -1000, 851, -1000, -1000, -1000, + -1000, -1000, 635, -1000, 125, 120, 105, 17105, -1000, 1006, + 716, -1000, -1000, 207, -1000, -1000, -110, -112, -1000, -1000, + -1000, 4463, -1000, 4463, 17105, 70, -1000, 545, 545, -1000, + -1000, -1000, 778, 813, 11001, -1000, -1000, -1000, 492, 195, + 195, -1000, 500, -1000, -1000, -1000, 678, -1000, 666, 602, + 662, 17105, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17479, -1000, -1000, - -1000, -1000, -1000, 17479, -169, 486, 17479, 17479, 17479, 17479, - -1000, 309, 309, -1000, 11025, 2249, 2249, -1000, -1000, 483, - -1000, 862, -1000, 483, 657, 657, -1000, 657, 663, -1000, - 657, -16, 657, -19, 483, 483, 1987, 1854, 1838, 1611, - 653, -157, -1000, 442, 10011, -1000, 1814, 742, -1000, -1000, - 890, 875, 442, -1000, -1000, 840, 625, 535, -1000, -1000, - 8309, 578, 152, 574, -1000, 884, 17479, 10011, -1000, -1000, - 10011, 658, -1000, 10011, -1000, -1000, -1000, 653, 653, 653, - 574, 862, -1000, -1000, -1000, -1000, 4136, -1000, 565, -1000, - 657, -1000, -1000, -1000, 17479, -59, 936, 2249, -1000, -1000, - -1000, -1000, -1000, -32, 453, -32, 389, -1000, 388, 4838, - -1000, -1000, -1000, -1000, 830, -1000, 6242, -1000, -1000, 656, - 679, -1000, -1000, -1000, -1000, 2249, -1000, 792, -1000, -1000, - 139, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 11025, - 11025, 11025, 11025, 11025, 862, 448, 442, 11025, 11025, -1000, - 10011, 10011, 829, -1000, 653, -1000, 668, 17479, 17479, -1000, - 17479, 862, -1000, 442, 442, 17479, 442, 14768, 17479, 17479, - 12716, -1000, 169, 17479, -1000, 550, -1000, 223, -1000, -108, - 189, -1000, 189, 494, 492, -1000, 653, 567, -1000, 229, - 17479, 17479, -1000, -1000, -1000, 1687, 1687, 1687, 1687, 73, - 483, -1000, 1687, 1687, 442, 552, 935, -1000, 653, 947, - 148, -1000, -1000, -1000, 533, 520, -1000, 520, 520, 181, - 169, -1000, 486, 222, 446, -1000, 74, 17479, 342, 824, - -1000, 811, -1000, -1000, -1000, -1000, -1000, 50, 6242, 4487, - 518, -1000, -1000, -1000, -1000, -1000, 483, 53, -174, -1000, - -1000, -1000, 17479, 535, 17479, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 386, -1000, -1000, 17479, -1000, -1000, 440, -1000, - -1000, 509, -1000, 17479, -1000, -1000, 674, -1000, 755, -166, - -177, 443, -1000, -1000, 655, -1000, -1000, 50, 772, -169, - -1000, 717, -1000, 17479, -1000, 46, -1000, -172, 506, 44, - -175, 704, 653, -178, 696, -1000, 904, 10349, -1000, -1000, - 933, 206, 206, 1687, 483, -1000, -1000, -1000, 80, 470, - -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 17105, -1000, -1000, -1000, -1000, -1000, 17105, -155, 545, + 17105, 17105, 17105, 17105, -1000, 342, 342, -1000, 11001, 1941, + 1941, -1000, -1000, 457, -1000, 995, -1000, 457, 745, 745, + -1000, 745, 756, -1000, 745, 12, 745, -3, 457, 457, + 2014, 1971, 1638, 1030, 511, -134, -1000, 383, 9987, -1000, + 1742, 1717, -1000, -1000, 1001, 998, 383, -1000, -1000, 967, + 557, 540, -1000, -1000, 8285, 660, 157, 650, -1000, 1006, + 17105, 9987, -1000, -1000, 9987, 752, -1000, 9987, -1000, -1000, + -1000, 1006, 511, 511, 511, 650, 995, -1000, -1000, -1000, + -1000, 4112, -1000, 644, -1000, 745, -1000, -1000, -1000, 17105, + -45, 1048, 1941, -1000, -1000, -1000, -1000, -1000, -19, 420, + -19, 364, -1000, 363, 4814, -1000, -1000, -1000, -1000, 961, + -1000, 6218, -1000, -1000, 744, 807, -1000, -1000, -1000, -1000, + 1941, -1000, 966, -1000, -1000, 115, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 11001, 11001, 11001, 11001, 11001, 995, + 417, 383, 11001, 11001, -1000, 9987, 9987, 937, -1000, 511, + -1000, 843, 17105, 17105, -1000, 17105, 995, -1000, 383, 383, + 17105, 383, 14394, 17105, 17105, 12692, -1000, 174, 17105, -1000, + 631, -1000, 216, -1000, -147, 195, -1000, 195, 489, 487, + -1000, 511, 571, -1000, 241, 17105, 17105, -1000, -1000, -1000, + 1690, 1690, 1690, 1690, 84, 457, -1000, 1690, 1690, 383, + 552, 1045, -1000, 511, 1055, 154, -1000, -1000, -1000, 615, + 613, -1000, 613, 613, 224, 174, -1000, 545, 240, 406, + -1000, 66, 17105, 326, 935, -1000, 934, -1000, -1000, -1000, + -1000, -1000, 47, 6218, 4463, 605, -1000, -1000, -1000, -1000, + -1000, 457, 69, -159, -1000, -1000, -1000, 17105, 540, 17105, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 358, -1000, -1000, + 17105, -1000, -1000, 374, -1000, -1000, 588, -1000, 17105, -1000, + -1000, 768, -1000, 879, -150, -176, 519, -1000, -1000, 736, + -1000, -1000, 47, 902, -155, -1000, 878, -1000, 17105, -1000, + 43, -1000, -157, 544, 41, -174, 812, 511, -178, 789, + -1000, 1021, 10325, -1000, -1000, 1043, 184, 184, 1690, 457, + -1000, -1000, -1000, 74, 407, -1000, -1000, -1000, -1000, -1000, + -1000, } var yyPgo = [...]int{ - 0, 1181, 1179, 27, 80, 66, 1176, 1174, 1167, 94, - 93, 91, 1166, 1164, 1163, 1161, 1160, 1158, 1156, 1154, - 1153, 1151, 1150, 1149, 1146, 1145, 1144, 1143, 1142, 1140, - 86, 1139, 70, 1138, 1135, 1134, 1133, 1132, 1130, 1128, - 1127, 49, 205, 51, 57, 1126, 60, 693, 1123, 58, - 71, 59, 1122, 43, 1121, 1120, 84, 1118, 1117, 56, - 1114, 1113, 90, 1105, 68, 1104, 18, 45, 1103, 1102, - 1101, 1100, 100, 1882, 1098, 1096, 15, 1094, 1093, 103, - 1092, 67, 30, 11, 32, 23, 1091, 131, 6, 1090, - 63, 1089, 1088, 1087, 1086, 48, 1085, 61, 1082, 19, - 16, 1079, 7, 65, 36, 20, 5, 1078, 1077, 25, - 75, 62, 64, 1076, 1075, 490, 1074, 1073, 50, 1072, - 1070, 1061, 31, 1059, 101, 362, 1058, 1057, 1055, 1053, - 38, 912, 1571, 12, 69, 1052, 1051, 1048, 2682, 44, - 55, 22, 1041, 29, 46, 37, 1040, 1038, 33, 1035, - 1033, 1032, 1028, 1025, 1023, 1021, 112, 1020, 1019, 1018, - 24, 13, 1013, 1012, 82, 21, 1011, 1010, 1008, 53, - 74, 1007, 1006, 54, 1005, 1004, 40, 1003, 1002, 1001, - 1000, 995, 26, 17, 993, 14, 992, 10, 990, 34, - 987, 4, 986, 9, 983, 3, 0, 972, 8, 52, - 2, 963, 1, 958, 957, 1225, 1755, 87, 956, 92, + 0, 1299, 1296, 1295, 19, 74, 68, 1294, 1291, 1290, + 94, 93, 91, 1289, 1288, 1286, 1284, 1283, 1282, 1281, + 1280, 1279, 1278, 1277, 1276, 1275, 1269, 1265, 1264, 1263, + 1261, 96, 1260, 86, 1258, 1257, 1256, 1255, 1254, 1245, + 1240, 1238, 44, 180, 50, 64, 1237, 60, 1551, 1236, + 56, 61, 58, 1235, 30, 1234, 1230, 71, 1227, 1225, + 57, 1224, 1221, 45, 1217, 67, 1216, 12, 52, 1213, + 1209, 1206, 1205, 80, 775, 1204, 1203, 15, 1201, 1200, + 89, 1197, 66, 29, 11, 18, 22, 1196, 62, 7, + 1194, 65, 1193, 1191, 1190, 1189, 59, 1187, 63, 1178, + 17, 24, 1174, 38, 75, 31, 23, 8, 1171, 1168, + 14, 69, 53, 87, 1166, 1165, 574, 1161, 1160, 46, + 1159, 1156, 1155, 28, 1153, 112, 482, 1152, 1151, 1150, + 1149, 43, 895, 1913, 164, 81, 1148, 1144, 1143, 2653, + 40, 54, 13, 1141, 51, 111, 37, 1140, 1126, 34, + 1125, 1124, 1120, 1119, 1118, 1117, 1116, 21, 1115, 1114, + 1113, 26, 36, 1112, 1099, 78, 27, 1098, 1096, 1095, + 55, 70, 1094, 1093, 49, 1092, 1086, 33, 1084, 1083, + 1082, 1079, 1078, 32, 6, 1077, 16, 1076, 10, 1075, + 25, 1074, 4, 1073, 9, 1070, 3, 0, 1069, 5, + 48, 1, 1065, 2, 1064, 1063, 1655, 302, 83, 1061, + 99, } var yyR1 = [...]int{ - 0, 203, 204, 204, 1, 1, 1, 1, 1, 1, + 0, 204, 205, 205, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 196, 196, 196, - 20, 3, 3, 3, 3, 2, 2, 8, 4, 5, - 5, 9, 9, 33, 33, 10, 11, 11, 11, 11, - 207, 207, 56, 56, 57, 57, 103, 103, 12, 13, - 13, 112, 112, 111, 111, 111, 113, 113, 113, 113, - 146, 146, 14, 14, 14, 14, 14, 14, 14, 198, - 198, 197, 195, 195, 194, 194, 193, 21, 178, 180, - 180, 179, 179, 179, 179, 170, 149, 149, 149, 149, - 152, 152, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 151, 151, 151, 151, 151, 153, 153, 153, 153, - 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, - 155, 155, 155, 155, 169, 169, 156, 156, 164, 164, - 165, 165, 165, 162, 162, 163, 163, 166, 166, 166, - 158, 158, 159, 159, 167, 167, 160, 160, 160, 161, - 161, 161, 168, 168, 168, 168, 168, 157, 157, 171, - 171, 188, 188, 187, 187, 187, 177, 177, 184, 184, - 184, 184, 184, 174, 174, 174, 175, 175, 173, 173, - 176, 176, 186, 186, 185, 172, 172, 189, 189, 189, - 189, 201, 202, 200, 200, 200, 200, 200, 181, 181, - 181, 182, 182, 182, 183, 183, 183, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 192, 190, - 190, 191, 191, 16, 22, 22, 17, 17, 17, 17, - 17, 18, 18, 23, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 119, 119, 121, 121, 117, 117, 120, 120, 118, - 118, 118, 122, 122, 122, 123, 123, 147, 147, 147, - 25, 25, 27, 27, 28, 29, 34, 34, 34, 34, - 34, 34, 36, 36, 36, 7, 7, 7, 7, 35, - 35, 35, 6, 6, 26, 26, 26, 26, 19, 208, - 30, 31, 31, 32, 32, 32, 38, 38, 38, 37, - 37, 37, 43, 43, 45, 45, 45, 45, 45, 46, - 46, 46, 46, 46, 46, 42, 42, 44, 44, 44, - 44, 135, 135, 135, 134, 134, 48, 48, 49, 49, - 50, 50, 51, 51, 51, 51, 65, 65, 102, 102, - 104, 104, 52, 52, 52, 52, 53, 53, 54, 54, - 55, 55, 142, 142, 141, 141, 141, 140, 140, 58, - 58, 58, 60, 59, 59, 59, 59, 61, 61, 63, - 63, 62, 62, 64, 66, 66, 66, 66, 66, 67, - 67, 47, 47, 47, 47, 47, 47, 47, 116, 116, - 69, 69, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 80, 80, 80, 80, 80, 80, 70, 70, - 70, 70, 70, 70, 70, 41, 41, 81, 81, 81, - 87, 82, 82, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 77, 77, 77, - 77, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 209, 209, 79, 78, 78, 78, 78, 78, 78, 78, - 39, 39, 39, 39, 39, 145, 145, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 91, 91, 40, 40, 89, 89, 90, 92, 92, 88, - 88, 88, 72, 72, 72, 72, 72, 72, 72, 72, - 74, 74, 74, 93, 93, 94, 94, 95, 95, 96, - 96, 97, 98, 98, 98, 99, 99, 99, 99, 100, - 100, 100, 71, 71, 71, 71, 101, 101, 101, 101, - 105, 105, 83, 83, 85, 85, 84, 86, 106, 106, - 109, 107, 107, 107, 110, 110, 110, 110, 108, 108, - 108, 137, 137, 137, 114, 114, 124, 124, 125, 125, - 115, 115, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 127, 127, 127, 128, 128, 129, 129, 129, - 136, 136, 132, 132, 133, 133, 138, 138, 139, 139, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 1, 1, 1, 1, 1, 1, 1, 197, 197, 197, + 21, 4, 4, 4, 4, 3, 3, 9, 5, 6, + 6, 10, 10, 34, 34, 11, 12, 12, 12, 12, + 208, 208, 57, 57, 58, 58, 104, 104, 13, 14, + 14, 113, 113, 112, 112, 112, 114, 114, 114, 114, + 147, 147, 15, 15, 15, 15, 15, 15, 15, 199, + 199, 198, 196, 196, 195, 195, 194, 22, 179, 181, + 181, 180, 180, 180, 180, 171, 150, 150, 150, 150, + 153, 153, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 152, 152, 152, 152, 152, 154, 154, 154, 154, + 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 156, 156, 156, 156, + 156, 156, 156, 156, 170, 170, 157, 157, 165, 165, + 166, 166, 166, 163, 163, 164, 164, 167, 167, 167, + 159, 159, 160, 160, 168, 168, 161, 161, 161, 162, + 162, 162, 169, 169, 169, 169, 169, 158, 158, 172, + 172, 189, 189, 188, 188, 188, 178, 178, 185, 185, + 185, 185, 185, 175, 175, 175, 176, 176, 174, 174, + 177, 177, 187, 187, 186, 173, 173, 190, 190, 190, + 190, 202, 203, 201, 201, 201, 201, 201, 182, 182, + 182, 183, 183, 183, 184, 184, 184, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 193, 191, + 191, 192, 192, 17, 23, 23, 18, 18, 18, 18, + 18, 19, 19, 24, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 120, 120, 122, 122, 118, 118, 121, 121, 119, + 119, 119, 123, 123, 123, 124, 124, 148, 148, 148, + 26, 26, 28, 28, 29, 30, 35, 35, 35, 35, + 35, 35, 37, 37, 37, 8, 8, 8, 8, 36, + 36, 36, 7, 7, 27, 27, 27, 27, 20, 209, + 31, 32, 32, 33, 33, 33, 39, 39, 39, 38, + 38, 38, 44, 44, 46, 46, 46, 46, 46, 47, + 47, 47, 47, 47, 47, 43, 43, 45, 45, 45, + 45, 136, 136, 136, 135, 135, 49, 49, 50, 50, + 51, 51, 52, 52, 52, 2, 66, 66, 103, 103, + 105, 105, 53, 53, 53, 53, 54, 54, 55, 55, + 56, 56, 143, 143, 142, 142, 142, 141, 141, 59, + 59, 59, 61, 60, 60, 60, 60, 62, 62, 64, + 64, 63, 63, 65, 67, 67, 67, 67, 67, 68, + 68, 48, 48, 48, 48, 48, 48, 48, 117, 117, + 70, 70, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 81, 81, 81, 81, 81, 81, 71, 71, + 71, 71, 71, 71, 71, 42, 42, 82, 82, 82, + 88, 83, 83, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 78, 78, 78, + 78, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 210, 210, 80, 79, 79, 79, 79, 79, 79, 79, + 40, 40, 40, 40, 40, 146, 146, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 92, 92, 41, 41, 90, 90, 91, 93, 93, 89, + 89, 89, 73, 73, 73, 73, 73, 73, 73, 73, + 75, 75, 75, 94, 94, 95, 95, 96, 96, 97, + 97, 98, 99, 99, 99, 100, 100, 100, 100, 101, + 101, 101, 72, 72, 72, 72, 102, 102, 102, 102, + 106, 106, 84, 84, 86, 86, 85, 87, 107, 107, + 110, 108, 108, 108, 111, 111, 111, 111, 109, 109, + 109, 138, 138, 138, 115, 115, 125, 125, 126, 126, + 116, 116, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 128, 128, 128, 129, 129, 130, 130, 130, + 137, 137, 133, 133, 134, 134, 139, 139, 140, 140, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2962,11 +2896,25 @@ var yyR1 = [...]int{ 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 205, 206, 143, 144, 144, 144, + 131, 131, 131, 131, 131, 131, 131, 131, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 206, 207, 144, 145, 145, 145, } var yyR2 = [...]int{ @@ -3009,7 +2957,7 @@ var yyR2 = [...]int{ 1, 1, 0, 1, 0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 3, 5, 0, 1, 2, 1, 1, 0, 2, 1, 3, - 1, 1, 1, 3, 1, 3, 3, 7, 1, 3, + 1, 1, 1, 3, 3, 3, 3, 7, 1, 3, 1, 3, 4, 4, 4, 3, 2, 4, 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, 1, 1, 2, 2, 1, 2, 3, 2, 3, 2, 2, 2, @@ -3072,15 +3020,15 @@ var yyR2 = [...]int{ } var yyChk = [...]int{ - -1000, -203, -1, -3, -8, -9, -10, -11, -12, -13, - -14, -15, -16, -17, -18, -23, -24, -25, -27, -28, - -29, -6, -26, -19, -20, -4, -205, 6, 7, -33, - 9, 10, 30, -21, 122, 123, 125, 124, 158, 126, - 151, 53, 172, 173, 175, 176, -36, 156, 157, 31, - 32, 128, 34, 57, 8, 258, 153, 152, 25, -204, - 360, -32, 5, -95, 15, -3, -30, -208, -30, -30, - -30, -30, -30, -178, -180, 57, 95, -129, 132, 77, - 250, 129, 130, 136, -132, -196, -131, 60, 61, 62, + -1000, -204, -1, -4, -9, -10, -11, -12, -13, -14, + -15, -16, -17, -18, -19, -24, -25, -26, -28, -29, + -30, -7, -27, -20, -21, -5, -206, 6, 7, -34, + 9, 10, 30, -22, 122, 123, 125, 124, 158, 126, + 151, 53, 172, 173, 175, 176, -37, 156, 157, 31, + 32, 128, 34, 57, 8, 258, 153, 152, 25, -205, + 360, -33, 5, -96, 15, -4, -31, -209, -31, -31, + -31, -31, -31, -179, -181, 57, 95, -130, 132, 77, + 250, 129, 130, 136, -133, -197, -132, 60, 61, 62, 268, 144, 300, 301, 172, 183, 177, 204, 196, 269, 302, 145, 194, 197, 237, 142, 303, 224, 231, 71, 175, 246, 304, 154, 192, 188, 305, 277, 186, 27, @@ -3098,23 +3046,23 @@ var yyChk = [...]int{ 226, 200, 163, 351, 352, 190, 191, 205, 178, 201, 174, 165, 158, 353, 247, 222, 274, 198, 195, 169, 354, 166, 167, 355, 227, 228, 170, 271, 243, 193, - 223, -115, 132, 250, 129, 228, 134, 130, 130, 131, - 132, 250, 129, 130, -62, -138, -196, -131, 132, 130, - 113, 197, 237, 122, 225, 233, -121, 234, 164, -147, - 130, -117, 224, 227, 228, 170, -196, 235, 239, 238, - 229, -138, 174, -62, -34, 356, 126, -143, -143, 226, - 226, -143, -82, -47, -68, 79, -73, 29, 23, -72, - -69, -88, -86, -87, 113, 114, 116, 115, 117, 102, - 103, 110, 80, 118, -77, -75, -76, -78, 64, 63, - 72, 65, 66, 67, 68, 73, 74, 75, -132, -138, - -84, -205, 47, 48, 259, 260, 261, 262, 267, 263, + 223, -116, 132, 250, 129, 228, 134, 130, 130, 131, + 132, 250, 129, 130, -63, -139, -197, -132, 132, 130, + 113, 197, 237, 122, 225, 233, -122, 234, 164, -148, + 130, -118, 224, 227, 228, 170, -197, 235, 239, 238, + 229, -139, 174, -63, -35, 356, 126, -144, -144, 226, + 226, -144, -83, -48, -69, 79, -74, 29, 23, -73, + -70, -89, -87, -88, 113, 114, 116, 115, 117, 102, + 103, 110, 80, 118, -78, -76, -77, -79, 64, 63, + 72, 65, 66, 67, 68, 73, 74, 75, -133, -139, + -85, -206, 47, 48, 259, 260, 261, 262, 267, 263, 82, 36, 249, 257, 256, 255, 253, 254, 251, 252, - 265, 266, 135, 250, 129, 108, 258, -196, -131, -5, - -4, -205, 6, 20, 21, -99, 17, 16, -206, 59, - -38, -45, 42, 43, -46, 21, 35, 46, 44, -31, - -44, 104, -47, -138, -115, -115, 11, -56, -57, -62, - -64, -138, -107, -146, 174, -110, 239, 238, -133, -108, - -132, -130, 237, 197, 236, 127, 275, 78, 22, 24, + 265, 266, 135, 250, 129, 108, 258, -197, -132, -6, + -5, -206, 6, 20, 21, -100, 17, 16, -207, 59, + -39, -46, 42, 43, -47, 21, 35, 46, 44, -32, + -45, 104, -48, -139, -116, -116, 11, -57, -58, -63, + -65, -139, -108, -147, 174, -111, 239, 238, -134, -109, + -133, -131, 237, 197, 236, 127, 275, 78, 22, 24, 219, 81, 113, 16, 82, 112, 259, 122, 51, 276, 251, 252, 249, 261, 262, 250, 225, 29, 10, 278, 25, 152, 21, 35, 106, 124, 85, 86, 155, 23, @@ -3126,111 +3074,112 @@ var yyChk = [...]int{ 295, 296, 96, 125, 258, 48, 297, 129, 6, 264, 30, 151, 46, 298, 130, 84, 265, 266, 133, 74, 5, 136, 32, 9, 53, 56, 255, 256, 257, 36, - 83, 12, 299, -179, 95, -170, -196, -62, 131, -62, - 258, -125, 135, -125, -125, 130, -62, -196, -196, 122, - 124, 127, 55, -22, -62, -124, 135, -196, -124, -124, - -124, -62, 119, -62, -196, 30, -122, 95, 12, 250, - -196, 164, 130, 165, 132, -144, -205, -133, -174, 131, - 33, 143, -144, 168, 169, -144, -120, -119, 231, 232, - 226, 230, 12, 169, 226, 167, -144, -35, -132, 64, - -7, -3, -10, -9, -11, 87, -143, -143, 58, 78, - 77, 94, -47, -70, 97, 79, 95, 96, 81, 99, + 83, 12, 299, -180, 95, -171, -197, -63, 131, -63, + 258, -126, 135, -126, -126, 130, -63, -197, -197, 122, + 124, 127, 55, -23, -63, -125, 135, -197, -125, -125, + -125, -63, 119, -63, -197, 30, -123, 95, 12, 250, + -197, 164, 130, 165, 132, -145, -206, -134, -175, 131, + 33, 143, -145, 168, 169, -145, -121, -120, 231, 232, + 226, 230, 12, 169, 226, 167, -145, -36, -133, 64, + -8, -4, -11, -10, -12, 87, -144, -144, 58, 78, + 77, 94, -48, -71, 97, 79, 95, 96, 81, 99, 98, 109, 102, 103, 104, 105, 106, 107, 108, 100, - 101, 112, 87, 88, 89, 90, 91, 92, 93, -116, - -205, -87, -205, 120, 121, -73, -73, -73, -73, -73, - -73, -73, -73, -73, -73, -205, 119, -2, -82, -4, - -205, -205, -205, -205, -205, -205, -205, -205, -91, -47, - -205, -209, -79, -205, -209, -79, -209, -79, -209, -205, - -209, -79, -209, -79, -209, -209, -79, -205, -205, -205, - -205, -205, -205, -205, -95, -3, -30, -100, 19, 31, - -47, -96, -97, -47, -95, 38, -42, -44, -46, 42, - 43, 70, 11, -135, -134, 22, -132, 64, 119, -63, - 26, -62, -49, -50, -51, -52, -65, -87, -205, -62, - -62, -56, -207, 58, 11, 56, -207, 58, 119, 58, - 174, -110, -112, -111, 240, 242, 87, -137, -132, 64, - 29, 30, 59, 58, -62, -149, -152, -154, -153, -155, - -150, -151, 194, 195, 113, 198, 200, 201, 202, 203, + 101, 112, 87, 88, 89, 90, 91, 92, 93, -117, + -206, -88, -206, 120, 121, -74, -74, -74, -74, -74, + -74, -74, -74, -74, -74, -206, 119, -3, -83, -5, + -206, -206, -206, -206, -206, -206, -206, -206, -92, -48, + -206, -210, -80, -206, -210, -80, -210, -80, -210, -206, + -210, -80, -210, -80, -210, -210, -80, -206, -206, -206, + -206, -206, -206, -206, -96, -4, -31, -101, 19, 31, + -48, -97, -98, -48, -96, 38, -43, -45, -47, 42, + 43, 70, 11, -136, -135, 22, -133, 64, 119, -64, + 26, -63, -50, -51, -52, -53, -66, -2, -206, -63, + -63, -57, -208, 58, 11, 56, -208, 58, 119, 58, + 174, -111, -113, -112, 240, 242, 87, -138, -133, 64, + 29, 30, 59, 58, -63, -150, -153, -155, -154, -156, + -151, -152, 194, 195, 113, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 30, 154, 190, 191, 192, 193, 210, 211, 212, 213, 214, 215, 216, 217, 177, 196, 269, 178, 179, 180, 181, 182, 183, 185, - 186, 187, 188, 189, -196, -144, 132, -196, 79, -196, - -62, -62, -144, -144, -144, 166, 166, 130, 130, 171, - -62, 58, 133, -56, 23, 55, -62, -196, -196, -139, - -138, -130, -144, -122, 64, -47, -144, -144, -144, -62, - -144, -144, -175, 11, 97, -144, -144, 11, -118, 11, - 97, -47, -123, 95, 55, 208, 357, 358, 359, -47, - -47, -47, -80, 73, 79, 74, 75, -73, -81, -84, - -87, 69, 97, 95, 96, 81, -73, -73, -73, -73, - -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, - -73, -145, -196, 64, -196, -72, -72, -132, -43, 21, - 35, -42, -133, -139, -130, -32, -206, -206, -95, -42, - -42, -47, -47, -88, 64, -42, -88, 64, -42, -42, - -37, 21, 35, -89, -90, 83, -88, -132, -138, -206, - -73, -132, -132, -42, -43, -43, -42, -42, -99, -206, - 9, 97, 58, 18, 58, -98, 24, 25, -99, -74, - -132, 65, 68, -48, 58, 11, -46, -62, -134, 104, - -139, -103, 160, -62, 30, 58, -58, -60, -59, -61, - 45, 49, 51, 46, 47, 48, 52, -142, 22, -49, - -141, 160, -140, 22, -138, 64, -103, 56, -49, -62, - -49, -64, -138, 104, -110, -112, 58, 241, 243, 244, - 55, 76, -47, -161, 112, -181, -182, -183, -133, 64, - 65, -170, -171, -172, -184, 146, -189, 137, 139, 136, - -173, 147, 131, 28, 59, -166, 73, 79, -162, 222, - -156, 57, -156, -156, -156, -156, -160, 197, -160, -160, - -160, 57, 57, -156, -156, -156, -164, 57, -164, -164, - -165, 57, -165, -136, 56, -62, -144, 23, -144, -126, - 127, 124, 125, -192, 123, 219, 197, 71, 29, 15, - 259, 160, 274, -196, 161, -62, -62, -62, -62, -62, - 127, 124, -62, -62, -62, -144, -62, -62, -122, -138, - -138, 64, -62, 73, 74, 75, -81, -73, -73, -73, - -41, 155, 78, -206, -206, -42, -42, -205, 119, -5, - -99, -206, -206, 58, 56, 22, 11, 11, -206, 11, - 11, -206, -206, -42, -92, -90, 85, -47, -206, 119, - -206, 58, 58, -206, -206, -206, -206, -206, -100, 40, - -47, -47, -97, -100, -114, 19, 11, 36, 36, -67, - 12, -44, -49, -46, 119, -71, 30, 36, -3, -205, - -205, -106, -109, -88, -50, -51, -51, -50, -51, 45, - 45, 45, 50, 45, 50, 45, -59, -138, -206, -66, - 53, 134, 54, -205, -140, -67, -49, -67, -67, 119, - -111, -113, 245, 242, 248, -196, 64, 58, -183, 87, - 57, -196, 28, -173, -173, -176, -196, -176, 28, -158, - 29, 73, -163, 223, 65, -160, -160, -161, 30, -161, - -161, -161, -169, 64, -169, 65, 65, 55, -132, -144, - -143, -199, 142, 138, 146, 147, 140, 60, 61, 62, - 131, 28, 137, 139, 160, 136, -199, -127, -128, 133, - 22, 131, 28, 160, -198, 56, 166, 219, 166, 133, - -144, -118, -118, -41, 78, -73, -73, -206, -206, -43, - -133, -95, -100, -148, 113, 194, 154, 192, 188, 208, - 199, 221, 190, 222, -145, -148, -73, -73, -73, -73, - 268, -95, 86, -47, 84, -133, -73, -73, 41, -62, - -93, 13, -47, 104, -105, 55, -106, -83, -85, -84, - -205, -101, -132, -104, -132, -67, 58, 87, -54, -53, - 55, 56, -55, 55, -53, 45, 45, 131, 131, 131, - -104, -95, -67, 242, 246, 247, -182, -183, -186, -185, - -132, -189, -176, -176, 57, -159, 55, -73, 59, -161, - -161, -196, 113, 59, 58, 59, 58, 59, 58, -62, - -143, -143, -62, -143, -132, -195, 271, -197, -196, -132, - -132, -132, -62, -122, -122, -73, -206, -99, -206, -156, - -156, -156, -165, -156, 182, -156, 182, -206, -206, 19, - 19, 19, 19, -205, -40, 264, -47, 58, 58, -94, - 14, 16, 27, -105, 58, -206, -206, 58, 119, -206, - 58, -95, -109, -47, -47, 57, -47, -205, -205, -205, - -206, -99, 59, 58, -156, -102, -132, -167, 219, 9, - -160, 64, -160, 65, 65, -144, 26, -194, -193, -133, - 57, 56, -100, -160, -196, -73, -73, -73, -73, -73, - -99, 64, -73, -73, -47, -82, 28, -85, 36, -3, - -132, -132, -132, -99, -102, -102, -206, -102, -102, -141, - -188, -187, 56, 141, 71, -185, 59, 58, -168, 137, - 28, 136, -76, -161, -161, 59, 59, -205, 58, 87, - -102, -62, -206, -206, -206, -206, -39, 97, 271, -206, - -206, -206, 9, -83, 119, 59, -206, -206, -206, -66, - -187, -196, -177, 87, 64, 149, -132, -157, 71, 28, - 28, -190, -191, 160, -193, -183, 59, -206, 269, 52, - 272, -106, -132, 65, -62, 64, -206, 58, -132, -198, - 41, 270, 273, 57, -191, 36, -195, 41, -102, 162, - 271, 59, 163, 272, -201, -202, 55, -205, 273, -202, - 55, 10, 9, -73, 159, -200, 150, 145, 148, 30, - -200, -206, -206, 144, 29, 73, + 186, 187, 188, 189, -197, -145, 132, -197, 79, -197, + -63, -63, -145, -145, -145, 166, 166, 130, 130, 171, + -63, 58, 133, -57, 23, 55, -63, -197, -197, -140, + -139, -131, -145, -123, 64, -48, -145, -145, -145, -63, + -145, -145, -176, 11, 97, -145, -145, 11, -119, 11, + 97, -48, -124, 95, 55, 208, 357, 358, 359, -48, + -48, -48, -81, 73, 79, 74, 75, -74, -82, -85, + -88, 69, 97, 95, 96, 81, -74, -74, -74, -74, + -74, -74, -74, -74, -74, -74, -74, -74, -74, -74, + -74, -146, -197, 64, -197, -73, -73, -133, -44, 21, + 35, -43, -134, -140, -131, -33, -207, -207, -96, -43, + -43, -48, -48, -89, 64, -43, -89, 64, -43, -43, + -38, 21, 35, -90, -91, 83, -89, -133, -139, -207, + -74, -133, -133, -43, -44, -44, -43, -43, -100, -207, + 9, 97, 58, 18, 58, -99, 24, 25, -100, -75, + -133, 65, 68, -49, 58, 11, -47, -63, -135, 104, + -140, -104, 160, -63, 30, 58, -59, -61, -60, -62, + 45, 49, 51, 46, 47, 48, 52, -143, 22, -50, + -4, -206, -142, 160, -141, 22, -139, 64, -104, 56, + -50, -63, -50, -65, -139, 104, -111, -113, 58, 241, + 243, 244, 55, 76, -48, -162, 112, -182, -183, -184, + -134, 64, 65, -171, -172, -173, -185, 146, -190, 137, + 139, 136, -174, 147, 131, 28, 59, -167, 73, 79, + -163, 222, -157, 57, -157, -157, -157, -157, -161, 197, + -161, -161, -161, 57, 57, -157, -157, -157, -165, 57, + -165, -165, -166, 57, -166, -137, 56, -63, -145, 23, + -145, -127, 127, 124, 125, -193, 123, 219, 197, 71, + 29, 15, 259, 160, 274, -197, 161, -63, -63, -63, + -63, -63, 127, 124, -63, -63, -63, -145, -63, -63, + -123, -139, -139, 64, -63, 73, 74, 75, -82, -74, + -74, -74, -42, 155, 78, -207, -207, -43, -43, -206, + 119, -6, -100, -207, -207, 58, 56, 22, 11, 11, + -207, 11, 11, -207, -207, -43, -93, -91, 85, -48, + -207, 119, -207, 58, 58, -207, -207, -207, -207, -207, + -101, 40, -48, -48, -98, -101, -115, 19, 11, 36, + 36, -68, 12, -45, -50, -47, 119, -72, 30, 36, + -4, -206, -206, -107, -110, -89, -51, -52, -52, -51, + -52, 45, 45, 45, 50, 45, 50, 45, -60, -139, + -207, -207, -4, -67, 53, 134, 54, -206, -141, -68, + -50, -68, -68, 119, -112, -114, 245, 242, 248, -197, + 64, 58, -184, 87, 57, -197, 28, -174, -174, -177, + -197, -177, 28, -159, 29, 73, -164, 223, 65, -161, + -161, -162, 30, -162, -162, -162, -170, 64, -170, 65, + 65, 55, -133, -145, -144, -200, 142, 138, 146, 147, + 140, 60, 61, 62, 131, 28, 137, 139, 160, 136, + -200, -128, -129, 133, 22, 131, 28, 160, -199, 56, + 166, 219, 166, 133, -145, -119, -119, -42, 78, -74, + -74, -207, -207, -44, -134, -96, -101, -149, 113, 194, + 154, 192, 188, 208, 199, 221, 190, 222, -146, -149, + -74, -74, -74, -74, 268, -96, 86, -48, 84, -134, + -74, -74, 41, -63, -94, 13, -48, 104, -106, 55, + -107, -84, -86, -85, -206, -102, -133, -105, -133, -68, + 58, 87, -55, -54, 55, 56, -56, 55, -54, 45, + 45, -207, 131, 131, 131, -105, -96, -68, 242, 246, + 247, -183, -184, -187, -186, -133, -190, -177, -177, 57, + -160, 55, -74, 59, -162, -162, -197, 113, 59, 58, + 59, 58, 59, 58, -63, -144, -144, -63, -144, -133, + -196, 271, -198, -197, -133, -133, -133, -63, -123, -123, + -74, -207, -100, -207, -157, -157, -157, -166, -157, 182, + -157, 182, -207, -207, 19, 19, 19, 19, -206, -41, + 264, -48, 58, 58, -95, 14, 16, 27, -106, 58, + -207, -207, 58, 119, -207, 58, -96, -110, -48, -48, + 57, -48, -206, -206, -206, -207, -100, 59, 58, -157, + -103, -133, -168, 219, 9, -161, 64, -161, 65, 65, + -145, 26, -195, -194, -134, 57, 56, -101, -161, -197, + -74, -74, -74, -74, -74, -100, 64, -74, -74, -48, + -83, 28, -86, 36, -4, -133, -133, -133, -100, -103, + -103, -207, -103, -103, -142, -189, -188, 56, 141, 71, + -186, 59, 58, -169, 137, 28, 136, -77, -162, -162, + 59, 59, -206, 58, 87, -103, -63, -207, -207, -207, + -207, -40, 97, 271, -207, -207, -207, 9, -84, 119, + 59, -207, -207, -207, -67, -188, -197, -178, 87, 64, + 149, -133, -158, 71, 28, 28, -191, -192, 160, -194, + -184, 59, -207, 269, 52, 272, -107, -133, 65, -63, + 64, -207, 58, -133, -199, 41, 270, 273, 57, -192, + 36, -196, 41, -103, 162, 271, 59, 163, 272, -202, + -203, 55, -206, 273, -203, 55, 10, 9, -74, 159, + -201, 150, 145, 148, 30, -201, -207, -207, 144, 29, + 73, } var yyDef = [...]int{ @@ -3307,7 +3256,7 @@ var yyDef = [...]int{ 362, 362, 0, 0, 615, 0, 364, 31, 0, 0, 616, 608, 609, 612, 615, 0, 386, 375, 366, 369, 370, 352, 0, 378, 382, 0, 384, 385, 0, 56, - 0, 430, 0, 388, 390, 391, 392, -2, 0, 414, + 0, 430, 0, 388, 390, 391, 392, 412, 0, 414, -2, 0, 0, 0, 50, 51, 0, 0, 0, 0, 958, 642, 60, 61, 0, 0, 0, 169, 651, 652, 653, 649, 218, 0, 0, 157, 153, 97, 98, 99, @@ -3333,66 +3282,67 @@ var yyDef = [...]int{ 600, 0, 0, 439, 0, 0, 367, 37, 383, 379, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 419, 0, 0, 422, 0, 0, 0, 0, 413, 0, - 434, 902, 415, 0, 417, 418, 439, 0, 439, 53, - 439, 55, 0, 433, 643, 59, 0, 0, 64, 65, - 644, 645, 646, 647, 0, 88, 219, 221, 224, 225, - 226, 92, 93, 94, 0, 0, 206, 0, 0, 200, - 200, 0, 198, 199, 90, 160, 158, 0, 155, 154, - 100, 0, 166, 166, 123, 124, 169, 0, 169, 169, - 169, 0, 0, 117, 118, 119, 111, 0, 112, 113, - 114, 0, 115, 0, 0, 983, 77, 659, 78, 982, - 0, 0, 672, 233, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 0, 79, 237, 239, 238, 242, - 0, 0, 0, 264, 983, 268, 309, 309, 291, 310, - 311, 316, 298, 463, 465, 467, 454, 475, 458, 0, - 455, 0, 0, 449, 517, 0, 0, 362, 0, 607, - 619, 521, 522, 0, 0, 0, 0, 0, 558, 0, - 0, 559, 0, 607, 0, 585, 0, 0, 533, 0, - 552, 0, 0, 553, 554, 555, 556, 557, 33, 0, - 617, 618, 610, 32, 0, 654, 655, 601, 602, 603, - 0, 376, 387, 368, 0, 630, 0, 0, 623, 0, - 0, 439, 638, 0, 389, 408, 410, 0, 405, 420, - 421, 423, 0, 425, 0, 427, 428, 393, 395, 396, - 0, 0, 0, 0, 416, 607, 439, 48, 49, 0, - 62, 63, 0, 0, 69, 170, 171, 0, 222, 0, - 0, 0, 188, 200, 200, 191, 201, 192, 0, 162, - 0, 159, 96, 156, 0, 169, 169, 125, 0, 126, - 127, 128, 0, 144, 0, 0, 0, 0, 681, 76, - 227, 982, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 982, 0, 982, 673, - 674, 675, 676, 0, 82, 0, 0, 0, 0, 0, - 267, 312, 312, 456, 0, 476, 459, 518, 519, 0, - 591, 615, 35, 0, 146, 146, 570, 146, 150, 573, - 146, 575, 146, 578, 0, 0, 0, 0, 0, 0, - 0, 582, 532, 588, 0, 590, 0, 0, 621, 34, - 605, 0, 440, 380, 41, 0, 630, 622, 632, 634, - 0, 0, 626, 0, 400, 607, 0, 0, 402, 409, - 0, 0, 403, 0, 404, 424, 426, 0, 0, 0, - 0, 615, 47, 66, 67, 68, 220, 223, 0, 202, - 146, 205, 189, 190, 0, 164, 0, 161, 147, 121, - 122, 167, 168, 166, 0, 166, 0, 151, 0, 983, - 228, 229, 230, 231, 0, 236, 0, 80, 81, 0, - 0, 241, 265, 285, 290, 460, 520, 619, 523, 567, - 166, 571, 572, 574, 576, 577, 579, 525, 524, 0, - 0, 0, 0, 0, 615, 0, 586, 0, 0, 38, - 0, 0, 0, 42, 0, 635, 0, 0, 0, 57, - 0, 615, 639, 640, 406, 0, 411, 0, 0, 0, - 414, 46, 180, 0, 204, 0, 398, 172, 165, 0, - 169, 145, 169, 0, 0, 74, 0, 83, 84, 0, - 0, 0, 36, 568, 569, 0, 0, 0, 0, 560, - 0, 583, 0, 0, 606, 604, 0, 633, 0, 625, - 628, 627, 401, 45, 0, 0, 436, 0, 0, 434, - 179, 181, 0, 186, 0, 203, 0, 0, 177, 0, - 174, 176, 163, 134, 135, 149, 152, 0, 0, 0, - 0, 243, 526, 528, 527, 529, 0, 0, 0, 531, - 548, 549, 0, 624, 0, 407, 435, 437, 438, 397, - 182, 183, 0, 187, 185, 0, 399, 95, 0, 173, - 175, 0, 259, 0, 85, 86, 79, 530, 0, 0, - 0, 631, 629, 184, 0, 178, 258, 0, 0, 82, - 561, 0, 564, 0, 260, 0, 240, 562, 0, 0, - 0, 207, 0, 0, 208, 209, 0, 0, 563, 210, - 0, 0, 0, 0, 0, 211, 213, 214, 0, 0, - 212, 261, 262, 215, 216, 217, + 0, 0, 434, 902, 415, 0, 417, 418, 439, 0, + 439, 53, 439, 55, 0, 433, 643, 59, 0, 0, + 64, 65, 644, 645, 646, 647, 0, 88, 219, 221, + 224, 225, 226, 92, 93, 94, 0, 0, 206, 0, + 0, 200, 200, 0, 198, 199, 90, 160, 158, 0, + 155, 154, 100, 0, 166, 166, 123, 124, 169, 0, + 169, 169, 169, 0, 0, 117, 118, 119, 111, 0, + 112, 113, 114, 0, 115, 0, 0, 983, 77, 659, + 78, 982, 0, 0, 672, 233, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 0, 79, 237, 239, + 238, 242, 0, 0, 0, 264, 983, 268, 309, 309, + 291, 310, 311, 316, 298, 463, 465, 467, 454, 475, + 458, 0, 455, 0, 0, 449, 517, 0, 0, 362, + 0, 607, 619, 521, 522, 0, 0, 0, 0, 0, + 558, 0, 0, 559, 0, 607, 0, 585, 0, 0, + 533, 0, 552, 0, 0, 553, 554, 555, 556, 557, + 33, 0, 617, 618, 610, 32, 0, 654, 655, 601, + 602, 603, 0, 376, 387, 368, 0, 630, 0, 0, + 623, 0, 0, 439, 638, 0, 389, 408, 410, 0, + 405, 420, 421, 423, 0, 425, 0, 427, 428, 393, + 394, 395, 0, 396, 0, 0, 0, 0, 416, 607, + 439, 48, 49, 0, 62, 63, 0, 0, 69, 170, + 171, 0, 222, 0, 0, 0, 188, 200, 200, 191, + 201, 192, 0, 162, 0, 159, 96, 156, 0, 169, + 169, 125, 0, 126, 127, 128, 0, 144, 0, 0, + 0, 0, 681, 76, 227, 982, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 982, 0, 982, 673, 674, 675, 676, 0, 82, 0, + 0, 0, 0, 0, 267, 312, 312, 456, 0, 476, + 459, 518, 519, 0, 591, 615, 35, 0, 146, 146, + 570, 146, 150, 573, 146, 575, 146, 578, 0, 0, + 0, 0, 0, 0, 0, 582, 532, 588, 0, 590, + 0, 0, 621, 34, 605, 0, 440, 380, 41, 0, + 630, 622, 632, 634, 0, 0, 626, 0, 400, 607, + 0, 0, 402, 409, 0, 0, 403, 0, 404, 424, + 426, -2, 0, 0, 0, 0, 615, 47, 66, 67, + 68, 220, 223, 0, 202, 146, 205, 189, 190, 0, + 164, 0, 161, 147, 121, 122, 167, 168, 166, 0, + 166, 0, 151, 0, 983, 228, 229, 230, 231, 0, + 236, 0, 80, 81, 0, 0, 241, 265, 285, 290, + 460, 520, 619, 523, 567, 166, 571, 572, 574, 576, + 577, 579, 525, 524, 0, 0, 0, 0, 0, 615, + 0, 586, 0, 0, 38, 0, 0, 0, 42, 0, + 635, 0, 0, 0, 57, 0, 615, 639, 640, 406, + 0, 411, 0, 0, 0, 414, 46, 180, 0, 204, + 0, 398, 172, 165, 0, 169, 145, 169, 0, 0, + 74, 0, 83, 84, 0, 0, 0, 36, 568, 569, + 0, 0, 0, 0, 560, 0, 583, 0, 0, 606, + 604, 0, 633, 0, 625, 628, 627, 401, 45, 0, + 0, 436, 0, 0, 434, 179, 181, 0, 186, 0, + 203, 0, 0, 177, 0, 174, 176, 163, 134, 135, + 149, 152, 0, 0, 0, 0, 243, 526, 528, 527, + 529, 0, 0, 0, 531, 548, 549, 0, 624, 0, + 407, 435, 437, 438, 397, 182, 183, 0, 187, 185, + 0, 399, 95, 0, 173, 175, 0, 259, 0, 85, + 86, 79, 530, 0, 0, 0, 631, 629, 184, 0, + 178, 258, 0, 0, 82, 561, 0, 564, 0, 260, + 0, 240, 562, 0, 0, 0, 207, 0, 0, 208, + 209, 0, 0, 563, 210, 0, 0, 0, 0, 0, + 211, 213, 214, 0, 0, 212, 261, 262, 215, 216, + 217, } var yyTok1 = [...]int{ @@ -6024,21 +5974,19 @@ yydefault: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2137 { - yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} + yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].selStmt, As: yyDollar[3].tableIdent} } case 394: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2141 { - // missed alias for subquery - yylex.Error("Every derived table must have its own alias") - return 1 + yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 395: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2147 { - yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} + yyVAL.selStmt = &Subquery{yyDollar[2].selStmt} } case 396: yyDollar = yyS[yypt-3 : yypt+1] diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index f23a6f3ba5a..8edd89664b1 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -217,7 +217,7 @@ func skipToEnd(yylex interface{}) { %token FORMAT TREE VITESS TRADITIONAL %type command -%type simple_select select_statement base_select union_rhs +%type derived_table simple_select select_statement base_select union_rhs %type explain_statement explainable_statement %type stream_statement insert_statement update_statement delete_statement set_statement set_transaction_statement %type create_statement alter_statement rename_statement drop_statement truncate_statement flush_statement do_statement @@ -2133,21 +2133,21 @@ table_factor: { $$ = $1 } -| subquery as_opt table_id +| derived_table as_opt table_id { $$ = &AliasedTableExpr{Expr:$1, As: $3} } -| subquery - { - // missed alias for subquery - yylex.Error("Every derived table must have its own alias") - return 1 - } | openb table_references closeb { $$ = &ParenTableExpr{Exprs: $2} } +derived_table: + openb select_statement closeb + { + $$ = &Subquery{$2} + } + aliased_table_name: table_name as_opt_id index_hint_list { From 4afdaee3b416eec717a9564d04efe8500c01078b Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 22 Jun 2020 14:39:48 -0400 Subject: [PATCH 064/430] Reword comment to make sense without the diff Co-authored-by: Deepthi Sigireddi Signed-off-by: Andrew Mason --- go/vt/mysqlctl/builtinbackupengine.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go index d0d2087cc59..25c8b87a768 100644 --- a/go/vt/mysqlctl/builtinbackupengine.go +++ b/go/vt/mysqlctl/builtinbackupengine.go @@ -298,13 +298,13 @@ func (be *BuiltinBackupEngine) backupFiles(ctx context.Context, params BackupPar wg.Wait() - // BackupHandles now support the ErrorRecorder interface for tracking errors + // BackupHandle supports the ErrorRecorder interface for tracking errors // across any goroutines that fan out to take the backup. This means that we - // can discard the local error recorder and put everything through the bh. + // don't need a local error recorder and can put everything through the bh. // - // This mitigates the scenario where bh.AddFile() encounters an error asynchronously, + // This handles the scenario where bh.AddFile() encounters an error asynchronously, // which ordinarily would be lost in the context of `be.backupFile`, i.e. if an - // error were encoutered + // error were encountered // [here](https://github.com/vitessio/vitess/blob/d26b6c7975b12a87364e471e2e2dfa4e253c2a5b/go/vt/mysqlctl/s3backupstorage/s3.go#L139-L142). if bh.HasErrors() { return bh.Error() From be17562c7e4f492d35b29b9dfa3ad4638ce9ffb0 Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Tue, 23 Jun 2020 00:21:12 +0530 Subject: [PATCH 065/430] added fix for replication Signed-off-by: Arindam Nayak --- go/vt/vttablet/tabletmanager/restore.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index d4391c24a9f..069ab105c91 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -19,6 +19,7 @@ package tabletmanager import ( "flag" "fmt" + "strings" "time" "vitess.io/vitess/go/vt/proto/vttime" @@ -265,13 +266,17 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po // replicateUptoGTID replicates upto specified gtid from binlog server func (agent *ActionAgent) catchupToGTID(ctx context.Context, gtid string) error { + gtid = strings.Replace(gtid, "MySQL56/", "", 1) + + gtidNew := strings.Split(gtid, ":")[0] + ":" + strings.Split(strings.Split(gtid, ":")[1], "-")[1] // TODO: we can use agent.MysqlDaemon.SetMaster , but it uses replDbConfig cmds := []string{ "STOP SLAVE FOR CHANNEL '' ", "STOP SLAVE IO_THREAD FOR CHANNEL ''", fmt.Sprintf("CHANGE MASTER TO MASTER_HOST='%s',MASTER_PORT=%d, MASTER_USER='%s', MASTER_AUTO_POSITION = 1;", *binlogHost, *binlogPort, *binlogUser), - fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtid), + fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtidNew), } + fmt.Printf("%v", cmds) if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { return vterrors.Wrap(err, "failed to reset slave") From 3c3822c2506c237994872fdb9e40ee329987b569 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 22 Jun 2020 14:51:11 -0400 Subject: [PATCH 066/430] Use `require`/`assert` in tests Signed-off-by: Andrew Mason --- go/vt/mysqlctl/s3backupstorage/s3_test.go | 30 +++++++---------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/go/vt/mysqlctl/s3backupstorage/s3_test.go b/go/vt/mysqlctl/s3backupstorage/s3_test.go index ac46a1376e3..09b4a406c81 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3_test.go +++ b/go/vt/mysqlctl/s3backupstorage/s3_test.go @@ -9,6 +9,8 @@ import ( "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3iface" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type s3ErrorClient struct{ s3iface.S3API } @@ -24,32 +26,18 @@ func (s3errclient *s3ErrorClient) PutObjectRequest(in *s3.PutObjectInput) (*requ func TestAddFileError(t *testing.T) { bh := &S3BackupHandle{client: &s3ErrorClient{}, readOnly: false} - wc, err := bh.AddFile(aws.BackgroundContext(), "somefile", 100000) - - if err != nil { - t.Errorf("AddFile() expected no error, got %s", err) - return - } - if wc == nil { - t.Errorf("AddFile() expected non-nil WriteCloser") - return - } + wc, err := bh.AddFile(aws.BackgroundContext(), "somefile", 100000) + require.NoErrorf(t, err, "AddFile() expected no error, got %s", err) + assert.NotEqual(t, nil, wc, "AddFile() expected non-nil WriteCloser") n, err := wc.Write([]byte("here are some bytes")) - if err != nil { - t.Errorf("TestAddFile() could not write to uploader, got %d bytes written, err %s", n, err) - return - } + require.NoErrorf(t, err, "TestAddFile() could not write to uploader, got %d bytes written, err %s", n, err) - if err := wc.Close(); err != nil { - t.Errorf("TestAddFile() could not close writer, got %s", err) - return - } + err = wc.Close() + require.NoErrorf(t, err, "TestAddFile() could not close writer, got %s", err) bh.waitGroup.Wait() // wait for the goroutine to finish, at which point it should have recorded an error - if !bh.HasErrors() { - t.Errorf("AddFile() expected bh to record async error but did not") - } + require.Equal(t, bh.HasErrors(), true, "AddFile() expected bh to record async error but did not") } From cc0840ec5ebae105dd66ecb2bc31bf7f8f937ad7 Mon Sep 17 00:00:00 2001 From: Serry Park Date: Mon, 22 Jun 2020 11:51:43 -0700 Subject: [PATCH 067/430] update variable names, use assert.Equal whenever possible Signed-off-by: Serry Park --- go/vt/sqlparser/comments.go | 16 +++++++------- go/vt/sqlparser/comments_test.go | 18 +++++++++------- go/vt/vtgate/executor.go | 6 +++--- go/vt/vtgate/executor_test.go | 36 ++++++++++++-------------------- go/vt/vtgate/vtgate.go | 4 ++-- 5 files changed, 36 insertions(+), 44 deletions(-) diff --git a/go/vt/sqlparser/comments.go b/go/vt/sqlparser/comments.go index b5ee4802062..9d5df6d31f6 100644 --- a/go/vt/sqlparser/comments.go +++ b/go/vt/sqlparser/comments.go @@ -32,8 +32,8 @@ const ( DirectiveQueryTimeout = "QUERY_TIMEOUT_MS" // DirectiveScatterErrorsAsWarnings enables partial success scatter select queries DirectiveScatterErrorsAsWarnings = "SCATTER_ERRORS_AS_WARNINGS" - // DirectiveMaxPayloadSizeOverride skips payload size validation when set. - DirectiveMaxPayloadSizeOverride = "MAX_PAYLOAD_SIZE_OVERRIDE" + // DirectiveIgnoreMaxPayloadSize skips payload size validation when set. + DirectiveIgnoreMaxPayloadSize = "IGNORE_MAX_PAYLOAD_SIZE" ) func isNonSpace(r rune) bool { @@ -301,22 +301,22 @@ func SkipQueryPlanCacheDirective(stmt Statement) bool { return false } -// MaxPayloadSizeOverrideDirective returns true if the max payload size override +// IgnoreMaxPayloadSizeDirective returns true if the max payload size override // directive is set to true. -func MaxPayloadSizeOverrideDirective(stmt Statement) bool { +func IgnoreMaxPayloadSizeDirective(stmt Statement) bool { switch stmt := stmt.(type) { case *Select: directives := ExtractCommentDirectives(stmt.Comments) - return directives.IsSet(DirectiveMaxPayloadSizeOverride) + return directives.IsSet(DirectiveIgnoreMaxPayloadSize) case *Insert: directives := ExtractCommentDirectives(stmt.Comments) - return directives.IsSet(DirectiveMaxPayloadSizeOverride) + return directives.IsSet(DirectiveIgnoreMaxPayloadSize) case *Update: directives := ExtractCommentDirectives(stmt.Comments) - return directives.IsSet(DirectiveMaxPayloadSizeOverride) + return directives.IsSet(DirectiveIgnoreMaxPayloadSize) case *Delete: directives := ExtractCommentDirectives(stmt.Comments) - return directives.IsSet(DirectiveMaxPayloadSizeOverride) + return directives.IsSet(DirectiveIgnoreMaxPayloadSize) default: return false } diff --git a/go/vt/sqlparser/comments_test.go b/go/vt/sqlparser/comments_test.go index 7dbfca53b06..8ec2a0e1995 100644 --- a/go/vt/sqlparser/comments_test.go +++ b/go/vt/sqlparser/comments_test.go @@ -17,8 +17,11 @@ limitations under the License. package sqlparser import ( + "fmt" "reflect" "testing" + + "github.com/stretchr/testify/assert" ) func TestSplitComments(t *testing.T) { @@ -386,22 +389,21 @@ func TestSkipQueryPlanCacheDirective(t *testing.T) { } } -func TestMaxPayloadSizeOverrideDirective(t *testing.T) { +func TestIgnoreMaxPayloadSizeDirective(t *testing.T) { testCases := []struct { query string expected bool }{ - {"insert /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ into user(id) values (1), (2)", true}, + {"insert /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ into user(id) values (1), (2)", true}, {"insert into user(id) values (1), (2)", false}, - {"update /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ users set name=1", true}, - {"select /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ * from users", true}, - {"delete /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ from users", true}, + {"update /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ users set name=1", true}, + {"select /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ * from users", true}, + {"delete /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ from users", true}, } for _, test := range testCases { stmt, _ := Parse(test.query) - if got := MaxPayloadSizeOverrideDirective(stmt); got != test.expected { - t.Errorf("d.MaxPayloadSizeOverrideDirective(stmt) returned %v but expected %v", got, test.expected) - } + got := IgnoreMaxPayloadSizeDirective(stmt) + assert.Equalf(t, test.expected, got, fmt.Sprintf("d.IgnoreMaxPayloadSizeDirective(stmt) returned %v but expected %v", got, test.expected)) } } diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index edb74fd30de..58bb05ee3ff 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -1286,7 +1286,7 @@ func (e *Executor) getPlan(vcursor *vcursorImpl, sql string, comments sqlparser. query := sql statement := stmt bindVarNeeds := sqlparser.BindVarNeeds{} - if !sqlparser.MaxPayloadSizeOverrideDirective(statement) && !isValidPayloadSize(query) { + if !sqlparser.IgnoreMaxPayloadSizeDirective(statement) && !isValidPayloadSize(query) { return nil, vterrors.New(vtrpcpb.Code_RESOURCE_EXHAUSTED, "query payload size above threshold") } @@ -1500,7 +1500,7 @@ func checkLikeOpt(likeOpt string, colNames []string) (string, error) { } // isValidPayloadSize validates whether a query payload is above the -// configured MaxPayloadSize threshold. The PayloadSizeExceeded will increment +// configured MaxPayloadSize threshold. The WarnPayloadSizeExceeded will increment // if the payload size exceeds the warnPayloadSize. func isValidPayloadSize(query string) bool { @@ -1509,7 +1509,7 @@ func isValidPayloadSize(query string) bool { return false } if *warnPayloadSize > 0 && payloadSize > *warnPayloadSize { - warnings.Add("PayloadSizeExceeded", 1) + warnings.Add("WarnPayloadSizeExceeded", 1) } return true } diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 2122925e0fe..f018d8e840e 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -1881,8 +1881,9 @@ func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { executor, _, _, _ := createExecutorEnv() session := NewSafeSession(&vtgatepb.Session{TargetString: "@master"}) - warningCount := warnings.Counts()["PayloadSizeExceeded"] + warningCount := warnings.Counts()["WarnPayloadSizeExceeded"] testMaxPayloadSizeExceeded := []string{ + "select * from main1", "select * from main1", "insert into main1(id) values (1), (2)", "update main1 set id=1", @@ -1890,41 +1891,30 @@ func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { } for _, query := range testMaxPayloadSizeExceeded { _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeExceeded", session, query, nil) - want := "query payload size above threshold" - if err == nil || err.Error() != want { - t.Errorf("got: %v, want %s", err, want) + if err == nil { + assert.EqualError(t, err, "query payload size above threshold") } } - if got, want := warnings.Counts()["PayloadSizeExceeded"], warningCount; got != want { - t.Errorf("warnings count: %v, want %v", got, want) - } + assert.Equal(t, warningCount, warnings.Counts()["WarnPayloadSizeExceeded"], "warnings count") testMaxPayloadSizeOverride := []string{ - "select /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ * from main1", - "insert /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ into main1(id) values (1), (2)", - "update /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ main1 set id=1", - "delete /*vt+ MAX_PAYLOAD_SIZE_OVERRIDE=1 */ from main1 where id=1", + "select /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ * from main1", + "insert /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ into main1(id) values (1), (2)", + "update /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ main1 set id=1", + "delete /*vt+ IGNORE_MAX_PAYLOAD_SIZE=1 */ from main1 where id=1", } for _, query := range testMaxPayloadSizeOverride { _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeWithOverride", session, query, nil) - if err != nil { - t.Errorf("error should be nil - got: %v", err) - } - } - if got, want := warnings.Counts()["PayloadSizeExceeded"], warningCount; got != want { - t.Errorf("warnings count: %v, want %v", got, want) + assert.Equal(t, nil, err, "err should be nil") } + assert.Equal(t, warningCount, warnings.Counts()["WarnPayloadSizeExceeded"], "warnings count") *maxPayloadSize = 1000 for _, query := range testMaxPayloadSizeExceeded { _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeExceeded", session, query, nil) - if err != nil { - t.Errorf("error should be nil - got: %v", err) - } - } - if got, want := warnings.Counts()["PayloadSizeExceeded"], warningCount+4; got != want { - t.Errorf("warnings count: %v, want %v", got, want) + assert.Equal(t, nil, err, "err should be nil") } + assert.Equal(t, warningCount+4, warnings.Counts()["WarnPayloadSizeExceeded"], "warnings count") } func TestOlapSelectDatabase(t *testing.T) { diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index 671725bc197..781248f4874 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -68,7 +68,7 @@ var ( // HealthCheckTimeout is the timeout on the RPC call to tablets HealthCheckTimeout = flag.Duration("healthcheck_timeout", time.Minute, "the health check timeout period") maxPayloadSize = flag.Int("max_payload_size", 0, "The threshold for query payloads in bytes. A payload greater than this threshold will result in a failure to handle the query.") - warnPayloadSize = flag.Int("warn_payload_size", 0, "The warning threshold for query payloads in bytes. A payload greater than this threshold will cause the VtGateWarnings.PayloadSizeExceeded counter to be incremented.") + warnPayloadSize = flag.Int("warn_payload_size", 0, "The warning threshold for query payloads in bytes. A payload greater than this threshold will cause the VtGateWarnings.WarnPayloadSizeExceeded counter to be incremented.") ) func getTxMode() vtgatepb.TransactionMode { @@ -196,7 +196,7 @@ func Init(ctx context.Context, serv srvtopo.Server, cell string, tabletTypesToWa _ = stats.NewRates("ErrorsByDbType", stats.CounterForDimension(errorCounts, "DbType"), 15, 1*time.Minute) _ = stats.NewRates("ErrorsByCode", stats.CounterForDimension(errorCounts, "Code"), 15, 1*time.Minute) - warnings = stats.NewCountersWithSingleLabel("VtGateWarnings", "Vtgate warnings", "type", "IgnoredSet", "ResultsExceeded", "PayloadSizeExceeded") + warnings = stats.NewCountersWithSingleLabel("VtGateWarnings", "Vtgate warnings", "type", "IgnoredSet", "ResultsExceeded", "WarnPayloadSizeExceeded") servenv.OnRun(func() { for _, f := range RegisterVTGates { From 7d572fc499dbb342f0749c1a3607e2cee6205d1c Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 22 Jun 2020 14:54:58 -0400 Subject: [PATCH 068/430] Use NotNil rather than NotEqual(x, nil) Signed-off-by: Andrew Mason --- go/vt/mysqlctl/s3backupstorage/s3_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/vt/mysqlctl/s3backupstorage/s3_test.go b/go/vt/mysqlctl/s3backupstorage/s3_test.go index 09b4a406c81..25d958934f7 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3_test.go +++ b/go/vt/mysqlctl/s3backupstorage/s3_test.go @@ -29,7 +29,7 @@ func TestAddFileError(t *testing.T) { wc, err := bh.AddFile(aws.BackgroundContext(), "somefile", 100000) require.NoErrorf(t, err, "AddFile() expected no error, got %s", err) - assert.NotEqual(t, nil, wc, "AddFile() expected non-nil WriteCloser") + assert.NotNil(t, wc, "AddFile() expected non-nil WriteCloser") n, err := wc.Write([]byte("here are some bytes")) require.NoErrorf(t, err, "TestAddFile() could not write to uploader, got %d bytes written, err %s", n, err) From cc120612b6271fa655251a7a930049864174bad8 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Mon, 22 Jun 2020 14:00:29 -0700 Subject: [PATCH 069/430] config: fix heartbeat interval regression Fixes #6356 Signed-off-by: Sugu Sougoumarane --- .../vttablet/tabletserver/tabletenv/config.go | 2 +- .../tabletserver/tabletenv/config_test.go | 119 ++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/go/vt/vttablet/tabletserver/tabletenv/config.go b/go/vt/vttablet/tabletserver/tabletenv/config.go index 31488fb4e4f..e454b49eac0 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/config.go +++ b/go/vt/vttablet/tabletserver/tabletenv/config.go @@ -169,7 +169,7 @@ func Init() { } if enableHeartbeat { - currentConfig.HeartbeatIntervalSeconds = float64(heartbeatInterval) / float64(time.Millisecond) + currentConfig.HeartbeatIntervalSeconds = float64(heartbeatInterval) / float64(time.Second) } switch *streamlog.QueryLogFormat { diff --git a/go/vt/vttablet/tabletserver/tabletenv/config_test.go b/go/vt/vttablet/tabletserver/tabletenv/config_test.go index cdea4848209..9a4dfb2eee9 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/config_test.go +++ b/go/vt/vttablet/tabletserver/tabletenv/config_test.go @@ -18,6 +18,7 @@ package tabletenv import ( "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -133,6 +134,9 @@ txPool: } func TestClone(t *testing.T) { + *queryLogHandler = "" + *txLogHandler = "" + cfg1 := &TabletConfig{ OltpReadPool: ConnPoolConfig{ Size: 16, @@ -147,3 +151,118 @@ func TestClone(t *testing.T) { cfg1.OltpReadPool.Size = 10 assert.NotEqual(t, cfg1, cfg2) } + +func TestFlags(t *testing.T) { + want := TabletConfig{ + OltpReadPool: ConnPoolConfig{ + Size: 16, + IdleTimeoutSeconds: 1800, + MaxWaiters: 5000, + }, + OlapReadPool: ConnPoolConfig{ + Size: 200, + }, + TxPool: ConnPoolConfig{ + Size: 20, + TimeoutSeconds: 1, + MaxWaiters: 5000, + }, + Oltp: OltpConfig{ + QueryTimeoutSeconds: 30, + TxTimeoutSeconds: 30, + MaxRows: 10000, + }, + HotRowProtection: HotRowProtectionConfig{ + MaxQueueSize: 20, + MaxGlobalQueueSize: 1000, + MaxConcurrency: 5, + }, + StreamBufferSize: 32768, + QueryCacheSize: 5000, + SchemaReloadIntervalSeconds: 1800, + TrackSchemaVersions: true, + MessagePostponeParallelism: 4, + CacheResultFields: true, + TxThrottlerConfig: "target_replication_lag_sec: 2\nmax_replication_lag_sec: 10\ninitial_rate: 100\nmax_increase: 1\nemergency_decrease: 0.5\nmin_duration_between_increases_sec: 40\nmax_duration_between_increases_sec: 62\nmin_duration_between_decreases_sec: 20\nspread_backlog_across_sec: 20\nage_bad_rate_after_sec: 180\nbad_rate_increase: 0.1\nmax_rate_approach_threshold: 0.9\n", + TxThrottlerHealthCheckCells: []string{}, + TransactionLimitConfig: TransactionLimitConfig{ + TransactionLimitPerUser: 0.4, + TransactionLimitByUsername: true, + TransactionLimitByPrincipal: true, + }, + EnforceStrictTransTables: true, + DB: &dbconfigs.DBConfigs{}, + } + assert.Equal(t, want.DB, currentConfig.DB) + assert.Equal(t, want, currentConfig) + + // Simple Init. + Init() + want.OlapReadPool.IdleTimeoutSeconds = 1800 + want.TxPool.IdleTimeoutSeconds = 1800 + want.HotRowProtection.Mode = Disable + want.Consolidator = Enable + assert.Equal(t, want.DB, currentConfig.DB) + assert.Equal(t, want, currentConfig) + + enableHotRowProtection = true + enableHotRowProtectionDryRun = true + Init() + want.HotRowProtection.Mode = Dryrun + assert.Equal(t, want, currentConfig) + + enableHotRowProtection = true + enableHotRowProtectionDryRun = false + Init() + want.HotRowProtection.Mode = Enable + assert.Equal(t, want, currentConfig) + + enableHotRowProtection = false + enableHotRowProtectionDryRun = true + Init() + want.HotRowProtection.Mode = Disable + assert.Equal(t, want, currentConfig) + + enableHotRowProtection = false + enableHotRowProtectionDryRun = false + Init() + want.HotRowProtection.Mode = Disable + assert.Equal(t, want, currentConfig) + + enableConsolidator = true + enableConsolidatorReplicas = true + Init() + want.Consolidator = NotOnMaster + assert.Equal(t, want, currentConfig) + + enableConsolidator = true + enableConsolidatorReplicas = false + Init() + want.Consolidator = Enable + assert.Equal(t, want, currentConfig) + + enableConsolidator = false + enableConsolidatorReplicas = true + Init() + want.Consolidator = NotOnMaster + assert.Equal(t, want, currentConfig) + + enableConsolidator = false + enableConsolidatorReplicas = false + Init() + want.Consolidator = Disable + assert.Equal(t, want, currentConfig) + + enableHeartbeat = true + heartbeatInterval = 1 * time.Second + Init() + want.HeartbeatIntervalSeconds = 1 + assert.Equal(t, want, currentConfig) + + enableHeartbeat = false + heartbeatInterval = 1 * time.Second + currentConfig.HeartbeatIntervalSeconds = 0 + Init() + want.HeartbeatIntervalSeconds = 0 + assert.Equal(t, want, currentConfig) +} From ccf496daf098ebd81554446a31ac236f74f245e1 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 22 Jun 2020 18:01:24 -0400 Subject: [PATCH 070/430] Upgrade consul to 1.8.0 to reconcile k8s addition with consul upgrade Signed-off-by: Andrew Mason --- go.mod | 14 ++- go.sum | 276 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 282 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 7143ed608d6..40bfe74b68b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.13 require ( cloud.google.com/go v0.45.1 github.com/Azure/azure-storage-blob-go v0.8.0 - github.com/Azure/go-autorest/autorest/adal v0.8.1 // indirect github.com/GeertJohan/go.rice v1.0.0 github.com/PuerkitoBio/goquery v1.5.1 github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 // indirect @@ -25,18 +24,18 @@ require ( github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect github.com/golang/mock v1.3.1 github.com/golang/protobuf v1.3.2 - github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db + github.com/golang/snappy v0.0.1 github.com/google/go-cmp v0.4.0 github.com/googleapis/gnostic v0.2.0 // indirect github.com/gorilla/websocket v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/hashicorp/consul v1.4.5 + github.com/hashicorp/consul v1.8.0 + github.com/hashicorp/consul/api v1.5.0 github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go.net v0.0.1 // indirect github.com/hashicorp/golang-lru v0.5.3 // indirect - github.com/hashicorp/memberlist v0.1.4 // indirect - github.com/hashicorp/serf v0.8.5 // indirect github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 github.com/imdario/mergo v0.3.6 // indirect github.com/klauspost/compress v1.4.1 // indirect @@ -47,7 +46,7 @@ require ( github.com/magiconair/properties v1.8.1 github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 github.com/mitchellh/go-testing-interface v1.14.0 // indirect - github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 + github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 github.com/onsi/ginkgo v1.10.3 // indirect github.com/onsi/gomega v1.7.1 // indirect github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 @@ -58,7 +57,6 @@ require ( github.com/pkg/errors v0.8.1 github.com/prometheus/client_golang v1.4.1 github.com/prometheus/common v0.9.1 - github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb // indirect github.com/smartystreets/goconvey v1.6.4 // indirect github.com/stretchr/testify v1.4.0 github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b @@ -70,7 +68,7 @@ require ( github.com/uber/jaeger-lib v2.0.0+incompatible // indirect github.com/ugorji/go v1.1.7 // indirect github.com/z-division/go-zookeeper v0.0.0-20190128072838-6d7457066b9b - golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 + golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 golang.org/x/lint v0.0.0-20190409202823-959b441ac422 golang.org/x/net v0.0.0-20200202094626-16171245cfb2 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 diff --git a/go.sum b/go.sum index 057f55bc830..de6461f113b 100644 --- a/go.sum +++ b/go.sum @@ -10,14 +10,26 @@ cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbf cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible h1:NthZg3psrLxvQLN6rVm07pZ9mv2wvGNaBNGQ3fnPvLE= +github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.8.0 h1:53qhf0Oxa0nOjgbDeeYPUeyiNmafAFEY95rZLK0Tj6o= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= +github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1 h1:pZdL8o72rK+avFWl+p9nE8RWi1JInZrWJYlnpfXJwHk= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= @@ -25,6 +37,10 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= @@ -35,6 +51,7 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOC github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e h1:4ZrkT/RzpnROylmoQL57iVUL57wGKTR5O6KpVnbm2tA= github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k= +github.com/DataDog/datadog-go v2.2.0+incompatible h1:V5BKkxACZLjzHjSgBbr2gvLA2Ae49yhc6CSY7MLy5k4= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= @@ -43,7 +60,12 @@ github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtix github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.3 h1:M3NHMuPgMSUPdE5epwNUHlRPSVzHs8HpRTrVXhR0myo= +github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.0.1 h1:iLrQrdwjDd52kHDA5op2UBJFjmOb9g+7scBan4RN8F0= +github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -51,6 +73,9 @@ github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= @@ -63,16 +88,20 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.28.8 h1:kPGnElMdW0GDc54Giy1lcE/3gAr2Gzl6cMjYKoBNFhw= github.com/aws/aws-sdk-go v1.28.8/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= @@ -80,26 +109,37 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20200322175846-f7e751efca13 h1:+qUNY4VRkEH46bLUwxCyUU+iOGJMQBVibAaYzWiwWcg= github.com/buger/jsonparser v0.0.0-20200322175846-f7e751efca13/go.mod h1:tgcrVJ81GPSF0mz+0nu1Xaz0fazGPrmmJfJtxjbHhUQ= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= +github.com/coredns/coredns v1.1.2 h1:bAFHrSsBeTeRG5W3Nf2su3lUGw7Npw2UKeCJm/3A638= +github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= @@ -122,22 +162,42 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 h1:lrWnAyy/F72MbxIxFUzKmcMCdt9Oi8RzpAxzTNQHD7o= +github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/digitalocean/godo v1.10.0 h1:uW1/FcvZE/hoixnJcnlmIUvTVNdZCLjRLzmDtRi1xXY= +github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= +github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.3.0 h1:3lOnM9cSzgGwx8VfK/NGOW5fLQ0GjIlCkaktF+n1M6o= +github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0 h1:ZoRgc53qJCfSLimXqJDrmBhnt5GChDsExMCK7t48o0Y= +github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.8.0 h1:uE6Fp4fOcAJdc1wTQXLJ+SYistkbG1dNoi6Zs1+Ybvk= +github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= +github.com/envoyproxy/protoc-gen-validate v0.0.14 h1:YBW6/cKy9prEGRYLnaGa4IDhzxZhRCtKsax8srGKDnM= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -147,9 +207,12 @@ github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -196,6 +259,10 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gogo/googleapis v1.1.0 h1:kFkMAZBNAn4j7K0GiZr8cRYzejq68VbheufiV3YuyFI= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -205,6 +272,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -218,6 +286,8 @@ github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -228,6 +298,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github/v27 v27.0.4/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= +github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= @@ -237,6 +309,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= @@ -247,6 +320,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= @@ -255,35 +329,78 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/consul v1.4.5 h1:ubKneQZvooWl/UkkIdx/Rhr/YKOo4OYL3qDAAfkU1Mw= github.com/hashicorp/consul v1.4.5/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= +github.com/hashicorp/consul v1.8.0 h1:yRKMKZyPLqUxl37t4nFt5OuGmTXoFhTJrakhfnYKCYA= +github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= +github.com/hashicorp/consul/api v1.5.0 h1:Yo2bneoGy68A7aNwmuETFnPhjyBEm7n3vzRacEVMjvI= +github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= +github.com/hashicorp/consul/sdk v0.5.0 h1:WC4594Wp/LkEeML/OdQKEC1yqBmEYkRp6i7X5u0zDAs= +github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.2 h1:ijMXI4qERbzxbCnkxmfUtwMyjrrk3y+Vt0MxojNCbBs= +github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= +github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de h1:XDCSythtg8aWSRSO29uwhgh7b127fWr+m5SemqjSUL8= +github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-connlimit v0.2.0 h1:OZjcfNxH/hPh/bT2Iw5yOJcLzz+zuIWpsp3I1S4Pjw4= +github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088 h1:jBvElOilnIl6mm8S6gva/dfeTJCcMs9TGO6/2C6k52E= +github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc= +github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.0.3 h1:iiqzNk8jKB6/sLRj623Ui/Vi1zf21LOUpgzGjTge6a8= +github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-raftchunking v0.6.1 h1:moEnaG3gcwsWNyIBJoD5PCByE+Ewkqxh6N05CT+MbwA= +github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.5.4 h1:1BZvpawXoJCWX6pNtow9+rpEj+3itIlutiqnntI6jOE= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -291,13 +408,39 @@ github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8 github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5 h1:uk280DXEbQiCOZgCOI3elFSeNxf8YIZiNsbr2pQLYD0= +github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1 h1:XFSOubp8KWB+Jd2PDyaX5xUd5bhSP/+pTDZVDMzZJM8= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4 h1:gkyML/r71w3FL8gUi74Vk76avkj/9lYAY9lvg0OcoGs= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69 h1:lc3c72qGlIMDqQpQH82Y4vaglRMMFdJbziYWriR4UcE= +github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= +github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.1.2 h1:oxEL5DDeurYxLd3UbcY/hccgSPhLLpiBZ1YxtWEq59c= +github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4= +github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.5 h1:ZynDUIQiA8usmRgPdGPHFdPnb1wgGI9tK3mO9hcAJjc= github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= +github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/vault/api v1.0.4 h1:j08Or/wryXT4AcHj1oCbMd7IijXcKzYUGw59LGu9onU= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/sdk v0.1.13 h1:mOEPeOhT7jl0J4AMl1E705+BcmeRs1VmKNb9F0sMLy8= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw= +github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 h1:Mo9W14pwbO9VfRe+ygqZ8dFbPpoIK1HFrG/zjTuQ+nc= @@ -307,12 +450,18 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f h1:ENpDacvnr8faw5ugQmEF1QYk+f/Y9lXFvuYmRxykago= +github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -342,12 +491,16 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/krishicks/yaml-patch v0.0.10 h1:H4FcHpnNwVmw8u0MjPRjWyIXtco6zM2F78t+57oNM3E= github.com/krishicks/yaml-patch v0.0.10/go.mod h1:Sm5TchwZS6sm7RJoyg87tzxm2ZcKzdRE4Q7TjNhPrME= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= +github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= @@ -359,26 +512,53 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149 h1:HfxbT6/JcvIljmERptWhwa8XzP7H3T+Z2N26gTsaDaA= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 h1:jw16EimP5oAEM/2wt+SiEUov/YDyTCTDuPtIKgQIvk0= github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1/go.mod h1:vuvdOZLJuf5HmJAJrKV64MmozrSsk+or0PB5dzdfspg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.0 h1:/x0XQ6h+3U3nAyk1yx+bHPURrKa9sVVvYbuqZ7pIAtI= github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452 h1:hOY53G+kBFhbYFpRVxHl5eS7laP6B1+Cq+Z9Dry1iMU= +github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= +github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.0.0 h1:ATSdz4NWrmWPOF1CeCBU4sMCno2hgqdbSrRPFWQSVZI= +github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -391,16 +571,23 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= +github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s= +github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6jJVXYjt8IE48G2eWl6BjwU5Gj0gqY84fy78= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -408,9 +595,13 @@ github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 h1:0R5 github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c h1:vwpFWvAO8DeIZfFeqASzZfsxuWPno9ncAebBEP0N3uE= +github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= @@ -418,6 +609,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pires/go-proxyproto v0.0.0-20191211124218-517ecdf5bb2b h1:JPLdtNmpXbWytipbGwYz7zXZzlQNASEiFw5aGAM75us= github.com/pires/go-proxyproto v0.0.0-20191211124218-517ecdf5bb2b/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -427,10 +620,15 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.1 h1:FFSuS004yOQEtDdTq+TAOLP5xUq63KqAFYyOi8zA+Y8= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -439,27 +637,49 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1: github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rboyer/safeio v0.2.1 h1:05xhhdRNAdS3apYm7JRjOqngf4xruaW959jmRxGDuSU= +github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 h1:Wdi9nwnhFNAlseAOekn6B5G/+GMtks9UKbvRU/CMM/o= +github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb h1:1r/p6yT1FfHR1+qBm7UYBPgfqCmzz/8mpNvfc+iKlfU= github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= +github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880 h1:1Ge4j/3uB2rxzPWD3TC+daeCw+w91z8UCUL/7WH5gn8= +github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -470,10 +690,14 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpke github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d h1:bVQRCxQvfjNUeRqaY/uT0tFuvuFY0ulgnczuR684Xic= +github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= @@ -489,6 +713,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -503,12 +728,16 @@ github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b h1:i3lm+BZX5fAaH github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tebeka/selenium v0.9.9 h1:cNziB+etNgyH/7KlNI7RMC1ua5aH1+5wUlFQyzeMh+w= github.com/tebeka/selenium v0.9.9/go.mod h1:5Fr8+pUvU6B1OiPfkdCKdXZyr5znvVkxuPd0NOdZCQc= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible h1:8uRvJleFpqLsO77WaAh2UrasMOzd8MxXrNj20e7El+Q= +github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= +github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.1.1 h1:TnCZ3FIuKeaIy+F45+Cnp+caqdXGy4z74HvwXN+570Y= github.com/tinylib/msgp v1.1.1/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= @@ -516,6 +745,7 @@ github.com/uber/jaeger-client-go v2.16.0+incompatible h1:Q2Pp6v3QYiocMxomCaJuwQG github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible h1:iMSCV0rmXEogjNWPh2D0xk9YVKvrtGoHJNe9ebLu/pw= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -527,11 +757,14 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo= +github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/z-division/go-zookeeper v0.0.0-20190128072838-6d7457066b9b h1:Itr7GbuXoM1PK/eCeNNia4Qd3ib9IgX9g9SpXgo8BwQ= github.com/z-division/go-zookeeper v0.0.0-20190128072838-6d7457066b9b/go.mod h1:JNALoWa+nCXR8SmgLluHcBNVJgyejzpKPZk9pX2yXXE= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -560,10 +793,13 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -596,11 +832,13 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= @@ -627,23 +865,39 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -671,6 +925,7 @@ golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624190245-7f2218787638/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191219041853-979b82bfef62 h1:vDaiisQl0rGVXqk3wT2yc43gSnwlj4haEG5J78IGZP4= golang.org/x/tools v0.0.0-20191219041853-979b82bfef62/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -691,13 +946,16 @@ google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEn google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190626174449-989357319d63/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -705,15 +963,21 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2El google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190926190326-7ee9db18f195 h1:dWzgMaXfaHsnkRKZ1l3iJLDmTEB40JMl/dqRbJX4D/o= google.golang.org/genproto v0.0.0-20190926190326-7ee9db18f195/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= gopkg.in/DataDog/dd-trace-go.v1 v1.17.0 h1:j9vAp9Re9bbtA/QFehkJpNba/6W2IbJtNuXZophCa54= gopkg.in/DataDog/dd-trace-go.v1 v1.17.0/go.mod h1:DVp8HmDh8PuTu2Z0fVVlBsyWaC++fzwVCaGWylTe3tg= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= @@ -726,6 +990,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.41.0 h1:Ka3ViY6gNYSKiVy71zXBEqKplnV35ImDLVG+8uoIklE= @@ -735,8 +1000,12 @@ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ldap.v2 v2.5.0 h1:1rO3ojzsHUk+gq4ZYhC4Pg+EzWaaKIV8+DJwExS5/QQ= gopkg.in/ldap.v2 v2.5.0/go.mod h1:oI0cpe/D7HRtBQl8aTg+ZmzFUAvu4lsv3eLXMLGFxWk= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -758,13 +1027,17 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069z honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= +k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= k8s.io/api v0.17.3 h1:XAm3PZp3wnEdzekNkcmj/9Y1zdmQYJ1I4GKSBBZ8aG0= k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= k8s.io/apiextensions-apiserver v0.17.3 h1:WDZWkPcbgvchEdDd7ysL21GGPx3UKZQLDZXEkevT6n4= k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= +k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= k8s.io/apimachinery v0.17.3 h1:f+uZV6rm4/tHE7xXgLyToprg6xWairaClGVkm2t8omg= k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= +k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= k8s.io/client-go v0.17.3 h1:deUna1Ksx05XeESH6XGCyONNFfiQmDdqeqUvicvP6nU= k8s.io/client-go v0.17.3/go.mod h1:cLXlTMtWHkuK4tD360KpWz2gG2KtdWEr/OT02i3emRQ= k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= @@ -775,10 +1048,13 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= From 2b9b56ab2ae892a40560fa11ad247f7fd5da1298 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Thu, 18 Jun 2020 23:36:39 -0700 Subject: [PATCH 071/430] vttablet: simplified tracker Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/endtoend/vstreamer_test.go | 4 +- .../tabletserver/replication_watcher.go | 29 ++-- .../tabletserver/replication_watcher_test.go | 161 ------------------ go/vt/vttablet/tabletserver/schema/tracker.go | 101 ++++++++--- .../tabletserver/schema/tracker_test.go | 72 ++++++-- go/vt/vttablet/tabletserver/tabletserver.go | 17 +- .../tabletserver/vstreamer/vstreamer_test.go | 16 -- 7 files changed, 149 insertions(+), 251 deletions(-) delete mode 100644 go/vt/vttablet/tabletserver/replication_watcher_test.go diff --git a/go/vt/vttablet/endtoend/vstreamer_test.go b/go/vt/vttablet/endtoend/vstreamer_test.go index dcd961cd899..43839122400 100644 --- a/go/vt/vttablet/endtoend/vstreamer_test.go +++ b/go/vt/vttablet/endtoend/vstreamer_test.go @@ -192,7 +192,7 @@ func TestSchemaVersioning(t *testing.T) { select { case eventCh <- evs: case <-ctx.Done(): - t.Fatal("Context Done() in send") + return nil } return nil } @@ -379,6 +379,7 @@ func runCases(ctx context.Context, t *testing.T, tests []test, eventCh chan []*b query := test.query client.Execute(query, nil) if len(test.output) > 0 { + t.Logf("expecting: %#v", test.output) expectLogs(ctx, t, query, eventCh, test.output) } if strings.HasPrefix(query, "create") || strings.HasPrefix(query, "alter") || strings.HasPrefix(query, "drop") { @@ -433,6 +434,7 @@ func expectLogs(ctx context.Context, t *testing.T, query string, eventCh chan [] for i, want := range output { // CurrentTime is not testable. evs[i].CurrentTime = 0 + t.Logf("checking: %v: %v: %v", i, want, evs[i]) switch want { case "begin": if evs[i].Type != binlogdatapb.VEventType_BEGIN { diff --git a/go/vt/vttablet/tabletserver/replication_watcher.go b/go/vt/vttablet/tabletserver/replication_watcher.go index 178bdeab8d6..4f425da122b 100644 --- a/go/vt/vttablet/tabletserver/replication_watcher.go +++ b/go/vt/vttablet/tabletserver/replication_watcher.go @@ -17,10 +17,10 @@ limitations under the License. package tabletserver import ( + "sync" "time" "golang.org/x/net/context" - "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" @@ -41,18 +41,17 @@ type ReplicationWatcher struct { env tabletenv.Env watchReplication bool vs VStreamer - subscriber schema.Subscriber cancel context.CancelFunc + wg sync.WaitGroup } // NewReplicationWatcher creates a new ReplicationWatcher. -func NewReplicationWatcher(env tabletenv.Env, vs VStreamer, config *tabletenv.TabletConfig, schemaTracker schema.Subscriber) *ReplicationWatcher { +func NewReplicationWatcher(env tabletenv.Env, vs VStreamer, config *tabletenv.TabletConfig) *ReplicationWatcher { return &ReplicationWatcher{ env: env, vs: vs, watchReplication: config.WatchReplication, - subscriber: schemaTracker, } } @@ -64,7 +63,8 @@ func (rpw *ReplicationWatcher) Open() { ctx, cancel := context.WithCancel(tabletenv.LocalContext()) rpw.cancel = cancel - go rpw.Process(ctx) + rpw.wg.Add(1) + go rpw.process(ctx) } // Close stops the ReplicationWatcher service. @@ -74,11 +74,12 @@ func (rpw *ReplicationWatcher) Close() { } rpw.cancel() rpw.cancel = nil + rpw.wg.Wait() } -// Process processes the replication stream. -func (rpw *ReplicationWatcher) Process(ctx context.Context) { +func (rpw *ReplicationWatcher) process(ctx context.Context) { defer rpw.env.LogError() + defer rpw.wg.Wait() filter := &binlogdatapb.Filter{ Rules: []*binlogdatapb.Rule{{ @@ -86,19 +87,9 @@ func (rpw *ReplicationWatcher) Process(ctx context.Context) { }}, } - var gtid string for { - // The tracker will reload the schema and save it into _vt.schema_tracking when the vstream encounters a DDL. + // VStreamer will reload the schema when it encounters a DDL. err := rpw.vs.Stream(ctx, "current", nil, filter, func(events []*binlogdatapb.VEvent) error { - for _, event := range events { - if event.Type == binlogdatapb.VEventType_GTID { - gtid = event.Gtid - } - if event.Type == binlogdatapb.VEventType_DDL { - log.Infof("Calling schema updated for %s %s", gtid, event.Ddl) - rpw.subscriber.SchemaUpdated(gtid, event.Ddl, event.Timestamp) - } - } return nil }) select { @@ -106,7 +97,7 @@ func (rpw *ReplicationWatcher) Process(ctx context.Context) { return case <-time.After(5 * time.Second): } - log.Infof("VStream ended: %v, retrying in 5 seconds", err) + log.Infof("ReplicatinWatcher VStream ended: %v, retrying in 5 seconds", err) time.Sleep(5 * time.Second) } } diff --git a/go/vt/vttablet/tabletserver/replication_watcher_test.go b/go/vt/vttablet/tabletserver/replication_watcher_test.go deleted file mode 100644 index 67637b9cf34..00000000000 --- a/go/vt/vttablet/tabletserver/replication_watcher_test.go +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2019 The Vitess Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package tabletserver - -import ( - "testing" - "time" - - "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" - - "github.com/stretchr/testify/require" - "golang.org/x/net/context" - "vitess.io/vitess/go/test/utils" - "vitess.io/vitess/go/vt/dbconfigs" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - "vitess.io/vitess/go/vt/servenv" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" -) - -func (t *mockSubscriber) SchemaUpdated(gtid string, ddl string, timestamp int64) error { - t.gtids = append(t.gtids, gtid) - t.ddls = append(t.ddls, ddl) - t.timestamps = append(t.timestamps, timestamp) - return nil -} - -var _ schema.Subscriber = (*mockSubscriber)(nil) -var _ VStreamer = (*fakeVstreamer)(nil) -var _ tabletenv.Env = (*fakeEnv)(nil) - -var env = &fakeEnv{} - -func TestReplicationWatcher(t *testing.T) { - testCases := []struct { - name string - input [][]*binlogdatapb.VEvent - expected []string - }{ - { - name: "empty", - input: [][]*binlogdatapb.VEvent{{}}, - expected: nil, - }, { - name: "single create table", - input: [][]*binlogdatapb.VEvent{{{ - Type: binlogdatapb.VEventType_DDL, - Timestamp: 643, - CurrentTime: 943, - Gtid: "gtid", - Ddl: "create table", - }}}, - expected: []string{"create table"}, - }, { - name: "mixed load", - input: [][]*binlogdatapb.VEvent{{{ - Type: binlogdatapb.VEventType_DDL, - Timestamp: 643, - CurrentTime: 943, - Gtid: "gtid", - Ddl: "create table", - }, { - Type: binlogdatapb.VEventType_INSERT, - Timestamp: 644, - CurrentTime: 944, - Gtid: "gtid2", - Ddl: "insert", - }, { - Type: binlogdatapb.VEventType_DDL, - Timestamp: 645, - CurrentTime: 945, - Gtid: "gtid3", - Ddl: "alter table", - }}}, - expected: []string{"create table", "alter table"}, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.name, func(t *testing.T) { - subscriber := &mockSubscriber{} - streamer := &fakeVstreamer{ - events: testCase.input, - } - watcher := &ReplicationWatcher{ - env: env, - watchReplication: true, - vs: streamer, - subscriber: subscriber, - } - - // when - watcher.Open() - time.Sleep(1 * time.Millisecond) - watcher.Close() - - // then - require.True(t, streamer.called, "streamer never called") - utils.MustMatch(t, testCase.expected, subscriber.ddls, "didnt see ddls") - }) - } -} - -type mockSubscriber struct { - gtids []string - ddls []string - timestamps []int64 -} - -type fakeVstreamer struct { - called bool - events [][]*binlogdatapb.VEvent -} - -type fakeEnv struct{} - -func (f *fakeEnv) CheckMySQL() { -} - -func (f *fakeEnv) Config() *tabletenv.TabletConfig { - return nil -} - -func (f *fakeEnv) DBConfigs() *dbconfigs.DBConfigs { - return nil -} - -func (f *fakeEnv) Exporter() *servenv.Exporter { - return nil -} - -func (f *fakeEnv) Stats() *tabletenv.Stats { - return nil -} - -func (f *fakeEnv) LogError() { -} - -func (f *fakeVstreamer) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error { - f.called = true - for _, events := range f.events { - err := send(events) - if err != nil { - return err - } - } - return nil -} diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 918ce42421e..10c66a4d5cf 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -20,11 +20,15 @@ import ( "bytes" "context" "fmt" + "sync" + "time" "github.com/gogo/protobuf/proto" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" ) const createSchemaTrackingTable = `CREATE TABLE IF NOT EXISTS _vt.schema_version ( @@ -36,53 +40,98 @@ const createSchemaTrackingTable = `CREATE TABLE IF NOT EXISTS _vt.schema_version PRIMARY KEY (id) ) ENGINE=InnoDB` -//Subscriber will get notified when the schema has been updated -type Subscriber interface { - SchemaUpdated(gtid string, ddl string, timestamp int64) error +// VStreamer defines the functions of VStreamer +// that the replicationWatcher needs. +type VStreamer interface { + Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error } -var _ Subscriber = (*Tracker)(nil) - -// Tracker implements Subscriber and persists versions into the ddb +// Tracker watches the replication and saves the latest schema into _vt.schema_version when a DDL is encountered. type Tracker struct { - engine *Engine - enabled bool + env tabletenv.Env + vs VStreamer + engine *Engine + cancel context.CancelFunc + wg sync.WaitGroup } // NewTracker creates a Tracker, needs an Open SchemaEngine (which implements the trackerEngine interface) -func NewTracker(engine *Engine) *Tracker { - return &Tracker{engine: engine} +func NewTracker(env tabletenv.Env, vs VStreamer, engine *Engine) *Tracker { + return &Tracker{ + env: env, + vs: vs, + engine: engine, + } } // Open enables the tracker functionality -func (t *Tracker) Open() { - t.enabled = true +func (tr *Tracker) Open() { + ctx, cancel := context.WithCancel(tabletenv.LocalContext()) + tr.cancel = cancel + tr.wg.Add(1) + go tr.process(ctx) } // Close disables the tracker functionality -func (t *Tracker) Close() { - t.enabled = false +func (tr *Tracker) Close() { + if tr.cancel == nil { + return + } + tr.cancel() + tr.cancel = nil + tr.wg.Wait() } -// SchemaUpdated is called by a vstream when it encounters a DDL -func (t *Tracker) SchemaUpdated(gtid string, ddl string, timestamp int64) error { - if !t.enabled { - log.Infof("Tracker not enabled, ignoring SchemaUpdated event") - return nil +func (tr *Tracker) process(ctx context.Context) { + defer tr.env.LogError() + defer tr.wg.Done() + + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "/.*", + }}, } - log.Infof("Processing SchemaUpdated event for gtid %s, ddl %s", gtid, ddl) + + var gtid string + for { + err := tr.vs.Stream(ctx, "current", nil, filter, func(events []*binlogdatapb.VEvent) error { + for _, event := range events { + if event.Type == binlogdatapb.VEventType_GTID { + gtid = event.Gtid + } + if event.Type == binlogdatapb.VEventType_DDL { + if err := tr.schemaUpdated(gtid, event.Ddl, event.Timestamp); err != nil { + tr.env.Stats().ErrorCounters.Add(vtrpcpb.Code_INTERNAL.String(), 1) + log.Errorf("Error updating schema: %v", err) + } + } + } + return nil + }) + select { + case <-ctx.Done(): + return + case <-time.After(5 * time.Second): + } + log.Infof("Tracker's vStream ended: %v, retrying in 5 seconds", err) + time.Sleep(5 * time.Second) + } +} + +func (tr *Tracker) schemaUpdated(gtid string, ddl string, timestamp int64) error { + log.Infof("Processing schemaUpdated event for gtid %s, ddl %s", gtid, ddl) if gtid == "" || ddl == "" { - return fmt.Errorf("got invalid gtid or ddl in SchemaUpdated") + return fmt.Errorf("got invalid gtid or ddl in schemaUpdated") } ctx := context.Background() // Engine will have reloaded the schema because vstream will reload it on a DDL - tables := t.engine.GetSchema() + tables := tr.engine.GetSchema() dbSchema := &binlogdatapb.MinimalSchema{ Tables: []*binlogdatapb.MinimalTable{}, } for name, table := range tables { - t := &binlogdatapb.MinimalTable{ + tr := &binlogdatapb.MinimalTable{ Name: name, Fields: table.Fields, } @@ -90,12 +139,12 @@ func (t *Tracker) SchemaUpdated(gtid string, ddl string, timestamp int64) error for _, pk := range table.PKColumns { pks = append(pks, int64(pk)) } - t.PKColumns = pks - dbSchema.Tables = append(dbSchema.Tables, t) + tr.PKColumns = pks + dbSchema.Tables = append(dbSchema.Tables, tr) } blob, _ := proto.Marshal(dbSchema) - conn, err := t.engine.GetConnection(ctx) + conn, err := tr.engine.GetConnection(ctx) if err != nil { return err } diff --git a/go/vt/vttablet/tabletserver/schema/tracker_test.go b/go/vt/vttablet/tabletserver/schema/tracker_test.go index 08631f0720a..9472585ffb2 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker_test.go +++ b/go/vt/vttablet/tabletserver/schema/tracker_test.go @@ -17,32 +17,76 @@ limitations under the License. package schema import ( - "fmt" - "regexp" "testing" - "github.com/stretchr/testify/require" + "github.com/stretchr/testify/assert" + "golang.org/x/net/context" "vitess.io/vitess/go/sqltypes" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" ) func TestTracker(t *testing.T) { se, db, cancel := getTestSchemaEngine(t) defer cancel() - tracker := NewTracker(se) - tracker.Open() - gtid1 := "MySQL56/7b04699f-f5e9-11e9-bf88-9cb6d089e1c3:1-10" ddl1 := "create table tracker_test (id int)" - ts1 := int64(1427325876) - var query string - query = "CREATE TABLE IF NOT EXISTS _vt.schema_version.*" + query := "CREATE TABLE IF NOT EXISTS _vt.schema_version.*" db.AddQueryPattern(query, &sqltypes.Result{}) - query = fmt.Sprintf("insert into _vt.schema_version.*%s.*%s.*%d.*", gtid1, regexp.QuoteMeta(ddl1), ts1) - db.AddQueryPattern(query, &sqltypes.Result{}) + db.AddQueryPattern("insert into _vt.schema_version.*", &sqltypes.Result{}) + + vs := &fakeVstreamer{ + done: make(chan struct{}), + events: [][]*binlogdatapb.VEvent{{ + { + Type: binlogdatapb.VEventType_GTID, + Gtid: gtid1, + }, { + Type: binlogdatapb.VEventType_DDL, + Ddl: ddl1, + }, + { + Type: binlogdatapb.VEventType_GTID, + Gtid: "", + }, { + Type: binlogdatapb.VEventType_DDL, + Ddl: ddl1, + }, + { + Type: binlogdatapb.VEventType_GTID, + Gtid: gtid1, + }, { + Type: binlogdatapb.VEventType_DDL, + Ddl: "", + }, + }}, + } + initial := se.env.Stats().ErrorCounters.Counts()["INTERNAL"] + tracker := NewTracker(se.env, vs, se) + tracker.Open() + <-vs.done + cancel() + tracker.Close() + final := se.env.Stats().ErrorCounters.Counts()["INTERNAL"] + assert.Equal(t, initial+2, final) +} + +var _ VStreamer = (*fakeVstreamer)(nil) + +type fakeVstreamer struct { + done chan struct{} + events [][]*binlogdatapb.VEvent +} - require.NoError(t, tracker.SchemaUpdated(gtid1, ddl1, ts1)) - require.Error(t, tracker.SchemaUpdated("", ddl1, ts1)) - require.Error(t, tracker.SchemaUpdated(gtid1, "", ts1)) +func (f *fakeVstreamer) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error { + for _, events := range f.events { + err := send(events) + if err != nil { + return err + } + } + close(f.done) + <-ctx.Done() + return nil } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 34246108c87..9e2b0f1ca3e 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -240,8 +240,8 @@ func NewTabletServer(name string, config *tabletenv.TabletConfig, topoServer *to tsv.txThrottler = txthrottler.NewTxThrottler(tsv.config, topoServer) tsOnce.Do(func() { srvTopoServer = srvtopo.NewResilientServer(topoServer, "TabletSrvTopo") }) tsv.vstreamer = vstreamer.NewEngine(tsv, srvTopoServer, tsv.se, tsv.sh) - tsv.tracker = schema.NewTracker(tsv.se) - tsv.watcher = NewReplicationWatcher(tsv, tsv.vstreamer, tsv.config, tsv.tracker) + tsv.tracker = schema.NewTracker(tsv, tsv.vstreamer, tsv.se) + tsv.watcher = NewReplicationWatcher(tsv, tsv.vstreamer, tsv.config) tsv.messager = messager.NewEngine(tsv, tsv.se, tsv.vstreamer) tsv.exporter.NewGaugeFunc("TabletState", "Tablet server state", func() int64 { tsv.mu.Lock() @@ -267,19 +267,12 @@ func NewTabletServer(name string, config *tabletenv.TabletConfig, topoServer *to // StartTracker starts a new replication watcher // Only to be used for testing func (tsv *TabletServer) StartTracker() { - tsv.config.TrackSchemaVersions = true - tsv.config.WatchReplication = true tsv.tracker.Open() - //need to close and reopen watcher since it is already opened in the tsv init and is idempotent ... - tsv.watcher.Close() - tsv.watcher.watchReplication = true - tsv.watcher.Open() } // StopTracker turns the watcher off // Only to be used for testing func (tsv *TabletServer) StopTracker() { - tsv.config.TrackSchemaVersions = false tsv.tracker.Close() } @@ -572,12 +565,8 @@ func (tsv *TabletServer) serveNewType() (err error) { tsv.messager.Open() tsv.hr.Close() tsv.hw.Open() - log.Info("Opening tracker, trackschemaversions is %t", tsv.config.TrackSchemaVersions) tsv.tracker.Open() - if tsv.config.TrackSchemaVersions { - log.Info("Starting watcher") - tsv.watcher.Open() - } + tsv.watcher.Close() } else { tsv.txController.AcceptReadOnly() tsv.messager.Close() diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go index 2d87d812795..d7c0d57aed6 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go @@ -26,8 +26,6 @@ import ( "testing" "time" - "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" - "vitess.io/vitess/go/vt/log" "github.com/stretchr/testify/assert" @@ -1641,8 +1639,6 @@ func expectLog(ctx context.Context, t *testing.T, input interface{}, ch <-chan [ } } -var lastPos string - func startStream(ctx context.Context, t *testing.T, filter *binlogdatapb.Filter, position string, tablePKs []*binlogdatapb.TableLastPK) (*sync.WaitGroup, <-chan []*binlogdatapb.VEvent) { switch position { case "": @@ -1674,18 +1670,6 @@ func vstream(ctx context.Context, t *testing.T, pos string, tablePKs []*binlogda } } return engine.Stream(ctx, pos, tablePKs, filter, func(evs []*binlogdatapb.VEvent) error { - if t.Name() == "TestVersion" { // emulate tracker only for the version test - for _, ev := range evs { - log.Infof("Original stream: %s event found %v", ev.Type, ev) - if ev.Type == binlogdatapb.VEventType_GTID { - lastPos = ev.Gtid - } - if ev.Type == binlogdatapb.VEventType_DDL { - schemaTracker := schema.NewTracker(env.SchemaEngine) - schemaTracker.SchemaUpdated(lastPos, ev.Ddl, ev.Timestamp) - } - } - } t.Logf("Received events: %v", evs) select { case ch <- evs: From c017b835c63a015c272575e381f0ea062b1121ba Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Fri, 19 Jun 2020 16:44:54 +0200 Subject: [PATCH 072/430] Make tests more repeatable Signed-off-by: Rohit Nayak --- go/test/endtoend/vreplication/cluster.go | 2 +- go/test/endtoend/vreplication/helper.go | 2 ++ .../vreplication/vreplication_test.go | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/go/test/endtoend/vreplication/cluster.go b/go/test/endtoend/vreplication/cluster.go index 4f838506538..30ad922e341 100644 --- a/go/test/endtoend/vreplication/cluster.go +++ b/go/test/endtoend/vreplication/cluster.go @@ -374,7 +374,7 @@ func (vc *VitessCluster) WaitForVReplicationToCatchup(vttablet *cluster.Vttablet results := [3]string{"[INT64(0)]", "[INT64(1)]", "[INT64(0)]"} var lastChecked time.Time for ind, query := range queries { - waitDuration := 100 * time.Millisecond + waitDuration := 500 * time.Millisecond for duration > 0 { fmt.Printf("Executing query %s on %s\n", query, vttablet.Name) lastChecked = time.Now() diff --git a/go/test/endtoend/vreplication/helper.go b/go/test/endtoend/vreplication/helper.go index c774efeb7ab..e32f9afd043 100644 --- a/go/test/endtoend/vreplication/helper.go +++ b/go/test/endtoend/vreplication/helper.go @@ -159,7 +159,9 @@ func getQueryCount(url string, query string) int { //Queries seem to include non-printable characters at times and hence equality fails unless these are removed re := regexp.MustCompile("[[:^ascii:]]") foundQuery := re.ReplaceAllLiteralString(row[queryIndex], "") + foundQuery = strings.ReplaceAll(foundQuery, "_", "") cleanQuery := re.ReplaceAllLiteralString(query, "") + cleanQuery = strings.ReplaceAll(cleanQuery, "_", "") if foundQuery == cleanQuery { count, _ = strconv.Atoi(row[countIndex]) } diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index c7a9a6a843e..6e625ba338d 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -63,7 +63,6 @@ func TestBasicVreplicationWorkflow(t *testing.T) { verifyClusterHealth(t) insertInitialData(t) shardCustomer(t, true) - shardOrders(t) shardMerchant(t) @@ -175,9 +174,11 @@ func shardCustomer(t *testing.T, testReverse bool) { insertQuery2 := "insert into customer(name) values('tempCustomer2')" matchInsertQuery2 := "insert into customer(name, cid) values (:vtg1, :_cid0)" assert.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name) values('tempCustomer3')" //ID 101, hence due to reverse_bits in shard 80- + + insertQuery2 = "insert into customer(name, cid) values('tempCustomer3', 101)" //ID 101, hence due to reverse_bits in shard 80- assert.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name) values('tempCustomer4')" //ID 102, hence due to reverse_bits in shard -80 + + insertQuery2 = "insert into customer(name, cid) values('tempCustomer4', 102)" //ID 102, hence due to reverse_bits in shard -80 assert.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab1, "customer", insertQuery2, matchInsertQuery2)) if testReverse { @@ -244,12 +245,12 @@ func shardCustomer(t *testing.T, testReverse bool) { assert.NoError(t, err, "Customer table not deleted from zone1-200") assert.True(t, found) - insertQuery2 = "insert into customer(name) values('tempCustomer8')" //ID 103, hence due to reverse_bits in shard 80- + insertQuery2 = "insert into customer(name, cid) values('tempCustomer8', 103)" //ID 103, hence due to reverse_bits in shard 80- assert.False(t, validateThatQueryExecutesOnTablet(t, vtgateConn, productTab, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name) values('tempCustomer9')" //ID 104, hence due to reverse_bits in shard 80- - assert.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery2, matchInsertQuery2)) - insertQuery2 = "insert into customer(name) values('tempCustomer10')" //ID 105, hence due to reverse_bits in shard -80 + insertQuery2 = "insert into customer(name, cid) values('tempCustomer10', 104)" //ID 105, hence due to reverse_bits in shard -80 assert.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab1, "customer", insertQuery2, matchInsertQuery2)) + insertQuery2 = "insert into customer(name, cid) values('tempCustomer9', 105)" //ID 104, hence due to reverse_bits in shard 80- + assert.True(t, validateThatQueryExecutesOnTablet(t, vtgateConn, customerTab2, "customer", insertQuery2, matchInsertQuery2)) execVtgateQuery(t, vtgateConn, "customer", "delete from customer where name like 'tempCustomer%'") assert.Empty(t, validateCountInTablet(t, customerTab1, "customer", "customer", 1)) @@ -266,7 +267,7 @@ func shardCustomer(t *testing.T, testReverse bool) { func reshardCustomer2to4Split(t *testing.T) { ksName := "customer" - counts := map[string]int{"zone1-600": 4, "zone1-700": 5, "zone1-800": 5, "zone1-900": 6} + counts := map[string]int{"zone1-600": 4, "zone1-700": 5, "zone1-800": 6, "zone1-900": 5} reshard(t, ksName, "customer", "c2c4", "-80,80-", "-40,40-80,80-c0,c0-", 600, counts, nil) assert.Empty(t, validateCount(t, vtgateConn, ksName, "customer", 20)) query := "insert into customer (name) values('yoko')" @@ -329,7 +330,7 @@ func reshardMerchant3to1Merge(t *testing.T) { func reshardCustomer3to2SplitMerge(t *testing.T) { //-40,40-80,80-c0 => merge/split, c0- stays the same ending up with 3 ksName := "customer" - counts := map[string]int{"zone1-600": 5, "zone1-700": 5, "zone1-800": 5, "zone1-900": 6} + counts := map[string]int{"zone1-1000": 7, "zone1-1100": 9, "zone1-1200": 5} reshard(t, ksName, "customer", "c4c3", "-40,40-80,80-c0", "-60,60-c0", 1000, counts, nil) } From 6ac63cdc16df61fed91f30504f2982498a3f27ef Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 19 Jun 2020 15:18:14 -0700 Subject: [PATCH 073/430] vttablet: fix tracker endtoend test Signed-off-by: Sugu Sougoumarane --- go/vt/vtexplain/vtexplain_vttablet.go | 1 + go/vt/vttablet/endtoend/framework/server.go | 1 + go/vt/vttablet/endtoend/vstreamer_test.go | 18 +++++------ .../tabletserver/replication_watcher.go | 2 +- go/vt/vttablet/tabletserver/schema/tracker.go | 31 ++++++++++++++++--- .../tabletserver/schema/tracker_test.go | 11 +++++-- .../tabletserver/vstreamer/vstreamer.go | 10 ------ 7 files changed, 45 insertions(+), 29 deletions(-) diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 26724bc0684..d592414f282 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -77,6 +77,7 @@ func newTablet(opts *Options, t *topodatapb.Tablet) *explainTablet { db := fakesqldb.New(nil) config := tabletenv.NewCurrentConfig() + config.TrackSchemaVersions = false if opts.ExecutionMode == ModeTwoPC { config.TwoPCCoordinatorAddress = "XXX" config.TwoPCAbandonAge = 1.0 diff --git a/go/vt/vttablet/endtoend/framework/server.go b/go/vt/vttablet/endtoend/framework/server.go index 1383b0a0d1e..a14ded01fc3 100644 --- a/go/vt/vttablet/endtoend/framework/server.go +++ b/go/vt/vttablet/endtoend/framework/server.go @@ -74,6 +74,7 @@ func StartServer(connParams, connAppDebugParams mysql.ConnParams, dbName string) config.TwoPCAbandonAge = 1 config.TwoPCCoordinatorAddress = "fake" config.HotRowProtection.Mode = tabletenv.Enable + config.TrackSchemaVersions = true Target = querypb.Target{ Keyspace: "vttest", diff --git a/go/vt/vttablet/endtoend/vstreamer_test.go b/go/vt/vttablet/endtoend/vstreamer_test.go index 43839122400..032f544b8e3 100644 --- a/go/vt/vttablet/endtoend/vstreamer_test.go +++ b/go/vt/vttablet/endtoend/vstreamer_test.go @@ -34,10 +34,7 @@ import ( binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" tabletpb "vitess.io/vitess/go/vt/proto/topodata" - "vitess.io/vitess/go/vt/srvtopo" "vitess.io/vitess/go/vt/vttablet/endtoend/framework" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" - "vitess.io/vitess/go/vt/vttablet/tabletserver/vstreamer" ) type test struct { @@ -50,9 +47,7 @@ func TestHistorianSchemaUpdate(t *testing.T) { defer cancel() tsv := framework.Server historian := tsv.Historian() - srvTopo := srvtopo.NewResilientServer(framework.TopoServer, "SchemaVersionE2ETestTopo") - vstreamer.NewEngine(tabletenv.NewEnv(tsv.Config(), "SchemaVersionE2ETest"), srvTopo, tsv.SchemaEngine(), historian) target := &querypb.Target{ Keyspace: "vttest", Shard: "0", @@ -96,14 +91,19 @@ func TestHistorianSchemaUpdate(t *testing.T) { } func TestSchemaVersioning(t *testing.T) { + // Let's disable the already running tracker to prevent it from + // picking events from the previous test, and then re-enable it at the end. + tsv := framework.Server + tsv.StopTracker() + tsv.Historian().SetTrackSchemaVersions(false) + defer tsv.StartTracker() + defer tsv.Historian().SetTrackSchemaVersions(true) + ctx, cancel := context.WithCancel(context.Background()) defer cancel() - tsv := framework.Server tsv.Historian().SetTrackSchemaVersions(true) tsv.StartTracker() - srvTopo := srvtopo.NewResilientServer(framework.TopoServer, "SchemaVersionE2ETestTopo") - vstreamer.NewEngine(tabletenv.NewEnv(tsv.Config(), "SchemaVersionE2ETest"), srvTopo, tsv.SchemaEngine(), tsv.Historian()) target := &querypb.Target{ Keyspace: "vttest", Shard: "0", @@ -379,7 +379,6 @@ func runCases(ctx context.Context, t *testing.T, tests []test, eventCh chan []*b query := test.query client.Execute(query, nil) if len(test.output) > 0 { - t.Logf("expecting: %#v", test.output) expectLogs(ctx, t, query, eventCh, test.output) } if strings.HasPrefix(query, "create") || strings.HasPrefix(query, "alter") || strings.HasPrefix(query, "drop") { @@ -434,7 +433,6 @@ func expectLogs(ctx context.Context, t *testing.T, query string, eventCh chan [] for i, want := range output { // CurrentTime is not testable. evs[i].CurrentTime = 0 - t.Logf("checking: %v: %v: %v", i, want, evs[i]) switch want { case "begin": if evs[i].Type != binlogdatapb.VEventType_BEGIN { diff --git a/go/vt/vttablet/tabletserver/replication_watcher.go b/go/vt/vttablet/tabletserver/replication_watcher.go index 4f425da122b..06b7f829550 100644 --- a/go/vt/vttablet/tabletserver/replication_watcher.go +++ b/go/vt/vttablet/tabletserver/replication_watcher.go @@ -79,7 +79,7 @@ func (rpw *ReplicationWatcher) Close() { func (rpw *ReplicationWatcher) process(ctx context.Context) { defer rpw.env.LogError() - defer rpw.wg.Wait() + defer rpw.wg.Done() filter := &binlogdatapb.Filter{ Rules: []*binlogdatapb.Rule{{ diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 10c66a4d5cf..4b57d210d63 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -48,35 +48,56 @@ type VStreamer interface { // Tracker watches the replication and saves the latest schema into _vt.schema_version when a DDL is encountered. type Tracker struct { + enabled bool + + mu sync.Mutex + cancel context.CancelFunc + wg sync.WaitGroup + env tabletenv.Env vs VStreamer engine *Engine - cancel context.CancelFunc - wg sync.WaitGroup } // NewTracker creates a Tracker, needs an Open SchemaEngine (which implements the trackerEngine interface) func NewTracker(env tabletenv.Env, vs VStreamer, engine *Engine) *Tracker { return &Tracker{ - env: env, - vs: vs, - engine: engine, + enabled: env.Config().TrackSchemaVersions, + env: env, + vs: vs, + engine: engine, } } // Open enables the tracker functionality func (tr *Tracker) Open() { + if !tr.enabled { + log.Info("Schema tracker is not enabled.") + return + } + + tr.mu.Lock() + defer tr.mu.Unlock() + if tr.cancel != nil { + return + } + ctx, cancel := context.WithCancel(tabletenv.LocalContext()) tr.cancel = cancel tr.wg.Add(1) + log.Info("Schema tracker enabled.") go tr.process(ctx) } // Close disables the tracker functionality func (tr *Tracker) Close() { + tr.mu.Lock() + defer tr.mu.Unlock() if tr.cancel == nil { return } + + log.Info("Schema tracker stopped.") tr.cancel() tr.cancel = nil tr.wg.Wait() diff --git a/go/vt/vttablet/tabletserver/schema/tracker_test.go b/go/vt/vttablet/tabletserver/schema/tracker_test.go index 9472585ffb2..3bbe1d63ba4 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker_test.go +++ b/go/vt/vttablet/tabletserver/schema/tracker_test.go @@ -23,6 +23,7 @@ import ( "golang.org/x/net/context" "vitess.io/vitess/go/sqltypes" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" ) func TestTracker(t *testing.T) { @@ -62,13 +63,17 @@ func TestTracker(t *testing.T) { }, }}, } - initial := se.env.Stats().ErrorCounters.Counts()["INTERNAL"] - tracker := NewTracker(se.env, vs, se) + config := se.env.Config() + config.TrackSchemaVersions = true + env := tabletenv.NewEnv(config, "TrackerTest") + initial := env.Stats().ErrorCounters.Counts()["INTERNAL"] + tracker := NewTracker(env, vs, se) tracker.Open() <-vs.done cancel() tracker.Close() - final := se.env.Stats().ErrorCounters.Counts()["INTERNAL"] + // Two of those events should have caused an error. + final := env.Stats().ErrorCounters.Counts()["INTERNAL"] assert.Equal(t, initial+2, final) } diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index 96c603fa634..ee298b8ff34 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -131,15 +131,12 @@ func (vs *vstreamer) SetVSchema(vschema *localVSchema) { // that thread, which helps us avoid mutexes to update the plans. select { case vs.vevents <- vschema: - log.Infof("VSchema sent to vs.vevents") case <-vs.ctx.Done(): - log.Infof("ctx.Done() in setVSchema") } } // Cancel stops the streaming. func (vs *vstreamer) Cancel() { - log.Infof("vstreamer context is being cancelled") vs.cancel() } @@ -159,7 +156,6 @@ func (vs *vstreamer) Stream() error { // Stream streams binlog events. func (vs *vstreamer) replicate(ctx context.Context) error { - log.Infof("In replicate with pos %s", vs.pos) // Ensure sh is Open. If vttablet came up in a non_serving role, // the historian may not have been initialized. if err := vs.sh.Open(); err != nil { @@ -182,7 +178,6 @@ func (vs *vstreamer) replicate(ctx context.Context) error { // parseEvents parses and sends events. func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.BinlogEvent) error { - log.Infof("In parse events") // bufferAndTransmit uses bufferedEvents and curSize to buffer events. var ( bufferedEvents []*binlogdatapb.VEvent @@ -279,7 +274,6 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog } vevents, err := vs.parseEvent(ev) if err != nil { - log.Infof("parseEvent returned error %v", err) return err } for _, vevent := range vevents { @@ -291,9 +285,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog } } case vs.vschema = <-vs.vevents: - log.Infof("Received vschema in vs.vevents") if err := vs.rebuildPlans(); err != nil { - log.Infof("Error rebuilding plans %v", err) return err } // Increment this counter for testing. @@ -436,7 +428,6 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e }) } else { // If the DDL need not be sent, send a dummy OTHER event. - log.Infof("Not sending DDL for %s", q.SQL) vevents = append(vevents, &binlogdatapb.VEvent{ Type: binlogdatapb.VEventType_GTID, Gtid: mysql.EncodePosition(vs.pos), @@ -513,7 +504,6 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e if id == vs.journalTableID { vevents, err = vs.processJournalEvent(vevents, plan, rows) } else if id == vs.versionTableID { - log.Infof("In vstreamer registering version event") vs.sh.RegisterVersionEvent() vevent := &binlogdatapb.VEvent{ Type: binlogdatapb.VEventType_VERSION, From cda32c8ccf62690ff1b889476f413afb859735e6 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Fri, 19 Jun 2020 23:16:22 -0700 Subject: [PATCH 074/430] vttablet: simplified historian Since the historian life cycle was the same as schema engine, it's now been made part of it. Its api is exposed by the engine itself. This also simplified the internal structure of the historian because it doesn't have to deal with the latest schema any more. Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/endtoend/vstreamer_test.go | 68 +---- .../vreplication/external_connector.go | 3 +- .../vreplication/framework_test.go | 4 +- .../vreplication/journal_test.go | 1 - go/vt/vttablet/tabletserver/schema/engine.go | 105 ++++--- .../vttablet/tabletserver/schema/historian.go | 283 ++++++++---------- .../tabletserver/schema/historian_test.go | 54 ++-- go/vt/vttablet/tabletserver/schema/tracker.go | 39 ++- go/vt/vttablet/tabletserver/tabletserver.go | 29 +- go/vt/vttablet/tabletserver/vstreamer/copy.go | 4 +- .../vttablet/tabletserver/vstreamer/engine.go | 8 +- .../tabletserver/vstreamer/main_test.go | 49 +-- .../tabletserver/vstreamer/rowstreamer.go | 18 +- .../tabletserver/vstreamer/testenv/testenv.go | 3 + .../tabletserver/vstreamer/uvstreamer.go | 10 +- .../tabletserver/vstreamer/uvstreamer_test.go | 2 +- .../tabletserver/vstreamer/vstreamer.go | 16 +- .../tabletserver/vstreamer/vstreamer_test.go | 32 +- 18 files changed, 326 insertions(+), 402 deletions(-) diff --git a/go/vt/vttablet/endtoend/vstreamer_test.go b/go/vt/vttablet/endtoend/vstreamer_test.go index 032f544b8e3..068b329e4a5 100644 --- a/go/vt/vttablet/endtoend/vstreamer_test.go +++ b/go/vt/vttablet/endtoend/vstreamer_test.go @@ -22,13 +22,9 @@ import ( "errors" "fmt" "strings" - "sync" "testing" "time" - "github.com/stretchr/testify/require" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -42,67 +38,19 @@ type test struct { output []string } -func TestHistorianSchemaUpdate(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - tsv := framework.Server - historian := tsv.Historian() - - target := &querypb.Target{ - Keyspace: "vttest", - Shard: "0", - TabletType: tabletpb.TabletType_MASTER, - Cell: "", - } - filter := &binlogdatapb.Filter{ - Rules: []*binlogdatapb.Rule{{ - Match: "/.*/", - }}, - } - var createTableSQL = "create table historian_test1(id1 int)" - var mu sync.Mutex - mu.Lock() - send := func(events []*binlogdatapb.VEvent) error { - for _, ev := range events { - if ev.Type == binlogdatapb.VEventType_DDL && ev.Ddl == createTableSQL { - log.Info("Found DDL for table historian_test1") - mu.Unlock() - } - } - return nil - } - go func() { - if err := tsv.VStream(ctx, target, "current", nil, filter, send); err != nil { - fmt.Printf("Error in tsv.VStream: %v", err) - t.Error(err) - } - }() - - require.Nil(t, historian.GetTableForPos(sqlparser.NewTableIdent("historian_test1"), "")) - require.NotNil(t, historian.GetTableForPos(sqlparser.NewTableIdent("vitess_test"), "")) - client := framework.NewClient() - client.Execute(createTableSQL, nil) - - mu.Lock() - minSchema := historian.GetTableForPos(sqlparser.NewTableIdent("historian_test1"), "") - want := `name:"historian_test1" fields: ` - require.Equal(t, fmt.Sprintf("%v", minSchema), want) - -} - func TestSchemaVersioning(t *testing.T) { // Let's disable the already running tracker to prevent it from // picking events from the previous test, and then re-enable it at the end. tsv := framework.Server - tsv.StopTracker() - tsv.Historian().SetTrackSchemaVersions(false) - defer tsv.StartTracker() - defer tsv.Historian().SetTrackSchemaVersions(true) + tsv.EnableHistorian(false) + tsv.SetTracking(false) + defer tsv.EnableHistorian(true) + defer tsv.SetTracking(true) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - tsv.Historian().SetTrackSchemaVersions(true) - tsv.StartTracker() + tsv.EnableHistorian(true) + tsv.SetTracking(true) target := &querypb.Target{ Keyspace: "vttest", @@ -206,7 +154,7 @@ func TestSchemaVersioning(t *testing.T) { log.Infof("\n\n\n=============================================== CURRENT EVENTS START HERE ======================\n\n\n") runCases(ctx, t, cases, eventCh) - tsv.StopTracker() + tsv.SetTracking(false) cases = []test{ { //comment prefix required so we don't look for ddl in schema_version @@ -295,7 +243,7 @@ func TestSchemaVersioning(t *testing.T) { cancel() log.Infof("\n\n\n=============================================== PAST EVENTS WITHOUT TRACK VERSIONS START HERE ======================\n\n\n") - tsv.Historian().SetTrackSchemaVersions(false) + tsv.EnableHistorian(false) ctx, cancel = context.WithCancel(context.Background()) defer cancel() eventCh = make(chan []*binlogdatapb.VEvent) diff --git a/go/vt/vttablet/tabletmanager/vreplication/external_connector.go b/go/vt/vttablet/tabletmanager/vreplication/external_connector.go index d991cb4a319..9f1b2121c6a 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/external_connector.go +++ b/go/vt/vttablet/tabletmanager/vreplication/external_connector.go @@ -88,8 +88,7 @@ func (ec *externalConnector) Get(name string) (*mysqlConnector, error) { c := &mysqlConnector{} c.env = tabletenv.NewEnv(config, name) c.se = schema.NewEngine(c.env) - sh := schema.NewHistorian(c.se) - c.vstreamer = vstreamer.NewEngine(c.env, nil, c.se, sh) + c.vstreamer = vstreamer.NewEngine(c.env, nil, c.se) c.se.InitDBConfig(c.env.Config().DB.DbaWithDB()) // Open diff --git a/go/vt/vttablet/tabletmanager/vreplication/framework_test.go b/go/vt/vttablet/tabletmanager/vreplication/framework_test.go index 00f7f6ecf5d..f30bac4223f 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/framework_test.go @@ -27,8 +27,6 @@ import ( "testing" "time" - "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" - "github.com/golang/protobuf/proto" "golang.org/x/net/context" @@ -91,7 +89,7 @@ func TestMain(m *testing.M) { // engines cannot be initialized in testenv because it introduces // circular dependencies. - streamerEngine = vstreamer.NewEngine(env.TabletEnv, env.SrvTopo, env.SchemaEngine, schema.NewHistorian(env.SchemaEngine)) + streamerEngine = vstreamer.NewEngine(env.TabletEnv, env.SrvTopo, env.SchemaEngine) streamerEngine.Open(env.KeyspaceName, env.Cells[0]) defer streamerEngine.Close() diff --git a/go/vt/vttablet/tabletmanager/vreplication/journal_test.go b/go/vt/vttablet/tabletmanager/vreplication/journal_test.go index 884cc042790..32402c1fdb4 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/journal_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/journal_test.go @@ -36,7 +36,6 @@ func TestJournalOneToOne(t *testing.T) { "drop table t", fmt.Sprintf("drop table %s.t", vrepldb), }) - env.SchemaEngine.Open() env.SchemaEngine.Reload(context.Background()) filter := &binlogdatapb.Filter{ diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 426ef45fd03..8858fbc2553 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -19,6 +19,7 @@ package schema import ( "bytes" "encoding/json" + "fmt" "net/http" "sync" "time" @@ -38,6 +39,7 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) @@ -62,33 +64,21 @@ type Engine struct { notifierMu sync.Mutex notifiers map[string]notifier - // The following fields have their own synchronization - // and do not require locking mu. + historian *historian + conns *connpool.Pool ticks *timer.Timer } -// Lock acquires the SE mutex with optional logging (useful for debugging deadlocks) -func (se *Engine) Lock(msg string) { - log.V(2).Infof("SE: acquiring Lock %s", msg) - se.mu.Lock() -} - -// Unlock releases the SE mutex with optional logging (useful for debugging deadlocks) -func (se *Engine) Unlock(msg string) { - log.V(2).Infof("SE: releasing Lock %s", msg) - se.mu.Unlock() -} - // NewEngine creates a new Engine. func NewEngine(env tabletenv.Env) *Engine { reloadTime := time.Duration(env.Config().SchemaReloadIntervalSeconds * 1e9) se := &Engine{ env: env, - // We need two connections: one for the reloader, and one for - // the historian. + // We need three connections: one for the reloader, one for + // the historian, and one for the tracker. conns: connpool.NewPool(env, "", tabletenv.ConnPoolConfig{ - Size: 2, + Size: 3, IdleTimeoutSeconds: env.Config().OltpReadPool.IdleTimeoutSeconds, }), ticks: timer.NewTimer(reloadTime), @@ -108,6 +98,7 @@ func NewEngine(env tabletenv.Env) *Engine { schemazHandler(se.GetSchema(), w, r) }) + se.historian = newHistorian(env.Config().TrackSchemaVersions, se.conns) return se } @@ -119,8 +110,8 @@ func (se *Engine) InitDBConfig(cp dbconfigs.Connector) { // Open initializes the Engine. Calling Open on an already // open engine is a no-op. func (se *Engine) Open() error { - se.Lock("Open") - defer se.Unlock("Open") + se.mu.Lock() + defer se.mu.Unlock() if se.isOpen { return nil } @@ -135,38 +126,39 @@ func (se *Engine) Open() error { if err := se.reload(ctx); err != nil { return err } - + if err := se.historian.Open(); err != nil { + return err + } se.ticks.Start(func() { if err := se.Reload(ctx); err != nil { log.Errorf("periodic schema reload failed: %v", err) } }) + se.isOpen = true return nil } // IsOpen checks if engine is open func (se *Engine) IsOpen() bool { - se.Lock("IsOpen") - defer se.Unlock("IsOpen") + se.mu.Lock() + defer se.mu.Unlock() return se.isOpen } -// GetConnection returns a connection from the pool -func (se *Engine) GetConnection(ctx context.Context) (*connpool.DBConn, error) { - return se.conns.Get(ctx) -} - // Close shuts down Engine and is idempotent. // It can be re-opened after Close. func (se *Engine) Close() { - se.Lock("Close") - defer se.Unlock("Close") + se.mu.Lock() + defer se.mu.Unlock() if !se.isOpen { return } + se.ticks.Stop() + se.historian.Close() se.conns.Close() + se.tables = make(map[string]*Table) se.lastChange = 0 se.notifiers = make(map[string]notifier) @@ -177,8 +169,8 @@ func (se *Engine) Close() { // they don't get accidentally reused after losing mastership. func (se *Engine) MakeNonMaster() { // This function is tested through endtoend test. - se.Lock("MakeNonMaster") - defer se.Unlock("MakeNonMaster") + se.mu.Lock() + defer se.mu.Unlock() for _, t := range se.tables { if t.SequenceInfo != nil { t.SequenceInfo.Lock() @@ -189,6 +181,12 @@ func (se *Engine) MakeNonMaster() { } } +// EnableHistorian forces tracking to be on or off. +// Only used for testing. +func (se *Engine) EnableHistorian(enabled bool) error { + return se.historian.Enable(enabled) +} + // Reload reloads the schema info from the db. // Any tables that have changed since the last load are updated. func (se *Engine) Reload(ctx context.Context) error { @@ -200,8 +198,8 @@ func (se *Engine) Reload(ctx context.Context) error { // It maintains the position at which the schema was reloaded and if the same position is provided // (say by multiple vstreams) it returns the cached schema. In case of a newer or empty pos it always reloads the schema func (se *Engine) ReloadAt(ctx context.Context, pos mysql.Position) error { - se.Lock("ReloadAt") - defer se.Unlock("ReloadAt") + se.mu.Lock() + defer se.mu.Unlock() if !se.isOpen { log.Warning("Schema reload called for an engine that is not yet open") return nil @@ -333,6 +331,30 @@ func (se *Engine) populatePrimaryKeys(ctx context.Context, conn *connpool.DBConn return nil } +// RegisterVersionEvent is called by the vstream when it encounters a version event (an insert into _vt.schema_tracking) +// It triggers the historian to load the newer rows from the database to update its cache +func (se *Engine) RegisterVersionEvent() error { + return se.historian.RegisterVersionEvent() +} + +// GetTableForPos returns a best-effort schema for a specific gtid +func (se *Engine) GetTableForPos(tableName sqlparser.TableIdent, gtid string) (*binlogdatapb.MinimalTable, error) { + mt, err := se.historian.GetTableForPos(tableName, gtid) + if err != nil { + return nil, err + } + if mt != nil { + return mt, nil + } + se.mu.Lock() + defer se.mu.Unlock() + st, ok := se.tables[tableName.String()] + if !ok { + return nil, fmt.Errorf("table %v not found in vttablet schema", tableName.String()) + } + return newMinimalTable(st), nil +} + // RegisterNotifier registers the function for schema change notification. // It also causes an immediate notification to the caller. The notified // function must not change the map or its contents. The only exception @@ -384,16 +406,16 @@ func (se *Engine) broadcast(created, altered, dropped []string) { // GetTable returns the info for a table. func (se *Engine) GetTable(tableName sqlparser.TableIdent) *Table { - se.Lock("GetTable") - defer se.Unlock("GetTable") + se.mu.Lock() + defer se.mu.Unlock() return se.tables[tableName.String()] } // GetSchema returns the current The Tables are a shared // data structure and must be treated as read-only. func (se *Engine) GetSchema() map[string]*Table { - se.Lock("GetSchema") - defer se.Unlock("GetSchema") + se.mu.Lock() + defer se.mu.Unlock() tables := make(map[string]*Table, len(se.tables)) for k, v := range se.tables { tables[k] = v @@ -401,6 +423,11 @@ func (se *Engine) GetSchema() map[string]*Table { return tables } +// GetConnection returns a connection from the pool +func (se *Engine) GetConnection(ctx context.Context) (*connpool.DBConn, error) { + return se.conns.Get(ctx) +} + func (se *Engine) handleDebugSchema(response http.ResponseWriter, request *http.Request) { if err := acl.CheckAccessHTTP(request, acl.DEBUGGING); err != nil { acl.SendError(response, err) @@ -444,7 +471,7 @@ func NewEngineForTests() *Engine { // SetTableForTests puts a Table in the map directly. func (se *Engine) SetTableForTests(table *Table) { - se.Lock("SetTableForTests") - defer se.Unlock("SetTableForTests") + se.mu.Lock() + defer se.mu.Unlock() se.tables[table.Name.String()] = table } diff --git a/go/vt/vttablet/tabletserver/schema/historian.go b/go/vt/vttablet/tabletserver/schema/historian.go index 812b37a99a7..c55b3367623 100644 --- a/go/vt/vttablet/tabletserver/schema/historian.go +++ b/go/vt/vttablet/tabletserver/schema/historian.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" "vitess.io/vitess/go/vt/vtgate/evalengine" + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" "vitess.io/vitess/go/vt/sqlparser" @@ -38,216 +39,187 @@ const getSchemaVersions = "select id, pos, ddl, time_updated, schemax from _vt.s // vl defines the glog verbosity level for the package const vl = 10 -// Historian defines the interface to reload a db schema or get the schema of a table for a given position -type Historian interface { - RegisterVersionEvent() error - GetTableForPos(tableName sqlparser.TableIdent, pos string) *binlogdatapb.MinimalTable - Open() error - Close() - SetTrackSchemaVersions(val bool) -} - -// TrackedSchema has the snapshot of the table at a given pos (reached by ddl) -type TrackedSchema struct { +// trackedSchema has the snapshot of the table at a given pos (reached by ddl) +type trackedSchema struct { schema map[string]*binlogdatapb.MinimalTable pos mysql.Position ddl string } -var _ Historian = (*HistorianSvc)(nil) - -// HistorianSvc implements the Historian interface by calling schema.Engine for the underlying schema +// historian implements the Historian interface by calling schema.Engine for the underlying schema // and supplying a schema for a specific version by loading the cached values from the schema_version table // The schema version table is populated by the Tracker -type HistorianSvc struct { - se *Engine - lastID int64 - schemas []*TrackedSchema - mu sync.Mutex - trackSchemaVersions bool - latestSchema map[string]*binlogdatapb.MinimalTable - isOpen bool -} - -// NewHistorian creates a new historian. It expects a schema.Engine instance -func NewHistorian(se *Engine) *HistorianSvc { - sh := HistorianSvc{se: se, lastID: 0, trackSchemaVersions: true} +type historian struct { + conns *connpool.Pool + lastID int64 + schemas []*trackedSchema + mu sync.Mutex + enabled bool + isOpen bool +} + +// newHistorian creates a new historian. It expects a schema.Engine instance +func newHistorian(enabled bool, conns *connpool.Pool) *historian { + sh := historian{ + conns: conns, + lastID: 0, + enabled: enabled, + } return &sh } -// SetTrackSchemaVersions can be used to turn on/off the use of the schema_version history in the historian -// Only used for testing -func (h *HistorianSvc) SetTrackSchemaVersions(val bool) { +func (h *historian) Enable(enabled bool) error { h.mu.Lock() - defer h.mu.Unlock() - h.trackSchemaVersions = val -} - -// readRow converts a row from the schema_version table to a TrackedSchema -func (h *HistorianSvc) readRow(row []sqltypes.Value) (*TrackedSchema, int64, error) { - id, _ := evalengine.ToInt64(row[0]) - pos, err := mysql.DecodePosition(string(row[1].ToBytes())) - if err != nil { - return nil, 0, err - } - ddl := string(row[2].ToBytes()) - timeUpdated, err := evalengine.ToInt64(row[3]) - if err != nil { - return nil, 0, err - } - sch := &binlogdatapb.MinimalSchema{} - if err := proto.Unmarshal(row[4].ToBytes(), sch); err != nil { - return nil, 0, err - } - log.V(vl).Infof("Read tracked schema from db: id %d, pos %v, ddl %s, schema len %d, time_updated %d \n", - id, mysql.EncodePosition(pos), ddl, len(sch.Tables), timeUpdated) - - tables := map[string]*binlogdatapb.MinimalTable{} - for _, t := range sch.Tables { - tables[t.Name] = t - } - trackedSchema := &TrackedSchema{ - schema: tables, - pos: pos, - ddl: ddl, - } - return trackedSchema, id, nil -} - -// loadFromDB loads all rows from the schema_version table that the historian does not have as yet -// caller should have locked h.mu -func (h *HistorianSvc) loadFromDB(ctx context.Context) error { - conn, err := h.se.GetConnection(ctx) - if err != nil { - return err - } - defer conn.Recycle() - tableData, err := conn.Exec(ctx, fmt.Sprintf(getSchemaVersions, h.lastID), 10000, true) - if err != nil { - log.Infof("Error reading schema_tracking table %v, will operate with the latest available schema", err) - return nil + h.enabled = enabled + h.mu.Unlock() + if enabled { + return h.Open() } - for _, row := range tableData.Rows { - trackedSchema, id, err := h.readRow(row) - if err != nil { - return err - } - h.schemas = append(h.schemas, trackedSchema) - h.lastID = id - } - h.sortSchemas() + h.Close() return nil } // Open opens the underlying schema Engine. Called directly by a user purely interested in schema.Engine functionality -func (h *HistorianSvc) Open() error { +func (h *historian) Open() error { h.mu.Lock() defer h.mu.Unlock() - if h.isOpen { + if !h.enabled { + log.Info("Historian is not enabled.") return nil } - if err := h.se.Open(); err != nil { - return err + if h.isOpen { + return nil } + ctx := tabletenv.LocalContext() - h.reload() if err := h.loadFromDB(ctx); err != nil { return err } - h.se.RegisterNotifier("historian", h.schemaChanged) + log.Info("Historian enabled.") h.isOpen = true return nil } // Close closes the underlying schema engine and empties the version cache -func (h *HistorianSvc) Close() { +func (h *historian) Close() { h.mu.Lock() defer h.mu.Unlock() - if !h.isOpen { return } + + log.Info("Historian closed.") h.schemas = nil - h.se.UnregisterNotifier("historian") - h.se.Close() h.isOpen = false } -// convert from schema table representation to minimal tables and store as latestSchema -func (h *HistorianSvc) storeLatest(tables map[string]*Table) { - minTables := make(map[string]*binlogdatapb.MinimalTable) - for _, t := range tables { - table := &binlogdatapb.MinimalTable{ - Name: t.Name.String(), - Fields: t.Fields, - } - var pkc []int64 - for _, pk := range t.PKColumns { - pkc = append(pkc, int64(pk)) - } - table.PKColumns = pkc - minTables[table.Name] = table - } - h.latestSchema = minTables -} - -// reload gets the latest schema and replaces the latest copy of the schema maintained by the historian -// caller should lock h.mu -func (h *HistorianSvc) reload() { - h.storeLatest(h.se.tables) -} - -// schema notifier callback -func (h *HistorianSvc) schemaChanged(tables map[string]*Table, _, _, _ []string) { - if !h.isOpen { - return - } +// RegisterVersionEvent is called by the vstream when it encounters a version event (an insert into _vt.schema_tracking) +// It triggers the historian to load the newer rows from the database to update its cache +func (h *historian) RegisterVersionEvent() error { h.mu.Lock() defer h.mu.Unlock() - h.storeLatest(tables) + if !h.isOpen { + return nil + } + ctx := tabletenv.LocalContext() + if err := h.loadFromDB(ctx); err != nil { + return err + } + return nil } // GetTableForPos returns a best-effort schema for a specific gtid -func (h *HistorianSvc) GetTableForPos(tableName sqlparser.TableIdent, gtid string) *binlogdatapb.MinimalTable { +func (h *historian) GetTableForPos(tableName sqlparser.TableIdent, gtid string) (*binlogdatapb.MinimalTable, error) { h.mu.Lock() defer h.mu.Unlock() + if !h.isOpen { + return nil, nil + } log.V(2).Infof("GetTableForPos called for %s with pos %s", tableName, gtid) - if gtid != "" { - pos, err := mysql.DecodePosition(gtid) + if gtid == "" { + return nil, nil + } + pos, err := mysql.DecodePosition(gtid) + if err != nil { + return nil, err + } + var t *binlogdatapb.MinimalTable + if len(h.schemas) > 0 { + t = h.getTableFromHistoryForPos(tableName, pos) + } + if t != nil { + log.V(2).Infof("Returning table %s from history for pos %s, schema %s", tableName, gtid, t) + } + return t, nil +} + +// loadFromDB loads all rows from the schema_version table that the historian does not have as yet +// caller should have locked h.mu +func (h *historian) loadFromDB(ctx context.Context) error { + conn, err := h.conns.Get(ctx) + if err != nil { + return err + } + defer conn.Recycle() + tableData, err := conn.Exec(ctx, fmt.Sprintf(getSchemaVersions, h.lastID), 10000, true) + if err != nil { + log.Infof("Error reading schema_tracking table %v, will operate with the latest available schema", err) + return nil + } + for _, row := range tableData.Rows { + trackedSchema, id, err := h.readRow(row) if err != nil { - log.Errorf("Error decoding position for %s: %v", gtid, err) - return nil - } - var t *binlogdatapb.MinimalTable - if h.trackSchemaVersions && len(h.schemas) > 0 { - t = h.getTableFromHistoryForPos(tableName, pos) - } - if t != nil { - log.V(2).Infof("Returning table %s from history for pos %s, schema %s", tableName, gtid, t) - return t + return err } + h.schemas = append(h.schemas, trackedSchema) + h.lastID = id } - if h.latestSchema == nil || h.latestSchema[tableName.String()] == nil { - h.reload() - if h.latestSchema == nil { - return nil - } + h.sortSchemas() + return nil +} + +// readRow converts a row from the schema_version table to a trackedSchema +func (h *historian) readRow(row []sqltypes.Value) (*trackedSchema, int64, error) { + id, _ := evalengine.ToInt64(row[0]) + pos, err := mysql.DecodePosition(string(row[1].ToBytes())) + if err != nil { + return nil, 0, err + } + ddl := string(row[2].ToBytes()) + timeUpdated, err := evalengine.ToInt64(row[3]) + if err != nil { + return nil, 0, err } - log.V(2).Infof("Returning table %s from latest schema for pos %s, schema %s", tableName, gtid, h.latestSchema[tableName.String()]) - return h.latestSchema[tableName.String()] + sch := &binlogdatapb.MinimalSchema{} + if err := proto.Unmarshal(row[4].ToBytes(), sch); err != nil { + return nil, 0, err + } + log.V(vl).Infof("Read tracked schema from db: id %d, pos %v, ddl %s, schema len %d, time_updated %d \n", + id, mysql.EncodePosition(pos), ddl, len(sch.Tables), timeUpdated) + + tables := map[string]*binlogdatapb.MinimalTable{} + for _, t := range sch.Tables { + tables[t.Name] = t + } + tSchema := &trackedSchema{ + schema: tables, + pos: pos, + ddl: ddl, + } + return tSchema, id, nil } // sortSchemas sorts entries in ascending order of gtid, ex: 40,44,48 -func (h *HistorianSvc) sortSchemas() { +func (h *historian) sortSchemas() { sort.Slice(h.schemas, func(i int, j int) bool { return h.schemas[j].pos.AtLeast(h.schemas[i].pos) }) } // getTableFromHistoryForPos looks in the cache for a schema for a specific gtid -func (h *HistorianSvc) getTableFromHistoryForPos(tableName sqlparser.TableIdent, pos mysql.Position) *binlogdatapb.MinimalTable { +func (h *historian) getTableFromHistoryForPos(tableName sqlparser.TableIdent, pos mysql.Position) *binlogdatapb.MinimalTable { idx := sort.Search(len(h.schemas), func(i int) bool { return pos.Equal(h.schemas[i].pos) || !pos.AtLeast(h.schemas[i].pos) }) @@ -261,18 +233,3 @@ func (h *HistorianSvc) getTableFromHistoryForPos(tableName sqlparser.TableIdent, //not an exact match, so based on our sort algo idx is one less than found: from 40,44,48 : 43 < 44 but we want 40 return h.schemas[idx-1].schema[tableName.String()] } - -// RegisterVersionEvent is called by the vstream when it encounters a version event (an insert into _vt.schema_tracking) -// It triggers the historian to load the newer rows from the database to update its cache -func (h *HistorianSvc) RegisterVersionEvent() error { - h.mu.Lock() - defer h.mu.Unlock() - if !h.trackSchemaVersions { - return nil - } - ctx := tabletenv.LocalContext() - if err := h.loadFromDB(ctx); err != nil { - return err - } - return nil -} diff --git a/go/vt/vttablet/tabletserver/schema/historian_test.go b/go/vt/vttablet/tabletserver/schema/historian_test.go index ddddbe1a621..643b5397a8f 100644 --- a/go/vt/vttablet/tabletserver/schema/historian_test.go +++ b/go/vt/vttablet/tabletserver/schema/historian_test.go @@ -72,20 +72,22 @@ func getDbSchemaBlob(t *testing.T, tables map[string]*binlogdatapb.MinimalTable) func TestHistorian(t *testing.T) { se, db, cancel := getTestSchemaEngine(t) defer cancel() - h := NewHistorian(se) - h.Open() - h.SetTrackSchemaVersions(false) - require.Nil(t, h.RegisterVersionEvent()) + se.EnableHistorian(false) + require.Nil(t, se.RegisterVersionEvent()) gtidPrefix := "MySQL56/7b04699f-f5e9-11e9-bf88-9cb6d089e1c3:" gtid1 := gtidPrefix + "1-10" ddl1 := "create table tracker_test (id int)" ts1 := int64(1427325876) _, _, _ = ddl1, ts1, db - require.Nil(t, h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1)) - require.Equal(t, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("dual"), gtid1)), `name:"dual" `) - h.SetTrackSchemaVersions(true) - require.Nil(t, h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1)) + _, err := se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1) + require.Equal(t, "table t1 not found in vttablet schema", err.Error()) + tab, err := se.GetTableForPos(sqlparser.NewTableIdent("dual"), gtid1) + require.NoError(t, err) + require.Equal(t, `name:"dual" `, fmt.Sprintf("%v", tab)) + se.EnableHistorian(true) + _, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1) + require.Equal(t, "table t1 not found in vttablet schema", err.Error()) var blob1 string fields := []*querypb.Field{{ @@ -115,11 +117,14 @@ func TestHistorian(t *testing.T) { {sqltypes.NewInt32(1), sqltypes.NewVarBinary(gtid1), sqltypes.NewVarBinary(ddl1), sqltypes.NewInt32(int32(ts1)), sqltypes.NewVarBinary(blob1)}, }, }) - require.Nil(t, h.RegisterVersionEvent()) + require.Nil(t, se.RegisterVersionEvent()) exp1 := `name:"t1" fields: fields: p_k_columns:0 ` - require.Equal(t, exp1, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1))) + tab, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1) + require.NoError(t, err) + require.Equal(t, exp1, fmt.Sprintf("%v", tab)) gtid2 := gtidPrefix + "1-20" - require.Nil(t, h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid2)) + _, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid2) + require.Equal(t, "table t1 not found in vttablet schema", err.Error()) table = getTable("t1", []string{"id1", "id2"}, []querypb.Type{querypb.Type_INT32, querypb.Type_VARBINARY}, []int64{0}) tables["t1"] = table @@ -132,11 +137,14 @@ func TestHistorian(t *testing.T) { {sqltypes.NewInt32(2), sqltypes.NewVarBinary(gtid2), sqltypes.NewVarBinary(ddl2), sqltypes.NewInt32(int32(ts2)), sqltypes.NewVarBinary(blob2)}, }, }) - require.Nil(t, h.RegisterVersionEvent()) + require.Nil(t, se.RegisterVersionEvent()) exp2 := `name:"t1" fields: fields: p_k_columns:0 ` - require.Equal(t, exp2, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid2))) + tab, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid2) + require.NoError(t, err) + require.Equal(t, exp2, fmt.Sprintf("%v", tab)) gtid3 := gtidPrefix + "1-30" - require.Nil(t, h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid3)) + _, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid3) + require.Equal(t, "table t1 not found in vttablet schema", err.Error()) table = getTable("t1", []string{"id1", "id2", "id3"}, []querypb.Type{querypb.Type_INT32, querypb.Type_VARBINARY, querypb.Type_INT32}, []int64{0}) tables["t1"] = table @@ -149,11 +157,19 @@ func TestHistorian(t *testing.T) { {sqltypes.NewInt32(3), sqltypes.NewVarBinary(gtid3), sqltypes.NewVarBinary(ddl3), sqltypes.NewInt32(int32(ts3)), sqltypes.NewVarBinary(blob3)}, }, }) - require.Nil(t, h.RegisterVersionEvent()) + require.Nil(t, se.RegisterVersionEvent()) exp3 := `name:"t1" fields: fields: fields: p_k_columns:0 ` - require.Equal(t, exp3, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid3))) + tab, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid3) + require.NoError(t, err) + require.Equal(t, exp3, fmt.Sprintf("%v", tab)) - require.Equal(t, exp1, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1))) - require.Equal(t, exp2, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid2))) - require.Equal(t, exp3, fmt.Sprintf("%v", h.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid3))) + tab, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid1) + require.NoError(t, err) + require.Equal(t, exp1, fmt.Sprintf("%v", tab)) + tab, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid2) + require.NoError(t, err) + require.Equal(t, exp2, fmt.Sprintf("%v", tab)) + tab, err = se.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid3) + require.NoError(t, err) + require.Equal(t, exp3, fmt.Sprintf("%v", tab)) } diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 4b57d210d63..1702816b8e5 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -103,6 +103,19 @@ func (tr *Tracker) Close() { tr.wg.Wait() } +// Enable forces tracking to be on or off. +// Only used for testing. +func (tr *Tracker) Enable(enabled bool) { + tr.mu.Lock() + tr.enabled = enabled + tr.mu.Unlock() + if enabled { + tr.Open() + } else { + tr.Close() + } +} + func (tr *Tracker) process(ctx context.Context) { defer tr.env.LogError() defer tr.wg.Done() @@ -151,17 +164,8 @@ func (tr *Tracker) schemaUpdated(gtid string, ddl string, timestamp int64) error dbSchema := &binlogdatapb.MinimalSchema{ Tables: []*binlogdatapb.MinimalTable{}, } - for name, table := range tables { - tr := &binlogdatapb.MinimalTable{ - Name: name, - Fields: table.Fields, - } - pks := make([]int64, 0) - for _, pk := range table.PKColumns { - pks = append(pks, int64(pk)) - } - tr.PKColumns = pks - dbSchema.Tables = append(dbSchema.Tables, tr) + for _, table := range tables { + dbSchema.Tables = append(dbSchema.Tables, newMinimalTable(table)) } blob, _ := proto.Marshal(dbSchema) @@ -185,6 +189,19 @@ func (tr *Tracker) schemaUpdated(gtid string, ddl string, timestamp int64) error return nil } +func newMinimalTable(st *Table) *binlogdatapb.MinimalTable { + table := &binlogdatapb.MinimalTable{ + Name: st.Name.String(), + Fields: st.Fields, + } + var pkc []int64 + for _, pk := range st.PKColumns { + pkc = append(pkc, int64(pk)) + } + table.PKColumns = pkc + return table +} + func encodeString(in string) string { buf := bytes.NewBuffer(nil) sqltypes.NewVarChar(in).EncodeSQL(buf) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 9e2b0f1ca3e..7b0344c8999 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -162,7 +162,6 @@ type TabletServer struct { // The following variables should only be accessed within // the context of a startRequest-endRequest. se *schema.Engine - sh schema.Historian qe *QueryEngine te *TxEngine hw *heartbeat.Writer @@ -230,8 +229,6 @@ func NewTabletServer(name string, config *tabletenv.TabletConfig, topoServer *to alias: alias, } tsv.se = schema.NewEngine(tsv) - tsv.sh = schema.NewHistorian(tsv.se) - tsv.sh.SetTrackSchemaVersions(config.TrackSchemaVersions) tsv.qe = NewQueryEngine(tsv, tsv.se) tsv.te = NewTxEngine(tsv) tsv.txController = tsv.te @@ -239,7 +236,7 @@ func NewTabletServer(name string, config *tabletenv.TabletConfig, topoServer *to tsv.hr = heartbeat.NewReader(tsv) tsv.txThrottler = txthrottler.NewTxThrottler(tsv.config, topoServer) tsOnce.Do(func() { srvTopoServer = srvtopo.NewResilientServer(topoServer, "TabletSrvTopo") }) - tsv.vstreamer = vstreamer.NewEngine(tsv, srvTopoServer, tsv.se, tsv.sh) + tsv.vstreamer = vstreamer.NewEngine(tsv, srvTopoServer, tsv.se) tsv.tracker = schema.NewTracker(tsv, tsv.vstreamer, tsv.se) tsv.watcher = NewReplicationWatcher(tsv, tsv.vstreamer, tsv.config) tsv.messager = messager.NewEngine(tsv, tsv.se, tsv.vstreamer) @@ -264,16 +261,16 @@ func NewTabletServer(name string, config *tabletenv.TabletConfig, topoServer *to return tsv } -// StartTracker starts a new replication watcher -// Only to be used for testing -func (tsv *TabletServer) StartTracker() { - tsv.tracker.Open() +// SetTracking forces tracking to be on or off. +// Only to be used for testing. +func (tsv *TabletServer) SetTracking(enabled bool) { + tsv.tracker.Enable(enabled) } -// StopTracker turns the watcher off -// Only to be used for testing -func (tsv *TabletServer) StopTracker() { - tsv.tracker.Close() +// EnableHistorian forces historian to be on or off. +// Only to be used for testing. +func (tsv *TabletServer) EnableHistorian(enabled bool) { + _ = tsv.se.EnableHistorian(enabled) } // Register prepares TabletServer for serving by calling @@ -533,8 +530,7 @@ func (tsv *TabletServer) fullStart() (err error) { } c.Close() - // sh opens and closes se - if err := tsv.sh.Open(); err != nil { + if err := tsv.se.Open(); err != nil { log.Errorf("Could not load historian, but starting the query service anyways: %v", err) } if err := tsv.qe.Open(); err != nil { @@ -1936,11 +1932,6 @@ func (tsv *TabletServer) SetConsolidatorMode(mode string) { tsv.qe.consolidatorMode = mode } -// Historian returns the associated historian service -func (tsv *TabletServer) Historian() schema.Historian { - return tsv.sh -} - // queryAsString returns a readable version of query+bind variables. func queryAsString(sql string, bindVariables map[string]*querypb.BindVariable) string { buf := &bytes.Buffer{} diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 4c2d90c122f..86212ca7847 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -67,7 +67,7 @@ func (uvs *uvstreamer) catchup(ctx context.Context) error { errch := make(chan error, 1) go func() { startPos := mysql.EncodePosition(uvs.pos) - vs := newVStreamer(ctx, uvs.cp, uvs.se, uvs.sh, startPos, "", uvs.filter, uvs.getVSchema(), uvs.send2) + vs := newVStreamer(ctx, uvs.cp, uvs.se, startPos, "", uvs.filter, uvs.getVSchema(), uvs.send2) uvs.setVs(vs) errch <- vs.Stream() uvs.setVs(nil) @@ -276,7 +276,7 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { func (uvs *uvstreamer) fastForward(stopPos string) error { log.Infof("starting fastForward from %s upto pos %s", mysql.EncodePosition(uvs.pos), stopPos) uvs.stopPos, _ = mysql.DecodePosition(stopPos) - vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), "", uvs.filter, uvs.getVSchema(), uvs.send2) + vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, mysql.EncodePosition(uvs.pos), "", uvs.filter, uvs.getVSchema(), uvs.send2) uvs.setVs(vs) return vs.Stream() } diff --git a/go/vt/vttablet/tabletserver/vstreamer/engine.go b/go/vt/vttablet/tabletserver/vstreamer/engine.go index c49e5d6e5af..c8d3455827f 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/engine.go +++ b/go/vt/vttablet/tabletserver/vstreamer/engine.go @@ -64,7 +64,6 @@ type Engine struct { // The following members are initialized once at the beginning. ts srvtopo.Server se *schema.Engine - sh schema.Historian keyspace string cell string @@ -75,7 +74,7 @@ type Engine struct { // NewEngine creates a new Engine. // Initialization sequence is: NewEngine->InitDBConfig->Open. // Open and Close can be called multiple times and are idempotent. -func NewEngine(env tabletenv.Env, ts srvtopo.Server, se *schema.Engine, sh schema.Historian) *Engine { +func NewEngine(env tabletenv.Env, ts srvtopo.Server, se *schema.Engine) *Engine { vse := &Engine{ env: env, streamers: make(map[int]*uvstreamer), @@ -84,7 +83,6 @@ func NewEngine(env tabletenv.Env, ts srvtopo.Server, se *schema.Engine, sh schem lvschema: &localVSchema{vschema: &vindexes.VSchema{}}, ts: ts, se: se, - sh: sh, vschemaErrors: env.Exporter().NewCounter("VSchemaErrors", "Count of VSchema errors"), vschemaUpdates: env.Exporter().NewCounter("VSchemaUpdates", "Count of VSchema updates. Does not include errors"), } @@ -158,7 +156,7 @@ func (vse *Engine) Stream(ctx context.Context, startPos string, tablePKs []*binl if !vse.isOpen { return nil, 0, errors.New("VStreamer is not open") } - streamer := newUVStreamer(ctx, vse, vse.env.Config().DB.AppWithDB(), vse.se, vse.sh, startPos, tablePKs, filter, vse.lvschema, send) + streamer := newUVStreamer(ctx, vse, vse.env.Config().DB.AppWithDB(), vse.se, startPos, tablePKs, filter, vse.lvschema, send) idx := vse.streamIdx vse.streamers[idx] = streamer vse.streamIdx++ @@ -198,7 +196,7 @@ func (vse *Engine) StreamRows(ctx context.Context, query string, lastpk []sqltyp if !vse.isOpen { return nil, 0, errors.New("VStreamer is not open") } - rowStreamer := newRowStreamer(ctx, vse.env.Config().DB.AppWithDB(), vse.sh, query, lastpk, vse.lvschema, send) + rowStreamer := newRowStreamer(ctx, vse.env.Config().DB.AppWithDB(), vse.se, query, lastpk, vse.lvschema, send) idx := vse.streamIdx vse.rowStreamers[idx] = rowStreamer vse.streamIdx++ diff --git a/go/vt/vttablet/tabletserver/vstreamer/main_test.go b/go/vt/vttablet/tabletserver/vstreamer/main_test.go index 7dfbdea99a3..c5b0f6ac0e0 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/main_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/main_test.go @@ -17,27 +17,21 @@ limitations under the License. package vstreamer import ( - "context" "flag" "fmt" "os" "testing" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - "vitess.io/vitess/go/vt/sqlparser" - "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/dbconfigs" - "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" "vitess.io/vitess/go/vt/vttablet/tabletserver/vstreamer/testenv" ) var ( - engine *Engine - env *testenv.Env - historian schema.Historian + engine *Engine + env *testenv.Env ) func TestMain(m *testing.M) { @@ -58,9 +52,7 @@ func TestMain(m *testing.M) { // engine cannot be initialized in testenv because it introduces // circular dependencies - historian = schema.NewHistorian(env.SchemaEngine) - historian.Open() - engine = NewEngine(env.TabletEnv, env.SrvTopo, env.SchemaEngine, historian) + engine = NewEngine(env.TabletEnv, env.SrvTopo, env.SchemaEngine) engine.Open(env.KeyspaceName, env.Cells[0]) defer engine.Close() @@ -76,40 +68,7 @@ func customEngine(t *testing.T, modifier func(mysql.ConnParams) mysql.ConnParams config := env.TabletEnv.Config().Clone() config.DB = dbconfigs.NewTestDBConfigs(modified, modified, modified.DbName) - engine := NewEngine(tabletenv.NewEnv(config, "VStreamerTest"), env.SrvTopo, env.SchemaEngine, historian) + engine := NewEngine(tabletenv.NewEnv(config, "VStreamerTest"), env.SrvTopo, env.SchemaEngine) engine.Open(env.KeyspaceName, env.Cells[0]) return engine } - -type mockHistorian struct { - se *schema.Engine -} - -func (h *mockHistorian) SetTrackSchemaVersions(val bool) {} - -func (h *mockHistorian) Open() error { - return nil -} - -func (h *mockHistorian) Close() { -} - -func (h *mockHistorian) Reload(ctx context.Context) error { - return nil -} - -func newMockHistorian(se *schema.Engine) *mockHistorian { - sh := mockHistorian{se: se} - return &sh -} - -func (h *mockHistorian) GetTableForPos(tableName sqlparser.TableIdent, pos string) *binlogdatapb.MinimalTable { - return nil -} - -func (h *mockHistorian) RegisterVersionEvent() error { - numVersionEventsReceived++ - return nil -} - -var _ schema.Historian = (*mockHistorian)(nil) diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go index 366036a92c9..6c1869a5925 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go @@ -38,8 +38,8 @@ type RowStreamer interface { } // NewRowStreamer returns a RowStreamer -func NewRowStreamer(ctx context.Context, cp dbconfigs.Connector, sh *schema.HistorianSvc, query string, lastpk []sqltypes.Value, send func(*binlogdatapb.VStreamRowsResponse) error) RowStreamer { - return newRowStreamer(ctx, cp, sh, query, lastpk, &localVSchema{vschema: &vindexes.VSchema{}}, send) +func NewRowStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, query string, lastpk []sqltypes.Value, send func(*binlogdatapb.VStreamRowsResponse) error) RowStreamer { + return newRowStreamer(ctx, cp, se, query, lastpk, &localVSchema{vschema: &vindexes.VSchema{}}, send) } // rowStreamer is used for copying the existing rows of a table @@ -55,7 +55,7 @@ type rowStreamer struct { cancel func() cp dbconfigs.Connector - sh schema.Historian + se *schema.Engine query string lastpk []sqltypes.Value send func(*binlogdatapb.VStreamRowsResponse) error @@ -66,13 +66,13 @@ type rowStreamer struct { sendQuery string } -func newRowStreamer(ctx context.Context, cp dbconfigs.Connector, sh schema.Historian, query string, lastpk []sqltypes.Value, vschema *localVSchema, send func(*binlogdatapb.VStreamRowsResponse) error) *rowStreamer { +func newRowStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, query string, lastpk []sqltypes.Value, vschema *localVSchema, send func(*binlogdatapb.VStreamRowsResponse) error) *rowStreamer { ctx, cancel := context.WithCancel(ctx) return &rowStreamer{ ctx: ctx, cancel: cancel, cp: cp, - sh: sh, + se: se, query: query, lastpk: lastpk, send: send, @@ -88,7 +88,7 @@ func (rs *rowStreamer) Cancel() { func (rs *rowStreamer) Stream() error { // Ensure sh is Open. If vttablet came up in a non_serving role, // the schema engine may not have been initialized. - if err := rs.sh.Open(); err != nil { + if err := rs.se.Open(); err != nil { return err } @@ -114,9 +114,9 @@ func (rs *rowStreamer) buildPlan() error { if err != nil { return err } - st := rs.sh.GetTableForPos(fromTable, "") - if st == nil { - return fmt.Errorf("unknown table %v in schema", fromTable) + st, err := rs.se.GetTableForPos(fromTable, "") + if err != nil { + return err } ti := &Table{ Name: st.Name, diff --git a/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go b/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go index a3cb74713f6..2336641132d 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go +++ b/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go @@ -102,6 +102,9 @@ func Init() (*Env, error) { te.Mysqld = mysqlctl.NewMysqld(te.Dbcfgs) te.SchemaEngine = schema.NewEngine(te.TabletEnv) te.SchemaEngine.InitDBConfig(te.Dbcfgs.DbaWithDB()) + if err := te.SchemaEngine.Open(); err != nil { + return nil, err + } // The first vschema should not be empty. Leads to Node not found error. // TODO(sougou): need to fix the bug. diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 9450189f777..09ca08fd263 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -53,7 +53,6 @@ type uvstreamer struct { send func([]*binlogdatapb.VEvent) error cp dbconfigs.Connector se *schema.Engine - sh schema.Historian startPos string filter *binlogdatapb.Filter inTablePKs []*binlogdatapb.TableLastPK @@ -89,7 +88,7 @@ type uvstreamerConfig struct { CatchupRetryTime time.Duration } -func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se *schema.Engine, sh schema.Historian, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, vschema *localVSchema, send func([]*binlogdatapb.VEvent) error) *uvstreamer { +func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se *schema.Engine, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, vschema *localVSchema, send func([]*binlogdatapb.VEvent) error) *uvstreamer { ctx, cancel := context.WithCancel(ctx) config := &uvstreamerConfig{ MaxReplicationLag: 1 * time.Nanosecond, @@ -102,7 +101,6 @@ func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se send: send, cp: cp, se: se, - sh: sh, startPos: startPos, filter: filter, vschema: vschema, @@ -119,15 +117,11 @@ func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se // the first time, with just the filter and an empty pos // during a restart, with both the filter and list of TableLastPK from the vgtid func (uvs *uvstreamer) buildTablePlan() error { - uvs.plans = make(map[string]*tablePlan) tableLastPKs := make(map[string]*binlogdatapb.TableLastPK) for _, tablePK := range uvs.inTablePKs { tableLastPKs[tablePK.TableName] = tablePK } - if err := uvs.se.Reload(uvs.ctx); err != nil { - return err - } tables := uvs.se.GetSchema() for range tables { for _, rule := range uvs.filter.Rules { @@ -368,7 +362,7 @@ func (uvs *uvstreamer) Stream() error { } uvs.sendTestEvent("Copy Done") } - vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, uvs.sh, mysql.EncodePosition(uvs.pos), mysql.EncodePosition(uvs.stopPos), uvs.filter, uvs.getVSchema(), uvs.send) + vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, mysql.EncodePosition(uvs.pos), mysql.EncodePosition(uvs.stopPos), uvs.filter, uvs.getVSchema(), uvs.send) uvs.setVs(vs) return vs.Stream() diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go index c65a1c3a6f5..bb8699e13e2 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go @@ -97,6 +97,7 @@ func TestVStreamCopyFilterValidations(t *testing.T) { "create table t2a(id21 int, id22 int, primary key(id21))", "create table t2b(id21 int, id22 int, primary key(id21))", }) + engine.se.Reload(context.Background()) var getUVStreamer = func(filter *binlogdatapb.Filter, tablePKs []*binlogdatapb.TableLastPK) *uvstreamer { uvs := &uvstreamer{ @@ -106,7 +107,6 @@ func TestVStreamCopyFilterValidations(t *testing.T) { send: nil, cp: dbconfigs.Connector{}, se: engine.se, - sh: engine.sh, startPos: "", filter: filter, vschema: nil, diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index ee298b8ff34..cb5626199c6 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -60,7 +60,6 @@ type vstreamer struct { cp dbconfigs.Connector se *schema.Engine - sh schema.Historian startPos string filter *binlogdatapb.Filter send func([]*binlogdatapb.VEvent) error @@ -106,7 +105,7 @@ type streamerPlan struct { // Other constructs like joins, group by, etc. are not supported. // vschema: the current vschema. This value can later be changed through the SetVSchema method. // send: callback function to send events. -func newVStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, sh schema.Historian, startPos string, stopPos string, filter *binlogdatapb.Filter, vschema *localVSchema, send func([]*binlogdatapb.VEvent) error) *vstreamer { +func newVStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, startPos string, stopPos string, filter *binlogdatapb.Filter, vschema *localVSchema, send func([]*binlogdatapb.VEvent) error) *vstreamer { ctx, cancel := context.WithCancel(ctx) //init copy state return &vstreamer{ @@ -114,7 +113,6 @@ func newVStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine cancel: cancel, cp: cp, se: se, - sh: sh, startPos: startPos, stopPos: stopPos, filter: filter, @@ -156,9 +154,9 @@ func (vs *vstreamer) Stream() error { // Stream streams binlog events. func (vs *vstreamer) replicate(ctx context.Context) error { - // Ensure sh is Open. If vttablet came up in a non_serving role, - // the historian may not have been initialized. - if err := vs.sh.Open(); err != nil { + // Ensure se is Open. If vttablet came up in a non_serving role, + // the schema engine may not have been initialized. + if err := vs.se.Open(); err != nil { return wrapError(err, vs.pos) } @@ -504,7 +502,7 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e if id == vs.journalTableID { vevents, err = vs.processJournalEvent(vevents, plan, rows) } else if id == vs.versionTableID { - vs.sh.RegisterVersionEvent() + vs.se.RegisterVersionEvent() vevent := &binlogdatapb.VEvent{ Type: binlogdatapb.VEventType_VERSION, } @@ -634,8 +632,8 @@ func (vs *vstreamer) buildTableColumns(tm *mysql.TableMap) ([]*querypb.Field, er }) } - st := vs.sh.GetTableForPos(sqlparser.NewTableIdent(tm.Name), mysql.EncodePosition(vs.pos)) - if st == nil { + st, err := vs.se.GetTableForPos(sqlparser.NewTableIdent(tm.Name), mysql.EncodePosition(vs.pos)) + if err != nil { if vs.filter.FieldEventMode == binlogdatapb.Filter_ERR_ON_MISMATCH { return nil, fmt.Errorf("unknown table %v in schema", tm.Name) } diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go index d7c0d57aed6..ab8431d2748 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go @@ -17,6 +17,7 @@ limitations under the License. package vstreamer import ( + "bytes" "context" "fmt" "io" @@ -26,8 +27,11 @@ import ( "testing" "time" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/sqlparser" + "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" @@ -39,8 +43,6 @@ type testcase struct { output [][]string } -var numVersionEventsReceived int - func TestVersion(t *testing.T) { if testing.Short() { t.Skip() @@ -51,8 +53,11 @@ func TestVersion(t *testing.T) { engine = oldEngine }() - mh := newMockHistorian(env.SchemaEngine) - engine = NewEngine(engine.env, env.SrvTopo, env.SchemaEngine, mh) + err := env.SchemaEngine.EnableHistorian(true) + require.NoError(t, err) + defer env.SchemaEngine.EnableHistorian(false) + + engine = NewEngine(engine.env, env.SrvTopo, env.SchemaEngine) engine.Open(env.KeyspaceName, env.Cells[0]) defer engine.Close() @@ -62,10 +67,17 @@ func TestVersion(t *testing.T) { defer execStatements(t, []string{ "drop table _vt.schema_version", }) + dbSchema := &binlogdatapb.MinimalSchema{ + Tables: []*binlogdatapb.MinimalTable{{ + Name: "t1", + }}, + } + blob, _ := proto.Marshal(dbSchema) engine.se.Reload(context.Background()) + gtid := "MariaDB/0-41983-20" testcases := []testcase{{ input: []string{ - fmt.Sprintf("insert into _vt.schema_version values(1, 'MariaDB/0-41983-20', 123, 'create table t1', 'abc')"), + fmt.Sprintf("insert into _vt.schema_version values(1, '%s', 123, 'create table t1', %v)", gtid, encodeString(string(blob))), }, // External table events don't get sent. output: [][]string{{ @@ -75,7 +87,9 @@ func TestVersion(t *testing.T) { `commit`}}, }} runCases(t, nil, testcases, "", nil) - assert.Equal(t, 1, numVersionEventsReceived) + mt, err := env.SchemaEngine.GetTableForPos(sqlparser.NewTableIdent("t1"), gtid) + require.NoError(t, err) + assert.True(t, proto.Equal(mt, dbSchema.Tables[0])) } func insertLotsOfData(t *testing.T, numRows int) { @@ -1734,3 +1748,9 @@ func setVSchema(t *testing.T, vschema string) { t.Error("vschema did not get updated") } } + +func encodeString(in string) string { + buf := bytes.NewBuffer(nil) + sqltypes.NewVarChar(in).EncodeSQL(buf) + return buf.String() +} From 6cd851ccff42a41d79b89b97fb598e99ffd63543 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 20 Jun 2020 14:59:55 -0700 Subject: [PATCH 075/430] withddl: new package for managing ddls withddl allows you to fix schema as it evolves over the versions. Signed-off-by: Sugu Sougoumarane --- go/vt/withddl/withddl.go | 142 +++++++++++++++++ go/vt/withddl/withddl_test.go | 284 ++++++++++++++++++++++++++++++++++ 2 files changed, 426 insertions(+) create mode 100644 go/vt/withddl/withddl.go create mode 100644 go/vt/withddl/withddl_test.go diff --git a/go/vt/withddl/withddl.go b/go/vt/withddl/withddl.go new file mode 100644 index 00000000000..9cfb3c3329d --- /dev/null +++ b/go/vt/withddl/withddl.go @@ -0,0 +1,142 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package withddl allows you to automatically ensure +// the tables against which you want to apply statements +// are up-to-date. +package withddl + +import ( + "context" + "fmt" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/log" +) + +// WithDDL allows you to execute statements against +// tables whose schema may not be up-to-date. If the tables +// don't exist or result in a schema error, it can apply a series +// of idempotent DDLs that will create or bring the tables +// to the desired state and retry. +type WithDDL struct { + ddls []string +} + +// New creates a new WithDDL. +func New(ddls []string) *WithDDL { + return &WithDDL{ + ddls: ddls, + } +} + +// Exec executes the query using the supplied function. +// If there are any schema errors, it applies the DDLs and retries. +// Funcs can be any of these types: +// func(query string) (*sqltypes.Result, error) +// func(query string, maxrows int) (*sqltypes.Result, error) +// func(query string, maxrows int, wantfields bool) (*sqltypes.Result, error) +// func(ctx context.Context, query string, maxrows int, wantfields bool) (*sqltypes.Result, error) +func (wd *WithDDL) Exec(ctx context.Context, query string, f interface{}) (*sqltypes.Result, error) { + exec, err := wd.unify(ctx, f) + if err != nil { + return nil, err + } + qr, err := exec(query) + if err == nil { + return qr, nil + } + if !wd.isSchemaError(err) { + return nil, err + } + + log.Info("Updating schema for %v and retrying: %v", query, err) + for _, query := range wd.ddls { + _, merr := exec(query) + if merr == nil { + continue + } + if wd.isSchemaApplyError(merr) { + continue + } + log.Warningf("DDL apply %v failed: %v", query, merr) + // Return the original error. + return nil, err + } + return exec(query) +} + +// ExecIgnore executes the query using the supplied function. +// If there are any schema errors, it returns an empty result. +func (wd *WithDDL) ExecIgnore(ctx context.Context, query string, f interface{}) (*sqltypes.Result, error) { + exec, err := wd.unify(ctx, f) + if err != nil { + return nil, err + } + qr, err := exec(query) + if err == nil { + return qr, nil + } + if !wd.isSchemaError(err) { + return nil, err + } + return &sqltypes.Result{}, nil +} + +func (wd *WithDDL) unify(ctx context.Context, f interface{}) (func(query string) (*sqltypes.Result, error), error) { + switch f := f.(type) { + case func(query string) (*sqltypes.Result, error): + return f, nil + case func(query string, maxrows int) (*sqltypes.Result, error): + return func(query string) (*sqltypes.Result, error) { + return f(query, 10000) + }, nil + case func(query string, maxrows int, wantfields bool) (*sqltypes.Result, error): + return func(query string) (*sqltypes.Result, error) { + return f(query, 10000, true) + }, nil + case func(ctx context.Context, query string, maxrows int, wantfields bool) (*sqltypes.Result, error): + return func(query string) (*sqltypes.Result, error) { + return f(ctx, query, 10000, true) + }, nil + } + return nil, fmt.Errorf("BUG: supplied function does not match expected signatures") +} + +func (wd *WithDDL) isSchemaError(err error) bool { + merr, isSQLErr := err.(*mysql.SQLError) + if !isSQLErr { + return false + } + switch merr.Num { + case mysql.ERNoSuchTable, mysql.ERBadDb, mysql.ERWrongValueCountOnRow, mysql.ERBadFieldError: + return true + } + return false +} + +func (wd *WithDDL) isSchemaApplyError(err error) bool { + merr, isSQLErr := err.(*mysql.SQLError) + if !isSQLErr { + return false + } + switch merr.Num { + case mysql.ERTableExists, mysql.ERDupFieldName: + return true + } + return false +} diff --git a/go/vt/withddl/withddl_test.go b/go/vt/withddl/withddl_test.go new file mode 100644 index 00000000000..b9151e88ab1 --- /dev/null +++ b/go/vt/withddl/withddl_test.go @@ -0,0 +1,284 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package withddl + +import ( + "context" + "flag" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" + vttestpb "vitess.io/vitess/go/vt/proto/vttest" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + "vitess.io/vitess/go/vt/vttest" +) + +var connParams mysql.ConnParams + +func TestExec(t *testing.T) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &connParams) + require.NoError(t, err) + defer conn.Close() + _, err = conn.ExecuteFetch("create database t", 10000, true) + require.NoError(t, err) + defer conn.ExecuteFetch("drop database t", 10000, true) + + testcases := []struct { + name string + ddls []string + init []string + query string + qr *sqltypes.Result + err string + cleanup []string + }{{ + name: "TableExists", + ddls: []string{ + "invalid sql", + }, + init: []string{ + "create table a(id int, primary key(id))", + }, + query: "insert into a values(1)", + qr: &sqltypes.Result{RowsAffected: 1}, + cleanup: []string{ + "drop table a", + }, + }, { + name: "TableDoesNotExist", + ddls: []string{ + "create table if not exists a(id int, primary key(id))", + }, + query: "insert into a values(1)", + qr: &sqltypes.Result{RowsAffected: 1}, + cleanup: []string{ + "drop table a", + }, + }, { + name: "TableMismatch", + ddls: []string{ + "create table if not exists a(id int, val int, primary key(id))", + }, + init: []string{ + "create table a(id int, primary key(id))", + }, + query: "insert into a values(1, 2)", + err: "Column count doesn't match value", + cleanup: []string{ + "drop table a", + }, + }, { + name: "TableMustBeAltered", + ddls: []string{ + "create table if not exists a(id int, primary key(id))", + "alter table a add column val int", + }, + init: []string{ + "create table a(id int, primary key(id))", + }, + query: "insert into a values(1, 2)", + qr: &sqltypes.Result{RowsAffected: 1}, + cleanup: []string{ + "drop table a", + }, + }, { + name: "NonidempotentDDL", + ddls: []string{ + "create table a(id int, primary key(id))", + "alter table a add column val int", + }, + init: []string{ + "create table a(id int, primary key(id))", + }, + query: "insert into a values(1, 2)", + qr: &sqltypes.Result{RowsAffected: 1}, + cleanup: []string{ + "drop table a", + }, + }, { + name: "DupFieldInDDL", + ddls: []string{ + // error for adding v1 should be ignored. + "alter table a add column v1 int", + "alter table a add column v2 int", + }, + init: []string{ + "create table a(id int, v1 int, primary key(id))", + }, + query: "insert into a values(1, 2, 3)", + qr: &sqltypes.Result{RowsAffected: 1}, + cleanup: []string{ + "drop table a", + }, + }, { + name: "NonSchemaError", + ddls: []string{ + "invalid sql", + }, + query: "syntax error", + err: "error in your SQL syntax", + }, { + name: "BadDDL", + ddls: []string{ + "invalid sql", + }, + query: "insert into a values(1)", + err: "doesn't exist", + }} + + withdb := connParams + withdb.DbName = "t" + execconn, err := mysql.Connect(ctx, &withdb) + require.NoError(t, err) + defer execconn.Close() + + funcs := []struct { + name string + f interface{} + }{{ + name: "f1", + f: func(query string) (*sqltypes.Result, error) { + return execconn.ExecuteFetch(query, 10000, true) + }, + }, { + name: "f2", + f: func(query string, maxrows int) (*sqltypes.Result, error) { + return execconn.ExecuteFetch(query, maxrows, true) + }, + }, { + name: "f3", + f: execconn.ExecuteFetch, + }, { + name: "f4", + f: func(ctx context.Context, query string, maxrows int, wantfields bool) (*sqltypes.Result, error) { + return execconn.ExecuteFetch(query, maxrows, wantfields) + }, + }} + + for _, test := range testcases { + for _, fun := range funcs { + t.Run(fmt.Sprintf("%v-%v", test.name, fun.name), func(t *testing.T) { + for _, query := range test.init { + _, err = execconn.ExecuteFetch(query, 10000, true) + require.NoError(t, err) + } + + wd := New(test.ddls) + qr, err := wd.Exec(ctx, test.query, fun.f) + checkResult(t, test.qr, test.err, qr, err) + + for _, query := range test.cleanup { + _, err = execconn.ExecuteFetch(query, 10000, true) + require.NoError(t, err) + } + }) + } + } +} + +func TestExecIgnore(t *testing.T) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &connParams) + require.NoError(t, err) + defer conn.Close() + _, err = conn.ExecuteFetch("create database t", 10000, true) + require.NoError(t, err) + defer conn.ExecuteFetch("drop database t", 10000, true) + + withdb := connParams + withdb.DbName = "t" + execconn, err := mysql.Connect(ctx, &withdb) + require.NoError(t, err) + defer execconn.Close() + + wd := New([]string{}) + qr, err := wd.ExecIgnore(ctx, "select * from a", execconn.ExecuteFetch) + require.NoError(t, err) + assert.Equal(t, &sqltypes.Result{}, qr) + + _, err = wd.ExecIgnore(ctx, "syntax error", execconn.ExecuteFetch) + // This should fail. + assert.Error(t, err) + + _, _ = execconn.ExecuteFetch("create table a(id int, primary key(id))", 10000, false) + defer execconn.ExecuteFetch("drop table a", 10000, false) + _, _ = execconn.ExecuteFetch("insert into a values(1)", 10000, false) + qr, err = wd.ExecIgnore(ctx, "select * from a", execconn.ExecuteFetch) + require.NoError(t, err) + assert.Equal(t, 1, len(qr.Rows)) +} + +func checkResult(t *testing.T, wantqr *sqltypes.Result, wanterr string, qr *sqltypes.Result, err error) { + t.Helper() + + assert.Equal(t, wantqr, qr) + var goterr string + if err != nil { + goterr = err.Error() + } + if wanterr == "" { + assert.Equal(t, "", goterr) + } + assert.Contains(t, goterr, wanterr) +} + +func TestMain(m *testing.M) { + flag.Parse() // Do not remove this comment, import into google3 depends on it + tabletenv.Init() + + exitCode := func() int { + // Launch MySQL. + // We need a Keyspace in the topology, so the DbName is set. + // We need a Shard too, so the database 'vttest' is created. + cfg := vttest.Config{ + Topology: &vttestpb.VTTestTopology{ + Keyspaces: []*vttestpb.Keyspace{ + { + Name: "vttest", + Shards: []*vttestpb.Shard{ + { + Name: "0", + DbNameOverride: "vttest", + }, + }, + }, + }, + }, + OnlyMySQL: true, + } + defer os.RemoveAll(cfg.SchemaDir) + cluster := vttest.LocalCluster{ + Config: cfg, + } + if err := cluster.Setup(); err != nil { + fmt.Fprintf(os.Stderr, "could not launch mysql: %v\n", err) + return 1 + } + defer cluster.TearDown() + + connParams = cluster.MySQLConnParams() + + return m.Run() + }() + os.Exit(exitCode) +} From 38ebc07ffc6d145c29b38ccbbe53561e0b249d99 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 20 Jun 2020 17:17:05 -0700 Subject: [PATCH 076/430] tabletserver: use withDDL Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/endtoend/vstreamer_test.go | 18 ---- .../tabletmanager/vreplication/engine.go | 94 +++++-------------- .../tabletmanager/vreplication/engine_test.go | 21 +++-- .../tabletmanager/vreplication/vreplicator.go | 18 +--- go/vt/vttablet/tabletserver/schema/tracker.go | 11 +-- 5 files changed, 41 insertions(+), 121 deletions(-) diff --git a/go/vt/vttablet/endtoend/vstreamer_test.go b/go/vt/vttablet/endtoend/vstreamer_test.go index 068b329e4a5..7c1f6e39234 100644 --- a/go/vt/vttablet/endtoend/vstreamer_test.go +++ b/go/vt/vttablet/endtoend/vstreamer_test.go @@ -72,8 +72,6 @@ func TestSchemaVersioning(t *testing.T) { `other`, `gtid`, //gtid+ddl => actual query `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `, - `gtid`, //gtid+other => insert into schema_version resulting in version+other - `other`, `version`, `gtid`, }, @@ -90,8 +88,6 @@ func TestSchemaVersioning(t *testing.T) { output: []string{ `gtid`, `type:DDL ddl:"alter table vitess_version add column id3 int" `, - `gtid`, //gtid+other => insert into schema_version resulting in version+other - `other`, `version`, `gtid`, }, @@ -107,8 +103,6 @@ func TestSchemaVersioning(t *testing.T) { output: []string{ `gtid`, `type:DDL ddl:"alter table vitess_version modify column id3 varbinary(16)" `, - `gtid`, //gtid+other => insert into schema_version resulting in version+other - `other`, `version`, `gtid`, }, @@ -206,8 +200,6 @@ func TestSchemaVersioning(t *testing.T) { output := []string{ `gtid`, `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `, - `gtid`, - `other`, `version`, `gtid`, `type:FIELD field_event: fields: > `, @@ -215,8 +207,6 @@ func TestSchemaVersioning(t *testing.T) { `gtid`, `gtid`, `type:DDL ddl:"alter table vitess_version add column id3 int" `, - `gtid`, - `other`, `version`, `gtid`, `type:FIELD field_event: fields: fields: > `, @@ -224,8 +214,6 @@ func TestSchemaVersioning(t *testing.T) { `gtid`, `gtid`, `type:DDL ddl:"alter table vitess_version modify column id3 varbinary(16)" `, - `gtid`, - `other`, `version`, `gtid`, `type:FIELD field_event: fields: fields: > `, @@ -275,8 +263,6 @@ func TestSchemaVersioning(t *testing.T) { output = []string{ `gtid`, `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `, - `gtid`, - `other`, `version`, `gtid`, `type:FIELD field_event: fields: > `, @@ -284,8 +270,6 @@ func TestSchemaVersioning(t *testing.T) { `gtid`, `gtid`, `type:DDL ddl:"alter table vitess_version add column id3 int" `, - `gtid`, - `other`, `version`, `gtid`, /*at this point we only have latest schema so we have types (int32, int32, varbinary, varbinary) so the types don't match. Hence the @ fieldnames*/ @@ -294,8 +278,6 @@ func TestSchemaVersioning(t *testing.T) { `gtid`, `gtid`, `type:DDL ddl:"alter table vitess_version modify column id3 varbinary(16)" `, - `gtid`, - `other`, `version`, `gtid`, /*at this point we only have latest schema so we have types (int32, int32, varbinary, varbinary), diff --git a/go/vt/vttablet/tabletmanager/vreplication/engine.go b/go/vt/vttablet/tabletmanager/vreplication/engine.go index 0fdee83bdbe..c0c09dd9592 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/engine.go +++ b/go/vt/vttablet/tabletmanager/vreplication/engine.go @@ -27,6 +27,7 @@ import ( "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + "vitess.io/vitess/go/vt/withddl" "golang.org/x/net/context" "vitess.io/vitess/go/mysql" @@ -58,6 +59,15 @@ const ( primary key (vrepl_id, table_name))` ) +var withDDL *withddl.WithDDL + +func init() { + allddls := append([]string{}, binlogplayer.CreateVReplicationTable()...) + allddls = append(allddls, binlogplayer.AlterVReplicationTable...) + allddls = append(allddls, createReshardingJournalTable, createCopyState) + withDDL = withddl.New(allddls) +} + var tabletTypesStr = flag.String("vreplication_tablet_type", "REPLICA", "comma separated list of tablet types used as a source") // waitRetryTime can be changed to a smaller value for tests. @@ -156,51 +166,6 @@ func (vre *Engine) Open(ctx context.Context) error { return nil } -// executeFetchMaybeCreateTable calls DBClient.ExecuteFetch and does one retry if -// there's a failure due to mysql.ERNoSuchTable or mysql.ERBadDb which can be fixed -// by re-creating the vreplication tables. -func (vre *Engine) executeFetchMaybeCreateTable(dbClient binlogplayer.DBClient, query string, maxrows int) (qr *sqltypes.Result, err error) { - qr, err = dbClient.ExecuteFetch(query, maxrows) - - if err == nil { - return - } - - // If it's a bad table or db, it could be because the vreplication tables weren't created. - // In that case we can try creating them again. - merr, isSQLErr := err.(*mysql.SQLError) - if !isSQLErr || !(merr.Num == mysql.ERNoSuchTable || merr.Num == mysql.ERBadDb || merr.Num == mysql.ERBadFieldError) { - return qr, err - } - - log.Info("Looks like the vreplication tables may not exist. Trying to recreate... ") - if merr.Num == mysql.ERNoSuchTable || merr.Num == mysql.ERBadDb { - for _, query := range binlogplayer.CreateVReplicationTable() { - if _, merr := dbClient.ExecuteFetch(query, 0); merr != nil { - log.Warningf("Failed to ensure %s exists: %v", vreplicationTableName, merr) - return nil, err - } - } - if _, merr := dbClient.ExecuteFetch(createReshardingJournalTable, 0); merr != nil { - log.Warningf("Failed to ensure %s exists: %v", reshardingJournalTableName, merr) - return nil, err - } - } - if merr.Num == mysql.ERBadFieldError { - log.Infof("Adding column to table %s", vreplicationTableName) - for _, query := range binlogplayer.AlterVReplicationTable { - if _, merr := dbClient.ExecuteFetch(query, 0); merr != nil { - merr, isSQLErr := err.(*mysql.SQLError) - if !isSQLErr || !(merr.Num == mysql.ERDupFieldName) { - log.Warningf("Failed to alter %s table: %v", vreplicationTableName, merr) - return nil, err - } - } - } - } - return dbClient.ExecuteFetch(query, maxrows) -} - func (vre *Engine) initAll() error { dbClient := vre.dbClientFactory() if err := dbClient.Connect(); err != nil { @@ -208,18 +173,8 @@ func (vre *Engine) initAll() error { } defer dbClient.Close() - rows, err := readAllRows(dbClient, vre.dbName) + rows, err := readAllRows(vre.ctx, dbClient, vre.dbName) if err != nil { - // Handle Table not found. - if merr, ok := err.(*mysql.SQLError); ok && merr.Num == mysql.ERNoSuchTable { - log.Info("_vt.vreplication table not found. Will create it later if needed") - return nil - } - // Handle missing field - if merr, ok := err.(*mysql.SQLError); ok && merr.Num == mysql.ERBadFieldError { - log.Info("_vt.vreplication table found but is missing field db_name. Will add it later if needed") - return nil - } return err } for _, row := range rows { @@ -295,13 +250,13 @@ func (vre *Engine) Exec(query string) (*sqltypes.Result, error) { // Change the database to ensure that these events don't get // replicated by another vreplication. This can happen when // we reverse replication. - if _, err := vre.executeFetchMaybeCreateTable(dbClient, "use _vt", 1); err != nil { + if _, err := withDDL.Exec(vre.ctx, "use _vt", dbClient.ExecuteFetch); err != nil { return nil, err } switch plan.opcode { case insertQuery: - qr, err := vre.executeFetchMaybeCreateTable(dbClient, plan.query, 1) + qr, err := withDDL.Exec(vre.ctx, plan.query, dbClient.ExecuteFetch) if err != nil { return nil, err } @@ -345,7 +300,7 @@ func (vre *Engine) Exec(query string) (*sqltypes.Result, error) { if err != nil { return nil, err } - qr, err := vre.executeFetchMaybeCreateTable(dbClient, query, 1) + qr, err := withDDL.Exec(vre.ctx, query, dbClient.ExecuteFetch) if err != nil { return nil, err } @@ -385,7 +340,7 @@ func (vre *Engine) Exec(query string) (*sqltypes.Result, error) { if err != nil { return nil, err } - qr, err := vre.executeFetchMaybeCreateTable(dbClient, query, 1) + qr, err := withDDL.Exec(vre.ctx, query, dbClient.ExecuteFetch) if err != nil { return nil, err } @@ -393,12 +348,9 @@ func (vre *Engine) Exec(query string) (*sqltypes.Result, error) { if err != nil { return nil, err } - if _, err := dbClient.ExecuteFetch(delQuery, 10000); err != nil { - // Legacy vreplication won't create this table. So, ignore table not found error. - merr, isSQLErr := err.(*mysql.SQLError) - if !isSQLErr || !(merr.Num == mysql.ERNoSuchTable) { - return nil, err - } + // Legacy vreplication won't create this table. So, ignore schema errors. + if _, err := withDDL.ExecIgnore(vre.ctx, delQuery, dbClient.ExecuteFetch); err != nil { + return nil, err } if err := dbClient.Commit(); err != nil { return nil, err @@ -406,7 +358,7 @@ func (vre *Engine) Exec(query string) (*sqltypes.Result, error) { return qr, nil case selectQuery, reshardingJournalQuery: // select and resharding journal queries are passed through. - return vre.executeFetchMaybeCreateTable(dbClient, plan.query, 10000) + return withDDL.Exec(vre.ctx, plan.query, dbClient.ExecuteFetch) } panic("unreachable") } @@ -565,7 +517,7 @@ func (vre *Engine) transitionJournal(je *journalEvent) { bls.Keyspace, bls.Shard = sgtid.Keyspace, sgtid.Shard ig := NewInsertGenerator(binlogplayer.BlpRunning, vre.dbName) ig.AddRow(params["workflow"], &bls, sgtid.Gtid, params["cell"], params["tablet_types"]) - qr, err := vre.executeFetchMaybeCreateTable(dbClient, ig.String(), 1) + qr, err := withDDL.Exec(vre.ctx, ig.String(), dbClient.ExecuteFetch) if err != nil { log.Errorf("transitionJournal: %v", err) return @@ -575,7 +527,7 @@ func (vre *Engine) transitionJournal(je *journalEvent) { } for _, ks := range participants { id := je.participants[ks] - _, err := vre.executeFetchMaybeCreateTable(dbClient, binlogplayer.DeleteVReplication(uint32(id)), 1) + _, err := withDDL.Exec(vre.ctx, binlogplayer.DeleteVReplication(uint32(id)), dbClient.ExecuteFetch) if err != nil { log.Errorf("transitionJournal: %v", err) return @@ -687,8 +639,8 @@ func (vre *Engine) updateStats() { } } -func readAllRows(dbClient binlogplayer.DBClient, dbName string) ([]map[string]string, error) { - qr, err := dbClient.ExecuteFetch(fmt.Sprintf("select * from _vt.vreplication where db_name=%v", encodeString(dbName)), 10000) +func readAllRows(ctx context.Context, dbClient binlogplayer.DBClient, dbName string) ([]map[string]string, error) { + qr, err := withDDL.ExecIgnore(ctx, fmt.Sprintf("select * from _vt.vreplication where db_name=%v", encodeString(dbName)), dbClient.ExecuteFetch) if err != nil { return nil, err } diff --git a/go/vt/vttablet/tabletmanager/vreplication/engine_test.go b/go/vt/vttablet/tabletmanager/vreplication/engine_test.go index feccaa71b3f..74b5acb764b 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/engine_test.go @@ -447,10 +447,16 @@ func TestCreateDBAndTable(t *testing.T) { dbNotFound := mysql.SQLError{Num: 1049, Message: "db not found"} dbClient.ExpectRequest("use _vt", &sqltypes.Result{}, &dbNotFound) - dbClient.ExpectRequest("CREATE DATABASE IF NOT EXISTS _vt", &sqltypes.Result{}, nil) - dbClient.ExpectRequest("DROP TABLE IF EXISTS _vt.blp_checkpoint", &sqltypes.Result{}, nil) - dbClient.ExpectRequestRE("CREATE TABLE IF NOT EXISTS _vt.vreplication.*", &sqltypes.Result{}, nil) - dbClient.ExpectRequestRE("create table if not exists _vt.resharding_journal.*", &sqltypes.Result{}, nil) + expectDDLs := func() { + t.Helper() + dbClient.ExpectRequest("CREATE DATABASE IF NOT EXISTS _vt", &sqltypes.Result{}, nil) + dbClient.ExpectRequest("DROP TABLE IF EXISTS _vt.blp_checkpoint", &sqltypes.Result{}, nil) + dbClient.ExpectRequestRE("CREATE TABLE IF NOT EXISTS _vt.vreplication.*", &sqltypes.Result{}, nil) + dbClient.ExpectRequestRE("ALTER TABLE _vt.vreplication ADD COLUMN db_name.*", &sqltypes.Result{}, nil) + dbClient.ExpectRequestRE("create table if not exists _vt.resharding_journal.*", &sqltypes.Result{}, nil) + dbClient.ExpectRequestRE("create table if not exists _vt.copy_state.*", &sqltypes.Result{}, nil) + } + expectDDLs() dbClient.ExpectRequest("use _vt", &sqltypes.Result{}, nil) // Non-recoverable error. @@ -460,12 +466,7 @@ func TestCreateDBAndTable(t *testing.T) { // Missing table. Statement should get retried after creating everything. dbClient.ExpectRequest("use _vt", &sqltypes.Result{}, nil) dbClient.ExpectRequest("insert into _vt.vreplication values(null)", &sqltypes.Result{}, &tableNotFound) - - dbClient.ExpectRequest("CREATE DATABASE IF NOT EXISTS _vt", &sqltypes.Result{}, nil) - dbClient.ExpectRequest("DROP TABLE IF EXISTS _vt.blp_checkpoint", &sqltypes.Result{}, nil) - dbClient.ExpectRequestRE("CREATE TABLE IF NOT EXISTS _vt.vreplication.*", &sqltypes.Result{}, nil) - dbClient.ExpectRequestRE("create table if not exists _vt.resharding_journal.*", &sqltypes.Result{}, nil) - + expectDDLs() dbClient.ExpectRequest("insert into _vt.vreplication values(null)", &sqltypes.Result{InsertID: 1}, nil) // The rest of this test is normal with no db errors or extra queries. diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index 60242eb7473..047861fb9e5 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -208,23 +208,9 @@ func (vr *vreplicator) readSettings(ctx context.Context) (settings binlogplayer. } query := fmt.Sprintf("select count(*) from _vt.copy_state where vrepl_id=%d", vr.id) - qr, err := vr.dbClient.Execute(query) + qr, err := withDDL.Exec(ctx, query, vr.dbClient.ExecuteFetch) if err != nil { - // If it's a not found error, create it. - merr, isSQLErr := err.(*mysql.SQLError) - if !isSQLErr || !(merr.Num == mysql.ERNoSuchTable || merr.Num == mysql.ERBadDb) { - return settings, numTablesToCopy, err - } - log.Info("Looks like _vt.copy_state table may not exist. Trying to create... ") - if _, merr := vr.dbClient.Execute(createCopyState); merr != nil { - log.Errorf("Failed to ensure _vt.copy_state table exists: %v", merr) - return settings, numTablesToCopy, err - } - // Redo the read. - qr, err = vr.dbClient.Execute(query) - if err != nil { - return settings, numTablesToCopy, err - } + return settings, numTablesToCopy, err } if len(qr.Rows) == 0 || len(qr.Rows[0]) == 0 { return settings, numTablesToCopy, fmt.Errorf("unexpected result from %s: %v", query, qr) diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 1702816b8e5..274eba88175 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -29,6 +29,7 @@ import ( binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + "vitess.io/vitess/go/vt/withddl" ) const createSchemaTrackingTable = `CREATE TABLE IF NOT EXISTS _vt.schema_version ( @@ -40,6 +41,8 @@ const createSchemaTrackingTable = `CREATE TABLE IF NOT EXISTS _vt.schema_version PRIMARY KEY (id) ) ENGINE=InnoDB` +var withDDL = withddl.New([]string{createSchemaTrackingTable}) + // VStreamer defines the functions of VStreamer // that the replicationWatcher needs. type VStreamer interface { @@ -174,15 +177,11 @@ func (tr *Tracker) schemaUpdated(gtid string, ddl string, timestamp int64) error return err } defer conn.Recycle() - _, err = conn.Exec(ctx, createSchemaTrackingTable, 1, false) - if err != nil { - return err - } + query := fmt.Sprintf("insert into _vt.schema_version "+ "(pos, ddl, schemax, time_updated) "+ "values (%v, %v, %v, %d)", encodeString(gtid), encodeString(ddl), encodeString(string(blob)), timestamp) - - _, err = conn.Exec(ctx, query, 1, false) + _, err = withDDL.Exec(ctx, query, conn.Exec) if err != nil { return err } From ef5f979e385e211637e1f63a78920e5d1b768ec5 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 20 Jun 2020 21:34:07 -0700 Subject: [PATCH 077/430] vttablet: follow strict Open and Close ordering Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletserver/tabletserver.go | 110 ++++++++---------- go/vt/vttablet/tabletserver/tx/api.go | 9 -- go/vt/vttablet/tabletserver/tx_engine.go | 12 +- go/vt/vttablet/tabletserver/tx_engine_test.go | 14 +-- 4 files changed, 61 insertions(+), 84 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 7b0344c8999..97fd3394eaf 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -29,8 +29,6 @@ import ( "syscall" "time" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" - "golang.org/x/net/context" "vitess.io/vitess/go/acl" "vitess.io/vitess/go/history" @@ -142,6 +140,8 @@ type TabletServer struct { QueryTimeout sync2.AtomicDuration TerseErrors bool enableHotRowProtection bool + topoServer *topo.Server + checkMySQLThrottler *sync2.Semaphore // mu is used to access state. The lock should only be held // for short periods. For longer periods, you have to transition @@ -159,27 +159,17 @@ type TabletServer struct { alsoAllow []topodatapb.TabletType requests sync.WaitGroup - // The following variables should only be accessed within - // the context of a startRequest-endRequest. - se *schema.Engine - qe *QueryEngine - te *TxEngine - hw *heartbeat.Writer - hr *heartbeat.Reader - tracker *schema.Tracker - watcher *ReplicationWatcher - vstreamer *vstreamer.Engine - messager *messager.Engine - - txController tx.EngineStateMachine - - // checkMySQLThrottler is used to throttle the number of - // requests sent to CheckMySQL. - checkMySQLThrottler *sync2.Semaphore - - // txThrottler is used to throttle transactions based on the observed replication lag. + // These are sub-components of TabletServer. + se *schema.Engine + qe *QueryEngine + te *TxEngine + hw *heartbeat.Writer + hr *heartbeat.Reader + vstreamer *vstreamer.Engine + tracker *schema.Tracker + watcher *ReplicationWatcher txThrottler *txthrottler.TxThrottler - topoServer *topo.Server + messager *messager.Engine // streamHealthMutex protects all the following fields streamHealthMutex sync.Mutex @@ -222,24 +212,30 @@ func NewTabletServer(name string, config *tabletenv.TabletConfig, topoServer *to QueryTimeout: sync2.NewAtomicDuration(time.Duration(config.Oltp.QueryTimeoutSeconds * 1e9)), TerseErrors: config.TerseErrors, enableHotRowProtection: config.HotRowProtection.Mode != tabletenv.Disable, + topoServer: topoServer, checkMySQLThrottler: sync2.NewSemaphore(1, 0), streamHealthMap: make(map[int]chan<- *querypb.StreamHealthResponse), history: history.New(10), - topoServer: topoServer, alias: alias, } + + tsOnce.Do(func() { srvTopoServer = srvtopo.NewResilientServer(topoServer, "TabletSrvTopo") }) + + // The following services should generally be opened in the order + // of initialization below, and closed in reverse order. + // However, gracefulStop is slightly different because only + // some services must be closed, while others should remain open. tsv.se = schema.NewEngine(tsv) tsv.qe = NewQueryEngine(tsv, tsv.se) tsv.te = NewTxEngine(tsv) - tsv.txController = tsv.te tsv.hw = heartbeat.NewWriter(tsv, alias) tsv.hr = heartbeat.NewReader(tsv) - tsv.txThrottler = txthrottler.NewTxThrottler(tsv.config, topoServer) - tsOnce.Do(func() { srvTopoServer = srvtopo.NewResilientServer(topoServer, "TabletSrvTopo") }) tsv.vstreamer = vstreamer.NewEngine(tsv, srvTopoServer, tsv.se) tsv.tracker = schema.NewTracker(tsv, tsv.vstreamer, tsv.se) tsv.watcher = NewReplicationWatcher(tsv, tsv.vstreamer, tsv.config) + tsv.txThrottler = txthrottler.NewTxThrottler(tsv.config, topoServer) tsv.messager = messager.NewEngine(tsv, tsv.se, tsv.vstreamer) + tsv.exporter.NewGaugeFunc("TabletState", "Tablet server state", func() int64 { tsv.mu.Lock() defer tsv.mu.Unlock() @@ -536,7 +532,7 @@ func (tsv *TabletServer) fullStart() (err error) { if err := tsv.qe.Open(); err != nil { return err } - if err := tsv.txController.Init(); err != nil { + if err := tsv.te.Init(); err != nil { return err } if err := tsv.hw.Init(tsv.target); err != nil { @@ -544,35 +540,30 @@ func (tsv *TabletServer) fullStart() (err error) { } tsv.hr.Init(tsv.target) tsv.vstreamer.Open(tsv.target.Keyspace, tsv.alias.Cell) - tsv.watcher.Open() return tsv.serveNewType() } func (tsv *TabletServer) serveNewType() (err error) { - // Wait for in-flight transactional requests to complete - // before rolling back everything. In this state new - // transactional requests are not allowed. So, we can - // be sure that the tx pool won't change after the wait. if tsv.target.TabletType == topodatapb.TabletType_MASTER { - tsv.txController.AcceptReadWrite() + tsv.watcher.Close() + tsv.hr.Close() + + tsv.te.AcceptReadWrite() + tsv.hw.Open() + tsv.tracker.Open() if err := tsv.txThrottler.Open(tsv.target.Keyspace, tsv.target.Shard); err != nil { return err } tsv.messager.Open() - tsv.hr.Close() - tsv.hw.Open() - tsv.tracker.Open() - tsv.watcher.Close() } else { - tsv.txController.AcceptReadOnly() tsv.messager.Close() - tsv.hr.Open() - tsv.hw.Close() - tsv.watcher.Open() tsv.tracker.Close() - - // Reset the sequences. + tsv.hw.Close() tsv.se.MakeNonMaster() + + tsv.te.AcceptReadOnly() + tsv.hr.Open() + tsv.watcher.Open() } tsv.transition(StateServing) return nil @@ -586,10 +577,9 @@ func (tsv *TabletServer) gracefulStop() { // StopService shuts down the tabletserver to the uninitialized state. // It first transitions to StateShuttingDown, then waits for active -// services to shut down. Then it shuts down QueryEngine. This function +// services to shut down. Then it shuts down the rest. This function // should be called before process termination, or if MySQL is unreachable. -// Under normal circumstances, SetServingType should be called, which will -// keep QueryEngine open. +// Under normal circumstances, SetServingType should be called. func (tsv *TabletServer) StopService() { defer close(tsv.setTimeBomb()) defer tsv.LogError() @@ -602,45 +592,41 @@ func (tsv *TabletServer) StopService() { tsv.setState(StateShuttingDown) tsv.mu.Unlock() - log.Infof("Executing complete shutdown.") + log.Info("Executing complete shutdown.") tsv.waitForShutdown() - tsv.watcher.Close() + tsv.tracker.Close() tsv.vstreamer.Close() + tsv.hr.Close() + tsv.hw.Close() tsv.qe.Close() tsv.se.Close() - tsv.hw.Close() - tsv.hr.Close() - log.Infof("Shutdown complete.") + log.Info("Shutdown complete.") tsv.transition(StateNotConnected) } func (tsv *TabletServer) waitForShutdown() { - // Wait till beginRequests have completed before waiting on tx pool. - // During this state, new Begins are not allowed. After the wait, - // we have the assurance that only non-begin transactional calls - // will be allowed. They will enable the conclusion of outstanding - // transactions. tsv.messager.Close() - tsv.txController.StopGently() - tsv.qe.streamQList.TerminateAll() + tsv.txThrottler.Close() tsv.watcher.Close() + tsv.te.Close() + tsv.qe.streamQList.TerminateAll() tsv.requests.Wait() - tsv.txThrottler.Close() } // closeAll is called if TabletServer fails to start. // It forcibly shuts down everything. func (tsv *TabletServer) closeAll() { tsv.messager.Close() + tsv.txThrottler.Close() tsv.watcher.Close() + tsv.tracker.Close() tsv.vstreamer.Close() tsv.hr.Close() tsv.hw.Close() - tsv.txController.StopGently() - tsv.watcher.Close() + tsv.te.Close() + tsv.qe.streamQList.TerminateAll() tsv.qe.Close() tsv.se.Close() - tsv.txThrottler.Close() tsv.transition(StateNotConnected) } diff --git a/go/vt/vttablet/tabletserver/tx/api.go b/go/vt/vttablet/tabletserver/tx/api.go index 5b98f97fba2..b11bdec7f6e 100644 --- a/go/vt/vttablet/tabletserver/tx/api.go +++ b/go/vt/vttablet/tabletserver/tx/api.go @@ -37,15 +37,6 @@ type ( //DTID as type string DTID = string - //EngineStateMachine is used to control the state the transactional engine - - //whether new connections and/or transactions are allowed or not. - EngineStateMachine interface { - Init() error - AcceptReadWrite() error - AcceptReadOnly() error - StopGently() - } - //IStatefulConnection is a connection where the user is trusted to clean things up after using the connection IStatefulConnection interface { // Executes a query on the connection diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 48edebabc3f..6ee95c29f17 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -169,7 +169,7 @@ func (te *TxEngine) AcceptReadWrite() error { case AcceptingReadOnly: // We need to restart the tx-pool to make sure we handle 2PC correctly - te.close(true) + te.shutdown(true) te.state = AcceptingReadAndWrite te.open() te.stateLock.Unlock() @@ -288,7 +288,7 @@ func (te *TxEngine) transitionTo(nextState txEngineState) error { te.stateLock.Unlock() // We do this outside the lock so others can see our state while we close up waiting transactions - te.close(true) + te.shutdown(true) te.stateLock.Lock() defer func() { @@ -346,12 +346,12 @@ func (te *TxEngine) open() { } } -// StopGently will disregard common rules for when to kill transactions +// Close will disregard common rules for when to kill transactions // and wait forever for transactions to wrap up -func (te *TxEngine) StopGently() { +func (te *TxEngine) Close() { te.stateLock.Lock() defer te.stateLock.Unlock() - te.close(false) + te.shutdown(false) te.state = NotServing } @@ -361,7 +361,7 @@ func (te *TxEngine) StopGently() { // to conclude. If a shutdown grace period was specified, // the transactions are rolled back if they're not resolved // by that time. -func (te *TxEngine) close(immediate bool) { +func (te *TxEngine) shutdown(immediate bool) { // Shut down functions are idempotent. // No need to check if 2pc is enabled. te.stopWatchdog() diff --git a/go/vt/vttablet/tabletserver/tx_engine_test.go b/go/vt/vttablet/tabletserver/tx_engine_test.go index 5f237e83666..1c899d19fef 100644 --- a/go/vt/vttablet/tabletserver/tx_engine_test.go +++ b/go/vt/vttablet/tabletserver/tx_engine_test.go @@ -50,7 +50,7 @@ func TestTxEngineClose(t *testing.T) { // Normal close. te.open() start := time.Now() - te.close(false) + te.shutdown(false) if diff := time.Since(start); diff > 500*time.Millisecond { t.Errorf("Close time: %v, must be under 0.5s", diff) } @@ -62,7 +62,7 @@ func TestTxEngineClose(t *testing.T) { require.Equal(t, "begin", beginSQL) c.Unlock() start = time.Now() - te.close(false) + te.shutdown(false) if diff := time.Since(start); diff < 500*time.Millisecond { t.Errorf("Close time: %v, must be over 0.5s", diff) } @@ -75,7 +75,7 @@ func TestTxEngineClose(t *testing.T) { } c.Unlock() start = time.Now() - te.close(true) + te.shutdown(true) if diff := time.Since(start); diff > 500*time.Millisecond { t.Errorf("Close time: %v, must be under 0.5s", diff) } @@ -89,7 +89,7 @@ func TestTxEngineClose(t *testing.T) { } c.Unlock() start = time.Now() - te.close(false) + te.shutdown(false) if diff := time.Since(start); diff > 500*time.Millisecond { t.Errorf("Close time: %v, must be under 0.5s", diff) } @@ -112,7 +112,7 @@ func TestTxEngineClose(t *testing.T) { te.txPool.RollbackAndRelease(ctx, c) }() start = time.Now() - te.close(false) + te.shutdown(false) if diff := time.Since(start); diff > 250*time.Millisecond { t.Errorf("Close time: %v, must be under 0.25s", diff) } @@ -129,7 +129,7 @@ func TestTxEngineClose(t *testing.T) { te.txPool.RollbackAndRelease(ctx, c) }() start = time.Now() - te.close(true) + te.shutdown(true) if diff := time.Since(start); diff > 250*time.Millisecond { t.Errorf("Close time: %v, must be under 0.25s", diff) } @@ -217,7 +217,7 @@ func changeState(te *TxEngine, state txEngineState) error { case AcceptingReadOnly: return te.AcceptReadOnly() case NotServing: - te.StopGently() + te.Close() return nil default: return fmt.Errorf("don't know how to do that: %v", state) From 39c176c74c3ded36a96af3681d2c7cfd3310b058 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 23 Jun 2020 12:45:02 +0530 Subject: [PATCH 078/430] moved derived_table from selSmt to subquery Signed-off-by: Harshit Gangal --- go/vt/sqlparser/parse_test.go | 14 +- go/vt/sqlparser/sql.go | 312 +++++++++++++++++----------------- go/vt/sqlparser/sql.y | 4 +- 3 files changed, 163 insertions(+), 167 deletions(-) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index cbf2facf9d1..7e75b32e5bf 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -26,7 +26,6 @@ import ( "sync" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -155,6 +154,8 @@ var ( input: "select 1 from (select 1 from dual) as t", }, { input: "select 1 from (select 1 from dual union select 2 from dual) as t", + }, { + input: "select 1 from ((select 1 from dual) union select 2 from dual) as t", }, { input: "select /* distinct */ distinct 1 from t", }, { @@ -1709,19 +1710,11 @@ func TestParallelValid(t *testing.T) { wg.Wait() } -func TestUnsupported(t *testing.T) { - _, err := Parse("select 1 from ((select 1 from dual) union select 2 from dual) as t") - assert.Error(t, err) // This should really work, but it doesn't currently -} - func TestInvalid(t *testing.T) { invalidSQL := []struct { input string err string }{{ - input: "select a from (select * from tbl)", - err: "Every derived table must have its own alias", - }, { input: "select a, b from (select * from tbl) sort by a", err: "syntax error", }, { @@ -2074,6 +2067,9 @@ func TestPositionedErr(t *testing.T) { }, { input: "select * from a left join b", output: PositionedErr{"syntax error", 28, nil}, + }, { + input: "select a from (select * from tbl)", + output: PositionedErr{"syntax error", 34, nil}, }} for _, tcase := range invalidSQL { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 04d65a35da4..769f50009d5 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -997,17 +997,17 @@ var yyAct = [...]int{ 291, 649, 1299, 277, 1298, 1156, 1205, 85, 419, 277, 1283, 412, 85, 85, 1325, 277, 1175, 1320, 955, 1243, 86, 1285, 913, 1020, 86, 914, 86, 711, 1323, 1414, - 1314, 1136, 86, 678, 933, 1305, 322, 872, 85, 86, - 337, 334, 1313, 335, 959, 1167, 623, 1115, 1274, 320, - 1338, 1116, 85, 314, 85, 85, 736, 729, 1220, 1220, - 1352, 979, 1123, 1124, 977, 976, 1329, 408, 1130, 1345, - 1336, 1133, 1134, 1366, 1332, 735, 963, 391, 1409, 1140, - 1511, 1356, 276, 1142, 1351, 390, 1145, 1146, 1147, 1148, - 1149, 1357, 1358, 1347, 930, 46, 607, 304, 29, 1346, - 399, 20, 276, 19, 18, 22, 1364, 1365, 85, 17, - 1383, 85, 85, 85, 276, 16, 15, 563, 33, 24, - 23, 14, 13, 12, 11, 1284, 10, 1374, 9, 8, - 4, 610, 1190, 1191, 21, 667, 737, 1375, 86, 2, + 1314, 1136, 86, 678, 933, 1305, 737, 322, 85, 86, + 872, 337, 1313, 334, 335, 959, 1167, 1115, 1274, 623, + 1338, 1116, 85, 320, 85, 85, 314, 736, 1220, 1220, + 1352, 729, 1123, 1124, 979, 977, 1329, 976, 1130, 1345, + 408, 1133, 1134, 1366, 1336, 1332, 735, 963, 391, 1140, + 1409, 1356, 276, 1142, 1351, 1511, 1145, 1146, 1147, 1148, + 1149, 1357, 1358, 1347, 390, 930, 46, 607, 304, 1346, + 29, 399, 276, 20, 19, 18, 1364, 1365, 85, 22, + 1383, 85, 85, 85, 276, 17, 16, 15, 563, 33, + 24, 23, 14, 13, 12, 1284, 11, 1374, 10, 9, + 8, 4, 1190, 1191, 610, 21, 667, 1375, 86, 2, 277, 277, 277, 1392, 1388, 1389, 1309, 1377, 0, 86, 1394, 1395, 1376, 1396, 1378, 86, 1398, 0, 1400, 1387, 1397, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2791,15 +2791,15 @@ var yyPact = [...]int{ } var yyPgo = [...]int{ - 0, 1299, 1296, 1295, 19, 74, 68, 1294, 1291, 1290, - 94, 93, 91, 1289, 1288, 1286, 1284, 1283, 1282, 1281, + 0, 1299, 1296, 19, 74, 68, 1295, 1294, 1291, 94, + 93, 91, 1290, 1289, 1288, 1286, 1284, 1283, 1282, 1281, 1280, 1279, 1278, 1277, 1276, 1275, 1269, 1265, 1264, 1263, - 1261, 96, 1260, 86, 1258, 1257, 1256, 1255, 1254, 1245, - 1240, 1238, 44, 180, 50, 64, 1237, 60, 1551, 1236, - 56, 61, 58, 1235, 30, 1234, 1230, 71, 1227, 1225, - 57, 1224, 1221, 45, 1217, 67, 1216, 12, 52, 1213, - 1209, 1206, 1205, 80, 775, 1204, 1203, 15, 1201, 1200, - 89, 1197, 66, 29, 11, 18, 22, 1196, 62, 7, + 96, 1261, 86, 1260, 1258, 1257, 1256, 1255, 1254, 1245, + 1240, 44, 180, 50, 64, 1238, 60, 1551, 1237, 56, + 61, 58, 1236, 30, 1235, 1234, 71, 1230, 1227, 57, + 1225, 1224, 45, 1221, 67, 1217, 12, 52, 1216, 1213, + 1209, 1206, 80, 775, 1205, 1204, 15, 1203, 1201, 89, + 1200, 66, 29, 11, 18, 22, 1197, 62, 1196, 7, 1194, 65, 1193, 1191, 1190, 1189, 59, 1187, 63, 1178, 17, 24, 1174, 38, 75, 31, 23, 8, 1171, 1168, 14, 69, 53, 87, 1166, 1165, 574, 1161, 1160, 46, @@ -2819,12 +2819,12 @@ var yyR1 = [...]int{ 0, 204, 205, 205, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 197, 197, 197, - 21, 4, 4, 4, 4, 3, 3, 9, 5, 6, - 6, 10, 10, 34, 34, 11, 12, 12, 12, 12, - 208, 208, 57, 57, 58, 58, 104, 104, 13, 14, - 14, 113, 113, 112, 112, 112, 114, 114, 114, 114, - 147, 147, 15, 15, 15, 15, 15, 15, 15, 199, - 199, 198, 196, 196, 195, 195, 194, 22, 179, 181, + 20, 3, 3, 3, 3, 2, 2, 8, 4, 5, + 5, 9, 9, 33, 33, 10, 11, 11, 11, 11, + 208, 208, 56, 56, 57, 57, 104, 104, 12, 13, + 13, 113, 113, 112, 112, 112, 114, 114, 114, 114, + 147, 147, 14, 14, 14, 14, 14, 14, 14, 199, + 199, 198, 196, 196, 195, 195, 194, 21, 179, 181, 181, 180, 180, 180, 180, 171, 150, 150, 150, 150, 153, 153, 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 154, 154, 154, 154, @@ -2838,48 +2838,48 @@ var yyR1 = [...]int{ 185, 185, 185, 175, 175, 175, 176, 176, 174, 174, 177, 177, 187, 187, 186, 173, 173, 190, 190, 190, 190, 202, 203, 201, 201, 201, 201, 201, 182, 182, - 182, 183, 183, 183, 184, 184, 184, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 200, 200, 200, 200, 200, 200, + 182, 183, 183, 183, 184, 184, 184, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 193, 191, - 191, 192, 192, 17, 23, 23, 18, 18, 18, 18, - 18, 19, 19, 24, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 120, 120, 122, 122, 118, 118, 121, 121, 119, + 191, 192, 192, 16, 22, 22, 17, 17, 17, 17, + 17, 18, 18, 23, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 120, 120, 122, 122, 118, 118, 121, 121, 119, 119, 119, 123, 123, 123, 124, 124, 148, 148, 148, - 26, 26, 28, 28, 29, 30, 35, 35, 35, 35, - 35, 35, 37, 37, 37, 8, 8, 8, 8, 36, - 36, 36, 7, 7, 27, 27, 27, 27, 20, 209, - 31, 32, 32, 33, 33, 33, 39, 39, 39, 38, - 38, 38, 44, 44, 46, 46, 46, 46, 46, 47, - 47, 47, 47, 47, 47, 43, 43, 45, 45, 45, - 45, 136, 136, 136, 135, 135, 49, 49, 50, 50, - 51, 51, 52, 52, 52, 2, 66, 66, 103, 103, - 105, 105, 53, 53, 53, 53, 54, 54, 55, 55, - 56, 56, 143, 143, 142, 142, 142, 141, 141, 59, - 59, 59, 61, 60, 60, 60, 60, 62, 62, 64, - 64, 63, 63, 65, 67, 67, 67, 67, 67, 68, - 68, 48, 48, 48, 48, 48, 48, 48, 117, 117, - 70, 70, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 81, 81, 81, 81, 81, 81, 71, 71, - 71, 71, 71, 71, 71, 42, 42, 82, 82, 82, - 88, 83, 83, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 78, 78, 78, - 78, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 210, 210, 80, 79, 79, 79, 79, 79, 79, 79, - 40, 40, 40, 40, 40, 146, 146, 149, 149, 149, + 25, 25, 27, 27, 28, 29, 34, 34, 34, 34, + 34, 34, 36, 36, 36, 7, 7, 7, 7, 35, + 35, 35, 6, 6, 26, 26, 26, 26, 19, 209, + 30, 31, 31, 32, 32, 32, 38, 38, 38, 37, + 37, 37, 43, 43, 45, 45, 45, 45, 45, 46, + 46, 46, 46, 46, 46, 42, 42, 44, 44, 44, + 44, 136, 136, 136, 135, 135, 48, 48, 49, 49, + 50, 50, 51, 51, 51, 88, 65, 65, 103, 103, + 105, 105, 52, 52, 52, 52, 53, 53, 54, 54, + 55, 55, 143, 143, 142, 142, 142, 141, 141, 58, + 58, 58, 60, 59, 59, 59, 59, 61, 61, 63, + 63, 62, 62, 64, 66, 66, 66, 66, 66, 67, + 67, 47, 47, 47, 47, 47, 47, 47, 117, 117, + 69, 69, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 80, 80, 80, 80, 80, 80, 70, 70, + 70, 70, 70, 70, 70, 41, 41, 81, 81, 81, + 87, 82, 82, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 77, 77, 77, + 77, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 210, 210, 79, 78, 78, 78, 78, 78, 78, 78, + 39, 39, 39, 39, 39, 146, 146, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 92, 92, 41, 41, 90, 90, 91, 93, 93, 89, - 89, 89, 73, 73, 73, 73, 73, 73, 73, 73, - 75, 75, 75, 94, 94, 95, 95, 96, 96, 97, + 92, 92, 40, 40, 90, 90, 91, 93, 93, 89, + 89, 89, 72, 72, 72, 72, 72, 72, 72, 72, + 74, 74, 74, 94, 94, 95, 95, 96, 96, 97, 97, 98, 99, 99, 99, 100, 100, 100, 100, 101, - 101, 101, 72, 72, 72, 72, 102, 102, 102, 102, - 106, 106, 84, 84, 86, 86, 85, 87, 107, 107, + 101, 101, 71, 71, 71, 71, 102, 102, 102, 102, + 106, 106, 83, 83, 85, 85, 84, 86, 107, 107, 110, 108, 108, 108, 111, 111, 111, 111, 109, 109, 109, 138, 138, 138, 115, 115, 125, 125, 126, 126, 116, 116, 127, 127, 127, 127, 127, 127, 127, 127, @@ -3020,14 +3020,14 @@ var yyR2 = [...]int{ } var yyChk = [...]int{ - -1000, -204, -1, -4, -9, -10, -11, -12, -13, -14, - -15, -16, -17, -18, -19, -24, -25, -26, -28, -29, - -30, -7, -27, -20, -21, -5, -206, 6, 7, -34, - 9, 10, 30, -22, 122, 123, 125, 124, 158, 126, - 151, 53, 172, 173, 175, 176, -37, 156, 157, 31, + -1000, -204, -1, -3, -8, -9, -10, -11, -12, -13, + -14, -15, -16, -17, -18, -23, -24, -25, -27, -28, + -29, -6, -26, -19, -20, -4, -206, 6, 7, -33, + 9, 10, 30, -21, 122, 123, 125, 124, 158, 126, + 151, 53, 172, 173, 175, 176, -36, 156, 157, 31, 32, 128, 34, 57, 8, 258, 153, 152, 25, -205, - 360, -33, 5, -96, 15, -4, -31, -209, -31, -31, - -31, -31, -31, -179, -181, 57, 95, -130, 132, 77, + 360, -32, 5, -96, 15, -3, -30, -209, -30, -30, + -30, -30, -30, -179, -181, 57, 95, -130, 132, 77, 250, 129, 130, 136, -133, -197, -132, 60, 61, 62, 268, 144, 300, 301, 172, 183, 177, 204, 196, 269, 302, 145, 194, 197, 237, 142, 303, 224, 231, 71, @@ -3047,21 +3047,21 @@ var yyChk = [...]int{ 174, 165, 158, 353, 247, 222, 274, 198, 195, 169, 354, 166, 167, 355, 227, 228, 170, 271, 243, 193, 223, -116, 132, 250, 129, 228, 134, 130, 130, 131, - 132, 250, 129, 130, -63, -139, -197, -132, 132, 130, + 132, 250, 129, 130, -62, -139, -197, -132, 132, 130, 113, 197, 237, 122, 225, 233, -122, 234, 164, -148, 130, -118, 224, 227, 228, 170, -197, 235, 239, 238, - 229, -139, 174, -63, -35, 356, 126, -144, -144, 226, - 226, -144, -83, -48, -69, 79, -74, 29, 23, -73, - -70, -89, -87, -88, 113, 114, 116, 115, 117, 102, - 103, 110, 80, 118, -78, -76, -77, -79, 64, 63, + 229, -139, 174, -62, -34, 356, 126, -144, -144, 226, + 226, -144, -82, -47, -68, 79, -73, 29, 23, -72, + -69, -89, -86, -87, 113, 114, 116, 115, 117, 102, + 103, 110, 80, 118, -77, -75, -76, -78, 64, 63, 72, 65, 66, 67, 68, 73, 74, 75, -133, -139, - -85, -206, 47, 48, 259, 260, 261, 262, 267, 263, + -84, -206, 47, 48, 259, 260, 261, 262, 267, 263, 82, 36, 249, 257, 256, 255, 253, 254, 251, 252, - 265, 266, 135, 250, 129, 108, 258, -197, -132, -6, - -5, -206, 6, 20, 21, -100, 17, 16, -207, 59, - -39, -46, 42, 43, -47, 21, 35, 46, 44, -32, - -45, 104, -48, -139, -116, -116, 11, -57, -58, -63, - -65, -139, -108, -147, 174, -111, 239, 238, -134, -109, + 265, 266, 135, 250, 129, 108, 258, -197, -132, -5, + -4, -206, 6, 20, 21, -100, 17, 16, -207, 59, + -38, -45, 42, 43, -46, 21, 35, 46, 44, -31, + -44, 104, -47, -139, -116, -116, 11, -56, -57, -62, + -64, -139, -108, -147, 174, -111, 239, 238, -134, -109, -133, -131, 237, 197, 236, 127, 275, 78, 22, 24, 219, 81, 113, 16, 82, 112, 259, 122, 51, 276, 251, 252, 249, 261, 262, 250, 225, 29, 10, 278, @@ -3074,110 +3074,110 @@ var yyChk = [...]int{ 295, 296, 96, 125, 258, 48, 297, 129, 6, 264, 30, 151, 46, 298, 130, 84, 265, 266, 133, 74, 5, 136, 32, 9, 53, 56, 255, 256, 257, 36, - 83, 12, 299, -180, 95, -171, -197, -63, 131, -63, - 258, -126, 135, -126, -126, 130, -63, -197, -197, 122, - 124, 127, 55, -23, -63, -125, 135, -197, -125, -125, - -125, -63, 119, -63, -197, 30, -123, 95, 12, 250, + 83, 12, 299, -180, 95, -171, -197, -62, 131, -62, + 258, -126, 135, -126, -126, 130, -62, -197, -197, 122, + 124, 127, 55, -22, -62, -125, 135, -197, -125, -125, + -125, -62, 119, -62, -197, 30, -123, 95, 12, 250, -197, 164, 130, 165, 132, -145, -206, -134, -175, 131, 33, 143, -145, 168, 169, -145, -121, -120, 231, 232, - 226, 230, 12, 169, 226, 167, -145, -36, -133, 64, - -8, -4, -11, -10, -12, 87, -144, -144, 58, 78, - 77, 94, -48, -71, 97, 79, 95, 96, 81, 99, + 226, 230, 12, 169, 226, 167, -145, -35, -133, 64, + -7, -3, -10, -9, -11, 87, -144, -144, 58, 78, + 77, 94, -47, -70, 97, 79, 95, 96, 81, 99, 98, 109, 102, 103, 104, 105, 106, 107, 108, 100, 101, 112, 87, 88, 89, 90, 91, 92, 93, -117, - -206, -88, -206, 120, 121, -74, -74, -74, -74, -74, - -74, -74, -74, -74, -74, -206, 119, -3, -83, -5, - -206, -206, -206, -206, -206, -206, -206, -206, -92, -48, - -206, -210, -80, -206, -210, -80, -210, -80, -210, -206, - -210, -80, -210, -80, -210, -210, -80, -206, -206, -206, - -206, -206, -206, -206, -96, -4, -31, -101, 19, 31, - -48, -97, -98, -48, -96, 38, -43, -45, -47, 42, - 43, 70, 11, -136, -135, 22, -133, 64, 119, -64, - 26, -63, -50, -51, -52, -53, -66, -2, -206, -63, - -63, -57, -208, 58, 11, 56, -208, 58, 119, 58, + -206, -87, -206, 120, 121, -73, -73, -73, -73, -73, + -73, -73, -73, -73, -73, -206, 119, -2, -82, -4, + -206, -206, -206, -206, -206, -206, -206, -206, -92, -47, + -206, -210, -79, -206, -210, -79, -210, -79, -210, -206, + -210, -79, -210, -79, -210, -210, -79, -206, -206, -206, + -206, -206, -206, -206, -96, -3, -30, -101, 19, 31, + -47, -97, -98, -47, -96, 38, -42, -44, -46, 42, + 43, 70, 11, -136, -135, 22, -133, 64, 119, -63, + 26, -62, -49, -50, -51, -52, -65, -88, -206, -62, + -62, -56, -208, 58, 11, 56, -208, 58, 119, 58, 174, -111, -113, -112, 240, 242, 87, -138, -133, 64, - 29, 30, 59, 58, -63, -150, -153, -155, -154, -156, + 29, 30, 59, 58, -62, -150, -153, -155, -154, -156, -151, -152, 194, 195, 113, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 30, 154, 190, 191, 192, 193, 210, 211, 212, 213, 214, 215, 216, 217, 177, 196, 269, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, -197, -145, 132, -197, 79, -197, - -63, -63, -145, -145, -145, 166, 166, 130, 130, 171, - -63, 58, 133, -57, 23, 55, -63, -197, -197, -140, - -139, -131, -145, -123, 64, -48, -145, -145, -145, -63, + -62, -62, -145, -145, -145, 166, 166, 130, 130, 171, + -62, 58, 133, -56, 23, 55, -62, -197, -197, -140, + -139, -131, -145, -123, 64, -47, -145, -145, -145, -62, -145, -145, -176, 11, 97, -145, -145, 11, -119, 11, - 97, -48, -124, 95, 55, 208, 357, 358, 359, -48, - -48, -48, -81, 73, 79, 74, 75, -74, -82, -85, - -88, 69, 97, 95, 96, 81, -74, -74, -74, -74, - -74, -74, -74, -74, -74, -74, -74, -74, -74, -74, - -74, -146, -197, 64, -197, -73, -73, -133, -44, 21, - 35, -43, -134, -140, -131, -33, -207, -207, -96, -43, - -43, -48, -48, -89, 64, -43, -89, 64, -43, -43, - -38, 21, 35, -90, -91, 83, -89, -133, -139, -207, - -74, -133, -133, -43, -44, -44, -43, -43, -100, -207, - 9, 97, 58, 18, 58, -99, 24, 25, -100, -75, - -133, 65, 68, -49, 58, 11, -47, -63, -135, 104, - -140, -104, 160, -63, 30, 58, -59, -61, -60, -62, - 45, 49, 51, 46, 47, 48, 52, -143, 22, -50, - -4, -206, -142, 160, -141, 22, -139, 64, -104, 56, - -50, -63, -50, -65, -139, 104, -111, -113, 58, 241, - 243, 244, 55, 76, -48, -162, 112, -182, -183, -184, + 97, -47, -124, 95, 55, 208, 357, 358, 359, -47, + -47, -47, -80, 73, 79, 74, 75, -73, -81, -84, + -87, 69, 97, 95, 96, 81, -73, -73, -73, -73, + -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -146, -197, 64, -197, -72, -72, -133, -43, 21, + 35, -42, -134, -140, -131, -32, -207, -207, -96, -42, + -42, -47, -47, -89, 64, -42, -89, 64, -42, -42, + -37, 21, 35, -90, -91, 83, -89, -133, -139, -207, + -73, -133, -133, -42, -43, -43, -42, -42, -100, -207, + 9, 97, 58, 18, 58, -99, 24, 25, -100, -74, + -133, 65, 68, -48, 58, 11, -46, -62, -135, 104, + -140, -104, 160, -62, 30, 58, -58, -60, -59, -61, + 45, 49, 51, 46, 47, 48, 52, -143, 22, -49, + -3, -206, -142, 160, -141, 22, -139, 64, -104, 56, + -49, -62, -49, -64, -139, 104, -111, -113, 58, 241, + 243, 244, 55, 76, -47, -162, 112, -182, -183, -184, -134, 64, 65, -171, -172, -173, -185, 146, -190, 137, 139, 136, -174, 147, 131, 28, 59, -167, 73, 79, -163, 222, -157, 57, -157, -157, -157, -157, -161, 197, -161, -161, -161, 57, 57, -157, -157, -157, -165, 57, - -165, -165, -166, 57, -166, -137, 56, -63, -145, 23, + -165, -165, -166, 57, -166, -137, 56, -62, -145, 23, -145, -127, 127, 124, 125, -193, 123, 219, 197, 71, - 29, 15, 259, 160, 274, -197, 161, -63, -63, -63, - -63, -63, 127, 124, -63, -63, -63, -145, -63, -63, - -123, -139, -139, 64, -63, 73, 74, 75, -82, -74, - -74, -74, -42, 155, 78, -207, -207, -43, -43, -206, - 119, -6, -100, -207, -207, 58, 56, 22, 11, 11, - -207, 11, 11, -207, -207, -43, -93, -91, 85, -48, + 29, 15, 259, 160, 274, -197, 161, -62, -62, -62, + -62, -62, 127, 124, -62, -62, -62, -145, -62, -62, + -123, -139, -139, 64, -62, 73, 74, 75, -81, -73, + -73, -73, -41, 155, 78, -207, -207, -42, -42, -206, + 119, -5, -100, -207, -207, 58, 56, 22, 11, 11, + -207, 11, 11, -207, -207, -42, -93, -91, 85, -47, -207, 119, -207, 58, 58, -207, -207, -207, -207, -207, - -101, 40, -48, -48, -98, -101, -115, 19, 11, 36, - 36, -68, 12, -45, -50, -47, 119, -72, 30, 36, - -4, -206, -206, -107, -110, -89, -51, -52, -52, -51, - -52, 45, 45, 45, 50, 45, 50, 45, -60, -139, - -207, -207, -4, -67, 53, 134, 54, -206, -141, -68, - -50, -68, -68, 119, -112, -114, 245, 242, 248, -197, + -101, 40, -47, -47, -98, -101, -115, 19, 11, 36, + 36, -67, 12, -44, -49, -46, 119, -71, 30, 36, + -3, -206, -206, -107, -110, -89, -50, -51, -51, -50, + -51, 45, 45, 45, 50, 45, 50, 45, -59, -139, + -207, -207, -3, -66, 53, 134, 54, -206, -141, -67, + -49, -67, -67, 119, -112, -114, 245, 242, 248, -197, 64, 58, -184, 87, 57, -197, 28, -174, -174, -177, -197, -177, 28, -159, 29, 73, -164, 223, 65, -161, -161, -162, 30, -162, -162, -162, -170, 64, -170, 65, 65, 55, -133, -145, -144, -200, 142, 138, 146, 147, 140, 60, 61, 62, 131, 28, 137, 139, 160, 136, -200, -128, -129, 133, 22, 131, 28, 160, -199, 56, - 166, 219, 166, 133, -145, -119, -119, -42, 78, -74, - -74, -207, -207, -44, -134, -96, -101, -149, 113, 194, + 166, 219, 166, 133, -145, -119, -119, -41, 78, -73, + -73, -207, -207, -43, -134, -96, -101, -149, 113, 194, 154, 192, 188, 208, 199, 221, 190, 222, -146, -149, - -74, -74, -74, -74, 268, -96, 86, -48, 84, -134, - -74, -74, 41, -63, -94, 13, -48, 104, -106, 55, - -107, -84, -86, -85, -206, -102, -133, -105, -133, -68, - 58, 87, -55, -54, 55, 56, -56, 55, -54, 45, - 45, -207, 131, 131, 131, -105, -96, -68, 242, 246, + -73, -73, -73, -73, 268, -96, 86, -47, 84, -134, + -73, -73, 41, -62, -94, 13, -47, 104, -106, 55, + -107, -83, -85, -84, -206, -102, -133, -105, -133, -67, + 58, 87, -54, -53, 55, 56, -55, 55, -53, 45, + 45, -207, 131, 131, 131, -105, -96, -67, 242, 246, 247, -183, -184, -187, -186, -133, -190, -177, -177, 57, - -160, 55, -74, 59, -162, -162, -197, 113, 59, 58, - 59, 58, 59, 58, -63, -144, -144, -63, -144, -133, - -196, 271, -198, -197, -133, -133, -133, -63, -123, -123, - -74, -207, -100, -207, -157, -157, -157, -166, -157, 182, - -157, 182, -207, -207, 19, 19, 19, 19, -206, -41, - 264, -48, 58, 58, -95, 14, 16, 27, -106, 58, - -207, -207, 58, 119, -207, 58, -96, -110, -48, -48, - 57, -48, -206, -206, -206, -207, -100, 59, 58, -157, + -160, 55, -73, 59, -162, -162, -197, 113, 59, 58, + 59, 58, 59, 58, -62, -144, -144, -62, -144, -133, + -196, 271, -198, -197, -133, -133, -133, -62, -123, -123, + -73, -207, -100, -207, -157, -157, -157, -166, -157, 182, + -157, 182, -207, -207, 19, 19, 19, 19, -206, -40, + 264, -47, 58, 58, -95, 14, 16, 27, -106, 58, + -207, -207, 58, 119, -207, 58, -96, -110, -47, -47, + 57, -47, -206, -206, -206, -207, -100, 59, 58, -157, -103, -133, -168, 219, 9, -161, 64, -161, 65, 65, -145, 26, -195, -194, -134, 57, 56, -101, -161, -197, - -74, -74, -74, -74, -74, -100, 64, -74, -74, -48, - -83, 28, -86, 36, -4, -133, -133, -133, -100, -103, + -73, -73, -73, -73, -73, -100, 64, -73, -73, -47, + -82, 28, -85, 36, -3, -133, -133, -133, -100, -103, -103, -207, -103, -103, -142, -189, -188, 56, 141, 71, - -186, 59, 58, -169, 137, 28, 136, -77, -162, -162, - 59, 59, -206, 58, 87, -103, -63, -207, -207, -207, - -207, -40, 97, 271, -207, -207, -207, 9, -84, 119, - 59, -207, -207, -207, -67, -188, -197, -178, 87, 64, + -186, 59, 58, -169, 137, 28, 136, -76, -162, -162, + 59, 59, -206, 58, 87, -103, -62, -207, -207, -207, + -207, -39, 97, 271, -207, -207, -207, 9, -83, 119, + 59, -207, -207, -207, -66, -188, -197, -178, 87, 64, 149, -133, -158, 71, 28, 28, -191, -192, 160, -194, - -184, 59, -207, 269, 52, 272, -107, -133, 65, -63, + -184, 59, -207, 269, 52, 272, -107, -133, 65, -62, 64, -207, 58, -133, -199, 41, 270, 273, 57, -192, 36, -196, 41, -103, 162, 271, 59, 163, 272, -202, - -203, 55, -206, 273, -203, 55, 10, 9, -74, 159, + -203, 55, -206, 273, -203, 55, 10, 9, -73, 159, -201, 150, 145, 148, 30, -201, -207, -207, 144, 29, 73, } @@ -5974,7 +5974,7 @@ yydefault: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2137 { - yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].selStmt, As: yyDollar[3].tableIdent} + yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 394: yyDollar = yyS[yypt-3 : yypt+1] @@ -5986,7 +5986,7 @@ yydefault: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2147 { - yyVAL.selStmt = &Subquery{yyDollar[2].selStmt} + yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 396: yyDollar = yyS[yypt-3 : yypt+1] diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 8edd89664b1..afd9f3db575 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -217,7 +217,7 @@ func skipToEnd(yylex interface{}) { %token FORMAT TREE VITESS TRADITIONAL %type command -%type derived_table simple_select select_statement base_select union_rhs +%type simple_select select_statement base_select union_rhs %type explain_statement explainable_statement %type stream_statement insert_statement update_statement delete_statement set_statement set_transaction_statement %type create_statement alter_statement rename_statement drop_statement truncate_statement flush_statement do_statement @@ -255,7 +255,7 @@ func skipToEnd(yylex interface{}) { %type tuple_list %type row_tuple tuple_or_empty %type tuple_expression -%type subquery +%type subquery derived_table %type column_name %type when_expression_list %type when_expression From 615daf13c95b144d124b94a80230ae27ac9ff752 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 23 Jun 2020 17:35:31 +0530 Subject: [PATCH 079/430] use lhs union fields in vtexplain Signed-off-by: Harshit Gangal --- go/vt/vtexplain/vtexplain_vttablet.go | 2 +- go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 6dd19a07beb..055806e9e18 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -454,7 +454,7 @@ func (t *explainTablet) HandleQuery(c *mysql.Conn, query string, callback func(* case *sqlparser.Select: selStmt = stmt case *sqlparser.Union: - selStmt = stmt.UnionSelects[1].Statement.(*sqlparser.Select) + selStmt = stmt.FirstStatement.(*sqlparser.Select) default: return fmt.Errorf("vtexplain: unsupported statement type +%v", reflect.TypeOf(stmt)) } diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt index 8b993727db2..354b04fe444 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt @@ -412,10 +412,10 @@ "create database foo" "unsupported: Database DDL create database foo" -# stupid query is not supported +# order by inside and outside parenthesis select "(select 1 from user order by 1 desc) order by 1 asc limit 2" "expected union to produce a route" -# stupid query is not supported -"(select 1 from user order by 1 desc) union (select 1 from user order by 1 asc) order by 1 asc limit 2" +# multiple select statement have inner order by with union +"(select 1 from user order by 1 desc) union (select 1 from user order by 1 asc)" "unsupported: SELECT of UNION is non-trivial" From 04a543a49cf15c4e509f14048dec8fc35be81bc6 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Tue, 23 Jun 2020 15:29:49 +0300 Subject: [PATCH 080/430] orchestrator repo moved under openark/ org Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- config/init_db.sql | 2 +- docker/k8s/orchestrator/Dockerfile | 2 +- docker/orchestrator/build.sh | 8 ++++---- examples/operator/101_initial_cluster.yaml | 2 +- go/vt/mysqlctl/metadata_tables.go | 2 +- go/vt/mysqlctl/rice-box.go | 2 +- helm/vitess/CHANGELOG.md | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/config/init_db.sql b/config/init_db.sql index 836c8c997e6..64d2382e3f7 100644 --- a/config/init_db.sql +++ b/config/init_db.sql @@ -91,7 +91,7 @@ GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD GRANT SELECT, UPDATE, DELETE, DROP ON performance_schema.* TO 'vt_monitoring'@'localhost'; -# User for Orchestrator (https://github.com/github/orchestrator). +# User for Orchestrator (https://github.com/openark/orchestrator). CREATE USER 'orc_client_user'@'%' IDENTIFIED BY 'orc_client_user_password'; GRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD ON *.* TO 'orc_client_user'@'%'; diff --git a/docker/k8s/orchestrator/Dockerfile b/docker/k8s/orchestrator/Dockerfile index 26ee5922bc5..68f4889123c 100644 --- a/docker/k8s/orchestrator/Dockerfile +++ b/docker/k8s/orchestrator/Dockerfile @@ -19,7 +19,7 @@ FROM debian:stretch-slim RUN apt-get update && \ apt-get upgrade -qq && \ apt-get install wget ca-certificates jq -qq --no-install-recommends && \ - wget https://github.com/github/orchestrator/releases/download/v3.1.1/orchestrator_3.1.0_amd64.deb && \ + wget https://github.com/openark/orchestrator/releases/download/v3.1.1/orchestrator_3.1.0_amd64.deb && \ dpkg -i orchestrator_3.1.0_amd64.deb && \ rm orchestrator_3.1.0_amd64.deb && \ apt-get purge wget -qq && \ diff --git a/docker/orchestrator/build.sh b/docker/orchestrator/build.sh index 0f81c7b2dd2..dbc8dfc464b 100755 --- a/docker/orchestrator/build.sh +++ b/docker/orchestrator/build.sh @@ -19,14 +19,14 @@ set -e tmpdir=`mktemp -d` script="go get vitess.io/vitess/go/cmd/vtctlclient && \ - git clone https://github.com/github/orchestrator.git src/github.com/github/orchestrator && \ - go install github.com/github/orchestrator/go/cmd/orchestrator" + git clone https://github.com/openark/orchestrator.git src/github.com/openark/orchestrator && \ + go install github.com/openark/orchestrator/go/cmd/orchestrator" echo "Building orchestrator..." -docker run -ti --name=vt_orc_build golang:1.7 bash -c "$script" +docker run -ti --name=vt_orc_build golang:1.14.4-stretch bash -c "$script" docker cp vt_orc_build:/go/bin/orchestrator $tmpdir docker cp vt_orc_build:/go/bin/vtctlclient $tmpdir -docker cp vt_orc_build:/go/src/github.com/github/orchestrator/resources $tmpdir +docker cp vt_orc_build:/go/src/github.com/openark/orchestrator/resources $tmpdir docker rm vt_orc_build echo "Building Docker image..." diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 60e8d118b50..10671a4dcc0 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -173,7 +173,7 @@ stringData: SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'vt_filtered'@'localhost'; - # User for Orchestrator (https://github.com/github/orchestrator). + # User for Orchestrator (https://github.com/openark/orchestrator). # TODO: Reenable when the password is randomly generated. #CREATE USER 'orc_client_user'@'%' IDENTIFIED BY 'orc_client_user_password'; #GRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD diff --git a/go/vt/mysqlctl/metadata_tables.go b/go/vt/mysqlctl/metadata_tables.go index 62bb411ebb7..e599a988854 100644 --- a/go/vt/mysqlctl/metadata_tables.go +++ b/go/vt/mysqlctl/metadata_tables.go @@ -62,7 +62,7 @@ var ( // a per-tablet table that is never replicated. This allows queries // against local_metadata to return different values on different tablets, // which is used for communicating between Vitess and MySQL-level tools like -// Orchestrator (https://github.com/github/orchestrator). +// Orchestrator (https://github.com/openark/orchestrator). // _vt.shard_metadata is a replicated table with per-shard information, but it's // created here to make it easier to create it on databases that were running // old version of Vitess, or databases that are getting converted to run under diff --git a/go/vt/mysqlctl/rice-box.go b/go/vt/mysqlctl/rice-box.go index b2ee667d6e3..a2d0378ebed 100644 --- a/go/vt/mysqlctl/rice-box.go +++ b/go/vt/mysqlctl/rice-box.go @@ -19,7 +19,7 @@ func init() { Filename: "init_db.sql", FileModTime: time.Unix(1578077737, 0), - Content: string("# This file is executed immediately after mysql_install_db,\n# to initialize a fresh data directory.\n\n###############################################################################\n# WARNING: This sql is *NOT* safe for production use,\n# as it contains default well-known users and passwords.\n# Care should be taken to change these users and passwords\n# for production.\n###############################################################################\n\n###############################################################################\n# Equivalent of mysql_secure_installation\n###############################################################################\n\n# Changes during the init db should not make it to the binlog.\n# They could potentially create errant transactions on replicas.\nSET sql_log_bin = 0;\n# Remove anonymous users.\nDELETE FROM mysql.user WHERE User = '';\n\n# Disable remote root access (only allow UNIX socket).\nDELETE FROM mysql.user WHERE User = 'root' AND Host != 'localhost';\n\n# Remove test database.\nDROP DATABASE IF EXISTS test;\n\n###############################################################################\n# Vitess defaults\n###############################################################################\n\n# Vitess-internal database.\nCREATE DATABASE IF NOT EXISTS _vt;\n# Note that definitions of local_metadata and shard_metadata should be the same\n# as in production which is defined in go/vt/mysqlctl/metadata_tables.go.\nCREATE TABLE IF NOT EXISTS _vt.local_metadata (\n name VARCHAR(255) NOT NULL,\n value VARCHAR(255) NOT NULL,\n db_name VARBINARY(255) NOT NULL,\n PRIMARY KEY (db_name, name)\n ) ENGINE=InnoDB;\nCREATE TABLE IF NOT EXISTS _vt.shard_metadata (\n name VARCHAR(255) NOT NULL,\n value MEDIUMBLOB NOT NULL,\n db_name VARBINARY(255) NOT NULL,\n PRIMARY KEY (db_name, name)\n ) ENGINE=InnoDB;\n\n# Admin user with all privileges.\nCREATE USER 'vt_dba'@'localhost';\nGRANT ALL ON *.* TO 'vt_dba'@'localhost';\nGRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost';\n\n# User for app traffic, with global read-write access.\nCREATE USER 'vt_app'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_app'@'localhost';\n\n# User for app debug traffic, with global read access.\nCREATE USER 'vt_appdebug'@'localhost';\nGRANT SELECT, SHOW DATABASES, PROCESS ON *.* TO 'vt_appdebug'@'localhost';\n\n# User for administrative operations that need to be executed as non-SUPER.\n# Same permissions as vt_app here.\nCREATE USER 'vt_allprivs'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_allprivs'@'localhost';\n\n# User for slave replication connections.\nCREATE USER 'vt_repl'@'%';\nGRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%';\n\n# User for Vitess filtered replication (binlog player).\n# Same permissions as vt_app.\nCREATE USER 'vt_filtered'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_filtered'@'localhost';\n\n# User for general MySQL monitoring.\nCREATE USER 'vt_monitoring'@'localhost';\nGRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD\n ON *.* TO 'vt_monitoring'@'localhost';\nGRANT SELECT, UPDATE, DELETE, DROP\n ON performance_schema.* TO 'vt_monitoring'@'localhost';\n\n# User for Orchestrator (https://github.com/github/orchestrator).\nCREATE USER 'orc_client_user'@'%' IDENTIFIED BY 'orc_client_user_password';\nGRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD\n ON *.* TO 'orc_client_user'@'%';\nGRANT SELECT\n ON _vt.* TO 'orc_client_user'@'%';\n\nFLUSH PRIVILEGES;\n\nRESET SLAVE ALL;\nRESET MASTER;\n"), + Content: string("# This file is executed immediately after mysql_install_db,\n# to initialize a fresh data directory.\n\n###############################################################################\n# WARNING: This sql is *NOT* safe for production use,\n# as it contains default well-known users and passwords.\n# Care should be taken to change these users and passwords\n# for production.\n###############################################################################\n\n###############################################################################\n# Equivalent of mysql_secure_installation\n###############################################################################\n\n# Changes during the init db should not make it to the binlog.\n# They could potentially create errant transactions on replicas.\nSET sql_log_bin = 0;\n# Remove anonymous users.\nDELETE FROM mysql.user WHERE User = '';\n\n# Disable remote root access (only allow UNIX socket).\nDELETE FROM mysql.user WHERE User = 'root' AND Host != 'localhost';\n\n# Remove test database.\nDROP DATABASE IF EXISTS test;\n\n###############################################################################\n# Vitess defaults\n###############################################################################\n\n# Vitess-internal database.\nCREATE DATABASE IF NOT EXISTS _vt;\n# Note that definitions of local_metadata and shard_metadata should be the same\n# as in production which is defined in go/vt/mysqlctl/metadata_tables.go.\nCREATE TABLE IF NOT EXISTS _vt.local_metadata (\n name VARCHAR(255) NOT NULL,\n value VARCHAR(255) NOT NULL,\n db_name VARBINARY(255) NOT NULL,\n PRIMARY KEY (db_name, name)\n ) ENGINE=InnoDB;\nCREATE TABLE IF NOT EXISTS _vt.shard_metadata (\n name VARCHAR(255) NOT NULL,\n value MEDIUMBLOB NOT NULL,\n db_name VARBINARY(255) NOT NULL,\n PRIMARY KEY (db_name, name)\n ) ENGINE=InnoDB;\n\n# Admin user with all privileges.\nCREATE USER 'vt_dba'@'localhost';\nGRANT ALL ON *.* TO 'vt_dba'@'localhost';\nGRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost';\n\n# User for app traffic, with global read-write access.\nCREATE USER 'vt_app'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_app'@'localhost';\n\n# User for app debug traffic, with global read access.\nCREATE USER 'vt_appdebug'@'localhost';\nGRANT SELECT, SHOW DATABASES, PROCESS ON *.* TO 'vt_appdebug'@'localhost';\n\n# User for administrative operations that need to be executed as non-SUPER.\n# Same permissions as vt_app here.\nCREATE USER 'vt_allprivs'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_allprivs'@'localhost';\n\n# User for slave replication connections.\nCREATE USER 'vt_repl'@'%';\nGRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%';\n\n# User for Vitess filtered replication (binlog player).\n# Same permissions as vt_app.\nCREATE USER 'vt_filtered'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_filtered'@'localhost';\n\n# User for general MySQL monitoring.\nCREATE USER 'vt_monitoring'@'localhost';\nGRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD\n ON *.* TO 'vt_monitoring'@'localhost';\nGRANT SELECT, UPDATE, DELETE, DROP\n ON performance_schema.* TO 'vt_monitoring'@'localhost';\n\n# User for Orchestrator (https://github.com/openark/orchestrator).\nCREATE USER 'orc_client_user'@'%' IDENTIFIED BY 'orc_client_user_password';\nGRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD\n ON *.* TO 'orc_client_user'@'%';\nGRANT SELECT\n ON _vt.* TO 'orc_client_user'@'%';\n\nFLUSH PRIVILEGES;\n\nRESET SLAVE ALL;\nRESET MASTER;\n"), } file5 := &embedded.EmbeddedFile{ Filename: "mycnf/default-fast.cnf", diff --git a/helm/vitess/CHANGELOG.md b/helm/vitess/CHANGELOG.md index 53b37eba80f..b5550a79586 100644 --- a/helm/vitess/CHANGELOG.md +++ b/helm/vitess/CHANGELOG.md @@ -47,7 +47,7 @@ lagging replicas from being promoted to master and causing errant GTID problems. ## 1.0.4 - 2019-01-01 ### Changes -* Use the [Orchestrator API](https://github.com/github/orchestrator/blob/master/docs/using-the-web-api.md) +* Use the [Orchestrator API](https://github.com/openark/orchestrator/blob/master/docs/using-the-web-api.md) to call `begin-downtime` before running `PlannedReparentShard` in the `preStopHook`, to make sure that Orchestrator doesn't try to run an external failover while Vitess is reparenting. When it is complete, it calls `end-downtime`. Also call `forget` on the instance after calling `vtctlclient DeleteTablet`. It will be rediscovered if/when From 553487e8fedb4a21277d14c1206189106b17ccc9 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 22 Jun 2020 23:54:17 +0530 Subject: [PATCH 081/430] Add parsing support for SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE SAVEPOINT Statements Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/savepoint_test.go | 23 + go/vt/sqlparser/ast.go | 33 + go/vt/sqlparser/parse_test.go | 21 + go/vt/sqlparser/rewriter.go | 21 + go/vt/sqlparser/sql.go | 7781 +++++++++++---------- go/vt/sqlparser/sql.y | 35 +- go/vt/sqlparser/token.go | 4 +- 7 files changed, 4029 insertions(+), 3889 deletions(-) create mode 100644 go/test/endtoend/vtgate/savepoint_test.go diff --git a/go/test/endtoend/vtgate/savepoint_test.go b/go/test/endtoend/vtgate/savepoint_test.go new file mode 100644 index 00000000000..c7d38ba7927 --- /dev/null +++ b/go/test/endtoend/vtgate/savepoint_test.go @@ -0,0 +1,23 @@ +package vtgate + +import ( + "context" + "github.com/stretchr/testify/require" + "testing" + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" +) + +func TestSavepoint(t *testing.T) { + defer cluster.PanicHandler(t) + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.Nil(t, err) + defer conn.Close() + + exec(t, conn, "delete from t1") + + exec(t, conn, "start transaction") + exec(t, conn, "start transaction") + exec(t, conn, "start transaction") +} diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 66b22e67489..04e1445c3e7 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -233,6 +233,21 @@ type ( // Rollback represents a Rollback statement. Rollback struct{} + // SRollback represents a rollback to savepoint statement. + SRollback struct { + Name ColIdent + } + + // Savepoint represents a savepoint statement. + Savepoint struct { + Name ColIdent + } + + // Release represents a release savepoint statement. + Release struct { + Name ColIdent + } + // Explain represents an EXPLAIN statement Explain struct { Type string @@ -266,6 +281,9 @@ func (*Use) iStatement() {} func (*Begin) iStatement() {} func (*Commit) iStatement() {} func (*Rollback) iStatement() {} +func (*SRollback) iStatement() {} +func (*Savepoint) iStatement() {} +func (*Release) iStatement() {} func (*Explain) iStatement() {} func (*OtherRead) iStatement() {} func (*OtherAdmin) iStatement() {} @@ -1316,6 +1334,21 @@ func (node *Rollback) Format(buf *TrackedBuffer) { buf.WriteString("rollback") } +// Format formats the node. +func (node *SRollback) Format(buf *TrackedBuffer) { + buf.astPrintf(node, "rollback to %v", node.Name) +} + +// Format formats the node. +func (node *Savepoint) Format(buf *TrackedBuffer) { + buf.astPrintf(node, "savepoint %v", node.Name) +} + +// Format formats the node. +func (node *Release) Format(buf *TrackedBuffer) { + buf.astPrintf(node, "release savepoint %v", node.Name) +} + // Format formats the node. func (node *Explain) Format(buf *TrackedBuffer) { format := "" diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 7e75b32e5bf..a0881c1de21 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -1654,6 +1654,27 @@ var ( }, { input: "do funcCall(), 2 = 1, 3 + 1", output: "otheradmin", + }, { + input: "savepoint a", + }, { + input: "savepoint `@@@;a`", + }, { + input: "rollback to a", + }, { + input: "rollback to `@@@;a`", + }, { + input: "rollback work to a", + output: "rollback to a", + }, { + input: "rollback to savepoint a", + output: "rollback to a", + }, { + input: "rollback work to savepoint a", + output: "rollback to a", + }, { + input: "release savepoint a", + }, { + input: "release savepoint `@@@;a`", }} ) diff --git a/go/vt/sqlparser/rewriter.go b/go/vt/sqlparser/rewriter.go index 79227efaa06..0ecde3dc1de 100644 --- a/go/vt/sqlparser/rewriter.go +++ b/go/vt/sqlparser/rewriter.go @@ -515,6 +515,18 @@ func replaceRangeCondTo(newNode, parent SQLNode) { parent.(*RangeCond).To = newNode.(Expr) } +func replaceReleaseName(newNode, parent SQLNode) { + parent.(*Release).Name = newNode.(ColIdent) +} + +func replaceSRollbackName(newNode, parent SQLNode) { + parent.(*SRollback).Name = newNode.(ColIdent) +} + +func replaceSavepointName(newNode, parent SQLNode) { + parent.(*Savepoint).Name = newNode.(ColIdent) +} + func replaceSelectComments(newNode, parent SQLNode) { parent.(*Select).Comments = newNode.(Comments) } @@ -1159,10 +1171,19 @@ func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { case ReferenceAction: + case *Release: + a.apply(node, n.Name, replaceReleaseName) + case *Rollback: case *SQLVal: + case *SRollback: + a.apply(node, n.Name, replaceSRollbackName) + + case *Savepoint: + a.apply(node, n.Name, replaceSavepointName) + case *Select: a.apply(node, n.Comments, replaceSelectComments) a.apply(node, n.From, replaceSelectFrom) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 769f50009d5..2cbf0bdbf6b 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -265,189 +265,192 @@ const START = 57498 const TRANSACTION = 57499 const COMMIT = 57500 const ROLLBACK = 57501 -const BIT = 57502 -const TINYINT = 57503 -const SMALLINT = 57504 -const MEDIUMINT = 57505 -const INT = 57506 -const INTEGER = 57507 -const BIGINT = 57508 -const INTNUM = 57509 -const REAL = 57510 -const DOUBLE = 57511 -const FLOAT_TYPE = 57512 -const DECIMAL = 57513 -const NUMERIC = 57514 -const TIME = 57515 -const TIMESTAMP = 57516 -const DATETIME = 57517 -const YEAR = 57518 -const CHAR = 57519 -const VARCHAR = 57520 -const BOOL = 57521 -const CHARACTER = 57522 -const VARBINARY = 57523 -const NCHAR = 57524 -const TEXT = 57525 -const TINYTEXT = 57526 -const MEDIUMTEXT = 57527 -const LONGTEXT = 57528 -const BLOB = 57529 -const TINYBLOB = 57530 -const MEDIUMBLOB = 57531 -const LONGBLOB = 57532 -const JSON = 57533 -const ENUM = 57534 -const GEOMETRY = 57535 -const POINT = 57536 -const LINESTRING = 57537 -const POLYGON = 57538 -const GEOMETRYCOLLECTION = 57539 -const MULTIPOINT = 57540 -const MULTILINESTRING = 57541 -const MULTIPOLYGON = 57542 -const NULLX = 57543 -const AUTO_INCREMENT = 57544 -const APPROXNUM = 57545 -const SIGNED = 57546 -const UNSIGNED = 57547 -const ZEROFILL = 57548 -const COLLATION = 57549 -const DATABASES = 57550 -const TABLES = 57551 -const VITESS_METADATA = 57552 -const VSCHEMA = 57553 -const FULL = 57554 -const PROCESSLIST = 57555 -const COLUMNS = 57556 -const FIELDS = 57557 -const ENGINES = 57558 -const PLUGINS = 57559 -const EXTENDED = 57560 -const NAMES = 57561 -const CHARSET = 57562 -const GLOBAL = 57563 -const SESSION = 57564 -const ISOLATION = 57565 -const LEVEL = 57566 -const READ = 57567 -const WRITE = 57568 -const ONLY = 57569 -const REPEATABLE = 57570 -const COMMITTED = 57571 -const UNCOMMITTED = 57572 -const SERIALIZABLE = 57573 -const CURRENT_TIMESTAMP = 57574 -const DATABASE = 57575 -const CURRENT_DATE = 57576 -const CURRENT_TIME = 57577 -const LOCALTIME = 57578 -const LOCALTIMESTAMP = 57579 -const UTC_DATE = 57580 -const UTC_TIME = 57581 -const UTC_TIMESTAMP = 57582 -const REPLACE = 57583 -const CONVERT = 57584 -const CAST = 57585 -const SUBSTR = 57586 -const SUBSTRING = 57587 -const GROUP_CONCAT = 57588 -const SEPARATOR = 57589 -const TIMESTAMPADD = 57590 -const TIMESTAMPDIFF = 57591 -const MATCH = 57592 -const AGAINST = 57593 -const BOOLEAN = 57594 -const LANGUAGE = 57595 -const WITH = 57596 -const QUERY = 57597 -const EXPANSION = 57598 -const UNUSED = 57599 -const ARRAY = 57600 -const CUME_DIST = 57601 -const DESCRIPTION = 57602 -const DENSE_RANK = 57603 -const EMPTY = 57604 -const EXCEPT = 57605 -const FIRST_VALUE = 57606 -const GROUPING = 57607 -const GROUPS = 57608 -const JSON_TABLE = 57609 -const LAG = 57610 -const LAST_VALUE = 57611 -const LATERAL = 57612 -const LEAD = 57613 -const MEMBER = 57614 -const NTH_VALUE = 57615 -const NTILE = 57616 -const OF = 57617 -const OVER = 57618 -const PERCENT_RANK = 57619 -const RANK = 57620 -const RECURSIVE = 57621 -const ROW_NUMBER = 57622 -const SYSTEM = 57623 -const WINDOW = 57624 -const ACTIVE = 57625 -const ADMIN = 57626 -const BUCKETS = 57627 -const CLONE = 57628 -const COMPONENT = 57629 -const DEFINITION = 57630 -const ENFORCED = 57631 -const EXCLUDE = 57632 -const FOLLOWING = 57633 -const GEOMCOLLECTION = 57634 -const GET_MASTER_PUBLIC_KEY = 57635 -const HISTOGRAM = 57636 -const HISTORY = 57637 -const INACTIVE = 57638 -const INVISIBLE = 57639 -const LOCKED = 57640 -const MASTER_COMPRESSION_ALGORITHMS = 57641 -const MASTER_PUBLIC_KEY_PATH = 57642 -const MASTER_TLS_CIPHERSUITES = 57643 -const MASTER_ZSTD_COMPRESSION_LEVEL = 57644 -const NESTED = 57645 -const NETWORK_NAMESPACE = 57646 -const NOWAIT = 57647 -const NULLS = 57648 -const OJ = 57649 -const OLD = 57650 -const OPTIONAL = 57651 -const ORDINALITY = 57652 -const ORGANIZATION = 57653 -const OTHERS = 57654 -const PATH = 57655 -const PERSIST = 57656 -const PERSIST_ONLY = 57657 -const PRECEDING = 57658 -const PRIVILEGE_CHECKS_USER = 57659 -const PROCESS = 57660 -const RANDOM = 57661 -const REFERENCE = 57662 -const REQUIRE_ROW_FORMAT = 57663 -const RESOURCE = 57664 -const RESPECT = 57665 -const RESTART = 57666 -const RETAIN = 57667 -const REUSE = 57668 -const ROLE = 57669 -const SECONDARY = 57670 -const SECONDARY_ENGINE = 57671 -const SECONDARY_LOAD = 57672 -const SECONDARY_UNLOAD = 57673 -const SKIP = 57674 -const SRID = 57675 -const THREAD_PRIORITY = 57676 -const TIES = 57677 -const UNBOUNDED = 57678 -const VCPU = 57679 -const VISIBLE = 57680 -const FORMAT = 57681 -const TREE = 57682 -const VITESS = 57683 -const TRADITIONAL = 57684 +const SAVEPOINT = 57502 +const RELEASE = 57503 +const WORK = 57504 +const BIT = 57505 +const TINYINT = 57506 +const SMALLINT = 57507 +const MEDIUMINT = 57508 +const INT = 57509 +const INTEGER = 57510 +const BIGINT = 57511 +const INTNUM = 57512 +const REAL = 57513 +const DOUBLE = 57514 +const FLOAT_TYPE = 57515 +const DECIMAL = 57516 +const NUMERIC = 57517 +const TIME = 57518 +const TIMESTAMP = 57519 +const DATETIME = 57520 +const YEAR = 57521 +const CHAR = 57522 +const VARCHAR = 57523 +const BOOL = 57524 +const CHARACTER = 57525 +const VARBINARY = 57526 +const NCHAR = 57527 +const TEXT = 57528 +const TINYTEXT = 57529 +const MEDIUMTEXT = 57530 +const LONGTEXT = 57531 +const BLOB = 57532 +const TINYBLOB = 57533 +const MEDIUMBLOB = 57534 +const LONGBLOB = 57535 +const JSON = 57536 +const ENUM = 57537 +const GEOMETRY = 57538 +const POINT = 57539 +const LINESTRING = 57540 +const POLYGON = 57541 +const GEOMETRYCOLLECTION = 57542 +const MULTIPOINT = 57543 +const MULTILINESTRING = 57544 +const MULTIPOLYGON = 57545 +const NULLX = 57546 +const AUTO_INCREMENT = 57547 +const APPROXNUM = 57548 +const SIGNED = 57549 +const UNSIGNED = 57550 +const ZEROFILL = 57551 +const COLLATION = 57552 +const DATABASES = 57553 +const TABLES = 57554 +const VITESS_METADATA = 57555 +const VSCHEMA = 57556 +const FULL = 57557 +const PROCESSLIST = 57558 +const COLUMNS = 57559 +const FIELDS = 57560 +const ENGINES = 57561 +const PLUGINS = 57562 +const EXTENDED = 57563 +const NAMES = 57564 +const CHARSET = 57565 +const GLOBAL = 57566 +const SESSION = 57567 +const ISOLATION = 57568 +const LEVEL = 57569 +const READ = 57570 +const WRITE = 57571 +const ONLY = 57572 +const REPEATABLE = 57573 +const COMMITTED = 57574 +const UNCOMMITTED = 57575 +const SERIALIZABLE = 57576 +const CURRENT_TIMESTAMP = 57577 +const DATABASE = 57578 +const CURRENT_DATE = 57579 +const CURRENT_TIME = 57580 +const LOCALTIME = 57581 +const LOCALTIMESTAMP = 57582 +const UTC_DATE = 57583 +const UTC_TIME = 57584 +const UTC_TIMESTAMP = 57585 +const REPLACE = 57586 +const CONVERT = 57587 +const CAST = 57588 +const SUBSTR = 57589 +const SUBSTRING = 57590 +const GROUP_CONCAT = 57591 +const SEPARATOR = 57592 +const TIMESTAMPADD = 57593 +const TIMESTAMPDIFF = 57594 +const MATCH = 57595 +const AGAINST = 57596 +const BOOLEAN = 57597 +const LANGUAGE = 57598 +const WITH = 57599 +const QUERY = 57600 +const EXPANSION = 57601 +const UNUSED = 57602 +const ARRAY = 57603 +const CUME_DIST = 57604 +const DESCRIPTION = 57605 +const DENSE_RANK = 57606 +const EMPTY = 57607 +const EXCEPT = 57608 +const FIRST_VALUE = 57609 +const GROUPING = 57610 +const GROUPS = 57611 +const JSON_TABLE = 57612 +const LAG = 57613 +const LAST_VALUE = 57614 +const LATERAL = 57615 +const LEAD = 57616 +const MEMBER = 57617 +const NTH_VALUE = 57618 +const NTILE = 57619 +const OF = 57620 +const OVER = 57621 +const PERCENT_RANK = 57622 +const RANK = 57623 +const RECURSIVE = 57624 +const ROW_NUMBER = 57625 +const SYSTEM = 57626 +const WINDOW = 57627 +const ACTIVE = 57628 +const ADMIN = 57629 +const BUCKETS = 57630 +const CLONE = 57631 +const COMPONENT = 57632 +const DEFINITION = 57633 +const ENFORCED = 57634 +const EXCLUDE = 57635 +const FOLLOWING = 57636 +const GEOMCOLLECTION = 57637 +const GET_MASTER_PUBLIC_KEY = 57638 +const HISTOGRAM = 57639 +const HISTORY = 57640 +const INACTIVE = 57641 +const INVISIBLE = 57642 +const LOCKED = 57643 +const MASTER_COMPRESSION_ALGORITHMS = 57644 +const MASTER_PUBLIC_KEY_PATH = 57645 +const MASTER_TLS_CIPHERSUITES = 57646 +const MASTER_ZSTD_COMPRESSION_LEVEL = 57647 +const NESTED = 57648 +const NETWORK_NAMESPACE = 57649 +const NOWAIT = 57650 +const NULLS = 57651 +const OJ = 57652 +const OLD = 57653 +const OPTIONAL = 57654 +const ORDINALITY = 57655 +const ORGANIZATION = 57656 +const OTHERS = 57657 +const PATH = 57658 +const PERSIST = 57659 +const PERSIST_ONLY = 57660 +const PRECEDING = 57661 +const PRIVILEGE_CHECKS_USER = 57662 +const PROCESS = 57663 +const RANDOM = 57664 +const REFERENCE = 57665 +const REQUIRE_ROW_FORMAT = 57666 +const RESOURCE = 57667 +const RESPECT = 57668 +const RESTART = 57669 +const RETAIN = 57670 +const REUSE = 57671 +const ROLE = 57672 +const SECONDARY = 57673 +const SECONDARY_ENGINE = 57674 +const SECONDARY_LOAD = 57675 +const SECONDARY_UNLOAD = 57676 +const SKIP = 57677 +const SRID = 57678 +const THREAD_PRIORITY = 57679 +const TIES = 57680 +const UNBOUNDED = 57681 +const VCPU = 57682 +const VISIBLE = 57683 +const FORMAT = 57684 +const TREE = 57685 +const VITESS = 57686 +const TRADITIONAL = 57687 var yyToknames = [...]string{ "$end", @@ -626,6 +629,9 @@ var yyToknames = [...]string{ "TRANSACTION", "COMMIT", "ROLLBACK", + "SAVEPOINT", + "RELEASE", + "WORK", "BIT", "TINYINT", "SMALLINT", @@ -822,1821 +828,1779 @@ var yyExca = [...]int{ -1, 1, 1, -1, -2, 0, - -1, 40, - 33, 303, - 131, 303, - 143, 303, - 168, 317, - 169, 317, - -2, 305, - -1, 66, - 38, 356, - -2, 364, - -1, 377, - 119, 686, - -2, 682, - -1, 378, - 119, 687, - -2, 683, - -1, 392, - 38, 357, - -2, 369, - -1, 393, - 38, 358, - -2, 370, - -1, 416, - 87, 938, - -2, 70, - -1, 417, - 87, 854, - -2, 71, - -1, 422, - 87, 822, - -2, 648, + -1, 42, + 33, 305, + 131, 305, + 143, 305, + 168, 319, + 169, 319, + -2, 307, + -1, 47, + 133, 329, + -2, 327, + -1, 70, + 38, 365, + -2, 373, + -1, 385, + 119, 695, + -2, 691, + -1, 386, + 119, 696, + -2, 692, + -1, 400, + 38, 366, + -2, 378, + -1, 401, + 38, 367, + -2, 379, -1, 424, - 87, 885, - -2, 650, - -1, 740, - 56, 52, - 58, 52, - -2, 56, - -1, 914, - 119, 689, - -2, 685, - -1, 1341, - 5, 607, - 17, 607, - 19, 607, - 31, 607, - 59, 607, - -2, 395, + 87, 947, + -2, 72, + -1, 425, + 87, 863, + -2, 73, + -1, 430, + 87, 831, + -2, 657, + -1, 432, + 87, 894, + -2, 659, + -1, 750, + 56, 54, + 58, 54, + -2, 58, + -1, 926, + 119, 698, + -2, 694, + -1, 1354, + 5, 616, + 17, 616, + 19, 616, + 31, 616, + 59, 616, + -2, 404, } const yyPrivate = 57344 -const yyLast = 17461 +const yyLast = 17015 var yyAct = [...]int{ - 377, 1580, 1570, 1380, 1537, 1268, 1019, 321, 1173, 1453, - 1486, 1321, 1193, 992, 1174, 336, 1354, 385, 350, 65, - 3, 1042, 1322, 1318, 707, 1028, 1048, 1062, 576, 668, - 1333, 1327, 1018, 1219, 1287, 85, 1015, 901, 1440, 276, - 839, 296, 276, 421, 1112, 739, 858, 276, 1245, 1032, - 908, 307, 1161, 753, 994, 1236, 989, 978, 734, 714, - 394, 733, 323, 712, 717, 934, 878, 410, 379, 415, - 545, 407, 276, 85, 25, 971, 546, 276, 1058, 276, - 319, 724, 312, 742, 274, 63, 61, 752, 60, 682, - 865, 7, 303, 6, 5, 1573, 66, 1557, 1568, 681, - 308, 1081, 362, 311, 368, 369, 366, 367, 365, 364, - 363, 585, 565, 1545, 1565, 1080, 1381, 409, 370, 371, - 1556, 1544, 547, 1304, 549, 68, 69, 70, 71, 72, - 1410, 550, 1348, 400, 1349, 1350, 380, 272, 268, 269, - 270, 1010, 1011, 754, 310, 755, 87, 88, 89, 87, - 88, 89, 27, 1009, 54, 30, 31, 1079, 264, 1207, - 309, 262, 1206, 266, 587, 1208, 600, 1227, 1041, 1270, - 601, 598, 599, 605, 1443, 87, 88, 89, 1049, 1401, - 911, 1512, 630, 629, 639, 640, 632, 633, 634, 635, - 636, 637, 638, 631, 1399, 302, 641, 828, 593, 594, - 603, 1272, 825, 53, 1567, 1564, 827, 1538, 1267, 1076, - 1073, 1074, 972, 1072, 1584, 1530, 590, 1033, 1588, 582, - 566, 584, 1271, 552, 27, 28, 54, 30, 31, 266, - 1487, 1273, 604, 832, 1035, 816, 1344, 418, 829, 866, - 867, 868, 826, 58, 1495, 1489, 1083, 1086, 32, 49, - 50, 1343, 52, 581, 583, 1264, 1342, 265, 271, 548, - 1035, 1266, 555, 276, 557, 558, 279, 267, 276, 1093, - 567, 41, 1092, 1519, 276, 53, 1423, 1194, 1196, 263, - 276, 574, 1203, 1078, 580, 85, 653, 654, 1166, 85, - 1141, 85, 87, 88, 89, 1120, 748, 85, 728, 666, - 1131, 572, 939, 631, 85, 1077, 641, 1016, 556, 641, - 951, 1005, 1049, 564, 589, 1488, 1035, 619, 75, 571, - 562, 863, 621, 1128, 611, 573, 591, 1528, 1504, 1582, - 859, 1331, 1583, 621, 1581, 853, 1288, 1034, 1543, 579, - 34, 35, 37, 36, 39, 1082, 51, 786, 87, 88, - 89, 756, 1496, 1494, 578, 1513, 76, 1126, 1195, 1125, - 1084, 616, 617, 1034, 1265, 615, 1263, 1306, 388, 40, - 57, 56, 818, 935, 47, 48, 38, 1290, 620, 619, - 935, 651, 1138, 568, 569, 570, 1225, 559, 721, 560, - 42, 43, 561, 44, 45, 621, 614, 1533, 612, 613, - 592, 705, 595, 85, 55, 276, 276, 276, 606, 653, - 654, 1292, 1038, 1296, 85, 1291, 860, 1289, 1039, 1034, - 85, 854, 1294, 1548, 1031, 1029, 669, 1030, 1449, 1448, - 774, 1293, 653, 654, 1027, 1033, 1589, 577, 1550, 704, - 87, 88, 89, 1240, 1295, 1297, 1105, 1106, 1107, 1239, - 731, 1228, 740, 685, 687, 718, 691, 693, 885, 696, - 620, 619, 732, 684, 686, 688, 690, 692, 694, 695, - 1529, 787, 883, 884, 882, 544, 55, 621, 741, 706, - 1590, 1466, 551, 751, 1446, 634, 635, 636, 637, 638, - 631, 1237, 746, 641, 800, 803, 804, 805, 806, 807, - 808, 1103, 809, 810, 811, 812, 813, 788, 789, 790, - 791, 772, 773, 801, 844, 775, 389, 776, 777, 778, - 779, 780, 781, 782, 783, 784, 785, 792, 793, 794, - 795, 796, 797, 798, 799, 639, 640, 632, 633, 634, - 635, 636, 637, 638, 631, 276, 1501, 641, 1500, 814, - 85, 1363, 817, 1036, 819, 276, 276, 85, 85, 85, - 87, 88, 89, 276, 553, 554, 276, 53, 53, 276, - 837, 838, 716, 276, 261, 85, 1127, 1330, 418, 881, - 85, 85, 85, 276, 85, 85, 802, 87, 88, 89, - 764, 903, 620, 619, 85, 85, 956, 957, 1419, 1308, - 820, 821, 1492, 1566, 843, 87, 88, 89, 830, 621, - 618, 409, 1319, 1367, 836, 1330, 841, 629, 639, 640, - 632, 633, 634, 635, 636, 637, 638, 631, 849, 1503, - 641, 620, 619, 873, 875, 876, 999, 833, 743, 874, - 62, 953, 902, 879, 404, 405, 1552, 389, 621, 620, - 619, 904, 632, 633, 634, 635, 636, 637, 638, 631, - 1371, 815, 641, 1492, 1541, 85, 621, 975, 822, 823, - 824, 1492, 389, 1492, 1520, 339, 338, 341, 342, 343, - 344, 952, 923, 926, 340, 345, 842, 880, 936, 1492, - 1491, 846, 847, 848, 389, 850, 851, 1211, 85, 85, - 620, 619, 1438, 1437, 1008, 855, 856, 913, 1425, 389, - 914, 87, 88, 89, 64, 1210, 85, 621, 1422, 389, - 1373, 1372, 948, 276, 1369, 1370, 85, 669, 1162, 918, - 965, 276, 958, 974, 905, 906, 1369, 1368, 1144, 276, - 276, 964, 389, 276, 276, 975, 389, 276, 276, 276, - 85, 944, 945, 744, 915, 618, 389, 964, 990, 763, - 762, 975, 1162, 85, 546, 1143, 964, 743, 967, 970, - 382, 954, 914, 831, 975, 316, 973, 964, 744, 966, - 980, 983, 984, 985, 981, 749, 982, 986, 27, 1001, - 1334, 1335, 841, 1558, 1044, 1045, 1046, 1047, 745, 1000, - 747, 1455, 1043, 1002, 1050, 1051, 1052, 968, 1330, 1430, - 1055, 1056, 1057, 1063, 1255, 1003, 998, 276, 85, 1006, - 85, 53, 1085, 745, 1269, 743, 276, 276, 276, 276, - 276, 912, 276, 276, 1023, 1359, 276, 85, 1007, 53, - 27, 1064, 1334, 1335, 1575, 1214, 1251, 1252, 1253, 27, - 1059, 919, 920, 276, 1054, 925, 928, 929, 276, 1053, - 276, 276, 1067, 1456, 1168, 276, 1066, 1571, 1361, 1337, - 1169, 1087, 1088, 1089, 1090, 1091, 1319, 1094, 1095, 1473, - 943, 1096, 1241, 946, 947, 864, 835, 1100, 1151, 1060, - 1061, 53, 1185, 912, 1183, 378, 1340, 1186, 1098, 1184, - 53, 879, 1339, 1099, 1182, 980, 983, 984, 985, 981, - 1104, 982, 986, 1187, 418, 984, 985, 1254, 1181, 1562, - 1555, 1312, 1259, 1256, 1247, 1257, 1250, 1020, 1246, 1068, - 86, 1070, 1248, 1249, 277, 715, 1122, 277, 1560, 1160, - 1159, 1232, 277, 761, 575, 880, 1258, 1224, 1097, 1108, - 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, - 638, 631, 1535, 1534, 641, 1471, 276, 277, 86, 1222, - 916, 917, 277, 1150, 277, 931, 276, 276, 276, 276, - 276, 395, 1175, 1155, 1121, 708, 1216, 1451, 276, 932, - 380, 1170, 276, 1069, 1417, 396, 276, 709, 834, 1137, - 276, 988, 719, 720, 398, 1158, 397, 1113, 949, 383, - 384, 1192, 386, 1157, 1416, 1415, 387, 1209, 1154, 85, - 395, 64, 1164, 1315, 1162, 1212, 602, 1165, 1215, 1163, - 1577, 1576, 1220, 1220, 396, 1177, 1178, 1176, 1180, 1132, - 1179, 392, 393, 398, 1188, 397, 1129, 857, 722, 1407, - 1198, 1199, 1577, 1201, 1517, 1202, 1200, 1444, 950, 382, - 62, 67, 1204, 59, 1, 1569, 1221, 85, 85, 1382, - 1452, 1229, 1230, 1075, 1536, 1485, 1353, 1026, 1017, 74, - 1217, 1218, 543, 73, 1527, 1231, 852, 1233, 1234, 1235, - 1117, 1118, 588, 1025, 1024, 1493, 1442, 85, 1037, 1226, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, - 1238, 1135, 1040, 1360, 1223, 1532, 769, 767, 768, 766, - 771, 85, 1260, 1244, 770, 765, 289, 902, 630, 629, - 639, 640, 632, 633, 634, 635, 636, 637, 638, 631, - 413, 987, 641, 757, 1065, 1275, 1276, 1286, 723, 77, - 1262, 1261, 1071, 862, 1277, 286, 596, 276, 277, 597, - 291, 649, 1299, 277, 1298, 1156, 1205, 85, 419, 277, - 1283, 412, 85, 85, 1325, 277, 1175, 1320, 955, 1243, - 86, 1285, 913, 1020, 86, 914, 86, 711, 1323, 1414, - 1314, 1136, 86, 678, 933, 1305, 737, 322, 85, 86, - 872, 337, 1313, 334, 335, 959, 1167, 1115, 1274, 623, - 1338, 1116, 85, 320, 85, 85, 314, 736, 1220, 1220, - 1352, 729, 1123, 1124, 979, 977, 1329, 976, 1130, 1345, - 408, 1133, 1134, 1366, 1336, 1332, 735, 963, 391, 1140, - 1409, 1356, 276, 1142, 1351, 1511, 1145, 1146, 1147, 1148, - 1149, 1357, 1358, 1347, 390, 930, 46, 607, 304, 1346, - 29, 399, 276, 20, 19, 18, 1364, 1365, 85, 22, - 1383, 85, 85, 85, 276, 17, 16, 15, 563, 33, - 24, 23, 14, 13, 12, 1284, 11, 1374, 10, 9, - 8, 4, 1190, 1191, 610, 21, 667, 1375, 86, 2, - 277, 277, 277, 1392, 1388, 1389, 1309, 1377, 0, 86, - 1394, 1395, 1376, 1396, 1378, 86, 1398, 0, 1400, 1387, - 1397, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1284, 0, 0, 0, 0, 0, 0, 1175, 0, - 0, 0, 0, 0, 1418, 1427, 0, 0, 0, 0, - 0, 0, 85, 0, 0, 0, 0, 0, 1212, 0, - 85, 0, 0, 0, 1436, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 85, 1020, 1439, 1020, 0, - 0, 0, 85, 0, 0, 0, 0, 0, 0, 1426, - 0, 0, 0, 0, 0, 1445, 1459, 1447, 0, 877, - 0, 0, 886, 887, 888, 889, 890, 891, 892, 893, - 894, 895, 896, 897, 898, 899, 900, 1457, 0, 0, - 1281, 1282, 1458, 85, 85, 0, 85, 1465, 0, 0, - 0, 85, 0, 85, 85, 85, 276, 0, 1323, 85, - 277, 1474, 1472, 0, 1478, 86, 1470, 0, 0, 1484, - 277, 277, 86, 86, 86, 1490, 85, 276, 277, 940, - 1497, 277, 0, 0, 277, 0, 0, 0, 277, 1479, - 86, 1480, 1482, 1483, 0, 86, 86, 86, 277, 86, - 86, 0, 1498, 0, 1499, 1518, 1450, 0, 1526, 86, - 86, 0, 1323, 85, 1505, 1341, 1525, 1524, 0, 0, - 0, 0, 1506, 0, 85, 85, 0, 0, 0, 0, - 0, 1540, 0, 1539, 0, 0, 1020, 0, 0, 0, - 85, 0, 0, 0, 0, 1175, 1546, 0, 0, 0, - 0, 276, 0, 0, 0, 0, 0, 0, 0, 85, - 0, 0, 0, 0, 0, 0, 1454, 1554, 0, 0, - 0, 402, 0, 0, 0, 0, 0, 1559, 1561, 85, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1574, 0, 0, 0, 1549, 0, 0, 1585, - 0, 0, 0, 0, 0, 0, 1391, 0, 0, 0, - 1393, 0, 0, 86, 86, 0, 0, 1563, 0, 0, - 0, 1402, 1403, 0, 313, 0, 0, 0, 0, 0, - 0, 86, 0, 0, 0, 0, 0, 0, 277, 0, - 0, 86, 0, 0, 0, 0, 277, 1420, 1421, 0, - 1424, 0, 0, 0, 277, 277, 0, 0, 277, 277, - 0, 0, 277, 277, 277, 86, 0, 0, 1435, 0, - 0, 0, 0, 0, 0, 351, 26, 1406, 86, 1109, - 1110, 1111, 0, 0, 0, 0, 0, 0, 1454, 1020, - 0, 0, 0, 0, 0, 625, 0, 628, 0, 0, - 0, 0, 26, 642, 643, 644, 645, 646, 647, 648, - 0, 626, 627, 624, 630, 629, 639, 640, 632, 633, - 634, 635, 636, 637, 638, 631, 0, 0, 641, 0, - 0, 0, 277, 86, 0, 86, 0, 381, 0, 0, - 0, 277, 277, 277, 277, 277, 0, 277, 277, 0, - 0, 277, 86, 0, 0, 1481, 630, 629, 639, 640, - 632, 633, 634, 635, 636, 637, 638, 631, 277, 389, - 641, 0, 0, 277, 0, 277, 277, 0, 0, 0, - 277, 0, 0, 1507, 1508, 1509, 1510, 0, 1514, 0, - 1515, 1516, 0, 0, 0, 1413, 0, 0, 0, 0, - 0, 0, 0, 1521, 0, 1522, 1523, 0, 630, 629, - 639, 640, 632, 633, 634, 635, 636, 637, 638, 631, - 1412, 0, 641, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1542, 630, 629, 639, 640, 632, - 633, 634, 635, 636, 637, 638, 631, 0, 0, 641, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1551, - 630, 629, 639, 640, 632, 633, 634, 635, 636, 637, - 638, 631, 0, 0, 641, 0, 0, 0, 0, 0, - 0, 277, 0, 0, 0, 0, 0, 622, 0, 0, - 0, 277, 277, 277, 277, 277, 0, 0, 0, 0, - 0, 1586, 1587, 277, 0, 0, 0, 277, 0, 1279, - 1280, 277, 0, 0, 0, 277, 0, 0, 0, 0, - 0, 1278, 0, 313, 1300, 1301, 0, 1302, 1303, 0, - 0, 0, 679, 348, 86, 0, 0, 0, 0, 1310, - 1311, 630, 629, 639, 640, 632, 633, 634, 635, 636, - 637, 638, 631, 0, 0, 641, 0, 0, 710, 713, - 586, 0, 0, 0, 586, 0, 586, 0, 84, 0, - 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, - 26, 0, 86, 86, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 650, 652, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, - 1405, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 1362, 0, 0, 0, 665, 0, 0, 0, 670, 671, - 672, 673, 674, 675, 676, 677, 86, 680, 683, 683, - 683, 689, 683, 683, 689, 683, 697, 698, 699, 700, - 701, 702, 703, 1404, 0, 0, 0, 26, 0, 630, - 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, - 631, 0, 277, 641, 1390, 0, 0, 0, 0, 0, - 0, 738, 86, 0, 0, 0, 0, 86, 86, 630, - 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, - 631, 0, 0, 641, 0, 0, 0, 0, 0, 87, - 88, 89, 0, 86, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86, 0, 86, - 86, 0, 630, 629, 639, 640, 632, 633, 634, 635, - 636, 637, 638, 631, 0, 0, 641, 0, 0, 0, - 845, 0, 0, 0, 0, 0, 0, 277, 0, 0, - 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, - 0, 283, 0, 0, 861, 0, 0, 277, 0, 290, - 0, 0, 0, 86, 0, 0, 86, 86, 86, 277, - 869, 870, 871, 0, 0, 0, 0, 0, 0, 0, - 1460, 1461, 1462, 1463, 1464, 0, 0, 0, 1467, 1468, - 0, 0, 0, 288, 0, 0, 0, 0, 420, 295, - 0, 0, 420, 0, 420, 586, 0, 0, 0, 0, - 420, 0, 586, 586, 586, 0, 0, 608, 0, 0, - 0, 0, 0, 0, 921, 922, 281, 0, 0, 0, - 586, 0, 0, 0, 0, 586, 586, 586, 0, 586, - 586, 0, 0, 0, 0, 0, 0, 86, 0, 586, - 586, 0, 0, 292, 284, 86, 293, 294, 300, 1114, - 0, 0, 285, 287, 297, 0, 282, 299, 298, 0, - 86, 0, 0, 0, 0, 0, 0, 86, 0, 630, - 629, 639, 640, 632, 633, 634, 635, 636, 637, 638, - 631, 0, 0, 641, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1014, 0, - 0, 0, 0, 0, 0, 0, 726, 0, 86, 86, - 0, 86, 0, 0, 0, 0, 86, 420, 86, 86, - 86, 277, 0, 758, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1578, 0, - 0, 86, 277, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 0, 0, 0, 991, 0, 0, 0, 738, 86, - 86, 0, 738, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, - 420, 420, 420, 586, 0, 586, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1139, 420, 0, - 0, 0, 586, 420, 420, 420, 0, 420, 420, 0, - 0, 0, 0, 0, 1152, 1153, 713, 420, 420, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1119, 0, - 0, 381, 0, 0, 0, 0, 0, 0, 907, 0, - 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 941, 942, 0, 0, 0, 0, 0, 0, 0, - 0, 738, 0, 0, 0, 0, 0, 1171, 1172, 960, - 0, 738, 738, 738, 738, 738, 0, 0, 0, 726, - 0, 0, 420, 0, 0, 0, 0, 991, 0, 1197, - 0, 0, 0, 349, 0, 738, 0, 0, 0, 0, - 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1307, 0, 275, 0, 0, 301, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1316, 0, 0, 0, 0, 0, - 0, 0, 403, 586, 0, 411, 0, 0, 0, 0, - 275, 420, 275, 420, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 420, 0, 586, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1324, 0, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1411, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, - 0, 0, 0, 1428, 0, 0, 1429, 0, 937, 1431, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 275, 0, 0, 0, 0, 0, 275, 0, 0, - 0, 0, 420, 275, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1408, 0, 0, 0, 0, 0, 0, 1469, 313, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1242, 420, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1432, 1433, - 1434, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 0, 0, 420, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 420, 0, 0, 275, 275, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1324, 0, 26, 0, 0, - 420, 0, 937, 0, 0, 1326, 1328, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1502, 0, 0, - 0, 1328, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 420, 0, 420, 1355, 1324, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1379, 0, 0, 1384, 1385, 1386, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 275, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 275, - 0, 0, 275, 1572, 0, 0, 840, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, - 0, 0, 0, 1441, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, - 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, - 840, 0, 0, 0, 403, 403, 0, 0, 403, 403, - 403, 0, 0, 0, 938, 0, 1475, 1476, 0, 1477, - 0, 0, 0, 0, 1441, 0, 1441, 1441, 1441, 0, - 0, 0, 1355, 403, 403, 403, 403, 403, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1441, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 840, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 275, 996, 0, 0, 275, 275, 0, 0, - 275, 1004, 840, 0, 0, 0, 1531, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 420, 420, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 937, 0, 1547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1553, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 1441, 0, 0, 0, 0, 0, 0, 275, - 275, 275, 275, 275, 0, 275, 275, 0, 0, 275, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 275, 0, 1101, 1102, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 403, 403, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 403, 275, - 0, 0, 0, 0, 0, 0, 0, 0, 938, 275, - 275, 275, 275, 275, 0, 0, 0, 0, 0, 0, - 0, 1189, 0, 0, 0, 275, 0, 0, 0, 996, - 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 840, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 938, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 996, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 530, 518, 0, - 475, 533, 448, 465, 541, 466, 469, 506, 433, 488, - 175, 463, 0, 452, 428, 459, 429, 450, 477, 119, - 481, 447, 520, 491, 532, 147, 0, 453, 539, 149, - 497, 0, 222, 163, 0, 0, 0, 479, 522, 486, - 515, 474, 507, 438, 496, 534, 464, 504, 535, 0, - 0, 938, 87, 88, 89, 0, 1021, 1022, 0, 0, - 0, 0, 0, 109, 275, 501, 529, 461, 503, 505, - 427, 498, 0, 431, 434, 540, 525, 456, 457, 1213, - 0, 0, 0, 0, 0, 0, 478, 487, 512, 472, - 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, - 495, 0, 0, 0, 435, 432, 0, 0, 0, 0, - 476, 0, 0, 0, 437, 0, 455, 513, 0, 425, - 128, 517, 524, 473, 278, 528, 471, 470, 531, 194, - 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 202, 206, 521, 451, 460, 113, 458, 204, 182, - 242, 494, 184, 203, 150, 232, 195, 241, 251, 252, - 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, - 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, - 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, - 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 430, 0, 223, 245, 260, 107, 446, 230, 254, - 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, - 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, - 221, 442, 445, 440, 441, 489, 490, 536, 537, 538, - 514, 436, 0, 443, 444, 0, 519, 526, 527, 493, - 90, 99, 148, 257, 197, 124, 246, 426, 439, 117, - 449, 0, 0, 462, 467, 468, 480, 482, 483, 484, - 485, 492, 499, 500, 502, 508, 509, 510, 511, 516, - 523, 542, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, - 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, - 218, 224, 227, 233, 234, 243, 250, 253, 530, 518, - 0, 475, 533, 448, 465, 541, 466, 469, 506, 433, - 488, 175, 463, 0, 452, 428, 459, 429, 450, 477, - 119, 481, 447, 520, 491, 532, 147, 0, 453, 539, - 149, 497, 0, 222, 163, 0, 0, 0, 479, 522, - 486, 515, 474, 507, 438, 496, 534, 464, 504, 535, - 0, 0, 0, 87, 88, 89, 0, 1021, 1022, 0, - 0, 0, 0, 0, 109, 0, 501, 529, 461, 503, - 505, 427, 498, 0, 431, 434, 540, 525, 456, 457, - 0, 0, 0, 0, 0, 0, 0, 478, 487, 512, - 472, 0, 0, 0, 0, 0, 0, 0, 0, 454, - 0, 495, 0, 0, 0, 435, 432, 0, 0, 0, - 0, 476, 0, 0, 0, 437, 0, 455, 513, 0, - 425, 128, 517, 524, 473, 278, 528, 471, 470, 531, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 521, 451, 460, 113, 458, 204, - 182, 242, 494, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 430, 0, 223, 245, 260, 107, 446, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 442, 445, 440, 441, 489, 490, 536, 537, - 538, 514, 436, 0, 443, 444, 0, 519, 526, 527, - 493, 90, 99, 148, 257, 197, 124, 246, 426, 439, - 117, 449, 0, 0, 462, 467, 468, 480, 482, 483, - 484, 485, 492, 499, 500, 502, 508, 509, 510, 511, - 516, 523, 542, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 530, - 518, 0, 475, 533, 448, 465, 541, 466, 469, 506, - 433, 488, 175, 463, 0, 452, 428, 459, 429, 450, - 477, 119, 481, 447, 520, 491, 532, 147, 0, 453, - 539, 149, 497, 0, 222, 163, 0, 0, 0, 479, - 522, 486, 515, 474, 507, 438, 496, 534, 464, 504, - 535, 53, 0, 0, 87, 88, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 501, 529, 461, - 503, 505, 427, 498, 0, 431, 434, 540, 525, 456, - 457, 0, 0, 0, 0, 0, 0, 0, 478, 487, - 512, 472, 0, 0, 0, 0, 0, 0, 0, 0, - 454, 0, 495, 0, 0, 0, 435, 432, 0, 0, - 0, 0, 476, 0, 0, 0, 437, 0, 455, 513, - 0, 425, 128, 517, 524, 473, 278, 528, 471, 470, - 531, 194, 0, 226, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 202, 206, 521, 451, 460, 113, 458, - 204, 182, 242, 494, 184, 203, 150, 232, 195, 241, - 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, - 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, - 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, - 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 430, 0, 223, 245, 260, 107, 446, - 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, - 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, - 111, 244, 221, 442, 445, 440, 441, 489, 490, 536, - 537, 538, 514, 436, 0, 443, 444, 0, 519, 526, - 527, 493, 90, 99, 148, 257, 197, 124, 246, 426, - 439, 117, 449, 0, 0, 462, 467, 468, 480, 482, - 483, 484, 485, 492, 499, 500, 502, 508, 509, 510, - 511, 516, 523, 542, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, - 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, - 530, 518, 0, 475, 533, 448, 465, 541, 466, 469, - 506, 433, 488, 175, 463, 0, 452, 428, 459, 429, - 450, 477, 119, 481, 447, 520, 491, 532, 147, 0, - 453, 539, 149, 497, 0, 222, 163, 0, 0, 0, - 479, 522, 486, 515, 474, 507, 438, 496, 534, 464, - 504, 535, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 501, 529, - 461, 503, 505, 427, 498, 0, 431, 434, 540, 525, - 456, 457, 0, 0, 0, 0, 0, 0, 0, 478, - 487, 512, 472, 0, 0, 0, 0, 0, 0, 1317, - 0, 454, 0, 495, 0, 0, 0, 435, 432, 0, - 0, 0, 0, 476, 0, 0, 0, 437, 0, 455, - 513, 0, 425, 128, 517, 524, 473, 278, 528, 471, - 470, 531, 194, 0, 226, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 202, 206, 521, 451, 460, 113, - 458, 204, 182, 242, 494, 184, 203, 150, 232, 195, - 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, - 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, - 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, - 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, - 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 430, 0, 223, 245, 260, 107, - 446, 230, 254, 255, 0, 196, 108, 127, 121, 191, - 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, - 205, 111, 244, 221, 442, 445, 440, 441, 489, 490, - 536, 537, 538, 514, 436, 0, 443, 444, 0, 519, - 526, 527, 493, 90, 99, 148, 257, 197, 124, 246, - 426, 439, 117, 449, 0, 0, 462, 467, 468, 480, - 482, 483, 484, 485, 492, 499, 500, 502, 508, 509, - 510, 511, 516, 523, 542, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, - 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, - 253, 530, 518, 0, 475, 533, 448, 465, 541, 466, - 469, 506, 433, 488, 175, 463, 0, 452, 428, 459, - 429, 450, 477, 119, 481, 447, 520, 491, 532, 147, - 0, 453, 539, 149, 497, 0, 222, 163, 0, 0, - 0, 479, 522, 486, 515, 474, 507, 438, 496, 534, - 464, 504, 535, 0, 0, 0, 87, 88, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 0, 501, - 529, 461, 503, 505, 427, 498, 0, 431, 434, 540, - 525, 456, 457, 0, 0, 0, 0, 0, 0, 0, - 478, 487, 512, 472, 0, 0, 0, 0, 0, 0, - 1005, 0, 454, 0, 495, 0, 0, 0, 435, 432, - 0, 0, 0, 0, 476, 0, 0, 0, 437, 0, - 455, 513, 0, 425, 128, 517, 524, 473, 278, 528, - 471, 470, 531, 194, 0, 226, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 202, 206, 521, 451, 460, - 113, 458, 204, 182, 242, 494, 184, 203, 150, 232, - 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, - 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, - 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, - 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, - 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 430, 0, 223, 245, 260, - 107, 446, 230, 254, 255, 0, 196, 108, 127, 121, - 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, - 181, 205, 111, 244, 221, 442, 445, 440, 441, 489, - 490, 536, 537, 538, 514, 436, 0, 443, 444, 0, - 519, 526, 527, 493, 90, 99, 148, 257, 197, 124, - 246, 426, 439, 117, 449, 0, 0, 462, 467, 468, - 480, 482, 483, 484, 485, 492, 499, 500, 502, 508, - 509, 510, 511, 516, 523, 542, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, - 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, - 250, 253, 530, 518, 0, 475, 533, 448, 465, 541, - 466, 469, 506, 433, 488, 175, 463, 0, 452, 428, - 459, 429, 450, 477, 119, 481, 447, 520, 491, 532, - 147, 0, 453, 539, 149, 497, 0, 222, 163, 0, - 0, 0, 479, 522, 486, 515, 474, 507, 438, 496, - 534, 464, 504, 535, 0, 0, 0, 87, 88, 89, - 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, - 501, 529, 461, 503, 505, 427, 498, 0, 431, 434, - 540, 525, 456, 457, 0, 0, 0, 0, 0, 0, - 0, 478, 487, 512, 472, 0, 0, 0, 0, 0, - 0, 969, 0, 454, 0, 495, 0, 0, 0, 435, - 432, 0, 0, 0, 0, 476, 0, 0, 0, 437, - 0, 455, 513, 0, 425, 128, 517, 524, 473, 278, - 528, 471, 470, 531, 194, 0, 226, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 202, 206, 521, 451, - 460, 113, 458, 204, 182, 242, 494, 184, 203, 150, - 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, - 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, - 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, - 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, - 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 430, 0, 223, 245, - 260, 107, 446, 230, 254, 255, 0, 196, 108, 127, - 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, - 258, 181, 205, 111, 244, 221, 442, 445, 440, 441, - 489, 490, 536, 537, 538, 514, 436, 0, 443, 444, - 0, 519, 526, 527, 493, 90, 99, 148, 257, 197, - 124, 246, 426, 439, 117, 449, 0, 0, 462, 467, - 468, 480, 482, 483, 484, 485, 492, 499, 500, 502, - 508, 509, 510, 511, 516, 523, 542, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, - 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, - 243, 250, 253, 530, 518, 0, 475, 533, 448, 465, - 541, 466, 469, 506, 433, 488, 175, 463, 0, 452, - 428, 459, 429, 450, 477, 119, 481, 447, 520, 491, - 532, 147, 0, 453, 539, 149, 497, 0, 222, 163, - 0, 0, 0, 479, 522, 486, 515, 474, 507, 438, - 496, 534, 464, 504, 535, 0, 0, 0, 87, 88, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 109, - 0, 501, 529, 461, 503, 505, 427, 498, 0, 431, - 434, 540, 525, 456, 457, 0, 0, 0, 0, 0, - 0, 0, 478, 487, 512, 472, 0, 0, 0, 0, - 0, 0, 0, 0, 454, 0, 495, 0, 0, 0, - 435, 432, 0, 0, 0, 0, 476, 0, 0, 0, - 437, 0, 455, 513, 0, 425, 128, 517, 524, 473, - 278, 528, 471, 470, 531, 194, 0, 226, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 202, 206, 521, - 451, 460, 113, 458, 204, 182, 242, 494, 184, 203, - 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, - 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, - 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, - 114, 259, 102, 248, 98, 103, 247, 168, 231, 239, - 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 430, 0, 223, - 245, 260, 107, 446, 230, 254, 255, 0, 196, 108, - 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, - 199, 258, 181, 205, 111, 244, 221, 442, 445, 440, - 441, 489, 490, 536, 537, 538, 514, 436, 0, 443, - 444, 0, 519, 526, 527, 493, 90, 99, 148, 257, - 197, 124, 246, 426, 439, 117, 449, 0, 0, 462, - 467, 468, 480, 482, 483, 484, 485, 492, 499, 500, - 502, 508, 509, 510, 511, 516, 523, 542, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, - 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, - 234, 243, 250, 253, 530, 518, 0, 475, 533, 448, - 465, 541, 466, 469, 506, 433, 488, 175, 463, 0, - 452, 428, 459, 429, 450, 477, 119, 481, 447, 520, - 491, 532, 147, 0, 453, 539, 149, 497, 0, 222, - 163, 0, 0, 0, 479, 522, 486, 515, 474, 507, - 438, 496, 534, 464, 504, 535, 0, 0, 0, 87, - 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 0, 501, 529, 461, 503, 505, 427, 498, 0, - 431, 434, 540, 525, 456, 457, 0, 0, 0, 0, - 0, 0, 0, 478, 487, 512, 472, 0, 0, 0, - 0, 0, 0, 0, 0, 454, 0, 495, 0, 0, - 0, 435, 432, 0, 0, 0, 0, 476, 0, 0, - 0, 437, 0, 455, 513, 0, 425, 128, 517, 524, - 473, 278, 528, 471, 470, 531, 194, 0, 226, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 521, 451, 460, 113, 458, 204, 182, 242, 494, 184, - 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, - 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, - 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 423, 247, 168, 231, - 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 430, 0, - 223, 245, 260, 107, 446, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 424, 422, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 442, 445, - 440, 441, 489, 490, 536, 537, 538, 514, 436, 0, - 443, 444, 0, 519, 526, 527, 493, 90, 99, 148, - 257, 197, 124, 246, 426, 439, 117, 449, 0, 0, - 462, 467, 468, 480, 482, 483, 484, 485, 492, 499, - 500, 502, 508, 509, 510, 511, 516, 523, 542, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, - 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 530, 518, 0, 475, 533, - 448, 465, 541, 466, 469, 506, 433, 488, 175, 463, - 0, 452, 428, 459, 429, 450, 477, 119, 481, 447, - 520, 491, 532, 147, 0, 453, 539, 149, 497, 0, - 222, 163, 0, 0, 0, 479, 522, 486, 515, 474, - 507, 438, 496, 534, 464, 504, 535, 0, 0, 0, - 87, 88, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 109, 0, 501, 529, 461, 503, 505, 427, 498, - 0, 431, 434, 540, 525, 456, 457, 0, 0, 0, - 0, 0, 0, 0, 478, 487, 512, 472, 0, 0, - 0, 0, 0, 0, 0, 0, 454, 0, 495, 0, - 0, 0, 435, 432, 0, 0, 0, 0, 476, 0, - 0, 0, 437, 0, 455, 513, 0, 425, 128, 517, - 524, 473, 278, 528, 471, 470, 531, 194, 0, 226, - 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, - 206, 521, 451, 460, 113, 458, 204, 182, 242, 494, - 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, - 256, 219, 94, 228, 750, 110, 214, 96, 238, 225, - 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, - 235, 236, 114, 259, 102, 248, 98, 423, 247, 168, - 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, - 133, 192, 152, 193, 134, 165, 164, 166, 0, 430, - 0, 223, 245, 260, 107, 446, 230, 254, 255, 0, - 196, 108, 127, 121, 191, 125, 424, 422, 136, 220, - 144, 151, 199, 258, 181, 205, 111, 244, 221, 442, - 445, 440, 441, 489, 490, 536, 537, 538, 514, 436, - 0, 443, 444, 0, 519, 526, 527, 493, 90, 99, - 148, 257, 197, 124, 246, 426, 439, 117, 449, 0, - 0, 462, 467, 468, 480, 482, 483, 484, 485, 492, - 499, 500, 502, 508, 509, 510, 511, 516, 523, 542, - 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, - 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, - 227, 233, 234, 243, 250, 253, 530, 518, 0, 475, - 533, 448, 465, 541, 466, 469, 506, 433, 488, 175, - 463, 0, 452, 428, 459, 429, 450, 477, 119, 481, - 447, 520, 491, 532, 147, 0, 453, 539, 149, 497, - 0, 222, 163, 0, 0, 0, 479, 522, 486, 515, - 474, 507, 438, 496, 534, 464, 504, 535, 0, 0, - 0, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 501, 529, 461, 503, 505, 427, - 498, 0, 431, 434, 540, 525, 456, 457, 0, 0, - 0, 0, 0, 0, 0, 478, 487, 512, 472, 0, - 0, 0, 0, 0, 0, 0, 0, 454, 0, 495, - 0, 0, 0, 435, 432, 0, 0, 0, 0, 476, - 0, 0, 0, 437, 0, 455, 513, 0, 425, 128, - 517, 524, 473, 278, 528, 471, 470, 531, 194, 0, - 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 202, 206, 521, 451, 460, 113, 458, 204, 182, 242, - 494, 184, 203, 150, 232, 195, 241, 251, 252, 229, - 249, 256, 219, 94, 228, 414, 110, 214, 96, 238, - 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, - 174, 235, 236, 114, 259, 102, 248, 98, 423, 247, - 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 430, 0, 223, 245, 260, 107, 446, 230, 254, 255, - 0, 196, 108, 127, 121, 191, 125, 424, 422, 417, - 416, 144, 151, 199, 258, 181, 205, 111, 244, 221, - 442, 445, 440, 441, 489, 490, 536, 537, 538, 514, - 436, 0, 443, 444, 0, 519, 526, 527, 493, 90, - 99, 148, 257, 197, 124, 246, 426, 439, 117, 449, - 0, 0, 462, 467, 468, 480, 482, 483, 484, 485, - 492, 499, 500, 502, 508, 509, 510, 511, 516, 523, - 542, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, - 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, - 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, - 909, 0, 318, 0, 0, 0, 119, 0, 317, 0, - 0, 0, 147, 0, 910, 361, 149, 0, 0, 222, - 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, - 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, - 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, - 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 329, 330, 401, 0, 0, 0, 375, 0, 331, - 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, - 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, - 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, - 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, - 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, - 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 362, 373, - 368, 369, 366, 367, 365, 364, 363, 376, 354, 355, - 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, - 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, - 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, - 318, 0, 0, 0, 119, 0, 317, 0, 0, 0, - 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, - 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, - 0, 0, 1012, 0, 53, 0, 0, 87, 88, 89, - 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, - 345, 346, 347, 1013, 0, 0, 315, 332, 0, 360, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, - 330, 0, 0, 0, 0, 375, 0, 331, 0, 0, - 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, - 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, - 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, - 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, - 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, - 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, - 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, - 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, - 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, - 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, - 258, 181, 205, 111, 244, 221, 362, 373, 368, 369, - 366, 367, 365, 364, 363, 376, 354, 355, 356, 357, - 359, 0, 370, 371, 358, 90, 99, 148, 257, 197, - 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, - 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, - 243, 250, 253, 175, 0, 0, 0, 0, 318, 0, - 0, 0, 119, 0, 317, 0, 0, 0, 147, 0, - 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, - 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, - 0, 0, 53, 0, 389, 87, 88, 89, 339, 338, - 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, - 347, 0, 0, 0, 315, 332, 0, 360, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 329, 330, 0, - 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, - 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, - 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, - 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, - 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, - 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, - 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, - 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, - 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, - 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, - 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, - 205, 111, 244, 221, 362, 373, 368, 369, 366, 367, - 365, 364, 363, 376, 354, 355, 356, 357, 359, 0, - 370, 371, 358, 90, 99, 148, 257, 197, 124, 246, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, - 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, - 253, 175, 0, 0, 0, 0, 318, 0, 0, 0, - 119, 0, 317, 0, 0, 0, 147, 0, 0, 361, - 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, - 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 87, 88, 89, 339, 338, 341, 342, - 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, - 0, 0, 315, 332, 0, 360, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 329, 330, 401, 0, 0, - 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, - 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, - 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, - 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, - 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, - 0, 0, 0, 0, 318, 0, 0, 0, 119, 0, - 317, 0, 0, 0, 147, 0, 0, 361, 149, 0, - 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, - 0, 87, 88, 89, 339, 927, 341, 342, 343, 344, - 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, - 315, 332, 0, 360, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 329, 330, 401, 0, 0, 0, 375, - 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, - 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, - 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, - 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, - 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, - 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, - 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, - 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, - 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, - 362, 373, 368, 369, 366, 367, 365, 364, 363, 376, - 354, 355, 356, 357, 359, 0, 370, 371, 358, 90, - 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, - 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, - 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, - 0, 0, 318, 0, 0, 0, 119, 0, 317, 0, - 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, - 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, - 88, 89, 339, 924, 341, 342, 343, 344, 0, 0, - 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, - 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 329, 330, 401, 0, 0, 0, 375, 0, 331, - 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, - 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, - 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, - 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, - 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, - 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 362, 373, - 368, 369, 366, 367, 365, 364, 363, 376, 354, 355, - 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, - 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, - 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 382, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, - 0, 0, 318, 0, 0, 0, 119, 0, 317, 0, - 0, 0, 147, 0, 0, 361, 149, 0, 0, 222, - 163, 0, 0, 0, 0, 0, 352, 353, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 0, 0, 87, - 88, 89, 339, 338, 341, 342, 343, 344, 0, 0, - 109, 340, 345, 346, 347, 0, 0, 0, 315, 332, - 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 329, 330, 0, 0, 0, 0, 375, 0, 331, - 0, 0, 324, 325, 327, 326, 328, 333, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 374, 0, - 0, 278, 0, 0, 372, 0, 194, 0, 226, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, - 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, - 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, - 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, - 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 362, 373, - 368, 369, 366, 367, 365, 364, 363, 376, 354, 355, - 356, 357, 359, 0, 370, 371, 358, 90, 99, 148, - 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, - 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, - 318, 0, 0, 0, 119, 0, 317, 0, 0, 0, - 147, 0, 0, 361, 149, 0, 0, 222, 163, 0, - 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 0, 0, 87, 88, 89, - 339, 338, 341, 342, 343, 344, 0, 0, 109, 340, - 345, 346, 347, 0, 0, 0, 315, 332, 0, 360, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, - 330, 0, 0, 0, 0, 375, 0, 331, 0, 0, - 324, 325, 327, 326, 328, 333, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 374, 0, 0, 278, - 0, 0, 372, 0, 194, 0, 226, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, - 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, - 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, - 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, - 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, - 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, - 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, - 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, - 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, - 258, 181, 205, 111, 244, 221, 362, 373, 368, 369, - 366, 367, 365, 364, 363, 376, 354, 355, 356, 357, - 359, 0, 370, 371, 358, 90, 99, 148, 257, 197, - 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, - 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, - 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, - 0, 361, 149, 0, 0, 222, 163, 0, 0, 0, - 0, 0, 352, 353, 0, 0, 0, 0, 0, 0, - 0, 0, 53, 0, 0, 87, 88, 89, 339, 338, - 341, 342, 343, 344, 0, 0, 109, 340, 345, 346, - 347, 0, 0, 0, 0, 332, 0, 360, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 329, 330, 0, - 0, 0, 0, 375, 0, 331, 0, 0, 324, 325, - 327, 326, 328, 333, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 374, 0, 0, 278, 0, 0, - 372, 0, 194, 0, 226, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, - 0, 204, 182, 242, 1579, 184, 203, 150, 232, 195, - 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, - 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, - 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, - 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, - 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, - 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, - 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, - 205, 111, 244, 221, 362, 373, 368, 369, 366, 367, - 365, 364, 363, 376, 354, 355, 356, 357, 359, 0, - 370, 371, 358, 90, 99, 148, 257, 197, 124, 246, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, - 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, - 253, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 0, 0, 0, 0, 0, 147, 0, 0, 361, - 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, - 352, 353, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 389, 87, 88, 89, 339, 338, 341, 342, - 343, 344, 0, 0, 109, 340, 345, 346, 347, 0, - 0, 0, 0, 332, 0, 360, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 329, 330, 0, 0, 0, - 0, 375, 0, 331, 0, 0, 324, 325, 327, 326, - 328, 333, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 374, 0, 0, 278, 0, 0, 372, 0, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, - 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 362, 373, 368, 369, 366, 367, 365, 364, - 363, 376, 354, 355, 356, 357, 359, 0, 370, 371, - 358, 90, 99, 148, 257, 197, 124, 246, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 175, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 0, - 0, 0, 0, 0, 147, 0, 0, 361, 149, 0, - 0, 222, 163, 0, 0, 0, 0, 0, 352, 353, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, - 0, 87, 88, 89, 339, 338, 341, 342, 343, 344, - 0, 0, 109, 340, 345, 346, 347, 0, 0, 0, - 0, 332, 0, 360, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 329, 330, 0, 0, 0, 0, 375, - 0, 331, 0, 0, 324, 325, 327, 326, 328, 333, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, - 374, 0, 0, 278, 0, 0, 372, 0, 194, 0, - 226, 131, 146, 105, 143, 91, 101, 0, 130, 172, - 202, 206, 0, 0, 0, 113, 0, 204, 182, 242, - 0, 184, 203, 150, 232, 195, 241, 251, 252, 229, - 249, 256, 219, 94, 228, 240, 110, 214, 96, 238, - 225, 161, 140, 141, 95, 0, 200, 118, 126, 115, - 174, 235, 236, 114, 259, 102, 248, 98, 103, 247, - 168, 231, 239, 162, 155, 97, 237, 160, 154, 145, - 122, 133, 192, 152, 193, 134, 165, 164, 166, 0, - 0, 0, 223, 245, 260, 107, 0, 230, 254, 255, - 0, 196, 108, 127, 121, 191, 125, 167, 104, 136, - 220, 144, 151, 199, 258, 181, 205, 111, 244, 221, - 362, 373, 368, 369, 366, 367, 365, 364, 363, 376, - 354, 355, 356, 357, 359, 0, 370, 371, 358, 90, - 99, 148, 257, 197, 124, 246, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 93, 100, 106, 112, 116, 120, 123, 129, - 132, 135, 137, 138, 139, 142, 153, 156, 157, 158, - 159, 169, 170, 171, 173, 176, 177, 178, 179, 180, - 183, 185, 186, 187, 188, 189, 190, 198, 201, 207, - 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, - 224, 227, 233, 234, 243, 250, 253, 175, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, - 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, - 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, - 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 630, 629, 639, - 640, 632, 633, 634, 635, 636, 637, 638, 631, 0, - 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, - 0, 278, 0, 0, 0, 0, 194, 0, 226, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, - 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, - 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, - 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, - 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 99, 148, - 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, - 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 175, 0, 0, 0, 725, - 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, - 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 87, 88, 89, - 0, 727, 0, 0, 0, 0, 0, 0, 109, 0, - 0, 0, 0, 0, 620, 619, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 621, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 0, 0, 278, - 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, - 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, - 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, - 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, - 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, - 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, - 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, - 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, - 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, - 258, 181, 205, 111, 244, 221, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 99, 148, 257, 197, - 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, - 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, - 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, - 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, - 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 81, 82, 0, 78, 0, 0, - 0, 83, 194, 0, 226, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, - 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, - 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, - 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, - 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, - 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, - 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, - 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, - 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, - 205, 111, 244, 221, 0, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 99, 148, 257, 197, 124, 246, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, - 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, - 253, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 0, 0, 0, 0, 0, 147, 0, 0, 0, - 149, 0, 0, 222, 163, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 88, 89, 0, 0, 0, 0, - 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, - 0, 128, 0, 0, 0, 278, 0, 0, 0, 0, - 194, 0, 226, 131, 146, 105, 143, 91, 101, 0, - 130, 172, 202, 206, 0, 0, 0, 113, 0, 204, - 182, 242, 0, 184, 203, 150, 232, 195, 241, 251, - 252, 229, 249, 256, 219, 94, 228, 240, 110, 214, - 96, 238, 225, 161, 140, 141, 95, 0, 200, 118, - 126, 115, 174, 235, 236, 114, 259, 102, 248, 98, - 103, 247, 168, 231, 239, 162, 155, 97, 237, 160, - 154, 145, 122, 133, 192, 152, 193, 134, 165, 164, - 166, 0, 0, 0, 223, 245, 260, 107, 0, 230, - 254, 255, 0, 196, 108, 127, 121, 191, 125, 167, - 104, 136, 220, 144, 151, 199, 258, 181, 205, 111, - 244, 221, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 99, 148, 257, 197, 124, 246, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 93, 100, 106, 112, 116, 120, - 123, 129, 132, 135, 137, 138, 139, 142, 153, 156, - 157, 158, 159, 169, 170, 171, 173, 176, 177, 178, - 179, 180, 183, 185, 186, 187, 188, 189, 190, 198, - 201, 207, 208, 209, 210, 211, 212, 213, 215, 216, - 217, 218, 224, 227, 233, 234, 243, 250, 253, 305, - 175, 0, 0, 0, 995, 0, 0, 0, 0, 119, - 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, - 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 88, 89, 0, 997, 0, 0, 0, - 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, - 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, - 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, - 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, - 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, - 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, - 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, - 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, - 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, - 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, - 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, - 218, 224, 227, 233, 234, 243, 250, 253, 27, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, - 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, - 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, - 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, - 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, - 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, - 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, - 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, - 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, - 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, - 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, - 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, - 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, - 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, - 0, 0, 995, 0, 0, 0, 0, 119, 0, 0, - 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, - 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 88, 89, 0, 997, 0, 0, 0, 0, 0, - 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 0, 0, 278, 0, 0, 0, 0, 194, 0, 226, - 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, - 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, - 993, 203, 150, 232, 195, 241, 251, 252, 229, 249, - 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, - 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, - 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, - 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, - 133, 192, 152, 193, 134, 165, 164, 166, 0, 0, - 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, - 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, - 144, 151, 199, 258, 181, 205, 111, 244, 221, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, - 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, - 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, - 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, - 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, - 89, 0, 0, 961, 0, 0, 962, 0, 0, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, - 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, - 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, - 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, - 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, - 114, 259, 102, 248, 98, 103, 247, 168, 231, 239, - 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 0, 0, 223, - 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, - 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, - 199, 258, 181, 205, 111, 244, 221, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 99, 148, 257, - 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, - 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, - 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 0, 760, 0, 0, 0, 147, - 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, - 759, 0, 0, 0, 0, 0, 0, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, - 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, - 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, - 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, - 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, - 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, - 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, - 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, - 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, - 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, - 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, - 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, - 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, - 250, 253, 175, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, - 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 389, 87, 88, 89, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, - 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, - 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, - 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, - 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, - 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, - 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, - 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, - 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, - 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, - 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, - 175, 0, 0, 0, 0, 0, 0, 0, 0, 119, - 0, 0, 0, 0, 0, 147, 0, 0, 0, 149, - 0, 0, 222, 163, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 0, 0, 87, 88, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 278, 0, 0, 0, 0, 194, - 0, 226, 131, 146, 105, 143, 91, 101, 0, 130, - 172, 202, 206, 0, 0, 0, 113, 0, 204, 182, - 242, 0, 184, 203, 150, 232, 195, 241, 251, 252, - 229, 249, 256, 219, 94, 228, 240, 110, 214, 96, - 238, 225, 161, 140, 141, 95, 0, 200, 118, 126, - 115, 174, 235, 236, 114, 259, 102, 248, 98, 103, - 247, 168, 231, 239, 162, 155, 97, 237, 160, 154, - 145, 122, 133, 192, 152, 193, 134, 165, 164, 166, - 0, 0, 0, 223, 245, 260, 107, 0, 230, 254, - 255, 0, 196, 108, 127, 121, 191, 125, 167, 104, - 136, 220, 144, 151, 199, 258, 181, 205, 111, 244, - 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 99, 148, 257, 197, 124, 246, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 93, 100, 106, 112, 116, 120, 123, - 129, 132, 135, 137, 138, 139, 142, 153, 156, 157, - 158, 159, 169, 170, 171, 173, 176, 177, 178, 179, - 180, 183, 185, 186, 187, 188, 189, 190, 198, 201, - 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, - 218, 224, 227, 233, 234, 243, 250, 253, 175, 0, - 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, - 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, - 222, 163, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 88, 89, 0, 997, 0, 0, 0, 0, 0, - 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, - 0, 0, 278, 0, 0, 0, 0, 194, 0, 226, - 131, 146, 105, 143, 91, 101, 0, 130, 172, 202, - 206, 0, 0, 0, 113, 0, 204, 182, 242, 0, - 184, 203, 150, 232, 195, 241, 251, 252, 229, 249, - 256, 219, 94, 228, 240, 110, 214, 96, 238, 225, - 161, 140, 141, 95, 0, 200, 118, 126, 115, 174, - 235, 236, 114, 259, 102, 248, 98, 103, 247, 168, - 231, 239, 162, 155, 97, 237, 160, 154, 145, 122, - 133, 192, 152, 193, 134, 165, 164, 166, 0, 0, - 0, 223, 245, 260, 107, 0, 230, 254, 255, 0, - 196, 108, 127, 121, 191, 125, 167, 104, 136, 220, - 144, 151, 199, 258, 181, 205, 111, 244, 221, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 99, - 148, 257, 197, 124, 246, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 93, 100, 106, 112, 116, 120, 123, 129, 132, - 135, 137, 138, 139, 142, 153, 156, 157, 158, 159, - 169, 170, 171, 173, 176, 177, 178, 179, 180, 183, - 185, 186, 187, 188, 189, 190, 198, 201, 207, 208, - 209, 210, 211, 212, 213, 215, 216, 217, 218, 224, - 227, 233, 234, 243, 250, 253, 175, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, - 0, 147, 0, 0, 0, 149, 0, 0, 222, 163, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, - 89, 0, 727, 0, 0, 0, 0, 0, 0, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 278, 0, 0, 0, 0, 194, 0, 226, 131, 146, - 105, 143, 91, 101, 0, 130, 172, 202, 206, 0, - 0, 0, 113, 0, 204, 182, 242, 0, 184, 203, - 150, 232, 195, 241, 251, 252, 229, 249, 256, 219, - 94, 228, 240, 110, 214, 96, 238, 225, 161, 140, - 141, 95, 0, 200, 118, 126, 115, 174, 235, 236, - 114, 259, 102, 248, 98, 103, 247, 168, 231, 239, - 162, 155, 97, 237, 160, 154, 145, 122, 133, 192, - 152, 193, 134, 165, 164, 166, 0, 0, 0, 223, - 245, 260, 107, 0, 230, 254, 255, 0, 196, 108, - 127, 121, 191, 125, 167, 104, 136, 220, 144, 151, - 199, 258, 181, 205, 111, 244, 221, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 99, 148, 257, - 197, 124, 246, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, - 100, 106, 112, 116, 120, 123, 129, 132, 135, 137, - 138, 139, 142, 153, 156, 157, 158, 159, 169, 170, - 171, 173, 176, 177, 178, 179, 180, 183, 185, 186, - 187, 188, 189, 190, 198, 201, 207, 208, 209, 210, - 211, 212, 213, 215, 216, 217, 218, 224, 227, 233, - 234, 243, 250, 253, 175, 0, 0, 0, 0, 0, - 0, 0, 730, 119, 0, 0, 0, 0, 0, 147, - 0, 0, 0, 149, 0, 0, 222, 163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 87, 88, 89, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 278, 0, - 0, 0, 0, 194, 0, 226, 131, 146, 105, 143, - 91, 101, 0, 130, 172, 202, 206, 0, 0, 0, - 113, 0, 204, 182, 242, 0, 184, 203, 150, 232, - 195, 241, 251, 252, 229, 249, 256, 219, 94, 228, - 240, 110, 214, 96, 238, 225, 161, 140, 141, 95, - 0, 200, 118, 126, 115, 174, 235, 236, 114, 259, - 102, 248, 98, 103, 247, 168, 231, 239, 162, 155, - 97, 237, 160, 154, 145, 122, 133, 192, 152, 193, - 134, 165, 164, 166, 0, 0, 0, 223, 245, 260, - 107, 0, 230, 254, 255, 0, 196, 108, 127, 121, - 191, 125, 167, 104, 136, 220, 144, 151, 199, 258, - 181, 205, 111, 244, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 99, 148, 257, 197, 124, - 246, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 93, 100, 106, - 112, 116, 120, 123, 129, 132, 135, 137, 138, 139, - 142, 153, 156, 157, 158, 159, 169, 170, 171, 173, - 176, 177, 178, 179, 180, 183, 185, 186, 187, 188, - 189, 190, 198, 201, 207, 208, 209, 210, 211, 212, - 213, 215, 216, 217, 218, 224, 227, 233, 234, 243, - 250, 253, 175, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 0, 0, 0, 0, 0, 147, 0, 0, - 0, 149, 0, 0, 222, 163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 88, 89, 0, 609, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 278, 0, 0, 0, - 0, 194, 0, 226, 131, 146, 105, 143, 91, 101, - 0, 130, 172, 202, 206, 0, 0, 0, 113, 0, - 204, 182, 242, 0, 184, 203, 150, 232, 195, 241, - 251, 252, 229, 249, 256, 219, 94, 228, 240, 110, - 214, 96, 238, 225, 161, 140, 141, 95, 0, 200, - 118, 126, 115, 174, 235, 236, 114, 259, 102, 248, - 98, 103, 247, 168, 231, 239, 162, 155, 97, 237, - 160, 154, 145, 122, 133, 192, 152, 193, 134, 165, - 164, 166, 0, 0, 0, 223, 245, 260, 107, 0, - 230, 254, 255, 0, 196, 108, 127, 121, 191, 125, - 167, 104, 136, 220, 144, 151, 199, 258, 181, 205, - 111, 244, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 99, 148, 257, 197, 124, 246, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 100, 106, 112, 116, - 120, 123, 129, 132, 135, 137, 138, 139, 142, 153, - 156, 157, 158, 159, 169, 170, 171, 173, 176, 177, - 178, 179, 180, 183, 185, 186, 187, 188, 189, 190, - 198, 201, 207, 208, 209, 210, 211, 212, 213, 215, - 216, 217, 218, 224, 227, 233, 234, 243, 250, 253, - 406, 0, 0, 0, 0, 0, 0, 175, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 0, 0, 0, - 0, 0, 147, 0, 0, 0, 149, 0, 0, 222, - 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, - 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, - 0, 278, 0, 0, 0, 0, 194, 0, 226, 131, - 146, 105, 143, 91, 101, 0, 130, 172, 202, 206, - 0, 0, 0, 113, 0, 204, 182, 242, 0, 184, - 203, 150, 232, 195, 241, 251, 252, 229, 249, 256, - 219, 94, 228, 240, 110, 214, 96, 238, 225, 161, - 140, 141, 95, 0, 200, 118, 126, 115, 174, 235, - 236, 114, 259, 102, 248, 98, 103, 247, 168, 231, - 239, 162, 155, 97, 237, 160, 154, 145, 122, 133, - 192, 152, 193, 134, 165, 164, 166, 0, 0, 0, - 223, 245, 260, 107, 0, 230, 254, 255, 0, 196, - 108, 127, 121, 191, 125, 167, 104, 136, 220, 144, - 151, 199, 258, 181, 205, 111, 244, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 99, 148, - 257, 197, 124, 246, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 93, 100, 106, 112, 116, 120, 123, 129, 132, 135, - 137, 138, 139, 142, 153, 156, 157, 158, 159, 169, - 170, 171, 173, 176, 177, 178, 179, 180, 183, 185, - 186, 187, 188, 189, 190, 198, 201, 207, 208, 209, - 210, 211, 212, 213, 215, 216, 217, 218, 224, 227, - 233, 234, 243, 250, 253, 175, 0, 0, 0, 0, - 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, - 147, 0, 0, 0, 149, 0, 0, 222, 163, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 87, 88, 89, - 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 273, 0, 278, - 0, 0, 0, 0, 194, 0, 226, 131, 146, 105, - 143, 91, 101, 0, 130, 172, 202, 206, 0, 0, - 0, 113, 0, 204, 182, 242, 0, 184, 203, 150, - 232, 195, 241, 251, 252, 229, 249, 256, 219, 94, - 228, 240, 110, 214, 96, 238, 225, 161, 140, 141, - 95, 0, 200, 118, 126, 115, 174, 235, 236, 114, - 259, 102, 248, 98, 103, 247, 168, 231, 239, 162, - 155, 97, 237, 160, 154, 145, 122, 133, 192, 152, - 193, 134, 165, 164, 166, 0, 0, 0, 223, 245, - 260, 107, 0, 230, 254, 255, 0, 196, 108, 127, - 121, 191, 125, 167, 104, 136, 220, 144, 151, 199, - 258, 181, 205, 111, 244, 221, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 99, 148, 257, 197, - 124, 246, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 93, 100, - 106, 112, 116, 120, 123, 129, 132, 135, 137, 138, - 139, 142, 153, 156, 157, 158, 159, 169, 170, 171, - 173, 176, 177, 178, 179, 180, 183, 185, 186, 187, - 188, 189, 190, 198, 201, 207, 208, 209, 210, 211, - 212, 213, 215, 216, 217, 218, 224, 227, 233, 234, - 243, 250, 253, 175, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 0, 0, 0, 0, 0, 147, 0, - 0, 0, 149, 0, 0, 222, 163, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 88, 89, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 128, 0, 0, 0, 278, 0, 0, - 0, 0, 194, 0, 226, 131, 146, 105, 143, 91, - 101, 0, 130, 172, 202, 206, 0, 0, 0, 113, - 0, 204, 182, 242, 0, 184, 203, 150, 232, 195, - 241, 251, 252, 229, 249, 256, 219, 94, 228, 240, - 110, 214, 96, 238, 225, 161, 140, 141, 95, 0, - 200, 118, 126, 115, 174, 235, 236, 114, 259, 102, - 248, 98, 103, 247, 168, 231, 239, 162, 155, 97, - 237, 160, 154, 145, 122, 133, 192, 152, 193, 134, - 165, 164, 166, 0, 0, 0, 223, 245, 260, 107, - 0, 230, 254, 255, 0, 196, 108, 127, 121, 191, - 125, 167, 104, 136, 220, 144, 151, 199, 258, 181, - 205, 111, 244, 221, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 99, 148, 257, 197, 124, 246, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 93, 100, 106, 112, - 116, 120, 123, 129, 132, 135, 137, 138, 139, 142, - 153, 156, 157, 158, 159, 169, 170, 171, 173, 176, - 177, 178, 179, 180, 183, 185, 186, 187, 188, 189, - 190, 198, 201, 207, 208, 209, 210, 211, 212, 213, - 215, 216, 217, 218, 224, 227, 233, 234, 243, 250, - 253, + 385, 1593, 1583, 1393, 1550, 1281, 1186, 1466, 1499, 329, + 1453, 1206, 595, 1334, 344, 1367, 1004, 1031, 358, 1060, + 1187, 1331, 1335, 584, 717, 1232, 1030, 1340, 1346, 678, + 1074, 1300, 1040, 69, 3, 1027, 913, 89, 1125, 868, + 429, 280, 315, 300, 280, 1258, 1249, 724, 1006, 89, + 920, 280, 849, 393, 763, 727, 1174, 402, 1044, 990, + 1001, 722, 890, 744, 749, 946, 1054, 553, 331, 27, + 387, 418, 1070, 762, 983, 67, 280, 89, 734, 327, + 554, 280, 877, 280, 752, 65, 320, 70, 64, 426, + 743, 691, 7, 6, 5, 316, 423, 1093, 319, 573, + 1586, 1570, 1581, 1558, 415, 278, 1578, 1394, 692, 1569, + 1557, 1092, 1317, 1423, 558, 311, 1362, 1363, 72, 73, + 74, 75, 76, 1361, 91, 92, 93, 613, 408, 1022, + 1023, 1021, 359, 28, 29, 388, 58, 32, 33, 764, + 417, 765, 91, 92, 93, 555, 318, 557, 317, 276, + 272, 273, 274, 1091, 1240, 268, 1053, 1456, 266, 1283, + 270, 28, 1525, 640, 639, 649, 650, 642, 643, 644, + 645, 646, 647, 648, 641, 1061, 370, 651, 376, 377, + 374, 375, 373, 372, 371, 57, 91, 92, 93, 612, + 1414, 1412, 378, 379, 590, 308, 592, 1220, 389, 876, + 1219, 310, 306, 1221, 838, 1088, 1085, 1086, 608, 1084, + 601, 602, 609, 606, 607, 1284, 611, 837, 1285, 835, + 1580, 1577, 1551, 1280, 1045, 91, 92, 93, 589, 591, + 923, 878, 879, 880, 1543, 984, 1601, 598, 574, 284, + 1301, 1508, 1095, 1098, 560, 839, 270, 1286, 287, 1500, + 842, 1207, 1209, 836, 615, 826, 294, 269, 1532, 563, + 1277, 1357, 1597, 1356, 1502, 1355, 1279, 280, 565, 566, + 1047, 556, 280, 275, 575, 1047, 283, 271, 280, 267, + 1105, 1303, 1090, 1104, 280, 582, 1436, 1144, 588, 89, + 292, 1141, 1216, 89, 1179, 89, 299, 663, 664, 1154, + 1133, 89, 758, 738, 1089, 676, 580, 91, 92, 93, + 641, 89, 89, 651, 1028, 651, 1017, 587, 1305, 963, + 1309, 629, 1304, 869, 1302, 586, 285, 1541, 873, 1307, + 1556, 564, 1208, 631, 1501, 597, 572, 631, 1306, 1526, + 863, 79, 579, 1517, 1094, 1344, 621, 599, 581, 1509, + 1507, 1308, 1310, 296, 288, 766, 297, 298, 304, 1096, + 626, 627, 289, 291, 301, 1061, 286, 303, 302, 1278, + 1047, 1276, 570, 1046, 576, 577, 578, 1595, 1046, 80, + 1596, 1140, 1594, 1043, 1041, 625, 1042, 1319, 947, 59, + 91, 92, 93, 1039, 1045, 661, 663, 664, 828, 1238, + 663, 664, 91, 92, 93, 624, 622, 623, 585, 870, + 947, 89, 1151, 280, 280, 280, 897, 1268, 968, 969, + 1546, 594, 89, 715, 731, 594, 864, 594, 89, 679, + 895, 896, 894, 594, 426, 714, 630, 629, 1602, 567, + 57, 568, 1050, 1380, 569, 28, 559, 1561, 1051, 1264, + 1265, 1266, 893, 631, 1139, 1462, 1138, 1461, 660, 662, + 728, 1253, 1252, 694, 696, 698, 700, 702, 704, 705, + 1241, 630, 629, 1046, 742, 630, 629, 741, 716, 750, + 695, 697, 1603, 701, 703, 1563, 706, 1542, 631, 675, + 1479, 1459, 631, 680, 681, 682, 683, 684, 685, 686, + 687, 756, 690, 693, 693, 693, 699, 693, 693, 699, + 693, 707, 708, 709, 710, 711, 712, 713, 761, 751, + 1267, 1250, 28, 1115, 854, 1272, 1269, 1260, 1270, 1263, + 66, 1259, 561, 562, 397, 1261, 1262, 642, 643, 644, + 645, 646, 647, 648, 641, 1514, 748, 651, 1513, 1271, + 91, 92, 93, 280, 986, 965, 1376, 824, 89, 265, + 827, 1048, 829, 280, 280, 89, 89, 89, 1118, 1119, + 1120, 280, 1505, 1579, 280, 1565, 397, 280, 847, 848, + 1175, 280, 987, 89, 397, 552, 1175, 1343, 89, 89, + 89, 280, 89, 89, 1432, 964, 644, 645, 646, 647, + 648, 641, 89, 89, 651, 630, 629, 853, 630, 629, + 1505, 1554, 1321, 1332, 630, 629, 1343, 774, 885, 887, + 888, 851, 631, 628, 886, 631, 987, 830, 831, 1516, + 726, 631, 1343, 412, 413, 840, 1505, 397, 417, 1505, + 1533, 846, 649, 650, 642, 643, 644, 645, 646, 647, + 648, 641, 914, 891, 651, 859, 91, 92, 93, 1384, + 915, 916, 640, 639, 649, 650, 642, 643, 644, 645, + 646, 647, 648, 641, 987, 89, 651, 29, 843, 1505, + 1504, 1224, 347, 346, 349, 350, 351, 352, 1020, 924, + 594, 348, 353, 1157, 935, 938, 1156, 594, 594, 594, + 948, 1451, 1450, 892, 91, 92, 93, 1486, 89, 89, + 91, 92, 93, 976, 1223, 594, 1011, 926, 753, 1126, + 594, 594, 594, 753, 594, 594, 89, 930, 57, 925, + 1438, 397, 679, 280, 594, 594, 89, 1435, 397, 1386, + 1385, 280, 754, 917, 918, 1382, 1383, 1382, 1381, 280, + 280, 924, 68, 280, 280, 976, 397, 280, 280, 280, + 89, 956, 957, 927, 987, 397, 628, 397, 960, 977, + 29, 966, 426, 89, 554, 773, 772, 754, 970, 926, + 390, 841, 1002, 759, 29, 1032, 978, 755, 1282, 757, + 57, 982, 1571, 1468, 1181, 976, 1055, 979, 1443, 851, + 1182, 1075, 1372, 1347, 1348, 985, 1227, 1062, 1063, 1064, + 1071, 1066, 1065, 1012, 980, 1469, 976, 1014, 1013, 1078, + 1588, 57, 755, 1584, 753, 1010, 1374, 280, 89, 1015, + 89, 57, 1097, 1353, 1019, 57, 280, 280, 280, 280, + 280, 1035, 280, 280, 1350, 1332, 280, 89, 1254, 1056, + 1057, 1058, 1059, 874, 1076, 845, 1018, 1198, 1200, 1196, + 996, 997, 1199, 280, 1197, 1067, 1068, 1069, 280, 1352, + 280, 280, 1195, 1194, 403, 280, 89, 1575, 1568, 1325, + 1164, 1003, 725, 1237, 1573, 748, 1173, 1172, 404, 748, + 1245, 1079, 1112, 1072, 1073, 729, 730, 406, 1548, 405, + 1099, 1100, 1101, 1102, 1103, 1426, 1106, 1107, 771, 943, + 1108, 931, 932, 891, 583, 937, 940, 941, 992, 995, + 996, 997, 993, 944, 994, 998, 1425, 1110, 1347, 1348, + 718, 1547, 1111, 1484, 1235, 1229, 1430, 1081, 1464, 1116, + 955, 844, 719, 958, 959, 640, 639, 649, 650, 642, + 643, 644, 645, 646, 647, 648, 641, 1121, 1000, 651, + 594, 1429, 594, 892, 391, 392, 640, 639, 649, 650, + 642, 643, 644, 645, 646, 647, 648, 641, 280, 594, + 651, 394, 395, 68, 1135, 1163, 1175, 1428, 280, 280, + 280, 280, 280, 403, 1171, 1168, 1188, 388, 1134, 1328, + 280, 610, 1170, 1145, 280, 1590, 1589, 404, 280, 1142, + 386, 1150, 280, 867, 400, 401, 406, 1183, 405, 732, + 992, 995, 996, 997, 993, 951, 994, 998, 1167, 1222, + 1590, 89, 1176, 1530, 1457, 962, 1178, 1205, 1177, 390, + 1228, 66, 71, 1032, 1233, 1233, 63, 90, 1225, 1, + 1582, 281, 1190, 1191, 281, 1193, 1211, 1132, 1201, 90, + 389, 281, 1395, 1465, 1087, 593, 1549, 1212, 1498, 1214, + 1234, 1215, 1213, 1366, 1038, 1217, 1242, 1243, 1189, 89, + 89, 1192, 1029, 78, 551, 77, 281, 90, 1540, 862, + 596, 281, 1037, 281, 1036, 396, 1244, 1506, 1246, 1247, + 1248, 1230, 1231, 1455, 1049, 1239, 1052, 1373, 1236, 89, + 748, 1545, 779, 1251, 777, 778, 1184, 1185, 776, 781, + 748, 748, 748, 748, 748, 780, 1257, 775, 293, 421, + 875, 1273, 307, 999, 89, 767, 1003, 1077, 1210, 733, + 914, 81, 1275, 1274, 748, 1083, 1297, 872, 290, 604, + 1288, 1289, 1130, 1131, 605, 295, 659, 1169, 1218, 427, + 1299, 1290, 420, 1338, 967, 721, 1427, 1322, 1327, 1149, + 280, 688, 1312, 1148, 945, 747, 1311, 330, 884, 345, + 89, 342, 1298, 1296, 343, 89, 89, 971, 1333, 1180, + 633, 1188, 1297, 328, 322, 926, 1318, 746, 739, 991, + 989, 1336, 988, 416, 1349, 1345, 745, 925, 975, 399, + 1422, 89, 594, 1524, 398, 942, 50, 617, 312, 31, + 407, 1351, 22, 21, 20, 89, 19, 89, 89, 18, + 24, 1233, 1233, 17, 1326, 16, 15, 1032, 1358, 1032, + 571, 594, 35, 1342, 1365, 1420, 1379, 26, 25, 14, + 13, 1364, 12, 11, 10, 280, 1370, 1371, 9, 8, + 1359, 1369, 4, 620, 23, 677, 2, 0, 0, 0, + 1360, 0, 0, 0, 0, 280, 0, 281, 1377, 1378, + 0, 89, 281, 1396, 89, 89, 89, 280, 281, 0, + 0, 0, 0, 0, 281, 0, 0, 0, 0, 90, + 0, 1388, 0, 90, 0, 90, 0, 0, 0, 0, + 0, 90, 1401, 1402, 0, 1337, 1389, 28, 1391, 1387, + 0, 90, 90, 0, 640, 639, 649, 650, 642, 643, + 644, 645, 646, 647, 648, 641, 1410, 0, 651, 1390, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1400, 1405, 1188, 0, 1431, 0, 0, 600, 0, + 603, 0, 0, 0, 1440, 89, 614, 0, 1407, 1408, + 0, 1409, 0, 89, 1411, 0, 1413, 1032, 0, 0, + 0, 0, 1225, 0, 0, 0, 0, 0, 89, 0, + 1439, 0, 0, 0, 0, 89, 0, 0, 0, 0, + 0, 1458, 0, 1460, 356, 0, 0, 1467, 0, 1472, + 0, 0, 0, 1449, 0, 0, 0, 0, 0, 0, + 0, 90, 0, 281, 281, 281, 0, 0, 1471, 0, + 1470, 0, 90, 0, 0, 1452, 89, 89, 90, 89, + 0, 88, 0, 0, 89, 0, 89, 89, 89, 280, + 1421, 1336, 89, 309, 1492, 1485, 1493, 1495, 1496, 1483, + 0, 0, 0, 0, 0, 1497, 0, 1503, 1487, 89, + 280, 0, 1510, 0, 0, 0, 1478, 0, 0, 1518, + 0, 428, 0, 0, 0, 0, 0, 0, 1445, 1446, + 1447, 0, 0, 1491, 1511, 0, 1512, 0, 0, 0, + 1531, 1539, 0, 0, 0, 1336, 89, 1538, 0, 1537, + 0, 0, 0, 0, 0, 0, 0, 89, 89, 0, + 594, 0, 0, 0, 1552, 0, 0, 0, 0, 1467, + 1032, 0, 0, 89, 1519, 1553, 0, 1559, 0, 0, + 1188, 0, 0, 0, 280, 0, 0, 0, 0, 0, + 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, + 1567, 0, 0, 281, 0, 1337, 0, 28, 90, 324, + 1572, 1574, 89, 281, 281, 90, 90, 90, 0, 0, + 0, 281, 1576, 0, 281, 1587, 0, 281, 0, 0, + 1419, 281, 1598, 90, 397, 0, 0, 1515, 90, 90, + 90, 281, 90, 90, 0, 0, 0, 0, 1562, 0, + 0, 0, 90, 90, 0, 0, 0, 0, 0, 1337, + 0, 0, 0, 825, 0, 0, 0, 0, 0, 0, + 832, 833, 834, 640, 639, 649, 650, 642, 643, 644, + 645, 646, 647, 648, 641, 1418, 0, 651, 852, 0, + 0, 0, 0, 856, 857, 858, 0, 860, 861, 0, + 0, 0, 0, 0, 0, 0, 0, 865, 866, 640, + 639, 649, 650, 642, 643, 644, 645, 646, 647, 648, + 641, 0, 0, 651, 0, 90, 0, 0, 0, 0, + 0, 0, 0, 428, 0, 0, 0, 428, 0, 428, + 0, 0, 0, 928, 929, 428, 0, 0, 0, 0, + 0, 0, 0, 1585, 0, 616, 618, 0, 90, 90, + 0, 0, 0, 0, 640, 639, 649, 650, 642, 643, + 644, 645, 646, 647, 648, 641, 90, 0, 651, 0, + 0, 961, 0, 281, 0, 0, 90, 0, 0, 0, + 0, 281, 0, 0, 0, 0, 410, 0, 0, 281, + 281, 0, 0, 281, 281, 0, 0, 281, 281, 281, + 90, 0, 0, 0, 0, 0, 635, 0, 638, 1417, + 0, 0, 0, 90, 652, 653, 654, 655, 656, 657, + 658, 0, 636, 637, 634, 640, 639, 649, 650, 642, + 643, 644, 645, 646, 647, 648, 641, 0, 0, 651, + 0, 0, 0, 321, 0, 736, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, + 0, 0, 768, 0, 0, 0, 0, 281, 90, 0, + 90, 0, 0, 0, 0, 0, 281, 281, 281, 281, + 281, 0, 281, 281, 0, 0, 281, 90, 640, 639, + 649, 650, 642, 643, 644, 645, 646, 647, 648, 641, + 0, 0, 651, 281, 0, 0, 0, 0, 281, 0, + 281, 281, 0, 0, 0, 281, 90, 0, 0, 0, + 0, 0, 0, 1080, 1291, 1082, 0, 0, 0, 0, + 0, 0, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 1109, 0, 640, 639, 649, 650, 642, 643, + 644, 645, 646, 647, 648, 641, 0, 0, 651, 640, + 639, 649, 650, 642, 643, 644, 645, 646, 647, 648, + 641, 0, 1128, 651, 0, 0, 1129, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1136, 1137, 0, + 0, 0, 428, 1143, 0, 0, 1146, 1147, 0, 428, + 428, 428, 0, 0, 1153, 0, 0, 0, 1155, 0, + 0, 1158, 1159, 1160, 1161, 1162, 0, 428, 281, 0, + 0, 0, 428, 428, 428, 0, 428, 428, 281, 281, + 281, 281, 281, 0, 0, 0, 428, 428, 0, 1127, + 281, 0, 0, 0, 281, 0, 0, 0, 281, 0, + 0, 0, 281, 0, 0, 0, 0, 1203, 1204, 640, + 639, 649, 650, 642, 643, 644, 645, 646, 647, 648, + 641, 90, 0, 651, 639, 649, 650, 642, 643, 644, + 645, 646, 647, 648, 641, 0, 0, 651, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 357, 0, 919, + 632, 428, 0, 0, 0, 0, 0, 0, 0, 90, + 90, 0, 0, 0, 0, 949, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 953, 954, 0, 0, 321, 0, 279, 90, + 0, 305, 0, 0, 0, 689, 0, 0, 279, 0, + 972, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 736, 0, 0, 428, 90, 1256, 0, 0, 0, 0, + 411, 720, 723, 419, 0, 0, 1294, 1295, 279, 0, + 279, 0, 0, 0, 428, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1287, 0, 0, 428, 0, 0, + 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 0, 0, 0, 0, 90, 90, 0, 0, 0, + 0, 0, 0, 889, 0, 0, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, + 912, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1354, 428, 0, 428, 90, 0, 90, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 428, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 952, 0, 281, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1117, 0, 0, 0, 0, 281, 0, 0, 0, 0, + 0, 90, 0, 0, 90, 90, 90, 281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1404, 0, 0, 0, 1406, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1415, 1416, 0, + 0, 0, 0, 855, 279, 0, 0, 0, 0, 279, + 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, + 0, 279, 0, 1433, 1434, 0, 1437, 871, 0, 0, + 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, + 0, 0, 0, 90, 1448, 881, 882, 883, 0, 0, + 0, 949, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 428, 0, 0, 0, 933, + 934, 0, 0, 0, 0, 0, 90, 90, 0, 90, + 0, 0, 0, 1463, 90, 0, 90, 90, 90, 281, + 0, 0, 90, 0, 0, 1122, 1123, 1124, 0, 0, + 0, 1494, 0, 0, 0, 0, 0, 411, 0, 90, + 281, 0, 0, 1255, 428, 0, 0, 0, 0, 0, + 279, 279, 279, 0, 0, 0, 0, 0, 0, 1520, + 1521, 1522, 1523, 0, 1527, 0, 1528, 1529, 0, 0, + 0, 0, 0, 428, 0, 0, 90, 0, 0, 1534, + 0, 1535, 1536, 1026, 0, 0, 0, 90, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, + 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, + 1555, 0, 0, 0, 281, 0, 0, 0, 0, 428, + 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1564, 0, 0, 0, 0, + 0, 0, 90, 0, 428, 0, 949, 0, 0, 1339, + 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1341, 0, 1599, 1600, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, + 279, 428, 1368, 0, 0, 0, 0, 0, 0, 0, + 279, 279, 0, 0, 0, 0, 0, 0, 279, 0, + 0, 279, 0, 0, 279, 0, 0, 0, 850, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1392, 0, 0, 1397, 1398, + 1399, 0, 0, 0, 0, 0, 1292, 1293, 0, 0, + 0, 0, 0, 0, 1152, 0, 0, 0, 0, 0, + 0, 1313, 1314, 0, 1315, 1316, 0, 0, 0, 0, + 0, 1165, 1166, 723, 0, 0, 1323, 1324, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 949, 0, + 0, 0, 0, 411, 850, 0, 0, 0, 411, 411, + 0, 0, 411, 411, 411, 0, 0, 0, 950, 428, + 0, 0, 0, 0, 0, 0, 0, 1454, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 411, 411, + 411, 411, 428, 0, 0, 0, 0, 0, 0, 428, + 0, 0, 0, 0, 0, 0, 0, 1375, 0, 0, + 279, 0, 0, 0, 0, 0, 850, 0, 279, 0, + 0, 0, 0, 0, 0, 0, 279, 1008, 0, 0, + 279, 279, 0, 0, 279, 1016, 850, 0, 0, 0, + 1488, 1489, 0, 1490, 0, 0, 0, 0, 1454, 0, + 1454, 1454, 1454, 0, 0, 0, 1368, 0, 0, 0, + 0, 1403, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1454, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 0, 0, 0, 1320, 0, + 1544, 0, 0, 279, 279, 279, 279, 279, 0, 279, + 279, 428, 428, 279, 0, 0, 0, 0, 0, 0, + 0, 0, 1329, 0, 0, 949, 0, 1560, 0, 0, + 279, 0, 0, 0, 0, 279, 0, 1113, 1114, 0, + 0, 0, 279, 0, 0, 0, 1566, 0, 796, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1454, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1473, 1474, 1475, + 1476, 1477, 0, 0, 0, 1480, 1481, 0, 0, 411, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 784, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 279, 0, 0, 0, 0, + 0, 0, 0, 0, 950, 279, 279, 279, 279, 279, + 0, 0, 0, 0, 0, 0, 0, 1202, 1424, 0, + 0, 279, 797, 0, 0, 1008, 0, 0, 0, 279, + 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, + 0, 1441, 0, 0, 1442, 0, 0, 1444, 810, 813, + 814, 815, 816, 817, 818, 0, 819, 820, 821, 822, + 823, 798, 799, 800, 801, 782, 783, 811, 0, 785, + 0, 786, 787, 788, 789, 790, 791, 792, 793, 794, + 795, 802, 803, 804, 805, 806, 807, 808, 809, 0, + 29, 30, 58, 32, 33, 1591, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, + 0, 0, 0, 0, 34, 53, 54, 0, 56, 0, + 0, 0, 0, 0, 0, 1482, 321, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, + 812, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 850, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 950, + 0, 0, 0, 0, 0, 0, 36, 37, 39, 38, + 41, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 61, 60, 0, 0, + 51, 52, 40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 45, 0, 46, + 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 950, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1008, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, + 0, 0, 0, 0, 538, 526, 0, 483, 541, 456, + 473, 549, 474, 477, 514, 441, 496, 179, 471, 0, + 460, 436, 467, 437, 458, 485, 123, 489, 455, 528, + 499, 540, 151, 0, 461, 547, 153, 505, 0, 226, + 167, 0, 0, 0, 487, 530, 494, 523, 482, 515, + 446, 504, 542, 472, 512, 543, 0, 0, 950, 91, + 92, 93, 0, 1033, 1034, 0, 0, 0, 0, 0, + 113, 279, 509, 537, 469, 511, 513, 435, 506, 0, + 439, 442, 548, 533, 464, 465, 1226, 0, 0, 0, + 0, 0, 0, 486, 495, 520, 480, 0, 0, 0, + 0, 0, 0, 0, 0, 462, 0, 503, 0, 0, + 0, 443, 440, 0, 0, 0, 0, 484, 0, 0, + 0, 445, 0, 463, 521, 0, 433, 132, 525, 532, + 481, 282, 536, 479, 478, 539, 198, 0, 230, 135, + 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, + 529, 459, 468, 117, 466, 208, 186, 246, 502, 188, + 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, + 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, + 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, + 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, + 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, + 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, + 0, 438, 0, 227, 249, 264, 111, 454, 234, 258, + 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, + 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, + 225, 450, 453, 448, 449, 497, 498, 544, 545, 546, + 522, 444, 0, 451, 452, 0, 527, 534, 535, 501, + 94, 103, 152, 261, 201, 128, 250, 434, 447, 121, + 457, 0, 0, 470, 475, 476, 488, 490, 491, 492, + 493, 500, 507, 508, 510, 516, 517, 518, 519, 524, + 531, 550, 96, 97, 104, 110, 116, 120, 124, 127, + 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, + 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, + 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, + 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, + 222, 228, 231, 237, 238, 247, 254, 257, 538, 526, + 0, 483, 541, 456, 473, 549, 474, 477, 514, 441, + 496, 179, 471, 0, 460, 436, 467, 437, 458, 485, + 123, 489, 455, 528, 499, 540, 151, 0, 461, 547, + 153, 505, 0, 226, 167, 0, 0, 0, 487, 530, + 494, 523, 482, 515, 446, 504, 542, 472, 512, 543, + 0, 0, 0, 91, 92, 93, 0, 1033, 1034, 0, + 0, 0, 0, 0, 113, 0, 509, 537, 469, 511, + 513, 435, 506, 0, 439, 442, 548, 533, 464, 465, + 0, 0, 0, 0, 0, 0, 0, 486, 495, 520, + 480, 0, 0, 0, 0, 0, 0, 0, 0, 462, + 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, + 0, 484, 0, 0, 0, 445, 0, 463, 521, 0, + 433, 132, 525, 532, 481, 282, 536, 479, 478, 539, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 529, 459, 468, 117, 466, 208, + 186, 246, 502, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 438, 0, 227, 249, 264, + 111, 454, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 450, 453, 448, 449, 497, + 498, 544, 545, 546, 522, 444, 0, 451, 452, 0, + 527, 534, 535, 501, 94, 103, 152, 261, 201, 128, + 250, 434, 447, 121, 457, 0, 0, 470, 475, 476, + 488, 490, 491, 492, 493, 500, 507, 508, 510, 516, + 517, 518, 519, 524, 531, 550, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 538, 526, 0, 483, 541, 456, 473, 549, + 474, 477, 514, 441, 496, 179, 471, 0, 460, 436, + 467, 437, 458, 485, 123, 489, 455, 528, 499, 540, + 151, 0, 461, 547, 153, 505, 0, 226, 167, 0, + 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, + 542, 472, 512, 543, 57, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 509, 537, 469, 511, 513, 435, 506, 0, 439, 442, + 548, 533, 464, 465, 0, 0, 0, 0, 0, 0, + 0, 486, 495, 520, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 462, 0, 503, 0, 0, 0, 443, + 440, 0, 0, 0, 0, 484, 0, 0, 0, 445, + 0, 463, 521, 0, 433, 132, 525, 532, 481, 282, + 536, 479, 478, 539, 198, 0, 230, 135, 150, 109, + 147, 95, 105, 0, 134, 176, 206, 210, 529, 459, + 468, 117, 466, 208, 186, 246, 502, 188, 207, 154, + 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, + 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, + 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, + 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, + 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, + 137, 196, 156, 197, 138, 169, 168, 170, 0, 438, + 0, 227, 249, 264, 111, 454, 234, 258, 259, 0, + 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, + 148, 155, 203, 262, 185, 209, 115, 248, 225, 450, + 453, 448, 449, 497, 498, 544, 545, 546, 522, 444, + 0, 451, 452, 0, 527, 534, 535, 501, 94, 103, + 152, 261, 201, 128, 250, 434, 447, 121, 457, 0, + 0, 470, 475, 476, 488, 490, 491, 492, 493, 500, + 507, 508, 510, 516, 517, 518, 519, 524, 531, 550, + 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, + 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, + 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, + 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, + 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, + 231, 237, 238, 247, 254, 257, 538, 526, 0, 483, + 541, 456, 473, 549, 474, 477, 514, 441, 496, 179, + 471, 0, 460, 436, 467, 437, 458, 485, 123, 489, + 455, 528, 499, 540, 151, 0, 461, 547, 153, 505, + 0, 226, 167, 0, 0, 0, 487, 530, 494, 523, + 482, 515, 446, 504, 542, 472, 512, 543, 0, 0, + 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 509, 537, 469, 511, 513, 435, + 506, 0, 439, 442, 548, 533, 464, 465, 0, 0, + 0, 0, 0, 0, 0, 486, 495, 520, 480, 0, + 0, 0, 0, 0, 0, 1330, 0, 462, 0, 503, + 0, 0, 0, 443, 440, 0, 0, 0, 0, 484, + 0, 0, 0, 445, 0, 463, 521, 0, 433, 132, + 525, 532, 481, 282, 536, 479, 478, 539, 198, 0, + 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, + 206, 210, 529, 459, 468, 117, 466, 208, 186, 246, + 502, 188, 207, 154, 236, 199, 245, 255, 256, 233, + 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, + 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, + 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, + 102, 107, 251, 172, 235, 243, 166, 159, 101, 241, + 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, + 168, 170, 0, 438, 0, 227, 249, 264, 111, 454, + 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, + 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, + 115, 248, 225, 450, 453, 448, 449, 497, 498, 544, + 545, 546, 522, 444, 0, 451, 452, 0, 527, 534, + 535, 501, 94, 103, 152, 261, 201, 128, 250, 434, + 447, 121, 457, 0, 0, 470, 475, 476, 488, 490, + 491, 492, 493, 500, 507, 508, 510, 516, 517, 518, + 519, 524, 531, 550, 96, 97, 104, 110, 116, 120, + 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, + 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, + 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, + 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, + 538, 526, 0, 483, 541, 456, 473, 549, 474, 477, + 514, 441, 496, 179, 471, 0, 460, 436, 467, 437, + 458, 485, 123, 489, 455, 528, 499, 540, 151, 0, + 461, 547, 153, 505, 0, 226, 167, 0, 0, 0, + 487, 530, 494, 523, 482, 515, 446, 504, 542, 472, + 512, 543, 0, 0, 0, 91, 92, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 509, 537, + 469, 511, 513, 435, 506, 0, 439, 442, 548, 533, + 464, 465, 0, 0, 0, 0, 0, 0, 0, 486, + 495, 520, 480, 0, 0, 0, 0, 0, 0, 1017, + 0, 462, 0, 503, 0, 0, 0, 443, 440, 0, + 0, 0, 0, 484, 0, 0, 0, 445, 0, 463, + 521, 0, 433, 132, 525, 532, 481, 282, 536, 479, + 478, 539, 198, 0, 230, 135, 150, 109, 147, 95, + 105, 0, 134, 176, 206, 210, 529, 459, 468, 117, + 466, 208, 186, 246, 502, 188, 207, 154, 236, 199, + 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, + 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, + 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, + 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, + 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, + 156, 197, 138, 169, 168, 170, 0, 438, 0, 227, + 249, 264, 111, 454, 234, 258, 259, 0, 200, 112, + 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, + 203, 262, 185, 209, 115, 248, 225, 450, 453, 448, + 449, 497, 498, 544, 545, 546, 522, 444, 0, 451, + 452, 0, 527, 534, 535, 501, 94, 103, 152, 261, + 201, 128, 250, 434, 447, 121, 457, 0, 0, 470, + 475, 476, 488, 490, 491, 492, 493, 500, 507, 508, + 510, 516, 517, 518, 519, 524, 531, 550, 96, 97, + 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, + 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, + 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, + 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, + 238, 247, 254, 257, 538, 526, 0, 483, 541, 456, + 473, 549, 474, 477, 514, 441, 496, 179, 471, 0, + 460, 436, 467, 437, 458, 485, 123, 489, 455, 528, + 499, 540, 151, 0, 461, 547, 153, 505, 0, 226, + 167, 0, 0, 0, 487, 530, 494, 523, 482, 515, + 446, 504, 542, 472, 512, 543, 0, 0, 0, 91, + 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 113, 0, 509, 537, 469, 511, 513, 435, 506, 0, + 439, 442, 548, 533, 464, 465, 0, 0, 0, 0, + 0, 0, 0, 486, 495, 520, 480, 0, 0, 0, + 0, 0, 0, 981, 0, 462, 0, 503, 0, 0, + 0, 443, 440, 0, 0, 0, 0, 484, 0, 0, + 0, 445, 0, 463, 521, 0, 433, 132, 525, 532, + 481, 282, 536, 479, 478, 539, 198, 0, 230, 135, + 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, + 529, 459, 468, 117, 466, 208, 186, 246, 502, 188, + 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, + 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, + 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, + 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, + 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, + 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, + 0, 438, 0, 227, 249, 264, 111, 454, 234, 258, + 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, + 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, + 225, 450, 453, 448, 449, 497, 498, 544, 545, 546, + 522, 444, 0, 451, 452, 0, 527, 534, 535, 501, + 94, 103, 152, 261, 201, 128, 250, 434, 447, 121, + 457, 0, 0, 470, 475, 476, 488, 490, 491, 492, + 493, 500, 507, 508, 510, 516, 517, 518, 519, 524, + 531, 550, 96, 97, 104, 110, 116, 120, 124, 127, + 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, + 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, + 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, + 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, + 222, 228, 231, 237, 238, 247, 254, 257, 538, 526, + 0, 483, 541, 456, 473, 549, 474, 477, 514, 441, + 496, 179, 471, 0, 460, 436, 467, 437, 458, 485, + 123, 489, 455, 528, 499, 540, 151, 0, 461, 547, + 153, 505, 0, 226, 167, 0, 0, 0, 487, 530, + 494, 523, 482, 515, 446, 504, 542, 472, 512, 543, + 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 113, 0, 509, 537, 469, 511, + 513, 435, 506, 0, 439, 442, 548, 533, 464, 465, + 0, 0, 0, 0, 0, 0, 0, 486, 495, 520, + 480, 0, 0, 0, 0, 0, 0, 0, 0, 462, + 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, + 0, 484, 0, 0, 0, 445, 0, 463, 521, 0, + 433, 132, 525, 532, 481, 282, 536, 479, 478, 539, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 529, 459, 468, 117, 466, 208, + 186, 246, 502, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 438, 0, 227, 249, 264, + 111, 454, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 450, 453, 448, 449, 497, + 498, 544, 545, 546, 522, 444, 0, 451, 452, 0, + 527, 534, 535, 501, 94, 103, 152, 261, 201, 128, + 250, 434, 447, 121, 457, 0, 0, 470, 475, 476, + 488, 490, 491, 492, 493, 500, 507, 508, 510, 516, + 517, 518, 519, 524, 531, 550, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 538, 526, 0, 483, 541, 456, 473, 549, + 474, 477, 514, 441, 496, 179, 471, 0, 460, 436, + 467, 437, 458, 485, 123, 489, 455, 528, 499, 540, + 151, 0, 461, 547, 153, 505, 0, 226, 167, 0, + 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, + 542, 472, 512, 543, 0, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 509, 537, 469, 511, 513, 435, 506, 0, 439, 442, + 548, 533, 464, 465, 0, 0, 0, 0, 0, 0, + 0, 486, 495, 520, 480, 0, 0, 0, 0, 0, + 0, 0, 0, 462, 0, 503, 0, 0, 0, 443, + 440, 0, 0, 0, 0, 484, 0, 0, 0, 445, + 0, 463, 521, 0, 433, 132, 525, 532, 481, 282, + 536, 479, 478, 539, 198, 0, 230, 135, 150, 109, + 147, 95, 105, 0, 134, 176, 206, 210, 529, 459, + 468, 117, 466, 208, 186, 246, 502, 188, 207, 154, + 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, + 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, + 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, + 239, 240, 118, 263, 106, 252, 102, 431, 251, 172, + 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, + 137, 196, 156, 197, 138, 169, 168, 170, 0, 438, + 0, 227, 249, 264, 111, 454, 234, 258, 259, 0, + 200, 112, 131, 125, 195, 129, 432, 430, 140, 224, + 148, 155, 203, 262, 185, 209, 115, 248, 225, 450, + 453, 448, 449, 497, 498, 544, 545, 546, 522, 444, + 0, 451, 452, 0, 527, 534, 535, 501, 94, 103, + 152, 261, 201, 128, 250, 434, 447, 121, 457, 0, + 0, 470, 475, 476, 488, 490, 491, 492, 493, 500, + 507, 508, 510, 516, 517, 518, 519, 524, 531, 550, + 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, + 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, + 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, + 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, + 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, + 231, 237, 238, 247, 254, 257, 538, 526, 0, 483, + 541, 456, 473, 549, 474, 477, 514, 441, 496, 179, + 471, 0, 460, 436, 467, 437, 458, 485, 123, 489, + 455, 528, 499, 540, 151, 0, 461, 547, 153, 505, + 0, 226, 167, 0, 0, 0, 487, 530, 494, 523, + 482, 515, 446, 504, 542, 472, 512, 543, 0, 0, + 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 509, 537, 469, 511, 513, 435, + 506, 0, 439, 442, 548, 533, 464, 465, 0, 0, + 0, 0, 0, 0, 0, 486, 495, 520, 480, 0, + 0, 0, 0, 0, 0, 0, 0, 462, 0, 503, + 0, 0, 0, 443, 440, 0, 0, 0, 0, 484, + 0, 0, 0, 445, 0, 463, 521, 0, 433, 132, + 525, 532, 481, 282, 536, 479, 478, 539, 198, 0, + 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, + 206, 210, 529, 459, 468, 117, 466, 208, 186, 246, + 502, 188, 207, 154, 236, 199, 245, 255, 256, 233, + 253, 260, 223, 98, 232, 760, 114, 218, 0, 0, + 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, + 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, + 102, 431, 251, 172, 235, 243, 166, 159, 101, 241, + 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, + 168, 170, 0, 438, 0, 227, 249, 264, 111, 454, + 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, + 432, 430, 140, 224, 148, 155, 203, 262, 185, 209, + 115, 248, 225, 450, 453, 448, 449, 497, 498, 544, + 545, 546, 522, 444, 0, 451, 452, 0, 527, 534, + 535, 501, 94, 103, 152, 261, 201, 128, 250, 434, + 447, 121, 457, 0, 0, 470, 475, 476, 488, 490, + 491, 492, 493, 500, 507, 508, 510, 516, 517, 518, + 519, 524, 531, 550, 96, 97, 104, 110, 116, 120, + 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, + 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, + 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, + 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, + 538, 526, 0, 483, 541, 456, 473, 549, 474, 477, + 514, 441, 496, 179, 471, 0, 460, 436, 467, 437, + 458, 485, 123, 489, 455, 528, 499, 540, 151, 0, + 461, 547, 153, 505, 0, 226, 167, 0, 0, 0, + 487, 530, 494, 523, 482, 515, 446, 504, 542, 472, + 512, 543, 0, 0, 0, 91, 92, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 509, 537, + 469, 511, 513, 435, 506, 0, 439, 442, 548, 533, + 464, 465, 0, 0, 0, 0, 0, 0, 0, 486, + 495, 520, 480, 0, 0, 0, 0, 0, 0, 0, + 0, 462, 0, 503, 0, 0, 0, 443, 440, 0, + 0, 0, 0, 484, 0, 0, 0, 445, 0, 463, + 521, 0, 433, 132, 525, 532, 481, 282, 536, 479, + 478, 539, 198, 0, 230, 135, 150, 109, 147, 95, + 105, 0, 134, 176, 206, 210, 529, 459, 468, 117, + 466, 208, 186, 246, 502, 188, 207, 154, 236, 199, + 245, 255, 256, 233, 253, 260, 223, 98, 232, 422, + 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, + 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, + 118, 263, 106, 252, 102, 431, 251, 172, 235, 243, + 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, + 156, 197, 138, 169, 168, 170, 0, 438, 0, 227, + 249, 264, 111, 454, 234, 258, 259, 0, 200, 112, + 131, 125, 195, 129, 432, 430, 425, 424, 148, 155, + 203, 262, 185, 209, 115, 248, 225, 450, 453, 448, + 449, 497, 498, 544, 545, 546, 522, 444, 0, 451, + 452, 0, 527, 534, 535, 501, 94, 103, 152, 261, + 201, 128, 250, 434, 447, 121, 457, 0, 0, 470, + 475, 476, 488, 490, 491, 492, 493, 500, 507, 508, + 510, 516, 517, 518, 519, 524, 531, 550, 96, 97, + 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, + 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, + 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, + 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, + 238, 247, 254, 257, 179, 0, 0, 921, 0, 326, + 0, 0, 0, 123, 0, 325, 0, 0, 0, 151, + 0, 922, 369, 153, 0, 0, 226, 167, 0, 0, + 0, 0, 0, 360, 361, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 91, 92, 93, 347, + 346, 349, 350, 351, 352, 0, 0, 113, 348, 353, + 354, 355, 0, 0, 0, 323, 340, 0, 368, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, + 409, 0, 0, 0, 383, 0, 339, 0, 0, 332, + 333, 335, 334, 336, 341, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 382, 0, 0, 282, 0, + 0, 380, 0, 198, 0, 230, 135, 150, 109, 147, + 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, + 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, + 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, + 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, + 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, + 240, 118, 263, 106, 252, 102, 107, 251, 172, 235, + 243, 166, 159, 101, 241, 164, 158, 149, 126, 137, + 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, + 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, + 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, + 155, 203, 262, 185, 209, 115, 248, 225, 370, 381, + 376, 377, 374, 375, 373, 372, 371, 384, 362, 363, + 364, 365, 367, 0, 378, 379, 366, 94, 103, 152, + 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, + 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, + 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, + 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, + 237, 238, 247, 254, 257, 179, 0, 0, 0, 0, + 326, 0, 0, 0, 123, 0, 325, 0, 0, 0, + 151, 0, 0, 369, 153, 0, 0, 226, 167, 0, + 0, 0, 0, 0, 360, 361, 0, 0, 0, 0, + 0, 0, 1024, 0, 57, 0, 0, 91, 92, 93, + 347, 346, 349, 350, 351, 352, 0, 0, 113, 348, + 353, 354, 355, 1025, 0, 0, 323, 340, 0, 368, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, + 338, 0, 0, 0, 0, 383, 0, 339, 0, 0, + 332, 333, 335, 334, 336, 341, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 382, 0, 0, 282, + 0, 0, 380, 0, 198, 0, 230, 135, 150, 109, + 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, + 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, + 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, + 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, + 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, + 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, + 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, + 137, 196, 156, 197, 138, 169, 168, 170, 0, 0, + 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, + 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, + 148, 155, 203, 262, 185, 209, 115, 248, 225, 370, + 381, 376, 377, 374, 375, 373, 372, 371, 384, 362, + 363, 364, 365, 367, 0, 378, 379, 366, 94, 103, + 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, + 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, + 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, + 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, + 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, + 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, + 0, 326, 0, 0, 0, 123, 0, 325, 0, 0, + 0, 151, 0, 0, 369, 153, 0, 0, 226, 167, + 0, 0, 0, 0, 0, 360, 361, 0, 0, 0, + 0, 0, 0, 0, 0, 57, 0, 397, 91, 92, + 93, 347, 346, 349, 350, 351, 352, 0, 0, 113, + 348, 353, 354, 355, 0, 0, 0, 323, 340, 0, + 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 337, 338, 0, 0, 0, 0, 383, 0, 339, 0, + 0, 332, 333, 335, 334, 336, 341, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 382, 0, 0, + 282, 0, 0, 380, 0, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, + 0, 0, 117, 0, 208, 186, 246, 0, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 370, 381, 376, 377, 374, 375, 373, 372, 371, 384, + 362, 363, 364, 365, 367, 0, 378, 379, 366, 94, + 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, + 0, 0, 326, 0, 0, 0, 123, 0, 325, 0, + 0, 0, 151, 0, 0, 369, 153, 0, 0, 226, + 167, 0, 0, 0, 0, 0, 360, 361, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 0, 91, + 92, 93, 347, 346, 349, 350, 351, 352, 0, 0, + 113, 348, 353, 354, 355, 0, 0, 0, 323, 340, + 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 337, 338, 409, 0, 0, 0, 383, 0, 339, + 0, 0, 332, 333, 335, 334, 336, 341, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 132, 382, 0, + 0, 282, 0, 0, 380, 0, 198, 0, 230, 135, + 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, + 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, + 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, + 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, + 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, + 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, + 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, + 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, + 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, + 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, + 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, + 225, 370, 381, 376, 377, 374, 375, 373, 372, 371, + 384, 362, 363, 364, 365, 367, 0, 378, 379, 366, + 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 97, 104, 110, 116, 120, 124, 127, + 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, + 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, + 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, + 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, + 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, + 0, 0, 0, 326, 0, 0, 0, 123, 0, 325, + 0, 0, 0, 151, 0, 0, 369, 153, 0, 0, + 226, 167, 0, 0, 0, 0, 0, 360, 361, 0, + 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, + 91, 92, 93, 347, 939, 349, 350, 351, 352, 0, + 0, 113, 348, 353, 354, 355, 0, 0, 0, 323, + 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 337, 338, 409, 0, 0, 0, 383, 0, + 339, 0, 0, 332, 333, 335, 334, 336, 341, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 382, + 0, 0, 282, 0, 0, 380, 0, 198, 0, 230, + 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, + 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, + 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, + 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, + 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, + 130, 119, 178, 239, 240, 118, 263, 106, 252, 102, + 107, 251, 172, 235, 243, 166, 159, 101, 241, 164, + 158, 149, 126, 137, 196, 156, 197, 138, 169, 168, + 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, + 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, + 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, + 248, 225, 370, 381, 376, 377, 374, 375, 373, 372, + 371, 384, 362, 363, 364, 365, 367, 0, 378, 379, + 366, 94, 103, 152, 261, 201, 128, 250, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 97, 104, 110, 116, 120, 124, + 127, 133, 136, 139, 141, 142, 143, 146, 157, 160, + 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, + 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, + 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, + 0, 0, 0, 0, 326, 0, 0, 0, 123, 0, + 325, 0, 0, 0, 151, 0, 0, 369, 153, 0, + 0, 226, 167, 0, 0, 0, 0, 0, 360, 361, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 0, 91, 92, 93, 347, 936, 349, 350, 351, 352, + 0, 0, 113, 348, 353, 354, 355, 0, 0, 0, + 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 337, 338, 409, 0, 0, 0, 383, + 0, 339, 0, 0, 332, 333, 335, 334, 336, 341, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, + 382, 0, 0, 282, 0, 0, 380, 0, 198, 0, + 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, + 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, + 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, + 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, + 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, + 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, + 102, 107, 251, 172, 235, 243, 166, 159, 101, 241, + 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, + 168, 170, 0, 0, 0, 227, 249, 264, 111, 0, + 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, + 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, + 115, 248, 225, 370, 381, 376, 377, 374, 375, 373, + 372, 371, 384, 362, 363, 364, 365, 367, 0, 378, + 379, 366, 94, 103, 152, 261, 201, 128, 250, 0, + 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 97, 104, 110, 116, 120, + 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, + 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, + 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, + 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 326, 0, 0, + 0, 123, 0, 325, 0, 0, 0, 151, 0, 0, + 369, 153, 0, 0, 226, 167, 0, 0, 0, 0, + 0, 360, 361, 0, 0, 0, 0, 0, 0, 0, + 0, 57, 0, 0, 91, 92, 93, 347, 346, 349, + 350, 351, 352, 0, 0, 113, 348, 353, 354, 355, + 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 337, 338, 0, 0, + 0, 0, 383, 0, 339, 0, 0, 332, 333, 335, + 334, 336, 341, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 382, 0, 0, 282, 0, 0, 380, + 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, + 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, + 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, + 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, + 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, + 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, + 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, + 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, + 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, + 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, + 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, + 262, 185, 209, 115, 248, 225, 370, 381, 376, 377, + 374, 375, 373, 372, 371, 384, 362, 363, 364, 365, + 367, 0, 378, 379, 366, 94, 103, 152, 261, 201, + 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, + 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, + 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, + 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, + 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, + 247, 254, 257, 179, 0, 0, 0, 0, 326, 0, + 0, 0, 123, 0, 325, 0, 0, 0, 151, 0, + 0, 369, 153, 0, 0, 226, 167, 0, 0, 0, + 0, 0, 360, 361, 0, 0, 0, 0, 0, 0, + 0, 0, 57, 0, 0, 91, 92, 93, 347, 346, + 349, 350, 351, 352, 0, 0, 113, 348, 353, 354, + 355, 0, 0, 0, 323, 340, 0, 368, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 337, 338, 0, + 0, 0, 0, 383, 0, 339, 0, 0, 332, 333, + 335, 334, 336, 341, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 132, 382, 0, 0, 282, 0, 0, + 380, 0, 198, 0, 230, 135, 150, 109, 147, 95, + 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, + 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, + 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, + 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, + 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, + 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, + 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, + 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, + 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, + 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, + 203, 262, 185, 209, 115, 248, 225, 370, 381, 376, + 377, 374, 375, 373, 372, 371, 384, 362, 363, 364, + 365, 367, 0, 378, 379, 366, 94, 103, 152, 261, + 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, + 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, + 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, + 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, + 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, + 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, + 0, 0, 369, 153, 0, 0, 226, 167, 0, 0, + 0, 0, 0, 360, 361, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 91, 92, 93, 347, + 346, 349, 350, 351, 352, 0, 0, 113, 348, 353, + 354, 355, 0, 0, 0, 0, 340, 0, 368, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, + 0, 0, 0, 0, 383, 0, 339, 0, 0, 332, + 333, 335, 334, 336, 341, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 382, 0, 0, 282, 0, + 0, 380, 0, 198, 0, 230, 135, 150, 109, 147, + 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, + 117, 0, 208, 186, 246, 1592, 188, 207, 154, 236, + 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, + 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, + 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, + 240, 118, 263, 106, 252, 102, 107, 251, 172, 235, + 243, 166, 159, 101, 241, 164, 158, 149, 126, 137, + 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, + 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, + 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, + 155, 203, 262, 185, 209, 115, 248, 225, 370, 381, + 376, 377, 374, 375, 373, 372, 371, 384, 362, 363, + 364, 365, 367, 0, 378, 379, 366, 94, 103, 152, + 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, + 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, + 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, + 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, + 237, 238, 247, 254, 257, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, + 151, 0, 0, 369, 153, 0, 0, 226, 167, 0, + 0, 0, 0, 0, 360, 361, 0, 0, 0, 0, + 0, 0, 0, 0, 57, 0, 397, 91, 92, 93, + 347, 346, 349, 350, 351, 352, 0, 0, 113, 348, + 353, 354, 355, 0, 0, 0, 0, 340, 0, 368, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, + 338, 0, 0, 0, 0, 383, 0, 339, 0, 0, + 332, 333, 335, 334, 336, 341, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 382, 0, 0, 282, + 0, 0, 380, 0, 198, 0, 230, 135, 150, 109, + 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, + 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, + 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, + 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, + 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, + 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, + 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, + 137, 196, 156, 197, 138, 169, 168, 170, 0, 0, + 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, + 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, + 148, 155, 203, 262, 185, 209, 115, 248, 225, 370, + 381, 376, 377, 374, 375, 373, 372, 371, 384, 362, + 363, 364, 365, 367, 0, 378, 379, 366, 94, 103, + 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, + 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, + 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, + 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, + 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, + 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 151, 0, 0, 369, 153, 0, 0, 226, 167, + 0, 0, 0, 0, 0, 360, 361, 0, 0, 0, + 0, 0, 0, 0, 0, 57, 0, 0, 91, 92, + 93, 347, 346, 349, 350, 351, 352, 0, 0, 113, + 348, 353, 354, 355, 0, 0, 0, 0, 340, 0, + 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 337, 338, 0, 0, 0, 0, 383, 0, 339, 0, + 0, 332, 333, 335, 334, 336, 341, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 382, 0, 0, + 282, 0, 0, 380, 0, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, + 0, 0, 117, 0, 208, 186, 246, 0, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 370, 381, 376, 377, 374, 375, 373, 372, 371, 384, + 362, 363, 364, 365, 367, 0, 378, 379, 366, 94, + 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, + 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, + 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 640, 639, 649, + 650, 642, 643, 644, 645, 646, 647, 648, 641, 0, + 0, 651, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, + 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, + 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, + 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, + 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, + 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, + 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, + 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, + 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, + 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, + 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, + 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, + 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, + 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 97, 104, 110, 116, 120, 124, 127, + 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, + 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, + 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, + 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, + 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, + 0, 0, 735, 0, 0, 0, 0, 123, 0, 0, + 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, + 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 92, 93, 0, 737, 0, 0, 0, 0, 0, + 0, 113, 0, 0, 0, 0, 0, 630, 629, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, + 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, + 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, + 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, + 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, + 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, + 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, + 130, 119, 178, 239, 240, 118, 263, 106, 252, 102, + 107, 251, 172, 235, 243, 166, 159, 101, 241, 164, + 158, 149, 126, 137, 196, 156, 197, 138, 169, 168, + 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, + 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, + 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, + 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 97, 104, 110, 116, 120, 124, + 127, 133, 136, 139, 141, 142, 143, 146, 157, 160, + 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, + 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, + 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, + 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, + 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 0, 0, 0, 0, 83, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, + 85, 86, 0, 82, 0, 0, 0, 87, 198, 0, + 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, + 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, + 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, + 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, + 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, + 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, + 102, 107, 251, 172, 235, 243, 166, 159, 101, 241, + 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, + 168, 170, 0, 0, 0, 227, 249, 264, 111, 0, + 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, + 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, + 115, 248, 225, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 94, 103, 152, 261, 201, 128, 250, 0, + 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 97, 104, 110, 116, 120, + 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, + 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, + 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, + 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 123, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, + 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 314, 0, + 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, + 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, + 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, + 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, + 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, + 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, + 204, 122, 130, 119, 178, 239, 240, 118, 263, 106, + 252, 102, 107, 251, 172, 235, 243, 166, 159, 101, + 241, 164, 158, 149, 126, 137, 196, 156, 197, 138, + 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, + 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, + 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, + 209, 115, 248, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, + 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96, 97, 104, 110, 116, + 120, 124, 127, 133, 136, 139, 141, 142, 143, 146, + 157, 160, 161, 162, 163, 173, 174, 175, 177, 180, + 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, + 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, + 257, 313, 179, 0, 0, 0, 1007, 0, 0, 0, + 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, + 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 93, 0, 1009, 0, + 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, + 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, + 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, + 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, + 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, + 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, + 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, + 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, + 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, + 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, + 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, + 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, + 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, + 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, + 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, + 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, + 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, + 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, + 247, 254, 257, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, + 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 57, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 0, 0, 0, 282, + 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, + 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, + 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, + 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, + 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, + 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, + 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, + 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, + 137, 196, 156, 197, 138, 169, 168, 170, 0, 0, + 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, + 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, + 148, 155, 203, 262, 185, 209, 115, 248, 225, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 94, 103, + 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, + 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, + 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, + 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, + 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, + 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, + 1007, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 93, 0, 1009, 0, 0, 0, 0, 0, 0, 113, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, + 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, + 0, 0, 117, 0, 208, 186, 246, 0, 1005, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, + 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, + 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 92, 93, 0, 0, 973, 0, 0, 974, 0, 0, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, + 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, + 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, + 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, + 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, + 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, + 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, + 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, + 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, + 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, + 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, + 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, + 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, + 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 97, 104, 110, 116, 120, 124, 127, + 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, + 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, + 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, + 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, + 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 123, 0, 770, + 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, + 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 91, 92, 93, 0, 769, 0, 0, 0, 0, 0, + 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, + 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, + 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, + 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, + 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, + 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, + 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, + 130, 119, 178, 239, 240, 118, 263, 106, 252, 102, + 107, 251, 172, 235, 243, 166, 159, 101, 241, 164, + 158, 149, 126, 137, 196, 156, 197, 138, 169, 168, + 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, + 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, + 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, + 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 97, 104, 110, 116, 120, 124, + 127, 133, 136, 139, 141, 142, 143, 146, 157, 160, + 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, + 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, + 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, + 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, + 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 397, 91, 92, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, + 0, 0, 0, 282, 0, 0, 0, 0, 198, 0, + 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, + 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, + 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, + 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, + 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, + 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, + 102, 107, 251, 172, 235, 243, 166, 159, 101, 241, + 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, + 168, 170, 0, 0, 0, 227, 249, 264, 111, 0, + 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, + 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, + 115, 248, 225, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 94, 103, 152, 261, 201, 128, 250, 0, + 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 97, 104, 110, 116, 120, + 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, + 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, + 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, + 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 123, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, + 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, + 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, + 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, + 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, + 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, + 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, + 204, 122, 130, 119, 178, 239, 240, 118, 263, 106, + 252, 102, 107, 251, 172, 235, 243, 166, 159, 101, + 241, 164, 158, 149, 126, 137, 196, 156, 197, 138, + 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, + 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, + 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, + 209, 115, 248, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, + 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96, 97, 104, 110, 116, + 120, 124, 127, 133, 136, 139, 141, 142, 143, 146, + 157, 160, 161, 162, 163, 173, 174, 175, 177, 180, + 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, + 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, + 257, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, + 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 91, 92, 93, 0, 1009, 0, 0, + 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, + 186, 246, 0, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 0, 0, 227, 249, 264, + 111, 0, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, + 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, + 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 93, 0, 737, 0, + 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, + 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, + 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, + 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, + 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, + 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, + 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, + 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, + 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, + 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, + 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, + 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, + 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, + 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, + 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, + 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, + 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, + 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, + 247, 254, 257, 179, 0, 0, 0, 0, 0, 0, + 0, 740, 123, 0, 0, 0, 0, 0, 151, 0, + 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 92, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 132, 0, 0, 0, 282, 0, 0, + 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, + 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, + 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, + 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, + 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, + 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, + 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, + 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, + 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, + 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, + 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, + 203, 262, 185, 209, 115, 248, 225, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, + 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, + 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, + 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, + 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, + 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, + 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, + 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, + 619, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, + 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, + 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, + 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, + 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, + 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, + 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, + 240, 118, 263, 106, 252, 102, 107, 251, 172, 235, + 243, 166, 159, 101, 241, 164, 158, 149, 126, 137, + 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, + 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, + 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, + 155, 203, 262, 185, 209, 115, 248, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, + 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, + 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, + 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, + 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, + 237, 238, 247, 254, 257, 414, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, + 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 91, 92, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, + 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, + 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, + 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, + 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, + 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, + 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, + 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, + 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, + 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, + 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, + 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, + 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, + 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, + 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, + 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, + 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, + 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, + 247, 254, 257, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 123, 0, 0, 0, 0, 0, 151, 0, + 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 92, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 132, 0, 277, 0, 282, 0, 0, + 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, + 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, + 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, + 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, + 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, + 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, + 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, + 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, + 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, + 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, + 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, + 203, 262, 185, 209, 115, 248, 225, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, + 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, + 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, + 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, + 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, + 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, + 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, + 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, + 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, + 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, + 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, + 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, + 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, + 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, + 240, 118, 263, 106, 252, 102, 107, 251, 172, 235, + 243, 166, 159, 101, 241, 164, 158, 149, 126, 137, + 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, + 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, + 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, + 155, 203, 262, 185, 209, 115, 248, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, + 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, + 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, + 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, + 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, + 237, 238, 247, 254, 257, } var yyPact = [...]int{ - 218, -1000, -272, 1055, -1000, -1000, -1000, -1000, -1000, -1000, + 3144, -1000, -275, 1036, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1006, 782, -1000, -1000, -1000, - -1000, -1000, -1000, 261, 12015, 29, 137, 8, 16767, 136, - 2029, 17105, -1000, 21, -1000, -1000, 12353, -1000, -1000, -66, - -82, -1000, 9987, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 764, 989, 995, 1000, 635, 999, -1000, 8623, 95, - 95, 16429, 7271, -1000, -1000, 380, 17105, 128, 17105, -127, - 88, 88, 88, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 968, 778, -1000, + -1000, -1000, -1000, -1000, -1000, 284, 11521, 26, 147, 20, + 16315, 146, 126, 16656, -1000, 28, -1000, 16, 16656, 24, + 11862, -1000, -1000, -81, -83, -1000, 9475, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 774, 944, 964, 966, 525, + 972, -1000, 8099, 112, 112, 15974, 6735, -1000, -1000, 490, + 16656, 140, 16656, -147, 109, 109, 109, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2654,23 +2618,24 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 132, 17105, 545, 545, 265, -1000, 17105, 85, 545, - 85, 85, 85, 17105, -1000, 182, -1000, -1000, -1000, 17105, - 545, 914, 342, 89, 4814, -1000, 183, -1000, 4814, 30, - 4814, -60, 1014, 31, 6, -1000, 4814, -1000, -1000, -1000, - -1000, -1000, -1000, 16084, 146, 278, -1000, -1000, -1000, -1000, - -1000, -1000, 552, 383, -1000, 9987, 1596, 511, 511, -1000, - -1000, 166, -1000, -1000, 11001, 11001, 11001, 11001, 11001, 11001, - 11001, 11001, 11001, 11001, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 511, 180, - -1000, 9649, 511, 511, 511, 511, 511, 511, 511, 511, - 9987, 511, 511, 511, 511, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 511, 511, 511, -1000, -1000, 1006, - -1000, 782, -1000, -1000, -1000, 966, 9987, 9987, 1006, -1000, - 897, 8623, -1000, -1000, 960, -1000, -1000, -1000, -1000, 318, - 1037, -1000, 11677, 179, 15746, 14732, 17105, 767, 742, -1000, - -1000, 177, 727, 6920, -97, -1000, -1000, -1000, 264, 14056, - -1000, -1000, -1000, 913, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 129, 16656, 644, 644, 317, + -1000, 16656, 103, 644, 103, 103, 103, 16656, -1000, 187, + -1000, -1000, -1000, 16656, 644, 884, 313, 64, 4257, -1000, + 204, -1000, 4257, 42, 4257, -21, 989, 47, -40, -1000, + 4257, -1000, -1000, -1000, -1000, -1000, -1000, 121, -1000, -1000, + 16656, 15626, 128, 298, -1000, -1000, -1000, -1000, -1000, -1000, + 565, 531, -1000, 9475, 1697, 733, 733, -1000, -1000, 177, + -1000, -1000, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, + 10498, 10498, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 733, 186, -1000, 9134, + 733, 733, 733, 733, 733, 733, 733, 733, 9475, 733, + 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, + 733, 733, 733, 733, 733, -1000, -1000, 968, -1000, 778, + -1000, -1000, -1000, 911, 9475, 9475, 968, -1000, 844, 8099, + -1000, -1000, 853, -1000, -1000, -1000, -1000, 354, 1008, -1000, + 11180, 184, 15285, 14262, 16656, 766, 731, -1000, -1000, 183, + 725, 6381, -104, -1000, -1000, -1000, 268, 13580, -1000, -1000, + -1000, 878, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2682,311 +2647,313 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 701, 17105, -1000, 317, -1000, 545, 4814, - 103, 545, 293, 545, 17105, 17105, 4814, 4814, 4814, 36, - 76, 67, 17105, 715, 100, 17105, 975, 831, 17105, 545, - 545, -1000, 6218, -1000, 4814, 342, -1000, 450, 9987, 4814, - 4814, 4814, 17105, 4814, 4814, -1000, -1000, -1000, 324, -1000, - -1000, -1000, -1000, 4814, 4814, -1000, 1036, 319, -1000, -1000, - -1000, -1000, 9987, 226, -1000, 830, -1000, -1000, -1000, -1000, - -1000, 1055, -1000, -1000, -1000, -118, -1000, -1000, 9987, 9987, - 9987, 560, 228, 11001, 510, 377, 11001, 11001, 11001, 11001, - 11001, 11001, 11001, 11001, 11001, 11001, 11001, 11001, 11001, 11001, - 11001, 527, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 545, -1000, 1053, 612, 612, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 11339, 7609, 6218, 635, 697, 1006, - 8623, 8623, 9987, 9987, 9299, 8961, 8623, 954, 290, 383, - 17105, -1000, -1000, 10663, -1000, -1000, -1000, -1000, -1000, 457, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17105, 17105, 8623, - 8623, 8623, 8623, 8623, 995, 635, 960, -1000, 1049, 213, - 623, 713, -1000, 572, 995, 13718, 719, -1000, 960, -1000, - -1000, -1000, 17105, -1000, -1000, 15408, -1000, -1000, 5867, 52, - 17105, -1000, 703, 860, -1000, -1000, -1000, 979, 13042, 13380, - 52, 580, 14732, 17105, -1000, -1000, 14732, 17105, 5516, 6569, - -97, -1000, 646, -1000, -88, -102, 7947, 195, -1000, -1000, - -1000, -1000, 4463, 288, 494, 339, -54, -1000, -1000, -1000, - 745, -1000, 745, 745, 745, 745, -19, -19, -19, -19, - -1000, -1000, -1000, -1000, -1000, 802, 797, -1000, 745, 745, - 745, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 793, - 793, 793, 756, 756, 810, -1000, 17105, 4814, 970, 4814, - -1000, 86, -1000, -1000, -1000, 17105, 17105, 17105, 17105, 17105, - 145, 17105, 17105, 709, -1000, 17105, 4814, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 383, -1000, -1000, -1000, -1000, - -1000, -1000, 17105, -1000, -1000, -1000, -1000, 17105, 342, 17105, - 17105, 383, -1000, 437, 17105, -1000, -1000, -1000, -1000, 383, - 228, 239, -1000, -1000, 373, -1000, -1000, 1941, -1000, -1000, - -1000, -1000, 510, 11001, 11001, 11001, 852, 1941, 2181, 435, - 518, 197, 381, 381, 194, 194, 194, 194, 194, 550, - 550, -1000, -1000, -1000, 457, -1000, -1000, -1000, 457, 8623, - 8623, 708, 511, 176, -1000, 764, -1000, -1000, 995, 683, - 683, 301, 554, 312, 1035, 683, 289, 1028, 683, 683, - 8623, -1000, -1000, 297, -1000, 9987, 457, -1000, 171, -1000, - 1690, 707, 680, 683, 457, 457, 683, 683, 966, -1000, - -1000, 848, 9987, 9987, 9987, -1000, -1000, -1000, 966, 994, - -1000, 904, 903, 1012, 8623, 14732, 960, -1000, -1000, -1000, - 169, 834, 511, -1000, 17105, 14732, 14732, 14732, 14732, 14732, - -1000, 873, 859, -1000, 849, 847, 868, 17105, -1000, 687, - 635, 13042, 224, 511, -1000, 15070, -1000, -1000, 1012, 14732, - 716, -1000, 716, -1000, 163, -1000, -1000, 646, -97, -83, - -1000, -1000, -1000, -1000, 383, -1000, 651, 639, 4112, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 788, 545, -1000, 958, - 206, 232, 545, 941, -1000, -1000, -1000, 918, -1000, 313, - -56, -1000, -1000, 386, -19, -19, -1000, -1000, 195, 911, - 195, 195, 195, 427, 427, -1000, -1000, -1000, -1000, 384, - -1000, -1000, -1000, 378, -1000, 827, 17105, 4814, -1000, -1000, - -1000, -1000, 786, 786, 233, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 48, 768, -1000, -1000, - -1000, -1000, 3, 35, 98, -1000, 4814, -1000, 319, 319, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 852, - 1941, 1823, -1000, 11001, 11001, -1000, -1000, 683, 683, 8623, - 6218, 1006, 966, -1000, -1000, 223, 527, 223, 11001, 11001, - -1000, 11001, 11001, -1000, -145, 699, 281, -1000, 9987, 515, - -1000, 6218, -1000, 11001, 11001, -1000, -1000, -1000, -1000, -1000, - -1000, 880, 383, 383, -1000, -1000, 17105, -1000, -1000, -1000, - -1000, 1010, 9987, -1000, 609, -1000, 5165, 821, 17105, 511, - 1055, 13042, 17105, 750, -1000, 244, 860, 787, 814, 735, - -1000, -1000, -1000, -1000, 857, -1000, 851, -1000, -1000, -1000, - -1000, -1000, 635, -1000, 125, 120, 105, 17105, -1000, 1006, - 716, -1000, -1000, 207, -1000, -1000, -110, -112, -1000, -1000, - -1000, 4463, -1000, 4463, 17105, 70, -1000, 545, 545, -1000, - -1000, -1000, 778, 813, 11001, -1000, -1000, -1000, 492, 195, - 195, -1000, 500, -1000, -1000, -1000, 678, -1000, 666, 602, - 662, 17105, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 717, 16656, -1000, 2928, -1000, 644, 4257, 123, 644, + 319, 644, 16656, 16656, 4257, 4257, 4257, 53, 87, 74, + 16656, 723, 117, 16656, 918, 800, 16656, 644, 644, -1000, + 5673, -1000, 4257, 313, -1000, 460, 9475, 4257, 4257, 4257, + 16656, 4257, 4257, -1000, -1000, -1000, 329, -1000, -1000, -1000, + -1000, 4257, 4257, -1000, 1002, 312, -1000, -1000, -1000, -1000, + 9475, 233, -1000, 798, -1000, 22, -1000, -1000, -1000, -1000, + -1000, 1036, -1000, -1000, -1000, -129, -1000, -1000, 9475, 9475, + 9475, 545, 239, 10498, 383, 335, 10498, 10498, 10498, 10498, + 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, + 10498, 596, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 644, -1000, 1033, 619, 619, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 10839, 7076, 5673, 525, 708, 968, + 8099, 8099, 9475, 9475, 8781, 8440, 8099, 888, 305, 531, + 16656, -1000, -1000, 10157, -1000, -1000, -1000, -1000, -1000, 475, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 16656, 16656, 8099, + 8099, 8099, 8099, 8099, 964, 525, 853, -1000, 1026, 222, + 537, 713, -1000, 394, 964, 13239, 758, -1000, 853, -1000, + -1000, -1000, 16656, -1000, -1000, 14944, -1000, -1000, 5319, 75, + 16656, -1000, 524, 975, -1000, -1000, -1000, 936, 12557, 12898, + 75, 660, 14262, 16656, -1000, -1000, 14262, 16656, 4965, 6027, + -104, -1000, 630, -1000, -113, -117, 7417, 202, -1000, -1000, + -1000, -1000, 3903, 247, 502, 369, -69, -1000, -1000, -1000, + 739, -1000, 739, 739, 739, 739, -25, -25, -25, -25, + -1000, -1000, -1000, -1000, -1000, 755, 754, -1000, 739, 739, + 739, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 753, + 753, 753, 744, 744, 763, -1000, 16656, 4257, 914, 4257, + -1000, 82, -1000, -1000, -1000, 16656, 16656, 16656, 16656, 16656, + 156, 16656, 16656, 665, -1000, 16656, 4257, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 531, -1000, -1000, -1000, -1000, + -1000, -1000, 16656, -1000, -1000, -1000, -1000, 16656, 313, 16656, + 16656, 531, -1000, 459, 16656, 16656, -1000, -1000, -1000, -1000, + -1000, 531, 239, 243, -1000, -1000, 495, -1000, -1000, 1831, + -1000, -1000, -1000, -1000, 383, 10498, 10498, 10498, 564, 1831, + 1931, 542, 1945, 203, 492, 492, 201, 201, 201, 201, + 201, 435, 435, -1000, -1000, -1000, 475, -1000, -1000, -1000, + 475, 8099, 8099, 655, 733, 181, -1000, 774, -1000, -1000, + 964, 697, 697, 398, 359, 280, 998, 697, 276, 992, + 697, 697, 8099, -1000, -1000, 327, -1000, 9475, 475, -1000, + 180, -1000, 1535, 638, 635, 697, 475, 475, 697, 697, + 911, -1000, -1000, 840, 9475, 9475, 9475, -1000, -1000, -1000, + 911, 983, -1000, 851, 850, 974, 8099, 14262, 853, -1000, + -1000, -1000, 175, 764, 733, -1000, 16656, 14262, 14262, 14262, + 14262, 14262, -1000, 828, 827, -1000, 814, 812, 813, 16656, + -1000, 706, 525, 12557, 198, 733, -1000, 14603, -1000, -1000, + 974, 14262, 568, -1000, 568, -1000, 173, -1000, -1000, 630, + -104, -48, -1000, -1000, -1000, -1000, 531, -1000, 650, 623, + 3549, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 749, 644, + -1000, 907, 242, 342, 644, 906, -1000, -1000, -1000, 854, + -1000, 326, -72, -1000, -1000, 405, -25, -25, -1000, -1000, + 202, 860, 202, 202, 202, 457, 457, -1000, -1000, -1000, + -1000, 397, -1000, -1000, -1000, 396, -1000, 793, 16656, 4257, + -1000, -1000, -1000, -1000, 389, 389, 238, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 63, 732, + -1000, -1000, -1000, -1000, -7, 52, 114, -1000, 4257, -1000, + 312, 312, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 564, 1831, 1816, -1000, 10498, 10498, -1000, -1000, + 697, 697, 8099, 5673, 968, 911, -1000, -1000, 127, 596, + 127, 10498, 10498, -1000, 10498, 10498, -1000, -159, 737, 301, + -1000, 9475, 528, -1000, 5673, -1000, 10498, 10498, -1000, -1000, + -1000, -1000, -1000, -1000, 838, 531, 531, -1000, -1000, 16656, + -1000, -1000, -1000, -1000, 986, 9475, -1000, 616, -1000, 4611, + 790, 16656, 733, 1036, 12557, 16656, 574, -1000, 258, 975, + 748, 789, 873, -1000, -1000, -1000, -1000, 824, -1000, 788, + -1000, -1000, -1000, -1000, -1000, 525, -1000, 134, 132, 130, + 16656, -1000, 968, 568, -1000, -1000, 212, -1000, -1000, -122, + -133, -1000, -1000, -1000, 3903, -1000, 3903, 16656, 77, -1000, + 644, 644, -1000, -1000, -1000, 745, 771, 10498, -1000, -1000, + -1000, 497, 202, 202, -1000, 330, -1000, -1000, -1000, 689, + -1000, 687, 601, 681, 16656, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 17105, -1000, -1000, -1000, -1000, -1000, 17105, -155, 545, - 17105, 17105, 17105, 17105, -1000, 342, 342, -1000, 11001, 1941, - 1941, -1000, -1000, 457, -1000, 995, -1000, 457, 745, 745, - -1000, 745, 756, -1000, 745, 12, 745, -3, 457, 457, - 2014, 1971, 1638, 1030, 511, -134, -1000, 383, 9987, -1000, - 1742, 1717, -1000, -1000, 1001, 998, 383, -1000, -1000, 967, - 557, 540, -1000, -1000, 8285, 660, 157, 650, -1000, 1006, - 17105, 9987, -1000, -1000, 9987, 752, -1000, 9987, -1000, -1000, - -1000, 1006, 511, 511, 511, 650, 995, -1000, -1000, -1000, - -1000, 4112, -1000, 644, -1000, 745, -1000, -1000, -1000, 17105, - -45, 1048, 1941, -1000, -1000, -1000, -1000, -1000, -19, 420, - -19, 364, -1000, 363, 4814, -1000, -1000, -1000, -1000, 961, - -1000, 6218, -1000, -1000, 744, 807, -1000, -1000, -1000, -1000, - 1941, -1000, 966, -1000, -1000, 115, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 11001, 11001, 11001, 11001, 11001, 995, - 417, 383, 11001, 11001, -1000, 9987, 9987, 937, -1000, 511, - -1000, 843, 17105, 17105, -1000, 17105, 995, -1000, 383, 383, - 17105, 383, 14394, 17105, 17105, 12692, -1000, 174, 17105, -1000, - 631, -1000, 216, -1000, -147, 195, -1000, 195, 489, 487, - -1000, 511, 571, -1000, 241, 17105, 17105, -1000, -1000, -1000, - 1690, 1690, 1690, 1690, 84, 457, -1000, 1690, 1690, 383, - 552, 1045, -1000, 511, 1055, 154, -1000, -1000, -1000, 615, - 613, -1000, 613, 613, 224, 174, -1000, 545, 240, 406, - -1000, 66, 17105, 326, 935, -1000, 934, -1000, -1000, -1000, - -1000, -1000, 47, 6218, 4463, 605, -1000, -1000, -1000, -1000, - -1000, 457, 69, -159, -1000, -1000, -1000, 17105, 540, 17105, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 358, -1000, -1000, - 17105, -1000, -1000, 374, -1000, -1000, 588, -1000, 17105, -1000, - -1000, 768, -1000, 879, -150, -176, 519, -1000, -1000, 736, - -1000, -1000, 47, 902, -155, -1000, 878, -1000, 17105, -1000, - 43, -1000, -157, 544, 41, -174, 812, 511, -178, 789, - -1000, 1021, 10325, -1000, -1000, 1043, 184, 184, 1690, 457, - -1000, -1000, -1000, 74, 407, -1000, -1000, -1000, -1000, -1000, - -1000, + -1000, -1000, -1000, -1000, 16656, -1000, -1000, -1000, -1000, -1000, + 16656, -167, 644, 16656, 16656, 16656, 16656, -1000, 313, 313, + -1000, 10498, 1831, 1831, -1000, -1000, 475, -1000, 964, -1000, + 475, 739, 739, -1000, 739, 744, -1000, 739, 6, 739, + 5, 475, 475, 1760, 1626, 1571, 1226, 733, -154, -1000, + 531, 9475, -1000, 868, 847, -1000, -1000, 973, 945, 531, + -1000, -1000, 909, 558, 536, -1000, -1000, 7758, 679, 167, + 672, -1000, 968, 16656, 9475, -1000, -1000, 9475, 741, -1000, + 9475, -1000, -1000, -1000, 968, 733, 733, 733, 672, 964, + -1000, -1000, -1000, -1000, 3549, -1000, 643, -1000, 739, -1000, + -1000, -1000, 16656, -65, 1025, 1831, -1000, -1000, -1000, -1000, + -1000, -25, 427, -25, 392, -1000, 390, 4257, -1000, -1000, + -1000, -1000, 912, -1000, 5673, -1000, -1000, 736, 759, -1000, + -1000, -1000, -1000, 1831, -1000, 911, -1000, -1000, 165, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 10498, 10498, 10498, + 10498, 10498, 964, 426, 531, 10498, 10498, -1000, 9475, 9475, + 905, -1000, 733, -1000, 671, 16656, 16656, -1000, 16656, 964, + -1000, 531, 531, 16656, 531, 13921, 16656, 16656, 12204, -1000, + 193, 16656, -1000, 621, -1000, 213, -1000, -76, 202, -1000, + 202, 489, 486, -1000, 733, 571, -1000, 256, 16656, 16656, + -1000, -1000, -1000, 1535, 1535, 1535, 1535, 65, 475, -1000, + 1535, 1535, 531, 565, 1024, -1000, 733, 1036, 139, -1000, + -1000, -1000, 581, 578, -1000, 578, 578, 198, 193, -1000, + 644, 240, 423, -1000, 85, 16656, 349, 903, -1000, 870, + -1000, -1000, -1000, -1000, -1000, 62, 5673, 3903, 552, -1000, + -1000, -1000, -1000, -1000, 475, 58, -172, -1000, -1000, -1000, + 16656, 536, 16656, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 382, -1000, -1000, 16656, -1000, -1000, 421, -1000, -1000, 517, + -1000, 16656, -1000, -1000, 732, -1000, 837, -164, -175, 529, + -1000, -1000, 735, -1000, -1000, 62, 848, -167, -1000, 836, + -1000, 16656, -1000, 59, -1000, -168, 514, 57, -173, 768, + 733, -176, 765, -1000, 996, 9816, -1000, -1000, 1021, 232, + 232, 1535, 475, -1000, -1000, -1000, 92, 409, -1000, -1000, + -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1299, 1296, 19, 74, 68, 1295, 1294, 1291, 94, - 93, 91, 1290, 1289, 1288, 1286, 1284, 1283, 1282, 1281, - 1280, 1279, 1278, 1277, 1276, 1275, 1269, 1265, 1264, 1263, - 96, 1261, 86, 1260, 1258, 1257, 1256, 1255, 1254, 1245, - 1240, 44, 180, 50, 64, 1238, 60, 1551, 1237, 56, - 61, 58, 1236, 30, 1235, 1234, 71, 1230, 1227, 57, - 1225, 1224, 45, 1221, 67, 1217, 12, 52, 1216, 1213, - 1209, 1206, 80, 775, 1205, 1204, 15, 1203, 1201, 89, - 1200, 66, 29, 11, 18, 22, 1197, 62, 1196, 7, - 1194, 65, 1193, 1191, 1190, 1189, 59, 1187, 63, 1178, - 17, 24, 1174, 38, 75, 31, 23, 8, 1171, 1168, - 14, 69, 53, 87, 1166, 1165, 574, 1161, 1160, 46, - 1159, 1156, 1155, 28, 1153, 112, 482, 1152, 1151, 1150, - 1149, 43, 895, 1913, 164, 81, 1148, 1144, 1143, 2653, - 40, 54, 13, 1141, 51, 111, 37, 1140, 1126, 34, - 1125, 1124, 1120, 1119, 1118, 1117, 1116, 21, 1115, 1114, - 1113, 26, 36, 1112, 1099, 78, 27, 1098, 1096, 1095, - 55, 70, 1094, 1093, 49, 1092, 1086, 33, 1084, 1083, - 1082, 1079, 1078, 32, 6, 1077, 16, 1076, 10, 1075, - 25, 1074, 4, 1073, 9, 1070, 3, 0, 1069, 5, - 48, 1, 1065, 2, 1064, 1063, 1655, 302, 83, 1061, - 99, + 0, 1266, 1265, 33, 69, 70, 1264, 1263, 1262, 94, + 93, 92, 1259, 1258, 1254, 1253, 1252, 1250, 1249, 1248, + 1247, 1242, 1240, 1236, 1235, 1233, 1230, 1229, 1226, 1224, + 1223, 1222, 87, 1220, 85, 1219, 1218, 1217, 1216, 1215, + 1214, 1213, 1210, 38, 230, 50, 55, 1209, 57, 1756, + 1208, 60, 90, 63, 1206, 28, 1205, 1204, 104, 1203, + 1202, 59, 1200, 1199, 64, 1198, 71, 1197, 11, 56, + 1194, 1193, 1190, 1189, 79, 1569, 1187, 1184, 14, 1181, + 1179, 108, 1178, 62, 29, 13, 18, 22, 1177, 68, + 1175, 9, 1174, 65, 1171, 1169, 1168, 1166, 47, 1165, + 61, 1164, 53, 24, 1163, 10, 74, 27, 21, 6, + 1162, 1159, 20, 96, 54, 73, 1158, 1157, 559, 1156, + 1155, 39, 1154, 1149, 1148, 23, 1147, 99, 446, 1145, + 1143, 1142, 1141, 40, 1010, 1404, 12, 78, 1139, 1137, + 1135, 2077, 52, 48, 16, 1133, 1132, 1130, 42, 1065, + 36, 1129, 1128, 31, 1127, 1125, 1119, 1118, 1115, 1114, + 1112, 66, 1111, 1108, 1107, 19, 35, 1106, 1105, 72, + 30, 1104, 1103, 1097, 46, 67, 1094, 1092, 58, 1090, + 1089, 25, 1088, 1085, 1084, 1083, 1082, 26, 17, 1074, + 15, 1073, 8, 1068, 32, 1066, 4, 1064, 7, 1063, + 3, 0, 1062, 5, 45, 1, 1050, 2, 1049, 1046, + 132, 1025, 84, 1042, 91, } var yyR1 = [...]int{ - 0, 204, 205, 205, 1, 1, 1, 1, 1, 1, + 0, 208, 209, 209, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 197, 197, 197, - 20, 3, 3, 3, 3, 2, 2, 8, 4, 5, - 5, 9, 9, 33, 33, 10, 11, 11, 11, 11, - 208, 208, 56, 56, 57, 57, 104, 104, 12, 13, - 13, 113, 113, 112, 112, 112, 114, 114, 114, 114, - 147, 147, 14, 14, 14, 14, 14, 14, 14, 199, - 199, 198, 196, 196, 195, 195, 194, 21, 179, 181, - 181, 180, 180, 180, 180, 171, 150, 150, 150, 150, - 153, 153, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 152, 152, 152, 152, 152, 154, 154, 154, 154, - 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, - 155, 155, 155, 155, 155, 155, 156, 156, 156, 156, - 156, 156, 156, 156, 170, 170, 157, 157, 165, 165, - 166, 166, 166, 163, 163, 164, 164, 167, 167, 167, - 159, 159, 160, 160, 168, 168, 161, 161, 161, 162, - 162, 162, 169, 169, 169, 169, 169, 158, 158, 172, - 172, 189, 189, 188, 188, 188, 178, 178, 185, 185, - 185, 185, 185, 175, 175, 175, 176, 176, 174, 174, - 177, 177, 187, 187, 186, 173, 173, 190, 190, 190, - 190, 202, 203, 201, 201, 201, 201, 201, 182, 182, - 182, 183, 183, 183, 184, 184, 184, 15, 15, 15, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 201, + 201, 201, 20, 3, 3, 3, 3, 2, 2, 8, + 4, 5, 5, 9, 9, 35, 35, 10, 11, 11, + 11, 11, 212, 212, 58, 58, 59, 59, 106, 106, + 12, 13, 13, 115, 115, 114, 114, 114, 116, 116, + 116, 116, 151, 151, 14, 14, 14, 14, 14, 14, + 14, 203, 203, 202, 200, 200, 199, 199, 198, 21, + 183, 185, 185, 184, 184, 184, 184, 175, 154, 154, + 154, 154, 157, 157, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 156, 156, 156, 156, 156, 158, 158, + 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, + 160, 160, 160, 160, 160, 160, 174, 174, 161, 161, + 169, 169, 170, 170, 170, 167, 167, 168, 168, 171, + 171, 171, 163, 163, 164, 164, 172, 172, 165, 165, + 165, 166, 166, 166, 173, 173, 173, 173, 173, 162, + 162, 176, 176, 193, 193, 192, 192, 192, 182, 182, + 189, 189, 189, 189, 189, 179, 179, 179, 180, 180, + 178, 178, 181, 181, 191, 191, 190, 177, 177, 194, + 194, 194, 194, 206, 207, 205, 205, 205, 205, 205, + 186, 186, 186, 187, 187, 187, 188, 188, 188, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 193, 191, - 191, 192, 192, 16, 22, 22, 17, 17, 17, 17, - 17, 18, 18, 23, 24, 24, 24, 24, 24, 24, + 15, 15, 15, 15, 15, 15, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 197, 195, 195, 196, 196, 16, 22, 22, 17, 17, + 17, 17, 17, 18, 18, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 120, 120, 122, 122, 118, 118, 121, 121, 119, - 119, 119, 123, 123, 123, 124, 124, 148, 148, 148, - 25, 25, 27, 27, 28, 29, 34, 34, 34, 34, - 34, 34, 36, 36, 36, 7, 7, 7, 7, 35, - 35, 35, 6, 6, 26, 26, 26, 26, 19, 209, - 30, 31, 31, 32, 32, 32, 38, 38, 38, 37, - 37, 37, 43, 43, 45, 45, 45, 45, 45, 46, - 46, 46, 46, 46, 46, 42, 42, 44, 44, 44, - 44, 136, 136, 136, 135, 135, 48, 48, 49, 49, - 50, 50, 51, 51, 51, 88, 65, 65, 103, 103, - 105, 105, 52, 52, 52, 52, 53, 53, 54, 54, - 55, 55, 143, 143, 142, 142, 142, 141, 141, 58, - 58, 58, 60, 59, 59, 59, 59, 61, 61, 63, - 63, 62, 62, 64, 66, 66, 66, 66, 66, 67, - 67, 47, 47, 47, 47, 47, 47, 47, 117, 117, - 69, 69, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 80, 80, 80, 80, 80, 80, 70, 70, - 70, 70, 70, 70, 70, 41, 41, 81, 81, 81, - 87, 82, 82, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 77, 77, 77, - 77, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 210, 210, 79, 78, 78, 78, 78, 78, 78, 78, - 39, 39, 39, 39, 39, 146, 146, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 92, 92, 40, 40, 90, 90, 91, 93, 93, 89, - 89, 89, 72, 72, 72, 72, 72, 72, 72, 72, - 74, 74, 74, 94, 94, 95, 95, 96, 96, 97, - 97, 98, 99, 99, 99, 100, 100, 100, 100, 101, - 101, 101, 71, 71, 71, 71, 102, 102, 102, 102, - 106, 106, 83, 83, 85, 85, 84, 86, 107, 107, - 110, 108, 108, 108, 111, 111, 111, 111, 109, 109, - 109, 138, 138, 138, 115, 115, 125, 125, 126, 126, - 116, 116, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 128, 128, 128, 129, 129, 130, 130, 130, - 137, 137, 133, 133, 134, 134, 139, 139, 140, 140, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 206, 207, 144, 145, 145, 145, + 24, 24, 24, 122, 122, 124, 124, 120, 120, 123, + 123, 121, 121, 121, 125, 125, 125, 126, 126, 152, + 152, 152, 25, 25, 27, 27, 28, 29, 29, 146, + 146, 147, 147, 30, 31, 36, 36, 36, 36, 36, + 36, 38, 38, 38, 7, 7, 7, 7, 37, 37, + 37, 6, 6, 26, 26, 26, 26, 19, 213, 32, + 33, 33, 34, 34, 34, 40, 40, 40, 39, 39, + 39, 45, 45, 47, 47, 47, 47, 47, 48, 48, + 48, 48, 48, 48, 44, 44, 46, 46, 46, 46, + 138, 138, 138, 137, 137, 50, 50, 51, 51, 52, + 52, 53, 53, 53, 90, 67, 67, 105, 105, 107, + 107, 54, 54, 54, 54, 55, 55, 56, 56, 57, + 57, 145, 145, 144, 144, 144, 143, 143, 60, 60, + 60, 62, 61, 61, 61, 61, 63, 63, 65, 65, + 64, 64, 66, 68, 68, 68, 68, 68, 69, 69, + 49, 49, 49, 49, 49, 49, 49, 119, 119, 71, + 71, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 82, 82, 82, 82, 82, 82, 72, 72, 72, + 72, 72, 72, 72, 43, 43, 83, 83, 83, 89, + 84, 84, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 79, 79, 79, 79, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 214, + 214, 81, 80, 80, 80, 80, 80, 80, 80, 41, + 41, 41, 41, 41, 150, 150, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 94, + 94, 42, 42, 92, 92, 93, 95, 95, 91, 91, + 91, 74, 74, 74, 74, 74, 74, 74, 74, 76, + 76, 76, 96, 96, 97, 97, 98, 98, 99, 99, + 100, 101, 101, 101, 102, 102, 102, 102, 103, 103, + 103, 73, 73, 73, 73, 104, 104, 104, 104, 108, + 108, 85, 85, 87, 87, 86, 88, 109, 109, 112, + 110, 110, 110, 113, 113, 113, 113, 111, 111, 111, + 140, 140, 140, 117, 117, 127, 127, 128, 128, 118, + 118, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 130, 130, 130, 131, 131, 132, 132, 132, 139, + 139, 135, 135, 136, 136, 141, 141, 142, 142, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 210, + 211, 148, 149, 149, 149, } var yyR2 = [...]int{ 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 2, 4, 6, 6, 7, 4, 6, 5, 8, 1, - 3, 7, 8, 1, 1, 9, 8, 7, 6, 6, - 1, 1, 1, 3, 1, 3, 0, 4, 3, 5, - 4, 1, 3, 3, 2, 2, 2, 2, 2, 1, - 1, 1, 2, 2, 8, 4, 6, 5, 5, 0, - 2, 1, 0, 2, 1, 3, 3, 4, 4, 2, - 4, 1, 3, 3, 3, 8, 3, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, - 1, 4, 4, 2, 2, 3, 3, 3, 3, 1, - 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 0, 3, 0, 5, - 0, 3, 5, 0, 1, 0, 1, 0, 1, 2, - 0, 2, 0, 3, 0, 1, 0, 3, 3, 0, - 2, 2, 0, 2, 1, 2, 1, 0, 2, 5, - 4, 1, 2, 2, 3, 2, 0, 1, 2, 3, - 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 3, 2, 3, 1, 10, 11, 11, - 12, 3, 3, 1, 1, 2, 2, 2, 0, 1, - 3, 1, 2, 3, 1, 1, 1, 6, 7, 7, - 7, 7, 4, 5, 4, 4, 7, 5, 5, 5, - 12, 7, 5, 9, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, - 3, 8, 8, 3, 3, 5, 4, 6, 5, 4, - 4, 3, 2, 3, 4, 4, 3, 4, 4, 4, - 4, 4, 4, 3, 2, 7, 2, 3, 4, 3, - 7, 5, 4, 2, 4, 4, 3, 3, 5, 2, - 3, 1, 1, 0, 1, 0, 1, 1, 1, 0, - 2, 2, 0, 2, 2, 0, 2, 0, 1, 1, - 2, 1, 1, 2, 1, 1, 0, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 3, 3, 2, 2, 3, 3, 2, 0, - 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, - 1, 1, 0, 1, 0, 1, 2, 3, 4, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 2, 3, - 5, 0, 1, 2, 1, 1, 0, 2, 1, 3, - 1, 1, 1, 3, 3, 3, 3, 7, 1, 3, - 1, 3, 4, 4, 4, 3, 2, 4, 0, 1, - 0, 2, 0, 1, 0, 1, 2, 1, 1, 1, - 2, 2, 1, 2, 3, 2, 3, 2, 2, 2, - 1, 1, 3, 3, 0, 5, 4, 5, 5, 0, - 2, 1, 3, 3, 2, 3, 1, 2, 0, 3, - 1, 1, 3, 3, 4, 4, 5, 3, 4, 5, - 6, 2, 1, 2, 1, 2, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, - 3, 1, 3, 1, 1, 1, 1, 1, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 2, 4, 6, 6, 7, 4, 6, 5, + 8, 1, 3, 7, 8, 1, 1, 9, 8, 7, + 6, 6, 1, 1, 1, 3, 1, 3, 0, 4, + 3, 5, 4, 1, 3, 3, 2, 2, 2, 2, + 2, 1, 1, 1, 2, 2, 8, 4, 6, 5, + 5, 0, 2, 1, 0, 2, 1, 3, 3, 4, + 4, 2, 4, 1, 3, 3, 3, 8, 3, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, + 2, 2, 1, 4, 4, 2, 2, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 6, 6, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 3, + 0, 5, 0, 3, 5, 0, 1, 0, 1, 0, + 1, 2, 0, 2, 0, 3, 0, 1, 0, 3, + 3, 0, 2, 2, 0, 2, 1, 2, 1, 0, + 2, 5, 4, 1, 2, 2, 3, 2, 0, 1, + 2, 3, 3, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 3, 2, 3, 1, 10, + 11, 11, 12, 3, 3, 1, 1, 2, 2, 2, + 0, 1, 3, 1, 2, 3, 1, 1, 1, 6, + 7, 7, 7, 7, 4, 5, 4, 4, 7, 5, + 5, 5, 12, 7, 5, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 7, 1, 3, 8, 8, 3, 3, 5, 4, 6, + 5, 4, 4, 3, 2, 3, 4, 4, 3, 4, + 4, 4, 4, 4, 4, 3, 2, 7, 2, 3, + 4, 3, 7, 5, 4, 2, 4, 4, 3, 3, + 5, 2, 3, 1, 1, 0, 1, 0, 1, 1, + 1, 0, 2, 2, 0, 2, 2, 0, 2, 0, + 1, 1, 2, 1, 1, 2, 1, 1, 5, 0, + 1, 0, 1, 2, 3, 0, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 3, 3, 2, 2, 3, 3, 2, 0, 2, + 0, 2, 1, 2, 2, 0, 1, 1, 0, 1, + 1, 0, 1, 0, 1, 2, 3, 4, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 3, 5, + 0, 1, 2, 1, 1, 0, 2, 1, 3, 1, + 1, 1, 3, 3, 3, 3, 7, 1, 3, 1, + 3, 4, 4, 4, 3, 2, 4, 0, 1, 0, + 2, 0, 1, 0, 1, 2, 1, 1, 1, 2, + 2, 1, 2, 3, 2, 3, 2, 2, 2, 1, + 1, 3, 3, 0, 5, 4, 5, 5, 0, 2, + 1, 3, 3, 2, 3, 1, 2, 0, 3, 1, + 1, 3, 3, 4, 4, 5, 3, 4, 5, 6, + 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 2, 1, 1, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 1, 1, 1, 1, 4, 5, 5, - 6, 4, 4, 6, 6, 6, 8, 8, 8, 8, - 9, 8, 5, 4, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, - 0, 2, 3, 4, 4, 4, 4, 4, 4, 4, - 0, 3, 4, 7, 3, 1, 1, 2, 3, 3, - 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, - 0, 1, 0, 2, 1, 2, 4, 0, 2, 1, - 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 0, 3, 0, 2, 0, 3, 1, - 3, 2, 0, 1, 1, 0, 2, 4, 4, 0, - 2, 4, 2, 1, 5, 4, 1, 3, 3, 5, - 0, 5, 1, 3, 1, 2, 3, 1, 1, 3, - 3, 1, 2, 3, 3, 3, 3, 3, 1, 2, - 1, 1, 1, 1, 1, 1, 0, 2, 0, 3, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, - 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 1, 1, 1, 1, 4, 5, 5, 6, + 4, 4, 6, 6, 6, 8, 8, 8, 8, 9, + 8, 5, 4, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 8, 8, 0, + 2, 3, 4, 4, 4, 4, 4, 4, 4, 0, + 3, 4, 7, 3, 1, 1, 2, 3, 3, 1, + 2, 2, 1, 2, 1, 2, 2, 1, 2, 0, + 1, 0, 2, 1, 2, 4, 0, 2, 1, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 0, 3, 0, 2, 0, 3, 1, 3, + 2, 0, 1, 1, 0, 2, 4, 4, 0, 2, + 4, 2, 1, 5, 4, 1, 3, 3, 5, 0, + 5, 1, 3, 1, 2, 3, 1, 1, 3, 3, + 1, 2, 3, 3, 3, 3, 3, 1, 2, 1, + 1, 1, 1, 1, 1, 0, 2, 0, 3, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3016,333 +2983,335 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -204, -1, -3, -8, -9, -10, -11, -12, -13, + -1000, -208, -1, -3, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -23, -24, -25, -27, -28, - -29, -6, -26, -19, -20, -4, -206, 6, 7, -33, - 9, 10, 30, -21, 122, 123, 125, 124, 158, 126, - 151, 53, 172, 173, 175, 176, -36, 156, 157, 31, - 32, 128, 34, 57, 8, 258, 153, 152, 25, -205, - 360, -32, 5, -96, 15, -3, -30, -209, -30, -30, - -30, -30, -30, -179, -181, 57, 95, -130, 132, 77, - 250, 129, 130, 136, -133, -197, -132, 60, 61, 62, - 268, 144, 300, 301, 172, 183, 177, 204, 196, 269, - 302, 145, 194, 197, 237, 142, 303, 224, 231, 71, - 175, 246, 304, 154, 192, 188, 305, 277, 186, 27, - 306, 233, 209, 307, 273, 235, 187, 232, 128, 308, - 147, 140, 309, 210, 214, 310, 238, 311, 312, 313, - 181, 182, 314, 143, 240, 208, 141, 33, 270, 37, - 162, 241, 212, 315, 207, 203, 316, 317, 318, 319, - 206, 180, 202, 41, 216, 215, 217, 236, 199, 320, - 321, 322, 148, 323, 189, 18, 324, 325, 326, 327, - 328, 244, 157, 329, 160, 330, 331, 332, 333, 334, - 335, 234, 211, 213, 137, 164, 230, 272, 336, 242, - 185, 337, 149, 161, 156, 245, 150, 338, 339, 340, - 341, 342, 343, 344, 176, 345, 346, 347, 348, 171, - 239, 248, 40, 221, 349, 179, 139, 350, 173, 168, - 226, 200, 163, 351, 352, 190, 191, 205, 178, 201, - 174, 165, 158, 353, 247, 222, 274, 198, 195, 169, - 354, 166, 167, 355, 227, 228, 170, 271, 243, 193, - 223, -116, 132, 250, 129, 228, 134, 130, 130, 131, - 132, 250, 129, 130, -62, -139, -197, -132, 132, 130, - 113, 197, 237, 122, 225, 233, -122, 234, 164, -148, - 130, -118, 224, 227, 228, 170, -197, 235, 239, 238, - 229, -139, 174, -62, -34, 356, 126, -144, -144, 226, - 226, -144, -82, -47, -68, 79, -73, 29, 23, -72, - -69, -89, -86, -87, 113, 114, 116, 115, 117, 102, - 103, 110, 80, 118, -77, -75, -76, -78, 64, 63, - 72, 65, 66, 67, 68, 73, 74, 75, -133, -139, - -84, -206, 47, 48, 259, 260, 261, 262, 267, 263, - 82, 36, 249, 257, 256, 255, 253, 254, 251, 252, - 265, 266, 135, 250, 129, 108, 258, -197, -132, -5, - -4, -206, 6, 20, 21, -100, 17, 16, -207, 59, - -38, -45, 42, 43, -46, 21, 35, 46, 44, -31, - -44, 104, -47, -139, -116, -116, 11, -56, -57, -62, - -64, -139, -108, -147, 174, -111, 239, 238, -134, -109, - -133, -131, 237, 197, 236, 127, 275, 78, 22, 24, - 219, 81, 113, 16, 82, 112, 259, 122, 51, 276, - 251, 252, 249, 261, 262, 250, 225, 29, 10, 278, - 25, 152, 21, 35, 106, 124, 85, 86, 155, 23, - 153, 75, 281, 19, 54, 11, 13, 282, 283, 14, - 135, 134, 97, 131, 49, 8, 118, 26, 94, 45, - 284, 28, 285, 286, 287, 288, 47, 95, 17, 253, - 254, 31, 289, 267, 159, 108, 52, 38, 79, 290, - 291, 73, 292, 76, 55, 77, 15, 50, 293, 294, - 295, 296, 96, 125, 258, 48, 297, 129, 6, 264, - 30, 151, 46, 298, 130, 84, 265, 266, 133, 74, - 5, 136, 32, 9, 53, 56, 255, 256, 257, 36, - 83, 12, 299, -180, 95, -171, -197, -62, 131, -62, - 258, -126, 135, -126, -126, 130, -62, -197, -197, 122, - 124, 127, 55, -22, -62, -125, 135, -197, -125, -125, - -125, -62, 119, -62, -197, 30, -123, 95, 12, 250, - -197, 164, 130, 165, 132, -145, -206, -134, -175, 131, - 33, 143, -145, 168, 169, -145, -121, -120, 231, 232, - 226, 230, 12, 169, 226, 167, -145, -35, -133, 64, - -7, -3, -10, -9, -11, 87, -144, -144, 58, 78, - 77, 94, -47, -70, 97, 79, 95, 96, 81, 99, + -29, -30, -31, -6, -26, -19, -20, -4, -210, 6, + 7, -35, 9, 10, 30, -21, 122, 123, 125, 124, + 158, 126, 151, 53, 172, 173, 175, 176, 177, 178, + -38, 156, 157, 31, 32, 128, 34, 57, 8, 261, + 153, 152, 25, -209, 363, -34, 5, -98, 15, -3, + -32, -213, -32, -32, -32, -32, -32, -183, -185, 57, + 95, -132, 132, 77, 253, 129, 130, 136, -135, -201, + -134, 60, 61, 62, 271, 144, 303, 304, 172, 186, + 180, 207, 199, 272, 305, 145, 197, 200, 240, 142, + 306, 227, 234, 71, 175, 249, 307, 154, 195, 191, + 308, 280, 189, 27, 309, 236, 212, 310, 276, 238, + 190, 235, 128, 311, 147, 140, 312, 213, 217, 313, + 241, 314, 315, 316, 184, 185, 317, 143, 243, 211, + 141, 33, 273, 37, 162, 244, 215, 318, 210, 206, + 319, 320, 321, 322, 209, 183, 205, 41, 219, 218, + 220, 239, 202, 323, 324, 325, 148, 326, 192, 18, + 327, 328, 329, 330, 331, 247, 157, 332, 160, 333, + 334, 335, 336, 337, 338, 237, 214, 216, 137, 164, + 233, 275, 339, 245, 188, 340, 149, 161, 156, 248, + 150, 341, 342, 343, 344, 345, 346, 347, 176, 348, + 349, 350, 351, 171, 242, 251, 40, 224, 352, 182, + 139, 353, 173, 168, 229, 203, 163, 354, 355, 193, + 194, 208, 181, 204, 174, 165, 158, 356, 250, 225, + 277, 201, 198, 169, 357, 166, 167, 358, 230, 231, + 170, 274, 246, 196, 226, -118, 132, 253, 129, 231, + 134, 130, 130, 131, 132, 253, 129, 130, -64, -141, + -201, -134, 132, 130, 113, 200, 240, 122, 228, 236, + -124, 237, 164, -152, 130, -120, 227, 230, 231, 170, + -201, 238, 242, 241, 232, -141, 174, -146, 179, -135, + 177, -64, -36, 359, 126, -148, -148, 229, 229, -148, + -84, -49, -70, 79, -75, 29, 23, -74, -71, -91, + -88, -89, 113, 114, 116, 115, 117, 102, 103, 110, + 80, 118, -79, -77, -78, -80, 64, 63, 72, 65, + 66, 67, 68, 73, 74, 75, -135, -141, -86, -210, + 47, 48, 262, 263, 264, 265, 270, 266, 82, 36, + 252, 260, 259, 258, 256, 257, 254, 255, 268, 269, + 135, 253, 129, 108, 261, -201, -134, -5, -4, -210, + 6, 20, 21, -102, 17, 16, -211, 59, -40, -47, + 42, 43, -48, 21, 35, 46, 44, -33, -46, 104, + -49, -141, -118, -118, 11, -58, -59, -64, -66, -141, + -110, -151, 174, -113, 242, 241, -136, -111, -135, -133, + 240, 200, 239, 127, 278, 78, 22, 24, 222, 81, + 113, 16, 82, 112, 262, 122, 51, 279, 254, 255, + 252, 264, 265, 253, 228, 29, 10, 281, 25, 152, + 21, 35, 106, 124, 85, 86, 155, 23, 153, 75, + 284, 19, 54, 11, 13, 285, 286, 14, 135, 134, + 97, 131, 49, 8, 118, 26, 94, 45, 287, 28, + 288, 289, 290, 291, 47, 95, 17, 256, 257, 31, + 292, 270, 159, 108, 52, 38, 79, 293, 294, 73, + 295, 76, 55, 77, 15, 50, 296, 297, 298, 299, + 96, 125, 261, 48, 300, 129, 6, 267, 30, 151, + 46, 301, 130, 84, 268, 269, 133, 74, 5, 136, + 32, 9, 53, 56, 258, 259, 260, 36, 83, 12, + 302, -184, 95, -175, -201, -64, 131, -64, 261, -128, + 135, -128, -128, 130, -64, -201, -201, 122, 124, 127, + 55, -22, -64, -127, 135, -201, -127, -127, -127, -64, + 119, -64, -201, 30, -125, 95, 12, 253, -201, 164, + 130, 165, 132, -149, -210, -136, -179, 131, 33, 143, + -149, 168, 169, -149, -123, -122, 234, 235, 229, 233, + 12, 169, 229, 167, -149, 133, -135, -37, -135, 64, + -7, -3, -10, -9, -11, 87, -148, -148, 58, 78, + 77, 94, -49, -72, 97, 79, 95, 96, 81, 99, 98, 109, 102, 103, 104, 105, 106, 107, 108, 100, - 101, 112, 87, 88, 89, 90, 91, 92, 93, -117, - -206, -87, -206, 120, 121, -73, -73, -73, -73, -73, - -73, -73, -73, -73, -73, -206, 119, -2, -82, -4, - -206, -206, -206, -206, -206, -206, -206, -206, -92, -47, - -206, -210, -79, -206, -210, -79, -210, -79, -210, -206, - -210, -79, -210, -79, -210, -210, -79, -206, -206, -206, - -206, -206, -206, -206, -96, -3, -30, -101, 19, 31, - -47, -97, -98, -47, -96, 38, -42, -44, -46, 42, - 43, 70, 11, -136, -135, 22, -133, 64, 119, -63, - 26, -62, -49, -50, -51, -52, -65, -88, -206, -62, - -62, -56, -208, 58, 11, 56, -208, 58, 119, 58, - 174, -111, -113, -112, 240, 242, 87, -138, -133, 64, - 29, 30, 59, 58, -62, -150, -153, -155, -154, -156, - -151, -152, 194, 195, 113, 198, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 30, 154, 190, 191, - 192, 193, 210, 211, 212, 213, 214, 215, 216, 217, - 177, 196, 269, 178, 179, 180, 181, 182, 183, 185, - 186, 187, 188, 189, -197, -145, 132, -197, 79, -197, - -62, -62, -145, -145, -145, 166, 166, 130, 130, 171, - -62, 58, 133, -56, 23, 55, -62, -197, -197, -140, - -139, -131, -145, -123, 64, -47, -145, -145, -145, -62, - -145, -145, -176, 11, 97, -145, -145, 11, -119, 11, - 97, -47, -124, 95, 55, 208, 357, 358, 359, -47, - -47, -47, -80, 73, 79, 74, 75, -73, -81, -84, - -87, 69, 97, 95, 96, 81, -73, -73, -73, -73, - -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, - -73, -146, -197, 64, -197, -72, -72, -133, -43, 21, - 35, -42, -134, -140, -131, -32, -207, -207, -96, -42, - -42, -47, -47, -89, 64, -42, -89, 64, -42, -42, - -37, 21, 35, -90, -91, 83, -89, -133, -139, -207, - -73, -133, -133, -42, -43, -43, -42, -42, -100, -207, - 9, 97, 58, 18, 58, -99, 24, 25, -100, -74, - -133, 65, 68, -48, 58, 11, -46, -62, -135, 104, - -140, -104, 160, -62, 30, 58, -58, -60, -59, -61, - 45, 49, 51, 46, 47, 48, 52, -143, 22, -49, - -3, -206, -142, 160, -141, 22, -139, 64, -104, 56, - -49, -62, -49, -64, -139, 104, -111, -113, 58, 241, - 243, 244, 55, 76, -47, -162, 112, -182, -183, -184, - -134, 64, 65, -171, -172, -173, -185, 146, -190, 137, - 139, 136, -174, 147, 131, 28, 59, -167, 73, 79, - -163, 222, -157, 57, -157, -157, -157, -157, -161, 197, - -161, -161, -161, 57, 57, -157, -157, -157, -165, 57, - -165, -165, -166, 57, -166, -137, 56, -62, -145, 23, - -145, -127, 127, 124, 125, -193, 123, 219, 197, 71, - 29, 15, 259, 160, 274, -197, 161, -62, -62, -62, - -62, -62, 127, 124, -62, -62, -62, -145, -62, -62, - -123, -139, -139, 64, -62, 73, 74, 75, -81, -73, - -73, -73, -41, 155, 78, -207, -207, -42, -42, -206, - 119, -5, -100, -207, -207, 58, 56, 22, 11, 11, - -207, 11, 11, -207, -207, -42, -93, -91, 85, -47, - -207, 119, -207, 58, 58, -207, -207, -207, -207, -207, - -101, 40, -47, -47, -98, -101, -115, 19, 11, 36, - 36, -67, 12, -44, -49, -46, 119, -71, 30, 36, - -3, -206, -206, -107, -110, -89, -50, -51, -51, -50, - -51, 45, 45, 45, 50, 45, 50, 45, -59, -139, - -207, -207, -3, -66, 53, 134, 54, -206, -141, -67, - -49, -67, -67, 119, -112, -114, 245, 242, 248, -197, - 64, 58, -184, 87, 57, -197, 28, -174, -174, -177, - -197, -177, 28, -159, 29, 73, -164, 223, 65, -161, - -161, -162, 30, -162, -162, -162, -170, 64, -170, 65, - 65, 55, -133, -145, -144, -200, 142, 138, 146, 147, - 140, 60, 61, 62, 131, 28, 137, 139, 160, 136, - -200, -128, -129, 133, 22, 131, 28, 160, -199, 56, - 166, 219, 166, 133, -145, -119, -119, -41, 78, -73, - -73, -207, -207, -43, -134, -96, -101, -149, 113, 194, - 154, 192, 188, 208, 199, 221, 190, 222, -146, -149, - -73, -73, -73, -73, 268, -96, 86, -47, 84, -134, - -73, -73, 41, -62, -94, 13, -47, 104, -106, 55, - -107, -83, -85, -84, -206, -102, -133, -105, -133, -67, - 58, 87, -54, -53, 55, 56, -55, 55, -53, 45, - 45, -207, 131, 131, 131, -105, -96, -67, 242, 246, - 247, -183, -184, -187, -186, -133, -190, -177, -177, 57, - -160, 55, -73, 59, -162, -162, -197, 113, 59, 58, - 59, 58, 59, 58, -62, -144, -144, -62, -144, -133, - -196, 271, -198, -197, -133, -133, -133, -62, -123, -123, - -73, -207, -100, -207, -157, -157, -157, -166, -157, 182, - -157, 182, -207, -207, 19, 19, 19, 19, -206, -40, - 264, -47, 58, 58, -95, 14, 16, 27, -106, 58, - -207, -207, 58, 119, -207, 58, -96, -110, -47, -47, - 57, -47, -206, -206, -206, -207, -100, 59, 58, -157, - -103, -133, -168, 219, 9, -161, 64, -161, 65, 65, - -145, 26, -195, -194, -134, 57, 56, -101, -161, -197, - -73, -73, -73, -73, -73, -100, 64, -73, -73, -47, - -82, 28, -85, 36, -3, -133, -133, -133, -100, -103, - -103, -207, -103, -103, -142, -189, -188, 56, 141, 71, - -186, 59, 58, -169, 137, 28, 136, -76, -162, -162, - 59, 59, -206, 58, 87, -103, -62, -207, -207, -207, - -207, -39, 97, 271, -207, -207, -207, 9, -83, 119, - 59, -207, -207, -207, -66, -188, -197, -178, 87, 64, - 149, -133, -158, 71, 28, 28, -191, -192, 160, -194, - -184, 59, -207, 269, 52, 272, -107, -133, 65, -62, - 64, -207, 58, -133, -199, 41, 270, 273, 57, -192, - 36, -196, 41, -103, 162, 271, 59, 163, 272, -202, - -203, 55, -206, 273, -203, 55, 10, 9, -73, 159, - -201, 150, 145, 148, 30, -201, -207, -207, 144, 29, - 73, + 101, 112, 87, 88, 89, 90, 91, 92, 93, -119, + -210, -89, -210, 120, 121, -75, -75, -75, -75, -75, + -75, -75, -75, -75, -75, -210, 119, -2, -84, -4, + -210, -210, -210, -210, -210, -210, -210, -210, -94, -49, + -210, -214, -81, -210, -214, -81, -214, -81, -214, -210, + -214, -81, -214, -81, -214, -214, -81, -210, -210, -210, + -210, -210, -210, -210, -98, -3, -32, -103, 19, 31, + -49, -99, -100, -49, -98, 38, -44, -46, -48, 42, + 43, 70, 11, -138, -137, 22, -135, 64, 119, -65, + 26, -64, -51, -52, -53, -54, -67, -90, -210, -64, + -64, -58, -212, 58, 11, 56, -212, 58, 119, 58, + 174, -113, -115, -114, 243, 245, 87, -140, -135, 64, + 29, 30, 59, 58, -64, -154, -157, -159, -158, -160, + -155, -156, 197, 198, 113, 201, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 30, 154, 193, 194, + 195, 196, 213, 214, 215, 216, 217, 218, 219, 220, + 180, 199, 272, 181, 182, 183, 184, 185, 186, 188, + 189, 190, 191, 192, -201, -149, 132, -201, 79, -201, + -64, -64, -149, -149, -149, 166, 166, 130, 130, 171, + -64, 58, 133, -58, 23, 55, -64, -201, -201, -142, + -141, -133, -149, -125, 64, -49, -149, -149, -149, -64, + -149, -149, -180, 11, 97, -149, -149, 11, -121, 11, + 97, -49, -126, 95, 55, -147, 177, 211, 360, 361, + 362, -49, -49, -49, -82, 73, 79, 74, 75, -75, + -83, -86, -89, 69, 97, 95, 96, 81, -75, -75, + -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, -150, -201, 64, -201, -74, -74, -135, + -45, 21, 35, -44, -136, -142, -133, -34, -211, -211, + -98, -44, -44, -49, -49, -91, 64, -44, -91, 64, + -44, -44, -39, 21, 35, -92, -93, 83, -91, -135, + -141, -211, -75, -135, -135, -44, -45, -45, -44, -44, + -102, -211, 9, 97, 58, 18, 58, -101, 24, 25, + -102, -76, -135, 65, 68, -50, 58, 11, -48, -64, + -137, 104, -142, -106, 160, -64, 30, 58, -60, -62, + -61, -63, 45, 49, 51, 46, 47, 48, 52, -145, + 22, -51, -3, -210, -144, 160, -143, 22, -141, 64, + -106, 56, -51, -64, -51, -66, -141, 104, -113, -115, + 58, 244, 246, 247, 55, 76, -49, -166, 112, -186, + -187, -188, -136, 64, 65, -175, -176, -177, -189, 146, + -194, 137, 139, 136, -178, 147, 131, 28, 59, -171, + 73, 79, -167, 225, -161, 57, -161, -161, -161, -161, + -165, 200, -165, -165, -165, 57, 57, -161, -161, -161, + -169, 57, -169, -169, -170, 57, -170, -139, 56, -64, + -149, 23, -149, -129, 127, 124, 125, -197, 123, 222, + 200, 71, 29, 15, 262, 160, 277, -201, 161, -64, + -64, -64, -64, -64, 127, 124, -64, -64, -64, -149, + -64, -64, -125, -141, -141, 64, -64, -135, 73, 74, + 75, -83, -75, -75, -75, -43, 155, 78, -211, -211, + -44, -44, -210, 119, -5, -102, -211, -211, 58, 56, + 22, 11, 11, -211, 11, 11, -211, -211, -44, -95, + -93, 85, -49, -211, 119, -211, 58, 58, -211, -211, + -211, -211, -211, -103, 40, -49, -49, -100, -103, -117, + 19, 11, 36, 36, -69, 12, -46, -51, -48, 119, + -73, 30, 36, -3, -210, -210, -109, -112, -91, -52, + -53, -53, -52, -53, 45, 45, 45, 50, 45, 50, + 45, -61, -141, -211, -211, -3, -68, 53, 134, 54, + -210, -143, -69, -51, -69, -69, 119, -114, -116, 248, + 245, 251, -201, 64, 58, -188, 87, 57, -201, 28, + -178, -178, -181, -201, -181, 28, -163, 29, 73, -168, + 226, 65, -165, -165, -166, 30, -166, -166, -166, -174, + 64, -174, 65, 65, 55, -135, -149, -148, -204, 142, + 138, 146, 147, 140, 60, 61, 62, 131, 28, 137, + 139, 160, 136, -204, -130, -131, 133, 22, 131, 28, + 160, -203, 56, 166, 222, 166, 133, -149, -121, -121, + -43, 78, -75, -75, -211, -211, -45, -136, -98, -103, + -153, 113, 197, 154, 195, 191, 211, 202, 224, 193, + 225, -150, -153, -75, -75, -75, -75, 271, -98, 86, + -49, 84, -136, -75, -75, 41, -64, -96, 13, -49, + 104, -108, 55, -109, -85, -87, -86, -210, -104, -135, + -107, -135, -69, 58, 87, -56, -55, 55, 56, -57, + 55, -55, 45, 45, -211, 131, 131, 131, -107, -98, + -69, 245, 249, 250, -187, -188, -191, -190, -135, -194, + -181, -181, 57, -164, 55, -75, 59, -166, -166, -201, + 113, 59, 58, 59, 58, 59, 58, -64, -148, -148, + -64, -148, -135, -200, 274, -202, -201, -135, -135, -135, + -64, -125, -125, -75, -211, -102, -211, -161, -161, -161, + -170, -161, 185, -161, 185, -211, -211, 19, 19, 19, + 19, -210, -42, 267, -49, 58, 58, -97, 14, 16, + 27, -108, 58, -211, -211, 58, 119, -211, 58, -98, + -112, -49, -49, 57, -49, -210, -210, -210, -211, -102, + 59, 58, -161, -105, -135, -172, 222, 9, -165, 64, + -165, 65, 65, -149, 26, -199, -198, -136, 57, 56, + -103, -165, -201, -75, -75, -75, -75, -75, -102, 64, + -75, -75, -49, -84, 28, -87, 36, -3, -135, -135, + -135, -102, -105, -105, -211, -105, -105, -144, -193, -192, + 56, 141, 71, -190, 59, 58, -173, 137, 28, 136, + -78, -166, -166, 59, 59, -210, 58, 87, -105, -64, + -211, -211, -211, -211, -41, 97, 274, -211, -211, -211, + 9, -85, 119, 59, -211, -211, -211, -68, -192, -201, + -182, 87, 64, 149, -135, -162, 71, 28, 28, -195, + -196, 160, -198, -188, 59, -211, 272, 52, 275, -109, + -135, 65, -64, 64, -211, 58, -135, -203, 41, 273, + 276, 57, -196, 36, -200, 41, -105, 162, 274, 59, + 163, 275, -206, -207, 55, -210, 276, -207, 55, 10, + 9, -75, 159, -205, 150, 145, 148, 30, -205, -211, + -211, 144, 29, 73, } var yyDef = [...]int{ - 26, -2, 2, 4, 5, 6, 7, 8, 9, 10, + 28, -2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 607, 0, 349, 349, 349, - 349, 349, 349, 0, 677, 660, 0, 0, 0, 0, - -2, 321, 322, 0, 324, 325, 326, 982, 982, 0, - 0, 982, 0, 980, 43, 44, 332, 333, 334, 1, - 3, 0, 353, 615, 0, 0, -2, 351, 0, 660, - 660, 0, 0, 72, 73, 0, 0, 0, 969, 0, - 658, 658, 658, 678, 679, 682, 683, 27, 28, 29, - 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, - 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, - 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, - 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, - 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, - 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, - 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, - 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, - 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, - 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, - 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, - 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 979, 0, 0, 0, 0, 0, 661, 0, 656, 0, - 656, 656, 656, 0, 272, 431, 686, 687, 969, 0, - 0, 0, 312, 0, 983, 284, 0, 286, 983, 0, - 983, 0, 293, 0, 0, 299, 983, 304, 318, 319, - 306, 320, 323, 339, 0, 0, 331, 344, 345, 982, - 982, 348, 30, 481, 441, 0, 446, 448, 0, 483, - 484, 485, 486, 487, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 513, 514, 515, 516, 592, 593, - 594, 595, 596, 597, 598, 599, 450, 451, 589, 0, - 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 580, 0, 550, 550, 550, 550, 550, 550, 550, 550, - 0, 0, 0, 0, 0, 0, 0, -2, -2, 607, - 39, 0, 349, 354, 355, 619, 0, 0, 607, 981, - 0, 0, -2, -2, 365, 371, 372, 373, 374, 350, - 0, 377, 381, 0, 0, 0, 0, 0, 0, 52, - 54, 431, 58, 0, 958, 641, -2, -2, 0, 0, - 684, 685, -2, 821, -2, 690, 691, 692, 693, 694, - 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, - 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, - 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, - 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, - 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, - 805, 806, 807, 0, 0, 91, 0, 89, 0, 983, - 0, 0, 0, 0, 0, 0, 983, 983, 983, 0, - 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, - 0, 271, 0, 273, 983, 312, 276, 0, 0, 983, - 983, 983, 0, 983, 983, 283, 984, 985, 0, 193, - 194, 195, 287, 983, 983, 289, 0, 309, 307, 308, - 301, 302, 0, 315, 296, 297, 300, 342, 340, 341, - 343, 335, 336, 337, 338, 0, 346, 347, 0, 0, - 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 468, 469, 470, 471, 472, 473, 474, 447, - 0, 461, 0, 0, 0, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 0, 362, 0, 0, 0, 607, - 0, 0, 0, 0, 0, 0, 0, 359, 0, 581, - 0, 534, 542, 0, 535, 543, 536, 544, 537, 0, - 538, 545, 539, 546, 540, 541, 547, 0, 0, 0, - 362, 362, 0, 0, 615, 0, 364, 31, 0, 0, - 616, 608, 609, 612, 615, 0, 386, 375, 366, 369, - 370, 352, 0, 378, 382, 0, 384, 385, 0, 56, - 0, 430, 0, 388, 390, 391, 392, 412, 0, 414, - -2, 0, 0, 0, 50, 51, 0, 0, 0, 0, - 958, 642, 60, 61, 0, 0, 0, 169, 651, 652, - 653, 649, 218, 0, 0, 157, 153, 97, 98, 99, - 146, 101, 146, 146, 146, 146, 166, 166, 166, 166, - 129, 130, 131, 132, 133, 0, 0, 116, 146, 146, - 146, 120, 136, 137, 138, 139, 140, 141, 142, 143, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 148, - 148, 148, 150, 150, 680, 75, 0, 983, 0, 983, - 87, 0, 232, 234, 235, 0, 0, 0, 0, 0, - 0, 0, 0, 266, 657, 0, 983, 269, 270, 432, - 688, 689, 274, 275, 313, 314, 277, 278, 279, 280, - 281, 282, 0, 196, 197, 288, 292, 0, 312, 0, - 0, 294, 295, 0, 0, 327, 328, 329, 330, 482, - 442, 443, 445, 462, 0, 464, 466, 452, 453, 477, - 478, 479, 0, 0, 0, 0, 475, 457, 0, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 502, 565, 566, 0, 500, 501, 512, 0, 0, - 0, 363, 590, 0, -2, 0, 480, 636, 615, 0, - 0, 0, 0, 485, 592, 0, 485, 592, 0, 0, - 0, 360, 361, 587, 584, 0, 0, 589, 0, 551, - 0, 0, 0, 0, 0, 0, 0, 0, 619, 40, - 620, 0, 0, 0, 0, 611, 613, 614, 619, 0, - 600, 0, 0, 439, 0, 0, 367, 37, 383, 379, - 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, - 419, 0, 0, 422, 0, 0, 0, 0, 413, 0, - 0, 0, 434, 902, 415, 0, 417, 418, 439, 0, - 439, 53, 439, 55, 0, 433, 643, 59, 0, 0, - 64, 65, 644, 645, 646, 647, 0, 88, 219, 221, - 224, 225, 226, 92, 93, 94, 0, 0, 206, 0, - 0, 200, 200, 0, 198, 199, 90, 160, 158, 0, - 155, 154, 100, 0, 166, 166, 123, 124, 169, 0, - 169, 169, 169, 0, 0, 117, 118, 119, 111, 0, - 112, 113, 114, 0, 115, 0, 0, 983, 77, 659, - 78, 982, 0, 0, 672, 233, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 0, 79, 237, 239, - 238, 242, 0, 0, 0, 264, 983, 268, 309, 309, - 291, 310, 311, 316, 298, 463, 465, 467, 454, 475, - 458, 0, 455, 0, 0, 449, 517, 0, 0, 362, - 0, 607, 619, 521, 522, 0, 0, 0, 0, 0, - 558, 0, 0, 559, 0, 607, 0, 585, 0, 0, - 533, 0, 552, 0, 0, 553, 554, 555, 556, 557, - 33, 0, 617, 618, 610, 32, 0, 654, 655, 601, - 602, 603, 0, 376, 387, 368, 0, 630, 0, 0, - 623, 0, 0, 439, 638, 0, 389, 408, 410, 0, - 405, 420, 421, 423, 0, 425, 0, 427, 428, 393, - 394, 395, 0, 396, 0, 0, 0, 0, 416, 607, - 439, 48, 49, 0, 62, 63, 0, 0, 69, 170, - 171, 0, 222, 0, 0, 0, 188, 200, 200, 191, - 201, 192, 0, 162, 0, 159, 96, 156, 0, 169, - 169, 125, 0, 126, 127, 128, 0, 144, 0, 0, - 0, 0, 681, 76, 227, 982, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 982, 0, 982, 673, 674, 675, 676, 0, 82, 0, - 0, 0, 0, 0, 267, 312, 312, 456, 0, 476, - 459, 518, 519, 0, 591, 615, 35, 0, 146, 146, - 570, 146, 150, 573, 146, 575, 146, 578, 0, 0, - 0, 0, 0, 0, 0, 582, 532, 588, 0, 590, - 0, 0, 621, 34, 605, 0, 440, 380, 41, 0, - 630, 622, 632, 634, 0, 0, 626, 0, 400, 607, - 0, 0, 402, 409, 0, 0, 403, 0, 404, 424, - 426, -2, 0, 0, 0, 0, 615, 47, 66, 67, - 68, 220, 223, 0, 202, 146, 205, 189, 190, 0, - 164, 0, 161, 147, 121, 122, 167, 168, 166, 0, - 166, 0, 151, 0, 983, 228, 229, 230, 231, 0, - 236, 0, 80, 81, 0, 0, 241, 265, 285, 290, - 460, 520, 619, 523, 567, 166, 571, 572, 574, 576, - 577, 579, 525, 524, 0, 0, 0, 0, 0, 615, - 0, 586, 0, 0, 38, 0, 0, 0, 42, 0, - 635, 0, 0, 0, 57, 0, 615, 639, 640, 406, - 0, 411, 0, 0, 0, 414, 46, 180, 0, 204, - 0, 398, 172, 165, 0, 169, 145, 169, 0, 0, - 74, 0, 83, 84, 0, 0, 0, 36, 568, 569, - 0, 0, 0, 0, 560, 0, 583, 0, 0, 606, - 604, 0, 633, 0, 625, 628, 627, 401, 45, 0, - 0, 436, 0, 0, 434, 179, 181, 0, 186, 0, - 203, 0, 0, 177, 0, 174, 176, 163, 134, 135, - 149, 152, 0, 0, 0, 0, 243, 526, 528, 527, - 529, 0, 0, 0, 531, 548, 549, 0, 624, 0, - 407, 435, 437, 438, 397, 182, 183, 0, 187, 185, - 0, 399, 95, 0, 173, 175, 0, 259, 0, 85, - 86, 79, 530, 0, 0, 0, 631, 629, 184, 0, - 178, 258, 0, 0, 82, 561, 0, 564, 0, 260, - 0, 240, 562, 0, 0, 0, 207, 0, 0, 208, - 209, 0, 0, 563, 210, 0, 0, 0, 0, 0, - 211, 213, 214, 0, 0, 212, 261, 262, 215, 216, - 217, + 21, 22, 23, 24, 25, 26, 27, 616, 0, 358, + 358, 358, 358, 358, 358, 0, 686, 669, 0, 0, + 0, 0, -2, 323, 324, 0, 326, -2, 0, 0, + 335, 991, 991, 0, 0, 991, 0, 989, 45, 46, + 341, 342, 343, 1, 3, 0, 362, 624, 0, 0, + -2, 360, 0, 669, 669, 0, 0, 74, 75, 0, + 0, 0, 978, 0, 667, 667, 667, 687, 688, 691, + 692, 29, 30, 31, 817, 818, 819, 820, 821, 822, + 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, + 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, + 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, + 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, + 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, + 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, + 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, + 973, 974, 975, 976, 977, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 0, 0, 0, 0, 0, + 670, 0, 665, 0, 665, 665, 665, 0, 274, 440, + 695, 696, 978, 0, 0, 0, 314, 0, 992, 286, + 0, 288, 992, 0, 992, 0, 295, 0, 0, 301, + 992, 306, 320, 321, 308, 322, 325, 0, 330, 333, + 0, 348, 0, 0, 340, 353, 354, 991, 991, 357, + 32, 490, 450, 0, 455, 457, 0, 492, 493, 494, + 495, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 522, 523, 524, 525, 601, 602, 603, 604, + 605, 606, 607, 608, 459, 460, 598, 0, 646, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, + 559, 559, 559, 559, 559, 559, 559, 559, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 616, 41, 0, + 358, 363, 364, 628, 0, 0, 616, 990, 0, 0, + -2, -2, 374, 380, 381, 382, 383, 359, 0, 386, + 390, 0, 0, 0, 0, 0, 0, 54, 56, 440, + 60, 0, 967, 650, -2, -2, 0, 0, 693, 694, + -2, 830, -2, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, + 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, + 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, + 816, 0, 0, 93, 0, 91, 0, 992, 0, 0, + 0, 0, 0, 0, 992, 992, 992, 0, 0, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 0, 273, + 0, 275, 992, 314, 278, 0, 0, 992, 992, 992, + 0, 992, 992, 285, 993, 994, 0, 195, 196, 197, + 289, 992, 992, 291, 0, 311, 309, 310, 303, 304, + 0, 317, 298, 299, 302, 331, 334, 351, 349, 350, + 352, 344, 345, 346, 347, 0, 355, 356, 0, 0, + 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 477, 478, 479, 480, 481, 482, 483, 456, + 0, 470, 0, 0, 0, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 0, 371, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 368, 0, 590, + 0, 543, 551, 0, 544, 552, 545, 553, 546, 0, + 547, 554, 548, 555, 549, 550, 556, 0, 0, 0, + 371, 371, 0, 0, 624, 0, 373, 33, 0, 0, + 625, 617, 618, 621, 624, 0, 395, 384, 375, 378, + 379, 361, 0, 387, 391, 0, 393, 394, 0, 58, + 0, 439, 0, 397, 399, 400, 401, 421, 0, 423, + -2, 0, 0, 0, 52, 53, 0, 0, 0, 0, + 967, 651, 62, 63, 0, 0, 0, 171, 660, 661, + 662, 658, 220, 0, 0, 159, 155, 99, 100, 101, + 148, 103, 148, 148, 148, 148, 168, 168, 168, 168, + 131, 132, 133, 134, 135, 0, 0, 118, 148, 148, + 148, 122, 138, 139, 140, 141, 142, 143, 144, 145, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 150, + 150, 150, 152, 152, 689, 77, 0, 992, 0, 992, + 89, 0, 234, 236, 237, 0, 0, 0, 0, 0, + 0, 0, 0, 268, 666, 0, 992, 271, 272, 441, + 697, 698, 276, 277, 315, 316, 279, 280, 281, 282, + 283, 284, 0, 198, 199, 290, 294, 0, 314, 0, + 0, 296, 297, 0, 0, 0, 332, 336, 337, 338, + 339, 491, 451, 452, 454, 471, 0, 473, 475, 461, + 462, 486, 487, 488, 0, 0, 0, 0, 484, 466, + 0, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 511, 574, 575, 0, 509, 510, 521, + 0, 0, 0, 372, 599, 0, -2, 0, 489, 645, + 624, 0, 0, 0, 0, 494, 601, 0, 494, 601, + 0, 0, 0, 369, 370, 596, 593, 0, 0, 598, + 0, 560, 0, 0, 0, 0, 0, 0, 0, 0, + 628, 42, 629, 0, 0, 0, 0, 620, 622, 623, + 628, 0, 609, 0, 0, 448, 0, 0, 376, 39, + 392, 388, 0, 0, 0, 438, 0, 0, 0, 0, + 0, 0, 428, 0, 0, 431, 0, 0, 0, 0, + 422, 0, 0, 0, 443, 911, 424, 0, 426, 427, + 448, 0, 448, 55, 448, 57, 0, 442, 652, 61, + 0, 0, 66, 67, 653, 654, 655, 656, 0, 90, + 221, 223, 226, 227, 228, 94, 95, 96, 0, 0, + 208, 0, 0, 202, 202, 0, 200, 201, 92, 162, + 160, 0, 157, 156, 102, 0, 168, 168, 125, 126, + 171, 0, 171, 171, 171, 0, 0, 119, 120, 121, + 113, 0, 114, 115, 116, 0, 117, 0, 0, 992, + 79, 668, 80, 991, 0, 0, 681, 235, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, 0, 81, + 239, 241, 240, 244, 0, 0, 0, 266, 992, 270, + 311, 311, 293, 312, 313, 318, 300, 328, 472, 474, + 476, 463, 484, 467, 0, 464, 0, 0, 458, 526, + 0, 0, 371, 0, 616, 628, 530, 531, 0, 0, + 0, 0, 0, 567, 0, 0, 568, 0, 616, 0, + 594, 0, 0, 542, 0, 561, 0, 0, 562, 563, + 564, 565, 566, 35, 0, 626, 627, 619, 34, 0, + 663, 664, 610, 611, 612, 0, 385, 396, 377, 0, + 639, 0, 0, 632, 0, 0, 448, 647, 0, 398, + 417, 419, 0, 414, 429, 430, 432, 0, 434, 0, + 436, 437, 402, 403, 404, 0, 405, 0, 0, 0, + 0, 425, 616, 448, 50, 51, 0, 64, 65, 0, + 0, 71, 172, 173, 0, 224, 0, 0, 0, 190, + 202, 202, 193, 203, 194, 0, 164, 0, 161, 98, + 158, 0, 171, 171, 127, 0, 128, 129, 130, 0, + 146, 0, 0, 0, 0, 690, 78, 229, 991, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 991, 0, 991, 682, 683, 684, 685, + 0, 84, 0, 0, 0, 0, 0, 269, 314, 314, + 465, 0, 485, 468, 527, 528, 0, 600, 624, 37, + 0, 148, 148, 579, 148, 152, 582, 148, 584, 148, + 587, 0, 0, 0, 0, 0, 0, 0, 591, 541, + 597, 0, 599, 0, 0, 630, 36, 614, 0, 449, + 389, 43, 0, 639, 631, 641, 643, 0, 0, 635, + 0, 409, 616, 0, 0, 411, 418, 0, 0, 412, + 0, 413, 433, 435, -2, 0, 0, 0, 0, 624, + 49, 68, 69, 70, 222, 225, 0, 204, 148, 207, + 191, 192, 0, 166, 0, 163, 149, 123, 124, 169, + 170, 168, 0, 168, 0, 153, 0, 992, 230, 231, + 232, 233, 0, 238, 0, 82, 83, 0, 0, 243, + 267, 287, 292, 469, 529, 628, 532, 576, 168, 580, + 581, 583, 585, 586, 588, 534, 533, 0, 0, 0, + 0, 0, 624, 0, 595, 0, 0, 40, 0, 0, + 0, 44, 0, 644, 0, 0, 0, 59, 0, 624, + 648, 649, 415, 0, 420, 0, 0, 0, 423, 48, + 182, 0, 206, 0, 407, 174, 167, 0, 171, 147, + 171, 0, 0, 76, 0, 85, 86, 0, 0, 0, + 38, 577, 578, 0, 0, 0, 0, 569, 0, 592, + 0, 0, 615, 613, 0, 642, 0, 634, 637, 636, + 410, 47, 0, 0, 445, 0, 0, 443, 181, 183, + 0, 188, 0, 205, 0, 0, 179, 0, 176, 178, + 165, 136, 137, 151, 154, 0, 0, 0, 0, 245, + 535, 537, 536, 538, 0, 0, 0, 540, 557, 558, + 0, 633, 0, 416, 444, 446, 447, 406, 184, 185, + 0, 189, 187, 0, 408, 97, 0, 175, 177, 0, + 261, 0, 87, 88, 81, 539, 0, 0, 0, 640, + 638, 186, 0, 180, 260, 0, 0, 84, 570, 0, + 573, 0, 262, 0, 242, 571, 0, 0, 0, 209, + 0, 0, 210, 211, 0, 0, 572, 212, 0, 0, + 0, 0, 0, 213, 215, 216, 0, 0, 214, 263, + 264, 217, 218, 219, } var yyTok1 = [...]int{ @@ -3351,7 +3320,7 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 80, 3, 3, 3, 107, 99, 3, 57, 59, 104, 102, 58, 103, 119, 105, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 360, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 363, 88, 87, 89, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -3407,7 +3376,7 @@ var yyTok3 = [...]int{ 57670, 345, 57671, 346, 57672, 347, 57673, 348, 57674, 349, 57675, 350, 57676, 351, 57677, 352, 57678, 353, 57679, 354, 57680, 355, 57681, 356, 57682, 357, 57683, 358, 57684, 359, - 0, + 57685, 360, 57686, 361, 57687, 362, 0, } var yyErrorMessages = [...]struct { @@ -3769,39 +3738,39 @@ yydefault: { yyVAL.statement = yyDollar[1].selStmt } - case 26: + case 28: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:371 +//line sql.y:373 { setParseTree(yylex, nil) } - case 27: + case 29: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:377 +//line sql.y:379 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), NoAt) } - case 28: + case 30: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:381 +//line sql.y:383 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), SingleAt) } - case 29: + case 31: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:385 +//line sql.y:387 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), DoubleAt) } - case 30: + case 32: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:391 +//line sql.y:393 { yyVAL.statement = &OtherAdmin{} } - case 31: + case 33: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:397 +//line sql.y:399 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3809,27 +3778,27 @@ yydefault: sel.Lock = yyDollar[4].str yyVAL.selStmt = sel } - case 32: + case 34: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:405 +//line sql.y:407 { yyVAL.selStmt = &Union{FirstStatement: &ParenSelect{Select: yyDollar[2].selStmt}, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} } - case 33: + case 35: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:409 +//line sql.y:411 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } - case 34: + case 36: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:413 +//line sql.y:415 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } - case 35: + case 37: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:436 +//line sql.y:438 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3837,39 +3806,39 @@ yydefault: sel.Lock = yyDollar[4].str yyVAL.selStmt = sel } - case 36: + case 38: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:444 +//line sql.y:446 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } - case 37: + case 39: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:450 +//line sql.y:452 { yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} } - case 38: + case 40: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:458 +//line sql.y:460 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereStr, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingStr, yyDollar[8].expr)) } - case 39: + case 41: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:464 +//line sql.y:466 { yyVAL.selStmt = yyDollar[1].selStmt } - case 40: + case 42: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:468 +//line sql.y:470 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } - case 41: + case 43: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:475 +//line sql.y:477 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -3881,9 +3850,9 @@ yydefault: ins.OnDup = OnDup(yyDollar[7].updateExprs) yyVAL.statement = ins } - case 42: + case 44: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:487 +//line sql.y:489 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -3893,328 +3862,328 @@ yydefault: } yyVAL.statement = &Insert{Action: yyDollar[1].str, Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, Table: yyDollar[4].tableName, Partitions: yyDollar[5].partitions, Columns: cols, Rows: Values{vals}, OnDup: OnDup(yyDollar[8].updateExprs)} } - case 43: + case 45: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:499 +//line sql.y:501 { yyVAL.str = InsertStr } - case 44: + case 46: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:503 +//line sql.y:505 { yyVAL.str = ReplaceStr } - case 45: + case 47: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:509 +//line sql.y:511 { yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, TableExprs: yyDollar[4].tableExprs, Exprs: yyDollar[6].updateExprs, Where: NewWhere(WhereStr, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } - case 46: + case 48: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:515 +//line sql.y:517 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Partitions: yyDollar[5].partitions, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} } - case 47: + case 49: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:519 +//line sql.y:521 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereStr, yyDollar[7].expr)} } - case 48: + case 50: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:523 +//line sql.y:525 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } - case 49: + case 51: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:527 +//line sql.y:529 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } - case 50: + case 52: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:532 +//line sql.y:534 { } - case 51: + case 53: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:533 +//line sql.y:535 { } - case 52: + case 54: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:537 +//line sql.y:539 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } - case 53: + case 55: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:541 +//line sql.y:543 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } - case 54: + case 56: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:547 +//line sql.y:549 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } - case 55: + case 57: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:551 +//line sql.y:553 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } - case 56: + case 58: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:556 +//line sql.y:558 { yyVAL.partitions = nil } - case 57: + case 59: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:560 +//line sql.y:562 { yyVAL.partitions = yyDollar[3].partitions } - case 58: + case 60: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:566 +//line sql.y:568 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } - case 59: + case 61: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:572 +//line sql.y:574 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Characteristics: yyDollar[5].characteristics} } - case 60: + case 62: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:576 +//line sql.y:578 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Characteristics: yyDollar[4].characteristics} } - case 61: + case 63: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:582 +//line sql.y:584 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } - case 62: + case 64: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:586 +//line sql.y:588 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } - case 63: + case 65: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:592 +//line sql.y:594 { yyVAL.characteristic = &IsolationLevel{Level: string(yyDollar[3].str)} } - case 64: + case 66: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:596 +//line sql.y:598 { yyVAL.characteristic = &AccessMode{Mode: TxReadWrite} } - case 65: + case 67: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:600 +//line sql.y:602 { yyVAL.characteristic = &AccessMode{Mode: TxReadOnly} } - case 66: + case 68: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:606 +//line sql.y:608 { yyVAL.str = RepeatableRead } - case 67: + case 69: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:610 +//line sql.y:612 { yyVAL.str = ReadCommitted } - case 68: + case 70: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:614 +//line sql.y:616 { yyVAL.str = ReadUncommitted } - case 69: + case 71: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:618 +//line sql.y:620 { yyVAL.str = Serializable } - case 70: + case 72: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:624 +//line sql.y:626 { yyVAL.str = SessionStr } - case 71: + case 73: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:628 +//line sql.y:630 { yyVAL.str = GlobalStr } - case 72: + case 74: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:634 +//line sql.y:636 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } - case 73: + case 75: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:639 +//line sql.y:641 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike yyVAL.statement = yyDollar[1].ddl } - case 74: + case 76: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:645 +//line sql.y:647 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName} } - case 75: + case 77: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:650 +//line sql.y:652 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[3].tableName.ToViewName()} } - case 76: + case 78: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:654 +//line sql.y:656 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[5].tableName.ToViewName()} } - case 77: + case 79: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:658 +//line sql.y:660 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } - case 78: + case 80: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:662 +//line sql.y:664 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } - case 79: + case 81: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:667 +//line sql.y:669 { yyVAL.colIdent = NewColIdent("") } - case 80: + case 82: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:671 +//line sql.y:673 { yyVAL.colIdent = yyDollar[2].colIdent } - case 81: + case 83: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:677 +//line sql.y:679 { yyVAL.colIdent = yyDollar[1].colIdent } - case 82: + case 84: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:682 +//line sql.y:684 { var v []VindexParam yyVAL.vindexParams = v } - case 83: + case 85: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:687 +//line sql.y:689 { yyVAL.vindexParams = yyDollar[2].vindexParams } - case 84: + case 86: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:693 +//line sql.y:695 { yyVAL.vindexParams = make([]VindexParam, 0, 4) yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) } - case 85: + case 87: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:698 +//line sql.y:700 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } - case 86: + case 88: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:704 +//line sql.y:706 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } - case 87: + case 89: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:710 +//line sql.y:712 { yyVAL.ddl = &DDL{Action: CreateStr, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } - case 88: + case 90: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:717 +//line sql.y:719 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } - case 89: + case 91: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:724 +//line sql.y:726 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } - case 90: + case 92: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:728 +//line sql.y:730 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } - case 91: + case 93: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:734 +//line sql.y:736 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } - case 92: + case 94: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:739 +//line sql.y:741 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } - case 93: + case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:743 +//line sql.y:745 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } - case 94: + case 96: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:747 +//line sql.y:749 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } - case 95: + case 97: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:753 +//line sql.y:755 { yyDollar[2].columnType.NotNull = yyDollar[3].boolVal yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4224,856 +4193,856 @@ yydefault: yyDollar[2].columnType.Comment = yyDollar[8].sqlVal yyVAL.columnDefinition = &ColumnDefinition{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType} } - case 96: + case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:764 +//line sql.y:766 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolVal yyVAL.columnType.Zerofill = yyDollar[3].boolVal } - case 100: + case 102: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:775 +//line sql.y:777 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].sqlVal } - case 101: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:780 - { - yyVAL.columnType = yyDollar[1].columnType - } - case 102: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:786 - { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} - } case 103: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:790 +//line sql.y:782 { - yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + yyVAL.columnType = yyDollar[1].columnType } case 104: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:794 +//line sql.y:788 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:798 +//line sql.y:792 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:802 +//line sql.y:796 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:806 +//line sql.y:800 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:810 +//line sql.y:804 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:814 +//line sql.y:808 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:818 +//line sql.y:812 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 111: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:816 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 112: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:820 + { + yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} + } + case 113: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:824 +//line sql.y:826 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 112: + case 114: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:830 +//line sql.y:832 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 113: + case 115: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:836 +//line sql.y:838 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 114: + case 116: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:842 +//line sql.y:844 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 115: + case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:848 +//line sql.y:850 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 116: + case 118: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:856 +//line sql.y:858 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 117: + case 119: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:860 +//line sql.y:862 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 118: + case 120: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:864 +//line sql.y:866 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 119: + case 121: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:868 +//line sql.y:870 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 120: + case 122: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:872 +//line sql.y:874 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 121: + case 123: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:878 +//line sql.y:880 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } - case 122: + case 124: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:882 +//line sql.y:884 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } - case 123: + case 125: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:886 +//line sql.y:888 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 124: + case 126: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:890 +//line sql.y:892 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 125: + case 127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:894 +//line sql.y:896 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } - case 126: + case 128: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:898 +//line sql.y:900 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } - case 127: + case 129: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:902 +//line sql.y:904 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } - case 128: + case 130: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:906 +//line sql.y:908 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } - case 129: + case 131: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:910 +//line sql.y:912 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 130: + case 132: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:914 +//line sql.y:916 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 131: + case 133: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:918 +//line sql.y:920 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 132: + case 134: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:922 +//line sql.y:924 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 133: + case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:926 +//line sql.y:928 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 134: + case 136: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:930 +//line sql.y:932 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } - case 135: + case 137: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:935 +//line sql.y:937 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } - case 136: + case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:941 +//line sql.y:943 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 137: + case 139: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:945 +//line sql.y:947 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 138: + case 140: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:949 +//line sql.y:951 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 139: + case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:953 +//line sql.y:955 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 140: + case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:957 +//line sql.y:959 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 141: + case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:961 +//line sql.y:963 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 142: + case 144: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:965 +//line sql.y:967 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 143: + case 145: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:969 +//line sql.y:971 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } - case 144: + case 146: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:975 +//line sql.y:977 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") } - case 145: + case 147: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:980 +//line sql.y:982 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } - case 146: + case 148: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:985 +//line sql.y:987 { yyVAL.sqlVal = nil } - case 147: + case 149: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:989 +//line sql.y:991 { yyVAL.sqlVal = NewIntVal(yyDollar[2].bytes) } - case 148: + case 150: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:994 +//line sql.y:996 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 149: + case 151: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:998 +//line sql.y:1000 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), Scale: NewIntVal(yyDollar[4].bytes), } } - case 150: + case 152: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1006 +//line sql.y:1008 { yyVAL.LengthScaleOption = LengthScaleOption{} } - case 151: + case 153: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1010 +//line sql.y:1012 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), } } - case 152: + case 154: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1016 +//line sql.y:1018 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), Scale: NewIntVal(yyDollar[4].bytes), } } - case 153: + case 155: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1024 +//line sql.y:1026 { yyVAL.boolVal = BoolVal(false) } - case 154: + case 156: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1028 +//line sql.y:1030 { yyVAL.boolVal = BoolVal(true) } - case 155: + case 157: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1033 +//line sql.y:1035 { yyVAL.boolVal = BoolVal(false) } - case 156: + case 158: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1037 +//line sql.y:1039 { yyVAL.boolVal = BoolVal(true) } - case 157: + case 159: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1043 +//line sql.y:1045 { yyVAL.boolVal = BoolVal(false) } - case 158: + case 160: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1047 +//line sql.y:1049 { yyVAL.boolVal = BoolVal(false) } - case 159: + case 161: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1051 +//line sql.y:1053 { yyVAL.boolVal = BoolVal(true) } - case 160: + case 162: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1056 +//line sql.y:1058 { yyVAL.optVal = nil } - case 161: + case 163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1060 +//line sql.y:1062 { yyVAL.optVal = yyDollar[2].expr } - case 162: + case 164: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1065 +//line sql.y:1067 { yyVAL.optVal = nil } - case 163: + case 165: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1069 +//line sql.y:1071 { yyVAL.optVal = yyDollar[3].expr } - case 164: + case 166: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1074 +//line sql.y:1076 { yyVAL.boolVal = BoolVal(false) } - case 165: + case 167: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1078 +//line sql.y:1080 { yyVAL.boolVal = BoolVal(true) } - case 166: + case 168: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1083 +//line sql.y:1085 { yyVAL.str = "" } - case 167: + case 169: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1087 +//line sql.y:1089 { yyVAL.str = string(yyDollar[3].colIdent.String()) } - case 168: + case 170: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1091 +//line sql.y:1093 { yyVAL.str = string(yyDollar[3].bytes) } - case 169: + case 171: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1096 +//line sql.y:1098 { yyVAL.str = "" } - case 170: + case 172: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1100 +//line sql.y:1102 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 171: + case 173: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1104 +//line sql.y:1106 { yyVAL.str = string(yyDollar[2].bytes) } - case 172: + case 174: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1109 +//line sql.y:1111 { yyVAL.colKeyOpt = colKeyNone } - case 173: + case 175: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1113 +//line sql.y:1115 { yyVAL.colKeyOpt = colKeyPrimary } - case 174: + case 176: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1117 +//line sql.y:1119 { yyVAL.colKeyOpt = colKey } - case 175: + case 177: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1121 +//line sql.y:1123 { yyVAL.colKeyOpt = colKeyUniqueKey } - case 176: + case 178: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1125 +//line sql.y:1127 { yyVAL.colKeyOpt = colKeyUnique } - case 177: + case 179: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1130 +//line sql.y:1132 { yyVAL.sqlVal = nil } - case 178: + case 180: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1134 +//line sql.y:1136 { yyVAL.sqlVal = NewStrVal(yyDollar[2].bytes) } - case 179: + case 181: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1140 +//line sql.y:1142 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} } - case 180: + case 182: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1144 +//line sql.y:1146 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } - case 181: + case 183: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1150 +//line sql.y:1152 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } - case 182: + case 184: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1154 +//line sql.y:1156 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } - case 183: + case 185: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1160 +//line sql.y:1162 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].colIdent.String())} } - case 184: + case 186: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1164 +//line sql.y:1166 { // should not be string yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntVal(yyDollar[3].bytes)} } - case 185: + case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1169 +//line sql.y:1171 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrVal(yyDollar[2].bytes)} } - case 186: + case 188: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1175 +//line sql.y:1177 { yyVAL.str = "" } - case 187: + case 189: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1179 +//line sql.y:1181 { yyVAL.str = string(yyDollar[1].bytes) } - case 188: + case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1185 +//line sql.y:1187 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } - case 189: + case 191: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1189 +//line sql.y:1191 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } - case 190: + case 192: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1193 +//line sql.y:1195 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Unique: true} } - case 191: + case 193: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1197 +//line sql.y:1199 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(yyDollar[2].str), Unique: true} } - case 192: + case 194: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1201 +//line sql.y:1203 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } - case 193: + case 195: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1207 +//line sql.y:1209 { yyVAL.str = string(yyDollar[1].bytes) } - case 194: + case 196: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1211 +//line sql.y:1213 { yyVAL.str = string(yyDollar[1].bytes) } - case 195: + case 197: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1215 +//line sql.y:1217 { yyVAL.str = string(yyDollar[1].bytes) } - case 196: + case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1222 +//line sql.y:1224 { yyVAL.str = string(yyDollar[1].bytes) } - case 197: + case 199: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1226 +//line sql.y:1228 { yyVAL.str = string(yyDollar[1].bytes) } - case 198: + case 200: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1232 +//line sql.y:1234 { yyVAL.str = string(yyDollar[1].bytes) } - case 199: + case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1236 +//line sql.y:1238 { yyVAL.str = string(yyDollar[1].bytes) } - case 200: + case 202: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1241 +//line sql.y:1243 { yyVAL.str = "" } - case 201: + case 203: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1245 +//line sql.y:1247 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 202: + case 204: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1251 +//line sql.y:1253 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } - case 203: + case 205: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1255 +//line sql.y:1257 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } - case 204: + case 206: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1261 +//line sql.y:1263 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].sqlVal} } - case 205: + case 207: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1267 +//line sql.y:1269 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } - case 206: + case 208: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1271 +//line sql.y:1273 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } - case 207: + case 209: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1278 +//line sql.y:1280 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns} } - case 208: + case 210: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1282 +//line sql.y:1284 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction} } - case 209: + case 211: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1286 +//line sql.y:1288 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnUpdate: yyDollar[11].ReferenceAction} } - case 210: + case 212: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1290 +//line sql.y:1292 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction, OnUpdate: yyDollar[12].ReferenceAction} } - case 211: + case 213: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1296 +//line sql.y:1298 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } - case 212: + case 214: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1302 +//line sql.y:1304 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } - case 213: + case 215: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1308 +//line sql.y:1310 { yyVAL.ReferenceAction = Restrict } - case 214: + case 216: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1312 +//line sql.y:1314 { yyVAL.ReferenceAction = Cascade } - case 215: + case 217: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1316 +//line sql.y:1318 { yyVAL.ReferenceAction = NoAction } - case 216: + case 218: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1320 +//line sql.y:1322 { yyVAL.ReferenceAction = SetDefault } - case 217: + case 219: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1324 +//line sql.y:1326 { yyVAL.ReferenceAction = SetNull } - case 218: + case 220: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1329 +//line sql.y:1331 { yyVAL.str = "" } - case 219: + case 221: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1333 +//line sql.y:1335 { yyVAL.str = " " + string(yyDollar[1].str) } - case 220: + case 222: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1337 +//line sql.y:1339 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } - case 221: + case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1345 +//line sql.y:1347 { yyVAL.str = yyDollar[1].str } - case 222: + case 224: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1349 +//line sql.y:1351 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } - case 223: + case 225: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1353 +//line sql.y:1355 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } - case 224: + case 226: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1359 +//line sql.y:1361 { yyVAL.str = yyDollar[1].colIdent.String() } - case 225: + case 227: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1363 +//line sql.y:1365 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } - case 226: + case 228: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1367 +//line sql.y:1369 { yyVAL.str = string(yyDollar[1].bytes) } - case 227: + case 229: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1373 +//line sql.y:1375 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 228: + case 230: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1377 +//line sql.y:1379 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 229: + case 231: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1381 +//line sql.y:1383 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 230: + case 232: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1385 +//line sql.y:1387 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[4].tableName}, ToTables: TableNames{yyDollar[7].tableName}} } - case 231: + case 233: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1390 +//line sql.y:1392 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } - case 232: + case 234: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1395 +//line sql.y:1397 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName()} } - case 233: + case 235: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1399 +//line sql.y:1401 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } - case 234: + case 236: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1403 +//line sql.y:1405 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } - case 235: + case 237: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1407 +//line sql.y:1409 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } - case 236: + case 238: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1411 +//line sql.y:1413 { yyVAL.statement = &DDL{ Action: CreateVindexStr, @@ -5085,9 +5054,9 @@ yydefault: }, } } - case 237: + case 239: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1423 +//line sql.y:1425 { yyVAL.statement = &DDL{ Action: DropVindexStr, @@ -5097,21 +5066,21 @@ yydefault: }, } } - case 238: + case 240: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1433 +//line sql.y:1435 { yyVAL.statement = &DDL{Action: AddVschemaTableStr, Table: yyDollar[5].tableName} } - case 239: + case 241: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1437 +//line sql.y:1439 { yyVAL.statement = &DDL{Action: DropVschemaTableStr, Table: yyDollar[5].tableName} } - case 240: + case 242: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1441 +//line sql.y:1443 { yyVAL.statement = &DDL{ Action: AddColVindexStr, @@ -5124,9 +5093,9 @@ yydefault: VindexCols: yyDollar[9].columns, } } - case 241: + case 243: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1454 +//line sql.y:1456 { yyVAL.statement = &DDL{ Action: DropColVindexStr, @@ -5136,15 +5105,15 @@ yydefault: }, } } - case 242: + case 244: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1464 +//line sql.y:1466 { yyVAL.statement = &DDL{Action: AddSequenceStr, Table: yyDollar[5].tableName} } - case 243: + case 245: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1468 +//line sql.y:1470 { yyVAL.statement = &DDL{ Action: AddAutoIncStr, @@ -5155,59 +5124,59 @@ yydefault: }, } } - case 258: + case 260: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1497 +//line sql.y:1499 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeStr, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } - case 259: + case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1503 +//line sql.y:1505 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } - case 260: + case 262: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1507 +//line sql.y:1509 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } - case 261: + case 263: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1513 +//line sql.y:1515 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } - case 262: + case 264: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1517 +//line sql.y:1519 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } - case 263: + case 265: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1523 +//line sql.y:1525 { yyVAL.statement = yyDollar[3].ddl } - case 264: + case 266: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1529 +//line sql.y:1531 { yyVAL.ddl = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[1].tableName}, ToTables: TableNames{yyDollar[3].tableName}} } - case 265: + case 267: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1533 +//line sql.y:1535 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) yyVAL.ddl.ToTables = append(yyVAL.ddl.ToTables, yyDollar[5].tableName) } - case 266: + case 268: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1541 +//line sql.y:1543 { var exists bool if yyDollar[3].byt != 0 { @@ -5215,16 +5184,16 @@ yydefault: } yyVAL.statement = &DDL{Action: DropStr, FromTables: yyDollar[4].tableNames, IfExists: exists} } - case 267: + case 269: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1549 +//line sql.y:1551 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName} } - case 268: + case 270: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1554 +//line sql.y:1556 { var exists bool if yyDollar[3].byt != 0 { @@ -5232,145 +5201,145 @@ yydefault: } yyVAL.statement = &DDL{Action: DropStr, FromTables: TableNames{yyDollar[4].tableName.ToViewName()}, IfExists: exists} } - case 269: + case 271: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1562 +//line sql.y:1564 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } - case 270: + case 272: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1566 +//line sql.y:1568 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } - case 271: + case 273: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1572 +//line sql.y:1574 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[3].tableName} } - case 272: + case 274: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1576 +//line sql.y:1578 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[2].tableName} } - case 273: + case 275: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1581 +//line sql.y:1583 { yyVAL.statement = &OtherRead{} } - case 274: + case 276: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1587 +//line sql.y:1589 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } - case 275: + case 277: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1592 +//line sql.y:1594 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Type: CharsetStr, ShowTablesOpt: showTablesOpt} } - case 276: + case 278: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1597 +//line sql.y:1599 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt} } - case 277: + case 279: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1602 +//line sql.y:1604 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 278: + case 280: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1607 +//line sql.y:1609 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } - case 279: + case 281: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1611 +//line sql.y:1613 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 280: + case 282: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1615 +//line sql.y:1617 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName} } - case 281: + case 283: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1619 +//line sql.y:1621 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 282: + case 284: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1623 +//line sql.y:1625 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 283: + case 285: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1627 +//line sql.y:1629 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 284: + case 286: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1631 +//line sql.y:1633 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 285: + case 287: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1635 +//line sql.y:1637 { showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } - case 286: + case 288: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1640 +//line sql.y:1642 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 287: + case 289: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1644 +//line sql.y:1646 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 288: + case 290: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1648 +//line sql.y:1650 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } - case 289: + case 291: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1652 +//line sql.y:1654 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 290: + case 292: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1656 +//line sql.y:1658 { showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } - case 291: + case 293: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1661 +//line sql.y:1663 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5380,803 +5349,845 @@ yydefault: yyVAL.statement = &Show{Type: yyDollar[3].str, ShowTablesOpt: showTablesOpt} } } - case 292: + case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1671 +//line sql.y:1673 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } - case 293: + case 295: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1675 +//line sql.y:1677 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 294: + case 296: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1679 +//line sql.y:1681 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowCollationFilterOpt: yyDollar[4].expr} } - case 295: + case 297: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1683 +//line sql.y:1685 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Scope: string(yyDollar[2].bytes), Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt} } - case 296: + case 298: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1688 +//line sql.y:1690 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 297: + case 299: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1692 +//line sql.y:1694 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } - case 298: + case 300: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1696 +//line sql.y:1698 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName} } - case 299: + case 301: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1700 +//line sql.y:1702 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } - case 300: + case 302: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1714 +//line sql.y:1716 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String())} } - case 301: + case 303: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1720 +//line sql.y:1722 { yyVAL.str = string(yyDollar[1].bytes) } - case 302: + case 304: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1724 +//line sql.y:1726 { yyVAL.str = string(yyDollar[1].bytes) } - case 303: + case 305: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1730 +//line sql.y:1732 { yyVAL.str = "" } - case 304: + case 306: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1734 +//line sql.y:1736 { yyVAL.str = "extended " } - case 305: + case 307: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1740 +//line sql.y:1742 { yyVAL.str = "" } - case 306: + case 308: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1744 +//line sql.y:1746 { yyVAL.str = "full " } - case 307: + case 309: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1750 +//line sql.y:1752 { yyVAL.str = string(yyDollar[1].bytes) } - case 308: + case 310: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1754 +//line sql.y:1756 { yyVAL.str = string(yyDollar[1].bytes) } - case 309: + case 311: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1760 +//line sql.y:1762 { yyVAL.str = "" } - case 310: + case 312: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1764 +//line sql.y:1766 { yyVAL.str = yyDollar[2].tableIdent.v } - case 311: + case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1768 +//line sql.y:1770 { yyVAL.str = yyDollar[2].tableIdent.v } - case 312: + case 314: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1774 +//line sql.y:1776 { yyVAL.showFilter = nil } - case 313: + case 315: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1778 +//line sql.y:1780 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } - case 314: + case 316: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1782 +//line sql.y:1784 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } - case 315: + case 317: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1788 +//line sql.y:1790 { yyVAL.showFilter = nil } - case 316: + case 318: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1792 +//line sql.y:1794 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } - case 317: + case 319: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1798 +//line sql.y:1800 { yyVAL.str = "" } - case 318: + case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1802 +//line sql.y:1804 { yyVAL.str = SessionStr } - case 319: + case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1806 +//line sql.y:1808 { yyVAL.str = GlobalStr } - case 320: + case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1812 +//line sql.y:1814 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } - case 321: + case 323: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1816 +//line sql.y:1818 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } - case 322: + case 324: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1822 +//line sql.y:1824 { yyVAL.statement = &Begin{} } - case 323: + case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1826 +//line sql.y:1828 { yyVAL.statement = &Begin{} } - case 324: + case 326: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1832 +//line sql.y:1834 { yyVAL.statement = &Commit{} } - case 325: + case 327: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1838 +//line sql.y:1840 { yyVAL.statement = &Rollback{} } - case 326: + case 328: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:1844 + { + yyVAL.statement = &SRollback{Name: yyDollar[5].colIdent} + } + case 329: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:1849 + { + yyVAL.empty = nil + } + case 330: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1851 + { + yyVAL.empty = nil + } + case 331: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:1854 + { + yyVAL.empty = nil + } + case 332: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:1856 + { + yyVAL.empty = nil + } + case 333: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:1861 + { + yyVAL.statement = &Savepoint{Name: yyDollar[2].colIdent} + } + case 334: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:1867 + { + yyVAL.statement = &Release{Name: yyDollar[3].colIdent} + } + case 335: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1843 +//line sql.y:1872 { yyVAL.str = "" } - case 327: + case 336: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1847 +//line sql.y:1876 { yyVAL.str = JSONStr } - case 328: + case 337: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1851 +//line sql.y:1880 { yyVAL.str = TreeStr } - case 329: + case 338: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1855 +//line sql.y:1884 { yyVAL.str = VitessStr } - case 330: + case 339: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1859 +//line sql.y:1888 { yyVAL.str = TraditionalStr } - case 331: + case 340: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1863 +//line sql.y:1892 { yyVAL.str = AnalyzeStr } - case 332: + case 341: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1869 +//line sql.y:1898 { yyVAL.bytes = yyDollar[1].bytes } - case 333: + case 342: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1873 +//line sql.y:1902 { yyVAL.bytes = yyDollar[1].bytes } - case 334: + case 343: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1877 +//line sql.y:1906 { yyVAL.bytes = yyDollar[1].bytes } - case 335: + case 344: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1883 +//line sql.y:1912 { yyVAL.statement = yyDollar[1].selStmt } - case 336: + case 345: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1887 +//line sql.y:1916 { yyVAL.statement = yyDollar[1].statement } - case 337: + case 346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1891 +//line sql.y:1920 { yyVAL.statement = yyDollar[1].statement } - case 338: + case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1895 +//line sql.y:1924 { yyVAL.statement = yyDollar[1].statement } - case 339: + case 348: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1900 +//line sql.y:1929 { yyVAL.str = "" } - case 340: + case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1904 +//line sql.y:1933 { yyVAL.str = "" } - case 341: + case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1908 +//line sql.y:1937 { yyVAL.str = "" } - case 342: + case 351: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1914 +//line sql.y:1943 { yyVAL.statement = &OtherRead{} } - case 343: + case 352: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1918 +//line sql.y:1947 { yyVAL.statement = &Explain{Type: yyDollar[2].str, Statement: yyDollar[3].statement} } - case 344: + case 353: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1924 +//line sql.y:1953 { yyVAL.statement = &OtherAdmin{} } - case 345: + case 354: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1928 +//line sql.y:1957 { yyVAL.statement = &OtherAdmin{} } - case 346: + case 355: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1932 +//line sql.y:1961 { yyVAL.statement = &OtherAdmin{} } - case 347: + case 356: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1936 +//line sql.y:1965 { yyVAL.statement = &OtherAdmin{} } - case 348: + case 357: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1942 +//line sql.y:1971 { yyVAL.statement = &DDL{Action: FlushStr} } - case 349: + case 358: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1946 +//line sql.y:1975 { setAllowComments(yylex, true) } - case 350: + case 359: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1950 +//line sql.y:1979 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } - case 351: + case 360: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1956 +//line sql.y:1985 { yyVAL.bytes2 = nil } - case 352: + case 361: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1960 +//line sql.y:1989 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } - case 353: + case 362: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1966 +//line sql.y:1995 { yyVAL.str = UnionStr } - case 354: + case 363: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1970 +//line sql.y:1999 { yyVAL.str = UnionAllStr } - case 355: + case 364: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1974 +//line sql.y:2003 { yyVAL.str = UnionDistinctStr } - case 356: + case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1979 +//line sql.y:2008 { yyVAL.str = "" } - case 357: + case 366: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1983 +//line sql.y:2012 { yyVAL.str = SQLNoCacheStr } - case 358: + case 367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1987 +//line sql.y:2016 { yyVAL.str = SQLCacheStr } - case 359: + case 368: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1992 +//line sql.y:2021 { yyVAL.str = "" } - case 360: + case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1996 +//line sql.y:2025 { yyVAL.str = DistinctStr } - case 361: + case 370: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2000 +//line sql.y:2029 { yyVAL.str = DistinctStr } - case 362: + case 371: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2005 +//line sql.y:2034 { yyVAL.selectExprs = nil } - case 363: + case 372: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2009 +//line sql.y:2038 { yyVAL.selectExprs = yyDollar[1].selectExprs } - case 364: + case 373: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2014 +//line sql.y:2043 { yyVAL.strs = nil } - case 365: + case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2018 +//line sql.y:2047 { yyVAL.strs = []string{yyDollar[1].str} } - case 366: + case 375: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2022 +//line sql.y:2051 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } - case 367: + case 376: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2026 +//line sql.y:2055 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 368: + case 377: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2030 +//line sql.y:2059 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 369: + case 378: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2036 +//line sql.y:2065 { yyVAL.str = SQLNoCacheStr } - case 370: + case 379: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2040 +//line sql.y:2069 { yyVAL.str = SQLCacheStr } - case 371: + case 380: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2044 +//line sql.y:2073 { yyVAL.str = DistinctStr } - case 372: + case 381: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2048 +//line sql.y:2077 { yyVAL.str = DistinctStr } - case 373: + case 382: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2052 +//line sql.y:2081 { yyVAL.str = StraightJoinHint } - case 374: + case 383: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2056 +//line sql.y:2085 { yyVAL.str = SQLCalcFoundRowsStr } - case 375: + case 384: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2062 +//line sql.y:2091 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } - case 376: + case 385: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2066 +//line sql.y:2095 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } - case 377: + case 386: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2072 +//line sql.y:2101 { yyVAL.selectExpr = &StarExpr{} } - case 378: + case 387: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2076 +//line sql.y:2105 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } - case 379: + case 388: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2080 +//line sql.y:2109 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } - case 380: + case 389: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2084 +//line sql.y:2113 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } - case 381: + case 390: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2089 +//line sql.y:2118 { yyVAL.colIdent = ColIdent{} } - case 382: + case 391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2093 +//line sql.y:2122 { yyVAL.colIdent = yyDollar[1].colIdent } - case 383: + case 392: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2097 +//line sql.y:2126 { yyVAL.colIdent = yyDollar[2].colIdent } - case 385: + case 394: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2104 +//line sql.y:2133 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 386: + case 395: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2109 +//line sql.y:2138 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } - case 387: + case 396: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2113 +//line sql.y:2142 { yyVAL.tableExprs = yyDollar[2].tableExprs } - case 388: + case 397: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2119 +//line sql.y:2148 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } - case 389: + case 398: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2123 +//line sql.y:2152 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } - case 392: + case 401: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2133 +//line sql.y:2162 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } - case 393: + case 402: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2137 +//line sql.y:2166 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } - case 394: + case 403: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2141 +//line sql.y:2170 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } - case 395: + case 404: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2147 +//line sql.y:2176 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } - case 396: + case 405: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2153 +//line sql.y:2182 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } - case 397: + case 406: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2157 +//line sql.y:2186 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } - case 398: + case 407: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2163 +//line sql.y:2192 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 399: + case 408: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2167 +//line sql.y:2196 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 400: + case 409: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2173 +//line sql.y:2202 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } - case 401: + case 410: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2177 +//line sql.y:2206 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } - case 402: + case 411: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2190 +//line sql.y:2219 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 403: + case 412: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2194 +//line sql.y:2223 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 404: + case 413: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2198 +//line sql.y:2227 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 405: + case 414: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2202 +//line sql.y:2231 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } - case 406: + case 415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2208 +//line sql.y:2237 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 407: + case 416: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2210 +//line sql.y:2239 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } - case 408: + case 417: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2214 +//line sql.y:2243 { yyVAL.joinCondition = JoinCondition{} } - case 409: + case 418: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2216 +//line sql.y:2245 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 410: + case 419: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2220 +//line sql.y:2249 { yyVAL.joinCondition = JoinCondition{} } - case 411: + case 420: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2222 +//line sql.y:2251 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 412: + case 421: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2225 +//line sql.y:2254 { yyVAL.empty = struct{}{} } - case 413: + case 422: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2227 +//line sql.y:2256 { yyVAL.empty = struct{}{} } - case 414: + case 423: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2230 +//line sql.y:2259 { yyVAL.tableIdent = NewTableIdent("") } - case 415: + case 424: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2234 +//line sql.y:2263 { yyVAL.tableIdent = yyDollar[1].tableIdent } - case 416: + case 425: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2238 +//line sql.y:2267 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 418: + case 427: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2245 +//line sql.y:2274 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 419: + case 428: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2251 +//line sql.y:2280 { yyVAL.str = JoinStr } - case 420: + case 429: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2255 +//line sql.y:2284 { yyVAL.str = JoinStr } - case 421: + case 430: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2259 +//line sql.y:2288 { yyVAL.str = JoinStr } - case 422: + case 431: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2265 +//line sql.y:2294 { yyVAL.str = StraightJoinStr } - case 423: + case 432: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2271 +//line sql.y:2300 { yyVAL.str = LeftJoinStr } - case 424: + case 433: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2275 +//line sql.y:2304 { yyVAL.str = LeftJoinStr } - case 425: + case 434: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2279 +//line sql.y:2308 { yyVAL.str = RightJoinStr } - case 426: + case 435: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2283 +//line sql.y:2312 { yyVAL.str = RightJoinStr } - case 427: + case 436: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2289 +//line sql.y:2318 { yyVAL.str = NaturalJoinStr } - case 428: + case 437: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2293 +//line sql.y:2322 { if yyDollar[2].str == LeftJoinStr { yyVAL.str = NaturalLeftJoinStr @@ -6184,483 +6195,483 @@ yydefault: yyVAL.str = NaturalRightJoinStr } } - case 429: + case 438: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2303 +//line sql.y:2332 { yyVAL.tableName = yyDollar[2].tableName } - case 430: + case 439: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2307 +//line sql.y:2336 { yyVAL.tableName = yyDollar[1].tableName } - case 431: + case 440: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2313 +//line sql.y:2342 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 432: + case 441: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2317 +//line sql.y:2346 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } - case 433: + case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2323 +//line sql.y:2352 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 434: + case 443: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2328 +//line sql.y:2357 { yyVAL.indexHints = nil } - case 435: + case 444: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2332 +//line sql.y:2361 { yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].columns} } - case 436: + case 445: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2336 +//line sql.y:2365 { yyVAL.indexHints = &IndexHints{Type: UseStr} } - case 437: + case 446: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2340 +//line sql.y:2369 { yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].columns} } - case 438: + case 447: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2344 +//line sql.y:2373 { yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].columns} } - case 439: + case 448: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2349 +//line sql.y:2378 { yyVAL.expr = nil } - case 440: + case 449: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2353 +//line sql.y:2382 { yyVAL.expr = yyDollar[2].expr } - case 441: + case 450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2359 +//line sql.y:2388 { yyVAL.expr = yyDollar[1].expr } - case 442: + case 451: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2363 +//line sql.y:2392 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 443: + case 452: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2367 +//line sql.y:2396 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 444: + case 453: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2371 +//line sql.y:2400 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } - case 445: + case 454: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2375 +//line sql.y:2404 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } - case 446: + case 455: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2379 +//line sql.y:2408 { yyVAL.expr = yyDollar[1].expr } - case 447: + case 456: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2383 +//line sql.y:2412 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } - case 448: + case 457: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2389 +//line sql.y:2418 { yyVAL.str = "" } - case 449: + case 458: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2393 +//line sql.y:2422 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 450: + case 459: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2399 +//line sql.y:2428 { yyVAL.boolVal = BoolVal(true) } - case 451: + case 460: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2403 +//line sql.y:2432 { yyVAL.boolVal = BoolVal(false) } - case 452: + case 461: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2409 +//line sql.y:2438 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } - case 453: + case 462: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2413 +//line sql.y:2442 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } - case 454: + case 463: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2417 +//line sql.y:2446 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } - case 455: + case 464: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2421 +//line sql.y:2450 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } - case 456: + case 465: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2425 +//line sql.y:2454 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } - case 457: + case 466: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2429 +//line sql.y:2458 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } - case 458: + case 467: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2433 +//line sql.y:2462 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } - case 459: + case 468: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2437 +//line sql.y:2466 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } - case 460: + case 469: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2441 +//line sql.y:2470 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } - case 461: + case 470: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2445 +//line sql.y:2474 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } - case 462: + case 471: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2451 +//line sql.y:2480 { yyVAL.str = IsNullStr } - case 463: + case 472: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2455 +//line sql.y:2484 { yyVAL.str = IsNotNullStr } - case 464: + case 473: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2459 +//line sql.y:2488 { yyVAL.str = IsTrueStr } - case 465: + case 474: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2463 +//line sql.y:2492 { yyVAL.str = IsNotTrueStr } - case 466: + case 475: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2467 +//line sql.y:2496 { yyVAL.str = IsFalseStr } - case 467: + case 476: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2471 +//line sql.y:2500 { yyVAL.str = IsNotFalseStr } - case 468: + case 477: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2477 +//line sql.y:2506 { yyVAL.str = EqualStr } - case 469: + case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2481 +//line sql.y:2510 { yyVAL.str = LessThanStr } - case 470: + case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2485 +//line sql.y:2514 { yyVAL.str = GreaterThanStr } - case 471: + case 480: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2489 +//line sql.y:2518 { yyVAL.str = LessEqualStr } - case 472: + case 481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2493 +//line sql.y:2522 { yyVAL.str = GreaterEqualStr } - case 473: + case 482: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2497 +//line sql.y:2526 { yyVAL.str = NotEqualStr } - case 474: + case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2501 +//line sql.y:2530 { yyVAL.str = NullSafeEqualStr } - case 475: + case 484: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2506 +//line sql.y:2535 { yyVAL.expr = nil } - case 476: + case 485: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2510 +//line sql.y:2539 { yyVAL.expr = yyDollar[2].expr } - case 477: + case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2516 +//line sql.y:2545 { yyVAL.colTuple = yyDollar[1].valTuple } - case 478: + case 487: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2520 +//line sql.y:2549 { yyVAL.colTuple = yyDollar[1].subquery } - case 479: + case 488: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2524 +//line sql.y:2553 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } - case 480: + case 489: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2530 +//line sql.y:2559 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } - case 481: + case 490: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2536 +//line sql.y:2565 { yyVAL.exprs = Exprs{yyDollar[1].expr} } - case 482: + case 491: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2540 +//line sql.y:2569 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } - case 483: + case 492: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2546 +//line sql.y:2575 { yyVAL.expr = yyDollar[1].expr } - case 484: + case 493: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2550 +//line sql.y:2579 { yyVAL.expr = yyDollar[1].boolVal } - case 485: + case 494: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2554 +//line sql.y:2583 { yyVAL.expr = yyDollar[1].colName } - case 486: + case 495: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2558 +//line sql.y:2587 { yyVAL.expr = yyDollar[1].expr } - case 487: + case 496: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2562 +//line sql.y:2591 { yyVAL.expr = yyDollar[1].subquery } - case 488: + case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2566 +//line sql.y:2595 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } - case 489: + case 498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2570 +//line sql.y:2599 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } - case 490: + case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2574 +//line sql.y:2603 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } - case 491: + case 500: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2578 +//line sql.y:2607 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } - case 492: + case 501: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2582 +//line sql.y:2611 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } - case 493: + case 502: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2586 +//line sql.y:2615 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } - case 494: + case 503: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2590 +//line sql.y:2619 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } - case 495: + case 504: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2594 +//line sql.y:2623 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } - case 496: + case 505: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2598 +//line sql.y:2627 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 497: + case 506: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2602 +//line sql.y:2631 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 498: + case 507: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2606 +//line sql.y:2635 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } - case 499: + case 508: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2610 +//line sql.y:2639 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } - case 500: + case 509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2614 +//line sql.y:2643 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } - case 501: + case 510: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2618 +//line sql.y:2647 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } - case 502: + case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2622 +//line sql.y:2651 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } - case 503: + case 512: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2626 +//line sql.y:2655 { yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} } - case 504: + case 513: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2630 +//line sql.y:2659 { yyVAL.expr = &UnaryExpr{Operator: UBinaryStr, Expr: yyDollar[2].expr} } - case 505: + case 514: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2634 +//line sql.y:2663 { yyVAL.expr = &UnaryExpr{Operator: Utf8Str, Expr: yyDollar[2].expr} } - case 506: + case 515: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2638 +//line sql.y:2667 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Str, Expr: yyDollar[2].expr} } - case 507: + case 516: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2642 +//line sql.y:2671 { yyVAL.expr = &UnaryExpr{Operator: Latin1Str, Expr: yyDollar[2].expr} } - case 508: + case 517: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2646 +//line sql.y:2675 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6668,9 +6679,9 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UPlusStr, Expr: yyDollar[2].expr} } } - case 509: + case 518: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2654 +//line sql.y:2683 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -6684,21 +6695,21 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UMinusStr, Expr: yyDollar[2].expr} } } - case 510: + case 519: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2668 +//line sql.y:2697 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } - case 511: + case 520: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2672 +//line sql.y:2701 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } - case 512: + case 521: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2676 +//line sql.y:2705 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6706,497 +6717,497 @@ yydefault: // will be non-trivial because of grammar conflicts. yyVAL.expr = &IntervalExpr{Expr: yyDollar[2].expr, Unit: yyDollar[3].colIdent.String()} } - case 517: + case 526: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2694 +//line sql.y:2723 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } - case 518: + case 527: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2698 +//line sql.y:2727 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 519: + case 528: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2702 +//line sql.y:2731 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 520: + case 529: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2706 +//line sql.y:2735 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } - case 521: + case 530: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2716 +//line sql.y:2745 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } - case 522: + case 531: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2720 +//line sql.y:2749 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } - case 523: + case 532: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2724 +//line sql.y:2753 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 524: + case 533: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2728 +//line sql.y:2757 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 525: + case 534: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2732 +//line sql.y:2761 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } - case 526: + case 535: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2736 +//line sql.y:2765 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 527: + case 536: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2740 +//line sql.y:2769 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 528: + case 537: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2744 +//line sql.y:2773 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 529: + case 538: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2748 +//line sql.y:2777 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 530: + case 539: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:2752 +//line sql.y:2781 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].str} } - case 531: + case 540: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2756 +//line sql.y:2785 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } - case 532: + case 541: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2760 +//line sql.y:2789 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } - case 533: + case 542: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2764 +//line sql.y:2793 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } - case 534: + case 543: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2774 +//line sql.y:2803 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } - case 535: + case 544: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2778 +//line sql.y:2807 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } - case 536: + case 545: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2782 +//line sql.y:2811 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } - case 537: + case 546: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2787 +//line sql.y:2816 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } - case 538: + case 547: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2792 +//line sql.y:2821 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } - case 539: + case 548: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2797 +//line sql.y:2826 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } - case 540: + case 549: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2803 +//line sql.y:2832 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } - case 541: + case 550: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2808 +//line sql.y:2837 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } - case 542: + case 551: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2813 +//line sql.y:2842 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } - case 543: + case 552: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2817 +//line sql.y:2846 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } - case 544: + case 553: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2821 +//line sql.y:2850 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } - case 545: + case 554: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2826 +//line sql.y:2855 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } - case 546: + case 555: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2831 +//line sql.y:2860 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } - case 547: + case 556: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2836 +//line sql.y:2865 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } - case 548: + case 557: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2840 +//line sql.y:2869 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 549: + case 558: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2844 +//line sql.y:2873 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 552: + case 561: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2854 +//line sql.y:2883 { yyVAL.expr = yyDollar[2].expr } - case 553: + case 562: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2864 +//line sql.y:2893 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } - case 554: + case 563: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2868 +//line sql.y:2897 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } - case 555: + case 564: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2872 +//line sql.y:2901 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } - case 556: + case 565: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2876 +//line sql.y:2905 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } - case 557: + case 566: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2880 +//line sql.y:2909 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } - case 558: + case 567: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2884 +//line sql.y:2913 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 559: + case 568: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2888 +//line sql.y:2917 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 560: + case 569: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2894 +//line sql.y:2923 { yyVAL.str = "" } - case 561: + case 570: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2898 +//line sql.y:2927 { yyVAL.str = BooleanModeStr } - case 562: + case 571: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2902 +//line sql.y:2931 { yyVAL.str = NaturalLanguageModeStr } - case 563: + case 572: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2906 +//line sql.y:2935 { yyVAL.str = NaturalLanguageModeWithQueryExpansionStr } - case 564: + case 573: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2910 +//line sql.y:2939 { yyVAL.str = QueryExpansionStr } - case 565: + case 574: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2916 +//line sql.y:2945 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 566: + case 575: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2920 +//line sql.y:2949 { yyVAL.str = string(yyDollar[1].bytes) } - case 567: + case 576: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2926 +//line sql.y:2955 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 568: + case 577: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2930 +//line sql.y:2959 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Operator: CharacterSetStr} } - case 569: + case 578: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2934 +//line sql.y:2963 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: string(yyDollar[3].colIdent.String())} } - case 570: + case 579: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2938 +//line sql.y:2967 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 571: + case 580: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2942 +//line sql.y:2971 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 572: + case 581: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2946 +//line sql.y:2975 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.convertType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 573: + case 582: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2952 +//line sql.y:2981 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 574: + case 583: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2956 +//line sql.y:2985 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 575: + case 584: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2960 +//line sql.y:2989 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 576: + case 585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2964 +//line sql.y:2993 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 577: + case 586: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2968 +//line sql.y:2997 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 578: + case 587: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2972 +//line sql.y:3001 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 579: + case 588: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2976 +//line sql.y:3005 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 580: + case 589: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2981 +//line sql.y:3010 { yyVAL.expr = nil } - case 581: + case 590: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2985 +//line sql.y:3014 { yyVAL.expr = yyDollar[1].expr } - case 582: + case 591: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2990 +//line sql.y:3019 { yyVAL.str = string("") } - case 583: + case 592: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2994 +//line sql.y:3023 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } - case 584: + case 593: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3000 +//line sql.y:3029 { yyVAL.whens = []*When{yyDollar[1].when} } - case 585: + case 594: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3004 +//line sql.y:3033 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } - case 586: + case 595: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3010 +//line sql.y:3039 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } - case 587: + case 596: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3015 +//line sql.y:3044 { yyVAL.expr = nil } - case 588: + case 597: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3019 +//line sql.y:3048 { yyVAL.expr = yyDollar[2].expr } - case 589: + case 598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3025 +//line sql.y:3054 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } - case 590: + case 599: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3029 +//line sql.y:3058 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } - case 591: + case 600: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3033 +//line sql.y:3062 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } - case 592: + case 601: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3039 +//line sql.y:3068 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 593: + case 602: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3043 +//line sql.y:3072 { yyVAL.expr = NewHexVal(yyDollar[1].bytes) } - case 594: + case 603: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3047 +//line sql.y:3076 { yyVAL.expr = NewBitVal(yyDollar[1].bytes) } - case 595: + case 604: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3051 +//line sql.y:3080 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 596: + case 605: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3055 +//line sql.y:3084 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } - case 597: + case 606: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3059 +//line sql.y:3088 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } - case 598: + case 607: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3063 +//line sql.y:3092 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 599: + case 608: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3067 +//line sql.y:3096 { yyVAL.expr = &NullVal{} } - case 600: + case 609: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3073 +//line sql.y:3102 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7205,225 +7216,225 @@ yydefault: } yyVAL.expr = NewIntVal([]byte("1")) } - case 601: + case 610: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3082 +//line sql.y:3111 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 602: + case 611: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3086 +//line sql.y:3115 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 603: + case 612: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3091 +//line sql.y:3120 { yyVAL.exprs = nil } - case 604: + case 613: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3095 +//line sql.y:3124 { yyVAL.exprs = yyDollar[3].exprs } - case 605: + case 614: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3100 +//line sql.y:3129 { yyVAL.expr = nil } - case 606: + case 615: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3104 +//line sql.y:3133 { yyVAL.expr = yyDollar[2].expr } - case 607: + case 616: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3109 +//line sql.y:3138 { yyVAL.orderBy = nil } - case 608: + case 617: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3113 +//line sql.y:3142 { yyVAL.orderBy = yyDollar[3].orderBy } - case 609: + case 618: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3119 +//line sql.y:3148 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } - case 610: + case 619: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3123 +//line sql.y:3152 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } - case 611: + case 620: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3129 +//line sql.y:3158 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } - case 612: + case 621: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3134 +//line sql.y:3163 { yyVAL.str = AscScr } - case 613: + case 622: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3138 +//line sql.y:3167 { yyVAL.str = AscScr } - case 614: + case 623: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3142 +//line sql.y:3171 { yyVAL.str = DescScr } - case 615: + case 624: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3147 +//line sql.y:3176 { yyVAL.limit = nil } - case 616: + case 625: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3151 +//line sql.y:3180 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } - case 617: + case 626: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3155 +//line sql.y:3184 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } - case 618: + case 627: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3159 +//line sql.y:3188 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } - case 619: + case 628: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3164 +//line sql.y:3193 { yyVAL.str = "" } - case 620: + case 629: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3168 +//line sql.y:3197 { yyVAL.str = ForUpdateStr } - case 621: + case 630: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3172 +//line sql.y:3201 { yyVAL.str = ShareModeStr } - case 622: + case 631: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3185 +//line sql.y:3214 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 623: + case 632: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3189 +//line sql.y:3218 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 624: + case 633: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3193 +//line sql.y:3222 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 625: + case 634: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3197 +//line sql.y:3226 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 626: + case 635: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3203 +//line sql.y:3232 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 627: + case 636: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3207 +//line sql.y:3236 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 628: + case 637: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3211 +//line sql.y:3240 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 629: + case 638: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3215 +//line sql.y:3244 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 630: + case 639: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3220 +//line sql.y:3249 { yyVAL.updateExprs = nil } - case 631: + case 640: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3224 +//line sql.y:3253 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 632: + case 641: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3230 +//line sql.y:3259 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 633: + case 642: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3234 +//line sql.y:3263 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 634: + case 643: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3240 +//line sql.y:3269 { yyVAL.valTuple = yyDollar[1].valTuple } - case 635: + case 644: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3244 +//line sql.y:3273 { yyVAL.valTuple = ValTuple{} } - case 636: + case 645: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3250 +//line sql.y:3279 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 637: + case 646: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3256 +//line sql.y:3285 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7431,319 +7442,319 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 638: + case 647: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3266 +//line sql.y:3295 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 639: + case 648: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3270 +//line sql.y:3299 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 640: + case 649: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3276 +//line sql.y:3305 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 641: + case 650: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3282 +//line sql.y:3311 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 642: + case 651: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3286 +//line sql.y:3315 { yyDollar[2].setExpr.Scope = yyDollar[1].str yyVAL.setExprs = SetExprs{yyDollar[2].setExpr} } - case 643: + case 652: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3291 +//line sql.y:3320 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 644: + case 653: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3297 +//line sql.y:3326 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("on"))} } - case 645: + case 654: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3301 +//line sql.y:3330 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("off"))} } - case 646: + case 655: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3305 +//line sql.y:3334 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: yyDollar[3].expr} } - case 647: + case 656: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3309 +//line sql.y:3338 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Expr: yyDollar[2].expr} } - case 649: + case 658: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3316 +//line sql.y:3345 { yyVAL.bytes = []byte("charset") } - case 651: + case 660: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3323 +//line sql.y:3352 { yyVAL.expr = NewStrVal([]byte(yyDollar[1].colIdent.String())) } - case 652: + case 661: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3327 +//line sql.y:3356 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 653: + case 662: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3331 +//line sql.y:3360 { yyVAL.expr = &Default{} } - case 656: + case 665: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3340 +//line sql.y:3369 { yyVAL.byt = 0 } - case 657: + case 666: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3342 +//line sql.y:3371 { yyVAL.byt = 1 } - case 658: + case 667: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3345 +//line sql.y:3374 { yyVAL.empty = struct{}{} } - case 659: + case 668: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3347 +//line sql.y:3376 { yyVAL.empty = struct{}{} } - case 660: + case 669: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3350 +//line sql.y:3379 { yyVAL.str = "" } - case 661: + case 670: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3352 +//line sql.y:3381 { yyVAL.str = IgnoreStr } - case 662: + case 671: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3356 +//line sql.y:3385 { yyVAL.empty = struct{}{} } - case 663: + case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3358 +//line sql.y:3387 { yyVAL.empty = struct{}{} } - case 664: + case 673: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3360 +//line sql.y:3389 { yyVAL.empty = struct{}{} } - case 665: + case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3362 +//line sql.y:3391 { yyVAL.empty = struct{}{} } - case 666: + case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3364 +//line sql.y:3393 { yyVAL.empty = struct{}{} } - case 667: + case 676: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3366 +//line sql.y:3395 { yyVAL.empty = struct{}{} } - case 668: + case 677: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3368 +//line sql.y:3397 { yyVAL.empty = struct{}{} } - case 669: + case 678: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3370 +//line sql.y:3399 { yyVAL.empty = struct{}{} } - case 670: + case 679: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3372 +//line sql.y:3401 { yyVAL.empty = struct{}{} } - case 671: + case 680: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3374 +//line sql.y:3403 { yyVAL.empty = struct{}{} } - case 672: + case 681: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3377 +//line sql.y:3406 { yyVAL.empty = struct{}{} } - case 673: + case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3379 +//line sql.y:3408 { yyVAL.empty = struct{}{} } - case 674: + case 683: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3381 +//line sql.y:3410 { yyVAL.empty = struct{}{} } - case 675: + case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3385 +//line sql.y:3414 { yyVAL.empty = struct{}{} } - case 676: + case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3387 +//line sql.y:3416 { yyVAL.empty = struct{}{} } - case 677: + case 686: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3390 +//line sql.y:3419 { yyVAL.empty = struct{}{} } - case 678: + case 687: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3392 +//line sql.y:3421 { yyVAL.empty = struct{}{} } - case 679: + case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3394 +//line sql.y:3423 { yyVAL.empty = struct{}{} } - case 680: + case 689: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3397 +//line sql.y:3426 { yyVAL.colIdent = ColIdent{} } - case 681: + case 690: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3399 +//line sql.y:3428 { yyVAL.colIdent = yyDollar[2].colIdent } - case 682: + case 691: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3403 +//line sql.y:3432 { yyVAL.colIdent = yyDollar[1].colIdent } - case 683: + case 692: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3407 +//line sql.y:3436 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 685: + case 694: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3414 +//line sql.y:3443 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 686: + case 695: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3420 +//line sql.y:3449 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 687: + case 696: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3424 +//line sql.y:3453 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 689: + case 698: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3431 +//line sql.y:3460 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 980: + case 989: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3747 +//line sql.y:3776 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 981: + case 990: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3756 +//line sql.y:3785 { decNesting(yylex) } - case 982: + case 991: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3761 +//line sql.y:3790 { skipToEnd(yylex) } - case 983: + case 992: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3766 +//line sql.y:3795 { skipToEnd(yylex) } - case 984: + case 993: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3770 +//line sql.y:3799 { skipToEnd(yylex) } - case 985: + case 994: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3774 +//line sql.y:3803 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index afd9f3db575..2108bfc1449 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -171,7 +171,7 @@ func skipToEnd(yylex interface{}) { %token SEQUENCE // Transaction Tokens -%token BEGIN START TRANSACTION COMMIT ROLLBACK +%token BEGIN START TRANSACTION COMMIT ROLLBACK SAVEPOINT RELEASE WORK // Type Tokens %token BIT TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT INTNUM @@ -223,7 +223,7 @@ func skipToEnd(yylex interface{}) { %type create_statement alter_statement rename_statement drop_statement truncate_statement flush_statement do_statement %type create_table_prefix rename_list %type analyze_statement show_statement use_statement other_statement -%type begin_statement commit_statement rollback_statement +%type begin_statement commit_statement rollback_statement savepoint_statement release_statement %type comment_opt comment_list %type union_op insert_or_replace explain_format_opt wild_opt %type explain_synonyms @@ -288,7 +288,7 @@ func skipToEnd(yylex interface{}) { %type sql_id reserved_sql_id col_alias as_ci_opt using_opt %type charset_value %type table_id reserved_table_id table_alias as_opt_id -%type as_opt +%type as_opt work_opt savepoint_opt %type skip_to_end ddl_skip_to_end %type charset %type set_session_or_global show_session_or_global @@ -363,6 +363,8 @@ command: | begin_statement | commit_statement | rollback_statement +| savepoint_statement +| release_statement | explain_statement | other_statement | flush_statement @@ -1838,6 +1840,33 @@ rollback_statement: { $$ = &Rollback{} } +| ROLLBACK work_opt TO savepoint_opt sql_id + { + $$ = &SRollback{Name: $5} + } + +work_opt: + { $$ = nil } +| WORK + { $$ = nil } + +savepoint_opt: + { $$ = nil } +| SAVEPOINT + { $$ = nil } + + +savepoint_statement: + SAVEPOINT sql_id + { + $$ = &Savepoint{Name: $2} + } + +release_statement: + RELEASE SAVEPOINT sql_id + { + $$ = &Release{Name: $3} + } explain_format_opt: { diff --git a/go/vt/sqlparser/token.go b/go/vt/sqlparser/token.go index a5259e9fd49..2456a9617e6 100644 --- a/go/vt/sqlparser/token.go +++ b/go/vt/sqlparser/token.go @@ -308,7 +308,7 @@ var keywords = map[string]int{ "real": REAL, "references": REFERENCES, "regexp": REGEXP, - "release": UNUSED, + "release": RELEASE, "rename": RENAME, "reorganize": REORGANIZE, "repair": REPAIR, @@ -323,6 +323,7 @@ var keywords = map[string]int{ "right": RIGHT, "rlike": REGEXP, "rollback": ROLLBACK, + "savepoint": SAVEPOINT, "schema": SCHEMA, "second_microsecond": UNUSED, "select": SELECT, @@ -407,6 +408,7 @@ var keywords = map[string]int{ "where": WHERE, "while": UNUSED, "with": WITH, + "work": WORK, "write": WRITE, "xor": UNUSED, "year": YEAR, From 382693ca87757c6f09cb3ffad5299c476c03b4fd Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 23 Jun 2020 10:52:44 +0530 Subject: [PATCH 082/430] added savepoint unsupported plan Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/savepoint_test.go | 23 ------------------- go/vt/sqlparser/sql.go | 8 +++---- go/vt/sqlparser/sql.y | 8 +++---- go/vt/vtgate/planbuilder/builder.go | 2 ++ .../testdata/unsupported_cases.txt | 12 ++++++++++ 5 files changed, 22 insertions(+), 31 deletions(-) delete mode 100644 go/test/endtoend/vtgate/savepoint_test.go diff --git a/go/test/endtoend/vtgate/savepoint_test.go b/go/test/endtoend/vtgate/savepoint_test.go deleted file mode 100644 index c7d38ba7927..00000000000 --- a/go/test/endtoend/vtgate/savepoint_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package vtgate - -import ( - "context" - "github.com/stretchr/testify/require" - "testing" - "vitess.io/vitess/go/mysql" - "vitess.io/vitess/go/test/endtoend/cluster" -) - -func TestSavepoint(t *testing.T) { - defer cluster.PanicHandler(t) - ctx := context.Background() - conn, err := mysql.Connect(ctx, &vtParams) - require.Nil(t, err) - defer conn.Close() - - exec(t, conn, "delete from t1") - - exec(t, conn, "start transaction") - exec(t, conn, "start transaction") - exec(t, conn, "start transaction") -} diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 2cbf0bdbf6b..51696c69aab 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -5564,25 +5564,25 @@ yydefault: yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:1849 { - yyVAL.empty = nil + yyVAL.empty = struct{}{} } case 330: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:1851 { - yyVAL.empty = nil + yyVAL.empty = struct{}{} } case 331: yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:1854 { - yyVAL.empty = nil + yyVAL.empty = struct{}{} } case 332: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:1856 { - yyVAL.empty = nil + yyVAL.empty = struct{}{} } case 333: yyDollar = yyS[yypt-2 : yypt+1] diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 2108bfc1449..4dd0a181838 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -1846,14 +1846,14 @@ rollback_statement: } work_opt: - { $$ = nil } + { $$ = struct{}{} } | WORK - { $$ = nil } + { $$ = struct{}{} } savepoint_opt: - { $$ = nil } + { $$ = struct{}{} } | SAVEPOINT - { $$ = nil } + { $$ = struct{}{} } savepoint_statement: diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go index 92b72ff8ddf..175f61846d1 100644 --- a/go/vt/vtgate/planbuilder/builder.go +++ b/go/vt/vtgate/planbuilder/builder.go @@ -336,6 +336,8 @@ func createInstructionFor(query string, stmt sqlparser.Statement, vschema Contex case *sqlparser.Begin, *sqlparser.Commit, *sqlparser.Rollback: // Empty by design. Not executed by a plan return nil, nil + case *sqlparser.Savepoint, *sqlparser.SRollback, *sqlparser.Release: + return nil, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: Savepoint construct %v", sqlparser.String(stmt)) } return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "BUG: unexpected statement type: %T", stmt) diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt index 354b04fe444..8943b38b889 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt @@ -419,3 +419,15 @@ # multiple select statement have inner order by with union "(select 1 from user order by 1 desc) union (select 1 from user order by 1 asc)" "unsupported: SELECT of UNION is non-trivial" + +# Savepoint +"savepoint a" +"unsupported: Savepoint construct savepoint a" + +# Savepoint rollback +"rollback work to savepoint a" +"unsupported: Savepoint construct rollback to a" + +# Savepoint release +"release savepoint a" +"unsupported: Savepoint construct release savepoint a" From 651ec7a710082943555b1657b6f2d701315e8bb0 Mon Sep 17 00:00:00 2001 From: deepthi Date: Tue, 23 Jun 2020 11:05:16 -0700 Subject: [PATCH 083/430] more dollar sign tests Signed-off-by: deepthi --- go/vt/sqlparser/parse_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index a0881c1de21..496a329857d 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -63,6 +63,8 @@ var ( input: "select a from t", }, { input: "select $ from t", + }, { + input: "select a.b as a$b from $test$", }, { input: "select 1 from t // aa\n", output: "select 1 from t", From 5aa470967506f7edcff1e1841b494377204d58cd Mon Sep 17 00:00:00 2001 From: akilan Date: Tue, 23 Jun 2020 22:36:18 +0400 Subject: [PATCH 084/430] Handled ineffectual errors Signed-off-by: akilan --- go/cmd/zkctld/zkctld.go | 7 +- go/mysql/fakesqldb/server.go | 13 ++- go/mysql/replication_constants.go | 93 +++++++++++-------- go/test/endtoend/keyspace/keyspace_test.go | 6 +- go/test/endtoend/vtgate/buffer/buffer_test.go | 41 ++++++-- go/vt/binlog/binlogplayer/framework_test.go | 8 +- go/vt/discovery/healthcheck.go | 12 ++- go/vt/discovery/healthcheck_test.go | 14 ++- go/vt/discovery/legacy_healthcheck.go | 6 +- .../legacy_healthcheck_flaky_test.go | 8 +- .../legacy_tablet_stats_cache_test.go | 10 +- go/vt/discovery/tablet_picker_test.go | 15 ++- .../max_replication_lag_module_test.go | 8 +- go/vt/throttler/memory_test.go | 42 +++++++-- go/vt/throttler/throttlerz.go | 15 ++- go/vt/topo/consultopo/server_flaky_test.go | 23 ++++- go/vt/topo/etcd2topo/lock.go | 5 +- go/vt/topo/etcd2topo/server_test.go | 12 ++- go/vt/topo/zk2topo/lock.go | 5 +- go/vt/vtgate/discoverygateway_test.go | 6 +- .../vtgate/endtoend/deletetest/delete_test.go | 7 +- sonar-project.properties | 4 +- tools/all_test_for_coverage.sh | 2 +- tools/statsd.go | 2 - 24 files changed, 271 insertions(+), 93 deletions(-) diff --git a/go/cmd/zkctld/zkctld.go b/go/cmd/zkctld/zkctld.go index 674a6b2d464..908b3d4b657 100644 --- a/go/cmd/zkctld/zkctld.go +++ b/go/cmd/zkctld/zkctld.go @@ -69,6 +69,11 @@ func main() { log.Infof("server shut down on its own") case <-sig: log.Infof("signal received, shutting down server") - zkd.Shutdown() + + // Action to perform if there is an error + if err := zkd.Shutdown(); err != nil { + log.Errorf("error during shutdown:%v", err) + exit.Return(1) + } } } diff --git a/go/mysql/fakesqldb/server.go b/go/mysql/fakesqldb/server.go index c7b6f570b56..74adde48b59 100644 --- a/go/mysql/fakesqldb/server.go +++ b/go/mysql/fakesqldb/server.go @@ -29,6 +29,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" @@ -347,7 +349,11 @@ func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.R // Check if we should close the connection and provoke errno 2013. if db.shouldClose { c.Close() - callback(&sqltypes.Result{}) + + //log error + if err := callback(&sqltypes.Result{}); err != nil { + log.Errorf("callback failed : %v", err) + } return nil } @@ -355,7 +361,10 @@ func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.R // may send this at connection time, and we don't want it to // interfere. if key == "set names utf8" { - callback(&sqltypes.Result{}) + //log error + if err := callback(&sqltypes.Result{}); err != nil { + log.Errorf("callback failed : %v", err) + } return nil } diff --git a/go/mysql/replication_constants.go b/go/mysql/replication_constants.go index 51b8643ab32..da0a4740744 100644 --- a/go/mysql/replication_constants.go +++ b/go/mysql/replication_constants.go @@ -152,42 +152,55 @@ const ( // These constants describe the event types. // See: http://dev.mysql.com/doc/internals/en/binlog-event-type.html const ( - eUnknownEvent = 0 - eStartEventV3 = 1 - eQueryEvent = 2 - eStopEvent = 3 - eRotateEvent = 4 - eIntVarEvent = 5 - eLoadEvent = 6 - eSlaveEvent = 7 - eCreateFileEvent = 8 - eAppendBlockEvent = 9 - eExecLoadEvent = 10 - eDeleteFileEvent = 11 - eNewLoadEvent = 12 - eRandEvent = 13 - eUserVarEvent = 14 + //eUnknownEvent = 0 + // Unused + //eStartEventV3 = 1 + eQueryEvent = 2 + //eStopEvent = 3 + eRotateEvent = 4 + eIntVarEvent = 5 + // Unused + //eLoadEvent = 6 + // Unused + //eSlaveEvent = 7 + // Unused + //eCreateFileEvent = 8 + // Unused + //eAppendBlockEvent = 9 + //eExecLoadEvent = 10 + // Unused + //eDeleteFileEvent = 11 + // Unused + //eNewLoadEvent = 12 + eRandEvent = 13 + // Unused + //eUserVarEvent = 14 eFormatDescriptionEvent = 15 eXIDEvent = 16 - eBeginLoadQueryEvent = 17 - eExecuteLoadQueryEvent = 18 - eTableMapEvent = 19 - eWriteRowsEventV0 = 20 - eUpdateRowsEventV0 = 21 - eDeleteRowsEventV0 = 22 - eWriteRowsEventV1 = 23 - eUpdateRowsEventV1 = 24 - eDeleteRowsEventV1 = 25 - eIncidentEvent = 26 - eHeartbeatEvent = 27 - eIgnorableEvent = 28 - eRowsQueryEvent = 29 - eWriteRowsEventV2 = 30 - eUpdateRowsEventV2 = 31 - eDeleteRowsEventV2 = 32 - eGTIDEvent = 33 - eAnonymousGTIDEvent = 34 - ePreviousGTIDsEvent = 35 + //Unused + //eBeginLoadQueryEvent = 17 + //Unused + //eExecuteLoadQueryEvent = 18 + eTableMapEvent = 19 + eWriteRowsEventV0 = 20 + eUpdateRowsEventV0 = 21 + eDeleteRowsEventV0 = 22 + eWriteRowsEventV1 = 23 + eUpdateRowsEventV1 = 24 + eDeleteRowsEventV1 = 25 + // Unused + //eIncidentEvent = 26 + //eHeartbeatEvent = 27 + // Unused + //eIgnorableEvent = 28 + // Unused + //eRowsQueryEvent = 29 + eWriteRowsEventV2 = 30 + eUpdateRowsEventV2 = 31 + eDeleteRowsEventV2 = 32 + eGTIDEvent = 33 + eAnonymousGTIDEvent = 34 + ePreviousGTIDsEvent = 35 // MySQL 5.7 events. Unused. //eTransactionContextEvent = 36 @@ -195,11 +208,13 @@ const ( //eXAPrepareLogEvent = 38 // MariaDB specific values. They start at 160. - eMariaAnnotateRowsEvent = 160 - eMariaBinlogCheckpointEvent = 161 - eMariaGTIDEvent = 162 - eMariaGTIDListEvent = 163 - eMariaStartEncryptionEvent = 164 + eMariaAnnotateRowsEvent = 160 + // Unused + //eMariaBinlogCheckpointEvent = 161 + eMariaGTIDEvent = 162 + eMariaGTIDListEvent = 163 + // Unused + //eMariaStartEncryptionEvent = 164 ) // These constants describe the type of status variables in q Query packet. diff --git a/go/test/endtoend/keyspace/keyspace_test.go b/go/test/endtoend/keyspace/keyspace_test.go index 0bcff99b6cb..53b4e9ea85e 100644 --- a/go/test/endtoend/keyspace/keyspace_test.go +++ b/go/test/endtoend/keyspace/keyspace_test.go @@ -60,7 +60,7 @@ var ( "column": "keyspace_id", "name": "hash_index" } - ] + ] } } }` @@ -246,7 +246,7 @@ func TestDeleteKeyspace(t *testing.T) { // TODO: Fix this test, not running in CI // tells that in zone2 after deleting shard, there is no shard #264 and in zone1 there is only 1 #269 -func RemoveKeyspaceCell(t *testing.T) { +/*func RemoveKeyspaceCell(t *testing.T) { _ = clusterForKSTest.VtctlclientProcess.ExecuteCommand("CreateKeyspace", "test_delete_keyspace_removekscell") _ = clusterForKSTest.VtctlclientProcess.ExecuteCommand("CreateShard", "test_delete_keyspace_removekscell/0") _ = clusterForKSTest.VtctlclientProcess.ExecuteCommand("CreateShard", "test_delete_keyspace_removekscell/1") @@ -314,7 +314,7 @@ func RemoveKeyspaceCell(t *testing.T) { // Clean up _ = clusterForKSTest.VtctlclientProcess.ExecuteCommand("DeleteKeyspace", "-recursive", "test_delete_keyspace_removekscell") -} +} */ func TestShardCountForAllKeyspaces(t *testing.T) { defer cluster.PanicHandler(t) diff --git a/go/test/endtoend/vtgate/buffer/buffer_test.go b/go/test/endtoend/vtgate/buffer/buffer_test.go index 8c895fe35eb..c632bdbec64 100644 --- a/go/test/endtoend/vtgate/buffer/buffer_test.go +++ b/go/test/endtoend/vtgate/buffer/buffer_test.go @@ -142,7 +142,10 @@ func updateExecute(c *threadParams, conn *mysql.Conn) error { attempt := c.i // Value used in next UPDATE query. Increased after every query. c.i++ - conn.ExecuteFetch("begin", 1000, true) + + if _, err := conn.ExecuteFetch("begin", 1000, true); err != nil { + log.Errorf("begin failed:%v", err) + } result, err := conn.ExecuteFetch(fmt.Sprintf("UPDATE buffer SET msg='update %d' WHERE id = %d", attempt, updateRowID), 1000, true) @@ -269,9 +272,11 @@ func testBufferBase(t *testing.T, isExternalParent bool) { externalReparenting(ctx, t, clusterInstance) } else { //reparent call - clusterInstance.VtctlclientProcess.ExecuteCommand("PlannedReparentShard", "-keyspace_shard", + if err := clusterInstance.VtctlclientProcess.ExecuteCommand("PlannedReparentShard", "-keyspace_shard", fmt.Sprintf("%s/%s", keyspaceUnshardedName, "0"), - "-new_master", clusterInstance.Keyspaces[0].Shards[0].Vttablets[1].Alias) + "-new_master", clusterInstance.Keyspaces[0].Shards[0].Vttablets[1].Alias); err != nil { + log.Errorf("clusterInstance.VtctlclientProcess.ExecuteCommand(\"PlannedRepare... caused an error : %v", err) + } } <-readThreadInstance.waitForNotification @@ -354,7 +359,12 @@ func externalReparenting(ctx context.Context, t *testing.T, clusterInstance *clu newMaster := replica master.VttabletProcess.QueryTablet(demoteMasterQuery, keyspaceUnshardedName, true) if master.VttabletProcess.EnableSemiSync { - master.VttabletProcess.QueryTablet(disableSemiSyncMasterQuery, keyspaceUnshardedName, true) + + //log error + if _, err := master.VttabletProcess.QueryTablet(disableSemiSyncMasterQuery, keyspaceUnshardedName, true); err != nil { + log.Errorf("master.VttabletProcess.QueryTablet(disableSemi... caused an error : %v", err) + } + } // Wait for replica to catch up to master. @@ -368,11 +378,16 @@ func externalReparenting(ctx context.Context, t *testing.T, clusterInstance *clu time.Sleep(time.Duration(w) * time.Second) } - // Promote replica to new master. - replica.VttabletProcess.QueryTablet(promoteSlaveQuery, keyspaceUnshardedName, true) + //Promote replica to new master and log error + if _, err := replica.VttabletProcess.QueryTablet(promoteSlaveQuery, keyspaceUnshardedName, true); err != nil { + log.Errorf("replica.VttabletProcess.QueryTablet(promoteSlaveQuery... caused an error : %v", err) + } if replica.VttabletProcess.EnableSemiSync { - replica.VttabletProcess.QueryTablet(enableSemiSyncMasterQuery, keyspaceUnshardedName, true) + //Log error + if _, err := replica.VttabletProcess.QueryTablet(enableSemiSyncMasterQuery, keyspaceUnshardedName, true); err != nil { + log.Errorf("replica.VttabletProcess.QueryTablet caused an error : %v", err) + } } // Configure old master to replicate from new master. @@ -382,8 +397,14 @@ func externalReparenting(ctx context.Context, t *testing.T, clusterInstance *clu // Use 'localhost' as hostname because Travis CI worker hostnames // are too long for MySQL replication. changeMasterCommands := fmt.Sprintf("RESET SLAVE;SET GLOBAL gtid_slave_pos = '%s';CHANGE MASTER TO MASTER_HOST='%s', MASTER_PORT=%d ,MASTER_USER='vt_repl', MASTER_USE_GTID = slave_pos;START SLAVE;", gtID, "localhost", newMaster.MySQLPort) - oldMaster.VttabletProcess.QueryTablet(changeMasterCommands, keyspaceUnshardedName, true) - // Notify the new vttablet master about the reparent. - clusterInstance.VtctlclientProcess.ExecuteCommand("TabletExternallyReparented", newMaster.Alias) + //Log error + if _, err := oldMaster.VttabletProcess.QueryTablet(changeMasterCommands, keyspaceUnshardedName, true); err != nil { + log.Errorf("oldMaster.VttabletProcess.QueryTablet caused an error : %v", err) + } + + //Notify the new vttablet master about the reparent and Log error + if err := clusterInstance.VtctlclientProcess.ExecuteCommand("TabletExternallyReparented", newMaster.Alias); err != nil { + log.Errorf("clusterInstance.VtctlclientProcess.ExecuteCommand caused an error : %v", err) + } } diff --git a/go/vt/binlog/binlogplayer/framework_test.go b/go/vt/binlog/binlogplayer/framework_test.go index 1db72bc27da..b733000012b 100644 --- a/go/vt/binlog/binlogplayer/framework_test.go +++ b/go/vt/binlog/binlogplayer/framework_test.go @@ -21,6 +21,8 @@ import ( "reflect" "testing" + "vitess.io/vitess/go/vt/log" + "github.com/golang/protobuf/proto" "golang.org/x/net/context" @@ -116,5 +118,9 @@ var globalFBC *fakeBinlogClient func init() { RegisterClientFactory("test", func() Client { return globalFBC }) - flag.Set("binlog_player_protocol", "test") + + //log error + if err := flag.Set("binlog_player_protocol", "test"); err != nil { + log.Errorf("failed to set flag \"binlog_player_protocol\" to \"test\":%v", err) + } } diff --git a/go/vt/discovery/healthcheck.go b/go/vt/discovery/healthcheck.go index 504a367f9d0..1f9e08df99f 100644 --- a/go/vt/discovery/healthcheck.go +++ b/go/vt/discovery/healthcheck.go @@ -715,13 +715,21 @@ func (hc *HealthCheckImpl) ServeHTTP(w http.ResponseWriter, _ *http.Request) { status := hc.CacheStatus() b, err := json.MarshalIndent(status, "", " ") if err != nil { - w.Write([]byte(err.Error())) + //Error logged + if _, err := w.Write([]byte(err.Error())); err != nil { + log.Errorf("write to buffer error failed: %v", err) + } + return } buf := bytes.NewBuffer(nil) json.HTMLEscape(buf, b) - w.Write(buf.Bytes()) + + //Error logged + if _, err := w.Write(buf.Bytes()); err != nil { + log.Errorf("write to buffer bytes failed: %v", err) + } } // servingConnStats returns the number of serving tablets per keyspace/shard/tablet type. diff --git a/go/vt/discovery/healthcheck_test.go b/go/vt/discovery/healthcheck_test.go index 79497b2d80b..71f890254b6 100644 --- a/go/vt/discovery/healthcheck_test.go +++ b/go/vt/discovery/healthcheck_test.go @@ -27,6 +27,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/vttablet/queryservice/fakes" @@ -48,7 +50,11 @@ import ( func init() { tabletconn.RegisterDialer("fake_gateway", tabletDialer) - flag.Set("tablet_protocol", "fake_gateway") + + //log error + if err := flag.Set("tablet_protocol", "fake_gateway"); err != nil { + log.Errorf("failed to set flag \"tablet_protocol\" to \"fake_gateway\":%v", err) + } } func TestHealthCheck(t *testing.T) { @@ -730,7 +736,11 @@ func TestTemplate(t *testing.T) { } func TestDebugURLFormatting(t *testing.T) { - flag.Set("tablet_url_template", "https://{{.GetHostNameLevel 0}}.bastion.{{.Tablet.Alias.Cell}}.corp") + + //log error + if err2 := flag.Set("tablet_url_template", "https://{{.GetHostNameLevel 0}}.bastion.{{.Tablet.Alias.Cell}}.corp"); err2 != nil { + log.Errorf("flag.Set(\"tablet_url_template\", \"https://{{.GetHostNameLevel 0}}.bastion.{{.Tablet.Alias.Cell}}.corp\") failed : %v", err2) + } ParseTabletURLTemplateFromFlag() tablet := topo.NewTablet(0, "cell", "host.dc.domain") diff --git a/go/vt/discovery/legacy_healthcheck.go b/go/vt/discovery/legacy_healthcheck.go index 69522fd8555..736cb3a2f9f 100644 --- a/go/vt/discovery/legacy_healthcheck.go +++ b/go/vt/discovery/legacy_healthcheck.go @@ -222,7 +222,11 @@ func (e LegacyTabletStats) NamedStatusURL() string { // {{.NamedStatusURL}} -> test-0000000001/debug/status func (e LegacyTabletStats) getTabletDebugURL() string { var buffer bytes.Buffer - tabletURLTemplate.Execute(&buffer, e) + + //Error logged + if err := tabletURLTemplate.Execute(&buffer, e); err != nil { + log.Errorf("tabletURLTemplate.Execute(&buffer, e) failed: %v", err) + } return buffer.String() } diff --git a/go/vt/discovery/legacy_healthcheck_flaky_test.go b/go/vt/discovery/legacy_healthcheck_flaky_test.go index 8d28ad60abd..7f4beebef80 100644 --- a/go/vt/discovery/legacy_healthcheck_flaky_test.go +++ b/go/vt/discovery/legacy_healthcheck_flaky_test.go @@ -26,6 +26,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "golang.org/x/net/context" "vitess.io/vitess/go/vt/grpcclient" "vitess.io/vitess/go/vt/status" @@ -42,7 +44,11 @@ var connMap map[string]*fakeConn func init() { tabletconn.RegisterDialer("fake_discovery", discoveryDialer) - flag.Set("tablet_protocol", "fake_discovery") + + //log error + if err := flag.Set("tablet_protocol", "fake_discovery"); err != nil { + log.Errorf("flag.Set(\"tablet_protocol\", \"fake_discovery\") failed : %v", err) + } connMap = make(map[string]*fakeConn) } diff --git a/go/vt/discovery/legacy_tablet_stats_cache_test.go b/go/vt/discovery/legacy_tablet_stats_cache_test.go index 4a50109cafe..60cc2a5a695 100644 --- a/go/vt/discovery/legacy_tablet_stats_cache_test.go +++ b/go/vt/discovery/legacy_tablet_stats_cache_test.go @@ -20,6 +20,8 @@ import ( "context" "testing" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" @@ -35,7 +37,9 @@ func TestLegacyTabletStatsCache(t *testing.T) { Cells: []string{"cell", "cell1"}, } - ts.CreateCellsAlias(context.Background(), "region1", cellsAlias) + if err := ts.CreateCellsAlias(context.Background(), "region1", cellsAlias); err != nil { + log.Errorf("creating cellsAlias \"region1\" failed: %v", err) + } defer ts.DeleteCellsAlias(context.Background(), "region1") @@ -43,7 +47,9 @@ func TestLegacyTabletStatsCache(t *testing.T) { Cells: []string{"cell2"}, } - ts.CreateCellsAlias(context.Background(), "region2", cellsAlias) + if err := ts.CreateCellsAlias(context.Background(), "region2", cellsAlias); err != nil { + log.Errorf("creating cellsAlias \"region2\" failed: %v", err) + } defer ts.DeleteCellsAlias(context.Background(), "region2") diff --git a/go/vt/discovery/tablet_picker_test.go b/go/vt/discovery/tablet_picker_test.go index dcbd84e649d..5ff24df64c7 100644 --- a/go/vt/discovery/tablet_picker_test.go +++ b/go/vt/discovery/tablet_picker_test.go @@ -20,6 +20,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -169,7 +171,14 @@ func addTablet(te *pickerTestEnv, id int, tabletType topodatapb.TabletType, serv } func deleteTablet(te *pickerTestEnv, tablet *topodatapb.Tablet) { - te.topoServ.DeleteTablet(context.Background(), tablet.Alias) - // This is not automatically removed from shard replication, which results in log spam. - topo.DeleteTabletReplicationData(context.Background(), te.topoServ, tablet) + + //log error + if err := te.topoServ.DeleteTablet(context.Background(), tablet.Alias); err != nil { + log.Errorf("failed to DeleteTablet with alias : %v", err) + } + + //This is not automatically removed from shard replication, which results in log spam and log error + if err := topo.DeleteTabletReplicationData(context.Background(), te.topoServ, tablet); err != nil { + log.Errorf("failed to automatically remove from shard replication: %v", err) + } } diff --git a/go/vt/throttler/max_replication_lag_module_test.go b/go/vt/throttler/max_replication_lag_module_test.go index 812cde0a0ad..e1514722542 100644 --- a/go/vt/throttler/max_replication_lag_module_test.go +++ b/go/vt/throttler/max_replication_lag_module_test.go @@ -22,6 +22,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/discovery" querypb "vitess.io/vitess/go/vt/proto/query" @@ -451,8 +453,10 @@ func TestMaxReplicationLagModule_Increase_BadRateUpperBound(t *testing.T) { t.Fatal(err) } - // Assume that a bad value of 150 was set @ 30s. - tf.m.memory.markBad(150, sinceZero(30*time.Second)) + //Assume that a bad value of 150 was set @ 30s and log error + if err := tf.m.memory.markBad(150, sinceZero(30*time.Second)); err != nil { + log.Errorf("tf.m.memory.markBad(150, sinceZero(30*time.Second)) falied : %v", err) + } // r2 @ 70s, 0s lag tf.ratesHistory.add(sinceZero(69*time.Second), 100) diff --git a/go/vt/throttler/memory_test.go b/go/vt/throttler/memory_test.go index cb5cba582a2..899e175672a 100644 --- a/go/vt/throttler/memory_test.go +++ b/go/vt/throttler/memory_test.go @@ -19,21 +19,37 @@ package throttler import ( "testing" "time" + + "vitess.io/vitess/go/vt/log" ) func TestMemory(t *testing.T) { m := newMemory(5, 1*time.Second, 0.10) + // Add several good rates. - m.markGood(201) + if err := m.markGood(201); err != nil { + log.Errorf("m.markGood(201) failed :%v ", err) + } + want200 := int64(200) if got := m.highestGood(); got != want200 { t.Fatalf("memory with one good entry: got = %v, want = %v", got, want200) } - m.markGood(101) + + //log error + if err := m.markGood(101); err != nil { + log.Errorf("m.markGood(101) failed :%v ", err) + } + if got := m.highestGood(); got != want200 { t.Fatalf("wrong order within memory: got = %v, want = %v", got, want200) } - m.markGood(301) + + //log error + if err := m.markGood(301); err != nil { + log.Errorf(" m.markGood(301) failed :%v ", err) + } + want300 := int64(300) if got := m.highestGood(); got != want300 { t.Fatalf("wrong order within memory: got = %v, want = %v", got, want300) @@ -48,7 +64,12 @@ func TestMemory(t *testing.T) { if got := m.lowestBad(); got != 0 { t.Fatalf("lowestBad should return zero value when no bad rate is recorded yet: got = %v", got) } - m.markBad(300, sinceZero(0)) + + //log error + if err := m.markBad(300, sinceZero(0)); err != nil { + log.Errorf(" m.markBad(300, sinceZero(0)) failed :%v ", err) + } + if got, want := m.lowestBad(), want300; got != want { t.Fatalf("bad rate was not recorded: got = %v, want = %v", got, want) } @@ -56,7 +77,11 @@ func TestMemory(t *testing.T) { t.Fatalf("new lower bad rate did not invalidate previous good rates: got = %v, want = %v", got, want200) } - m.markBad(311, sinceZero(0)) + //log error + if err := m.markBad(311, sinceZero(0)); err != nil { + log.Errorf(" m.markBad(311, sinceZero(0)) failed :%v ", err) + } + if got := m.lowestBad(); got != want300 { t.Fatalf("bad rates higher than the current one should be ignored: got = %v, want = %v", got, want300) } @@ -73,7 +98,12 @@ func TestMemory(t *testing.T) { } // 199 will be rounded up to 200. - m.markBad(199, sinceZero(0)) + err := m.markBad(199, sinceZero(0)) + + if err != nil { + t.Fatalf(" m.markBad(199, sinceZero(0)) failed :%v ", err) + } + if got := m.lowestBad(); got != want200 { t.Fatalf("bad rate was not updated: got = %v, want = %v", got, want200) } diff --git a/go/vt/throttler/throttlerz.go b/go/vt/throttler/throttlerz.go index 9e3dbf544ed..1793a9c33d4 100644 --- a/go/vt/throttler/throttlerz.go +++ b/go/vt/throttler/throttlerz.go @@ -21,6 +21,8 @@ import ( "html/template" "net/http" "strings" + + "vitess.io/vitess/go/vt/log" ) const listHTML = ` @@ -73,11 +75,18 @@ func throttlerzHandler(w http.ResponseWriter, r *http.Request, m *managerImpl) { func listThrottlers(w http.ResponseWriter, m *managerImpl) { throttlers := m.Throttlers() - listTemplate.Execute(w, map[string]interface{}{ + + // Log error + if err := listTemplate.Execute(w, map[string]interface{}{ "Throttlers": throttlers, - }) + }); err != nil { + log.Errorf("listThrottlers failed :%v", err) + } } func showThrottlerDetails(w http.ResponseWriter, name string) { - detailsTemplate.Execute(w, name) + // Log error + if err := detailsTemplate.Execute(w, name); err != nil { + log.Errorf("showThrottlerDetails failed :%v", err) + } } diff --git a/go/vt/topo/consultopo/server_flaky_test.go b/go/vt/topo/consultopo/server_flaky_test.go index ab641309ac9..f926782f4d6 100644 --- a/go/vt/topo/consultopo/server_flaky_test.go +++ b/go/vt/topo/consultopo/server_flaky_test.go @@ -26,6 +26,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "github.com/hashicorp/consul/api" "golang.org/x/net/context" "vitess.io/vitess/go/testfiles" @@ -129,8 +131,15 @@ func TestConsulTopo(t *testing.T) { // Start a single consul in the background. cmd, configFilename, serverAddr := startConsul(t, "") defer func() { - cmd.Process.Kill() - cmd.Wait() + // Alerts command did not run successful + if err := cmd.Process.Kill(); err != nil { + log.Errorf("cmd process kill has an error: %v", err) + } + // Alerts command did not run successful + if err := cmd.Wait(); err != nil { + log.Errorf("cmd wait has an error: %v", err) + } + os.Remove(configFilename) }() @@ -166,8 +175,14 @@ func TestConsulTopoWithAuth(t *testing.T) { // Start a single consul in the background. cmd, configFilename, serverAddr := startConsul(t, "123456") defer func() { - cmd.Process.Kill() - cmd.Wait() + // Alerts command did not run successful + if err := cmd.Process.Kill(); err != nil { + log.Errorf("cmd process kill has an error: %v", err) + } + // Alerts command did not run successful + if err := cmd.Wait(); err != nil { + log.Errorf("cmd process wait has an error: %v", err) + } os.Remove(configFilename) }() diff --git a/go/vt/topo/etcd2topo/lock.go b/go/vt/topo/etcd2topo/lock.go index 9827a6af4e3..2ec54a1891c 100644 --- a/go/vt/topo/etcd2topo/lock.go +++ b/go/vt/topo/etcd2topo/lock.go @@ -56,7 +56,10 @@ func (s *Server) newUniqueEphemeralKV(ctx context.Context, cli *clientv3.Client, // succeeded or not. In any case, let's try to // delete the node, so we don't leave an orphan // node behind for *leaseTTL time. - cli.Delete(context.Background(), newKey) + + if _, err := cli.Delete(context.Background(), newKey); err != nil { + log.Errorf("cli.Delete(context.Background(), newKey) failed :%v", err) + } } return "", 0, convertError(err, newKey) } diff --git a/go/vt/topo/etcd2topo/server_test.go b/go/vt/topo/etcd2topo/server_test.go index ffe72c4b13f..076b0b92e62 100644 --- a/go/vt/topo/etcd2topo/server_test.go +++ b/go/vt/topo/etcd2topo/server_test.go @@ -25,6 +25,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/tlstest" "github.com/coreos/etcd/pkg/transport" @@ -181,8 +183,14 @@ func startEtcdWithTLS(t *testing.T) (string, *tlstest.ClientServerKeyPairs, func } stopEtcd := func() { - cmd.Process.Kill() - cmd.Wait() + // log error + if err := cmd.Process.Kill(); err != nil { + log.Errorf("cmd.Process.Kill() failed : %v", err) + } + // log error + if err := cmd.Wait(); err != nil { + log.Errorf("cmd.wait() failed : %v", err) + } os.RemoveAll(dataDir) } diff --git a/go/vt/topo/zk2topo/lock.go b/go/vt/topo/zk2topo/lock.go index 6f4138f2a14..fdd8da40ceb 100644 --- a/go/vt/topo/zk2topo/lock.go +++ b/go/vt/topo/zk2topo/lock.go @@ -61,7 +61,10 @@ func (zs *Server) Lock(ctx context.Context, dirPath, contents string) (topo.Lock // Regardless of the reason, try to cleanup. log.Warningf("Failed to obtain action lock: %v", err) - zs.conn.Delete(ctx, nodePath, -1) + + if err := zs.conn.Delete(ctx, nodePath, -1); err != nil { + log.Warningf("Failed to close connection :%v", err) + } // Show the other locks in the directory dir := path.Dir(nodePath) diff --git a/go/vt/vtgate/discoverygateway_test.go b/go/vt/vtgate/discoverygateway_test.go index d2fc547f293..678e580350f 100644 --- a/go/vt/vtgate/discoverygateway_test.go +++ b/go/vt/vtgate/discoverygateway_test.go @@ -21,6 +21,8 @@ import ( "strings" "testing" + "vitess.io/vitess/go/vt/log" + "golang.org/x/net/context" "vitess.io/vitess/go/sqltypes" @@ -247,7 +249,9 @@ func TestDiscoveryGatewayGetTabletsWithRegion(t *testing.T) { dg := NewDiscoveryGateway(context.Background(), hc, srvTopo, "local", 2) - ts.CreateCellsAlias(context.Background(), "local", cellsAlias) + if err := ts.CreateCellsAlias(context.Background(), "local", cellsAlias); err != nil { + log.Errorf("ts.CreateCellsAlias(context.Background()... %v", err) + } defer ts.DeleteCellsAlias(context.Background(), "local") diff --git a/go/vt/vtgate/endtoend/deletetest/delete_test.go b/go/vt/vtgate/endtoend/deletetest/delete_test.go index 2263ca62723..82c9c359c5b 100644 --- a/go/vt/vtgate/endtoend/deletetest/delete_test.go +++ b/go/vt/vtgate/endtoend/deletetest/delete_test.go @@ -23,6 +23,8 @@ import ( "os" "testing" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" vschemapb "vitess.io/vitess/go/vt/proto/vschema" @@ -140,7 +142,10 @@ func TestMain(m *testing.M) { } if err := cluster.Setup(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) - cluster.TearDown() + //log error + if err := cluster.TearDown(); err != nil { + log.Errorf("cluster.TearDown() did not work: ", err) + } return 1 } defer cluster.TearDown() diff --git a/sonar-project.properties b/sonar-project.properties index 7ae2bcf9864..83cda29a829 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,8 +5,8 @@ sonar.exclusions=**/*_test.go,**/vendor/**,**/java/**,go/test/endtoend/**,**/*.p sonar.tests=. sonar.test.inclusions=**/*_test.go sonar.test.exclusions=**/vendor/** - - +## Path of coverage report +sonar.go.coverage.reportPaths=/tmp/*.out # Change the host.url to point to the # sonarqube server (default localhost) sonar.host.url=http://localhost:9000 diff --git a/tools/all_test_for_coverage.sh b/tools/all_test_for_coverage.sh index e01298f185b..07fff9f40cb 100755 --- a/tools/all_test_for_coverage.sh +++ b/tools/all_test_for_coverage.sh @@ -31,7 +31,7 @@ all_except_endtoend_tests=$(echo "$packages_with_all_tests" | grep -v "endtoend" counter=0 for pkg in $all_except_endtoend_tests do - go test -coverpkg=vitess.io/vitess/go/... -coverprofile "/tmp/unit_$counter.out" $pkg -v -p=1 || : + go test -coverpkg=vitess.io/vitess/go/... -coverprofile "/tmp/unit_$counter.out" -json > "/tmp/unit_$counter.json" $pkg -v -p=1 || : counter=$((counter+1)) done diff --git a/tools/statsd.go b/tools/statsd.go index f2ccd91e69b..3699d7ba864 100644 --- a/tools/statsd.go +++ b/tools/statsd.go @@ -82,8 +82,6 @@ type Stats struct { type TestStats struct { Pass, Fail, Flake int PassTime time.Duration - - name string } func testPassed(name string, passTime time.Duration) { From 4aff6a85f9f1258c0147ff5add1f1b1b8f0b010c Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Wed, 24 Jun 2020 13:35:21 +0200 Subject: [PATCH 085/430] go mod tidy Signed-off-by: Andres Taylor --- go.mod | 11 ++- go.sum | 212 ++------------------------------------------------------- 2 files changed, 12 insertions(+), 211 deletions(-) diff --git a/go.mod b/go.mod index 40bfe74b68b..0fda1348b06 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.13 require ( cloud.google.com/go v0.45.1 github.com/Azure/azure-storage-blob-go v0.8.0 + github.com/Azure/go-autorest/autorest v0.10.0 // indirect github.com/GeertJohan/go.rice v1.0.0 github.com/PuerkitoBio/goquery v1.5.1 github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 // indirect @@ -30,12 +31,13 @@ require ( github.com/gorilla/websocket v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/hashicorp/consul v1.8.0 github.com/hashicorp/consul/api v1.5.0 + github.com/hashicorp/go-immutable-radix v1.1.0 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go.net v0.0.1 // indirect + github.com/hashicorp/go-sockaddr v1.0.2 // indirect + github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.3 // indirect + github.com/hashicorp/serf v0.9.2 // indirect github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 github.com/imdario/mergo v0.3.6 // indirect github.com/klauspost/compress v1.4.1 // indirect @@ -44,8 +46,10 @@ require ( github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/krishicks/yaml-patch v0.0.10 github.com/magiconair/properties v1.8.1 + github.com/mattn/go-runewidth v0.0.3 // indirect github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 github.com/mitchellh/go-testing-interface v1.14.0 // indirect + github.com/mitchellh/mapstructure v1.2.3 // indirect github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 github.com/onsi/ginkgo v1.10.3 // indirect github.com/onsi/gomega v1.7.1 // indirect @@ -57,6 +61,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/prometheus/client_golang v1.4.1 github.com/prometheus/common v0.9.1 + github.com/satori/go.uuid v1.2.0 // indirect github.com/smartystreets/goconvey v1.6.4 // indirect github.com/stretchr/testify v1.4.0 github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b diff --git a/go.sum b/go.sum index de6461f113b..388c27fd24b 100644 --- a/go.sum +++ b/go.sum @@ -10,26 +10,16 @@ cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbf cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-sdk-for-go v40.3.0+incompatible h1:NthZg3psrLxvQLN6rVm07pZ9mv2wvGNaBNGQ3fnPvLE= -github.com/Azure/azure-sdk-for-go v40.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.8.0 h1:53qhf0Oxa0nOjgbDeeYPUeyiNmafAFEY95rZLK0Tj6o= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1 h1:pZdL8o72rK+avFWl+p9nE8RWi1JInZrWJYlnpfXJwHk= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= @@ -37,10 +27,6 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= @@ -60,12 +46,7 @@ github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtix github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= -github.com/Microsoft/go-winio v0.4.3 h1:M3NHMuPgMSUPdE5epwNUHlRPSVzHs8HpRTrVXhR0myo= -github.com/Microsoft/go-winio v0.4.3/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.0.1 h1:iLrQrdwjDd52kHDA5op2UBJFjmOb9g+7scBan4RN8F0= -github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -73,9 +54,6 @@ github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= @@ -101,7 +79,6 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.28.8 h1:kPGnElMdW0GDc54Giy1lcE/3gAr2Gzl6cMjYKoBNFhw= github.com/aws/aws-sdk-go v1.28.8/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= @@ -114,12 +91,8 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v0.0.0-20200322175846-f7e751efca13 h1:+qUNY4VRkEH46bLUwxCyUU+iOGJMQBVibAaYzWiwWcg= github.com/buger/jsonparser v0.0.0-20200322175846-f7e751efca13/go.mod h1:tgcrVJ81GPSF0mz+0nu1Xaz0fazGPrmmJfJtxjbHhUQ= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= @@ -127,13 +100,10 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= -github.com/coredns/coredns v1.1.2 h1:bAFHrSsBeTeRG5W3Nf2su3lUGw7Npw2UKeCJm/3A638= -github.com/coredns/coredns v1.1.2/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= @@ -162,34 +132,17 @@ github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 h1:lrWnAyy/F72MbxIxFUzKmcMCdt9Oi8RzpAxzTNQHD7o= -github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.1.1/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= -github.com/digitalocean/godo v1.10.0 h1:uW1/FcvZE/hoixnJcnlmIUvTVNdZCLjRLzmDtRi1xXY= -github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= -github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.3.0 h1:3lOnM9cSzgGwx8VfK/NGOW5fLQ0GjIlCkaktF+n1M6o= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0 h1:ZoRgc53qJCfSLimXqJDrmBhnt5GChDsExMCK7t48o0Y= -github.com/elazarl/go-bindata-assetfs v0.0.0-20160803192304-e1a2a7ec64b0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.8.0 h1:uE6Fp4fOcAJdc1wTQXLJ+SYistkbG1dNoi6Zs1+Ybvk= -github.com/envoyproxy/go-control-plane v0.8.0/go.mod h1:GSSbY9P1neVhdY7G4wu+IK1rk/dqhiCC/4ExuWJZVuk= -github.com/envoyproxy/protoc-gen-validate v0.0.14 h1:YBW6/cKy9prEGRYLnaGa4IDhzxZhRCtKsax8srGKDnM= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -197,7 +150,6 @@ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -207,12 +159,9 @@ github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -259,10 +208,6 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gogo/googleapis v1.1.0 h1:kFkMAZBNAn4j7K0GiZr8cRYzejq68VbheufiV3YuyFI= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -272,7 +217,6 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -284,8 +228,6 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -298,7 +240,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github/v27 v27.0.4/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= -github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -309,7 +250,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= @@ -329,48 +269,29 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul v1.4.5 h1:ubKneQZvooWl/UkkIdx/Rhr/YKOo4OYL3qDAAfkU1Mw= -github.com/hashicorp/consul v1.4.5/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= -github.com/hashicorp/consul v1.8.0 h1:yRKMKZyPLqUxl37t4nFt5OuGmTXoFhTJrakhfnYKCYA= -github.com/hashicorp/consul v1.8.0/go.mod h1:Gg9/UgAQ9rdY3CTvzQZ6g2jcIb7NlIfjI+0pvLk5D1A= github.com/hashicorp/consul/api v1.5.0 h1:Yo2bneoGy68A7aNwmuETFnPhjyBEm7n3vzRacEVMjvI= github.com/hashicorp/consul/api v1.5.0/go.mod h1:LqwrLNW876eYSuUOo4ZLHBcdKc038txr/IMfbLPATa4= github.com/hashicorp/consul/sdk v0.5.0 h1:WC4594Wp/LkEeML/OdQKEC1yqBmEYkRp6i7X5u0zDAs= github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.2 h1:ijMXI4qERbzxbCnkxmfUtwMyjrrk3y+Vt0MxojNCbBs= -github.com/hashicorp/go-bexpr v0.1.2/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= -github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de h1:XDCSythtg8aWSRSO29uwhgh7b127fWr+m5SemqjSUL8= -github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-connlimit v0.2.0 h1:OZjcfNxH/hPh/bT2Iw5yOJcLzz+zuIWpsp3I1S4Pjw4= -github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= -github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088 h1:jBvElOilnIl6mm8S6gva/dfeTJCcMs9TGO6/2C6k52E= -github.com/hashicorp/go-discover v0.0.0-20200501174627-ad1e96bde088/go.mod h1:vZu6Opqf49xX5lsFAu7iFNewkcVF1sn/wyapZh5ytlg= -github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= -github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.0.3 h1:iiqzNk8jKB6/sLRj623Ui/Vi1zf21LOUpgzGjTge6a8= -github.com/hashicorp/go-memdb v1.0.3/go.mod h1:LWQ8R70vPrS4OEY9k28D2z8/Zzyu34NVzeRibGAzHO0= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -378,13 +299,7 @@ github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uP github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= -github.com/hashicorp/go-raftchunking v0.6.1 h1:moEnaG3gcwsWNyIBJoD5PCByE+Ewkqxh6N05CT+MbwA= -github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.5.4 h1:1BZvpawXoJCWX6pNtow9+rpEj+3itIlutiqnntI6jOE= -github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= @@ -398,49 +313,21 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5 h1:uk280DXEbQiCOZgCOI3elFSeNxf8YIZiNsbr2pQLYD0= -github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dPtaePb16oW4qIyzkMxXOL38xjRN64adsts= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1 h1:XFSOubp8KWB+Jd2PDyaX5xUd5bhSP/+pTDZVDMzZJM8= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.4 h1:gkyML/r71w3FL8gUi74Vk76avkj/9lYAY9lvg0OcoGs= -github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69 h1:lc3c72qGlIMDqQpQH82Y4vaglRMMFdJbziYWriR4UcE= -github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= -github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft v1.1.2 h1:oxEL5DDeurYxLd3UbcY/hccgSPhLLpiBZ1YxtWEq59c= -github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4= -github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= -github.com/hashicorp/serf v0.8.5 h1:ZynDUIQiA8usmRgPdGPHFdPnb1wgGI9tK3mO9hcAJjc= -github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/vault/api v1.0.4 h1:j08Or/wryXT4AcHj1oCbMd7IijXcKzYUGw59LGu9onU= -github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/sdk v0.1.13 h1:mOEPeOhT7jl0J4AMl1E705+BcmeRs1VmKNb9F0sMLy8= -github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= -github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw= -github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 h1:Mo9W14pwbO9VfRe+ygqZ8dFbPpoIK1HFrG/zjTuQ+nc= @@ -450,18 +337,12 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= -github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f h1:ENpDacvnr8faw5ugQmEF1QYk+f/Y9lXFvuYmRxykago= -github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -491,6 +372,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -498,9 +380,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/krishicks/yaml-patch v0.0.10 h1:H4FcHpnNwVmw8u0MjPRjWyIXtco6zM2F78t+57oNM3E= github.com/krishicks/yaml-patch v0.0.10/go.mod h1:Sm5TchwZS6sm7RJoyg87tzxm2ZcKzdRE4Q7TjNhPrME= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= -github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= @@ -526,6 +405,7 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -538,27 +418,17 @@ github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1/go.mod h1:vuvdOZLJu github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.0 h1:/x0XQ6h+3U3nAyk1yx+bHPURrKa9sVVvYbuqZ7pIAtI= github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452 h1:hOY53G+kBFhbYFpRVxHl5eS7laP6B1+Cq+Z9Dry1iMU= -github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.3 h1:f/MjBEBDLttYCGfRaKBbKSRVF5aV2O6fnBpzknuE3jU= github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.0.0 h1:ATSdz4NWrmWPOF1CeCBU4sMCno2hgqdbSrRPFWQSVZI= -github.com/mitchellh/pointerstructure v1.0.0/go.mod h1:k4XwG94++jLVsSiTxo7qdIfXA9pj9EAeo0QsNNJOLZ8= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -571,23 +441,18 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= -github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s= -github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6jJVXYjt8IE48G2eWl6BjwU5Gj0gqY84fy78= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 h1:Mm4XQCBICntJzH8fKglsRuEiFUJYnTnM4BBFvpP5BWs= github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -595,13 +460,9 @@ github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 h1:0R5 github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c h1:vwpFWvAO8DeIZfFeqASzZfsxuWPno9ncAebBEP0N3uE= -github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= @@ -609,8 +470,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pires/go-proxyproto v0.0.0-20191211124218-517ecdf5bb2b h1:JPLdtNmpXbWytipbGwYz7zXZzlQNASEiFw5aGAM75us= github.com/pires/go-proxyproto v0.0.0-20191211124218-517ecdf5bb2b/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -623,12 +482,9 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.1 h1:FFSuS004yOQEtDdTq+TAOLP5xUq63KqAFYyOi8zA+Y8= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -637,49 +493,29 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1: github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rboyer/safeio v0.2.1 h1:05xhhdRNAdS3apYm7JRjOqngf4xruaW959jmRxGDuSU= -github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 h1:Wdi9nwnhFNAlseAOekn6B5G/+GMtks9UKbvRU/CMM/o= -github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb h1:1r/p6yT1FfHR1+qBm7UYBPgfqCmzz/8mpNvfc+iKlfU= -github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/conswriter v0.0.0-20180208195008-f5ae3917a627/go.mod h1:7zjs06qF79/FKAJpBvFx3P8Ww4UTIMAe+lpNXDHziac= -github.com/sean-/pager v0.0.0-20180208200047-666be9bf53b5/go.mod h1:BeybITEsBEg6qbIiqJ6/Bqeq25bCLbL7YFmpaFfJDuM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880 h1:1Ge4j/3uB2rxzPWD3TC+daeCw+w91z8UCUL/7WH5gn8= -github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -690,14 +526,10 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpke github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d h1:bVQRCxQvfjNUeRqaY/uT0tFuvuFY0ulgnczuR684Xic= -github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= @@ -713,7 +545,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -728,9 +559,6 @@ github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b h1:i3lm+BZX5fAaH github.com/tchap/go-patricia v0.0.0-20160729071656-dd168db6051b/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tebeka/selenium v0.9.9 h1:cNziB+etNgyH/7KlNI7RMC1ua5aH1+5wUlFQyzeMh+w= github.com/tebeka/selenium v0.9.9/go.mod h1:5Fr8+pUvU6B1OiPfkdCKdXZyr5znvVkxuPd0NOdZCQc= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible h1:8uRvJleFpqLsO77WaAh2UrasMOzd8MxXrNj20e7El+Q= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.83+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= -github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.1.1 h1:TnCZ3FIuKeaIy+F45+Cnp+caqdXGy4z74HvwXN+570Y= github.com/tinylib/msgp v1.1.1/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -745,7 +573,6 @@ github.com/uber/jaeger-client-go v2.16.0+incompatible h1:Q2Pp6v3QYiocMxomCaJuwQG github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible h1:iMSCV0rmXEogjNWPh2D0xk9YVKvrtGoHJNe9ebLu/pw= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -757,14 +584,11 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo= -github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/z-division/go-zookeeper v0.0.0-20190128072838-6d7457066b9b h1:Itr7GbuXoM1PK/eCeNNia4Qd3ib9IgX9g9SpXgo8BwQ= github.com/z-division/go-zookeeper v0.0.0-20190128072838-6d7457066b9b/go.mod h1:JNALoWa+nCXR8SmgLluHcBNVJgyejzpKPZk9pX2yXXE= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -832,7 +656,6 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -865,24 +688,18 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -897,7 +714,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -946,16 +762,13 @@ google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEn google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190626174449-989357319d63/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -963,21 +776,15 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2El google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190926190326-7ee9db18f195 h1:dWzgMaXfaHsnkRKZ1l3iJLDmTEB40JMl/dqRbJX4D/o= google.golang.org/genproto v0.0.0-20190926190326-7ee9db18f195/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= gopkg.in/DataDog/dd-trace-go.v1 v1.17.0 h1:j9vAp9Re9bbtA/QFehkJpNba/6W2IbJtNuXZophCa54= gopkg.in/DataDog/dd-trace-go.v1 v1.17.0/go.mod h1:DVp8HmDh8PuTu2Z0fVVlBsyWaC++fzwVCaGWylTe3tg= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= @@ -990,7 +797,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.41.0 h1:Ka3ViY6gNYSKiVy71zXBEqKplnV35ImDLVG+8uoIklE= @@ -1003,9 +809,6 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24 gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1027,17 +830,13 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069z honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -istio.io/gogo-genproto v0.0.0-20190124151557-6d926a6e6feb/go.mod h1:eIDJ6jNk/IeJz6ODSksHl5Aiczy5JUq6vFhJWI5OtiI= -k8s.io/api v0.16.9/go.mod h1:Y7dZNHs1Xy0mSwSlzL9QShi6qkljnN41yR8oWCRTDe8= k8s.io/api v0.17.3 h1:XAm3PZp3wnEdzekNkcmj/9Y1zdmQYJ1I4GKSBBZ8aG0= k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= k8s.io/apiextensions-apiserver v0.17.3 h1:WDZWkPcbgvchEdDd7ysL21GGPx3UKZQLDZXEkevT6n4= k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= -k8s.io/apimachinery v0.16.9/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE= k8s.io/apimachinery v0.17.3 h1:f+uZV6rm4/tHE7xXgLyToprg6xWairaClGVkm2t8omg= k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= -k8s.io/client-go v0.16.9/go.mod h1:ThjPlh7Kx+XoBFOCt775vx5J7atwY7F/zaFzTco5gL0= k8s.io/client-go v0.17.3 h1:deUna1Ksx05XeESH6XGCyONNFfiQmDdqeqUvicvP6nU= k8s.io/client-go v0.17.3/go.mod h1:cLXlTMtWHkuK4tD360KpWz2gG2KtdWEr/OT02i3emRQ= k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= @@ -1048,13 +847,10 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= From fd611f5b91ade8957e3244d1495e8ffc30c114b6 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 24 Jun 2020 16:40:45 +0300 Subject: [PATCH 086/430] docker/mini: mini vitess-in-a-box, auto detecting and auto bootstrapping Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- Makefile | 5 + docker/mini/Dockerfile | 60 + docker/mini/docker-entry | 97 + docker/mini/etcd.service | 18 + docker/mini/install_mini_dependencies.sh | 28 + docker/mini/orchestrator-up.sh | 32 + .../mini/orchestrator-vitess-mini.conf.json | 67 + docker/mini/orchestrator.service | 16 + docker/mini/systemctl.py | 4550 +++++++++++++++++ docker/mini/vttablet-mini-up.sh | 78 + 10 files changed, 4951 insertions(+) create mode 100644 docker/mini/Dockerfile create mode 100755 docker/mini/docker-entry create mode 100644 docker/mini/etcd.service create mode 100755 docker/mini/install_mini_dependencies.sh create mode 100755 docker/mini/orchestrator-up.sh create mode 100644 docker/mini/orchestrator-vitess-mini.conf.json create mode 100644 docker/mini/orchestrator.service create mode 100755 docker/mini/systemctl.py create mode 100755 docker/mini/vttablet-mini-up.sh diff --git a/Makefile b/Makefile index e6d44a39e24..130ba3153f8 100644 --- a/Makefile +++ b/Makefile @@ -287,6 +287,11 @@ docker_lite_testing: chmod -R o=g * docker build -f docker/lite/Dockerfile.testing -t vitess/lite:testing . + +docker_mini: + chmod -R o=g * + docker build -f docker/mini/Dockerfile -t vitess/mini . + # This rule loads the working copy of the code into a bootstrap image, # and then runs the tests inside Docker. # Example: $ make docker_test flavor=mariadb diff --git a/docker/mini/Dockerfile b/docker/mini/Dockerfile new file mode 100644 index 00000000000..1ba28648352 --- /dev/null +++ b/docker/mini/Dockerfile @@ -0,0 +1,60 @@ +# Copyright 2019 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOTE: We have to build the Vitess binaries from scratch instead of sharing +# a base image because Docker Hub dropped the feature we relied upon to +# ensure images contain the right binaries. + +# Use a temporary layer for the build stage. +FROM vitess/base AS base + +FROM vitess/lite + +USER root + +RUN apt-get update +RUN apt-get install -y sudo curl vim python3 jq sqlite3 +RUN ln -s /usr/bin/python3 /usr/bin/python + +# Install minivitess dependencies +COPY docker/mini/install_mini_dependencies.sh /vt/dist/install_mini_dependencies.sh +RUN /vt/dist/install_mini_dependencies.sh + +COPY docker/mini/orchestrator-vitess-mini.conf.json /etc/orchestrator.conf.json +RUN chown vitess:vitess /etc/orchestrator.conf.json +# COPY docker/mini/etcd.service /etc/systemd/system/etcd.service +# COPY docker/mini/orchestrator.service /etc/systemd/system/orchestrator.service + +COPY docker/mini/systemctl.py /usr/bin/systemctl +COPY docker/mini/docker-entry /vt/dist/docker/mini/docker-entry +COPY examples/local/scripts /vt/dist/scripts +COPY examples/local/env.sh /vt/dist/scripts/env.sh +COPY docker/mini/vttablet-mini-up.sh /vt/dist/scripts/vttablet-mini-up.sh +COPY docker/mini/orchestrator-up.sh /vt/dist/scripts/orchestrator-up.sh + +COPY --from=base /vt/bin/vtctl /vt/bin/ +COPY --from=base /vt/bin/mysqlctl /vt/bin/ + +# Set up Vitess environment (just enough to run pre-built Go binaries) +ENV VTROOT /vt/src/vitess.io/vitess +ENV VTDATAROOT /vt/vtdataroot +ENV PATH $VTROOT/bin:$PATH +ENV PATH="/vt/bin:${PATH}" +ENV PATH="/var/opt/etcd:${PATH}" +ENV TOPO="etcd" + +# Create mount point for actual data (e.g. MySQL data dir) +VOLUME /vt/vtdataroot +USER vitess +CMD /vt/dist/docker/mini/docker-entry ; /bin/bash diff --git a/docker/mini/docker-entry b/docker/mini/docker-entry new file mode 100755 index 00000000000..849941a6d03 --- /dev/null +++ b/docker/mini/docker-entry @@ -0,0 +1,97 @@ +#!/bin/bash + +# Copyright 2020 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This script probes for an existing MySQL topologies and sets up a mini vitess setup matching that topology. +# + +echo_sleep() { + SECONDS="$1" + for i in $(seq 1 $SECONDS) ; do + echo -n "." + sleep 1 + done + echo +} + +SCRIPTS_PATH="/vt/dist/scripts" +export CELL=${CELL:-zone1} +export $TOPOLOGY_USER +export $TOPOLOGY_PASSWORD + +echo "############################################################" +echo "vitess self resolve cluster" +echo "############################################################" + +if [ -z "$MYSQL_SCHEMA" ] ; then + echo "Expected MYSQL_SCHEMA environment variable" + exit 1 +fi + +cd $SCRIPTS_PATH + +. ./env.sh + +./orchestrator-up.sh + +./etcd-up.sh + +# start vtctld +./vtctld-up.sh + +./vtgate-up.sh + +echo "Waiting gracefully for topology to be detected and analyzed" +echo_sleep 5 + +echo "vitess/orchestrator have detected the following MySQL servers:" +orchestrator-client -c all-instances + +BASE_TABLET_UID=100 +for i in $(orchestrator-client -c all-instances) ; do + read -r mysql_host mysql_port <<<$(echo $i | tr ':' ' ') + # TABLET_UID=$BASE_TABLET_UID ./scripts/mysqlctl-up.sh + tablet_port=$[15000 + $BASE_TABLET_UID] + + KEYSPACE=$MYSQL_SCHEMA TABLET_UID=$BASE_TABLET_UID ./vttablet-mini-up.sh $mysql_host $mysql_port $tablet_port + echo "+ vttablet started" + tablet_alias="$(curl -s http://$(hostname):${tablet_port}/debug/vars | jq -r '.TabletAlias')" + if [ "$i" == "$(orchestrator-client -c which-cluster-master -i "$i")" ] ; then + echo "setting vttablet as master" + echo vtctlclient -server "$(hostname):$vtctld_web_port" InitShardMaster -force "${MYSQL_SCHEMA}/0" "$tablet_alias" + echo "+ done" + fi + BASE_TABLET_UID=$((BASE_TABLET_UID + 1)) +done + + +exit +# start vttablets for keyspace commerce +for i in 100 101 102; do + CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh + CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ./scripts/vttablet-up.sh +done + +# set one of the replicas to master +vtctlclient InitShardMaster -force commerce/0 zone1-100 + +# create the schema +vtctlclient ApplySchema -sql-file create_commerce_schema.sql commerce + +# create the vschema +vtctlclient ApplyVSchema -vschema_file vschema_commerce_initial.json commerce + +# start vtgate +CELL=zone1 ./scripts/vtgate-up.sh diff --git a/docker/mini/etcd.service b/docker/mini/etcd.service new file mode 100644 index 00000000000..192617add31 --- /dev/null +++ b/docker/mini/etcd.service @@ -0,0 +1,18 @@ +[Unit] +Description="etcd server" +Requires=network-online.target +After=network-online.target + +[Service] +Type=simple +User=vitess +Group=vitess +ExecStart=/var/opt/etcd/etcd --data-dir=/var/run/etcd +KillMode=process +KillSignal=SIGINT +Restart=on-failure +LimitNOFILE=1024 +RestartSec=10s + +[Install] +WantedBy=multi-user.target diff --git a/docker/mini/install_mini_dependencies.sh b/docker/mini/install_mini_dependencies.sh new file mode 100755 index 00000000000..03a97cc0962 --- /dev/null +++ b/docker/mini/install_mini_dependencies.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# This is a script that gets run as part of the Dockerfile build +# to install dependencies for the vitess/mini image. +# +# Usage: install_mini_dependencies.sh + +set -euo pipefail + +# Install etcd +ETCD_VER=v3.4.9 +DOWNLOAD_URL=https://storage.googleapis.com/etcd + +curl -k -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz +mkdir -p /var/opt/etcd +sudo tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /var/opt/etcd --strip-components=1 +rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz + +mkdir -p /var/run/etcd && chown -R vitess:vitess /var/run/etcd + +# Install orchestrator +curl -k -L https://github.com/openark/orchestrator/releases/download/v3.2.2/orchestrator_3.2.2_amd64.deb -o /tmp/orchestrator.deb +dpkg -i /tmp/orchestrator.deb +rm -f /tmp/orchestrator.deb +cp /usr/local/orchestrator/resources/bin/orchestrator-client /usr/bin + +# Clean up files we won't need in the final image. +rm -rf /var/lib/apt/lists/* diff --git a/docker/mini/orchestrator-up.sh b/docker/mini/orchestrator-up.sh new file mode 100755 index 00000000000..170a0133a1f --- /dev/null +++ b/docker/mini/orchestrator-up.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +source ./env.sh + +if [ -z "$TOPOLOGY_SERVER" ] ; then + echo "TOPOLOGY_SERVER environment variable not found. You must specify a MySQL server within your topology." + echo "This mini-vitess setup will attempt to discover your topology using that server and will bootstrap to match your topology" + exit 1 +fi +if [ -z "$TOPOLOGY_USER" ] ; then + echo "TOPOLOGY_USER environment variable not found. You must specify a MySQL username accessible to vitess." + exit 1 +fi +if [ -z "$TOPOLOGY_PASSWORD" ] ; then + echo "TOPOLOGY_PASSWORD environment variable not found. You must specify a MySQL password accessible to vitess." + exit 1 +fi + +cp /etc/orchestrator.conf.json /tmp/ +sed -i /tmp/orchestrator.conf.json -e "s/DISCOVERY_SEED_PLACEHOLDER/$TOPOLOGY_SERVER/g" +sed -i /tmp/orchestrator.conf.json -e "s/MYSQL_TOPOLOGY_USER_PLACEHOLDER/$TOPOLOGY_USER/g" +sed -i /tmp/orchestrator.conf.json -e "s/MYSQL_TOPOLOGY_PASSWORD_PLACEHOLDER/$TOPOLOGY_PASSWORD/g" + +cat /tmp/orchestrator.conf.json > /etc/orchestrator.conf.json +rm /tmp/orchestrator.conf.json + +ORCHESTRATOR_LOG="${VTDATAROOT}/tmp/orchestrator.out" + +echo "Starting orchestrator... Logfile is $ORCHESTRATOR_LOG" + +cd /usr/local/orchestrator +./orchestrator http > $ORCHESTRATOR_LOG 2>&1 & diff --git a/docker/mini/orchestrator-vitess-mini.conf.json b/docker/mini/orchestrator-vitess-mini.conf.json new file mode 100644 index 00000000000..1da16b94160 --- /dev/null +++ b/docker/mini/orchestrator-vitess-mini.conf.json @@ -0,0 +1,67 @@ +{ + "Debug": true, + "EnableSyslog": false, + "ListenAddress": ":3000", + "MySQLTopologyUser": "MYSQL_TOPOLOGY_USER_PLACEHOLDER", + "MySQLTopologyPassword": "MYSQL_TOPOLOGY_PASSWORD_PLACEHOLDER", + "BackendDB": "sqlite", + "SQLite3DataFile": "/tmp/orchestrator.sqlite3", + "MySQLConnectTimeoutSeconds": 1, + "DefaultInstancePort": 3306, + "DiscoverByShowSlaveHosts": true, + "InstancePollSeconds": 1, + "HostnameResolveMethod": "none", + "MySQLHostnameResolveMethod": "", + "SkipBinlogServerUnresolveCheck": true, + "ExpiryHostnameResolvesMinutes": 60, + "VerifyReplicationFilters": false, + "ReasonableMaintenanceReplicationLagSeconds": 20, + "CandidateInstanceExpireMinutes": 60, + "ReadOnly": false, + "AuthenticationMethod": "", + "ReplicationLagQuery": "", + "DetectClusterAliasQuery": "", + "DetectClusterDomainQuery": "", + "DetectInstanceAliasQuery": "", + "DetectPromotionRuleQuery": "", + "DetectDataCenterQuery": "", + "DetectRegionQuery": "", + "DetectPhysicalEnvironmentQuery": "", + "DetectSemiSyncEnforcedQuery": "", + "DiscoverySeeds": [ + "DISCOVERY_SEED_PLACEHOLDER" + ], + "ServeAgentsHttp": false, + "UseSSL": false, + "UseMutualTLS": false, + "MySQLTopologyUseMixedTLS": false, + "StatusEndpoint": "/api/status", + "StatusSimpleHealth": true, + "StatusOUVerify": false, + "BinlogEventsChunkSize": 10000, + "SkipBinlogEventsContaining": [], + "ReduceReplicationAnalysisCount": false, + "FailureDetectionPeriodBlockMinutes": 5, + "FailMasterPromotionOnLagMinutes": 0, + "RecoveryPeriodBlockSeconds": 0, + "RecoveryIgnoreHostnameFilters": [], + "RecoverMasterClusterFilters": [], + "RecoverIntermediateMasterClusterFilters": [], + "OnFailureDetectionProcesses": [], + "PreGracefulTakeoverProcesses": [], + "PreFailoverProcesses": [], + "PostFailoverProcesses": [], + "PostUnsuccessfulFailoverProcesses": [], + "PostMasterFailoverProcesses": [], + "PostIntermediateMasterFailoverProcesses": [], + "PostGracefulTakeoverProcesses": [], + "CoMasterRecoveryMustPromoteOtherCoMaster": true, + "DetachLostReplicasAfterMasterFailover": true, + "ApplyMySQLPromotionAfterMasterFailover": true, + "PreventCrossDataCenterMasterFailover": false, + "PreventCrossRegionMasterFailover": true, + "MasterFailoverDetachReplicaMasterHost": false, + "MasterFailoverLostInstancesDowntimeMinutes": 0, + "PostponeReplicaRecoveryOnLagMinutes": 0, + "RaftEnabled": false +} diff --git a/docker/mini/orchestrator.service b/docker/mini/orchestrator.service new file mode 100644 index 00000000000..cf790404654 --- /dev/null +++ b/docker/mini/orchestrator.service @@ -0,0 +1,16 @@ +[Unit] +Description=orchestrator: MySQL replication management and visualization +Documentation=https://github.com/openark/orchestrator +After=syslog.target network.target + +[Service] +Type=simple +User=vitess +Group=vitess +WorkingDirectory=/usr/local/orchestrator +ExecStart=/usr/local/orchestrator/orchestrator http +EnvironmentFile=-/etc/sysconfig/orchestrator +ExecReload=/bin/kill -HUP $MAINPID + +[Install] +WantedBy=multi-user.target diff --git a/docker/mini/systemctl.py b/docker/mini/systemctl.py new file mode 100755 index 00000000000..64287a30948 --- /dev/null +++ b/docker/mini/systemctl.py @@ -0,0 +1,4550 @@ +#! /usr/bin/python3 +from __future__ import print_function + +__copyright__ = "(C) 2016-2019 Guido U. Draheim, licensed under the EUPL" +__version__ = "1.4.3424" + +import logging +logg = logging.getLogger("systemctl") + +import re +import fnmatch +import shlex +import collections +import errno +import os +import sys +import signal +import time +import socket +import datetime +import fcntl + +if sys.version[0] == '2': + string_types = basestring + BlockingIOError = IOError +else: + string_types = str + xrange = range + +COVERAGE = os.environ.get("SYSTEMCTL_COVERAGE", "") +DEBUG_AFTER = os.environ.get("SYSTEMCTL_DEBUG_AFTER", "") or False +EXIT_WHEN_NO_MORE_PROCS = os.environ.get("SYSTEMCTL_EXIT_WHEN_NO_MORE_PROCS", "") or False +EXIT_WHEN_NO_MORE_SERVICES = os.environ.get("SYSTEMCTL_EXIT_WHEN_NO_MORE_SERVICES", "") or False + +FOUND_OK = 0 +FOUND_INACTIVE = 2 +FOUND_UNKNOWN = 4 + +# defaults for options +_extra_vars = [] +_force = False +_full = False +_now = False +_no_legend = False +_no_ask_password = False +_preset_mode = "all" +_quiet = False +_root = "" +_unit_type = None +_unit_state = None +_unit_property = None +_show_all = False +_user_mode = False + +# common default paths +_default_target = "multi-user.target" +_system_folder1 = "/etc/systemd/system" +_system_folder2 = "/var/run/systemd/system" +_system_folder3 = "/usr/lib/systemd/system" +_system_folder4 = "/lib/systemd/system" +_system_folder9 = None +_user_folder1 = "~/.config/systemd/user" +_user_folder2 = "/etc/systemd/user" +_user_folder3 = "~.local/share/systemd/user" +_user_folder4 = "/usr/lib/systemd/user" +_user_folder9 = None +_init_folder1 = "/etc/init.d" +_init_folder2 = "/var/run/init.d" +_init_folder9 = None +_preset_folder1 = "/etc/systemd/system-preset" +_preset_folder2 = "/var/run/systemd/system-preset" +_preset_folder3 = "/usr/lib/systemd/system-preset" +_preset_folder4 = "/lib/systemd/system-preset" +_preset_folder9 = None + +SystemCompatibilityVersion = 219 +SysInitTarget = "sysinit.target" +SysInitWait = 5 # max for target +EpsilonTime = 0.1 +MinimumYield = 0.5 +MinimumTimeoutStartSec = 4 +MinimumTimeoutStopSec = 4 +DefaultTimeoutStartSec = int(os.environ.get("SYSTEMCTL_TIMEOUT_START_SEC", 90)) # official value +DefaultTimeoutStopSec = int(os.environ.get("SYSTEMCTL_TIMEOUT_STOP_SEC", 90)) # official value +DefaultMaximumTimeout = int(os.environ.get("SYSTEMCTL_MAXIMUM_TIMEOUT", 200)) # overrides all other +InitLoopSleep = int(os.environ.get("SYSTEMCTL_INITLOOP", 5)) +ProcMaxDepth = 100 +MaxLockWait = None # equals DefaultMaximumTimeout +DefaultPath = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +ResetLocale = ["LANG", "LANGUAGE", "LC_CTYPE", "LC_NUMERIC", "LC_TIME", "LC_COLLATE", "LC_MONETARY", + "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", + "LC_IDENTIFICATION", "LC_ALL"] + +# The systemd default is NOTIFY_SOCKET="/var/run/systemd/notify" +_notify_socket_folder = "/var/run/systemd" # alias /run/systemd +_pid_file_folder = "/var/run" +_journal_log_folder = "/var/log/journal" + +_systemctl_debug_log = "/var/log/systemctl.debug.log" +_systemctl_extra_log = "/var/log/systemctl.log" + +_default_targets = [ "poweroff.target", "rescue.target", "sysinit.target", "basic.target", "multi-user.target", "graphical.target", "reboot.target" ] +_feature_targets = [ "network.target", "remote-fs.target", "local-fs.target", "timers.target", "nfs-client.target" ] +_all_common_targets = [ "default.target" ] + _default_targets + _feature_targets + +# inside a docker we pretend the following +_all_common_enabled = [ "default.target", "multi-user.target", "remote-fs.target" ] +_all_common_disabled = [ "graphical.target", "resue.target", "nfs-client.target" ] + +_runlevel_mappings = {} # the official list +_runlevel_mappings["0"] = "poweroff.target" +_runlevel_mappings["1"] = "rescue.target" +_runlevel_mappings["2"] = "multi-user.target" +_runlevel_mappings["3"] = "multi-user.target" +_runlevel_mappings["4"] = "multi-user.target" +_runlevel_mappings["5"] = "graphical.target" +_runlevel_mappings["6"] = "reboot.target" + +_sysv_mappings = {} # by rule of thumb +_sysv_mappings["$local_fs"] = "local-fs.target" +_sysv_mappings["$network"] = "network.target" +_sysv_mappings["$remote_fs"] = "remote-fs.target" +_sysv_mappings["$timer"] = "timers.target" + +def shell_cmd(cmd): + return " ".join(["'%s'" % part for part in cmd]) +def to_int(value, default = 0): + try: + return int(value) + except: + return default +def to_list(value): + if isinstance(value, string_types): + return [ value ] + return value +def unit_of(module): + if "." not in module: + return module + ".service" + return module + +def os_path(root, path): + if not root: + return path + if not path: + return path + while path.startswith(os.path.sep): + path = path[1:] + return os.path.join(root, path) + +def os_getlogin(): + """ NOT using os.getlogin() """ + import pwd + return pwd.getpwuid(os.geteuid()).pw_name + +def get_runtime_dir(): + explicit = os.environ.get("XDG_RUNTIME_DIR", "") + if explicit: return explicit + user = os_getlogin() + return "/tmp/run-"+user + +def get_home(): + explicit = os.environ.get("HOME", "") + if explicit: return explicit + return os.path.expanduser("~") + +def _var_path(path): + """ assumes that the path starts with /var - when in + user mode it shall be moved to /run/user/1001/run/ + or as a fallback path to /tmp/run-{user}/ so that + you may find /var/log in /tmp/run-{user}/log ..""" + if path.startswith("/var"): + runtime = get_runtime_dir() # $XDG_RUNTIME_DIR + if not os.path.isdir(runtime): + os.makedirs(runtime) + os.chmod(runtime, 0o700) + return re.sub("^(/var)?", get_runtime_dir(), path) + return path + + +def shutil_setuid(user = None, group = None): + """ set fork-child uid/gid (returns pw-info env-settings)""" + if group: + import grp + gid = grp.getgrnam(group).gr_gid + os.setgid(gid) + logg.debug("setgid %s '%s'", gid, group) + if user: + import pwd + import grp + pw = pwd.getpwnam(user) + gid = pw.pw_gid + gname = grp.getgrgid(gid).gr_name + if not group: + os.setgid(gid) + logg.debug("setgid %s", gid) + groups = [g.gr_gid for g in grp.getgrall() if gname in g.gr_mem] + if groups: + os.setgroups(groups) + uid = pw.pw_uid + os.setuid(uid) + logg.debug("setuid %s '%s'", uid, user) + home = pw.pw_dir + shell = pw.pw_shell + logname = pw.pw_name + return { "USER": user, "LOGNAME": logname, "HOME": home, "SHELL": shell } + return {} + +def shutil_truncate(filename): + """ truncates the file (or creates a new empty file)""" + filedir = os.path.dirname(filename) + if not os.path.isdir(filedir): + os.makedirs(filedir) + f = open(filename, "w") + f.write("") + f.close() + +# http://stackoverflow.com/questions/568271/how-to-check-if-there-exists-a-process-with-a-given-pid +def pid_exists(pid): + """Check whether pid exists in the current process table.""" + if pid is None: + return False + return _pid_exists(int(pid)) +def _pid_exists(pid): + """Check whether pid exists in the current process table. + UNIX only. + """ + if pid < 0: + return False + if pid == 0: + # According to "man 2 kill" PID 0 refers to every process + # in the process group of the calling process. + # On certain systems 0 is a valid PID but we have no way + # to know that in a portable fashion. + raise ValueError('invalid PID 0') + try: + os.kill(pid, 0) + except OSError as err: + if err.errno == errno.ESRCH: + # ESRCH == No such process + return False + elif err.errno == errno.EPERM: + # EPERM clearly means there's a process to deny access to + return True + else: + # According to "man 2 kill" possible error values are + # (EINVAL, EPERM, ESRCH) + raise + else: + return True +def pid_zombie(pid): + """ may be a pid exists but it is only a zombie """ + if pid is None: + return False + return _pid_zombie(int(pid)) +def _pid_zombie(pid): + """ may be a pid exists but it is only a zombie """ + if pid < 0: + return False + if pid == 0: + # According to "man 2 kill" PID 0 refers to every process + # in the process group of the calling process. + # On certain systems 0 is a valid PID but we have no way + # to know that in a portable fashion. + raise ValueError('invalid PID 0') + check = "/proc/%s/status" % pid + try: + for line in open(check): + if line.startswith("State:"): + return "Z" in line + except IOError as e: + if e.errno != errno.ENOENT: + logg.error("%s (%s): %s", check, e.errno, e) + return False + return False + +def checkstatus(cmd): + if cmd.startswith("-"): + return False, cmd[1:] + else: + return True, cmd + +# https://github.com/phusion/baseimage-docker/blob/rel-0.9.16/image/bin/my_init +def ignore_signals_and_raise_keyboard_interrupt(signame): + signal.signal(signal.SIGTERM, signal.SIG_IGN) + signal.signal(signal.SIGINT, signal.SIG_IGN) + raise KeyboardInterrupt(signame) + +class SystemctlConfigParser: + """ A *.service files has a structure similar to an *.ini file but it is + actually not like it. Settings may occur multiple times in each section + and they create an implicit list. In reality all the settings are + globally uniqute, so that an 'environment' can be printed without + adding prefixes. Settings are continued with a backslash at the end + of the line. """ + def __init__(self, defaults=None, dict_type=None, allow_no_value=False): + self._defaults = defaults or {} + self._dict_type = dict_type or collections.OrderedDict + self._allow_no_value = allow_no_value + self._conf = self._dict_type() + self._files = [] + def defaults(self): + return self._defaults + def sections(self): + return list(self._conf.keys()) + def add_section(self, section): + if section not in self._conf: + self._conf[section] = self._dict_type() + def has_section(self, section): + return section in self._conf + def has_option(self, section, option): + if section not in self._conf: + return False + return option in self._conf[section] + def set(self, section, option, value): + if section not in self._conf: + self._conf[section] = self._dict_type() + if option not in self._conf[section]: + self._conf[section][option] = [ value ] + else: + self._conf[section][option].append(value) + if value is None: + self._conf[section][option] = [] + def get(self, section, option, default = None, allow_no_value = False): + allow_no_value = allow_no_value or self._allow_no_value + if section not in self._conf: + if default is not None: + return default + if allow_no_value: + return None + logg.warning("section {} does not exist".format(section)) + logg.warning(" have {}".format(self.sections())) + raise AttributeError("section {} does not exist".format(section)) + if option not in self._conf[section]: + if default is not None: + return default + if allow_no_value: + return None + raise AttributeError("option {} in {} does not exist".format(option, section)) + if not self._conf[section][option]: # i.e. an empty list + if default is not None: + return default + if allow_no_value: + return None + raise AttributeError("option {} in {} is None".format(option, section)) + return self._conf[section][option][0] # the first line in the list of configs + def getlist(self, section, option, default = None, allow_no_value = False): + allow_no_value = allow_no_value or self._allow_no_value + if section not in self._conf: + if default is not None: + return default + if allow_no_value: + return [] + logg.warning("section {} does not exist".format(section)) + logg.warning(" have {}".format(self.sections())) + raise AttributeError("section {} does not exist".format(section)) + if option not in self._conf[section]: + if default is not None: + return default + if allow_no_value: + return [] + raise AttributeError("option {} in {} does not exist".format(option, section)) + return self._conf[section][option] # returns a list, possibly empty + def read(self, filename): + return self.read_sysd(filename) + def read_sysd(self, filename): + initscript = False + initinfo = False + section = None + nextline = False + name, text = "", "" + if os.path.isfile(filename): + self._files.append(filename) + for orig_line in open(filename): + if nextline: + text += orig_line + if text.rstrip().endswith("\\") or text.rstrip().endswith("\\\n"): + text = text.rstrip() + "\n" + else: + self.set(section, name, text) + nextline = False + continue + line = orig_line.strip() + if not line: + continue + if line.startswith("#"): + continue + if line.startswith(";"): + continue + if line.startswith(".include"): + logg.error("the '.include' syntax is deprecated. Use x.service.d/ drop-in files!") + includefile = re.sub(r'^\.include[ ]*', '', line).rstrip() + if not os.path.isfile(includefile): + raise Exception("tried to include file that doesn't exist: %s" % includefile) + self.read_sysd(includefile) + continue + if line.startswith("["): + x = line.find("]") + if x > 0: + section = line[1:x] + self.add_section(section) + continue + m = re.match(r"(\w+) *=(.*)", line) + if not m: + logg.warning("bad ini line: %s", line) + raise Exception("bad ini line") + name, text = m.group(1), m.group(2).strip() + if text.endswith("\\") or text.endswith("\\\n"): + nextline = True + text = text + "\n" + else: + # hint: an empty line shall reset the value-list + self.set(section, name, text and text or None) + def read_sysv(self, filename): + """ an LSB header is scanned and converted to (almost) + equivalent settings of a SystemD ini-style input """ + initscript = False + initinfo = False + section = None + if os.path.isfile(filename): + self._files.append(filename) + for orig_line in open(filename): + line = orig_line.strip() + if line.startswith("#"): + if " BEGIN INIT INFO" in line: + initinfo = True + section = "init.d" + if " END INIT INFO" in line: + initinfo = False + if initinfo: + m = re.match(r"\S+\s*(\w[\w_-]*):(.*)", line) + if m: + key, val = m.group(1), m.group(2).strip() + self.set(section, key, val) + continue + description = self.get("init.d", "Description", "") + if description: + self.set("Unit", "Description", description) + check = self.get("init.d", "Required-Start","") + if check: + for item in check.split(" "): + if item.strip() in _sysv_mappings: + self.set("Unit", "Requires", _sysv_mappings[item.strip()]) + provides = self.get("init.d", "Provides", "") + if provides: + self.set("Install", "Alias", provides) + # if already in multi-user.target then start it there. + runlevels = self.get("init.d", "Default-Start","") + if runlevels: + for item in runlevels.split(" "): + if item.strip() in _runlevel_mappings: + self.set("Install", "WantedBy", _runlevel_mappings[item.strip()]) + self.set("Service", "Type", "sysv") + def filenames(self): + return self._files + +# UnitConfParser = ConfigParser.RawConfigParser +UnitConfParser = SystemctlConfigParser + +class SystemctlConf: + def __init__(self, data, module = None): + self.data = data # UnitConfParser + self.env = {} + self.status = None + self.masked = None + self.module = module + self.drop_in_files = {} + self._root = _root + self._user_mode = _user_mode + def os_path(self, path): + return os_path(self._root, path) + def os_path_var(self, path): + if self._user_mode: + return os_path(self._root, _var_path(path)) + return os_path(self._root, path) + def loaded(self): + files = self.data.filenames() + if self.masked: + return "masked" + if len(files): + return "loaded" + return "" + def filename(self): + """ returns the last filename that was parsed """ + files = self.data.filenames() + if files: + return files[0] + return None + def overrides(self): + """ drop-in files are loaded alphabetically by name, not by full path """ + return [ self.drop_in_files[name] for name in sorted(self.drop_in_files) ] + def name(self): + """ the unit id or defaults to the file name """ + name = self.module or "" + filename = self.filename() + if filename: + name = os.path.basename(filename) + return self.get("Unit", "Id", name) + def set(self, section, name, value): + return self.data.set(section, name, value) + def get(self, section, name, default, allow_no_value = False): + return self.data.get(section, name, default, allow_no_value) + def getlist(self, section, name, default = None, allow_no_value = False): + return self.data.getlist(section, name, default or [], allow_no_value) + def getbool(self, section, name, default = None): + value = self.data.get(section, name, default or "no") + if value: + if value[0] in "TtYy123456789": + return True + return False + +class PresetFile: + def __init__(self): + self._files = [] + self._lines = [] + def filename(self): + """ returns the last filename that was parsed """ + if self._files: + return self._files[-1] + return None + def read(self, filename): + self._files.append(filename) + for line in open(filename): + self._lines.append(line.strip()) + return self + def get_preset(self, unit): + for line in self._lines: + m = re.match(r"(enable|disable)\s+(\S+)", line) + if m: + status, pattern = m.group(1), m.group(2) + if fnmatch.fnmatchcase(unit, pattern): + logg.debug("%s %s => %s [%s]", status, pattern, unit, self.filename()) + return status + return None + +## with waitlock(conf): self.start() +class waitlock: + def __init__(self, conf): + self.conf = conf # currently unused + self.opened = None + self.lockfolder = conf.os_path_var(_notify_socket_folder) + try: + folder = self.lockfolder + if not os.path.isdir(folder): + os.makedirs(folder) + except Exception as e: + logg.warning("oops, %s", e) + def lockfile(self): + unit = "" + if self.conf: + unit = self.conf.name() + return os.path.join(self.lockfolder, str(unit or "global") + ".lock") + def __enter__(self): + try: + lockfile = self.lockfile() + lockname = os.path.basename(lockfile) + self.opened = os.open(lockfile, os.O_RDWR | os.O_CREAT, 0o600) + for attempt in xrange(int(MaxLockWait or DefaultMaximumTimeout)): + try: + logg.debug("[%s] %s. trying %s _______ ", os.getpid(), attempt, lockname) + fcntl.flock(self.opened, fcntl.LOCK_EX | fcntl.LOCK_NB) + st = os.fstat(self.opened) + if not st.st_nlink: + logg.debug("[%s] %s. %s got deleted, trying again", os.getpid(), attempt, lockname) + os.close(self.opened) + self.opened = os.open(lockfile, os.O_RDWR | os.O_CREAT, 0o600) + continue + content = "{ 'systemctl': %s, 'lock': '%s' }\n" % (os.getpid(), lockname) + os.write(self.opened, content.encode("utf-8")) + logg.debug("[%s] %s. holding lock on %s", os.getpid(), attempt, lockname) + return True + except BlockingIOError as e: + whom = os.read(self.opened, 4096) + os.lseek(self.opened, 0, os.SEEK_SET) + logg.info("[%s] %s. systemctl locked by %s", os.getpid(), attempt, whom.rstrip()) + time.sleep(1) # until MaxLockWait + continue + logg.error("[%s] not able to get the lock to %s", os.getpid(), lockname) + except Exception as e: + logg.warning("[%s] oops %s, %s", os.getpid(), str(type(e)), e) + #TODO# raise Exception("no lock for %s", self.unit or "global") + return False + def __exit__(self, type, value, traceback): + try: + os.lseek(self.opened, 0, os.SEEK_SET) + os.ftruncate(self.opened, 0) + if "removelockfile" in COVERAGE: # actually an optional implementation + lockfile = self.lockfile() + lockname = os.path.basename(lockfile) + os.unlink(lockfile) # ino is kept allocated because opened by this process + logg.debug("[%s] lockfile removed for %s", os.getpid(), lockname) + fcntl.flock(self.opened, fcntl.LOCK_UN) + os.close(self.opened) # implies an unlock but that has happend like 6 seconds later + self.opened = None + except Exception as e: + logg.warning("oops, %s", e) + +def must_have_failed(waitpid, cmd): + # found to be needed on ubuntu:16.04 to match test result from ubuntu:18.04 and other distros + # .... I have tracked it down that python's os.waitpid() returns an exitcode==0 even when the + # .... underlying process has actually failed with an exitcode<>0. It is unknown where that + # .... bug comes from but it seems a bit serious to trash some very basic unix functionality. + # .... Essentially a parent process does not get the correct exitcode from its own children. + if cmd and cmd[0] == "/bin/kill": + pid = None + for arg in cmd[1:]: + if not arg.startswith("-"): + pid = arg + if pid is None: # unknown $MAINPID + if not waitpid.returncode: + logg.error("waitpid %s did return %s => correcting as 11", cmd, waitpid.returncode) + waitpidNEW = collections.namedtuple("waitpidNEW", ["pid", "returncode", "signal" ]) + waitpid = waitpidNEW(waitpid.pid, 11, waitpid.signal) + return waitpid + +def subprocess_waitpid(pid): + waitpid = collections.namedtuple("waitpid", ["pid", "returncode", "signal" ]) + run_pid, run_stat = os.waitpid(pid, 0) + return waitpid(run_pid, os.WEXITSTATUS(run_stat), os.WTERMSIG(run_stat)) +def subprocess_testpid(pid): + testpid = collections.namedtuple("testpid", ["pid", "returncode", "signal" ]) + run_pid, run_stat = os.waitpid(pid, os.WNOHANG) + if run_pid: + return testpid(run_pid, os.WEXITSTATUS(run_stat), os.WTERMSIG(run_stat)) + else: + return testpid(pid, None, 0) + +def parse_unit(name): # -> object(prefix, instance, suffix, ...., name, component) + unit_name, suffix = name, "" + has_suffix = name.rfind(".") + if has_suffix > 0: + unit_name = name[:has_suffix] + suffix = name[has_suffix+1:] + prefix, instance = unit_name, "" + has_instance = unit_name.find("@") + if has_instance > 0: + prefix = unit_name[:has_instance] + instance = unit_name[has_instance+1:] + component = "" + has_component = prefix.rfind("-") + if has_component > 0: + component = prefix[has_component+1:] + UnitName = collections.namedtuple("UnitName", ["name", "prefix", "instance", "suffix", "component" ]) + return UnitName(name, prefix, instance, suffix, component) + +def time_to_seconds(text, maximum = None): + if maximum is None: + maximum = DefaultMaximumTimeout + value = 0 + for part in str(text).split(" "): + item = part.strip() + if item == "infinity": + return maximum + if item.endswith("m"): + try: value += 60 * int(item[:-1]) + except: pass # pragma: no cover + if item.endswith("min"): + try: value += 60 * int(item[:-3]) + except: pass # pragma: no cover + elif item.endswith("ms"): + try: value += int(item[:-2]) / 1000. + except: pass # pragma: no cover + elif item.endswith("s"): + try: value += int(item[:-1]) + except: pass # pragma: no cover + elif item: + try: value += int(item) + except: pass # pragma: no cover + if value > maximum: + return maximum + if not value: + return 1 + return value +def seconds_to_time(seconds): + seconds = float(seconds) + mins = int(int(seconds) / 60) + secs = int(int(seconds) - (mins * 60)) + msecs = int(int(seconds * 1000) - (secs * 1000 + mins * 60000)) + if mins and secs and msecs: + return "%smin %ss %sms" % (mins, secs, msecs) + elif mins and secs: + return "%smin %ss" % (mins, secs) + elif secs and msecs: + return "%ss %sms" % (secs, msecs) + elif mins and msecs: + return "%smin %sms" % (mins, msecs) + elif mins: + return "%smin" % (mins) + else: + return "%ss" % (secs) + +def getBefore(conf): + result = [] + beforelist = conf.getlist("Unit", "Before", []) + for befores in beforelist: + for before in befores.split(" "): + name = before.strip() + if name and name not in result: + result.append(name) + return result + +def getAfter(conf): + result = [] + afterlist = conf.getlist("Unit", "After", []) + for afters in afterlist: + for after in afters.split(" "): + name = after.strip() + if name and name not in result: + result.append(name) + return result + +def compareAfter(confA, confB): + idA = confA.name() + idB = confB.name() + for after in getAfter(confA): + if after == idB: + logg.debug("%s After %s", idA, idB) + return -1 + for after in getAfter(confB): + if after == idA: + logg.debug("%s After %s", idB, idA) + return 1 + for before in getBefore(confA): + if before == idB: + logg.debug("%s Before %s", idA, idB) + return 1 + for before in getBefore(confB): + if before == idA: + logg.debug("%s Before %s", idB, idA) + return -1 + return 0 + +def sortedAfter(conflist, cmp = compareAfter): + # the normal sorted() does only look at two items + # so if "A after C" and a list [A, B, C] then + # it will see "A = B" and "B = C" assuming that + # "A = C" and the list is already sorted. + # + # To make a totalsorted we have to create a marker + # that informs sorted() that also B has a relation. + # It only works when 'after' has a direction, so + # anything without 'before' is a 'after'. In that + # case we find that "B after C". + class SortTuple: + def __init__(self, rank, conf): + self.rank = rank + self.conf = conf + sortlist = [ SortTuple(0, conf) for conf in conflist] + for check in xrange(len(sortlist)): # maxrank = len(sortlist) + changed = 0 + for A in xrange(len(sortlist)): + for B in xrange(len(sortlist)): + if A != B: + itemA = sortlist[A] + itemB = sortlist[B] + before = compareAfter(itemA.conf, itemB.conf) + if before > 0 and itemA.rank <= itemB.rank: + if DEBUG_AFTER: # pragma: no cover + logg.info(" %-30s before %s", itemA.conf.name(), itemB.conf.name()) + itemA.rank = itemB.rank + 1 + changed += 1 + if before < 0 and itemB.rank <= itemA.rank: + if DEBUG_AFTER: # pragma: no cover + logg.info(" %-30s before %s", itemB.conf.name(), itemA.conf.name()) + itemB.rank = itemA.rank + 1 + changed += 1 + if not changed: + if DEBUG_AFTER: # pragma: no cover + logg.info("done in check %s of %s", check, len(sortlist)) + break + # because Requires is almost always the same as the After clauses + # we are mostly done in round 1 as the list is in required order + for conf in conflist: + if DEBUG_AFTER: # pragma: no cover + logg.debug(".. %s", conf.name()) + for item in sortlist: + if DEBUG_AFTER: # pragma: no cover + logg.info("(%s) %s", item.rank, item.conf.name()) + sortedlist = sorted(sortlist, key = lambda item: -item.rank) + for item in sortedlist: + if DEBUG_AFTER: # pragma: no cover + logg.info("[%s] %s", item.rank, item.conf.name()) + return [ item.conf for item in sortedlist ] + +class Systemctl: + def __init__(self): + # from command line options or the defaults + self._extra_vars = _extra_vars + self._force = _force + self._full = _full + self._init = _init + self._no_ask_password = _no_ask_password + self._no_legend = _no_legend + self._now = _now + self._preset_mode = _preset_mode + self._quiet = _quiet + self._root = _root + self._show_all = _show_all + self._unit_property = _unit_property + self._unit_state = _unit_state + self._unit_type = _unit_type + # some common constants that may be changed + self._systemd_version = SystemCompatibilityVersion + self._pid_file_folder = _pid_file_folder + self._journal_log_folder = _journal_log_folder + # and the actual internal runtime state + self._loaded_file_sysv = {} # /etc/init.d/name => config data + self._loaded_file_sysd = {} # /etc/systemd/system/name.service => config data + self._file_for_unit_sysv = None # name.service => /etc/init.d/name + self._file_for_unit_sysd = None # name.service => /etc/systemd/system/name.service + self._preset_file_list = None # /etc/systemd/system-preset/* => file content + self._default_target = _default_target + self._sysinit_target = None + self.exit_when_no_more_procs = EXIT_WHEN_NO_MORE_PROCS or False + self.exit_when_no_more_services = EXIT_WHEN_NO_MORE_SERVICES or False + self._user_mode = _user_mode + self._user_getlogin = os_getlogin() + self._log_file = {} # init-loop + self._log_hold = {} # init-loop + def user(self): + return self._user_getlogin + def user_mode(self): + return self._user_mode + def user_folder(self): + for folder in self.user_folders(): + if folder: return folder + raise Exception("did not find any systemd/user folder") + def system_folder(self): + for folder in self.system_folders(): + if folder: return folder + raise Exception("did not find any systemd/system folder") + def init_folders(self): + if _init_folder1: yield _init_folder1 + if _init_folder2: yield _init_folder2 + if _init_folder9: yield _init_folder9 + def preset_folders(self): + if _preset_folder1: yield _preset_folder1 + if _preset_folder2: yield _preset_folder2 + if _preset_folder3: yield _preset_folder3 + if _preset_folder4: yield _preset_folder4 + if _preset_folder9: yield _preset_folder9 + def user_folders(self): + if _user_folder1: yield os.path.expanduser(_user_folder1) + if _user_folder2: yield os.path.expanduser(_user_folder2) + if _user_folder3: yield os.path.expanduser(_user_folder3) + if _user_folder4: yield os.path.expanduser(_user_folder4) + if _user_folder9: yield os.path.expanduser(_user_folder9) + def system_folders(self): + if _system_folder1: yield _system_folder1 + if _system_folder2: yield _system_folder2 + if _system_folder3: yield _system_folder3 + if _system_folder4: yield _system_folder4 + if _system_folder9: yield _system_folder9 + def sysd_folders(self): + """ if --user then these folders are preferred """ + if self.user_mode(): + for folder in self.user_folders(): + yield folder + if True: + for folder in self.system_folders(): + yield folder + def scan_unit_sysd_files(self, module = None): # -> [ unit-names,... ] + """ reads all unit files, returns the first filename for the unit given """ + if self._file_for_unit_sysd is None: + self._file_for_unit_sysd = {} + for folder in self.sysd_folders(): + if not folder: + continue + folder = os_path(self._root, folder) + if not os.path.isdir(folder): + continue + for name in os.listdir(folder): + path = os.path.join(folder, name) + if os.path.isdir(path): + continue + service_name = name + if service_name not in self._file_for_unit_sysd: + self._file_for_unit_sysd[service_name] = path + logg.debug("found %s sysd files", len(self._file_for_unit_sysd)) + return list(self._file_for_unit_sysd.keys()) + def scan_unit_sysv_files(self, module = None): # -> [ unit-names,... ] + """ reads all init.d files, returns the first filename when unit is a '.service' """ + if self._file_for_unit_sysv is None: + self._file_for_unit_sysv = {} + for folder in self.init_folders(): + if not folder: + continue + folder = os_path(self._root, folder) + if not os.path.isdir(folder): + continue + for name in os.listdir(folder): + path = os.path.join(folder, name) + if os.path.isdir(path): + continue + service_name = name + ".service" # simulate systemd + if service_name not in self._file_for_unit_sysv: + self._file_for_unit_sysv[service_name] = path + logg.debug("found %s sysv files", len(self._file_for_unit_sysv)) + return list(self._file_for_unit_sysv.keys()) + def unit_sysd_file(self, module = None): # -> filename? + """ file path for the given module (systemd) """ + self.scan_unit_sysd_files() + if module and module in self._file_for_unit_sysd: + return self._file_for_unit_sysd[module] + if module and unit_of(module) in self._file_for_unit_sysd: + return self._file_for_unit_sysd[unit_of(module)] + return None + def unit_sysv_file(self, module = None): # -> filename? + """ file path for the given module (sysv) """ + self.scan_unit_sysv_files() + if module and module in self._file_for_unit_sysv: + return self._file_for_unit_sysv[module] + if module and unit_of(module) in self._file_for_unit_sysv: + return self._file_for_unit_sysv[unit_of(module)] + return None + def unit_file(self, module = None): # -> filename? + """ file path for the given module (sysv or systemd) """ + path = self.unit_sysd_file(module) + if path is not None: return path + path = self.unit_sysv_file(module) + if path is not None: return path + return None + def is_sysv_file(self, filename): + """ for routines that have a special treatment for init.d services """ + self.unit_file() # scan all + if not filename: return None + if filename in self._file_for_unit_sysd.values(): return False + if filename in self._file_for_unit_sysv.values(): return True + return None # not True + def is_user_conf(self, conf): + if not conf: + return False # no such conf >> ignored + filename = conf.filename() + if filename and "/user/" in filename: + return True + return False + def not_user_conf(self, conf): + """ conf can not be started as user service (when --user)""" + if not conf: + return True # no such conf >> ignored + if not self.user_mode(): + logg.debug("%s no --user mode >> accept", conf.filename()) + return False + if self.is_user_conf(conf): + logg.debug("%s is /user/ conf >> accept", conf.filename()) + return False + # to allow for 'docker run -u user' with system services + user = self.expand_special(conf.get("Service", "User", ""), conf) + if user and user == self.user(): + logg.debug("%s with User=%s >> accept", conf.filename(), user) + return False + return True + def find_drop_in_files(self, unit): + """ search for some.service.d/extra.conf files """ + result = {} + basename_d = unit + ".d" + for folder in self.sysd_folders(): + if not folder: + continue + folder = os_path(self._root, folder) + override_d = os_path(folder, basename_d) + if not os.path.isdir(override_d): + continue + for name in os.listdir(override_d): + path = os.path.join(override_d, name) + if os.path.isdir(path): + continue + if not path.endswith(".conf"): + continue + if name not in result: + result[name] = path + return result + def load_sysd_template_conf(self, module): # -> conf? + """ read the unit template with a UnitConfParser (systemd) """ + if module and "@" in module: + unit = parse_unit(module) + service = "%s@.service" % unit.prefix + return self.load_sysd_unit_conf(service) + return None + def load_sysd_unit_conf(self, module): # -> conf? + """ read the unit file with a UnitConfParser (systemd) """ + path = self.unit_sysd_file(module) + if not path: return None + if path in self._loaded_file_sysd: + return self._loaded_file_sysd[path] + masked = None + if os.path.islink(path) and os.readlink(path).startswith("/dev"): + masked = os.readlink(path) + drop_in_files = {} + data = UnitConfParser() + if not masked: + data.read_sysd(path) + drop_in_files = self.find_drop_in_files(os.path.basename(path)) + # load in alphabetic order, irrespective of location + for name in sorted(drop_in_files): + path = drop_in_files[name] + data.read_sysd(path) + conf = SystemctlConf(data, module) + conf.masked = masked + conf.drop_in_files = drop_in_files + conf._root = self._root + self._loaded_file_sysd[path] = conf + return conf + def load_sysv_unit_conf(self, module): # -> conf? + """ read the unit file with a UnitConfParser (sysv) """ + path = self.unit_sysv_file(module) + if not path: return None + if path in self._loaded_file_sysv: + return self._loaded_file_sysv[path] + data = UnitConfParser() + data.read_sysv(path) + conf = SystemctlConf(data, module) + conf._root = self._root + self._loaded_file_sysv[path] = conf + return conf + def load_unit_conf(self, module): # -> conf | None(not-found) + """ read the unit file with a UnitConfParser (sysv or systemd) """ + try: + conf = self.load_sysd_unit_conf(module) + if conf is not None: + return conf + conf = self.load_sysd_template_conf(module) + if conf is not None: + return conf + conf = self.load_sysv_unit_conf(module) + if conf is not None: + return conf + except Exception as e: + logg.warning("%s not loaded: %s", module, e) + return None + def default_unit_conf(self, module, description = None): # -> conf + """ a unit conf that can be printed to the user where + attributes are empty and loaded() is False """ + data = UnitConfParser() + data.set("Unit","Id", module) + data.set("Unit", "Names", module) + data.set("Unit", "Description", description or ("NOT-FOUND " + str(module))) + # assert(not data.loaded()) + conf = SystemctlConf(data, module) + conf._root = self._root + return conf + def get_unit_conf(self, module): # -> conf (conf | default-conf) + """ accept that a unit does not exist + and return a unit conf that says 'not-loaded' """ + conf = self.load_unit_conf(module) + if conf is not None: + return conf + return self.default_unit_conf(module) + def match_sysd_templates(self, modules = None, suffix=".service"): # -> generate[ unit ] + """ make a file glob on all known template units (systemd areas). + It returns no modules (!!) if no modules pattern were given. + The module string should contain an instance name already. """ + modules = to_list(modules) + if not modules: + return + self.scan_unit_sysd_files() + for item in sorted(self._file_for_unit_sysd.keys()): + if "@" not in item: + continue + service_unit = parse_unit(item) + for module in modules: + if "@" not in module: + continue + module_unit = parse_unit(module) + if service_unit.prefix == module_unit.prefix: + yield "%s@%s.%s" % (service_unit.prefix, module_unit.instance, service_unit.suffix) + def match_sysd_units(self, modules = None, suffix=".service"): # -> generate[ unit ] + """ make a file glob on all known units (systemd areas). + It returns all modules if no modules pattern were given. + Also a single string as one module pattern may be given. """ + modules = to_list(modules) + self.scan_unit_sysd_files() + for item in sorted(self._file_for_unit_sysd.keys()): + if not modules: + yield item + elif [ module for module in modules if fnmatch.fnmatchcase(item, module) ]: + yield item + elif [ module for module in modules if module+suffix == item ]: + yield item + def match_sysv_units(self, modules = None, suffix=".service"): # -> generate[ unit ] + """ make a file glob on all known units (sysv areas). + It returns all modules if no modules pattern were given. + Also a single string as one module pattern may be given. """ + modules = to_list(modules) + self.scan_unit_sysv_files() + for item in sorted(self._file_for_unit_sysv.keys()): + if not modules: + yield item + elif [ module for module in modules if fnmatch.fnmatchcase(item, module) ]: + yield item + elif [ module for module in modules if module+suffix == item ]: + yield item + def match_units(self, modules = None, suffix=".service"): # -> [ units,.. ] + """ Helper for about any command with multiple units which can + actually be glob patterns on their respective unit name. + It returns all modules if no modules pattern were given. + Also a single string as one module pattern may be given. """ + found = [] + for unit in self.match_sysd_units(modules, suffix): + if unit not in found: + found.append(unit) + for unit in self.match_sysd_templates(modules, suffix): + if unit not in found: + found.append(unit) + for unit in self.match_sysv_units(modules, suffix): + if unit not in found: + found.append(unit) + return found + def list_service_unit_basics(self): + """ show all the basic loading state of services """ + filename = self.unit_file() # scan all + result = [] + for name, value in self._file_for_unit_sysd.items(): + result += [ (name, "SysD", value) ] + for name, value in self._file_for_unit_sysv.items(): + result += [ (name, "SysV", value) ] + return result + def list_service_units(self, *modules): # -> [ (unit,loaded+active+substate,description) ] + """ show all the service units """ + result = {} + active = {} + substate = {} + description = {} + for unit in self.match_units(modules): + result[unit] = "not-found" + active[unit] = "inactive" + substate[unit] = "dead" + description[unit] = "" + try: + conf = self.get_unit_conf(unit) + result[unit] = "loaded" + description[unit] = self.get_description_from(conf) + active[unit] = self.get_active_from(conf) + substate[unit] = self.get_substate_from(conf) + except Exception as e: + logg.warning("list-units: %s", e) + if self._unit_state: + if self._unit_state not in [ result[unit], active[unit], substate[unit] ]: + del result[unit] + return [ (unit, result[unit] + " " + active[unit] + " " + substate[unit], description[unit]) for unit in sorted(result) ] + def show_list_units(self, *modules): # -> [ (unit,loaded,description) ] + """ [PATTERN]... -- List loaded units. + If one or more PATTERNs are specified, only units matching one of + them are shown. NOTE: This is the default command.""" + hint = "To show all installed unit files use 'systemctl list-unit-files'." + result = self.list_service_units(*modules) + if self._no_legend: + return result + found = "%s loaded units listed." % len(result) + return result + [ "", found, hint ] + def list_service_unit_files(self, *modules): # -> [ (unit,enabled) ] + """ show all the service units and the enabled status""" + logg.debug("list service unit files for %s", modules) + result = {} + enabled = {} + for unit in self.match_units(modules): + result[unit] = None + enabled[unit] = "" + try: + conf = self.get_unit_conf(unit) + if self.not_user_conf(conf): + result[unit] = None + continue + result[unit] = conf + enabled[unit] = self.enabled_from(conf) + except Exception as e: + logg.warning("list-units: %s", e) + return [ (unit, enabled[unit]) for unit in sorted(result) if result[unit] ] + def each_target_file(self): + folders = self.system_folders() + if self.user_mode(): + folders = self.user_folders() + for folder in folders: + if not os.path.isdir(folder): + continue + for filename in os.listdir(folder): + if filename.endswith(".target"): + yield (filename, os.path.join(folder, filename)) + def list_target_unit_files(self, *modules): # -> [ (unit,enabled) ] + """ show all the target units and the enabled status""" + enabled = {} + targets = {} + for target, filepath in self.each_target_file(): + logg.info("target %s", filepath) + targets[target] = filepath + enabled[target] = "static" + for unit in _all_common_targets: + targets[unit] = None + enabled[unit] = "static" + if unit in _all_common_enabled: + enabled[unit] = "enabled" + if unit in _all_common_disabled: + enabled[unit] = "disabled" + return [ (unit, enabled[unit]) for unit in sorted(targets) ] + def show_list_unit_files(self, *modules): # -> [ (unit,enabled) ] + """[PATTERN]... -- List installed unit files + List installed unit files and their enablement state (as reported + by is-enabled). If one or more PATTERNs are specified, only units + whose filename (just the last component of the path) matches one of + them are shown. This command reacts to limitations of --type being + --type=service or --type=target (and --now for some basics).""" + if self._now: + result = self.list_service_unit_basics() + elif self._unit_type == "target": + result = self.list_target_unit_files() + elif self._unit_type == "service": + result = self.list_service_unit_files() + elif self._unit_type: + logg.warning("unsupported unit --type=%s", self._unit_type) + result = [] + else: + result = self.list_target_unit_files() + result += self.list_service_unit_files(*modules) + if self._no_legend: + return result + found = "%s unit files listed." % len(result) + return [ ("UNIT FILE", "STATE") ] + result + [ "", found ] + ## + ## + def get_description(self, unit, default = None): + return self.get_description_from(self.load_unit_conf(unit)) + def get_description_from(self, conf, default = None): # -> text + """ Unit.Description could be empty sometimes """ + if not conf: return default or "" + description = conf.get("Unit", "Description", default or "") + return self.expand_special(description, conf) + def read_pid_file(self, pid_file, default = None): + pid = default + if not pid_file: + return default + if not os.path.isfile(pid_file): + return default + if self.truncate_old(pid_file): + return default + try: + # some pid-files from applications contain multiple lines + for line in open(pid_file): + if line.strip(): + pid = to_int(line.strip()) + break + except Exception as e: + logg.warning("bad read of pid file '%s': %s", pid_file, e) + return pid + def wait_pid_file(self, pid_file, timeout = None): # -> pid? + """ wait some seconds for the pid file to appear and return the pid """ + timeout = int(timeout or (DefaultTimeoutStartSec/2)) + timeout = max(timeout, (MinimumTimeoutStartSec)) + dirpath = os.path.dirname(os.path.abspath(pid_file)) + for x in xrange(timeout): + if not os.path.isdir(dirpath): + time.sleep(1) # until TimeoutStartSec/2 + continue + pid = self.read_pid_file(pid_file) + if not pid: + time.sleep(1) # until TimeoutStartSec/2 + continue + if not pid_exists(pid): + time.sleep(1) # until TimeoutStartSec/2 + continue + return pid + return None + def test_pid_file(self, unit): # -> text + """ support for the testsuite.py """ + conf = self.get_unit_conf(unit) + return self.pid_file_from(conf) or self.status_file_from(conf) + def pid_file_from(self, conf, default = ""): + """ get the specified pid file path (not a computed default) """ + pid_file = conf.get("Service", "PIDFile", default) + return self.expand_special(pid_file, conf) + def read_mainpid_from(self, conf, default): + """ MAINPID is either the PIDFile content written from the application + or it is the value in the status file written by this systemctl.py code """ + pid_file = self.pid_file_from(conf) + if pid_file: + return self.read_pid_file(pid_file, default) + status = self.read_status_from(conf) + return status.get("MainPID", default) + def clean_pid_file_from(self, conf): + pid_file = self.pid_file_from(conf) + if pid_file and os.path.isfile(pid_file): + try: + os.remove(pid_file) + except OSError as e: + logg.warning("while rm %s: %s", pid_file, e) + self.write_status_from(conf, MainPID=None) + def get_status_file(self, unit): # for testing + conf = self.get_unit_conf(unit) + return self.status_file_from(conf) + def status_file_from(self, conf, default = None): + if default is None: + default = self.default_status_file(conf) + if conf is None: return default + status_file = conf.get("Service", "StatusFile", default) + # this not a real setting, but do the expand_special anyway + return self.expand_special(status_file, conf) + def default_status_file(self, conf): # -> text + """ default file pattern where to store a status mark """ + folder = conf.os_path_var(self._pid_file_folder) + name = "%s.status" % conf.name() + return os.path.join(folder, name) + def clean_status_from(self, conf): + status_file = self.status_file_from(conf) + if os.path.exists(status_file): + os.remove(status_file) + conf.status = {} + def write_status_from(self, conf, **status): # -> bool(written) + """ if a status_file is known then path is created and the + give status is written as the only content. """ + status_file = self.status_file_from(conf) + if not status_file: + logg.debug("status %s but no status_file", conf.name()) + return False + dirpath = os.path.dirname(os.path.abspath(status_file)) + if not os.path.isdir(dirpath): + os.makedirs(dirpath) + if conf.status is None: + conf.status = self.read_status_from(conf) + if True: + for key in sorted(status.keys()): + value = status[key] + if key.upper() == "AS": key = "ActiveState" + if key.upper() == "EXIT": key = "ExecMainCode" + if value is None: + try: del conf.status[key] + except KeyError: pass + else: + conf.status[key] = value + try: + with open(status_file, "w") as f: + for key in sorted(conf.status): + value = conf.status[key] + if key == "MainPID" and str(value) == "0": + logg.warning("ignore writing MainPID=0") + continue + content = "{}={}\n".format(key, str(value)) + logg.debug("writing to %s\n\t%s", status_file, content.strip()) + f.write(content) + except IOError as e: + logg.error("writing STATUS %s: %s\n\t to status file %s", status, e, status_file) + return True + def read_status_from(self, conf, defaults = None): + status_file = self.status_file_from(conf) + status = {} + if hasattr(defaults, "keys"): + for key in defaults.keys(): + status[key] = defaults[key] + elif isinstance(defaults, string_types): + status["ActiveState"] = defaults + if not status_file: + logg.debug("no status file. returning %s", status) + return status + if not os.path.isfile(status_file): + logg.debug("no status file: %s\n returning %s", status_file, status) + return status + if self.truncate_old(status_file): + logg.debug("old status file: %s\n returning %s", status_file, status) + return status + try: + logg.debug("reading %s", status_file) + for line in open(status_file): + if line.strip(): + m = re.match(r"(\w+)[:=](.*)", line) + if m: + key, value = m.group(1), m.group(2) + if key.strip(): + status[key.strip()] = value.strip() + elif line in [ "active", "inactive", "failed"]: + status["ActiveState"] = line + else: + logg.warning("ignored %s", line.strip()) + except: + logg.warning("bad read of status file '%s'", status_file) + return status + def get_status_from(self, conf, name, default = None): + if conf.status is None: + conf.status = self.read_status_from(conf) + return conf.status.get(name, default) + def set_status_from(self, conf, name, value): + if conf.status is None: + conf.status = self.read_status_from(conf) + if value is None: + try: del conf.status[name] + except KeyError: pass + else: + conf.status[name] = value + # + def wait_boot(self, hint = None): + booted = self.get_boottime() + while True: + now = time.time() + if booted + EpsilonTime <= now: + break + time.sleep(EpsilonTime) + logg.info(" %s ................. boot sleep %ss", hint or "", EpsilonTime) + def get_boottime(self): + if "oldest" in COVERAGE: + return self.get_boottime_oldest() + for pid in xrange(10): + proc = "/proc/%s/status" % pid + try: + if os.path.exists(proc): + return os.path.getmtime(proc) + except Exception as e: # pragma: nocover + logg.warning("could not access %s: %s", proc, e) + return self.get_boottime_oldest() + def get_boottime_oldest(self): + # otherwise get the oldest entry in /proc + booted = time.time() + for name in os.listdir("/proc"): + proc = "/proc/%s/status" % name + try: + if os.path.exists(proc): + ctime = os.path.getmtime(proc) + if ctime < booted: + booted = ctime + except Exception as e: # pragma: nocover + logg.warning("could not access %s: %s", proc, e) + return booted + def get_filetime(self, filename): + return os.path.getmtime(filename) + def truncate_old(self, filename): + filetime = self.get_filetime(filename) + boottime = self.get_boottime() + if isinstance(filetime, float): + filetime -= EpsilonTime + if filetime >= boottime : + logg.debug(" file time: %s", datetime.datetime.fromtimestamp(filetime)) + logg.debug(" boot time: %s", datetime.datetime.fromtimestamp(boottime)) + return False # OK + logg.info("truncate old %s", filename) + logg.info(" file time: %s", datetime.datetime.fromtimestamp(filetime)) + logg.info(" boot time: %s", datetime.datetime.fromtimestamp(boottime)) + try: + shutil_truncate(filename) + except Exception as e: + logg.warning("while truncating: %s", e) + return True # truncated + def getsize(self, filename): + if not filename: + return 0 + if not os.path.isfile(filename): + return 0 + if self.truncate_old(filename): + return 0 + try: + return os.path.getsize(filename) + except Exception as e: + logg.warning("while reading file size: %s\n of %s", e, filename) + return 0 + # + def read_env_file(self, env_file): # -> generate[ (name,value) ] + """ EnvironmentFile= is being scanned """ + if env_file.startswith("-"): + env_file = env_file[1:] + if not os.path.isfile(os_path(self._root, env_file)): + return + try: + for real_line in open(os_path(self._root, env_file)): + line = real_line.strip() + if not line or line.startswith("#"): + continue + m = re.match(r"(?:export +)?([\w_]+)[=]'([^']*)'", line) + if m: + yield m.group(1), m.group(2) + continue + m = re.match(r'(?:export +)?([\w_]+)[=]"([^"]*)"', line) + if m: + yield m.group(1), m.group(2) + continue + m = re.match(r'(?:export +)?([\w_]+)[=](.*)', line) + if m: + yield m.group(1), m.group(2) + continue + except Exception as e: + logg.info("while reading %s: %s", env_file, e) + def read_env_part(self, env_part): # -> generate[ (name, value) ] + """ Environment== is being scanned """ + ## systemd Environment= spec says it is a space-seperated list of + ## assignments. In order to use a space or an equals sign in a value + ## one should enclose the whole assignment with double quotes: + ## Environment="VAR1=word word" VAR2=word3 "VAR3=$word 5 6" + ## and the $word is not expanded by other environment variables. + try: + for real_line in env_part.split("\n"): + line = real_line.strip() + for found in re.finditer(r'\s*("[\w_]+=[^"]*"|[\w_]+=\S*)', line): + part = found.group(1) + if part.startswith('"'): + part = part[1:-1] + name, value = part.split("=", 1) + yield name, value + except Exception as e: + logg.info("while reading %s: %s", env_part, e) + def show_environment(self, unit): + """ [UNIT]. -- show environment parts """ + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if _unit_property: + return conf.getlist("Service", _unit_property) + return self.get_env(conf) + def extra_vars(self): + return self._extra_vars # from command line + def get_env(self, conf): + env = os.environ.copy() + for env_part in conf.getlist("Service", "Environment", []): + for name, value in self.read_env_part(self.expand_special(env_part, conf)): + env[name] = value # a '$word' is not special here + for env_file in conf.getlist("Service", "EnvironmentFile", []): + for name, value in self.read_env_file(self.expand_special(env_file, conf)): + env[name] = self.expand_env(value, env) + logg.debug("extra-vars %s", self.extra_vars()) + for extra in self.extra_vars(): + if extra.startswith("@"): + for name, value in self.read_env_file(extra[1:]): + logg.info("override %s=%s", name, value) + env[name] = self.expand_env(value, env) + else: + for name, value in self.read_env_part(extra): + logg.info("override %s=%s", name, value) + env[name] = value # a '$word' is not special here + return env + def expand_env(self, cmd, env): + def get_env1(m): + if m.group(1) in env: + return env[m.group(1)] + logg.debug("can not expand $%s", m.group(1)) + return "" # empty string + def get_env2(m): + if m.group(1) in env: + return env[m.group(1)] + logg.debug("can not expand ${%s}", m.group(1)) + return "" # empty string + # + maxdepth = 20 + expanded = re.sub("[$](\w+)", lambda m: get_env1(m), cmd.replace("\\\n","")) + for depth in xrange(maxdepth): + new_text = re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), expanded) + if new_text == expanded: + return expanded + expanded = new_text + logg.error("shell variable expansion exceeded maxdepth %s", maxdepth) + return expanded + def expand_special(self, cmd, conf = None): + """ expand %i %t and similar special vars. They are being expanded + before any other expand_env takes place which handles shell-style + $HOME references. """ + def sh_escape(value): + return "'" + value.replace("'","\\'") + "'" + def get_confs(conf): + confs={ "%": "%" } + if not conf: + return confs + unit = parse_unit(conf.name()) + confs["N"] = unit.name + confs["n"] = sh_escape(unit.name) + confs["P"] = unit.prefix + confs["p"] = sh_escape(unit.prefix) + confs["I"] = unit.instance + confs["i"] = sh_escape(unit.instance) + confs["J"] = unit.component + confs["j"] = sh_escape(unit.component) + confs["f"] = sh_escape(conf.filename()) + VARTMP = "/var/tmp" + TMP = "/tmp" + RUN = "/run" + DAT = "/var/lib" + LOG = "/var/log" + CACHE = "/var/cache" + CONFIG = "/etc" + HOME = "/root" + USER = "root" + UID = 0 + SHELL = "/bin/sh" + if self.is_user_conf(conf): + USER = os_getlogin() + HOME = get_home() + RUN = os.environ.get("XDG_RUNTIME_DIR", get_runtime_dir()) + CONFIG = os.environ.get("XDG_CONFIG_HOME", HOME + "/.config") + CACHE = os.environ.get("XDG_CACHE_HOME", HOME + "/.cache") + SHARE = os.environ.get("XDG_DATA_HOME", HOME + "/.local/share") + DAT = CONFIG + LOG = os.path.join(CONFIG, "log") + SHELL = os.environ.get("SHELL", SHELL) + VARTMP = os.environ.get("TMPDIR", os.environ.get("TEMP", os.environ.get("TMP", VARTMP))) + TMP = os.environ.get("TMPDIR", os.environ.get("TEMP", os.environ.get("TMP", TMP))) + confs["V"] = os_path(self._root, VARTMP) + confs["T"] = os_path(self._root, TMP) + confs["t"] = os_path(self._root, RUN) + confs["S"] = os_path(self._root, DAT) + confs["s"] = SHELL + confs["h"] = HOME + confs["u"] = USER + confs["C"] = os_path(self._root, CACHE) + confs["E"] = os_path(self._root, CONFIG) + return confs + def get_conf1(m): + confs = get_confs(conf) + if m.group(1) in confs: + return confs[m.group(1)] + logg.warning("can not expand %%%s", m.group(1)) + return "''" # empty escaped string + return re.sub("[%](.)", lambda m: get_conf1(m), cmd) + def exec_cmd(self, cmd, env, conf = None): + """ expand ExecCmd statements including %i and $MAINPID """ + cmd1 = cmd.replace("\\\n","") + # according to documentation the %n / %% need to be expanded where in + # most cases they are shell-escaped values. So we do it before shlex. + cmd2 = self.expand_special(cmd1, conf) + # according to documentation, when bar="one two" then the expansion + # of '$bar' is ["one","two"] and '${bar}' becomes ["one two"]. We + # tackle that by expand $bar before shlex, and the rest thereafter. + def get_env1(m): + if m.group(1) in env: + return env[m.group(1)] + logg.debug("can not expand $%s", m.group(1)) + return "" # empty string + def get_env2(m): + if m.group(1) in env: + return env[m.group(1)] + logg.debug("can not expand ${%s}", m.group(1)) + return "" # empty string + cmd3 = re.sub("[$](\w+)", lambda m: get_env1(m), cmd2) + newcmd = [] + for part in shlex.split(cmd3): + newcmd += [ re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), part) ] + return newcmd + def path_journal_log(self, conf): # never None + """ /var/log/zzz.service.log or /var/log/default.unit.log """ + filename = os.path.basename(conf.filename() or "") + unitname = (conf.name() or "default")+".unit" + name = filename or unitname + log_folder = conf.os_path_var(self._journal_log_folder) + log_file = name.replace(os.path.sep,".") + ".log" + if log_file.startswith("."): + log_file = "dot."+log_file + return os.path.join(log_folder, log_file) + def open_journal_log(self, conf): + log_file = self.path_journal_log(conf) + log_folder = os.path.dirname(log_file) + if not os.path.isdir(log_folder): + os.makedirs(log_folder) + return open(os.path.join(log_file), "a") + def chdir_workingdir(self, conf): + """ if specified then change the working directory """ + # the original systemd will start in '/' even if User= is given + if self._root: + os.chdir(self._root) + workingdir = conf.get("Service", "WorkingDirectory", "") + if workingdir: + ignore = False + if workingdir.startswith("-"): + workingdir = workingdir[1:] + ignore = True + into = os_path(self._root, self.expand_special(workingdir, conf)) + try: + logg.debug("chdir workingdir '%s'", into) + os.chdir(into) + return False + except Exception as e: + if not ignore: + logg.error("chdir workingdir '%s': %s", into, e) + return into + else: + logg.debug("chdir workingdir '%s': %s", into, e) + return None + return None + def notify_socket_from(self, conf, socketfile = None): + """ creates a notify-socket for the (non-privileged) user """ + NotifySocket = collections.namedtuple("NotifySocket", ["socket", "socketfile" ]) + notify_socket_folder = conf.os_path_var(_notify_socket_folder) + notify_name = "notify." + str(conf.name() or "systemctl") + notify_socket = os.path.join(notify_socket_folder, notify_name) + socketfile = socketfile or notify_socket + if len(socketfile) > 100: + logg.debug("https://unix.stackexchange.com/questions/367008/%s", + "why-is-socket-path-length-limited-to-a-hundred-chars") + logg.debug("old notify socketfile (%s) = %s", len(socketfile), socketfile) + notify_socket_folder = re.sub("^(/var)?", get_runtime_dir(), _notify_socket_folder) + notify_name = notify_name[0:min(100-len(notify_socket_folder),len(notify_name))] + socketfile = os.path.join(notify_socket_folder, notify_name) + # occurs during testsuite.py for ~user/test.tmp/root path + logg.info("new notify socketfile (%s) = %s", len(socketfile), socketfile) + try: + if not os.path.isdir(os.path.dirname(socketfile)): + os.makedirs(os.path.dirname(socketfile)) + if os.path.exists(socketfile): + os.unlink(socketfile) + except Exception as e: + logg.warning("error %s: %s", socketfile, e) + sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) + sock.bind(socketfile) + os.chmod(socketfile, 0o777) # the service my run under some User=setting + return NotifySocket(sock, socketfile) + def read_notify_socket(self, notify, timeout): + notify.socket.settimeout(timeout or DefaultMaximumTimeout) + result = "" + try: + result, client_address = notify.socket.recvfrom(4096) + if result: + result = result.decode("utf-8") + result_txt = result.replace("\n","|") + result_len = len(result) + logg.debug("read_notify_socket(%s):%s", result_len, result_txt) + except socket.timeout as e: + if timeout > 2: + logg.debug("socket.timeout %s", e) + return result + def wait_notify_socket(self, notify, timeout, pid = None): + if not os.path.exists(notify.socketfile): + logg.info("no $NOTIFY_SOCKET exists") + return {} + # + logg.info("wait $NOTIFY_SOCKET, timeout %s", timeout) + results = {} + seenREADY = None + for attempt in xrange(timeout+1): + if pid and not self.is_active_pid(pid): + logg.info("dead PID %s", pid) + return results + if not attempt: # first one + time.sleep(1) # until TimeoutStartSec + continue + result = self.read_notify_socket(notify, 1) # sleep max 1 second + if not result: # timeout + time.sleep(1) # until TimeoutStartSec + continue + for name, value in self.read_env_part(result): + results[name] = value + if name == "READY": + seenREADY = value + if name in ["STATUS", "ACTIVESTATE"]: + logg.debug("%s: %s", name, value) # TODO: update STATUS -> SubState + if seenREADY: + break + if not seenREADY: + logg.info(".... timeout while waiting for 'READY=1' status on $NOTIFY_SOCKET") + logg.debug("notify = %s", results) + try: + notify.socket.close() + except Exception as e: + logg.debug("socket.close %s", e) + return results + def start_modules(self, *modules): + """ [UNIT]... -- start these units + /// SPECIAL: with --now or --init it will + run the init-loop and stop the units afterwards """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + init = self._now or self._init + return self.start_units(units, init) and found_all + def start_units(self, units, init = None): + """ fails if any unit does not start + /// SPECIAL: may run the init-loop and + stop the named units afterwards """ + self.wait_system() + done = True + started_units = [] + for unit in self.sortedAfter(units): + started_units.append(unit) + if not self.start_unit(unit): + done = False + if init: + logg.info("init-loop start") + sig = self.init_loop_until_stop(started_units) + logg.info("init-loop %s", sig) + for unit in reversed(started_units): + self.stop_unit(unit) + return done + def start_unit(self, unit): + conf = self.load_unit_conf(unit) + if conf is None: + logg.debug("unit could not be loaded (%s)", unit) + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.start_unit_from(conf) + def get_TimeoutStartSec(self, conf): + timeout = conf.get("Service", "TimeoutSec", DefaultTimeoutStartSec) + timeout = conf.get("Service", "TimeoutStartSec", timeout) + return time_to_seconds(timeout, DefaultMaximumTimeout) + def start_unit_from(self, conf): + if not conf: return False + if self.syntax_check(conf) > 100: return False + with waitlock(conf): + logg.debug(" start unit %s => %s", conf.name(), conf.filename()) + return self.do_start_unit_from(conf) + def do_start_unit_from(self, conf): + timeout = self.get_TimeoutStartSec(conf) + doRemainAfterExit = conf.getbool("Service", "RemainAfterExit", "no") + runs = conf.get("Service", "Type", "simple").lower() + env = self.get_env(conf) + self.exec_check_service(conf, env, "Exec") # all... + # for StopPost on failure: + returncode = 0 + service_result = "success" + if True: + if runs in [ "simple", "forking", "notify" ]: + env["MAINPID"] = str(self.read_mainpid_from(conf, "")) + for cmd in conf.getlist("Service", "ExecStartPre", []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info(" pre-start %s", shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + logg.debug(" pre-start done (%s) <-%s>", + run.returncode or "OK", run.signal or "") + if run.returncode and check: + logg.error("the ExecStartPre control process exited with error code") + active = "failed" + self.write_status_from(conf, AS=active ) + return False + if runs in [ "sysv" ]: + status_file = self.status_file_from(conf) + if True: + exe = conf.filename() + cmd = "'%s' start" % exe + env["SYSTEMCTL_SKIP_REDIRECT"] = "yes" + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s start %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: # pragma: no cover + os.setsid() # detach child process from parent + self.execve_from(conf, newcmd, env) + run = subprocess_waitpid(forkpid) + self.set_status_from(conf, "ExecMainCode", run.returncode) + logg.info("%s start done (%s) <-%s>", runs, + run.returncode or "OK", run.signal or "") + active = run.returncode and "failed" or "active" + self.write_status_from(conf, AS=active ) + return True + elif runs in [ "oneshot" ]: + status_file = self.status_file_from(conf) + if self.get_status_from(conf, "ActiveState", "unknown") == "active": + logg.warning("the service was already up once") + return True + for cmd in conf.getlist("Service", "ExecStart", []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s start %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: # pragma: no cover + os.setsid() # detach child process from parent + self.execve_from(conf, newcmd, env) + run = subprocess_waitpid(forkpid) + if run.returncode and check: + returncode = run.returncode + service_result = "failed" + logg.error("%s start %s (%s) <-%s>", runs, service_result, + run.returncode or "OK", run.signal or "") + break + logg.info("%s start done (%s) <-%s>", runs, + run.returncode or "OK", run.signal or "") + if True: + self.set_status_from(conf, "ExecMainCode", returncode) + active = returncode and "failed" or "active" + self.write_status_from(conf, AS=active) + elif runs in [ "simple" ]: + status_file = self.status_file_from(conf) + pid = self.read_mainpid_from(conf, "") + if self.is_active_pid(pid): + logg.warning("the service is already running on PID %s", pid) + return True + if doRemainAfterExit: + logg.debug("%s RemainAfterExit -> AS=active", runs) + self.write_status_from(conf, AS="active") + cmdlist = conf.getlist("Service", "ExecStart", []) + for idx, cmd in enumerate(cmdlist): + logg.debug("ExecStart[%s]: %s", idx, cmd) + for cmd in cmdlist: + pid = self.read_mainpid_from(conf, "") + env["MAINPID"] = str(pid) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s start %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: # pragma: no cover + os.setsid() # detach child process from parent + self.execve_from(conf, newcmd, env) + self.write_status_from(conf, MainPID=forkpid) + logg.info("%s started PID %s", runs, forkpid) + env["MAINPID"] = str(forkpid) + time.sleep(MinimumYield) + run = subprocess_testpid(forkpid) + if run.returncode is not None: + logg.info("%s stopped PID %s (%s) <-%s>", runs, run.pid, + run.returncode or "OK", run.signal or "") + if doRemainAfterExit: + self.set_status_from(conf, "ExecMainCode", run.returncode) + active = run.returncode and "failed" or "active" + self.write_status_from(conf, AS=active) + if run.returncode: + service_result = "failed" + break + elif runs in [ "notify" ]: + # "notify" is the same as "simple" but we create a $NOTIFY_SOCKET + # and wait for startup completion by checking the socket messages + pid = self.read_mainpid_from(conf, "") + if self.is_active_pid(pid): + logg.error("the service is already running on PID %s", pid) + return False + notify = self.notify_socket_from(conf) + if notify: + env["NOTIFY_SOCKET"] = notify.socketfile + logg.debug("use NOTIFY_SOCKET=%s", notify.socketfile) + if doRemainAfterExit: + logg.debug("%s RemainAfterExit -> AS=active", runs) + self.write_status_from(conf, AS="active") + cmdlist = conf.getlist("Service", "ExecStart", []) + for idx, cmd in enumerate(cmdlist): + logg.debug("ExecStart[%s]: %s", idx, cmd) + mainpid = None + for cmd in cmdlist: + mainpid = self.read_mainpid_from(conf, "") + env["MAINPID"] = str(mainpid) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s start %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: # pragma: no cover + os.setsid() # detach child process from parent + self.execve_from(conf, newcmd, env) + # via NOTIFY # self.write_status_from(conf, MainPID=forkpid) + logg.info("%s started PID %s", runs, forkpid) + mainpid = forkpid + self.write_status_from(conf, MainPID=mainpid) + env["MAINPID"] = str(mainpid) + time.sleep(MinimumYield) + run = subprocess_testpid(forkpid) + if run.returncode is not None: + logg.info("%s stopped PID %s (%s) <-%s>", runs, run.pid, + run.returncode or "OK", run.signal or "") + if doRemainAfterExit: + self.set_status_from(conf, "ExecMainCode", run.returncode or 0) + active = run.returncode and "failed" or "active" + self.write_status_from(conf, AS=active) + if run.returncode: + service_result = "failed" + break + if service_result in [ "success" ] and mainpid: + logg.debug("okay, wating on socket for %ss", timeout) + results = self.wait_notify_socket(notify, timeout, mainpid) + if "MAINPID" in results: + new_pid = results["MAINPID"] + if new_pid and to_int(new_pid) != mainpid: + logg.info("NEW PID %s from sd_notify (was PID %s)", new_pid, mainpid) + self.write_status_from(conf, MainPID=new_pid) + mainpid = new_pid + logg.info("%s start done %s", runs, mainpid) + pid = self.read_mainpid_from(conf, "") + if pid: + env["MAINPID"] = str(pid) + else: + service_result = "timeout" # "could not start service" + elif runs in [ "forking" ]: + pid_file = self.pid_file_from(conf) + for cmd in conf.getlist("Service", "ExecStart", []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + if not newcmd: continue + logg.info("%s start %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: # pragma: no cover + os.setsid() # detach child process from parent + self.execve_from(conf, newcmd, env) + logg.info("%s started PID %s", runs, forkpid) + run = subprocess_waitpid(forkpid) + if run.returncode and check: + returncode = run.returncode + service_result = "failed" + logg.info("%s stopped PID %s (%s) <-%s>", runs, run.pid, + run.returncode or "OK", run.signal or "") + if pid_file and service_result in [ "success" ]: + pid = self.wait_pid_file(pid_file) # application PIDFile + logg.info("%s start done PID %s [%s]", runs, pid, pid_file) + if pid: + env["MAINPID"] = str(pid) + if not pid_file: + time.sleep(MinimumTimeoutStartSec) + logg.warning("No PIDFile for forking %s", conf.filename()) + status_file = self.status_file_from(conf) + self.set_status_from(conf, "ExecMainCode", returncode) + active = returncode and "failed" or "active" + self.write_status_from(conf, AS=active) + else: + logg.error("unsupported run type '%s'", runs) + return False + # POST sequence + active = self.is_active_from(conf) + if not active: + logg.warning("%s start not active", runs) + # according to the systemd documentation, a failed start-sequence + # should execute the ExecStopPost sequence allowing some cleanup. + env["SERVICE_RESULT"] = service_result + for cmd in conf.getlist("Service", "ExecStopPost", []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("post-fail %s", shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + logg.debug("post-fail done (%s) <-%s>", + run.returncode or "OK", run.signal or "") + return False + else: + for cmd in conf.getlist("Service", "ExecStartPost", []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("post-start %s", shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + logg.debug("post-start done (%s) <-%s>", + run.returncode or "OK", run.signal or "") + return True + def extend_exec_env(self, env): + env = env.copy() + # implant DefaultPath into $PATH + path = env.get("PATH", DefaultPath) + parts = path.split(os.pathsep) + for part in DefaultPath.split(os.pathsep): + if part and part not in parts: + parts.append(part) + env["PATH"] = str(os.pathsep).join(parts) + # reset locale to system default + for name in ResetLocale: + if name in env: + del env[name] + locale = {} + for var, val in self.read_env_file("/etc/locale.conf"): + locale[var] = val + env[var] = val + if "LANG" not in locale: + env["LANG"] = locale.get("LANGUAGE", locale.get("LC_CTYPE", "C")) + return env + def execve_from(self, conf, cmd, env): + """ this code is commonly run in a child process // returns exit-code""" + runs = conf.get("Service", "Type", "simple").lower() + logg.debug("%s process for %s", runs, conf.filename()) + inp = open("/dev/zero") + out = self.open_journal_log(conf) + os.dup2(inp.fileno(), sys.stdin.fileno()) + os.dup2(out.fileno(), sys.stdout.fileno()) + os.dup2(out.fileno(), sys.stderr.fileno()) + runuser = self.expand_special(conf.get("Service", "User", ""), conf) + rungroup = self.expand_special(conf.get("Service", "Group", ""), conf) + envs = shutil_setuid(runuser, rungroup) + badpath = self.chdir_workingdir(conf) # some dirs need setuid before + if badpath: + logg.error("(%s): bad workingdir: '%s'", shell_cmd(cmd), badpath) + sys.exit(1) + env = self.extend_exec_env(env) + env.update(envs) # set $HOME to ~$USER + try: + if "spawn" in COVERAGE: + os.spawnvpe(os.P_WAIT, cmd[0], cmd, env) + sys.exit(0) + else: # pragma: nocover + os.execve(cmd[0], cmd, env) + except Exception as e: + logg.error("(%s): %s", shell_cmd(cmd), e) + sys.exit(1) + def test_start_unit(self, unit): + """ helper function to test the code that is normally forked off """ + conf = self.load_unit_conf(unit) + env = self.get_env(conf) + for cmd in conf.getlist("Service", "ExecStart", []): + newcmd = self.exec_cmd(cmd, env, conf) + return self.execve_from(conf, newcmd, env) + return None + def stop_modules(self, *modules): + """ [UNIT]... -- stop these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.stop_units(units) and found_all + def stop_units(self, units): + """ fails if any unit fails to stop """ + self.wait_system() + done = True + for unit in self.sortedBefore(units): + if not self.stop_unit(unit): + done = False + return done + def stop_unit(self, unit): + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.stop_unit_from(conf) + + def get_TimeoutStopSec(self, conf): + timeout = conf.get("Service", "TimeoutSec", DefaultTimeoutStartSec) + timeout = conf.get("Service", "TimeoutStopSec", timeout) + return time_to_seconds(timeout, DefaultMaximumTimeout) + def stop_unit_from(self, conf): + if not conf: return False + if self.syntax_check(conf) > 100: return False + with waitlock(conf): + logg.info(" stop unit %s => %s", conf.name(), conf.filename()) + return self.do_stop_unit_from(conf) + def do_stop_unit_from(self, conf): + timeout = self.get_TimeoutStopSec(conf) + runs = conf.get("Service", "Type", "simple").lower() + env = self.get_env(conf) + self.exec_check_service(conf, env, "ExecStop") + returncode = 0 + service_result = "success" + if runs in [ "sysv" ]: + status_file = self.status_file_from(conf) + if True: + exe = conf.filename() + cmd = "'%s' stop" % exe + env["SYSTEMCTL_SKIP_REDIRECT"] = "yes" + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s stop %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + if run.returncode: + self.set_status_from(conf, "ExecStopCode", run.returncode) + self.write_status_from(conf, AS="failed") + else: + self.clean_status_from(conf) # "inactive" + return True + elif runs in [ "oneshot" ]: + status_file = self.status_file_from(conf) + if self.get_status_from(conf, "ActiveState", "unknown") == "inactive": + logg.warning("the service is already down once") + return True + for cmd in conf.getlist("Service", "ExecStop", []): + check, cmd = checkstatus(cmd) + logg.debug("{env} %s", env) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s stop %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + if run.returncode and check: + returncode = run.returncode + service_result = "failed" + break + if True: + if returncode: + self.set_status_from(conf, "ExecStopCode", returncode) + self.write_status_from(conf, AS="failed") + else: + self.clean_status_from(conf) # "inactive" + ### fallback Stop => Kill for ["simple","notify","forking"] + elif not conf.getlist("Service", "ExecStop", []): + logg.info("no ExecStop => systemctl kill") + if True: + self.do_kill_unit_from(conf) + self.clean_pid_file_from(conf) + self.clean_status_from(conf) # "inactive" + elif runs in [ "simple", "notify" ]: + status_file = self.status_file_from(conf) + size = os.path.exists(status_file) and os.path.getsize(status_file) + logg.info("STATUS %s %s", status_file, size) + pid = 0 + for cmd in conf.getlist("Service", "ExecStop", []): + check, cmd = checkstatus(cmd) + env["MAINPID"] = str(self.read_mainpid_from(conf, "")) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s stop %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + run = must_have_failed(run, newcmd) # TODO: a workaround + # self.write_status_from(conf, MainPID=run.pid) # no ExecStop + if run.returncode and check: + returncode = run.returncode + service_result = "failed" + break + pid = env.get("MAINPID",0) + if pid: + if self.wait_vanished_pid(pid, timeout): + self.clean_pid_file_from(conf) + self.clean_status_from(conf) # "inactive" + else: + logg.info("%s sleep as no PID was found on Stop", runs) + time.sleep(MinimumTimeoutStopSec) + pid = self.read_mainpid_from(conf, "") + if not pid or not pid_exists(pid) or pid_zombie(pid): + self.clean_pid_file_from(conf) + self.clean_status_from(conf) # "inactive" + elif runs in [ "forking" ]: + status_file = self.status_file_from(conf) + pid_file = self.pid_file_from(conf) + for cmd in conf.getlist("Service", "ExecStop", []): + active = self.is_active_from(conf) + if pid_file: + new_pid = self.read_mainpid_from(conf, "") + if new_pid: + env["MAINPID"] = str(new_pid) + check, cmd = checkstatus(cmd) + logg.debug("{env} %s", env) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("fork stop %s", shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + if run.returncode and check: + returncode = run.returncode + service_result = "failed" + break + pid = env.get("MAINPID",0) + if pid: + if self.wait_vanished_pid(pid, timeout): + self.clean_pid_file_from(conf) + else: + logg.info("%s sleep as no PID was found on Stop", runs) + time.sleep(MinimumTimeoutStopSec) + pid = self.read_mainpid_from(conf, "") + if not pid or not pid_exists(pid) or pid_zombie(pid): + self.clean_pid_file_from(conf) + if returncode: + if os.path.isfile(status_file): + self.set_status_from(conf, "ExecStopCode", returncode) + self.write_status_from(conf, AS="failed") + else: + self.clean_status_from(conf) # "inactive" + else: + logg.error("unsupported run type '%s'", runs) + return False + # POST sequence + active = self.is_active_from(conf) + if not active: + env["SERVICE_RESULT"] = service_result + for cmd in conf.getlist("Service", "ExecStopPost", []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("post-stop %s", shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + logg.debug("post-stop done (%s) <-%s>", + run.returncode or "OK", run.signal or "") + return service_result == "success" + def wait_vanished_pid(self, pid, timeout): + if not pid: + return True + logg.info("wait for PID %s to vanish (%ss)", pid, timeout) + for x in xrange(int(timeout)): + if not self.is_active_pid(pid): + logg.info("wait for PID %s is done (%s.)", pid, x) + return True + time.sleep(1) # until TimeoutStopSec + logg.info("wait for PID %s failed (%s.)", pid, x) + return False + def reload_modules(self, *modules): + """ [UNIT]... -- reload these units """ + self.wait_system() + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.reload_units(units) and found_all + def reload_units(self, units): + """ fails if any unit fails to reload """ + self.wait_system() + done = True + for unit in self.sortedAfter(units): + if not self.reload_unit(unit): + done = False + return done + def reload_unit(self, unit): + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.reload_unit_from(conf) + def reload_unit_from(self, conf): + if not conf: return False + if self.syntax_check(conf) > 100: return False + with waitlock(conf): + logg.info(" reload unit %s => %s", conf.name(), conf.filename()) + return self.do_reload_unit_from(conf) + def do_reload_unit_from(self, conf): + runs = conf.get("Service", "Type", "simple").lower() + env = self.get_env(conf) + self.exec_check_service(conf, env, "ExecReload") + if runs in [ "sysv" ]: + status_file = self.status_file_from(conf) + if True: + exe = conf.filename() + cmd = "'%s' reload" % exe + env["SYSTEMCTL_SKIP_REDIRECT"] = "yes" + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s reload %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + self.set_status_from(conf, "ExecReloadCode", run.returncode) + if run.returncode: + self.write_status_from(conf, AS="failed") + return False + else: + self.write_status_from(conf, AS="active") + return True + elif runs in [ "simple", "notify", "forking" ]: + if not self.is_active_from(conf): + logg.info("no reload on inactive service %s", conf.name()) + return True + for cmd in conf.getlist("Service", "ExecReload", []): + env["MAINPID"] = str(self.read_mainpid_from(conf, "")) + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + logg.info("%s reload %s", runs, shell_cmd(newcmd)) + forkpid = os.fork() + if not forkpid: + self.execve_from(conf, newcmd, env) # pragma: nocover + run = subprocess_waitpid(forkpid) + if check and run.returncode: + logg.error("Job for %s failed because the control process exited with error code. (%s)", + conf.name(), run.returncode) + return False + time.sleep(MinimumYield) + return True + elif runs in [ "oneshot" ]: + logg.debug("ignored run type '%s' for reload", runs) + return True + else: + logg.error("unsupported run type '%s'", runs) + return False + def restart_modules(self, *modules): + """ [UNIT]... -- restart these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.restart_units(units) and found_all + def restart_units(self, units): + """ fails if any unit fails to restart """ + self.wait_system() + done = True + for unit in self.sortedAfter(units): + if not self.restart_unit(unit): + done = False + return done + def restart_unit(self, unit): + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.restart_unit_from(conf) + def restart_unit_from(self, conf): + if not conf: return False + if self.syntax_check(conf) > 100: return False + with waitlock(conf): + logg.info(" restart unit %s => %s", conf.name(), conf.filename()) + if not self.is_active_from(conf): + return self.do_start_unit_from(conf) + else: + return self.do_restart_unit_from(conf) + def do_restart_unit_from(self, conf): + logg.info("(restart) => stop/start") + self.do_stop_unit_from(conf) + return self.do_start_unit_from(conf) + def try_restart_modules(self, *modules): + """ [UNIT]... -- try-restart these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.try_restart_units(units) and found_all + def try_restart_units(self, units): + """ fails if any module fails to try-restart """ + self.wait_system() + done = True + for unit in self.sortedAfter(units): + if not self.try_restart_unit(unit): + done = False + return done + def try_restart_unit(self, unit): + """ only do 'restart' if 'active' """ + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + with waitlock(conf): + logg.info(" try-restart unit %s => %s", conf.name(), conf.filename()) + if self.is_active_from(conf): + return self.do_restart_unit_from(conf) + return True + def reload_or_restart_modules(self, *modules): + """ [UNIT]... -- reload-or-restart these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.reload_or_restart_units(units) and found_all + def reload_or_restart_units(self, units): + """ fails if any unit does not reload-or-restart """ + self.wait_system() + done = True + for unit in self.sortedAfter(units): + if not self.reload_or_restart_unit(unit): + done = False + return done + def reload_or_restart_unit(self, unit): + """ do 'reload' if specified, otherwise do 'restart' """ + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.reload_or_restart_unit_from(conf) + def reload_or_restart_unit_from(self, conf): + """ do 'reload' if specified, otherwise do 'restart' """ + if not conf: return False + with waitlock(conf): + logg.info(" reload-or-restart unit %s => %s", conf.name(), conf.filename()) + return self.do_reload_or_restart_unit_from(conf) + def do_reload_or_restart_unit_from(self, conf): + if not self.is_active_from(conf): + # try: self.stop_unit_from(conf) + # except Exception as e: pass + return self.do_start_unit_from(conf) + elif conf.getlist("Service", "ExecReload", []): + logg.info("found service to have ExecReload -> 'reload'") + return self.do_reload_unit_from(conf) + else: + logg.info("found service without ExecReload -> 'restart'") + return self.do_restart_unit_from(conf) + def reload_or_try_restart_modules(self, *modules): + """ [UNIT]... -- reload-or-try-restart these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.reload_or_try_restart_units(units) and found_all + def reload_or_try_restart_units(self, units): + """ fails if any unit fails to reload-or-try-restart """ + self.wait_system() + done = True + for unit in self.sortedAfter(units): + if not self.reload_or_try_restart_unit(unit): + done = False + return done + def reload_or_try_restart_unit(self, unit): + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.reload_or_try_restart_unit_from(conf) + def reload_or_try_restart_unit_from(self, conf): + with waitlock(conf): + logg.info(" reload-or-try-restart unit %s => %s", conf.name(), conf.filename()) + return self.do_reload_or_try_restart_unit_from(conf) + def do_reload_or_try_restart_unit_from(self, conf): + if conf.getlist("Service", "ExecReload", []): + return self.do_reload_unit_from(conf) + elif not self.is_active_from(conf): + return True + else: + return self.do_restart_unit_from(conf) + def kill_modules(self, *modules): + """ [UNIT]... -- kill these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.kill_units(units) and found_all + def kill_units(self, units): + """ fails if any unit could not be killed """ + self.wait_system() + done = True + for unit in self.sortedBefore(units): + if not self.kill_unit(unit): + done = False + return done + def kill_unit(self, unit): + conf = self.load_unit_conf(unit) + if conf is None: + logg.error("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.kill_unit_from(conf) + def kill_unit_from(self, conf): + if not conf: return False + with waitlock(conf): + logg.info(" kill unit %s => %s", conf.name(), conf.filename()) + return self.do_kill_unit_from(conf) + def do_kill_unit_from(self, conf): + started = time.time() + doSendSIGKILL = conf.getbool("Service", "SendSIGKILL", "yes") + doSendSIGHUP = conf.getbool("Service", "SendSIGHUP", "no") + useKillMode = conf.get("Service", "KillMode", "control-group") + useKillSignal = conf.get("Service", "KillSignal", "SIGTERM") + kill_signal = getattr(signal, useKillSignal) + timeout = self.get_TimeoutStopSec(conf) + status_file = self.status_file_from(conf) + size = os.path.exists(status_file) and os.path.getsize(status_file) + logg.info("STATUS %s %s", status_file, size) + mainpid = to_int(self.read_mainpid_from(conf, "")) + self.clean_status_from(conf) # clear RemainAfterExit and TimeoutStartSec + if not mainpid: + if useKillMode in ["control-group"]: + logg.warning("no main PID [%s]", conf.filename()) + logg.warning("and there is no control-group here") + else: + logg.info("no main PID [%s]", conf.filename()) + return False + if not pid_exists(mainpid) or pid_zombie(mainpid): + logg.debug("ignoring children when mainpid is already dead") + # because we list child processes, not processes in control-group + return True + pidlist = self.pidlist_of(mainpid) # here + if pid_exists(mainpid): + logg.info("stop kill PID %s", mainpid) + self._kill_pid(mainpid, kill_signal) + if useKillMode in ["control-group"]: + if len(pidlist) > 1: + logg.info("stop control-group PIDs %s", pidlist) + for pid in pidlist: + if pid != mainpid: + self._kill_pid(pid, kill_signal) + if doSendSIGHUP: + logg.info("stop SendSIGHUP to PIDs %s", pidlist) + for pid in pidlist: + self._kill_pid(pid, signal.SIGHUP) + # wait for the processes to have exited + while True: + dead = True + for pid in pidlist: + if pid_exists(pid) and not pid_zombie(pid): + dead = False + break + if dead: + break + if time.time() > started + timeout: + logg.info("service PIDs not stopped after %s", timeout) + break + time.sleep(1) # until TimeoutStopSec + if dead or not doSendSIGKILL: + logg.info("done kill PID %s %s", mainpid, dead and "OK") + return dead + if useKillMode in [ "control-group", "mixed" ]: + logg.info("hard kill PIDs %s", pidlist) + for pid in pidlist: + if pid != mainpid: + self._kill_pid(pid, signal.SIGKILL) + time.sleep(MinimumYield) + # useKillMode in [ "control-group", "mixed", "process" ] + if pid_exists(mainpid): + logg.info("hard kill PID %s", mainpid) + self._kill_pid(mainpid, signal.SIGKILL) + time.sleep(MinimumYield) + dead = not pid_exists(mainpid) or pid_zombie(mainpid) + logg.info("done hard kill PID %s %s", mainpid, dead and "OK") + return dead + def _kill_pid(self, pid, kill_signal = None): + try: + sig = kill_signal or signal.SIGTERM + os.kill(pid, sig) + except OSError as e: + if e.errno == errno.ESRCH or e.errno == errno.ENOENT: + logg.debug("kill PID %s => No such process", pid) + return True + else: + logg.error("kill PID %s => %s", pid, str(e)) + return False + return not pid_exists(pid) or pid_zombie(pid) + def is_active_modules(self, *modules): + """ [UNIT].. -- check if these units are in active state + implements True if all is-active = True """ + # systemctl returns multiple lines, one for each argument + # "active" when is_active + # "inactive" when not is_active + # "unknown" when not enabled + # The return code is set to + # 0 when "active" + # 1 when unit is not found + # 3 when any "inactive" or "unknown" + # However: # TODO!!!!! BUG in original systemctl!! + # documentation says " exit code 0 if at least one is active" + # and "Unless --quiet is specified, print the unit state" + units = [] + results = [] + for module in modules: + units = self.match_units([ module ]) + if not units: + logg.error("Unit %s could not be found.", unit_of(module)) + results += [ "unknown" ] + continue + for unit in units: + active = self.get_active_unit(unit) + enabled = self.enabled_unit(unit) + if enabled != "enabled": active = "unknown" + results += [ active ] + break + ## how it should work: + status = "active" in results + ## how 'systemctl' works: + non_active = [ result for result in results if result != "active" ] + status = not non_active + if not status: + status = 3 + if not _quiet: + return status, results + else: + return status + def is_active_from(self, conf): + """ used in try-restart/other commands to check if needed. """ + if not conf: return False + return self.get_active_from(conf) == "active" + def active_pid_from(self, conf): + if not conf: return False + pid = self.read_mainpid_from(conf, "") + return self.is_active_pid(pid) + def is_active_pid(self, pid): + """ returns pid if the pid is still an active process """ + if pid and pid_exists(pid) and not pid_zombie(pid): + return pid # usually a string (not null) + return None + def get_active_unit(self, unit): + """ returns 'active' 'inactive' 'failed' 'unknown' """ + conf = self.get_unit_conf(unit) + if not conf.loaded(): + logg.warning("Unit %s could not be found.", unit) + return "unknown" + else: + return self.get_active_from(conf) + def get_active_from(self, conf): + """ returns 'active' 'inactive' 'failed' 'unknown' """ + # used in try-restart/other commands to check if needed. + if not conf: return "unknown" + pid_file = self.pid_file_from(conf) + if pid_file: # application PIDFile + if not os.path.exists(pid_file): + return "inactive" + status_file = self.status_file_from(conf) + if self.getsize(status_file): + state = self.get_status_from(conf, "ActiveState", "") + if state: + logg.info("get_status_from %s => %s", conf.name(), state) + return state + pid = self.read_mainpid_from(conf, "") + logg.debug("pid_file '%s' => PID %s", pid_file or status_file, pid) + if pid: + if not pid_exists(pid) or pid_zombie(pid): + return "failed" + return "active" + else: + return "inactive" + def get_substate_from(self, conf): + """ returns 'running' 'exited' 'dead' 'failed' 'plugged' 'mounted' """ + if not conf: return False + pid_file = self.pid_file_from(conf) + if pid_file: + if not os.path.exists(pid_file): + return "dead" + status_file = self.status_file_from(conf) + if self.getsize(status_file): + state = self.get_status_from(conf, "ActiveState", "") + if state: + if state in [ "active" ]: + return self.get_status_from(conf, "SubState", "running") + else: + return self.get_status_from(conf, "SubState", "dead") + pid = self.read_mainpid_from(conf, "") + logg.debug("pid_file '%s' => PID %s", pid_file or status_file, pid) + if pid: + if not pid_exists(pid) or pid_zombie(pid): + return "failed" + return "running" + else: + return "dead" + def is_failed_modules(self, *modules): + """ [UNIT]... -- check if these units are in failes state + implements True if any is-active = True """ + units = [] + results = [] + for module in modules: + units = self.match_units([ module ]) + if not units: + logg.error("Unit %s could not be found.", unit_of(module)) + results += [ "unknown" ] + continue + for unit in units: + active = self.get_active_unit(unit) + enabled = self.enabled_unit(unit) + if enabled != "enabled": active = "unknown" + results += [ active ] + break + status = "failed" in results + if not _quiet: + return status, results + else: + return status + def is_failed_from(self, conf): + if conf is None: return True + return self.get_active_from(conf) == "failed" + def reset_failed_modules(self, *modules): + """ [UNIT]... -- Reset failed state for all, one, or more units """ + units = [] + status = True + for module in modules: + units = self.match_units([ module ]) + if not units: + logg.error("Unit %s could not be found.", unit_of(module)) + return 1 + for unit in units: + if not self.reset_failed_unit(unit): + logg.error("Unit %s could not be reset.", unit_of(module)) + status = False + break + return status + def reset_failed_unit(self, unit): + conf = self.get_unit_conf(unit) + if not conf.loaded(): + logg.warning("Unit %s could not be found.", unit) + return False + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + return self.reset_failed_from(conf) + def reset_failed_from(self, conf): + if conf is None: return True + if not self.is_failed_from(conf): return False + done = False + status_file = self.status_file_from(conf) + if status_file and os.path.exists(status_file): + try: + os.remove(status_file) + done = True + logg.debug("done rm %s", status_file) + except Exception as e: + logg.error("while rm %s: %s", status_file, e) + pid_file = self.pid_file_from(conf) + if pid_file and os.path.exists(pid_file): + try: + os.remove(pid_file) + done = True + logg.debug("done rm %s", pid_file) + except Exception as e: + logg.error("while rm %s: %s", pid_file, e) + return done + def status_modules(self, *modules): + """ [UNIT]... check the status of these units. + """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + status, result = self.status_units(units) + if not found_all: + status = 3 # same as (dead) # original behaviour + return (status, result) + def status_units(self, units): + """ concatenates the status output of all units + and the last non-successful statuscode """ + status, result = 0, "" + for unit in units: + status1, result1 = self.status_unit(unit) + if status1: status = status1 + if result: result += "\n\n" + result += result1 + return status, result + def status_unit(self, unit): + conf = self.get_unit_conf(unit) + result = "%s - %s" % (unit, self.get_description_from(conf)) + loaded = conf.loaded() + if loaded: + filename = conf.filename() + enabled = self.enabled_from(conf) + result += "\n Loaded: {loaded} ({filename}, {enabled})".format(**locals()) + for path in conf.overrides(): + result += "\n Drop-In: {path}".format(**locals()) + else: + result += "\n Loaded: failed" + return 3, result + active = self.get_active_from(conf) + substate = self.get_substate_from(conf) + result += "\n Active: {} ({})".format(active, substate) + if active == "active": + return 0, result + else: + return 3, result + def cat_modules(self, *modules): + """ [UNIT]... show the *.system file for these" + """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + done, result = self.cat_units(units) + return (done and found_all, result) + def cat_units(self, units): + done = True + result = "" + for unit in units: + text = self.cat_unit(unit) + if not text: + done = False + else: + if result: + result += "\n\n" + result += text + return done, result + def cat_unit(self, unit): + try: + unit_file = self.unit_file(unit) + if unit_file: + return open(unit_file).read() + logg.error("no file for unit '%s'", unit) + except Exception as e: + print("Unit {} is not-loaded: {}".format(unit, e)) + return False + ## + ## + def load_preset_files(self, module = None): # -> [ preset-file-names,... ] + """ reads all preset files, returns the scanned files """ + if self._preset_file_list is None: + self._preset_file_list = {} + for folder in self.preset_folders(): + if not folder: + continue + if self._root: + folder = os_path(self._root, folder) + if not os.path.isdir(folder): + continue + for name in os.listdir(folder): + if not name.endswith(".preset"): + continue + if name not in self._preset_file_list: + path = os.path.join(folder, name) + if os.path.isdir(path): + continue + preset = PresetFile().read(path) + self._preset_file_list[name] = preset + logg.debug("found %s preset files", len(self._preset_file_list)) + return sorted(self._preset_file_list.keys()) + def get_preset_of_unit(self, unit): + """ [UNIT] check the *.preset of this unit + """ + self.load_preset_files() + for filename in sorted(self._preset_file_list.keys()): + preset = self._preset_file_list[filename] + status = preset.get_preset(unit) + if status: + return status + return None + def preset_modules(self, *modules): + """ [UNIT]... -- set 'enabled' when in *.preset + """ + if self.user_mode(): + logg.warning("preset makes no sense in --user mode") + return True + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.preset_units(units) and found_all + def preset_units(self, units): + """ fails if any unit could not be changed """ + self.wait_system() + fails = 0 + found = 0 + for unit in units: + status = self.get_preset_of_unit(unit) + if not status: continue + found += 1 + if status.startswith("enable"): + if self._preset_mode == "disable": continue + logg.info("preset enable %s", unit) + if not self.enable_unit(unit): + logg.warning("failed to enable %s", unit) + fails += 1 + if status.startswith("disable"): + if self._preset_mode == "enable": continue + logg.info("preset disable %s", unit) + if not self.disable_unit(unit): + logg.warning("failed to disable %s", unit) + fails += 1 + return not fails and not not found + def system_preset_all(self, *modules): + """ 'preset' all services + enable or disable services according to *.preset files + """ + if self.user_mode(): + logg.warning("preset-all makes no sense in --user mode") + return True + found_all = True + units = self.match_units() # TODO: how to handle module arguments + return self.preset_units(units) and found_all + def wanted_from(self, conf, default = None): + if not conf: return default + return conf.get("Install", "WantedBy", default, True) + def enablefolders(self, wanted): + if self.user_mode(): + for folder in self.user_folders(): + yield self.default_enablefolder(wanted, folder) + if True: + for folder in self.system_folders(): + yield self.default_enablefolder(wanted, folder) + def enablefolder(self, wanted = None): + if self.user_mode(): + user_folder = self.user_folder() + return self.default_enablefolder(wanted, user_folder) + else: + return self.default_enablefolder(wanted) + def default_enablefolder(self, wanted = None, basefolder = None): + basefolder = basefolder or self.system_folder() + if not wanted: + return wanted + if not wanted.endswith(".wants"): + wanted = wanted + ".wants" + return os.path.join(basefolder, wanted) + def enable_modules(self, *modules): + """ [UNIT]... -- enable these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + logg.info("matched %s", unit) #++ + if unit not in units: + units += [ unit ] + return self.enable_units(units) and found_all + def enable_units(self, units): + self.wait_system() + done = True + for unit in units: + if not self.enable_unit(unit): + done = False + elif self._now: + self.start_unit(unit) + return done + def enable_unit(self, unit): + unit_file = self.unit_file(unit) + if not unit_file: + logg.error("Unit %s could not be found.", unit) + return False + if self.is_sysv_file(unit_file): + if self.user_mode(): + logg.error("Initscript %s not for --user mode", unit) + return False + return self.enable_unit_sysv(unit_file) + conf = self.get_unit_conf(unit) + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + wanted = self.wanted_from(self.get_unit_conf(unit)) + if not wanted: + return False # "static" is-enabled + folder = self.enablefolder(wanted) + if self._root: + folder = os_path(self._root, folder) + if not os.path.isdir(folder): + os.makedirs(folder) + target = os.path.join(folder, os.path.basename(unit_file)) + if True: + _f = self._force and "-f" or "" + logg.info("ln -s {_f} '{unit_file}' '{target}'".format(**locals())) + if self._force and os.path.islink(target): + os.remove(target) + if not os.path.islink(target): + os.symlink(unit_file, target) + return True + def rc3_root_folder(self): + old_folder = "/etc/rc3.d" + new_folder = "/etc/init.d/rc3.d" + if self._root: + old_folder = os_path(self._root, old_folder) + new_folder = os_path(self._root, new_folder) + if os.path.isdir(old_folder): + return old_folder + return new_folder + def rc5_root_folder(self): + old_folder = "/etc/rc5.d" + new_folder = "/etc/init.d/rc5.d" + if self._root: + old_folder = os_path(self._root, old_folder) + new_folder = os_path(self._root, new_folder) + if os.path.isdir(old_folder): + return old_folder + return new_folder + def enable_unit_sysv(self, unit_file): + # a "multi-user.target"/rc3 is also started in /rc5 + rc3 = self._enable_unit_sysv(unit_file, self.rc3_root_folder()) + rc5 = self._enable_unit_sysv(unit_file, self.rc5_root_folder()) + return rc3 and rc5 + def _enable_unit_sysv(self, unit_file, rc_folder): + name = os.path.basename(unit_file) + nameS = "S50"+name + nameK = "K50"+name + if not os.path.isdir(rc_folder): + os.makedirs(rc_folder) + # do not double existing entries + for found in os.listdir(rc_folder): + m = re.match(r"S\d\d(.*)", found) + if m and m.group(1) == name: + nameS = found + m = re.match(r"K\d\d(.*)", found) + if m and m.group(1) == name: + nameK = found + target = os.path.join(rc_folder, nameS) + if not os.path.exists(target): + os.symlink(unit_file, target) + target = os.path.join(rc_folder, nameK) + if not os.path.exists(target): + os.symlink(unit_file, target) + return True + def disable_modules(self, *modules): + """ [UNIT]... -- disable these units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.disable_units(units) and found_all + def disable_units(self, units): + self.wait_system() + done = True + for unit in units: + if not self.disable_unit(unit): + done = False + return done + def disable_unit(self, unit): + unit_file = self.unit_file(unit) + if not unit_file: + logg.error("Unit %s could not be found.", unit) + return False + if self.is_sysv_file(unit_file): + if self.user_mode(): + logg.error("Initscript %s not for --user mode", unit) + return False + return self.disable_unit_sysv(unit_file) + conf = self.get_unit_conf(unit) + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + wanted = self.wanted_from(self.get_unit_conf(unit)) + if not wanted: + return False # "static" is-enabled + for folder in self.enablefolders(wanted): + if self._root: + folder = os_path(self._root, folder) + target = os.path.join(folder, os.path.basename(unit_file)) + if os.path.isfile(target): + try: + _f = self._force and "-f" or "" + logg.info("rm {_f} '{target}'".format(**locals())) + os.remove(target) + except IOError as e: + logg.error("disable %s: %s", target, e) + except OSError as e: + logg.error("disable %s: %s", target, e) + return True + def disable_unit_sysv(self, unit_file): + rc3 = self._disable_unit_sysv(unit_file, self.rc3_root_folder()) + rc5 = self._disable_unit_sysv(unit_file, self.rc5_root_folder()) + return rc3 and rc5 + def _disable_unit_sysv(self, unit_file, rc_folder): + # a "multi-user.target"/rc3 is also started in /rc5 + name = os.path.basename(unit_file) + nameS = "S50"+name + nameK = "K50"+name + # do not forget the existing entries + for found in os.listdir(rc_folder): + m = re.match(r"S\d\d(.*)", found) + if m and m.group(1) == name: + nameS = found + m = re.match(r"K\d\d(.*)", found) + if m and m.group(1) == name: + nameK = found + target = os.path.join(rc_folder, nameS) + if os.path.exists(target): + os.unlink(target) + target = os.path.join(rc_folder, nameK) + if os.path.exists(target): + os.unlink(target) + return True + def is_enabled_sysv(self, unit_file): + name = os.path.basename(unit_file) + target = os.path.join(self.rc3_root_folder(), "S50%s" % name) + if os.path.exists(target): + return True + return False + def is_enabled_modules(self, *modules): + """ [UNIT]... -- check if these units are enabled + returns True if any of them is enabled.""" + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.is_enabled_units(units) # and found_all + def is_enabled_units(self, units): + """ true if any is enabled, and a list of infos """ + result = False + infos = [] + for unit in units: + infos += [ self.enabled_unit(unit) ] + if self.is_enabled(unit): + result = True + return result, infos + def is_enabled(self, unit): + unit_file = self.unit_file(unit) + if not unit_file: + logg.error("Unit %s could not be found.", unit) + return False + if self.is_sysv_file(unit_file): + return self.is_enabled_sysv(unit_file) + wanted = self.wanted_from(self.get_unit_conf(unit)) + if not wanted: + return True # "static" + for folder in self.enablefolders(wanted): + if self._root: + folder = os_path(self._root, folder) + target = os.path.join(folder, os.path.basename(unit_file)) + if os.path.isfile(target): + return True + return False + def enabled_unit(self, unit): + conf = self.get_unit_conf(unit) + return self.enabled_from(conf) + def enabled_from(self, conf): + unit_file = conf.filename() + if self.is_sysv_file(unit_file): + state = self.is_enabled_sysv(unit_file) + if state: + return "enabled" + return "disabled" + if conf.masked: + return "masked" + wanted = self.wanted_from(conf) + if not wanted: + return "static" + for folder in self.enablefolders(wanted): + if self._root: + folder = os_path(self._root, folder) + target = os.path.join(folder, os.path.basename(unit_file)) + if os.path.isfile(target): + return "enabled" + return "disabled" + def mask_modules(self, *modules): + """ [UNIT]... -- mask non-startable units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.mask_units(units) and found_all + def mask_units(self, units): + self.wait_system() + done = True + for unit in units: + if not self.mask_unit(unit): + done = False + return done + def mask_unit(self, unit): + unit_file = self.unit_file(unit) + if not unit_file: + logg.error("Unit %s could not be found.", unit) + return False + if self.is_sysv_file(unit_file): + logg.error("Initscript %s can not be masked", unit) + return False + conf = self.get_unit_conf(unit) + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + folder = self.mask_folder() + if self._root: + folder = os_path(self._root, folder) + if not os.path.isdir(folder): + os.makedirs(folder) + target = os.path.join(folder, os.path.basename(unit_file)) + if True: + _f = self._force and "-f" or "" + logg.debug("ln -s {_f} /dev/null '{target}'".format(**locals())) + if self._force and os.path.islink(target): + os.remove(target) + if not os.path.exists(target): + os.symlink("/dev/null", target) + logg.info("Created symlink {target} -> /dev/null".format(**locals())) + return True + elif os.path.islink(target): + logg.debug("mask symlink does already exist: %s", target) + return True + else: + logg.error("mask target does already exist: %s", target) + return False + def mask_folder(self): + for folder in self.mask_folders(): + if folder: return folder + raise Exception("did not find any systemd/system folder") + def mask_folders(self): + if self.user_mode(): + for folder in self.user_folders(): + yield folder + if True: + for folder in self.system_folders(): + yield folder + def unmask_modules(self, *modules): + """ [UNIT]... -- unmask non-startable units """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.unmask_units(units) and found_all + def unmask_units(self, units): + self.wait_system() + done = True + for unit in units: + if not self.unmask_unit(unit): + done = False + return done + def unmask_unit(self, unit): + unit_file = self.unit_file(unit) + if not unit_file: + logg.error("Unit %s could not be found.", unit) + return False + if self.is_sysv_file(unit_file): + logg.error("Initscript %s can not be un/masked", unit) + return False + conf = self.get_unit_conf(unit) + if self.not_user_conf(conf): + logg.error("Unit %s not for --user mode", unit) + return False + folder = self.mask_folder() + if self._root: + folder = os_path(self._root, folder) + target = os.path.join(folder, os.path.basename(unit_file)) + if True: + _f = self._force and "-f" or "" + logg.info("rm {_f} '{target}'".format(**locals())) + if os.path.islink(target): + os.remove(target) + return True + elif not os.path.exists(target): + logg.debug("Symlink did exist anymore: %s", target) + return True + else: + logg.warning("target is not a symlink: %s", target) + return True + def list_dependencies_modules(self, *modules): + """ [UNIT]... show the dependency tree" + """ + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.list_dependencies_units(units) # and found_all + def list_dependencies_units(self, units): + if self._now: + return self.list_start_dependencies_units(units) + result = [] + for unit in units: + if result: + result += [ "", "" ] + result += self.list_dependencies_unit(unit) + return result + def list_dependencies_unit(self, unit): + result = [] + for line in self.list_dependencies(unit, ""): + result += [ line ] + return result + def list_dependencies(self, unit, indent = None, mark = None, loop = []): + mapping = {} + mapping["Requires"] = "required to start" + mapping["Wants"] = "wanted to start" + mapping["Requisite"] = "required started" + mapping["Bindsto"] = "binds to start" + mapping["PartOf"] = "part of started" + mapping[".requires"] = ".required to start" + mapping[".wants"] = ".wanted to start" + mapping["PropagateReloadTo"] = "(to be reloaded as well)" + mapping["Conflicts"] = "(to be stopped on conflict)" + restrict = ["Requires", "Requisite", "ConsistsOf", "Wants", + "BindsTo", ".requires", ".wants"] + indent = indent or "" + mark = mark or "" + deps = self.get_dependencies_unit(unit) + conf = self.get_unit_conf(unit) + if not conf.loaded(): + if not self._show_all: + return + yield "%s(%s): %s" % (indent, unit, mark) + else: + yield "%s%s: %s" % (indent, unit, mark) + for stop_recursion in [ "Conflict", "conflict", "reloaded", "Propagate" ]: + if stop_recursion in mark: + return + for dep in deps: + if dep in loop: + logg.debug("detected loop at %s", dep) + continue + new_loop = loop + list(deps.keys()) + new_indent = indent + "| " + new_mark = deps[dep] + if not self._show_all: + if new_mark not in restrict: + continue + if new_mark in mapping: + new_mark = mapping[new_mark] + restrict = ["Requires", "Requisite", "ConsistsOf", "Wants", + "BindsTo", ".requires", ".wants"] + for line in self.list_dependencies(dep, new_indent, new_mark, new_loop): + yield line + def get_dependencies_unit(self, unit): + conf = self.get_unit_conf(unit) + deps = {} + for style in [ "Requires", "Wants", "Requisite", "BindsTo", "PartOf", + ".requires", ".wants", "PropagateReloadTo", "Conflicts", ]: + if style.startswith("."): + for folder in self.sysd_folders(): + if not folder: + continue + require_path = os.path.join(folder, unit + style) + if self._root: + require_path = os_path(self._root, require_path) + if os.path.isdir(require_path): + for required in os.listdir(require_path): + if required not in deps: + deps[required] = style + else: + for requirelist in conf.getlist("Unit", style, []): + for required in requirelist.strip().split(" "): + deps[required.strip()] = style + return deps + def get_start_dependencies(self, unit): # pragma: no cover + """ the list of services to be started as well / TODO: unused """ + deps = {} + unit_deps = self.get_dependencies_unit(unit) + for dep_unit, dep_style in unit_deps.items(): + restrict = ["Requires", "Requisite", "ConsistsOf", "Wants", + "BindsTo", ".requires", ".wants"] + if dep_style in restrict: + if dep_unit in deps: + if dep_style not in deps[dep_unit]: + deps[dep_unit].append( dep_style) + else: + deps[dep_unit] = [ dep_style ] + next_deps = self.get_start_dependencies(dep_unit) + for dep, styles in next_deps.items(): + for style in styles: + if dep in deps: + if style not in deps[dep]: + deps[dep].append(style) + else: + deps[dep] = [ style ] + return deps + def list_start_dependencies_units(self, units): + unit_order = [] + deps = {} + for unit in units: + unit_order.append(unit) + # unit_deps = self.get_start_dependencies(unit) # TODO + unit_deps = self.get_dependencies_unit(unit) + for dep_unit, styles in unit_deps.items(): + styles = to_list(styles) + for dep_style in styles: + if dep_unit in deps: + if dep_style not in deps[dep_unit]: + deps[dep_unit].append( dep_style) + else: + deps[dep_unit] = [ dep_style ] + deps_conf = [] + for dep in deps: + if dep in unit_order: + continue + conf = self.get_unit_conf(dep) + if conf.loaded(): + deps_conf.append(conf) + for unit in unit_order: + deps[unit] = [ "Requested" ] + conf = self.get_unit_conf(unit) + if conf.loaded(): + deps_conf.append(conf) + result = [] + for dep in sortedAfter(deps_conf, cmp=compareAfter): + line = (dep.name(), "(%s)" % (" ".join(deps[dep.name()]))) + result.append(line) + return result + def sortedAfter(self, unitlist): + """ get correct start order for the unit list (ignoring masked units) """ + conflist = [ self.get_unit_conf(unit) for unit in unitlist ] + if True: + conflist = [] + for unit in unitlist: + conf = self.get_unit_conf(unit) + if conf.masked: + logg.debug("ignoring masked unit %s", unit) + continue + conflist.append(conf) + sortlist = sortedAfter(conflist) + return [ item.name() for item in sortlist ] + def sortedBefore(self, unitlist): + """ get correct start order for the unit list (ignoring masked units) """ + conflist = [ self.get_unit_conf(unit) for unit in unitlist ] + if True: + conflist = [] + for unit in unitlist: + conf = self.get_unit_conf(unit) + if conf.masked: + logg.debug("ignoring masked unit %s", unit) + continue + conflist.append(conf) + sortlist = sortedAfter(reversed(conflist)) + return [ item.name() for item in reversed(sortlist) ] + def system_daemon_reload(self): + """ reload does will only check the service files here. + The returncode will tell the number of warnings, + and it is over 100 if it can not continue even + for the relaxed systemctl.py style of execution. """ + errors = 0 + for unit in self.match_units(): + try: + conf = self.get_unit_conf(unit) + except Exception as e: + logg.error("%s: can not read unit file %s\n\t%s", + unit, conf.filename(), e) + continue + errors += self.syntax_check(conf) + if errors: + logg.warning(" (%s) found %s problems", errors, errors % 100) + return True # errors + def syntax_check(self, conf): + if conf.filename() and conf.filename().endswith(".service"): + return self.syntax_check_service(conf) + return 0 + def syntax_check_service(self, conf): + unit = conf.name() + if not conf.data.has_section("Service"): + logg.error(" %s: a .service file without [Service] section", unit) + return 101 + errors = 0 + haveType = conf.get("Service", "Type", "simple") + haveExecStart = conf.getlist("Service", "ExecStart", []) + haveExecStop = conf.getlist("Service", "ExecStop", []) + haveExecReload = conf.getlist("Service", "ExecReload", []) + usedExecStart = [] + usedExecStop = [] + usedExecReload = [] + if haveType not in [ "simple", "forking", "notify", "oneshot", "dbus", "idle", "sysv"]: + logg.error(" %s: Failed to parse service type, ignoring: %s", unit, haveType) + errors += 100 + for line in haveExecStart: + if not line.startswith("/") and not line.startswith("-/"): + logg.error(" %s: Executable path is not absolute, ignoring: %s", unit, line.strip()) + errors += 1 + usedExecStart.append(line) + for line in haveExecStop: + if not line.startswith("/") and not line.startswith("-/"): + logg.error(" %s: Executable path is not absolute, ignoring: %s", unit, line.strip()) + errors += 1 + usedExecStop.append(line) + for line in haveExecReload: + if not line.startswith("/") and not line.startswith("-/"): + logg.error(" %s: Executable path is not absolute, ignoring: %s", unit, line.strip()) + errors += 1 + usedExecReload.append(line) + if haveType in ["simple", "notify", "forking"]: + if not usedExecStart and not usedExecStop: + logg.error(" %s: Service lacks both ExecStart and ExecStop= setting. Refusing.", unit) + errors += 101 + elif not usedExecStart and haveType != "oneshot": + logg.error(" %s: Service has no ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.", unit) + errors += 101 + if len(usedExecStart) > 1 and haveType != "oneshot": + logg.error(" %s: there may be only one ExecStart statement (unless for 'oneshot' services)." + + "\n\t\t\tYou can use ExecStartPre / ExecStartPost to add additional commands.", unit) + errors += 1 + if len(usedExecStop) > 1 and haveType != "oneshot": + logg.info(" %s: there should be only one ExecStop statement (unless for 'oneshot' services)." + + "\n\t\t\tYou can use ExecStopPost to add additional commands (also executed on failed Start)", unit) + if len(usedExecReload) > 1: + logg.info(" %s: there should be only one ExecReload statement." + + "\n\t\t\tUse ' ; ' for multiple commands (ExecReloadPost or ExedReloadPre do not exist)", unit) + if len(usedExecReload) > 0 and "/bin/kill " in usedExecReload[0]: + logg.warning(" %s: the use of /bin/kill is not recommended for ExecReload as it is asychronous." + + "\n\t\t\tThat means all the dependencies will perform the reload simultanously / out of order.", unit) + if conf.getlist("Service", "ExecRestart", []): #pragma: no cover + logg.error(" %s: there no such thing as an ExecRestart (ignored)", unit) + if conf.getlist("Service", "ExecRestartPre", []): #pragma: no cover + logg.error(" %s: there no such thing as an ExecRestartPre (ignored)", unit) + if conf.getlist("Service", "ExecRestartPost", []): #pragma: no cover + logg.error(" %s: there no such thing as an ExecRestartPost (ignored)", unit) + if conf.getlist("Service", "ExecReloadPre", []): #pragma: no cover + logg.error(" %s: there no such thing as an ExecReloadPre (ignored)", unit) + if conf.getlist("Service", "ExecReloadPost", []): #pragma: no cover + logg.error(" %s: there no such thing as an ExecReloadPost (ignored)", unit) + if conf.getlist("Service", "ExecStopPre", []): #pragma: no cover + logg.error(" %s: there no such thing as an ExecStopPre (ignored)", unit) + for env_file in conf.getlist("Service", "EnvironmentFile", []): + if env_file.startswith("-"): continue + if not os.path.isfile(os_path(self._root, env_file)): + logg.error(" %s: Failed to load environment files: %s", unit, env_file) + errors += 101 + return errors + def exec_check_service(self, conf, env, exectype = ""): + if not conf: + return True + if not conf.data.has_section("Service"): + return True #pragma: no cover + haveType = conf.get("Service", "Type", "simple") + if haveType in [ "sysv" ]: + return True # we don't care about that + abspath = 0 + notexists = 0 + for execs in [ "ExecStartPre", "ExecStart", "ExecStartPost", "ExecStop", "ExecStopPost", "ExecReload" ]: + if not execs.startswith(exectype): + continue + for cmd in conf.getlist("Service", execs, []): + check, cmd = checkstatus(cmd) + newcmd = self.exec_cmd(cmd, env, conf) + if not newcmd: + continue + exe = newcmd[0] + if not exe: + continue + if exe[0] != "/": + logg.error(" Exec is not an absolute path: %s=%s", execs, cmd) + abspath += 1 + if not os.path.isfile(exe): + logg.error(" Exec command does not exist: (%s) %s", execs, exe) + notexists += 1 + newexe1 = os.path.join("/usr/bin", exe) + newexe2 = os.path.join("/bin", exe) + if os.path.exists(newexe1): + logg.error(" but this does exist: %s %s", " " * len(execs), newexe1) + elif os.path.exists(newexe2): + logg.error(" but this does exist: %s %s", " " * len(execs), newexe2) + if not abspath and not notexists: + return True + if True: + filename = conf.filename() + if len(filename) > 45: filename = "..." + filename[-42:] + logg.error(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + logg.error(" Found %s problems in %s", abspath + notexists, filename) + time.sleep(1) + if abspath: + logg.error(" The SystemD commands must always be absolute paths by definition.") + time.sleep(1) + logg.error(" Earlier versions of systemctl.py did use a subshell thus using $PATH") + time.sleep(1) + logg.error(" however newer versions use execve just like the real SystemD daemon") + time.sleep(1) + logg.error(" so that your docker-only service scripts may start to fail suddenly.") + time.sleep(1) + if notexists: + logg.error(" Now %s executable paths were not found in the current environment.", notexists) + time.sleep(1) + logg.error(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + return False + def show_modules(self, *modules): + """ [PATTERN]... -- Show properties of one or more units + Show properties of one or more units (or the manager itself). + If no argument is specified, properties of the manager will be + shown. If a unit name is specified, properties of the unit is + shown. By default, empty properties are suppressed. Use --all to + show those too. To select specific properties to show, use + --property=. This command is intended to be used whenever + computer-parsable output is required. Use status if you are looking + for formatted human-readable output. + + NOTE: only a subset of properties is implemented """ + notfound = [] + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + units += [ module ] + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + return self.show_units(units) + notfound # and found_all + def show_units(self, units): + logg.debug("show --property=%s", self._unit_property) + result = [] + for unit in units: + if result: result += [ "" ] + for var, value in self.show_unit_items(unit): + if self._unit_property: + if self._unit_property != var: + continue + else: + if not value and not self._show_all: + continue + result += [ "%s=%s" % (var, value) ] + return result + def show_unit_items(self, unit): + """ [UNIT]... -- show properties of a unit. + """ + logg.info("try read unit %s", unit) + conf = self.get_unit_conf(unit) + for entry in self.each_unit_items(unit, conf): + yield entry + def each_unit_items(self, unit, conf): + loaded = conf.loaded() + if not loaded: + loaded = "not-loaded" + if "NOT-FOUND" in self.get_description_from(conf): + loaded = "not-found" + yield "Id", unit + yield "Names", unit + yield "Description", self.get_description_from(conf) # conf.get("Unit", "Description") + yield "PIDFile", self.pid_file_from(conf) # not self.pid_file_from w/o default location + yield "MainPID", self.active_pid_from(conf) or "0" # status["MainPID"] or PIDFile-read + yield "SubState", self.get_substate_from(conf) # status["SubState"] or notify-result + yield "ActiveState", self.get_active_from(conf) # status["ActiveState"] + yield "LoadState", loaded + yield "UnitFileState", self.enabled_from(conf) + yield "TimeoutStartUSec", seconds_to_time(self.get_TimeoutStartSec(conf)) + yield "TimeoutStopUSec", seconds_to_time(self.get_TimeoutStopSec(conf)) + env_parts = [] + for env_part in conf.getlist("Service", "Environment", []): + env_parts.append(self.expand_special(env_part, conf)) + if env_parts: + yield "Environment", " ".join(env_parts) + env_files = [] + for env_file in conf.getlist("Service", "EnvironmentFile", []): + env_files.append(self.expand_special(env_file, conf)) + if env_files: + yield "EnvironmentFile", " ".join(env_files) + # + igno_centos = [ "netconsole", "network" ] + igno_opensuse = [ "raw", "pppoe", "*.local", "boot.*", "rpmconf*", "purge-kernels.service", "after-local.service", "postfix*" ] + igno_ubuntu = [ "mount*", "umount*", "ondemand", "*.local" ] + igno_always = [ "network*", "dbus", "systemd-*" ] + def _ignored_unit(self, unit, ignore_list): + for ignore in ignore_list: + if fnmatch.fnmatchcase(unit, ignore): + return True # ignore + if fnmatch.fnmatchcase(unit, ignore+".service"): + return True # ignore + return False + def system_default_services(self, sysv = "S", default_target = None): + """ show the default services + This is used internally to know the list of service to be started in 'default' + runlevel when the container is started through default initialisation. It will + ignore a number of services - use '--all' to show a longer list of services and + use '--all --force' if not even a minimal filter shall be used. + """ + igno = self.igno_centos + self.igno_opensuse + self.igno_ubuntu + self.igno_always + if self._show_all: + igno = self.igno_always + if self._force: + igno = [] + logg.debug("ignored services filter for default.target:\n\t%s", igno) + return self.enabled_default_services(sysv, default_target, igno) + def enabled_default_services(self, sysv = "S", default_target = None, igno = []): + if self.user_mode(): + return self.enabled_default_user_services(sysv, default_target, igno) + else: + return self.enabled_default_system_services(sysv, default_target, igno) + def enabled_default_user_services(self, sysv = "S", default_target = None, igno = []): + logg.debug("check for default user services") + default_target = default_target or self._default_target + default_services = [] + for basefolder in self.user_folders(): + if not basefolder: + continue + folder = self.default_enablefolder(default_target, basefolder) + if self._root: + folder = os_path(self._root, folder) + if os.path.isdir(folder): + for unit in sorted(os.listdir(folder)): + path = os.path.join(folder, unit) + if os.path.isdir(path): continue + if self._ignored_unit(unit, igno): + continue # ignore + if unit.endswith(".service"): + default_services.append(unit) + for basefolder in self.system_folders(): + if not basefolder: + continue + folder = self.default_enablefolder(default_target, basefolder) + if self._root: + folder = os_path(self._root, folder) + if os.path.isdir(folder): + for unit in sorted(os.listdir(folder)): + path = os.path.join(folder, unit) + if os.path.isdir(path): continue + if self._ignored_unit(unit, igno): + continue # ignore + if unit.endswith(".service"): + conf = self.load_unit_conf(unit) + if self.not_user_conf(conf): + pass + else: + default_services.append(unit) + return default_services + def enabled_default_system_services(self, sysv = "S", default_target = None, igno = []): + logg.debug("check for default system services") + default_target = default_target or self._default_target + default_services = [] + for basefolder in self.system_folders(): + if not basefolder: + continue + folder = self.default_enablefolder(default_target, basefolder) + if self._root: + folder = os_path(self._root, folder) + if os.path.isdir(folder): + for unit in sorted(os.listdir(folder)): + path = os.path.join(folder, unit) + if os.path.isdir(path): continue + if self._ignored_unit(unit, igno): + continue # ignore + if unit.endswith(".service"): + default_services.append(unit) + for folder in [ self.rc3_root_folder() ]: + if not os.path.isdir(folder): + logg.warning("non-existant %s", folder) + continue + for unit in sorted(os.listdir(folder)): + path = os.path.join(folder, unit) + if os.path.isdir(path): continue + m = re.match(sysv+r"\d\d(.*)", unit) + if m: + service = m.group(1) + unit = service + ".service" + if self._ignored_unit(unit, igno): + continue # ignore + default_services.append(unit) + return default_services + def system_default(self, arg = True): + """ start units for default system level + This will go through the enabled services in the default 'multi-user.target'. + However some services are ignored as being known to be installation garbage + from unintended services. Use '--all' so start all of the installed services + and with '--all --force' even those services that are otherwise wrong. + /// SPECIAL: with --now or --init the init-loop is run and afterwards + a system_halt is performed with the enabled services to be stopped.""" + self.sysinit_status(SubState = "initializing") + logg.info("system default requested - %s", arg) + init = self._now or self._init + self.start_system_default(init = init) + def start_system_default(self, init = False): + """ detect the default.target services and start them. + When --init is given then the init-loop is run and + the services are stopped again by 'systemctl halt'.""" + default_target = self._default_target + default_services = self.system_default_services("S", default_target) + self.sysinit_status(SubState = "starting") + self.start_units(default_services) + logg.info(" -- system is up") + if init: + logg.info("init-loop start") + sig = self.init_loop_until_stop(default_services) + logg.info("init-loop %s", sig) + self.stop_system_default() + def stop_system_default(self): + """ detect the default.target services and stop them. + This is commonly run through 'systemctl halt' or + at the end of a 'systemctl --init default' loop.""" + default_target = self._default_target + default_services = self.system_default_services("K", default_target) + self.sysinit_status(SubState = "stopping") + self.stop_units(default_services) + logg.info(" -- system is down") + def system_halt(self, arg = True): + """ stop units from default system level """ + logg.info("system halt requested - %s", arg) + self.stop_system_default() + try: + os.kill(1, signal.SIGQUIT) # exit init-loop on no_more_procs + except Exception as e: + logg.warning("SIGQUIT to init-loop on PID-1: %s", e) + def system_get_default(self): + """ get current default run-level""" + current = self._default_target + folder = os_path(self._root, self.mask_folder()) + target = os.path.join(folder, "default.target") + if os.path.islink(target): + current = os.path.basename(os.readlink(target)) + return current + def set_default_modules(self, *modules): + """ set current default run-level""" + if not modules: + logg.debug(".. no runlevel given") + return (1, "Too few arguments") + current = self._default_target + folder = os_path(self._root, self.mask_folder()) + target = os.path.join(folder, "default.target") + if os.path.islink(target): + current = os.path.basename(os.readlink(target)) + err, msg = 0, "" + for module in modules: + if module == current: + continue + targetfile = None + for targetname, targetpath in self.each_target_file(): + if targetname == module: + targetfile = targetpath + if not targetfile: + err, msg = 3, "No such runlevel %s" % (module) + continue + # + if os.path.islink(target): + os.unlink(target) + if not os.path.isdir(os.path.dirname(target)): + os.makedirs(os.path.dirname(target)) + os.symlink(targetfile, target) + msg = "Created symlink from %s -> %s" % (target, targetfile) + logg.debug("%s", msg) + return (err, msg) + def init_modules(self, *modules): + """ [UNIT*] -- init loop: '--init default' or '--init start UNIT*' + The systemctl init service will start the enabled 'default' services, + and then wait for any zombies to be reaped. When a SIGINT is received + then a clean shutdown of the enabled services is ensured. A Control-C in + in interactive mode will also run 'stop' on all the enabled services. // + When a UNIT name is given then only that one is started instead of the + services in the 'default.target'. Using 'init UNIT' is better than + '--init start UNIT' because the UNIT is also stopped cleanly even when + it was never enabled in the system. + /// SPECIAL: when using --now then only the init-loop is started, + with the reap-zombies function and waiting for an interrupt. + (and no unit is started/stoppped wether given or not). + """ + if self._now: + return self.init_loop_until_stop([]) + if not modules: + # like 'systemctl --init default' + if self._now or self._show_all: + logg.debug("init default --now --all => no_more_procs") + self.exit_when_no_more_procs = True + return self.start_system_default(init = True) + # + # otherwise quit when all the init-services have died + self.exit_when_no_more_services = True + if self._now or self._show_all: + logg.debug("init services --now --all => no_more_procs") + self.exit_when_no_more_procs = True + found_all = True + units = [] + for module in modules: + matched = self.match_units([ module ]) + if not matched: + logg.error("Unit %s could not be found.", unit_of(module)) + found_all = False + continue + for unit in matched: + if unit not in units: + units += [ unit ] + logg.info("init %s -> start %s", ",".join(modules), ",".join(units)) + done = self.start_units(units, init = True) + logg.info("-- init is done") + return done # and found_all + def start_log_files(self, units): + self._log_file = {} + self._log_hold = {} + for unit in units: + conf = self.load_unit_conf(unit) + if not conf: continue + log_path = self.path_journal_log(conf) + try: + opened = os.open(log_path, os.O_RDONLY | os.O_NONBLOCK) + self._log_file[unit] = opened + self._log_hold[unit] = b"" + except Exception as e: + logg.error("can not open %s log: %s\n\t%s", unit, log_path, e) + def read_log_files(self, units): + BUFSIZE=8192 + for unit in units: + if unit in self._log_file: + new_text = b"" + while True: + buf = os.read(self._log_file[unit], BUFSIZE) + if not buf: break + new_text += buf + continue + text = self._log_hold[unit] + new_text + if not text: continue + lines = text.split(b"\n") + if not text.endswith(b"\n"): + self._log_hold[unit] = lines[-1] + lines = lines[:-1] + for line in lines: + prefix = unit.encode("utf-8") + content = prefix+b": "+line+b"\n" + os.write(1, content) + try: os.fsync(1) + except: pass + def stop_log_files(self, units): + for unit in units: + try: + if unit in self._log_file: + if self._log_file[unit]: + os.close(self._log_file[unit]) + except Exception as e: + logg.error("can not close log: %s\n\t%s", unit, e) + self._log_file = {} + self._log_hold = {} + def init_loop_until_stop(self, units): + """ this is the init-loop - it checks for any zombies to be reaped and + waits for an interrupt. When a SIGTERM /SIGINT /Control-C signal + is received then the signal name is returned. Any other signal will + just raise an Exception like one would normally expect. As a special + the 'systemctl halt' emits SIGQUIT which puts it into no_more_procs mode.""" + signal.signal(signal.SIGQUIT, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt("SIGQUIT")) + signal.signal(signal.SIGINT, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt("SIGINT")) + signal.signal(signal.SIGTERM, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt("SIGTERM")) + self.start_log_files(units) + self.sysinit_status(ActiveState = "active", SubState = "running") + result = None + while True: + try: + time.sleep(InitLoopSleep) + self.read_log_files(units) + ##### the reaper goes round + running = self.system_reap_zombies() + # logg.debug("reap zombies - init-loop found %s running procs", running) + if self.exit_when_no_more_services: + active = False + for unit in units: + conf = self.load_unit_conf(unit) + if not conf: continue + if self.is_active_from(conf): + active = True + if not active: + logg.info("no more services - exit init-loop") + break + if self.exit_when_no_more_procs: + if not running: + logg.info("no more procs - exit init-loop") + break + except KeyboardInterrupt as e: + if e.args and e.args[0] == "SIGQUIT": + # the original systemd puts a coredump on that signal. + logg.info("SIGQUIT - switch to no more procs check") + self.exit_when_no_more_procs = True + continue + signal.signal(signal.SIGTERM, signal.SIG_DFL) + signal.signal(signal.SIGINT, signal.SIG_DFL) + logg.info("interrupted - exit init-loop") + result = e.message or "STOPPED" + break + except Exception as e: + logg.info("interrupted - exception %s", e) + raise + self.sysinit_status(ActiveState = None, SubState = "degraded") + self.read_log_files(units) + self.read_log_files(units) + self.stop_log_files(units) + logg.debug("done - init loop") + return result + def system_reap_zombies(self): + """ check to reap children """ + selfpid = os.getpid() + running = 0 + for pid in os.listdir("/proc"): + try: pid = int(pid) + except: continue + if pid == selfpid: + continue + proc_status = "/proc/%s/status" % pid + if os.path.isfile(proc_status): + zombie = False + ppid = -1 + try: + for line in open(proc_status): + m = re.match(r"State:\s*Z.*", line) + if m: zombie = True + m = re.match(r"PPid:\s*(\d+)", line) + if m: ppid = int(m.group(1)) + except IOError as e: + logg.warning("%s : %s", proc_status, e) + continue + if zombie and ppid == os.getpid(): + logg.info("reap zombie %s", pid) + try: os.waitpid(pid, os.WNOHANG) + except OSError as e: + logg.warning("reap zombie %s: %s", e.strerror) + if os.path.isfile(proc_status): + if pid > 1: + running += 1 + return running # except PID 0 and PID 1 + def sysinit_status(self, **status): + conf = self.sysinit_target() + self.write_status_from(conf, **status) + def sysinit_target(self): + if not self._sysinit_target: + self._sysinit_target = self.default_unit_conf("sysinit.target", "System Initialization") + return self._sysinit_target + def is_system_running(self): + conf = self.sysinit_target() + status_file = self.status_file_from(conf) + if not os.path.isfile(status_file): + time.sleep(EpsilonTime) + if not os.path.isfile(status_file): + return "offline" + status = self.read_status_from(conf) + return status.get("SubState", "unknown") + def system_is_system_running(self): + state = self.is_system_running() + if self._quiet: + return state in [ "running" ] + else: + if state in [ "running" ]: + return True, state + else: + return False, state + def wait_system(self, target = None): + target = target or SysInitTarget + for attempt in xrange(int(SysInitWait)): + state = self.is_system_running() + if "init" in state: + if target in [ "sysinit.target", "basic.target" ]: + logg.info("system not initialized - wait %s", target) + time.sleep(1) + continue + if "start" in state or "stop" in state: + if target in [ "basic.target" ]: + logg.info("system not running - wait %s", target) + time.sleep(1) + continue + if "running" not in state: + logg.info("system is %s", state) + break + def pidlist_of(self, pid): + try: pid = int(pid) + except: return [] + pidlist = [ pid ] + pids = [ pid ] + for depth in xrange(ProcMaxDepth): + for pid in os.listdir("/proc"): + try: pid = int(pid) + except: continue + proc_status = "/proc/%s/status" % pid + if os.path.isfile(proc_status): + try: + for line in open(proc_status): + if line.startswith("PPid:"): + ppid = line[len("PPid:"):].strip() + try: ppid = int(ppid) + except: continue + if ppid in pidlist and pid not in pids: + pids += [ pid ] + except IOError as e: + logg.warning("%s : %s", proc_status, e) + continue + if len(pids) != len(pidlist): + pidlist = pids[:] + continue + return pids + def etc_hosts(self): + path = "/etc/hosts" + if self._root: + return os_path(self._root, path) + return path + def force_ipv4(self, *args): + """ only ipv4 localhost in /etc/hosts """ + logg.debug("checking /etc/hosts for '::1 localhost'") + lines = [] + for line in open(self.etc_hosts()): + if "::1" in line: + newline = re.sub("\\slocalhost\\s", " ", line) + if line != newline: + logg.info("/etc/hosts: '%s' => '%s'", line.rstrip(), newline.rstrip()) + line = newline + lines.append(line) + f = open(self.etc_hosts(), "w") + for line in lines: + f.write(line) + f.close() + def force_ipv6(self, *args): + """ only ipv4 localhost in /etc/hosts """ + logg.debug("checking /etc/hosts for '127.0.0.1 localhost'") + lines = [] + for line in open(self.etc_hosts()): + if "127.0.0.1" in line: + newline = re.sub("\\slocalhost\\s", " ", line) + if line != newline: + logg.info("/etc/hosts: '%s' => '%s'", line.rstrip(), newline.rstrip()) + line = newline + lines.append(line) + f = open(self.etc_hosts(), "w") + for line in lines: + f.write(line) + f.close() + def show_help(self, *args): + """[command] -- show this help + """ + lines = [] + okay = True + prog = os.path.basename(sys.argv[0]) + if not args: + argz = {} + for name in dir(self): + arg = None + if name.startswith("system_"): + arg = name[len("system_"):].replace("_","-") + if name.startswith("show_"): + arg = name[len("show_"):].replace("_","-") + if name.endswith("_of_unit"): + arg = name[:-len("_of_unit")].replace("_","-") + if name.endswith("_modules"): + arg = name[:-len("_modules")].replace("_","-") + if arg: + argz[arg] = name + lines.append("%s command [options]..." % prog) + lines.append("") + lines.append("Commands:") + for arg in sorted(argz): + name = argz[arg] + method = getattr(self, name) + doc = "..." + doctext = getattr(method, "__doc__") + if doctext: + doc = doctext + elif not self._show_all: + continue # pragma: nocover + firstline = doc.split("\n")[0] + doc_text = firstline.strip() + if "--" not in firstline: + doc_text = "-- " + doc_text + lines.append(" %s %s" % (arg, firstline.strip())) + return lines + for arg in args: + arg = arg.replace("-","_") + func1 = getattr(self.__class__, arg+"_modules", None) + func2 = getattr(self.__class__, arg+"_of_unit", None) + func3 = getattr(self.__class__, "show_"+arg, None) + func4 = getattr(self.__class__, "system_"+arg, None) + func = func1 or func2 or func3 or func4 + if func is None: + print("error: no such command '%s'" % arg) + okay = False + else: + doc_text = "..." + doc = getattr(func, "__doc__", None) + if doc: + doc_text = doc.replace("\n","\n\n", 1).strip() + if "--" not in doc_text: + doc_text = "-- " + doc_text + else: + logg.debug("__doc__ of %s is none", func_name) + if not self._show_all: continue + lines.append("%s %s %s" % (prog, arg, doc_text)) + if not okay: + self.show_help() + return False + return lines + def systemd_version(self): + """ the version line for systemd compatibility """ + return "systemd %s\n - via systemctl.py %s" % (self._systemd_version, __version__) + def systemd_features(self): + """ the info line for systemd features """ + features1 = "-PAM -AUDIT -SELINUX -IMA -APPARMOR -SMACK" + features2 = " +SYSVINIT -UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS" + features3 = " -ACL -XZ -LZ4 -SECCOMP -BLKID -ELFUTILS -KMOD -IDN" + return features1+features2+features3 + def systems_version(self): + return [ self.systemd_version(), self.systemd_features() ] + +def print_result(result): + # logg_info = logg.info + # logg_debug = logg.debug + def logg_info(*msg): pass + def logg_debug(*msg): pass + exitcode = 0 + if result is None: + logg_info("EXEC END None") + elif result is True: + logg_info("EXEC END True") + result = None + exitcode = 0 + elif result is False: + logg_info("EXEC END False") + result = None + exitcode = 1 + elif isinstance(result, tuple) and len(result) == 2: + exitcode, status = result + logg_info("EXEC END %s '%s'", exitcode, status) + if exitcode is True: exitcode = 0 + if exitcode is False: exitcode = 1 + result = status + elif isinstance(result, int): + logg_info("EXEC END %s", result) + exitcode = result + result = None + # + if result is None: + pass + elif isinstance(result, string_types): + print(result) + result1 = result.split("\n")[0][:-20] + if result == result1: + logg_info("EXEC END '%s'", result) + else: + logg_info("EXEC END '%s...'", result1) + logg_debug(" END '%s'", result) + elif isinstance(result, list) or hasattr(result, "next") or hasattr(result, "__next__"): + shown = 0 + for element in result: + if isinstance(element, tuple): + print("\t".join([ str(elem) for elem in element] )) + else: + print(element) + shown += 1 + logg_info("EXEC END %s items", shown) + logg_debug(" END %s", result) + elif hasattr(result, "keys"): + shown = 0 + for key in sorted(result.keys()): + element = result[key] + if isinstance(element, tuple): + print(key,"=","\t".join([ str(elem) for elem in element])) + else: + print("%s=%s" % (key,element)) + shown += 1 + logg_info("EXEC END %s items", shown) + logg_debug(" END %s", result) + else: + logg.warning("EXEC END Unknown result type %s", str(type(result))) + return exitcode + +if __name__ == "__main__": + import optparse + _o = optparse.OptionParser("%prog [options] command [name...]", + epilog="use 'help' command for more information") + _o.add_option("--version", action="store_true", + help="Show package version") + _o.add_option("--system", action="store_true", default=False, + help="Connect to system manager (default)") # overrides --user + _o.add_option("--user", action="store_true", default=_user_mode, + help="Connect to user service manager") + # _o.add_option("-H", "--host", metavar="[USER@]HOST", + # help="Operate on remote host*") + # _o.add_option("-M", "--machine", metavar="CONTAINER", + # help="Operate on local container*") + _o.add_option("-t","--type", metavar="TYPE", dest="unit_type", default=_unit_type, + help="List units of a particual type") + _o.add_option("--state", metavar="STATE", default=_unit_state, + help="List units with particular LOAD or SUB or ACTIVE state") + _o.add_option("-p", "--property", metavar="NAME", dest="unit_property", default=_unit_property, + help="Show only properties by this name") + _o.add_option("-a", "--all", action="store_true", dest="show_all", default=_show_all, + help="Show all loaded units/properties, including dead empty ones. To list all units installed on the system, use the 'list-unit-files' command instead") + _o.add_option("-l","--full", action="store_true", default=_full, + help="Don't ellipsize unit names on output (never ellipsized)") + _o.add_option("--reverse", action="store_true", + help="Show reverse dependencies with 'list-dependencies' (ignored)") + _o.add_option("--job-mode", metavar="MODE", + help="Specifiy how to deal with already queued jobs, when queuing a new job (ignored)") + _o.add_option("--show-types", action="store_true", + help="When showing sockets, explicitly show their type (ignored)") + _o.add_option("-i","--ignore-inhibitors", action="store_true", + help="When shutting down or sleeping, ignore inhibitors (ignored)") + _o.add_option("--kill-who", metavar="WHO", + help="Who to send signal to (ignored)") + _o.add_option("-s", "--signal", metavar="SIG", + help="Which signal to send (ignored)") + _o.add_option("--now", action="store_true", default=_now, + help="Start or stop unit in addition to enabling or disabling it") + _o.add_option("-q","--quiet", action="store_true", default=_quiet, + help="Suppress output") + _o.add_option("--no-block", action="store_true", default=False, + help="Do not wait until operation finished (ignored)") + _o.add_option("--no-legend", action="store_true", default=_no_legend, + help="Do not print a legend (column headers and hints)") + _o.add_option("--no-wall", action="store_true", default=False, + help="Don't send wall message before halt/power-off/reboot (ignored)") + _o.add_option("--no-reload", action="store_true", + help="Don't reload daemon after en-/dis-abling unit files (ignored)") + _o.add_option("--no-ask-password", action="store_true", default=_no_ask_password, + help="Do not ask for system passwords") + # _o.add_option("--global", action="store_true", dest="globally", default=_globally, + # help="Enable/disable unit files globally") # for all user logins + # _o.add_option("--runtime", action="store_true", + # help="Enable unit files only temporarily until next reboot") + _o.add_option("--force", action="store_true", default=_force, + help="When enabling unit files, override existing symblinks / When shutting down, execute action immediately") + _o.add_option("--preset-mode", metavar="TYPE", default=_preset_mode, + help="Apply only enable, only disable, or all presets [%default]") + _o.add_option("--root", metavar="PATH", default=_root, + help="Enable unit files in the specified root directory (used for alternative root prefix)") + _o.add_option("-n","--lines", metavar="NUM", + help="Number of journal entries to show (ignored)") + _o.add_option("-o","--output", metavar="CAT", + help="change journal output mode [short, ..., cat] (ignored)") + _o.add_option("--plain", action="store_true", + help="Print unit dependencies as a list instead of a tree (ignored)") + _o.add_option("--no-pager", action="store_true", + help="Do not pipe output into pager (ignored)") + # + _o.add_option("--coverage", metavar="OPTIONLIST", default=COVERAGE, + help="..support for coverage (e.g. spawn,oldest,sleep) [%default]") + _o.add_option("-e","--extra-vars", "--environment", metavar="NAME=VAL", action="append", default=[], + help="..override settings in the syntax of 'Environment='") + _o.add_option("-v","--verbose", action="count", default=0, + help="..increase debugging information level") + _o.add_option("-4","--ipv4", action="store_true", default=False, + help="..only keep ipv4 localhost in /etc/hosts") + _o.add_option("-6","--ipv6", action="store_true", default=False, + help="..only keep ipv6 localhost in /etc/hosts") + _o.add_option("-1","--init", action="store_true", default=False, + help="..keep running as init-process (default if PID 1)") + opt, args = _o.parse_args() + logging.basicConfig(level = max(0, logging.FATAL - 10 * opt.verbose)) + logg.setLevel(max(0, logging.ERROR - 10 * opt.verbose)) + # + COVERAGE = opt.coverage + if "sleep" in COVERAGE: + MinimumTimeoutStartSec = 7 + MinimumTimeoutStopSec = 7 + if "quick" in COVERAGE: + MinimumTimeoutStartSec = 4 + MinimumTimeoutStopSec = 4 + DefaultTimeoutStartSec = 9 + DefaultTimeoutStopSec = 9 + _extra_vars = opt.extra_vars + _force = opt.force + _full = opt.full + _no_legend = opt.no_legend + _no_ask_password = opt.no_ask_password + _now = opt.now + _preset_mode = opt.preset_mode + _quiet = opt.quiet + _root = opt.root + _show_all = opt.show_all + _unit_state = opt.state + _unit_type = opt.unit_type + _unit_property = opt.unit_property + # being PID 1 (or 0) in a container will imply --init + _pid = os.getpid() + _init = opt.init or _pid in [ 1, 0 ] + _user_mode = opt.user + if os.geteuid() and _pid in [ 1, 0 ]: + _user_mode = True + if opt.system: + _user_mode = False # override --user + # + if _user_mode: + systemctl_debug_log = os_path(_root, _var_path(_systemctl_debug_log)) + systemctl_extra_log = os_path(_root, _var_path(_systemctl_extra_log)) + else: + systemctl_debug_log = os_path(_root, _systemctl_debug_log) + systemctl_extra_log = os_path(_root, _systemctl_extra_log) + if os.access(systemctl_extra_log, os.W_OK): + loggfile = logging.FileHandler(systemctl_extra_log) + loggfile.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) + logg.addHandler(loggfile) + logg.setLevel(max(0, logging.INFO - 10 * opt.verbose)) + if os.access(systemctl_debug_log, os.W_OK): + loggfile = logging.FileHandler(systemctl_debug_log) + loggfile.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) + logg.addHandler(loggfile) + logg.setLevel(logging.DEBUG) + logg.info("EXEC BEGIN %s %s%s%s", os.path.realpath(sys.argv[0]), " ".join(args), + _user_mode and " --user" or " --system", _init and " --init" or "", ) + # + # + systemctl = Systemctl() + if opt.version: + args = [ "version" ] + if not args: + if _init: + args = [ "default" ] + else: + args = [ "list-units" ] + logg.debug("======= systemctl.py " + " ".join(args)) + command = args[0] + modules = args[1:] + if opt.ipv4: + systemctl.force_ipv4() + elif opt.ipv6: + systemctl.force_ipv6() + found = False + # command NAME + if command.startswith("__"): + command_name = command[2:] + command_func = getattr(systemctl, command_name, None) + if callable(command_func) and not found: + found = True + result = command_func(*modules) + command_name = command.replace("-","_").replace(".","_")+"_modules" + command_func = getattr(systemctl, command_name, None) + if callable(command_func) and not found: + systemctl.wait_boot(command_name) + found = True + result = command_func(*modules) + command_name = "show_"+command.replace("-","_").replace(".","_") + command_func = getattr(systemctl, command_name, None) + if callable(command_func) and not found: + systemctl.wait_boot(command_name) + found = True + result = command_func(*modules) + command_name = "system_"+command.replace("-","_").replace(".","_") + command_func = getattr(systemctl, command_name, None) + if callable(command_func) and not found: + systemctl.wait_boot(command_name) + found = True + result = command_func() + command_name = "systems_"+command.replace("-","_").replace(".","_") + command_func = getattr(systemctl, command_name, None) + if callable(command_func) and not found: + systemctl.wait_boot(command_name) + found = True + result = command_func() + if not found: + logg.error("Unknown operation %s.", command) + sys.exit(1) + # + sys.exit(print_result(result)) diff --git a/docker/mini/vttablet-mini-up.sh b/docker/mini/vttablet-mini-up.sh new file mode 100755 index 00000000000..e59e9d7115d --- /dev/null +++ b/docker/mini/vttablet-mini-up.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +# Copyright 2019 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +mysql_host="$1" +mysql_port="$2" +tablet_port="$3" + +source ./env.sh + +cell=${CELL:-'test'} +keyspace=${KEYSPACE:-'test_keyspace'} +shard=${SHARD:-'0'} +uid=$TABLET_UID +port=$tablet_port +grpc_port=$[16000 + $uid] +printf -v alias '%s-%010d' $cell $uid +printf -v tablet_dir 'vt_%010d' $uid +tablet_hostname="$mysql_host" +printf -v tablet_logfile 'vttablet_%010d_querylog.txt' $uid + +mkdir -p "$VTDATAROOT/$tablet_dir" + +tablet_type=replica + +echo "Starting vttablet for $alias on port $port and mysql $mysql_host:$mysql_port" +# shellcheck disable=SC2086 +vttablet \ + $TOPOLOGY_FLAGS \ + -log_dir $VTDATAROOT/tmp \ + -log_queries_to_file $VTDATAROOT/tmp/$tablet_logfile \ + -tablet-path $alias \ + -tablet_hostname "$tablet_hostname" \ + -init_db_name_override "$keyspace" \ + -init_keyspace $keyspace \ + -init_shard $shard \ + -init_tablet_type $tablet_type \ + -health_check_interval 5s \ + -enable_semi_sync \ + -enable_replication_reporter \ + -backup_storage_implementation file \ + -file_backup_storage_root $VTDATAROOT/backups \ + -port $port \ + -grpc_port $grpc_port \ + -db_host $mysql_host \ + -db_port $mysql_port \ + -db_app_user $TOPOLOGY_USER \ + -db_app_password $TOPOLOGY_PASSWORD \ + -db_dba_user $TOPOLOGY_USER \ + -db_dba_password $TOPOLOGY_PASSWORD \ + -mycnf_mysql_port $mysql_port \ + -service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' \ + -pid_file $VTDATAROOT/$tablet_dir/vttablet.pid \ + -vtctld_addr http://$hostname:$vtctld_web_port/ \ + > $VTDATAROOT/$tablet_dir/vttablet.out 2>&1 & + +# Block waiting for the tablet to be listening +# Not the same as healthy + +for i in $(seq 0 300); do + curl -I "http://$hostname:$port/debug/status" >/dev/null 2>&1 && break + sleep 0.1 +done + +# check one last time +curl -I "http://$hostname:$port/debug/status" >/dev/null 2>&1 || fail "tablet could not be started!" From a77b62c28ba809a646a002aaaaaa69cf4dd767c0 Mon Sep 17 00:00:00 2001 From: Jacques Grove Date: Wed, 24 Jun 2020 08:48:15 -0700 Subject: [PATCH 087/430] Add XOR operator support. Signed-off-by: Jacques Grove --- go/vt/sqlparser/ast.go | 11 + go/vt/sqlparser/parse_test.go | 10 + go/vt/sqlparser/precedence.go | 4 +- go/vt/sqlparser/precedence_test.go | 2 + go/vt/sqlparser/random_expr.go | 10 + go/vt/sqlparser/rewriter.go | 12 + go/vt/sqlparser/sql.go | 5749 ++++++++++++++-------------- go/vt/sqlparser/sql.y | 6 + go/vt/sqlparser/token.go | 2 +- 9 files changed, 2958 insertions(+), 2848 deletions(-) diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 04e1445c3e7..06e8d6e706f 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -578,6 +578,11 @@ type ( Left, Right Expr } + // XorExpr represents an XOR expression. + XorExpr struct { + Left, Right Expr + } + // NotExpr represents a NOT expression. NotExpr struct { Expr Expr @@ -759,6 +764,7 @@ type ( // iExpr ensures that only expressions nodes can be assigned to a Expr func (*AndExpr) iExpr() {} func (*OrExpr) iExpr() {} +func (*XorExpr) iExpr() {} func (*NotExpr) iExpr() {} func (*ComparisonExpr) iExpr() {} func (*RangeCond) iExpr() {} @@ -1538,6 +1544,11 @@ func (node *OrExpr) Format(buf *TrackedBuffer) { buf.astPrintf(node, "%v or %v", node.Left, node.Right) } +// Format formats the node. +func (node *XorExpr) Format(buf *TrackedBuffer) { + buf.astPrintf(node, "%v xor %v", node.Left, node.Right) +} + // Format formats the node. func (node *NotExpr) Format(buf *TrackedBuffer) { buf.astPrintf(node, "not %v", node.Expr) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 496a329857d..83a8a17880c 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -635,6 +635,16 @@ var ( }, { input: "select /* OR in select columns */ (a or b) from t where c = 5", output: "select /* OR in select columns */ a or b from t where c = 5", + }, { + input: "select /* XOR of columns in where */ * from t where a xor b", + }, { + input: "select /* XOR of mixed columns in where */ * from t where a = 5 xor b and c is not null", + }, { + input: "select /* XOR in select columns */ (a xor b) from t where c = 5", + output: "select /* XOR in select columns */ a xor b from t where c = 5", + }, { + input: "select /* XOR in select columns */ * from t where (1 xor c1 > 0)", + output: "select /* XOR in select columns */ * from t where 1 xor c1 > 0", }, { input: "select /* bool as select value */ a, true from t", }, { diff --git a/go/vt/sqlparser/precedence.go b/go/vt/sqlparser/precedence.go index dbb8343baa2..44610114599 100644 --- a/go/vt/sqlparser/precedence.go +++ b/go/vt/sqlparser/precedence.go @@ -49,8 +49,8 @@ func precedenceFor(in Expr) Precendence { switch node := in.(type) { case *OrExpr: return P16 - //case *XorExpr: TODO add parser support for XOR - // return P15 + case *XorExpr: + return P15 case *AndExpr: return P14 case *NotExpr: diff --git a/go/vt/sqlparser/precedence_test.go b/go/vt/sqlparser/precedence_test.go index f159695c130..8292ccddff9 100644 --- a/go/vt/sqlparser/precedence_test.go +++ b/go/vt/sqlparser/precedence_test.go @@ -30,6 +30,8 @@ func readable(node Expr) string { return fmt.Sprintf("(%s or %s)", readable(node.Left), readable(node.Right)) case *AndExpr: return fmt.Sprintf("(%s and %s)", readable(node.Left), readable(node.Right)) + case *XorExpr: + return fmt.Sprintf("(%s xor %s)", readable(node.Left), readable(node.Right)) case *BinaryExpr: return fmt.Sprintf("(%s %s %s)", readable(node.Left), node.Operator, readable(node.Right)) case *IsExpr: diff --git a/go/vt/sqlparser/random_expr.go b/go/vt/sqlparser/random_expr.go index 510a187902e..783d96c6fe5 100644 --- a/go/vt/sqlparser/random_expr.go +++ b/go/vt/sqlparser/random_expr.go @@ -86,6 +86,7 @@ func (g *generator) booleanExpr() Expr { options := []exprF{ func() Expr { return g.andExpr() }, + func() Expr { return g.xorExpr() }, func() Expr { return g.orExpr() }, func() Expr { return g.comparison(g.intExpr) }, func() Expr { return g.comparison(g.stringExpr) }, @@ -250,6 +251,15 @@ func (g *generator) orExpr() Expr { } } +func (g *generator) xorExpr() Expr { + g.enter() + defer g.exit() + return &XorExpr{ + Left: g.booleanExpr(), + Right: g.booleanExpr(), + } +} + func (g *generator) notExpr() Expr { g.enter() defer g.exit() diff --git a/go/vt/sqlparser/rewriter.go b/go/vt/sqlparser/rewriter.go index 0ecde3dc1de..e81701cc00f 100644 --- a/go/vt/sqlparser/rewriter.go +++ b/go/vt/sqlparser/rewriter.go @@ -864,6 +864,14 @@ func replaceWhereExpr(newNode, parent SQLNode) { parent.(*Where).Expr = newNode.(Expr) } +func replaceXorExprLeft(newNode, parent SQLNode) { + parent.(*XorExpr).Left = newNode.(Expr) +} + +func replaceXorExprRight(newNode, parent SQLNode) { + parent.(*XorExpr).Right = newNode.(Expr) +} + // apply is where the visiting happens. Here is where we keep the big switch-case that will be used // to do the actual visiting of SQLNodes func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { @@ -1377,6 +1385,10 @@ func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { case *Where: a.apply(node, n.Expr, replaceWhereExpr) + case *XorExpr: + a.apply(node, n.Left, replaceXorExprLeft) + a.apply(node, n.Right, replaceXorExprRight) + default: panic("unknown ast type " + reflect.TypeOf(node).String()) } diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 51696c69aab..4019e1664b3 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -180,277 +180,278 @@ const TRUE = 57413 const FALSE = 57414 const OFF = 57415 const OR = 57416 -const AND = 57417 -const NOT = 57418 -const BETWEEN = 57419 -const CASE = 57420 -const WHEN = 57421 -const THEN = 57422 -const ELSE = 57423 -const END = 57424 -const LE = 57425 -const GE = 57426 -const NE = 57427 -const NULL_SAFE_EQUAL = 57428 -const IS = 57429 -const LIKE = 57430 -const REGEXP = 57431 -const IN = 57432 -const SHIFT_LEFT = 57433 -const SHIFT_RIGHT = 57434 -const DIV = 57435 -const MOD = 57436 -const UNARY = 57437 -const COLLATE = 57438 -const BINARY = 57439 -const UNDERSCORE_BINARY = 57440 -const UNDERSCORE_UTF8MB4 = 57441 -const UNDERSCORE_UTF8 = 57442 -const UNDERSCORE_LATIN1 = 57443 -const INTERVAL = 57444 -const JSON_EXTRACT_OP = 57445 -const JSON_UNQUOTE_EXTRACT_OP = 57446 -const CREATE = 57447 -const ALTER = 57448 -const DROP = 57449 -const RENAME = 57450 -const ANALYZE = 57451 -const ADD = 57452 -const FLUSH = 57453 -const SCHEMA = 57454 -const TABLE = 57455 -const INDEX = 57456 -const VIEW = 57457 -const TO = 57458 -const IGNORE = 57459 -const IF = 57460 -const UNIQUE = 57461 -const PRIMARY = 57462 -const COLUMN = 57463 -const SPATIAL = 57464 -const FULLTEXT = 57465 -const KEY_BLOCK_SIZE = 57466 -const CHECK = 57467 -const INDEXES = 57468 -const ACTION = 57469 -const CASCADE = 57470 -const CONSTRAINT = 57471 -const FOREIGN = 57472 -const NO = 57473 -const REFERENCES = 57474 -const RESTRICT = 57475 -const SHOW = 57476 -const DESCRIBE = 57477 -const EXPLAIN = 57478 -const DATE = 57479 -const ESCAPE = 57480 -const REPAIR = 57481 -const OPTIMIZE = 57482 -const TRUNCATE = 57483 -const MAXVALUE = 57484 -const PARTITION = 57485 -const REORGANIZE = 57486 -const LESS = 57487 -const THAN = 57488 -const PROCEDURE = 57489 -const TRIGGER = 57490 -const VINDEX = 57491 -const VINDEXES = 57492 -const STATUS = 57493 -const VARIABLES = 57494 -const WARNINGS = 57495 -const SEQUENCE = 57496 -const BEGIN = 57497 -const START = 57498 -const TRANSACTION = 57499 -const COMMIT = 57500 -const ROLLBACK = 57501 -const SAVEPOINT = 57502 -const RELEASE = 57503 -const WORK = 57504 -const BIT = 57505 -const TINYINT = 57506 -const SMALLINT = 57507 -const MEDIUMINT = 57508 -const INT = 57509 -const INTEGER = 57510 -const BIGINT = 57511 -const INTNUM = 57512 -const REAL = 57513 -const DOUBLE = 57514 -const FLOAT_TYPE = 57515 -const DECIMAL = 57516 -const NUMERIC = 57517 -const TIME = 57518 -const TIMESTAMP = 57519 -const DATETIME = 57520 -const YEAR = 57521 -const CHAR = 57522 -const VARCHAR = 57523 -const BOOL = 57524 -const CHARACTER = 57525 -const VARBINARY = 57526 -const NCHAR = 57527 -const TEXT = 57528 -const TINYTEXT = 57529 -const MEDIUMTEXT = 57530 -const LONGTEXT = 57531 -const BLOB = 57532 -const TINYBLOB = 57533 -const MEDIUMBLOB = 57534 -const LONGBLOB = 57535 -const JSON = 57536 -const ENUM = 57537 -const GEOMETRY = 57538 -const POINT = 57539 -const LINESTRING = 57540 -const POLYGON = 57541 -const GEOMETRYCOLLECTION = 57542 -const MULTIPOINT = 57543 -const MULTILINESTRING = 57544 -const MULTIPOLYGON = 57545 -const NULLX = 57546 -const AUTO_INCREMENT = 57547 -const APPROXNUM = 57548 -const SIGNED = 57549 -const UNSIGNED = 57550 -const ZEROFILL = 57551 -const COLLATION = 57552 -const DATABASES = 57553 -const TABLES = 57554 -const VITESS_METADATA = 57555 -const VSCHEMA = 57556 -const FULL = 57557 -const PROCESSLIST = 57558 -const COLUMNS = 57559 -const FIELDS = 57560 -const ENGINES = 57561 -const PLUGINS = 57562 -const EXTENDED = 57563 -const NAMES = 57564 -const CHARSET = 57565 -const GLOBAL = 57566 -const SESSION = 57567 -const ISOLATION = 57568 -const LEVEL = 57569 -const READ = 57570 -const WRITE = 57571 -const ONLY = 57572 -const REPEATABLE = 57573 -const COMMITTED = 57574 -const UNCOMMITTED = 57575 -const SERIALIZABLE = 57576 -const CURRENT_TIMESTAMP = 57577 -const DATABASE = 57578 -const CURRENT_DATE = 57579 -const CURRENT_TIME = 57580 -const LOCALTIME = 57581 -const LOCALTIMESTAMP = 57582 -const UTC_DATE = 57583 -const UTC_TIME = 57584 -const UTC_TIMESTAMP = 57585 -const REPLACE = 57586 -const CONVERT = 57587 -const CAST = 57588 -const SUBSTR = 57589 -const SUBSTRING = 57590 -const GROUP_CONCAT = 57591 -const SEPARATOR = 57592 -const TIMESTAMPADD = 57593 -const TIMESTAMPDIFF = 57594 -const MATCH = 57595 -const AGAINST = 57596 -const BOOLEAN = 57597 -const LANGUAGE = 57598 -const WITH = 57599 -const QUERY = 57600 -const EXPANSION = 57601 -const UNUSED = 57602 -const ARRAY = 57603 -const CUME_DIST = 57604 -const DESCRIPTION = 57605 -const DENSE_RANK = 57606 -const EMPTY = 57607 -const EXCEPT = 57608 -const FIRST_VALUE = 57609 -const GROUPING = 57610 -const GROUPS = 57611 -const JSON_TABLE = 57612 -const LAG = 57613 -const LAST_VALUE = 57614 -const LATERAL = 57615 -const LEAD = 57616 -const MEMBER = 57617 -const NTH_VALUE = 57618 -const NTILE = 57619 -const OF = 57620 -const OVER = 57621 -const PERCENT_RANK = 57622 -const RANK = 57623 -const RECURSIVE = 57624 -const ROW_NUMBER = 57625 -const SYSTEM = 57626 -const WINDOW = 57627 -const ACTIVE = 57628 -const ADMIN = 57629 -const BUCKETS = 57630 -const CLONE = 57631 -const COMPONENT = 57632 -const DEFINITION = 57633 -const ENFORCED = 57634 -const EXCLUDE = 57635 -const FOLLOWING = 57636 -const GEOMCOLLECTION = 57637 -const GET_MASTER_PUBLIC_KEY = 57638 -const HISTOGRAM = 57639 -const HISTORY = 57640 -const INACTIVE = 57641 -const INVISIBLE = 57642 -const LOCKED = 57643 -const MASTER_COMPRESSION_ALGORITHMS = 57644 -const MASTER_PUBLIC_KEY_PATH = 57645 -const MASTER_TLS_CIPHERSUITES = 57646 -const MASTER_ZSTD_COMPRESSION_LEVEL = 57647 -const NESTED = 57648 -const NETWORK_NAMESPACE = 57649 -const NOWAIT = 57650 -const NULLS = 57651 -const OJ = 57652 -const OLD = 57653 -const OPTIONAL = 57654 -const ORDINALITY = 57655 -const ORGANIZATION = 57656 -const OTHERS = 57657 -const PATH = 57658 -const PERSIST = 57659 -const PERSIST_ONLY = 57660 -const PRECEDING = 57661 -const PRIVILEGE_CHECKS_USER = 57662 -const PROCESS = 57663 -const RANDOM = 57664 -const REFERENCE = 57665 -const REQUIRE_ROW_FORMAT = 57666 -const RESOURCE = 57667 -const RESPECT = 57668 -const RESTART = 57669 -const RETAIN = 57670 -const REUSE = 57671 -const ROLE = 57672 -const SECONDARY = 57673 -const SECONDARY_ENGINE = 57674 -const SECONDARY_LOAD = 57675 -const SECONDARY_UNLOAD = 57676 -const SKIP = 57677 -const SRID = 57678 -const THREAD_PRIORITY = 57679 -const TIES = 57680 -const UNBOUNDED = 57681 -const VCPU = 57682 -const VISIBLE = 57683 -const FORMAT = 57684 -const TREE = 57685 -const VITESS = 57686 -const TRADITIONAL = 57687 +const XOR = 57417 +const AND = 57418 +const NOT = 57419 +const BETWEEN = 57420 +const CASE = 57421 +const WHEN = 57422 +const THEN = 57423 +const ELSE = 57424 +const END = 57425 +const LE = 57426 +const GE = 57427 +const NE = 57428 +const NULL_SAFE_EQUAL = 57429 +const IS = 57430 +const LIKE = 57431 +const REGEXP = 57432 +const IN = 57433 +const SHIFT_LEFT = 57434 +const SHIFT_RIGHT = 57435 +const DIV = 57436 +const MOD = 57437 +const UNARY = 57438 +const COLLATE = 57439 +const BINARY = 57440 +const UNDERSCORE_BINARY = 57441 +const UNDERSCORE_UTF8MB4 = 57442 +const UNDERSCORE_UTF8 = 57443 +const UNDERSCORE_LATIN1 = 57444 +const INTERVAL = 57445 +const JSON_EXTRACT_OP = 57446 +const JSON_UNQUOTE_EXTRACT_OP = 57447 +const CREATE = 57448 +const ALTER = 57449 +const DROP = 57450 +const RENAME = 57451 +const ANALYZE = 57452 +const ADD = 57453 +const FLUSH = 57454 +const SCHEMA = 57455 +const TABLE = 57456 +const INDEX = 57457 +const VIEW = 57458 +const TO = 57459 +const IGNORE = 57460 +const IF = 57461 +const UNIQUE = 57462 +const PRIMARY = 57463 +const COLUMN = 57464 +const SPATIAL = 57465 +const FULLTEXT = 57466 +const KEY_BLOCK_SIZE = 57467 +const CHECK = 57468 +const INDEXES = 57469 +const ACTION = 57470 +const CASCADE = 57471 +const CONSTRAINT = 57472 +const FOREIGN = 57473 +const NO = 57474 +const REFERENCES = 57475 +const RESTRICT = 57476 +const SHOW = 57477 +const DESCRIBE = 57478 +const EXPLAIN = 57479 +const DATE = 57480 +const ESCAPE = 57481 +const REPAIR = 57482 +const OPTIMIZE = 57483 +const TRUNCATE = 57484 +const MAXVALUE = 57485 +const PARTITION = 57486 +const REORGANIZE = 57487 +const LESS = 57488 +const THAN = 57489 +const PROCEDURE = 57490 +const TRIGGER = 57491 +const VINDEX = 57492 +const VINDEXES = 57493 +const STATUS = 57494 +const VARIABLES = 57495 +const WARNINGS = 57496 +const SEQUENCE = 57497 +const BEGIN = 57498 +const START = 57499 +const TRANSACTION = 57500 +const COMMIT = 57501 +const ROLLBACK = 57502 +const SAVEPOINT = 57503 +const RELEASE = 57504 +const WORK = 57505 +const BIT = 57506 +const TINYINT = 57507 +const SMALLINT = 57508 +const MEDIUMINT = 57509 +const INT = 57510 +const INTEGER = 57511 +const BIGINT = 57512 +const INTNUM = 57513 +const REAL = 57514 +const DOUBLE = 57515 +const FLOAT_TYPE = 57516 +const DECIMAL = 57517 +const NUMERIC = 57518 +const TIME = 57519 +const TIMESTAMP = 57520 +const DATETIME = 57521 +const YEAR = 57522 +const CHAR = 57523 +const VARCHAR = 57524 +const BOOL = 57525 +const CHARACTER = 57526 +const VARBINARY = 57527 +const NCHAR = 57528 +const TEXT = 57529 +const TINYTEXT = 57530 +const MEDIUMTEXT = 57531 +const LONGTEXT = 57532 +const BLOB = 57533 +const TINYBLOB = 57534 +const MEDIUMBLOB = 57535 +const LONGBLOB = 57536 +const JSON = 57537 +const ENUM = 57538 +const GEOMETRY = 57539 +const POINT = 57540 +const LINESTRING = 57541 +const POLYGON = 57542 +const GEOMETRYCOLLECTION = 57543 +const MULTIPOINT = 57544 +const MULTILINESTRING = 57545 +const MULTIPOLYGON = 57546 +const NULLX = 57547 +const AUTO_INCREMENT = 57548 +const APPROXNUM = 57549 +const SIGNED = 57550 +const UNSIGNED = 57551 +const ZEROFILL = 57552 +const COLLATION = 57553 +const DATABASES = 57554 +const TABLES = 57555 +const VITESS_METADATA = 57556 +const VSCHEMA = 57557 +const FULL = 57558 +const PROCESSLIST = 57559 +const COLUMNS = 57560 +const FIELDS = 57561 +const ENGINES = 57562 +const PLUGINS = 57563 +const EXTENDED = 57564 +const NAMES = 57565 +const CHARSET = 57566 +const GLOBAL = 57567 +const SESSION = 57568 +const ISOLATION = 57569 +const LEVEL = 57570 +const READ = 57571 +const WRITE = 57572 +const ONLY = 57573 +const REPEATABLE = 57574 +const COMMITTED = 57575 +const UNCOMMITTED = 57576 +const SERIALIZABLE = 57577 +const CURRENT_TIMESTAMP = 57578 +const DATABASE = 57579 +const CURRENT_DATE = 57580 +const CURRENT_TIME = 57581 +const LOCALTIME = 57582 +const LOCALTIMESTAMP = 57583 +const UTC_DATE = 57584 +const UTC_TIME = 57585 +const UTC_TIMESTAMP = 57586 +const REPLACE = 57587 +const CONVERT = 57588 +const CAST = 57589 +const SUBSTR = 57590 +const SUBSTRING = 57591 +const GROUP_CONCAT = 57592 +const SEPARATOR = 57593 +const TIMESTAMPADD = 57594 +const TIMESTAMPDIFF = 57595 +const MATCH = 57596 +const AGAINST = 57597 +const BOOLEAN = 57598 +const LANGUAGE = 57599 +const WITH = 57600 +const QUERY = 57601 +const EXPANSION = 57602 +const UNUSED = 57603 +const ARRAY = 57604 +const CUME_DIST = 57605 +const DESCRIPTION = 57606 +const DENSE_RANK = 57607 +const EMPTY = 57608 +const EXCEPT = 57609 +const FIRST_VALUE = 57610 +const GROUPING = 57611 +const GROUPS = 57612 +const JSON_TABLE = 57613 +const LAG = 57614 +const LAST_VALUE = 57615 +const LATERAL = 57616 +const LEAD = 57617 +const MEMBER = 57618 +const NTH_VALUE = 57619 +const NTILE = 57620 +const OF = 57621 +const OVER = 57622 +const PERCENT_RANK = 57623 +const RANK = 57624 +const RECURSIVE = 57625 +const ROW_NUMBER = 57626 +const SYSTEM = 57627 +const WINDOW = 57628 +const ACTIVE = 57629 +const ADMIN = 57630 +const BUCKETS = 57631 +const CLONE = 57632 +const COMPONENT = 57633 +const DEFINITION = 57634 +const ENFORCED = 57635 +const EXCLUDE = 57636 +const FOLLOWING = 57637 +const GEOMCOLLECTION = 57638 +const GET_MASTER_PUBLIC_KEY = 57639 +const HISTOGRAM = 57640 +const HISTORY = 57641 +const INACTIVE = 57642 +const INVISIBLE = 57643 +const LOCKED = 57644 +const MASTER_COMPRESSION_ALGORITHMS = 57645 +const MASTER_PUBLIC_KEY_PATH = 57646 +const MASTER_TLS_CIPHERSUITES = 57647 +const MASTER_ZSTD_COMPRESSION_LEVEL = 57648 +const NESTED = 57649 +const NETWORK_NAMESPACE = 57650 +const NOWAIT = 57651 +const NULLS = 57652 +const OJ = 57653 +const OLD = 57654 +const OPTIONAL = 57655 +const ORDINALITY = 57656 +const ORGANIZATION = 57657 +const OTHERS = 57658 +const PATH = 57659 +const PERSIST = 57660 +const PERSIST_ONLY = 57661 +const PRECEDING = 57662 +const PRIVILEGE_CHECKS_USER = 57663 +const PROCESS = 57664 +const RANDOM = 57665 +const REFERENCE = 57666 +const REQUIRE_ROW_FORMAT = 57667 +const RESOURCE = 57668 +const RESPECT = 57669 +const RESTART = 57670 +const RETAIN = 57671 +const REUSE = 57672 +const ROLE = 57673 +const SECONDARY = 57674 +const SECONDARY_ENGINE = 57675 +const SECONDARY_LOAD = 57676 +const SECONDARY_UNLOAD = 57677 +const SKIP = 57678 +const SRID = 57679 +const THREAD_PRIORITY = 57680 +const TIES = 57681 +const UNBOUNDED = 57682 +const VCPU = 57683 +const VISIBLE = 57684 +const FORMAT = 57685 +const TREE = 57686 +const VITESS = 57687 +const TRADITIONAL = 57688 var yyToknames = [...]string{ "$end", @@ -530,6 +531,7 @@ var yyToknames = [...]string{ "FALSE", "OFF", "OR", + "XOR", "AND", "NOT", "'!'", @@ -830,23 +832,23 @@ var yyExca = [...]int{ -2, 0, -1, 42, 33, 305, - 131, 305, - 143, 305, - 168, 319, + 132, 305, + 144, 305, 169, 319, + 170, 319, -2, 307, -1, 47, - 133, 329, + 134, 329, -2, 327, -1, 70, 38, 365, -2, 373, -1, 385, - 119, 695, - -2, 691, - -1, 386, - 119, 696, + 120, 696, -2, 692, + -1, 386, + 120, 697, + -2, 693, -1, 400, 38, 366, -2, 378, @@ -854,382 +856,401 @@ var yyExca = [...]int{ 38, 367, -2, 379, -1, 424, - 87, 947, + 88, 949, -2, 72, -1, 425, - 87, 863, + 88, 865, -2, 73, -1, 430, - 87, 831, - -2, 657, + 88, 833, + -2, 658, -1, 432, - 87, 894, - -2, 659, - -1, 750, + 88, 896, + -2, 660, + -1, 752, 56, 54, 58, 54, -2, 58, - -1, 926, - 119, 698, - -2, 694, - -1, 1354, - 5, 616, - 17, 616, - 19, 616, - 31, 616, - 59, 616, + -1, 929, + 120, 699, + -2, 695, + -1, 1357, + 5, 617, + 17, 617, + 19, 617, + 31, 617, + 59, 617, -2, 404, } const yyPrivate = 57344 -const yyLast = 17015 +const yyLast = 17527 var yyAct = [...]int{ - 385, 1593, 1583, 1393, 1550, 1281, 1186, 1466, 1499, 329, - 1453, 1206, 595, 1334, 344, 1367, 1004, 1031, 358, 1060, - 1187, 1331, 1335, 584, 717, 1232, 1030, 1340, 1346, 678, - 1074, 1300, 1040, 69, 3, 1027, 913, 89, 1125, 868, - 429, 280, 315, 300, 280, 1258, 1249, 724, 1006, 89, - 920, 280, 849, 393, 763, 727, 1174, 402, 1044, 990, - 1001, 722, 890, 744, 749, 946, 1054, 553, 331, 27, - 387, 418, 1070, 762, 983, 67, 280, 89, 734, 327, - 554, 280, 877, 280, 752, 65, 320, 70, 64, 426, - 743, 691, 7, 6, 5, 316, 423, 1093, 319, 573, - 1586, 1570, 1581, 1558, 415, 278, 1578, 1394, 692, 1569, - 1557, 1092, 1317, 1423, 558, 311, 1362, 1363, 72, 73, - 74, 75, 76, 1361, 91, 92, 93, 613, 408, 1022, - 1023, 1021, 359, 28, 29, 388, 58, 32, 33, 764, - 417, 765, 91, 92, 93, 555, 318, 557, 317, 276, - 272, 273, 274, 1091, 1240, 268, 1053, 1456, 266, 1283, - 270, 28, 1525, 640, 639, 649, 650, 642, 643, 644, - 645, 646, 647, 648, 641, 1061, 370, 651, 376, 377, - 374, 375, 373, 372, 371, 57, 91, 92, 93, 612, - 1414, 1412, 378, 379, 590, 308, 592, 1220, 389, 876, - 1219, 310, 306, 1221, 838, 1088, 1085, 1086, 608, 1084, - 601, 602, 609, 606, 607, 1284, 611, 837, 1285, 835, - 1580, 1577, 1551, 1280, 1045, 91, 92, 93, 589, 591, - 923, 878, 879, 880, 1543, 984, 1601, 598, 574, 284, - 1301, 1508, 1095, 1098, 560, 839, 270, 1286, 287, 1500, - 842, 1207, 1209, 836, 615, 826, 294, 269, 1532, 563, - 1277, 1357, 1597, 1356, 1502, 1355, 1279, 280, 565, 566, - 1047, 556, 280, 275, 575, 1047, 283, 271, 280, 267, - 1105, 1303, 1090, 1104, 280, 582, 1436, 1144, 588, 89, - 292, 1141, 1216, 89, 1179, 89, 299, 663, 664, 1154, - 1133, 89, 758, 738, 1089, 676, 580, 91, 92, 93, - 641, 89, 89, 651, 1028, 651, 1017, 587, 1305, 963, - 1309, 629, 1304, 869, 1302, 586, 285, 1541, 873, 1307, - 1556, 564, 1208, 631, 1501, 597, 572, 631, 1306, 1526, - 863, 79, 579, 1517, 1094, 1344, 621, 599, 581, 1509, - 1507, 1308, 1310, 296, 288, 766, 297, 298, 304, 1096, - 626, 627, 289, 291, 301, 1061, 286, 303, 302, 1278, - 1047, 1276, 570, 1046, 576, 577, 578, 1595, 1046, 80, - 1596, 1140, 1594, 1043, 1041, 625, 1042, 1319, 947, 59, - 91, 92, 93, 1039, 1045, 661, 663, 664, 828, 1238, - 663, 664, 91, 92, 93, 624, 622, 623, 585, 870, - 947, 89, 1151, 280, 280, 280, 897, 1268, 968, 969, - 1546, 594, 89, 715, 731, 594, 864, 594, 89, 679, - 895, 896, 894, 594, 426, 714, 630, 629, 1602, 567, - 57, 568, 1050, 1380, 569, 28, 559, 1561, 1051, 1264, - 1265, 1266, 893, 631, 1139, 1462, 1138, 1461, 660, 662, - 728, 1253, 1252, 694, 696, 698, 700, 702, 704, 705, - 1241, 630, 629, 1046, 742, 630, 629, 741, 716, 750, - 695, 697, 1603, 701, 703, 1563, 706, 1542, 631, 675, - 1479, 1459, 631, 680, 681, 682, 683, 684, 685, 686, - 687, 756, 690, 693, 693, 693, 699, 693, 693, 699, - 693, 707, 708, 709, 710, 711, 712, 713, 761, 751, - 1267, 1250, 28, 1115, 854, 1272, 1269, 1260, 1270, 1263, - 66, 1259, 561, 562, 397, 1261, 1262, 642, 643, 644, - 645, 646, 647, 648, 641, 1514, 748, 651, 1513, 1271, - 91, 92, 93, 280, 986, 965, 1376, 824, 89, 265, - 827, 1048, 829, 280, 280, 89, 89, 89, 1118, 1119, - 1120, 280, 1505, 1579, 280, 1565, 397, 280, 847, 848, - 1175, 280, 987, 89, 397, 552, 1175, 1343, 89, 89, - 89, 280, 89, 89, 1432, 964, 644, 645, 646, 647, - 648, 641, 89, 89, 651, 630, 629, 853, 630, 629, - 1505, 1554, 1321, 1332, 630, 629, 1343, 774, 885, 887, - 888, 851, 631, 628, 886, 631, 987, 830, 831, 1516, - 726, 631, 1343, 412, 413, 840, 1505, 397, 417, 1505, - 1533, 846, 649, 650, 642, 643, 644, 645, 646, 647, - 648, 641, 914, 891, 651, 859, 91, 92, 93, 1384, - 915, 916, 640, 639, 649, 650, 642, 643, 644, 645, - 646, 647, 648, 641, 987, 89, 651, 29, 843, 1505, - 1504, 1224, 347, 346, 349, 350, 351, 352, 1020, 924, - 594, 348, 353, 1157, 935, 938, 1156, 594, 594, 594, - 948, 1451, 1450, 892, 91, 92, 93, 1486, 89, 89, - 91, 92, 93, 976, 1223, 594, 1011, 926, 753, 1126, - 594, 594, 594, 753, 594, 594, 89, 930, 57, 925, - 1438, 397, 679, 280, 594, 594, 89, 1435, 397, 1386, - 1385, 280, 754, 917, 918, 1382, 1383, 1382, 1381, 280, - 280, 924, 68, 280, 280, 976, 397, 280, 280, 280, - 89, 956, 957, 927, 987, 397, 628, 397, 960, 977, - 29, 966, 426, 89, 554, 773, 772, 754, 970, 926, - 390, 841, 1002, 759, 29, 1032, 978, 755, 1282, 757, - 57, 982, 1571, 1468, 1181, 976, 1055, 979, 1443, 851, - 1182, 1075, 1372, 1347, 1348, 985, 1227, 1062, 1063, 1064, - 1071, 1066, 1065, 1012, 980, 1469, 976, 1014, 1013, 1078, - 1588, 57, 755, 1584, 753, 1010, 1374, 280, 89, 1015, - 89, 57, 1097, 1353, 1019, 57, 280, 280, 280, 280, - 280, 1035, 280, 280, 1350, 1332, 280, 89, 1254, 1056, - 1057, 1058, 1059, 874, 1076, 845, 1018, 1198, 1200, 1196, - 996, 997, 1199, 280, 1197, 1067, 1068, 1069, 280, 1352, - 280, 280, 1195, 1194, 403, 280, 89, 1575, 1568, 1325, - 1164, 1003, 725, 1237, 1573, 748, 1173, 1172, 404, 748, - 1245, 1079, 1112, 1072, 1073, 729, 730, 406, 1548, 405, - 1099, 1100, 1101, 1102, 1103, 1426, 1106, 1107, 771, 943, - 1108, 931, 932, 891, 583, 937, 940, 941, 992, 995, - 996, 997, 993, 944, 994, 998, 1425, 1110, 1347, 1348, - 718, 1547, 1111, 1484, 1235, 1229, 1430, 1081, 1464, 1116, - 955, 844, 719, 958, 959, 640, 639, 649, 650, 642, - 643, 644, 645, 646, 647, 648, 641, 1121, 1000, 651, - 594, 1429, 594, 892, 391, 392, 640, 639, 649, 650, - 642, 643, 644, 645, 646, 647, 648, 641, 280, 594, - 651, 394, 395, 68, 1135, 1163, 1175, 1428, 280, 280, - 280, 280, 280, 403, 1171, 1168, 1188, 388, 1134, 1328, - 280, 610, 1170, 1145, 280, 1590, 1589, 404, 280, 1142, - 386, 1150, 280, 867, 400, 401, 406, 1183, 405, 732, - 992, 995, 996, 997, 993, 951, 994, 998, 1167, 1222, - 1590, 89, 1176, 1530, 1457, 962, 1178, 1205, 1177, 390, - 1228, 66, 71, 1032, 1233, 1233, 63, 90, 1225, 1, - 1582, 281, 1190, 1191, 281, 1193, 1211, 1132, 1201, 90, - 389, 281, 1395, 1465, 1087, 593, 1549, 1212, 1498, 1214, - 1234, 1215, 1213, 1366, 1038, 1217, 1242, 1243, 1189, 89, - 89, 1192, 1029, 78, 551, 77, 281, 90, 1540, 862, - 596, 281, 1037, 281, 1036, 396, 1244, 1506, 1246, 1247, - 1248, 1230, 1231, 1455, 1049, 1239, 1052, 1373, 1236, 89, - 748, 1545, 779, 1251, 777, 778, 1184, 1185, 776, 781, - 748, 748, 748, 748, 748, 780, 1257, 775, 293, 421, - 875, 1273, 307, 999, 89, 767, 1003, 1077, 1210, 733, - 914, 81, 1275, 1274, 748, 1083, 1297, 872, 290, 604, - 1288, 1289, 1130, 1131, 605, 295, 659, 1169, 1218, 427, - 1299, 1290, 420, 1338, 967, 721, 1427, 1322, 1327, 1149, - 280, 688, 1312, 1148, 945, 747, 1311, 330, 884, 345, - 89, 342, 1298, 1296, 343, 89, 89, 971, 1333, 1180, - 633, 1188, 1297, 328, 322, 926, 1318, 746, 739, 991, - 989, 1336, 988, 416, 1349, 1345, 745, 925, 975, 399, - 1422, 89, 594, 1524, 398, 942, 50, 617, 312, 31, - 407, 1351, 22, 21, 20, 89, 19, 89, 89, 18, - 24, 1233, 1233, 17, 1326, 16, 15, 1032, 1358, 1032, - 571, 594, 35, 1342, 1365, 1420, 1379, 26, 25, 14, - 13, 1364, 12, 11, 10, 280, 1370, 1371, 9, 8, - 1359, 1369, 4, 620, 23, 677, 2, 0, 0, 0, - 1360, 0, 0, 0, 0, 280, 0, 281, 1377, 1378, - 0, 89, 281, 1396, 89, 89, 89, 280, 281, 0, - 0, 0, 0, 0, 281, 0, 0, 0, 0, 90, - 0, 1388, 0, 90, 0, 90, 0, 0, 0, 0, - 0, 90, 1401, 1402, 0, 1337, 1389, 28, 1391, 1387, - 0, 90, 90, 0, 640, 639, 649, 650, 642, 643, - 644, 645, 646, 647, 648, 641, 1410, 0, 651, 1390, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1400, 1405, 1188, 0, 1431, 0, 0, 600, 0, - 603, 0, 0, 0, 1440, 89, 614, 0, 1407, 1408, - 0, 1409, 0, 89, 1411, 0, 1413, 1032, 0, 0, - 0, 0, 1225, 0, 0, 0, 0, 0, 89, 0, - 1439, 0, 0, 0, 0, 89, 0, 0, 0, 0, - 0, 1458, 0, 1460, 356, 0, 0, 1467, 0, 1472, - 0, 0, 0, 1449, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 281, 281, 281, 0, 0, 1471, 0, - 1470, 0, 90, 0, 0, 1452, 89, 89, 90, 89, - 0, 88, 0, 0, 89, 0, 89, 89, 89, 280, - 1421, 1336, 89, 309, 1492, 1485, 1493, 1495, 1496, 1483, - 0, 0, 0, 0, 0, 1497, 0, 1503, 1487, 89, - 280, 0, 1510, 0, 0, 0, 1478, 0, 0, 1518, - 0, 428, 0, 0, 0, 0, 0, 0, 1445, 1446, - 1447, 0, 0, 1491, 1511, 0, 1512, 0, 0, 0, - 1531, 1539, 0, 0, 0, 1336, 89, 1538, 0, 1537, - 0, 0, 0, 0, 0, 0, 0, 89, 89, 0, - 594, 0, 0, 0, 1552, 0, 0, 0, 0, 1467, - 1032, 0, 0, 89, 1519, 1553, 0, 1559, 0, 0, - 1188, 0, 0, 0, 280, 0, 0, 0, 0, 0, - 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, - 1567, 0, 0, 281, 0, 1337, 0, 28, 90, 324, - 1572, 1574, 89, 281, 281, 90, 90, 90, 0, 0, - 0, 281, 1576, 0, 281, 1587, 0, 281, 0, 0, - 1419, 281, 1598, 90, 397, 0, 0, 1515, 90, 90, - 90, 281, 90, 90, 0, 0, 0, 0, 1562, 0, - 0, 0, 90, 90, 0, 0, 0, 0, 0, 1337, - 0, 0, 0, 825, 0, 0, 0, 0, 0, 0, - 832, 833, 834, 640, 639, 649, 650, 642, 643, 644, - 645, 646, 647, 648, 641, 1418, 0, 651, 852, 0, - 0, 0, 0, 856, 857, 858, 0, 860, 861, 0, - 0, 0, 0, 0, 0, 0, 0, 865, 866, 640, - 639, 649, 650, 642, 643, 644, 645, 646, 647, 648, - 641, 0, 0, 651, 0, 90, 0, 0, 0, 0, - 0, 0, 0, 428, 0, 0, 0, 428, 0, 428, - 0, 0, 0, 928, 929, 428, 0, 0, 0, 0, - 0, 0, 0, 1585, 0, 616, 618, 0, 90, 90, - 0, 0, 0, 0, 640, 639, 649, 650, 642, 643, - 644, 645, 646, 647, 648, 641, 90, 0, 651, 0, - 0, 961, 0, 281, 0, 0, 90, 0, 0, 0, - 0, 281, 0, 0, 0, 0, 410, 0, 0, 281, - 281, 0, 0, 281, 281, 0, 0, 281, 281, 281, - 90, 0, 0, 0, 0, 0, 635, 0, 638, 1417, - 0, 0, 0, 90, 652, 653, 654, 655, 656, 657, - 658, 0, 636, 637, 634, 640, 639, 649, 650, 642, - 643, 644, 645, 646, 647, 648, 641, 0, 0, 651, - 0, 0, 0, 321, 0, 736, 0, 0, 0, 0, + 385, 1586, 1596, 1396, 1553, 1284, 329, 1456, 1189, 1469, + 1034, 1502, 358, 1209, 344, 1337, 1370, 1007, 1190, 1334, + 1030, 1235, 69, 3, 596, 1338, 585, 393, 1043, 680, + 1077, 1033, 315, 1343, 1303, 923, 1349, 89, 851, 429, + 1128, 280, 870, 300, 280, 1252, 1261, 726, 765, 89, + 1004, 280, 1177, 1047, 751, 745, 719, 916, 993, 402, + 1009, 949, 893, 724, 1073, 729, 1057, 27, 387, 331, + 554, 423, 764, 986, 736, 67, 280, 89, 65, 327, + 555, 280, 746, 280, 415, 316, 320, 418, 319, 1063, + 754, 70, 879, 64, 7, 278, 6, 5, 594, 693, + 1096, 426, 574, 1589, 1573, 311, 1584, 1561, 1581, 1397, + 1572, 694, 1560, 1320, 1095, 1426, 559, 1365, 1366, 1025, + 1026, 1364, 72, 73, 74, 75, 76, 766, 318, 767, + 417, 268, 1024, 388, 266, 556, 270, 558, 408, 29, + 1304, 58, 32, 33, 614, 91, 92, 93, 91, 92, + 93, 276, 272, 273, 274, 317, 1094, 1528, 642, 641, + 651, 652, 644, 645, 646, 647, 648, 649, 650, 643, + 1243, 370, 653, 376, 377, 374, 375, 373, 372, 371, + 1223, 1306, 1056, 1222, 1286, 1459, 1224, 378, 379, 609, + 57, 1064, 1417, 610, 607, 608, 91, 92, 93, 1415, + 308, 878, 310, 306, 840, 612, 613, 602, 603, 1091, + 1088, 1089, 839, 1087, 1288, 837, 1583, 1580, 1308, 591, + 1312, 593, 1307, 1554, 1305, 1283, 987, 1546, 926, 1310, + 1048, 1604, 599, 269, 575, 1511, 1210, 1212, 1309, 561, + 1287, 880, 881, 882, 1503, 841, 1098, 1101, 838, 1271, + 270, 1311, 1313, 590, 592, 267, 1289, 844, 616, 1505, + 1280, 1050, 828, 1360, 1600, 564, 1282, 280, 566, 567, + 1050, 1359, 280, 1358, 576, 275, 557, 283, 280, 571, + 271, 1267, 1268, 1269, 280, 583, 1093, 1108, 589, 89, + 1107, 1147, 1535, 89, 1144, 89, 665, 666, 1439, 1219, + 1182, 89, 91, 92, 93, 1157, 1136, 760, 1092, 740, + 678, 89, 89, 581, 643, 1031, 653, 653, 1211, 1020, + 966, 565, 91, 92, 93, 900, 573, 79, 875, 871, + 1504, 598, 580, 1559, 1529, 622, 633, 1064, 582, 898, + 899, 897, 588, 600, 1512, 1510, 1544, 568, 1097, 569, + 627, 628, 570, 1270, 91, 92, 93, 587, 1275, 1272, + 1263, 1273, 1266, 1099, 1262, 1049, 80, 1520, 1264, 1265, + 1281, 1322, 1279, 1347, 1049, 768, 1383, 577, 578, 579, + 1598, 865, 1274, 1599, 630, 1597, 632, 630, 91, 92, + 93, 601, 626, 604, 950, 59, 663, 830, 1241, 615, + 633, 665, 666, 633, 665, 666, 1549, 625, 284, 623, + 624, 89, 717, 280, 280, 280, 872, 287, 631, 632, + 630, 1142, 89, 1141, 553, 294, 1324, 681, 89, 646, + 647, 648, 649, 650, 643, 716, 633, 653, 950, 733, + 1154, 586, 631, 632, 630, 1564, 426, 642, 641, 651, + 652, 644, 645, 646, 647, 648, 649, 650, 643, 292, + 633, 653, 730, 1465, 744, 299, 1566, 743, 866, 752, + 397, 696, 698, 700, 702, 704, 706, 707, 631, 632, + 630, 324, 718, 697, 699, 1053, 703, 705, 57, 708, + 560, 1464, 1054, 763, 1256, 285, 633, 1429, 1255, 753, + 896, 1244, 971, 972, 1129, 1545, 1482, 758, 1462, 1253, + 642, 641, 651, 652, 644, 645, 646, 647, 648, 649, + 650, 643, 296, 288, 653, 297, 298, 304, 1121, 1122, + 1123, 289, 291, 301, 1118, 286, 303, 302, 642, 641, + 651, 652, 644, 645, 646, 647, 648, 649, 650, 643, + 265, 856, 653, 1423, 280, 631, 632, 630, 826, 89, + 397, 829, 1605, 831, 280, 280, 89, 89, 89, 91, + 92, 93, 280, 633, 1517, 280, 562, 563, 280, 849, + 850, 1516, 280, 1379, 89, 1508, 1582, 1568, 397, 89, + 89, 89, 280, 89, 89, 644, 645, 646, 647, 648, + 649, 650, 643, 89, 89, 653, 1606, 1178, 776, 1508, + 1557, 855, 1178, 888, 890, 891, 1508, 397, 832, 833, + 889, 853, 1508, 1536, 412, 413, 842, 1051, 728, 417, + 1508, 1507, 848, 642, 641, 651, 652, 644, 645, 646, + 647, 648, 649, 650, 643, 1335, 861, 653, 1346, 894, + 1454, 1453, 1143, 990, 917, 1441, 397, 827, 1346, 845, + 968, 1438, 397, 919, 834, 835, 836, 651, 652, 644, + 645, 646, 647, 648, 649, 650, 643, 89, 1346, 653, + 1389, 1388, 854, 1385, 1386, 1385, 1384, 858, 859, 860, + 1435, 862, 863, 938, 941, 756, 66, 979, 397, 951, + 967, 867, 868, 927, 990, 397, 895, 631, 632, 630, + 89, 89, 91, 92, 93, 629, 918, 928, 929, 631, + 632, 630, 91, 92, 93, 633, 1226, 756, 89, 933, + 629, 397, 681, 775, 774, 280, 989, 633, 89, 1014, + 757, 755, 759, 280, 963, 920, 921, 29, 959, 960, + 397, 280, 280, 68, 973, 280, 280, 980, 930, 280, + 280, 280, 89, 1519, 990, 927, 1387, 990, 1227, 1023, + 1160, 1184, 757, 1005, 755, 89, 555, 1185, 1159, 985, + 929, 995, 998, 999, 1000, 996, 426, 997, 1001, 982, + 981, 1350, 1351, 979, 1591, 755, 979, 988, 57, 1035, + 853, 969, 843, 761, 979, 1015, 29, 390, 29, 1017, + 1016, 57, 983, 1574, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 1471, 1058, 1013, 1446, 1078, 280, + 89, 1375, 89, 1021, 1100, 1022, 1489, 1230, 280, 280, + 280, 280, 280, 1074, 280, 280, 1038, 1018, 280, 89, + 1069, 1059, 1060, 1061, 1062, 1068, 1079, 57, 57, 57, + 1350, 1351, 1285, 1472, 1081, 280, 1587, 1070, 1071, 1072, + 280, 1377, 280, 280, 1353, 1335, 1257, 280, 89, 1065, + 1066, 1067, 876, 1082, 847, 1201, 1199, 1075, 1076, 1422, + 1202, 1200, 1102, 1103, 1104, 1105, 1106, 1115, 1109, 1110, + 403, 1203, 1111, 999, 1000, 1356, 1355, 1428, 1198, 1197, + 894, 934, 935, 1578, 404, 940, 943, 944, 1571, 1113, + 1167, 731, 732, 406, 1114, 405, 1328, 727, 1083, 1576, + 1085, 1119, 347, 346, 349, 350, 351, 352, 1176, 1175, + 958, 348, 353, 961, 962, 1248, 773, 1112, 642, 641, + 651, 652, 644, 645, 646, 647, 648, 649, 650, 643, + 1124, 1138, 653, 584, 1240, 1551, 1550, 895, 946, 642, + 641, 651, 652, 644, 645, 646, 647, 648, 649, 650, + 643, 280, 947, 653, 1487, 720, 1238, 1232, 1433, 1467, + 1084, 280, 280, 280, 280, 280, 1191, 721, 388, 1137, + 846, 1003, 394, 280, 391, 392, 1174, 280, 1432, 1186, + 1153, 280, 395, 386, 1173, 280, 68, 1431, 1331, 1178, + 1166, 995, 998, 999, 1000, 996, 611, 997, 1001, 1208, + 1171, 1180, 1225, 1170, 89, 1593, 1592, 66, 1148, 1145, + 869, 1181, 734, 1231, 1228, 1179, 1192, 1236, 1236, 1195, + 90, 1593, 1533, 1460, 281, 965, 390, 281, 1035, 71, + 1204, 63, 90, 1, 281, 1216, 1215, 1585, 1217, 1237, + 1218, 1214, 1220, 1398, 1193, 1194, 1468, 1196, 1090, 1552, + 1501, 403, 89, 89, 1247, 1369, 1249, 1250, 1251, 281, + 90, 1041, 1032, 78, 281, 404, 281, 552, 77, 1233, + 1234, 1543, 400, 401, 406, 954, 405, 864, 597, 1040, + 1039, 1509, 89, 1458, 1052, 1254, 1242, 892, 1055, 1260, + 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, + 911, 912, 913, 914, 915, 1276, 1376, 89, 1239, 1548, + 781, 779, 780, 917, 778, 783, 782, 777, 293, 1245, + 1246, 421, 877, 1133, 1134, 307, 1291, 1292, 1002, 769, + 1080, 1300, 735, 81, 1278, 1277, 1293, 1086, 874, 290, + 605, 1299, 606, 280, 1151, 396, 295, 955, 1315, 661, + 1172, 1259, 1325, 89, 1221, 1301, 427, 420, 89, 89, + 1341, 1191, 970, 1336, 723, 1302, 928, 929, 1339, 1321, + 1314, 1430, 1330, 1152, 690, 948, 749, 1300, 330, 887, + 1290, 345, 342, 343, 89, 642, 641, 651, 652, 644, + 645, 646, 647, 648, 649, 650, 643, 1329, 89, 653, + 89, 89, 1354, 974, 1236, 1236, 1183, 635, 328, 322, + 1368, 748, 1345, 741, 994, 992, 991, 1361, 416, 1382, + 1352, 1348, 1035, 747, 1035, 1373, 1374, 978, 280, 1367, + 1372, 399, 1425, 1362, 1527, 398, 1380, 1381, 945, 1363, + 50, 618, 312, 31, 407, 22, 21, 20, 280, 19, + 281, 18, 24, 17, 89, 281, 1399, 89, 89, 89, + 280, 281, 16, 15, 1391, 572, 35, 281, 26, 25, + 14, 1050, 90, 13, 12, 11, 90, 10, 90, 1392, + 9, 1394, 1390, 8, 90, 4, 621, 23, 1404, 1405, + 679, 2, 0, 0, 90, 90, 0, 0, 0, 1408, + 359, 28, 1393, 91, 92, 93, 0, 0, 0, 1413, + 0, 0, 0, 0, 1403, 0, 0, 0, 0, 0, + 0, 0, 0, 1191, 0, 0, 1434, 0, 410, 28, + 0, 0, 0, 0, 0, 1443, 0, 0, 89, 0, + 0, 1410, 1411, 0, 1412, 0, 89, 1414, 1228, 1416, + 1125, 1126, 1127, 0, 0, 0, 0, 0, 0, 0, + 1452, 89, 1035, 1442, 0, 0, 389, 0, 89, 0, + 0, 0, 0, 0, 0, 1049, 0, 0, 0, 0, + 1046, 1044, 1475, 1045, 0, 321, 0, 0, 0, 0, + 1042, 1048, 1470, 0, 90, 0, 281, 281, 281, 0, + 0, 0, 0, 0, 0, 90, 0, 0, 1455, 89, + 89, 90, 89, 0, 0, 0, 0, 89, 1339, 89, + 89, 89, 280, 1481, 1495, 89, 1496, 1498, 1499, 0, + 1490, 1488, 1486, 0, 0, 1473, 0, 0, 0, 1500, + 1494, 1506, 89, 280, 1461, 1513, 1463, 0, 0, 1521, + 0, 0, 1514, 0, 1515, 0, 0, 0, 0, 1466, + 641, 651, 652, 644, 645, 646, 647, 648, 649, 650, + 643, 1474, 1339, 653, 1542, 1534, 0, 0, 0, 89, + 0, 0, 0, 1541, 1540, 0, 0, 0, 0, 0, + 89, 89, 0, 0, 0, 0, 0, 1522, 0, 1555, + 0, 1556, 0, 0, 0, 0, 89, 0, 0, 0, + 1191, 0, 1562, 0, 1470, 1035, 0, 280, 0, 0, + 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, + 0, 0, 0, 1570, 0, 0, 0, 281, 0, 0, + 0, 0, 90, 1575, 1577, 89, 0, 281, 281, 90, + 90, 90, 1579, 0, 0, 281, 0, 1590, 281, 0, + 0, 281, 0, 0, 0, 281, 1601, 90, 0, 0, + 0, 1565, 90, 90, 90, 281, 90, 90, 0, 0, + 0, 1295, 1296, 0, 0, 0, 90, 90, 0, 595, + 0, 0, 0, 595, 0, 595, 1316, 1317, 0, 1318, + 1319, 595, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1326, 1327, 28, 0, 0, 0, 0, 1421, 0, + 637, 0, 640, 0, 0, 0, 662, 664, 654, 655, + 656, 657, 658, 659, 660, 0, 638, 639, 636, 642, + 641, 651, 652, 644, 645, 646, 647, 648, 649, 650, + 643, 0, 634, 653, 0, 0, 0, 677, 0, 0, + 90, 682, 683, 684, 685, 686, 687, 688, 689, 0, + 692, 695, 695, 695, 701, 695, 695, 701, 695, 709, + 710, 711, 712, 713, 714, 715, 1420, 0, 321, 0, + 28, 0, 1378, 90, 90, 0, 0, 691, 642, 641, + 651, 652, 644, 645, 646, 647, 648, 649, 650, 643, + 0, 90, 653, 0, 750, 0, 0, 0, 281, 0, + 0, 90, 0, 722, 725, 0, 281, 0, 0, 0, + 0, 0, 0, 0, 281, 281, 0, 0, 281, 281, + 0, 0, 281, 281, 281, 90, 1406, 0, 0, 0, + 0, 0, 356, 0, 0, 931, 932, 0, 90, 0, + 0, 0, 0, 0, 0, 0, 642, 641, 651, 652, + 644, 645, 646, 647, 648, 649, 650, 643, 0, 0, + 653, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 964, 0, 0, 0, 0, 0, 0, + 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 281, 90, 0, 90, 1294, 0, 0, 0, + 0, 281, 281, 281, 281, 281, 0, 281, 281, 428, + 0, 281, 90, 0, 0, 0, 642, 641, 651, 652, + 644, 645, 646, 647, 648, 649, 650, 643, 281, 0, + 653, 0, 0, 281, 0, 281, 281, 0, 0, 595, + 281, 90, 0, 0, 0, 0, 595, 595, 595, 0, + 0, 0, 1476, 1477, 1478, 1479, 1480, 0, 0, 0, + 1483, 1484, 0, 0, 595, 0, 0, 0, 0, 595, + 595, 595, 0, 595, 595, 0, 0, 1130, 0, 0, + 0, 0, 0, 595, 595, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 857, 642, 641, 651, + 652, 644, 645, 646, 647, 648, 649, 650, 643, 0, + 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, + 873, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 883, 884, + 885, 886, 0, 0, 281, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 281, 281, 281, 281, 281, 0, + 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, + 281, 0, 0, 0, 281, 1131, 0, 0, 281, 1132, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1139, 1140, 0, 936, 937, 0, 1146, 90, 0, 1149, + 1150, 0, 0, 0, 0, 0, 0, 1156, 0, 0, + 0, 1158, 0, 0, 1161, 1162, 1163, 1164, 1165, 0, + 1594, 428, 0, 0, 0, 428, 0, 428, 0, 0, + 0, 1006, 0, 428, 0, 750, 0, 0, 0, 750, + 0, 0, 0, 617, 619, 90, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1206, 1207, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 0, 1029, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 595, 0, 595, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, + 0, 0, 0, 0, 0, 0, 281, 0, 0, 0, + 0, 0, 0, 738, 0, 0, 90, 0, 0, 0, + 0, 90, 90, 0, 428, 0, 0, 0, 0, 0, + 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1297, + 1298, 90, 0, 90, 90, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1135, 0, + 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 281, 0, 0, 0, 0, 0, 90, 0, 0, + 90, 90, 90, 281, 0, 0, 0, 0, 0, 1155, + 0, 750, 0, 0, 1357, 0, 0, 1187, 1188, 0, + 0, 750, 750, 750, 750, 750, 1168, 1169, 725, 0, + 0, 0, 0, 0, 0, 0, 0, 1006, 0, 1213, + 0, 428, 0, 0, 0, 750, 0, 0, 428, 428, + 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, + 0, 428, 428, 428, 0, 428, 428, 0, 0, 0, + 0, 90, 0, 0, 0, 428, 428, 0, 0, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 1407, 0, 0, 0, 1409, + 0, 90, 0, 595, 0, 0, 0, 0, 0, 0, + 1418, 1419, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 595, 0, 0, 0, 1436, 1437, 0, 1440, + 0, 0, 90, 90, 0, 90, 0, 0, 0, 922, + 90, 428, 90, 90, 90, 281, 0, 1451, 90, 0, + 0, 0, 0, 0, 0, 952, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 281, 0, 0, 0, + 0, 0, 956, 957, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 975, 0, 0, 1323, 0, 0, 1340, 0, 28, 0, + 738, 0, 90, 428, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 90, 0, 0, 1332, 0, 0, + 0, 0, 0, 0, 428, 0, 0, 0, 0, 90, + 0, 0, 0, 0, 1497, 0, 0, 428, 0, 0, + 281, 0, 0, 798, 0, 0, 0, 0, 90, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1523, 1524, 1525, 1526, 0, 1530, 90, 1531, + 1532, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1537, 0, 1538, 1539, 0, 0, 0, 0, + 279, 0, 428, 305, 428, 0, 0, 0, 0, 0, + 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 428, 0, 1558, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 419, 0, 786, 0, 0, + 279, 1424, 279, 0, 0, 0, 0, 0, 1567, 0, + 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1427, 0, 0, 0, 0, 799, 1448, + 1449, 1450, 0, 0, 0, 0, 0, 0, 0, 321, + 1602, 1603, 0, 0, 0, 0, 1444, 0, 0, 1445, + 0, 0, 1447, 0, 812, 815, 816, 817, 818, 819, + 820, 595, 821, 822, 823, 824, 825, 800, 801, 802, + 803, 784, 785, 813, 0, 787, 0, 788, 789, 790, + 791, 792, 793, 794, 795, 796, 797, 804, 805, 806, + 807, 808, 809, 810, 811, 0, 0, 0, 29, 30, + 58, 32, 33, 0, 0, 0, 1340, 0, 28, 0, + 0, 0, 952, 0, 0, 0, 0, 62, 0, 0, + 0, 0, 34, 53, 54, 0, 56, 0, 0, 0, + 1485, 321, 0, 0, 0, 0, 0, 0, 1518, 0, + 0, 0, 0, 0, 0, 43, 814, 0, 0, 57, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, - 0, 0, 768, 0, 0, 0, 0, 281, 90, 0, - 90, 0, 0, 0, 0, 0, 281, 281, 281, 281, - 281, 0, 281, 281, 0, 0, 281, 90, 640, 639, - 649, 650, 642, 643, 644, 645, 646, 647, 648, 641, - 0, 0, 651, 281, 0, 0, 0, 0, 281, 0, - 281, 281, 0, 0, 0, 281, 90, 0, 0, 0, - 0, 0, 0, 1080, 1291, 1082, 0, 0, 0, 0, - 0, 0, 665, 666, 667, 668, 669, 670, 671, 672, - 673, 674, 1109, 0, 640, 639, 649, 650, 642, 643, - 644, 645, 646, 647, 648, 641, 0, 0, 651, 640, - 639, 649, 650, 642, 643, 644, 645, 646, 647, 648, - 641, 0, 1128, 651, 0, 0, 1129, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1136, 1137, 0, - 0, 0, 428, 1143, 0, 0, 1146, 1147, 0, 428, - 428, 428, 0, 0, 1153, 0, 0, 0, 1155, 0, - 0, 1158, 1159, 1160, 1161, 1162, 0, 428, 281, 0, - 0, 0, 428, 428, 428, 0, 428, 428, 281, 281, - 281, 281, 281, 0, 0, 0, 428, 428, 0, 1127, - 281, 0, 0, 0, 281, 0, 0, 0, 281, 0, - 0, 0, 281, 0, 0, 0, 0, 1203, 1204, 640, - 639, 649, 650, 642, 643, 644, 645, 646, 647, 648, - 641, 90, 0, 651, 639, 649, 650, 642, 643, 644, - 645, 646, 647, 648, 641, 0, 0, 651, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 357, 0, 919, - 632, 428, 0, 0, 0, 0, 0, 0, 0, 90, - 90, 0, 0, 0, 0, 949, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 953, 954, 0, 0, 321, 0, 279, 90, - 0, 305, 0, 0, 0, 689, 0, 0, 279, 0, - 972, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 736, 0, 0, 428, 90, 1256, 0, 0, 0, 0, - 411, 720, 723, 419, 0, 0, 1294, 1295, 279, 0, - 279, 0, 0, 0, 428, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1287, 0, 0, 428, 0, 0, - 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 0, 0, 90, 90, 0, 0, 0, - 0, 0, 0, 889, 0, 0, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, - 912, 90, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1354, 428, 0, 428, 90, 0, 90, 90, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 428, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 952, 0, 281, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1117, 0, 0, 0, 0, 281, 0, 0, 0, 0, - 0, 90, 0, 0, 90, 90, 90, 281, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1404, 0, 0, 0, 1406, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1415, 1416, 0, - 0, 0, 0, 855, 279, 0, 0, 0, 0, 279, - 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, - 0, 279, 0, 1433, 1434, 0, 1437, 871, 0, 0, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, - 0, 0, 0, 90, 1448, 881, 882, 883, 0, 0, - 0, 949, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 428, 0, 0, 0, 933, - 934, 0, 0, 0, 0, 0, 90, 90, 0, 90, - 0, 0, 0, 1463, 90, 0, 90, 90, 90, 281, - 0, 0, 90, 0, 0, 1122, 1123, 1124, 0, 0, - 0, 1494, 0, 0, 0, 0, 0, 411, 0, 90, - 281, 0, 0, 1255, 428, 0, 0, 0, 0, 0, - 279, 279, 279, 0, 0, 0, 0, 0, 0, 1520, - 1521, 1522, 1523, 0, 1527, 0, 1528, 1529, 0, 0, - 0, 0, 0, 428, 0, 0, 90, 0, 0, 1534, - 0, 1535, 1536, 1026, 0, 0, 0, 90, 90, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, - 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, - 1555, 0, 0, 0, 281, 0, 0, 0, 0, 428, - 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1564, 0, 0, 0, 0, - 0, 0, 90, 0, 428, 0, 949, 0, 0, 1339, - 1341, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1341, 0, 1599, 1600, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, - 279, 428, 1368, 0, 0, 0, 0, 0, 0, 0, - 279, 279, 0, 0, 0, 0, 0, 0, 279, 0, - 0, 279, 0, 0, 279, 0, 0, 0, 850, 0, + 1340, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, + 0, 279, 0, 0, 0, 0, 0, 279, 0, 0, + 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1258, 428, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 37, 39, 38, 41, + 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 42, 61, 60, 0, 0, 51, + 52, 40, 0, 0, 1588, 0, 0, 0, 0, 428, + 0, 0, 0, 0, 0, 44, 45, 0, 46, 47, + 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 428, 0, 952, 0, 411, + 1342, 1344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 279, 279, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1344, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 428, 0, 428, 1371, 59, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1395, 0, 0, 1400, + 1401, 1402, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 279, 0, 0, 0, 0, 0, 952, + 0, 0, 0, 279, 279, 0, 0, 0, 0, 0, + 0, 279, 0, 0, 279, 0, 0, 279, 0, 0, + 428, 852, 0, 0, 0, 0, 0, 0, 1457, 0, + 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, + 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1491, 1492, 0, 1493, 0, 0, 0, 0, 1457, + 0, 1457, 1457, 1457, 0, 0, 0, 1371, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 852, 0, + 0, 0, 411, 411, 1457, 0, 411, 411, 411, 0, + 0, 0, 953, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 411, 411, 411, 411, 0, 0, 0, 0, + 0, 1547, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 428, 428, 279, 0, 0, 0, 0, 0, + 852, 0, 279, 0, 0, 0, 952, 0, 1563, 0, + 279, 1011, 0, 0, 279, 279, 0, 0, 279, 1019, + 852, 0, 0, 0, 0, 0, 0, 1569, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1457, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 279, 279, + 279, 279, 0, 279, 279, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1392, 0, 0, 1397, 1398, - 1399, 0, 0, 0, 0, 0, 1292, 1293, 0, 0, - 0, 0, 0, 0, 1152, 0, 0, 0, 0, 0, - 0, 1313, 1314, 0, 1315, 1316, 0, 0, 0, 0, - 0, 1165, 1166, 723, 0, 0, 1323, 1324, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 949, 0, - 0, 0, 0, 411, 850, 0, 0, 0, 411, 411, - 0, 0, 411, 411, 411, 0, 0, 0, 950, 428, - 0, 0, 0, 0, 0, 0, 0, 1454, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 411, 411, - 411, 411, 428, 0, 0, 0, 0, 0, 0, 428, - 0, 0, 0, 0, 0, 0, 0, 1375, 0, 0, - 279, 0, 0, 0, 0, 0, 850, 0, 279, 0, - 0, 0, 0, 0, 0, 0, 279, 1008, 0, 0, - 279, 279, 0, 0, 279, 1016, 850, 0, 0, 0, - 1488, 1489, 0, 1490, 0, 0, 0, 0, 1454, 0, - 1454, 1454, 1454, 0, 0, 0, 1368, 0, 0, 0, - 0, 1403, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1454, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 0, 0, 0, 1320, 0, - 1544, 0, 0, 279, 279, 279, 279, 279, 0, 279, - 279, 428, 428, 279, 0, 0, 0, 0, 0, 0, - 0, 0, 1329, 0, 0, 949, 0, 1560, 0, 0, - 279, 0, 0, 0, 0, 279, 0, 1113, 1114, 0, - 0, 0, 279, 0, 0, 0, 1566, 0, 796, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1454, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1473, 1474, 1475, - 1476, 1477, 0, 0, 0, 1480, 1481, 0, 0, 411, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 784, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 279, 0, 0, 0, 0, - 0, 0, 0, 0, 950, 279, 279, 279, 279, 279, - 0, 0, 0, 0, 0, 0, 0, 1202, 1424, 0, - 0, 279, 797, 0, 0, 1008, 0, 0, 0, 279, - 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, - 0, 1441, 0, 0, 1442, 0, 0, 1444, 810, 813, - 814, 815, 816, 817, 818, 0, 819, 820, 821, 822, - 823, 798, 799, 800, 801, 782, 783, 811, 0, 785, - 0, 786, 787, 788, 789, 790, 791, 792, 793, 794, - 795, 802, 803, 804, 805, 806, 807, 808, 809, 0, - 29, 30, 58, 32, 33, 1591, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, - 0, 0, 0, 0, 34, 53, 54, 0, 56, 0, - 0, 0, 0, 0, 0, 1482, 321, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 812, 57, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 850, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 950, - 0, 0, 0, 0, 0, 0, 36, 37, 39, 38, - 41, 0, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 42, 61, 60, 0, 0, - 51, 52, 40, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 44, 45, 0, 46, - 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 0, 0, 0, 0, 279, + 0, 1116, 1117, 0, 0, 0, 279, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 279, 0, 0, 0, 0, 0, 0, 0, 0, 953, + 279, 279, 279, 279, 279, 0, 0, 0, 0, 0, + 0, 0, 1205, 0, 0, 0, 279, 0, 0, 0, + 1011, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1238,54 +1259,118 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 852, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 953, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, - 0, 0, 0, 0, 538, 526, 0, 483, 541, 456, - 473, 549, 474, 477, 514, 441, 496, 179, 471, 0, - 460, 436, 467, 437, 458, 485, 123, 489, 455, 528, - 499, 540, 151, 0, 461, 547, 153, 505, 0, 226, - 167, 0, 0, 0, 487, 530, 494, 523, 482, 515, - 446, 504, 542, 472, 512, 543, 0, 0, 950, 91, - 92, 93, 0, 1033, 1034, 0, 0, 0, 0, 0, - 113, 279, 509, 537, 469, 511, 513, 435, 506, 0, - 439, 442, 548, 533, 464, 465, 1226, 0, 0, 0, - 0, 0, 0, 486, 495, 520, 480, 0, 0, 0, - 0, 0, 0, 0, 0, 462, 0, 503, 0, 0, - 0, 443, 440, 0, 0, 0, 0, 484, 0, 0, - 0, 445, 0, 463, 521, 0, 433, 132, 525, 532, - 481, 282, 536, 479, 478, 539, 198, 0, 230, 135, - 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, - 529, 459, 468, 117, 466, 208, 186, 246, 502, 188, - 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, - 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, - 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, - 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, - 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, - 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, - 0, 438, 0, 227, 249, 264, 111, 454, 234, 258, - 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, - 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, - 225, 450, 453, 448, 449, 497, 498, 544, 545, 546, - 522, 444, 0, 451, 452, 0, 527, 534, 535, 501, - 94, 103, 152, 261, 201, 128, 250, 434, 447, 121, - 457, 0, 0, 470, 475, 476, 488, 490, 491, 492, - 493, 500, 507, 508, 510, 516, 517, 518, 519, 524, - 531, 550, 96, 97, 104, 110, 116, 120, 124, 127, - 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, - 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, - 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, - 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, - 222, 228, 231, 237, 238, 247, 254, 257, 538, 526, - 0, 483, 541, 456, 473, 549, 474, 477, 514, 441, - 496, 179, 471, 0, 460, 436, 467, 437, 458, 485, - 123, 489, 455, 528, 499, 540, 151, 0, 461, 547, - 153, 505, 0, 226, 167, 0, 0, 0, 487, 530, - 494, 523, 482, 515, 446, 504, 542, 472, 512, 543, - 0, 0, 0, 91, 92, 93, 0, 1033, 1034, 0, - 0, 0, 0, 0, 113, 0, 509, 537, 469, 511, - 513, 435, 506, 0, 439, 442, 548, 533, 464, 465, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 953, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1011, 0, 0, 0, 0, 0, 538, 526, 0, + 483, 541, 456, 473, 549, 474, 477, 514, 441, 496, + 179, 471, 279, 460, 436, 467, 437, 458, 485, 123, + 489, 455, 528, 499, 540, 151, 0, 461, 547, 153, + 505, 0, 226, 167, 0, 0, 0, 487, 530, 494, + 523, 482, 515, 446, 504, 542, 472, 512, 543, 0, + 0, 0, 91, 92, 93, 0, 1036, 1037, 0, 0, + 0, 0, 0, 113, 0, 509, 537, 469, 511, 513, + 551, 435, 506, 953, 439, 442, 548, 533, 464, 465, + 1229, 0, 0, 0, 0, 0, 279, 486, 495, 520, + 480, 0, 0, 0, 0, 0, 0, 0, 0, 462, + 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, + 0, 484, 0, 0, 0, 445, 0, 463, 521, 0, + 433, 132, 525, 532, 481, 282, 536, 479, 478, 539, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 529, 459, 468, 117, 466, 208, + 186, 246, 502, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 438, 0, 227, 249, 264, + 111, 454, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 450, 453, 448, 449, 497, + 498, 544, 545, 546, 522, 444, 0, 451, 452, 0, + 527, 534, 535, 501, 94, 103, 152, 261, 201, 128, + 250, 434, 447, 121, 457, 0, 0, 470, 475, 476, + 488, 490, 491, 492, 493, 500, 507, 508, 510, 516, + 517, 518, 519, 524, 531, 550, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 538, 526, 0, 483, 541, 456, 473, 549, + 474, 477, 514, 441, 496, 179, 471, 0, 460, 436, + 467, 437, 458, 485, 123, 489, 455, 528, 499, 540, + 151, 0, 461, 547, 153, 505, 0, 226, 167, 0, + 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, + 542, 472, 512, 543, 0, 0, 0, 91, 92, 93, + 0, 1036, 1037, 0, 0, 0, 0, 0, 113, 0, + 509, 537, 469, 511, 513, 551, 435, 506, 0, 439, + 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, + 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, + 0, 0, 0, 0, 462, 0, 503, 0, 0, 0, + 443, 440, 0, 0, 0, 0, 484, 0, 0, 0, + 445, 0, 463, 521, 0, 433, 132, 525, 532, 481, + 282, 536, 479, 478, 539, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 529, + 459, 468, 117, 466, 208, 186, 246, 502, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 438, 0, 227, 249, 264, 111, 454, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 450, 453, 448, 449, 497, 498, 544, 545, 546, 522, + 444, 0, 451, 452, 0, 527, 534, 535, 501, 94, + 103, 152, 261, 201, 128, 250, 434, 447, 121, 457, + 0, 0, 470, 475, 476, 488, 490, 491, 492, 493, + 500, 507, 508, 510, 516, 517, 518, 519, 524, 531, + 550, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 538, 526, 0, + 483, 541, 456, 473, 549, 474, 477, 514, 441, 496, + 179, 471, 0, 460, 436, 467, 437, 458, 485, 123, + 489, 455, 528, 499, 540, 151, 0, 461, 547, 153, + 505, 0, 226, 167, 0, 0, 0, 487, 530, 494, + 523, 482, 515, 446, 504, 542, 472, 512, 543, 57, + 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 509, 537, 469, 511, 513, + 551, 435, 506, 0, 439, 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, @@ -1318,151 +1403,116 @@ var yyAct = [...]int{ 467, 437, 458, 485, 123, 489, 455, 528, 499, 540, 151, 0, 461, 547, 153, 505, 0, 226, 167, 0, 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, - 542, 472, 512, 543, 57, 0, 0, 91, 92, 93, + 542, 472, 512, 543, 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, - 509, 537, 469, 511, 513, 435, 506, 0, 439, 442, - 548, 533, 464, 465, 0, 0, 0, 0, 0, 0, - 0, 486, 495, 520, 480, 0, 0, 0, 0, 0, - 0, 0, 0, 462, 0, 503, 0, 0, 0, 443, - 440, 0, 0, 0, 0, 484, 0, 0, 0, 445, - 0, 463, 521, 0, 433, 132, 525, 532, 481, 282, - 536, 479, 478, 539, 198, 0, 230, 135, 150, 109, - 147, 95, 105, 0, 134, 176, 206, 210, 529, 459, - 468, 117, 466, 208, 186, 246, 502, 188, 207, 154, - 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, - 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, - 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, - 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, - 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, - 137, 196, 156, 197, 138, 169, 168, 170, 0, 438, - 0, 227, 249, 264, 111, 454, 234, 258, 259, 0, - 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, - 148, 155, 203, 262, 185, 209, 115, 248, 225, 450, - 453, 448, 449, 497, 498, 544, 545, 546, 522, 444, - 0, 451, 452, 0, 527, 534, 535, 501, 94, 103, - 152, 261, 201, 128, 250, 434, 447, 121, 457, 0, - 0, 470, 475, 476, 488, 490, 491, 492, 493, 500, - 507, 508, 510, 516, 517, 518, 519, 524, 531, 550, - 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, - 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, - 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, - 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, - 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, - 231, 237, 238, 247, 254, 257, 538, 526, 0, 483, - 541, 456, 473, 549, 474, 477, 514, 441, 496, 179, - 471, 0, 460, 436, 467, 437, 458, 485, 123, 489, - 455, 528, 499, 540, 151, 0, 461, 547, 153, 505, - 0, 226, 167, 0, 0, 0, 487, 530, 494, 523, - 482, 515, 446, 504, 542, 472, 512, 543, 0, 0, - 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 0, 509, 537, 469, 511, 513, 435, - 506, 0, 439, 442, 548, 533, 464, 465, 0, 0, - 0, 0, 0, 0, 0, 486, 495, 520, 480, 0, - 0, 0, 0, 0, 0, 1330, 0, 462, 0, 503, - 0, 0, 0, 443, 440, 0, 0, 0, 0, 484, - 0, 0, 0, 445, 0, 463, 521, 0, 433, 132, - 525, 532, 481, 282, 536, 479, 478, 539, 198, 0, - 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, - 206, 210, 529, 459, 468, 117, 466, 208, 186, 246, - 502, 188, 207, 154, 236, 199, 245, 255, 256, 233, - 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, - 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, - 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, - 102, 107, 251, 172, 235, 243, 166, 159, 101, 241, - 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, - 168, 170, 0, 438, 0, 227, 249, 264, 111, 454, - 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, - 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, - 115, 248, 225, 450, 453, 448, 449, 497, 498, 544, - 545, 546, 522, 444, 0, 451, 452, 0, 527, 534, - 535, 501, 94, 103, 152, 261, 201, 128, 250, 434, - 447, 121, 457, 0, 0, 470, 475, 476, 488, 490, - 491, 492, 493, 500, 507, 508, 510, 516, 517, 518, - 519, 524, 531, 550, 96, 97, 104, 110, 116, 120, - 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, - 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, - 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, - 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, - 538, 526, 0, 483, 541, 456, 473, 549, 474, 477, - 514, 441, 496, 179, 471, 0, 460, 436, 467, 437, - 458, 485, 123, 489, 455, 528, 499, 540, 151, 0, - 461, 547, 153, 505, 0, 226, 167, 0, 0, 0, - 487, 530, 494, 523, 482, 515, 446, 504, 542, 472, - 512, 543, 0, 0, 0, 91, 92, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 113, 0, 509, 537, - 469, 511, 513, 435, 506, 0, 439, 442, 548, 533, - 464, 465, 0, 0, 0, 0, 0, 0, 0, 486, - 495, 520, 480, 0, 0, 0, 0, 0, 0, 1017, - 0, 462, 0, 503, 0, 0, 0, 443, 440, 0, - 0, 0, 0, 484, 0, 0, 0, 445, 0, 463, - 521, 0, 433, 132, 525, 532, 481, 282, 536, 479, - 478, 539, 198, 0, 230, 135, 150, 109, 147, 95, - 105, 0, 134, 176, 206, 210, 529, 459, 468, 117, - 466, 208, 186, 246, 502, 188, 207, 154, 236, 199, - 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, - 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, - 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, - 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, - 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, - 156, 197, 138, 169, 168, 170, 0, 438, 0, 227, - 249, 264, 111, 454, 234, 258, 259, 0, 200, 112, - 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, - 203, 262, 185, 209, 115, 248, 225, 450, 453, 448, - 449, 497, 498, 544, 545, 546, 522, 444, 0, 451, - 452, 0, 527, 534, 535, 501, 94, 103, 152, 261, - 201, 128, 250, 434, 447, 121, 457, 0, 0, 470, - 475, 476, 488, 490, 491, 492, 493, 500, 507, 508, - 510, 516, 517, 518, 519, 524, 531, 550, 96, 97, - 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, - 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, - 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, - 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, - 238, 247, 254, 257, 538, 526, 0, 483, 541, 456, - 473, 549, 474, 477, 514, 441, 496, 179, 471, 0, - 460, 436, 467, 437, 458, 485, 123, 489, 455, 528, - 499, 540, 151, 0, 461, 547, 153, 505, 0, 226, - 167, 0, 0, 0, 487, 530, 494, 523, 482, 515, - 446, 504, 542, 472, 512, 543, 0, 0, 0, 91, - 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, - 113, 0, 509, 537, 469, 511, 513, 435, 506, 0, - 439, 442, 548, 533, 464, 465, 0, 0, 0, 0, - 0, 0, 0, 486, 495, 520, 480, 0, 0, 0, - 0, 0, 0, 981, 0, 462, 0, 503, 0, 0, - 0, 443, 440, 0, 0, 0, 0, 484, 0, 0, - 0, 445, 0, 463, 521, 0, 433, 132, 525, 532, - 481, 282, 536, 479, 478, 539, 198, 0, 230, 135, - 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, - 529, 459, 468, 117, 466, 208, 186, 246, 502, 188, - 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, - 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, - 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, - 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, - 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, - 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, - 0, 438, 0, 227, 249, 264, 111, 454, 234, 258, - 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, - 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, - 225, 450, 453, 448, 449, 497, 498, 544, 545, 546, - 522, 444, 0, 451, 452, 0, 527, 534, 535, 501, - 94, 103, 152, 261, 201, 128, 250, 434, 447, 121, - 457, 0, 0, 470, 475, 476, 488, 490, 491, 492, - 493, 500, 507, 508, 510, 516, 517, 518, 519, 524, - 531, 550, 96, 97, 104, 110, 116, 120, 124, 127, - 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, - 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, - 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, - 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, - 222, 228, 231, 237, 238, 247, 254, 257, 538, 526, - 0, 483, 541, 456, 473, 549, 474, 477, 514, 441, - 496, 179, 471, 0, 460, 436, 467, 437, 458, 485, - 123, 489, 455, 528, 499, 540, 151, 0, 461, 547, - 153, 505, 0, 226, 167, 0, 0, 0, 487, 530, - 494, 523, 482, 515, 446, 504, 542, 472, 512, 543, - 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, - 0, 0, 0, 0, 113, 0, 509, 537, 469, 511, - 513, 435, 506, 0, 439, 442, 548, 533, 464, 465, + 509, 537, 469, 511, 513, 551, 435, 506, 0, 439, + 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, + 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, + 0, 0, 1333, 0, 462, 0, 503, 0, 0, 0, + 443, 440, 0, 0, 0, 0, 484, 0, 0, 0, + 445, 0, 463, 521, 0, 433, 132, 525, 532, 481, + 282, 536, 479, 478, 539, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 529, + 459, 468, 117, 466, 208, 186, 246, 502, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 438, 0, 227, 249, 264, 111, 454, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 450, 453, 448, 449, 497, 498, 544, 545, 546, 522, + 444, 0, 451, 452, 0, 527, 534, 535, 501, 94, + 103, 152, 261, 201, 128, 250, 434, 447, 121, 457, + 0, 0, 470, 475, 476, 488, 490, 491, 492, 493, + 500, 507, 508, 510, 516, 517, 518, 519, 524, 531, + 550, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 538, 526, 0, + 483, 541, 456, 473, 549, 474, 477, 514, 441, 496, + 179, 471, 0, 460, 436, 467, 437, 458, 485, 123, + 489, 455, 528, 499, 540, 151, 0, 461, 547, 153, + 505, 0, 226, 167, 0, 0, 0, 487, 530, 494, + 523, 482, 515, 446, 504, 542, 472, 512, 543, 0, + 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 509, 537, 469, 511, 513, + 551, 435, 506, 0, 439, 442, 548, 533, 464, 465, + 0, 0, 0, 0, 0, 0, 0, 486, 495, 520, + 480, 0, 0, 0, 0, 0, 0, 1020, 0, 462, + 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, + 0, 484, 0, 0, 0, 445, 0, 463, 521, 0, + 433, 132, 525, 532, 481, 282, 536, 479, 478, 539, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 529, 459, 468, 117, 466, 208, + 186, 246, 502, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 438, 0, 227, 249, 264, + 111, 454, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 450, 453, 448, 449, 497, + 498, 544, 545, 546, 522, 444, 0, 451, 452, 0, + 527, 534, 535, 501, 94, 103, 152, 261, 201, 128, + 250, 434, 447, 121, 457, 0, 0, 470, 475, 476, + 488, 490, 491, 492, 493, 500, 507, 508, 510, 516, + 517, 518, 519, 524, 531, 550, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 538, 526, 0, 483, 541, 456, 473, 549, + 474, 477, 514, 441, 496, 179, 471, 0, 460, 436, + 467, 437, 458, 485, 123, 489, 455, 528, 499, 540, + 151, 0, 461, 547, 153, 505, 0, 226, 167, 0, + 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, + 542, 472, 512, 543, 0, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 509, 537, 469, 511, 513, 551, 435, 506, 0, 439, + 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, + 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, + 0, 0, 984, 0, 462, 0, 503, 0, 0, 0, + 443, 440, 0, 0, 0, 0, 484, 0, 0, 0, + 445, 0, 463, 521, 0, 433, 132, 525, 532, 481, + 282, 536, 479, 478, 539, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 529, + 459, 468, 117, 466, 208, 186, 246, 502, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 438, 0, 227, 249, 264, 111, 454, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 450, 453, 448, 449, 497, 498, 544, 545, 546, 522, + 444, 0, 451, 452, 0, 527, 534, 535, 501, 94, + 103, 152, 261, 201, 128, 250, 434, 447, 121, 457, + 0, 0, 470, 475, 476, 488, 490, 491, 492, 493, + 500, 507, 508, 510, 516, 517, 518, 519, 524, 531, + 550, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 538, 526, 0, + 483, 541, 456, 473, 549, 474, 477, 514, 441, 496, + 179, 471, 0, 460, 436, 467, 437, 458, 485, 123, + 489, 455, 528, 499, 540, 151, 0, 461, 547, 153, + 505, 0, 226, 167, 0, 0, 0, 487, 530, 494, + 523, 482, 515, 446, 504, 542, 472, 512, 543, 0, + 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 509, 537, 469, 511, 513, + 551, 435, 506, 0, 439, 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, @@ -1497,112 +1547,215 @@ var yyAct = [...]int{ 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, 542, 472, 512, 543, 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, - 509, 537, 469, 511, 513, 435, 506, 0, 439, 442, - 548, 533, 464, 465, 0, 0, 0, 0, 0, 0, - 0, 486, 495, 520, 480, 0, 0, 0, 0, 0, - 0, 0, 0, 462, 0, 503, 0, 0, 0, 443, - 440, 0, 0, 0, 0, 484, 0, 0, 0, 445, - 0, 463, 521, 0, 433, 132, 525, 532, 481, 282, - 536, 479, 478, 539, 198, 0, 230, 135, 150, 109, - 147, 95, 105, 0, 134, 176, 206, 210, 529, 459, - 468, 117, 466, 208, 186, 246, 502, 188, 207, 154, - 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, - 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, - 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, - 239, 240, 118, 263, 106, 252, 102, 431, 251, 172, - 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, - 137, 196, 156, 197, 138, 169, 168, 170, 0, 438, - 0, 227, 249, 264, 111, 454, 234, 258, 259, 0, - 200, 112, 131, 125, 195, 129, 432, 430, 140, 224, - 148, 155, 203, 262, 185, 209, 115, 248, 225, 450, - 453, 448, 449, 497, 498, 544, 545, 546, 522, 444, - 0, 451, 452, 0, 527, 534, 535, 501, 94, 103, - 152, 261, 201, 128, 250, 434, 447, 121, 457, 0, - 0, 470, 475, 476, 488, 490, 491, 492, 493, 500, - 507, 508, 510, 516, 517, 518, 519, 524, 531, 550, - 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, - 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, - 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, - 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, - 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, - 231, 237, 238, 247, 254, 257, 538, 526, 0, 483, - 541, 456, 473, 549, 474, 477, 514, 441, 496, 179, - 471, 0, 460, 436, 467, 437, 458, 485, 123, 489, - 455, 528, 499, 540, 151, 0, 461, 547, 153, 505, - 0, 226, 167, 0, 0, 0, 487, 530, 494, 523, - 482, 515, 446, 504, 542, 472, 512, 543, 0, 0, - 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 0, 509, 537, 469, 511, 513, 435, - 506, 0, 439, 442, 548, 533, 464, 465, 0, 0, - 0, 0, 0, 0, 0, 486, 495, 520, 480, 0, - 0, 0, 0, 0, 0, 0, 0, 462, 0, 503, - 0, 0, 0, 443, 440, 0, 0, 0, 0, 484, - 0, 0, 0, 445, 0, 463, 521, 0, 433, 132, - 525, 532, 481, 282, 536, 479, 478, 539, 198, 0, - 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, - 206, 210, 529, 459, 468, 117, 466, 208, 186, 246, - 502, 188, 207, 154, 236, 199, 245, 255, 256, 233, - 253, 260, 223, 98, 232, 760, 114, 218, 0, 0, - 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, - 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, - 102, 431, 251, 172, 235, 243, 166, 159, 101, 241, - 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, - 168, 170, 0, 438, 0, 227, 249, 264, 111, 454, - 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, - 432, 430, 140, 224, 148, 155, 203, 262, 185, 209, - 115, 248, 225, 450, 453, 448, 449, 497, 498, 544, - 545, 546, 522, 444, 0, 451, 452, 0, 527, 534, - 535, 501, 94, 103, 152, 261, 201, 128, 250, 434, - 447, 121, 457, 0, 0, 470, 475, 476, 488, 490, - 491, 492, 493, 500, 507, 508, 510, 516, 517, 518, - 519, 524, 531, 550, 96, 97, 104, 110, 116, 120, - 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, - 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, - 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, - 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, - 538, 526, 0, 483, 541, 456, 473, 549, 474, 477, - 514, 441, 496, 179, 471, 0, 460, 436, 467, 437, - 458, 485, 123, 489, 455, 528, 499, 540, 151, 0, - 461, 547, 153, 505, 0, 226, 167, 0, 0, 0, - 487, 530, 494, 523, 482, 515, 446, 504, 542, 472, - 512, 543, 0, 0, 0, 91, 92, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 113, 0, 509, 537, - 469, 511, 513, 435, 506, 0, 439, 442, 548, 533, - 464, 465, 0, 0, 0, 0, 0, 0, 0, 486, - 495, 520, 480, 0, 0, 0, 0, 0, 0, 0, - 0, 462, 0, 503, 0, 0, 0, 443, 440, 0, - 0, 0, 0, 484, 0, 0, 0, 445, 0, 463, - 521, 0, 433, 132, 525, 532, 481, 282, 536, 479, - 478, 539, 198, 0, 230, 135, 150, 109, 147, 95, - 105, 0, 134, 176, 206, 210, 529, 459, 468, 117, - 466, 208, 186, 246, 502, 188, 207, 154, 236, 199, - 245, 255, 256, 233, 253, 260, 223, 98, 232, 422, - 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, - 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, - 118, 263, 106, 252, 102, 431, 251, 172, 235, 243, - 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, - 156, 197, 138, 169, 168, 170, 0, 438, 0, 227, - 249, 264, 111, 454, 234, 258, 259, 0, 200, 112, - 131, 125, 195, 129, 432, 430, 425, 424, 148, 155, - 203, 262, 185, 209, 115, 248, 225, 450, 453, 448, - 449, 497, 498, 544, 545, 546, 522, 444, 0, 451, - 452, 0, 527, 534, 535, 501, 94, 103, 152, 261, - 201, 128, 250, 434, 447, 121, 457, 0, 0, 470, - 475, 476, 488, 490, 491, 492, 493, 500, 507, 508, - 510, 516, 517, 518, 519, 524, 531, 550, 96, 97, - 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, - 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, - 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, - 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, - 238, 247, 254, 257, 179, 0, 0, 921, 0, 326, - 0, 0, 0, 123, 0, 325, 0, 0, 0, 151, - 0, 922, 369, 153, 0, 0, 226, 167, 0, 0, - 0, 0, 0, 360, 361, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 91, 92, 93, 347, - 346, 349, 350, 351, 352, 0, 0, 113, 348, 353, - 354, 355, 0, 0, 0, 323, 340, 0, 368, 0, + 509, 537, 469, 511, 513, 551, 435, 506, 0, 439, + 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, + 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, + 0, 0, 0, 0, 462, 0, 503, 0, 0, 0, + 443, 440, 0, 0, 0, 0, 484, 0, 0, 0, + 445, 0, 463, 521, 0, 433, 132, 525, 532, 481, + 282, 536, 479, 478, 539, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 529, + 459, 468, 117, 466, 208, 186, 246, 502, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 431, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 438, 0, 227, 249, 264, 111, 454, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 432, 430, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 450, 453, 448, 449, 497, 498, 544, 545, 546, 522, + 444, 0, 451, 452, 0, 527, 534, 535, 501, 94, + 103, 152, 261, 201, 128, 250, 434, 447, 121, 457, + 0, 0, 470, 475, 476, 488, 490, 491, 492, 493, + 500, 507, 508, 510, 516, 517, 518, 519, 524, 531, + 550, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 538, 526, 0, + 483, 541, 456, 473, 549, 474, 477, 514, 441, 496, + 179, 471, 0, 460, 436, 467, 437, 458, 485, 123, + 489, 455, 528, 499, 540, 151, 0, 461, 547, 153, + 505, 0, 226, 167, 0, 0, 0, 487, 530, 494, + 523, 482, 515, 446, 504, 542, 472, 512, 543, 0, + 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 0, 509, 537, 469, 511, 513, + 551, 435, 506, 0, 439, 442, 548, 533, 464, 465, + 0, 0, 0, 0, 0, 0, 0, 486, 495, 520, + 480, 0, 0, 0, 0, 0, 0, 0, 0, 462, + 0, 503, 0, 0, 0, 443, 440, 0, 0, 0, + 0, 484, 0, 0, 0, 445, 0, 463, 521, 0, + 433, 132, 525, 532, 481, 282, 536, 479, 478, 539, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 529, 459, 468, 117, 466, 208, + 186, 246, 502, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 762, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 431, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 438, 0, 227, 249, 264, + 111, 454, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 432, 430, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 450, 453, 448, 449, 497, + 498, 544, 545, 546, 522, 444, 0, 451, 452, 0, + 527, 534, 535, 501, 94, 103, 152, 261, 201, 128, + 250, 434, 447, 121, 457, 0, 0, 470, 475, 476, + 488, 490, 491, 492, 493, 500, 507, 508, 510, 516, + 517, 518, 519, 524, 531, 550, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 538, 526, 0, 483, 541, 456, 473, 549, + 474, 477, 514, 441, 496, 179, 471, 0, 460, 436, + 467, 437, 458, 485, 123, 489, 455, 528, 499, 540, + 151, 0, 461, 547, 153, 505, 0, 226, 167, 0, + 0, 0, 487, 530, 494, 523, 482, 515, 446, 504, + 542, 472, 512, 543, 0, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 509, 537, 469, 511, 513, 551, 435, 506, 0, 439, + 442, 548, 533, 464, 465, 0, 0, 0, 0, 0, + 0, 0, 486, 495, 520, 480, 0, 0, 0, 0, + 0, 0, 0, 0, 462, 0, 503, 0, 0, 0, + 443, 440, 0, 0, 0, 0, 484, 0, 0, 0, + 445, 0, 463, 521, 0, 433, 132, 525, 532, 481, + 282, 536, 479, 478, 539, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 529, + 459, 468, 117, 466, 208, 186, 246, 502, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 422, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 431, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 438, 0, 227, 249, 264, 111, 454, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 432, 430, 425, + 424, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 450, 453, 448, 449, 497, 498, 544, 545, 546, 522, + 444, 0, 451, 452, 0, 527, 534, 535, 501, 94, + 103, 152, 261, 201, 128, 250, 434, 447, 121, 457, + 0, 0, 470, 475, 476, 488, 490, 491, 492, 493, + 500, 507, 508, 510, 516, 517, 518, 519, 524, 531, + 550, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, + 924, 0, 326, 0, 0, 0, 123, 0, 325, 0, + 0, 0, 151, 0, 925, 369, 153, 0, 0, 226, + 167, 0, 0, 0, 0, 0, 360, 361, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 0, 91, + 92, 93, 347, 346, 349, 350, 351, 352, 0, 0, + 113, 348, 353, 354, 355, 0, 0, 0, 0, 323, + 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 337, 338, 409, 0, 0, 0, 383, 0, + 339, 0, 0, 332, 333, 335, 334, 336, 341, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 382, + 0, 0, 282, 0, 0, 380, 0, 198, 0, 230, + 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, + 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, + 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, + 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, + 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, + 130, 119, 178, 239, 240, 118, 263, 106, 252, 102, + 107, 251, 172, 235, 243, 166, 159, 101, 241, 164, + 158, 149, 126, 137, 196, 156, 197, 138, 169, 168, + 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, + 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, + 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, + 248, 225, 370, 381, 376, 377, 374, 375, 373, 372, + 371, 384, 362, 363, 364, 365, 367, 0, 378, 379, + 366, 94, 103, 152, 261, 201, 128, 250, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 97, 104, 110, 116, 120, 124, + 127, 133, 136, 139, 141, 142, 143, 146, 157, 160, + 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, + 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, + 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, + 0, 0, 0, 0, 326, 0, 0, 0, 123, 0, + 325, 0, 0, 0, 151, 0, 0, 369, 153, 0, + 0, 226, 167, 0, 0, 0, 0, 0, 360, 361, + 0, 0, 0, 0, 0, 0, 1027, 0, 57, 0, + 0, 91, 92, 93, 347, 346, 349, 350, 351, 352, + 0, 0, 113, 348, 353, 354, 355, 1028, 0, 0, + 0, 323, 340, 0, 368, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 337, 338, 0, 0, 0, 0, + 383, 0, 339, 0, 0, 332, 333, 335, 334, 336, + 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 382, 0, 0, 282, 0, 0, 380, 0, 198, + 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, + 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, + 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, + 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, + 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, + 204, 122, 130, 119, 178, 239, 240, 118, 263, 106, + 252, 102, 107, 251, 172, 235, 243, 166, 159, 101, + 241, 164, 158, 149, 126, 137, 196, 156, 197, 138, + 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, + 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, + 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, + 209, 115, 248, 225, 370, 381, 376, 377, 374, 375, + 373, 372, 371, 384, 362, 363, 364, 365, 367, 0, + 378, 379, 366, 94, 103, 152, 261, 201, 128, 250, + 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96, 97, 104, 110, 116, + 120, 124, 127, 133, 136, 139, 141, 142, 143, 146, + 157, 160, 161, 162, 163, 173, 174, 175, 177, 180, + 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, + 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, + 257, 179, 0, 0, 0, 0, 326, 0, 0, 0, + 123, 0, 325, 0, 0, 0, 151, 0, 0, 369, + 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, + 360, 361, 0, 0, 0, 0, 0, 0, 0, 0, + 57, 0, 397, 91, 92, 93, 347, 346, 349, 350, + 351, 352, 0, 0, 113, 348, 353, 354, 355, 0, + 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 337, 338, 0, 0, + 0, 0, 383, 0, 339, 0, 0, 332, 333, 335, + 334, 336, 341, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 382, 0, 0, 282, 0, 0, 380, + 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, + 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, + 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, + 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, + 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, + 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, + 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, + 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, + 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, + 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, + 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, + 262, 185, 209, 115, 248, 225, 370, 381, 376, 377, + 374, 375, 373, 372, 371, 384, 362, 363, 364, 365, + 367, 0, 378, 379, 366, 94, 103, 152, 261, 201, + 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, + 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, + 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, + 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, + 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, + 247, 254, 257, 179, 0, 0, 0, 0, 326, 0, + 0, 0, 123, 0, 325, 0, 0, 0, 151, 0, + 0, 369, 153, 0, 0, 226, 167, 0, 0, 0, + 0, 0, 360, 361, 0, 0, 0, 0, 0, 0, + 0, 0, 57, 0, 0, 91, 92, 93, 347, 346, + 349, 350, 351, 352, 0, 0, 113, 348, 353, 354, + 355, 0, 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, 409, 0, 0, 0, 383, 0, 339, 0, 0, 332, @@ -1634,46 +1787,12 @@ var yyAct = [...]int{ 326, 0, 0, 0, 123, 0, 325, 0, 0, 0, 151, 0, 0, 369, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 360, 361, 0, 0, 0, 0, - 0, 0, 1024, 0, 57, 0, 0, 91, 92, 93, - 347, 346, 349, 350, 351, 352, 0, 0, 113, 348, - 353, 354, 355, 1025, 0, 0, 323, 340, 0, 368, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, - 338, 0, 0, 0, 0, 383, 0, 339, 0, 0, - 332, 333, 335, 334, 336, 341, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 132, 382, 0, 0, 282, - 0, 0, 380, 0, 198, 0, 230, 135, 150, 109, - 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, - 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, - 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, - 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, - 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, - 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, - 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, - 137, 196, 156, 197, 138, 169, 168, 170, 0, 0, - 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, - 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, - 148, 155, 203, 262, 185, 209, 115, 248, 225, 370, - 381, 376, 377, 374, 375, 373, 372, 371, 384, 362, - 363, 364, 365, 367, 0, 378, 379, 366, 94, 103, - 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, - 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, - 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, - 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, - 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, - 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, - 0, 326, 0, 0, 0, 123, 0, 325, 0, 0, - 0, 151, 0, 0, 369, 153, 0, 0, 226, 167, - 0, 0, 0, 0, 0, 360, 361, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 0, 397, 91, 92, - 93, 347, 346, 349, 350, 351, 352, 0, 0, 113, - 348, 353, 354, 355, 0, 0, 0, 323, 340, 0, + 0, 0, 0, 0, 57, 0, 0, 91, 92, 93, + 347, 942, 349, 350, 351, 352, 0, 0, 113, 348, + 353, 354, 355, 0, 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 337, 338, 0, 0, 0, 0, 383, 0, 339, 0, + 337, 338, 409, 0, 0, 0, 383, 0, 339, 0, 0, 332, 333, 335, 334, 336, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 382, 0, 0, 282, 0, 0, 380, 0, 198, 0, 230, 135, 150, @@ -1703,42 +1822,8 @@ var yyAct = [...]int{ 0, 0, 151, 0, 0, 369, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 360, 361, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 91, - 92, 93, 347, 346, 349, 350, 351, 352, 0, 0, - 113, 348, 353, 354, 355, 0, 0, 0, 323, 340, - 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 337, 338, 409, 0, 0, 0, 383, 0, 339, - 0, 0, 332, 333, 335, 334, 336, 341, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 132, 382, 0, - 0, 282, 0, 0, 380, 0, 198, 0, 230, 135, - 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, - 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, - 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, - 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, - 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, - 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, - 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, - 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, - 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, - 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, - 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, - 225, 370, 381, 376, 377, 374, 375, 373, 372, 371, - 384, 362, 363, 364, 365, 367, 0, 378, 379, 366, - 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 96, 97, 104, 110, 116, 120, 124, 127, - 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, - 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, - 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, - 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, - 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, - 0, 0, 0, 326, 0, 0, 0, 123, 0, 325, - 0, 0, 0, 151, 0, 0, 369, 153, 0, 0, - 226, 167, 0, 0, 0, 0, 0, 360, 361, 0, - 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, - 91, 92, 93, 347, 939, 349, 350, 351, 352, 0, - 0, 113, 348, 353, 354, 355, 0, 0, 0, 323, + 92, 93, 347, 939, 349, 350, 351, 352, 0, 0, + 113, 348, 353, 354, 355, 0, 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, 409, 0, 0, 0, 383, 0, @@ -1766,48 +1851,14 @@ var yyAct = [...]int{ 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, - 0, 0, 0, 0, 326, 0, 0, 0, 123, 0, - 325, 0, 0, 0, 151, 0, 0, 369, 153, 0, - 0, 226, 167, 0, 0, 0, 0, 0, 360, 361, - 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, - 0, 91, 92, 93, 347, 936, 349, 350, 351, 352, - 0, 0, 113, 348, 353, 354, 355, 0, 0, 0, - 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 337, 338, 409, 0, 0, 0, 383, - 0, 339, 0, 0, 332, 333, 335, 334, 336, 341, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 382, 0, 0, 282, 0, 0, 380, 0, 198, 0, - 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, - 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, - 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, - 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, - 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, - 122, 130, 119, 178, 239, 240, 118, 263, 106, 252, - 102, 107, 251, 172, 235, 243, 166, 159, 101, 241, - 164, 158, 149, 126, 137, 196, 156, 197, 138, 169, - 168, 170, 0, 0, 0, 227, 249, 264, 111, 0, - 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, - 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, - 115, 248, 225, 370, 381, 376, 377, 374, 375, 373, - 372, 371, 384, 362, 363, 364, 365, 367, 0, 378, - 379, 366, 94, 103, 152, 261, 201, 128, 250, 0, - 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 96, 97, 104, 110, 116, 120, - 124, 127, 133, 136, 139, 141, 142, 143, 146, 157, - 160, 161, 162, 163, 173, 174, 175, 177, 180, 181, - 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, - 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, - 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 179, 0, 0, 0, 0, 326, 0, 0, - 0, 123, 0, 325, 0, 0, 0, 151, 0, 0, - 369, 153, 0, 0, 226, 167, 0, 0, 0, 0, - 0, 360, 361, 0, 0, 0, 0, 0, 0, 0, - 0, 57, 0, 0, 91, 92, 93, 347, 346, 349, - 350, 351, 352, 0, 0, 113, 348, 353, 354, 355, + 0, 179, 0, 0, 0, 0, 326, 0, 0, 0, + 123, 0, 325, 0, 0, 0, 151, 0, 0, 369, + 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, + 360, 361, 0, 0, 0, 0, 0, 0, 0, 0, + 57, 0, 0, 91, 92, 93, 347, 346, 349, 350, + 351, 352, 0, 0, 113, 348, 353, 354, 355, 0, 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, 0, 0, @@ -1842,49 +1893,186 @@ var yyAct = [...]int{ 0, 0, 360, 361, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 91, 92, 93, 347, 346, 349, 350, 351, 352, 0, 0, 113, 348, 353, 354, - 355, 0, 0, 0, 323, 340, 0, 368, 0, 0, + 355, 0, 0, 0, 0, 323, 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 337, 338, 0, - 0, 0, 0, 383, 0, 339, 0, 0, 332, 333, - 335, 334, 336, 341, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 132, 382, 0, 0, 282, 0, 0, - 380, 0, 198, 0, 230, 135, 150, 109, 147, 95, - 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, - 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, - 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, - 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, - 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, - 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, - 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, - 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, - 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, - 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, - 203, 262, 185, 209, 115, 248, 225, 370, 381, 376, - 377, 374, 375, 373, 372, 371, 384, 362, 363, 364, - 365, 367, 0, 378, 379, 366, 94, 103, 152, 261, - 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, + 0, 0, 0, 0, 383, 0, 339, 0, 0, 332, + 333, 335, 334, 336, 341, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 382, 0, 0, 282, 0, + 0, 380, 0, 198, 0, 230, 135, 150, 109, 147, + 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, + 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, + 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, + 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, + 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, + 240, 118, 263, 106, 252, 102, 107, 251, 172, 235, + 243, 166, 159, 101, 241, 164, 158, 149, 126, 137, + 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, + 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, + 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, + 155, 203, 262, 185, 209, 115, 248, 225, 370, 381, + 376, 377, 374, 375, 373, 372, 371, 384, 362, 363, + 364, 365, 367, 0, 378, 379, 366, 94, 103, 152, + 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, + 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, + 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, + 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, + 237, 238, 247, 254, 257, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, + 151, 0, 0, 369, 153, 0, 0, 226, 167, 0, + 0, 0, 0, 0, 360, 361, 0, 0, 0, 0, + 0, 0, 0, 0, 57, 0, 0, 91, 92, 93, + 347, 346, 349, 350, 351, 352, 0, 0, 113, 348, + 353, 354, 355, 0, 0, 0, 0, 0, 340, 0, + 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 337, 338, 0, 0, 0, 0, 383, 0, 339, 0, + 0, 332, 333, 335, 334, 336, 341, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 382, 0, 0, + 282, 0, 0, 380, 0, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, + 0, 0, 117, 0, 208, 186, 246, 1595, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 370, 381, 376, 377, 374, 375, 373, 372, 371, 384, + 362, 363, 364, 365, 367, 0, 378, 379, 366, 94, + 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, + 0, 0, 151, 0, 0, 369, 153, 0, 0, 226, + 167, 0, 0, 0, 0, 0, 360, 361, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 397, 91, + 92, 93, 347, 346, 349, 350, 351, 352, 0, 0, + 113, 348, 353, 354, 355, 0, 0, 0, 0, 0, + 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 337, 338, 0, 0, 0, 0, 383, 0, + 339, 0, 0, 332, 333, 335, 334, 336, 341, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 382, + 0, 0, 282, 0, 0, 380, 0, 198, 0, 230, + 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, + 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, + 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, + 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, + 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, + 130, 119, 178, 239, 240, 118, 263, 106, 252, 102, + 107, 251, 172, 235, 243, 166, 159, 101, 241, 164, + 158, 149, 126, 137, 196, 156, 197, 138, 169, 168, + 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, + 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, + 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, + 248, 225, 370, 381, 376, 377, 374, 375, 373, 372, + 371, 384, 362, 363, 364, 365, 367, 0, 378, 379, + 366, 94, 103, 152, 261, 201, 128, 250, 0, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 97, 104, 110, 116, 120, 124, + 127, 133, 136, 139, 141, 142, 143, 146, 157, 160, + 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, + 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, + 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, + 0, 0, 0, 0, 151, 0, 0, 369, 153, 0, + 0, 226, 167, 0, 0, 0, 0, 0, 360, 361, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 0, 91, 92, 93, 347, 346, 349, 350, 351, 352, + 0, 0, 113, 348, 353, 354, 355, 0, 0, 0, + 0, 0, 340, 0, 368, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 337, 338, 0, 0, 0, 0, + 383, 0, 339, 0, 0, 332, 333, 335, 334, 336, + 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 382, 0, 0, 282, 0, 0, 380, 0, 198, + 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, + 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, + 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, + 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, + 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, + 204, 122, 130, 119, 178, 239, 240, 118, 263, 106, + 252, 102, 107, 251, 172, 235, 243, 166, 159, 101, + 241, 164, 158, 149, 126, 137, 196, 156, 197, 138, + 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, + 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, + 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, + 209, 115, 248, 225, 370, 381, 376, 377, 374, 375, + 373, 372, 371, 384, 362, 363, 364, 365, 367, 0, + 378, 379, 366, 94, 103, 152, 261, 201, 128, 250, + 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96, 97, 104, 110, 116, + 120, 124, 127, 133, 136, 139, 141, 142, 143, 146, + 157, 160, 161, 162, 163, 173, 174, 175, 177, 180, + 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, + 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, + 257, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, + 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 642, 641, 651, 652, 644, 645, 646, 647, + 648, 649, 650, 643, 0, 0, 653, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, + 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, + 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, + 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, + 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, + 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, + 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, + 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, + 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, + 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, + 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, + 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, + 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, + 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, + 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, + 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, + 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, + 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, + 247, 254, 257, 179, 0, 0, 0, 737, 0, 0, + 0, 0, 123, 0, 0, 0, 0, 0, 151, 0, + 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 92, 93, 0, 739, + 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, + 0, 0, 631, 632, 630, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, - 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, - 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, - 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, - 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, - 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, - 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, - 0, 0, 369, 153, 0, 0, 226, 167, 0, 0, - 0, 0, 0, 360, 361, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 91, 92, 93, 347, - 346, 349, 350, 351, 352, 0, 0, 113, 348, 353, - 354, 355, 0, 0, 0, 0, 340, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 337, 338, - 0, 0, 0, 0, 383, 0, 339, 0, 0, 332, - 333, 335, 334, 336, 341, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 132, 382, 0, 0, 282, 0, - 0, 380, 0, 198, 0, 230, 135, 150, 109, 147, + 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, + 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, - 117, 0, 208, 186, 246, 1592, 188, 207, 154, 236, + 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, @@ -1893,9 +2081,9 @@ var yyAct = [...]int{ 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, - 155, 203, 262, 185, 209, 115, 248, 225, 370, 381, - 376, 377, 374, 375, 373, 372, 371, 384, 362, 363, - 364, 365, 367, 0, 378, 379, 366, 94, 103, 152, + 155, 203, 262, 185, 209, 115, 248, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, @@ -1906,51 +2094,17 @@ var yyAct = [...]int{ 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, - 151, 0, 0, 369, 153, 0, 0, 226, 167, 0, - 0, 0, 0, 0, 360, 361, 0, 0, 0, 0, - 0, 0, 0, 0, 57, 0, 397, 91, 92, 93, - 347, 346, 349, 350, 351, 352, 0, 0, 113, 348, - 353, 354, 355, 0, 0, 0, 0, 340, 0, 368, + 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, - 338, 0, 0, 0, 0, 383, 0, 339, 0, 0, - 332, 333, 335, 334, 336, 341, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 132, 382, 0, 0, 282, - 0, 0, 380, 0, 198, 0, 230, 135, 150, 109, - 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, - 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, - 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, - 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, - 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, - 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, - 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, - 137, 196, 156, 197, 138, 169, 168, 170, 0, 0, - 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, - 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, - 148, 155, 203, 262, 185, 209, 115, 248, 225, 370, - 381, 376, 377, 374, 375, 373, 372, 371, 384, 362, - 363, 364, 365, 367, 0, 378, 379, 366, 94, 103, - 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, - 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, - 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, - 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, - 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, - 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, - 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, - 0, 151, 0, 0, 369, 153, 0, 0, 226, 167, - 0, 0, 0, 0, 0, 360, 361, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 0, 0, 91, 92, - 93, 347, 346, 349, 350, 351, 352, 0, 0, 113, - 348, 353, 354, 355, 0, 0, 0, 0, 340, 0, - 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 337, 338, 0, 0, 0, 0, 383, 0, 339, 0, - 0, 332, 333, 335, 334, 336, 341, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 132, 382, 0, 0, - 282, 0, 0, 380, 0, 198, 0, 230, 135, 150, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 85, 86, 0, + 82, 0, 0, 0, 87, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, @@ -1962,8 +2116,8 @@ var yyAct = [...]int{ 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, - 370, 381, 376, 377, 374, 375, 373, 372, 371, 384, - 362, 363, 364, 365, 367, 0, 378, 379, 366, 94, + 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1980,44 +2134,10 @@ var yyAct = [...]int{ 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 640, 639, 649, - 650, 642, 643, 644, 645, 646, 647, 648, 641, 0, - 0, 651, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, - 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, - 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, - 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, - 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, - 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, - 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, - 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, - 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, - 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, - 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, - 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, - 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, - 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 96, 97, 104, 110, 116, 120, 124, 127, - 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, - 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, - 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, - 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, - 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, - 0, 0, 735, 0, 0, 0, 0, 123, 0, 0, - 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, - 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 91, 92, 93, 0, 737, 0, 0, 0, 0, 0, - 0, 113, 0, 0, 0, 0, 0, 630, 629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, + 0, 0, 0, 0, 0, 0, 314, 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, @@ -2040,19 +2160,123 @@ var yyAct = [...]int{ 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, - 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, - 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, - 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, + 221, 222, 228, 231, 237, 238, 247, 254, 257, 313, + 179, 0, 0, 0, 1010, 0, 0, 0, 0, 123, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, + 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 91, 92, 93, 0, 1012, 0, 0, 0, + 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, + 186, 246, 0, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 0, 0, 227, 249, 264, + 111, 0, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, + 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, + 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 91, 92, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 0, 0, 0, 282, + 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, + 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, + 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, + 236, 199, 245, 255, 256, 233, 253, 260, 223, 98, + 232, 244, 114, 218, 0, 0, 0, 100, 242, 229, + 165, 144, 145, 99, 0, 204, 122, 130, 119, 178, + 239, 240, 118, 263, 106, 252, 102, 107, 251, 172, + 235, 243, 166, 159, 101, 241, 164, 158, 149, 126, + 137, 196, 156, 197, 138, 169, 168, 170, 0, 0, + 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, + 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, + 148, 155, 203, 262, 185, 209, 115, 248, 225, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 94, 103, + 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 97, 104, 110, 116, 120, 124, 127, 133, 136, + 139, 141, 142, 143, 146, 157, 160, 161, 162, 163, + 173, 174, 175, 177, 180, 181, 182, 183, 184, 187, + 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, + 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, + 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, + 1010, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, + 93, 0, 1012, 0, 0, 0, 0, 0, 0, 113, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, + 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, + 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, + 0, 0, 0, 117, 0, 208, 186, 246, 0, 1008, + 207, 154, 236, 199, 245, 255, 256, 233, 253, 260, + 223, 98, 232, 244, 114, 218, 0, 0, 0, 100, + 242, 229, 165, 144, 145, 99, 0, 204, 122, 130, + 119, 178, 239, 240, 118, 263, 106, 252, 102, 107, + 251, 172, 235, 243, 166, 159, 101, 241, 164, 158, + 149, 126, 137, 196, 156, 197, 138, 169, 168, 170, + 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, + 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, + 140, 224, 148, 155, 203, 262, 185, 209, 115, 248, + 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 97, 104, 110, 116, 120, 124, 127, + 133, 136, 139, 141, 142, 143, 146, 157, 160, 161, + 162, 163, 173, 174, 175, 177, 180, 181, 182, 183, + 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, + 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, + 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, + 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, + 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 0, 0, 0, 0, 0, 83, 0, + 91, 92, 93, 0, 0, 976, 0, 0, 977, 0, + 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 85, 86, 0, 82, 0, 0, 0, 87, 198, 0, + 0, 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, 233, @@ -2064,7 +2288,7 @@ var yyAct = [...]int{ 168, 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, 209, - 115, 248, 225, 0, 84, 0, 0, 0, 0, 0, + 115, 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2076,80 +2300,79 @@ var yyAct = [...]int{ 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, 0, 0, 0, 123, - 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, + 0, 772, 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, + 0, 0, 91, 92, 93, 0, 771, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 314, 0, - 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, - 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, - 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, - 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, - 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, - 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, - 204, 122, 130, 119, 178, 239, 240, 118, 263, 106, - 252, 102, 107, 251, 172, 235, 243, 166, 159, 101, - 241, 164, 158, 149, 126, 137, 196, 156, 197, 138, - 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, - 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, - 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, - 209, 115, 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, - 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, + 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, + 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, + 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, + 186, 246, 0, 188, 207, 154, 236, 199, 245, 255, + 256, 233, 253, 260, 223, 98, 232, 244, 114, 218, + 0, 0, 0, 100, 242, 229, 165, 144, 145, 99, + 0, 204, 122, 130, 119, 178, 239, 240, 118, 263, + 106, 252, 102, 107, 251, 172, 235, 243, 166, 159, + 101, 241, 164, 158, 149, 126, 137, 196, 156, 197, + 138, 169, 168, 170, 0, 0, 0, 227, 249, 264, + 111, 0, 234, 258, 259, 0, 200, 112, 131, 125, + 195, 129, 171, 108, 140, 224, 148, 155, 203, 262, + 185, 209, 115, 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 96, 97, 104, 110, 116, - 120, 124, 127, 133, 136, 139, 141, 142, 143, 146, - 157, 160, 161, 162, 163, 173, 174, 175, 177, 180, - 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, - 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, - 257, 313, 179, 0, 0, 0, 1007, 0, 0, 0, + 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, + 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 97, 104, 110, + 116, 120, 124, 127, 133, 136, 139, 141, 142, 143, + 146, 157, 160, 161, 162, 163, 173, 174, 175, 177, + 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, + 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, + 254, 257, 179, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 92, 93, 0, 1009, 0, + 0, 0, 0, 397, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, - 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, - 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, - 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, - 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, - 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, - 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, - 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, - 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, - 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, - 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, - 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, - 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, - 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, + 0, 0, 0, 132, 0, 0, 0, 282, 0, 0, + 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, + 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, + 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, + 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, + 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, + 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, + 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, + 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, + 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, + 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, + 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, + 203, 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, - 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, - 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, - 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, - 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, - 247, 254, 257, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, - 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, - 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, + 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, + 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57, 0, 0, 91, 92, 93, - 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, + 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, + 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, + 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, + 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, + 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, + 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 91, 92, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2179,47 +2402,13 @@ var yyAct = [...]int{ 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, 0, - 1007, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, - 93, 0, 1009, 0, 0, 0, 0, 0, 0, 113, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, - 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, - 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, - 0, 0, 117, 0, 208, 186, 246, 0, 1005, 207, - 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, - 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, - 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, - 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, - 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, - 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, - 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, - 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, - 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, - 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, + 93, 0, 1012, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 96, 97, 104, 110, 116, 120, 124, 127, 133, - 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, - 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, - 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, - 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, - 228, 231, 237, 238, 247, 254, 257, 179, 0, 0, - 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, - 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, - 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, - 92, 93, 0, 0, 973, 0, 0, 974, 0, 0, - 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2247,50 +2436,16 @@ var yyAct = [...]int{ 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, 0, - 0, 0, 0, 0, 0, 0, 0, 123, 0, 770, + 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 91, 92, 93, 0, 769, 0, 0, 0, 0, 0, + 91, 92, 93, 0, 739, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, - 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, - 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, - 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, - 188, 207, 154, 236, 199, 245, 255, 256, 233, 253, - 260, 223, 98, 232, 244, 114, 218, 0, 0, 0, - 100, 242, 229, 165, 144, 145, 99, 0, 204, 122, - 130, 119, 178, 239, 240, 118, 263, 106, 252, 102, - 107, 251, 172, 235, 243, 166, 159, 101, 241, 164, - 158, 149, 126, 137, 196, 156, 197, 138, 169, 168, - 170, 0, 0, 0, 227, 249, 264, 111, 0, 234, - 258, 259, 0, 200, 112, 131, 125, 195, 129, 171, - 108, 140, 224, 148, 155, 203, 262, 185, 209, 115, - 248, 225, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, - 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 96, 97, 104, 110, 116, 120, 124, - 127, 133, 136, 139, 141, 142, 143, 146, 157, 160, - 161, 162, 163, 173, 174, 175, 177, 180, 181, 182, - 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, - 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 228, 231, 237, 238, 247, 254, 257, 179, - 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, - 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, - 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 397, 91, 92, 93, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, @@ -2315,10 +2470,10 @@ var yyAct = [...]int{ 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, 257, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 123, + 179, 0, 0, 0, 0, 0, 0, 0, 742, 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2326,40 +2481,6 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, - 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, - 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, - 246, 0, 188, 207, 154, 236, 199, 245, 255, 256, - 233, 253, 260, 223, 98, 232, 244, 114, 218, 0, - 0, 0, 100, 242, 229, 165, 144, 145, 99, 0, - 204, 122, 130, 119, 178, 239, 240, 118, 263, 106, - 252, 102, 107, 251, 172, 235, 243, 166, 159, 101, - 241, 164, 158, 149, 126, 137, 196, 156, 197, 138, - 169, 168, 170, 0, 0, 0, 227, 249, 264, 111, - 0, 234, 258, 259, 0, 200, 112, 131, 125, 195, - 129, 171, 108, 140, 224, 148, 155, 203, 262, 185, - 209, 115, 248, 225, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, - 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 96, 97, 104, 110, 116, - 120, 124, 127, 133, 136, 139, 141, 142, 143, 146, - 157, 160, 161, 162, 163, 173, 174, 175, 177, 180, - 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, - 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 228, 231, 237, 238, 247, 254, - 257, 179, 0, 0, 0, 0, 0, 0, 0, 0, - 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, - 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 91, 92, 93, 0, 1009, 0, 0, - 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, @@ -2387,47 +2508,13 @@ var yyAct = [...]int{ 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 92, 93, 0, 737, 0, + 0, 0, 0, 0, 91, 92, 93, 0, 620, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, - 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, - 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, - 208, 186, 246, 0, 188, 207, 154, 236, 199, 245, - 255, 256, 233, 253, 260, 223, 98, 232, 244, 114, - 218, 0, 0, 0, 100, 242, 229, 165, 144, 145, - 99, 0, 204, 122, 130, 119, 178, 239, 240, 118, - 263, 106, 252, 102, 107, 251, 172, 235, 243, 166, - 159, 101, 241, 164, 158, 149, 126, 137, 196, 156, - 197, 138, 169, 168, 170, 0, 0, 0, 227, 249, - 264, 111, 0, 234, 258, 259, 0, 200, 112, 131, - 125, 195, 129, 171, 108, 140, 224, 148, 155, 203, - 262, 185, 209, 115, 248, 225, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, - 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 96, 97, 104, - 110, 116, 120, 124, 127, 133, 136, 139, 141, 142, - 143, 146, 157, 160, 161, 162, 163, 173, 174, 175, - 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, - 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 228, 231, 237, 238, - 247, 254, 257, 179, 0, 0, 0, 0, 0, 0, - 0, 740, 123, 0, 0, 0, 0, 0, 151, 0, - 0, 0, 153, 0, 0, 226, 167, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 92, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, @@ -2451,47 +2538,13 @@ var yyAct = [...]int{ 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, - 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, - 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, - 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, - 619, 0, 0, 0, 0, 0, 0, 113, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, - 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, - 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, - 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, - 199, 245, 255, 256, 233, 253, 260, 223, 98, 232, - 244, 114, 218, 0, 0, 0, 100, 242, 229, 165, - 144, 145, 99, 0, 204, 122, 130, 119, 178, 239, - 240, 118, 263, 106, 252, 102, 107, 251, 172, 235, - 243, 166, 159, 101, 241, 164, 158, 149, 126, 137, - 196, 156, 197, 138, 169, 168, 170, 0, 0, 0, - 227, 249, 264, 111, 0, 234, 258, 259, 0, 200, - 112, 131, 125, 195, 129, 171, 108, 140, 224, 148, - 155, 203, 262, 185, 209, 115, 248, 225, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, - 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, - 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, - 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, - 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, - 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, - 237, 238, 247, 254, 257, 414, 0, 0, 0, 0, - 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, - 0, 123, 0, 0, 0, 0, 0, 151, 0, 0, - 0, 153, 0, 0, 226, 167, 0, 0, 0, 0, + 238, 247, 254, 257, 414, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 0, 0, 0, 0, 0, 151, 0, 0, 0, + 153, 0, 0, 226, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 92, 93, 0, 0, 0, - 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, + 0, 0, 0, 91, 92, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2531,41 +2584,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 132, 0, 277, 0, 282, 0, 0, - 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, - 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, - 0, 208, 186, 246, 0, 188, 207, 154, 236, 199, - 245, 255, 256, 233, 253, 260, 223, 98, 232, 244, - 114, 218, 0, 0, 0, 100, 242, 229, 165, 144, - 145, 99, 0, 204, 122, 130, 119, 178, 239, 240, - 118, 263, 106, 252, 102, 107, 251, 172, 235, 243, - 166, 159, 101, 241, 164, 158, 149, 126, 137, 196, - 156, 197, 138, 169, 168, 170, 0, 0, 0, 227, - 249, 264, 111, 0, 234, 258, 259, 0, 200, 112, - 131, 125, 195, 129, 171, 108, 140, 224, 148, 155, - 203, 262, 185, 209, 115, 248, 225, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, - 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, - 104, 110, 116, 120, 124, 127, 133, 136, 139, 141, - 142, 143, 146, 157, 160, 161, 162, 163, 173, 174, - 175, 177, 180, 181, 182, 183, 184, 187, 189, 190, - 191, 192, 193, 194, 202, 205, 211, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 228, 231, 237, - 238, 247, 254, 257, 179, 0, 0, 0, 0, 0, - 0, 0, 0, 123, 0, 0, 0, 0, 0, 151, - 0, 0, 0, 153, 0, 0, 226, 167, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, - 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 132, 0, 0, 0, 282, 0, + 0, 0, 0, 0, 132, 0, 277, 0, 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, 0, 0, 117, 0, 208, 186, 246, 0, 188, 207, 154, 236, @@ -2582,25 +2601,60 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 94, 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, - 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, - 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, - 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, - 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, - 237, 238, 247, 254, 257, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 97, 104, 110, 116, 120, 124, 127, 133, 136, 139, + 141, 142, 143, 146, 157, 160, 161, 162, 163, 173, + 174, 175, 177, 180, 181, 182, 183, 184, 187, 189, + 190, 191, 192, 193, 194, 202, 205, 211, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, 228, 231, + 237, 238, 247, 254, 257, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, + 151, 0, 0, 0, 153, 0, 0, 226, 167, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, + 282, 0, 0, 0, 0, 198, 0, 230, 135, 150, + 109, 147, 95, 105, 0, 134, 176, 206, 210, 0, + 0, 0, 117, 0, 208, 186, 246, 0, 188, 207, + 154, 236, 199, 245, 255, 256, 233, 253, 260, 223, + 98, 232, 244, 114, 218, 0, 0, 0, 100, 242, + 229, 165, 144, 145, 99, 0, 204, 122, 130, 119, + 178, 239, 240, 118, 263, 106, 252, 102, 107, 251, + 172, 235, 243, 166, 159, 101, 241, 164, 158, 149, + 126, 137, 196, 156, 197, 138, 169, 168, 170, 0, + 0, 0, 227, 249, 264, 111, 0, 234, 258, 259, + 0, 200, 112, 131, 125, 195, 129, 171, 108, 140, + 224, 148, 155, 203, 262, 185, 209, 115, 248, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 103, 152, 261, 201, 128, 250, 0, 0, 121, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 104, 110, 116, 120, 124, 127, 133, + 136, 139, 141, 142, 143, 146, 157, 160, 161, 162, + 163, 173, 174, 175, 177, 180, 181, 182, 183, 184, + 187, 189, 190, 191, 192, 193, 194, 202, 205, 211, + 212, 213, 214, 215, 216, 217, 219, 220, 221, 222, + 228, 231, 237, 238, 247, 254, 257, } var yyPact = [...]int{ - 3144, -1000, -275, 1036, -1000, -1000, -1000, -1000, -1000, -1000, + 2752, -1000, -271, 1032, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1001, 802, -1000, + -1000, -1000, -1000, -1000, -1000, 270, 12017, 1, 149, 21, + 16825, 146, 294, 17167, -1000, 28, -1000, 20, 17167, 24, + 12359, -1000, -1000, -75, -102, -1000, 9965, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 801, 984, 985, 996, 691, + 1060, -1000, 8585, 115, 115, 16483, 7217, -1000, -1000, 328, + 17167, 144, 17167, -146, 103, 103, 103, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 968, 778, -1000, - -1000, -1000, -1000, -1000, -1000, 284, 11521, 26, 147, 20, - 16315, 146, 126, 16656, -1000, 28, -1000, 16, 16656, 24, - 11862, -1000, -1000, -81, -83, -1000, 9475, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 774, 944, 964, 966, 525, - 972, -1000, 8099, 112, 112, 15974, 6735, -1000, -1000, 490, - 16656, 140, 16656, -147, 109, 109, 109, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2617,25 +2671,25 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 134, 17167, 509, 509, 224, + -1000, 17167, 98, 509, 98, 98, 98, 17167, -1000, 193, + -1000, -1000, -1000, 17167, 509, 933, 345, 88, 4732, -1000, + 199, -1000, 4732, 38, 4732, -41, 1014, 35, -24, -1000, + 4732, -1000, -1000, -1000, -1000, -1000, -1000, 124, -1000, -1000, + 17167, 16134, 133, 304, -1000, -1000, -1000, -1000, -1000, -1000, + 657, 401, -1000, 9965, 1570, 754, 754, -1000, -1000, 175, + -1000, -1000, 10991, 10991, 10991, 10991, 10991, 10991, 10991, 10991, + 10991, 10991, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 754, 190, -1000, 9623, + 754, 754, 754, 754, 754, 754, 754, 754, 9965, 754, + 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, + 754, 754, 754, 754, 754, -1000, -1000, 1001, -1000, 802, + -1000, -1000, -1000, 966, 9965, 9965, 1001, -1000, 889, 8585, + -1000, -1000, 879, -1000, -1000, -1000, -1000, 369, 1031, -1000, + 11675, 189, 15792, 14766, 17167, 716, 684, -1000, -1000, 187, + 745, 6862, -117, -1000, -1000, -1000, 287, 14082, -1000, -1000, + -1000, 916, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 129, 16656, 644, 644, 317, - -1000, 16656, 103, 644, 103, 103, 103, 16656, -1000, 187, - -1000, -1000, -1000, 16656, 644, 884, 313, 64, 4257, -1000, - 204, -1000, 4257, 42, 4257, -21, 989, 47, -40, -1000, - 4257, -1000, -1000, -1000, -1000, -1000, -1000, 121, -1000, -1000, - 16656, 15626, 128, 298, -1000, -1000, -1000, -1000, -1000, -1000, - 565, 531, -1000, 9475, 1697, 733, 733, -1000, -1000, 177, - -1000, -1000, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, - 10498, 10498, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 733, 186, -1000, 9134, - 733, 733, 733, 733, 733, 733, 733, 733, 9475, 733, - 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, - 733, 733, 733, 733, 733, -1000, -1000, 968, -1000, 778, - -1000, -1000, -1000, 911, 9475, 9475, 968, -1000, 844, 8099, - -1000, -1000, 853, -1000, -1000, -1000, -1000, 354, 1008, -1000, - 11180, 184, 15285, 14262, 16656, 766, 731, -1000, -1000, 183, - 725, 6381, -104, -1000, -1000, -1000, 268, 13580, -1000, -1000, - -1000, 878, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2646,138 +2700,137 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 675, 17167, -1000, 2533, -1000, 509, 4732, 129, + 509, 317, 509, 17167, 17167, 4732, 4732, 4732, 48, 81, + 73, 17167, 744, 123, 17167, 977, 829, 17167, 509, 509, + -1000, 6152, -1000, 4732, 345, -1000, 487, 9965, 4732, 4732, + 4732, 17167, 4732, 4732, -1000, -1000, -1000, 370, -1000, -1000, + -1000, -1000, 4732, 4732, -1000, 1029, 318, -1000, -1000, -1000, + -1000, 9965, 232, -1000, 827, -1000, 23, -1000, -1000, -1000, + -1000, -1000, 1032, -1000, -1000, -1000, -120, -1000, -1000, 9965, + 9965, 9965, 9965, 540, 241, 10991, 431, 243, 10991, 10991, + 10991, 10991, 10991, 10991, 10991, 10991, 10991, 10991, 10991, 10991, + 10991, 10991, 10991, 652, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 509, -1000, 1050, 869, 869, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 11333, 7559, 6152, 691, + 672, 1001, 8585, 8585, 9965, 9965, 9269, 8927, 8585, 947, + 310, 401, 17167, -1000, -1000, 10649, -1000, -1000, -1000, -1000, + -1000, 501, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17167, + 17167, 8585, 8585, 8585, 8585, 8585, 985, 691, 879, -1000, + 1046, 222, 642, 743, -1000, 478, 985, 13740, 746, -1000, + 879, -1000, -1000, -1000, 17167, -1000, -1000, 15450, -1000, -1000, + 5797, 65, 17167, -1000, 706, 976, -1000, -1000, -1000, 979, + 13056, 13398, 65, 683, 14766, 17167, -1000, -1000, 14766, 17167, + 5442, 6507, -117, -1000, 711, -1000, -113, -128, 7901, 202, + -1000, -1000, -1000, -1000, 4377, 1273, 568, 412, -44, -1000, + -1000, -1000, 768, -1000, 768, 768, 768, 768, -10, -10, + -10, -10, -1000, -1000, -1000, -1000, -1000, 798, 793, -1000, + 768, 768, 768, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 717, 16656, -1000, 2928, -1000, 644, 4257, 123, 644, - 319, 644, 16656, 16656, 4257, 4257, 4257, 53, 87, 74, - 16656, 723, 117, 16656, 918, 800, 16656, 644, 644, -1000, - 5673, -1000, 4257, 313, -1000, 460, 9475, 4257, 4257, 4257, - 16656, 4257, 4257, -1000, -1000, -1000, 329, -1000, -1000, -1000, - -1000, 4257, 4257, -1000, 1002, 312, -1000, -1000, -1000, -1000, - 9475, 233, -1000, 798, -1000, 22, -1000, -1000, -1000, -1000, - -1000, 1036, -1000, -1000, -1000, -129, -1000, -1000, 9475, 9475, - 9475, 545, 239, 10498, 383, 335, 10498, 10498, 10498, 10498, - 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, - 10498, 596, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 644, -1000, 1033, 619, 619, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 10839, 7076, 5673, 525, 708, 968, - 8099, 8099, 9475, 9475, 8781, 8440, 8099, 888, 305, 531, - 16656, -1000, -1000, 10157, -1000, -1000, -1000, -1000, -1000, 475, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 16656, 16656, 8099, - 8099, 8099, 8099, 8099, 964, 525, 853, -1000, 1026, 222, - 537, 713, -1000, 394, 964, 13239, 758, -1000, 853, -1000, - -1000, -1000, 16656, -1000, -1000, 14944, -1000, -1000, 5319, 75, - 16656, -1000, 524, 975, -1000, -1000, -1000, 936, 12557, 12898, - 75, 660, 14262, 16656, -1000, -1000, 14262, 16656, 4965, 6027, - -104, -1000, 630, -1000, -113, -117, 7417, 202, -1000, -1000, - -1000, -1000, 3903, 247, 502, 369, -69, -1000, -1000, -1000, - 739, -1000, 739, 739, 739, 739, -25, -25, -25, -25, - -1000, -1000, -1000, -1000, -1000, 755, 754, -1000, 739, 739, - 739, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 753, - 753, 753, 744, 744, 763, -1000, 16656, 4257, 914, 4257, - -1000, 82, -1000, -1000, -1000, 16656, 16656, 16656, 16656, 16656, - 156, 16656, 16656, 665, -1000, 16656, 4257, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 531, -1000, -1000, -1000, -1000, - -1000, -1000, 16656, -1000, -1000, -1000, -1000, 16656, 313, 16656, - 16656, 531, -1000, 459, 16656, 16656, -1000, -1000, -1000, -1000, - -1000, 531, 239, 243, -1000, -1000, 495, -1000, -1000, 1831, - -1000, -1000, -1000, -1000, 383, 10498, 10498, 10498, 564, 1831, - 1931, 542, 1945, 203, 492, 492, 201, 201, 201, 201, - 201, 435, 435, -1000, -1000, -1000, 475, -1000, -1000, -1000, - 475, 8099, 8099, 655, 733, 181, -1000, 774, -1000, -1000, - 964, 697, 697, 398, 359, 280, 998, 697, 276, 992, - 697, 697, 8099, -1000, -1000, 327, -1000, 9475, 475, -1000, - 180, -1000, 1535, 638, 635, 697, 475, 475, 697, 697, - 911, -1000, -1000, 840, 9475, 9475, 9475, -1000, -1000, -1000, - 911, 983, -1000, 851, 850, 974, 8099, 14262, 853, -1000, - -1000, -1000, 175, 764, 733, -1000, 16656, 14262, 14262, 14262, - 14262, 14262, -1000, 828, 827, -1000, 814, 812, 813, 16656, - -1000, 706, 525, 12557, 198, 733, -1000, 14603, -1000, -1000, - 974, 14262, 568, -1000, 568, -1000, 173, -1000, -1000, 630, - -104, -48, -1000, -1000, -1000, -1000, 531, -1000, 650, 623, - 3549, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 749, 644, - -1000, 907, 242, 342, 644, 906, -1000, -1000, -1000, 854, - -1000, 326, -72, -1000, -1000, 405, -25, -25, -1000, -1000, - 202, 860, 202, 202, 202, 457, 457, -1000, -1000, -1000, - -1000, 397, -1000, -1000, -1000, 396, -1000, 793, 16656, 4257, - -1000, -1000, -1000, -1000, 389, 389, 238, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 63, 732, - -1000, -1000, -1000, -1000, -7, 52, 114, -1000, 4257, -1000, - 312, 312, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 564, 1831, 1816, -1000, 10498, 10498, -1000, -1000, - 697, 697, 8099, 5673, 968, 911, -1000, -1000, 127, 596, - 127, 10498, 10498, -1000, 10498, 10498, -1000, -159, 737, 301, - -1000, 9475, 528, -1000, 5673, -1000, 10498, 10498, -1000, -1000, - -1000, -1000, -1000, -1000, 838, 531, 531, -1000, -1000, 16656, - -1000, -1000, -1000, -1000, 986, 9475, -1000, 616, -1000, 4611, - 790, 16656, 733, 1036, 12557, 16656, 574, -1000, 258, 975, - 748, 789, 873, -1000, -1000, -1000, -1000, 824, -1000, 788, - -1000, -1000, -1000, -1000, -1000, 525, -1000, 134, 132, 130, - 16656, -1000, 968, 568, -1000, -1000, 212, -1000, -1000, -122, - -133, -1000, -1000, -1000, 3903, -1000, 3903, 16656, 77, -1000, - 644, 644, -1000, -1000, -1000, 745, 771, 10498, -1000, -1000, - -1000, 497, 202, 202, -1000, 330, -1000, -1000, -1000, 689, - -1000, 687, 601, 681, 16656, -1000, -1000, -1000, -1000, -1000, + -1000, 786, 786, 786, 771, 771, 808, -1000, 17167, 4732, + 967, 4732, -1000, 85, -1000, -1000, -1000, 17167, 17167, 17167, + 17167, 17167, 162, 17167, 17167, 737, -1000, 17167, 4732, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 401, -1000, -1000, + -1000, -1000, -1000, -1000, 17167, -1000, -1000, -1000, -1000, 17167, + 345, 17167, 17167, 401, -1000, 470, 17167, 17167, -1000, -1000, + -1000, -1000, -1000, 401, 241, 308, 305, -1000, -1000, 455, + -1000, -1000, 1116, -1000, -1000, -1000, -1000, 431, 10991, 10991, + 10991, 348, 1116, 1848, 566, 1390, 203, 324, 324, 204, + 204, 204, 204, 204, 492, 492, -1000, -1000, -1000, 501, + -1000, -1000, -1000, 501, 8585, 8585, 735, 754, 186, -1000, + 801, -1000, -1000, 985, 639, 639, 365, 630, 283, 1028, + 639, 280, 1027, 639, 639, 8585, -1000, -1000, 354, -1000, + 9965, 501, -1000, 185, -1000, 411, 720, 712, 639, 501, + 501, 639, 639, 966, -1000, -1000, 880, 9965, 9965, 9965, + -1000, -1000, -1000, 966, 995, -1000, 903, 902, 1007, 8585, + 14766, 879, -1000, -1000, -1000, 180, 741, 754, -1000, 17167, + 14766, 14766, 14766, 14766, 14766, -1000, 864, 863, -1000, 841, + 840, 856, 17167, -1000, 646, 691, 13056, 183, 754, -1000, + 15108, -1000, -1000, 1007, 14766, 595, -1000, 595, -1000, 179, + -1000, -1000, 711, -117, -66, -1000, -1000, -1000, -1000, 401, + -1000, 662, 710, 4022, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 780, 509, -1000, 959, 233, 242, 509, 958, -1000, + -1000, -1000, 935, -1000, 325, -57, -1000, -1000, 436, -10, + -10, -1000, -1000, 202, 915, 202, 202, 202, 445, 445, + -1000, -1000, -1000, -1000, 433, -1000, -1000, -1000, 429, -1000, + 821, 17167, 4732, -1000, -1000, -1000, -1000, 221, 221, 238, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 16656, -1000, -1000, -1000, -1000, -1000, - 16656, -167, 644, 16656, 16656, 16656, 16656, -1000, 313, 313, - -1000, 10498, 1831, 1831, -1000, -1000, 475, -1000, 964, -1000, - 475, 739, 739, -1000, 739, 744, -1000, 739, 6, 739, - 5, 475, 475, 1760, 1626, 1571, 1226, 733, -154, -1000, - 531, 9475, -1000, 868, 847, -1000, -1000, 973, 945, 531, - -1000, -1000, 909, 558, 536, -1000, -1000, 7758, 679, 167, - 672, -1000, 968, 16656, 9475, -1000, -1000, 9475, 741, -1000, - 9475, -1000, -1000, -1000, 968, 733, 733, 733, 672, 964, - -1000, -1000, -1000, -1000, 3549, -1000, 643, -1000, 739, -1000, - -1000, -1000, 16656, -65, 1025, 1831, -1000, -1000, -1000, -1000, - -1000, -25, 427, -25, 392, -1000, 390, 4257, -1000, -1000, - -1000, -1000, 912, -1000, 5673, -1000, -1000, 736, 759, -1000, - -1000, -1000, -1000, 1831, -1000, 911, -1000, -1000, 165, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 10498, 10498, 10498, - 10498, 10498, 964, 426, 531, 10498, 10498, -1000, 9475, 9475, - 905, -1000, 733, -1000, 671, 16656, 16656, -1000, 16656, 964, - -1000, 531, 531, 16656, 531, 13921, 16656, 16656, 12204, -1000, - 193, 16656, -1000, 621, -1000, 213, -1000, -76, 202, -1000, - 202, 489, 486, -1000, 733, 571, -1000, 256, 16656, 16656, - -1000, -1000, -1000, 1535, 1535, 1535, 1535, 65, 475, -1000, - 1535, 1535, 531, 565, 1024, -1000, 733, 1036, 139, -1000, - -1000, -1000, 581, 578, -1000, 578, 578, 198, 193, -1000, - 644, 240, 423, -1000, 85, 16656, 349, 903, -1000, 870, - -1000, -1000, -1000, -1000, -1000, 62, 5673, 3903, 552, -1000, - -1000, -1000, -1000, -1000, 475, 58, -172, -1000, -1000, -1000, - 16656, 536, 16656, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 382, -1000, -1000, 16656, -1000, -1000, 421, -1000, -1000, 517, - -1000, 16656, -1000, -1000, 732, -1000, 837, -164, -175, 529, - -1000, -1000, 735, -1000, -1000, 62, 848, -167, -1000, 836, - -1000, 16656, -1000, 59, -1000, -168, 514, 57, -173, 768, - 733, -176, 765, -1000, 996, 9816, -1000, -1000, 1021, 232, - 232, 1535, 475, -1000, -1000, -1000, 92, 409, -1000, -1000, - -1000, -1000, -1000, -1000, + -1000, 64, 806, -1000, -1000, -1000, -1000, 17, 47, 122, + -1000, 4732, -1000, 318, 318, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 348, 1116, 1767, -1000, 10991, + 10991, -1000, -1000, 639, 639, 8585, 6152, 1001, 966, -1000, + -1000, 26, 652, 26, 10991, 10991, -1000, 10991, 10991, -1000, + -159, 738, 284, -1000, 9965, 341, -1000, 6152, -1000, 10991, + 10991, -1000, -1000, -1000, -1000, -1000, -1000, 885, 401, 401, + -1000, -1000, 17167, -1000, -1000, -1000, -1000, 1005, 9965, -1000, + 709, -1000, 5087, 820, 17167, 754, 1032, 13056, 17167, 600, + -1000, 285, 976, 805, 819, 736, -1000, -1000, -1000, -1000, + 861, -1000, 860, -1000, -1000, -1000, -1000, -1000, 691, -1000, + 141, 139, 131, 17167, -1000, 1001, 595, -1000, -1000, 214, + -1000, -1000, -125, -133, -1000, -1000, -1000, 4377, -1000, 4377, + 17167, 82, -1000, 509, 509, -1000, -1000, -1000, 774, 816, + 10991, -1000, -1000, -1000, 524, 202, 202, -1000, 262, -1000, + -1000, -1000, 627, -1000, 625, 708, 622, 17167, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17167, -1000, -1000, + -1000, -1000, -1000, 17167, -166, 509, 17167, 17167, 17167, 17167, + -1000, 345, 345, -1000, 10991, 1116, 1116, -1000, -1000, 501, + -1000, 985, -1000, 501, 768, 768, -1000, 768, 771, -1000, + 768, 13, 768, 6, 501, 501, 1697, 1629, 870, 534, + 754, -153, -1000, 401, 9965, -1000, 849, 439, -1000, -1000, + 1003, 992, 401, -1000, -1000, 961, 590, 632, -1000, -1000, + 8243, 603, 178, 597, -1000, 1001, 17167, 9965, -1000, -1000, + 9965, 770, -1000, 9965, -1000, -1000, -1000, 1001, 754, 754, + 754, 597, 985, -1000, -1000, -1000, -1000, 4022, -1000, 592, + -1000, 768, -1000, -1000, -1000, 17167, -38, 1044, 1116, -1000, + -1000, -1000, -1000, -1000, -10, 444, -10, 426, -1000, 398, + 4732, -1000, -1000, -1000, -1000, 963, -1000, 6152, -1000, -1000, + 767, 807, -1000, -1000, -1000, -1000, 1116, -1000, 966, -1000, + -1000, 136, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 10991, 10991, 10991, 10991, 10991, 985, 442, 401, 10991, 10991, + -1000, 9965, 9965, 956, -1000, 754, -1000, 800, 17167, 17167, + -1000, 17167, 985, -1000, 401, 401, 17167, 401, 14424, 17167, + 17167, 12702, -1000, 188, 17167, -1000, 572, -1000, 207, -1000, + -82, 202, -1000, 202, 522, 515, -1000, 754, 705, -1000, + 279, 17167, 17167, -1000, -1000, -1000, 411, 411, 411, 411, + 59, 501, -1000, 411, 411, 401, 657, 1043, -1000, 754, + 1032, 172, -1000, -1000, -1000, 564, 558, -1000, 558, 558, + 183, 188, -1000, 509, 258, 441, -1000, 77, 17167, 335, + 938, -1000, 937, -1000, -1000, -1000, -1000, -1000, 62, 6152, + 4377, 551, -1000, -1000, -1000, -1000, -1000, 501, 60, -169, + -1000, -1000, -1000, 17167, 632, 17167, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 380, -1000, -1000, 17167, -1000, -1000, 402, + -1000, -1000, 529, -1000, 17167, -1000, -1000, 806, -1000, 877, + -164, -173, 620, -1000, -1000, 756, -1000, -1000, 62, 893, + -166, -1000, 872, -1000, 17167, -1000, 54, -1000, -167, 527, + 52, -170, 811, 754, -174, 739, -1000, 1026, 10307, -1000, + -1000, 1042, 234, 234, 411, 501, -1000, -1000, -1000, 86, + 533, -1000, -1000, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1266, 1265, 33, 69, 70, 1264, 1263, 1262, 94, - 93, 92, 1259, 1258, 1254, 1253, 1252, 1250, 1249, 1248, - 1247, 1242, 1240, 1236, 1235, 1233, 1230, 1229, 1226, 1224, - 1223, 1222, 87, 1220, 85, 1219, 1218, 1217, 1216, 1215, - 1214, 1213, 1210, 38, 230, 50, 55, 1209, 57, 1756, - 1208, 60, 90, 63, 1206, 28, 1205, 1204, 104, 1203, - 1202, 59, 1200, 1199, 64, 1198, 71, 1197, 11, 56, - 1194, 1193, 1190, 1189, 79, 1569, 1187, 1184, 14, 1181, - 1179, 108, 1178, 62, 29, 13, 18, 22, 1177, 68, - 1175, 9, 1174, 65, 1171, 1169, 1168, 1166, 47, 1165, - 61, 1164, 53, 24, 1163, 10, 74, 27, 21, 6, - 1162, 1159, 20, 96, 54, 73, 1158, 1157, 559, 1156, - 1155, 39, 1154, 1149, 1148, 23, 1147, 99, 446, 1145, - 1143, 1142, 1141, 40, 1010, 1404, 12, 78, 1139, 1137, - 1135, 2077, 52, 48, 16, 1133, 1132, 1130, 42, 1065, - 36, 1129, 1128, 31, 1127, 1125, 1119, 1118, 1115, 1114, - 1112, 66, 1111, 1108, 1107, 19, 35, 1106, 1105, 72, - 30, 1104, 1103, 1097, 46, 67, 1094, 1092, 58, 1090, - 1089, 25, 1088, 1085, 1084, 1083, 1082, 26, 17, 1074, - 15, 1073, 8, 1068, 32, 1066, 4, 1064, 7, 1063, - 3, 0, 1062, 5, 45, 1, 1050, 2, 1049, 1046, - 132, 1025, 84, 1042, 91, + 0, 1321, 1320, 22, 67, 68, 1317, 1316, 1315, 97, + 96, 94, 1313, 1310, 1307, 1305, 1304, 1303, 1300, 1299, + 1298, 1296, 1295, 1293, 1292, 1283, 1282, 1281, 1279, 1277, + 1276, 1275, 91, 1274, 78, 1273, 1272, 1271, 1270, 1268, + 1265, 1264, 1262, 40, 228, 35, 65, 1261, 59, 1358, + 1257, 50, 55, 82, 1253, 36, 1251, 1250, 84, 1248, + 1246, 58, 1245, 1244, 54, 1243, 87, 1241, 13, 52, + 1239, 1238, 1237, 1236, 79, 481, 1233, 1213, 14, 1212, + 1211, 111, 1209, 62, 29, 15, 12, 25, 1208, 69, + 1206, 6, 1205, 61, 1204, 1203, 1202, 1201, 47, 1194, + 63, 1192, 27, 56, 1190, 7, 73, 33, 19, 8, + 1187, 1186, 18, 71, 48, 72, 1184, 1180, 550, 1179, + 1176, 42, 1172, 1170, 1169, 26, 1168, 102, 490, 1167, + 1165, 1164, 1163, 39, 1013, 1782, 24, 74, 1162, 1160, + 1159, 2569, 38, 60, 17, 1158, 1155, 1152, 32, 98, + 57, 1151, 1148, 34, 1147, 1146, 1145, 1144, 1142, 1141, + 1140, 66, 1139, 1138, 1136, 89, 20, 1118, 1116, 64, + 30, 1114, 1113, 1111, 45, 70, 1110, 1109, 53, 1108, + 1107, 21, 1101, 1098, 1097, 1093, 1092, 31, 10, 1091, + 16, 1085, 11, 1080, 28, 1079, 4, 1078, 9, 1076, + 3, 0, 1073, 5, 46, 2, 1067, 1, 1063, 1061, + 1330, 1105, 90, 1059, 99, } var yyR1 = [...]int{ @@ -2826,31 +2879,31 @@ var yyR1 = [...]int{ 57, 145, 145, 144, 144, 144, 143, 143, 60, 60, 60, 62, 61, 61, 61, 61, 63, 63, 65, 65, 64, 64, 66, 68, 68, 68, 68, 68, 69, 69, - 49, 49, 49, 49, 49, 49, 49, 119, 119, 71, - 71, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 82, 82, 82, 82, 82, 82, 72, 72, 72, - 72, 72, 72, 72, 43, 43, 83, 83, 83, 89, - 84, 84, 75, 75, 75, 75, 75, 75, 75, 75, + 49, 49, 49, 49, 49, 49, 49, 49, 119, 119, + 71, 71, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 82, 82, 82, 82, 82, 82, 72, 72, + 72, 72, 72, 72, 72, 43, 43, 83, 83, 83, + 89, 84, 84, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 79, 79, 79, 79, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 214, - 214, 81, 80, 80, 80, 80, 80, 80, 80, 41, - 41, 41, 41, 41, 150, 150, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 94, - 94, 42, 42, 92, 92, 93, 95, 95, 91, 91, - 91, 74, 74, 74, 74, 74, 74, 74, 74, 76, - 76, 76, 96, 96, 97, 97, 98, 98, 99, 99, - 100, 101, 101, 101, 102, 102, 102, 102, 103, 103, - 103, 73, 73, 73, 73, 104, 104, 104, 104, 108, - 108, 85, 85, 87, 87, 86, 88, 109, 109, 112, - 110, 110, 110, 113, 113, 113, 113, 111, 111, 111, - 140, 140, 140, 117, 117, 127, 127, 128, 128, 118, - 118, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 130, 130, 130, 131, 131, 132, 132, 132, 139, - 139, 135, 135, 136, 136, 141, 141, 142, 142, 133, + 75, 75, 75, 75, 75, 75, 75, 79, 79, 79, + 79, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 214, 214, 81, 80, 80, 80, 80, 80, 80, 80, + 41, 41, 41, 41, 41, 150, 150, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 94, 94, 42, 42, 92, 92, 93, 95, 95, 91, + 91, 91, 74, 74, 74, 74, 74, 74, 74, 74, + 76, 76, 76, 96, 96, 97, 97, 98, 98, 99, + 99, 100, 101, 101, 101, 102, 102, 102, 102, 103, + 103, 103, 73, 73, 73, 73, 104, 104, 104, 104, + 108, 108, 85, 85, 87, 87, 86, 88, 109, 109, + 112, 110, 110, 110, 113, 113, 113, 113, 111, 111, + 111, 140, 140, 140, 117, 117, 127, 127, 128, 128, + 118, 118, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 130, 130, 130, 131, 131, 132, 132, 132, + 139, 139, 135, 135, 136, 136, 141, 141, 142, 142, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, @@ -2862,7 +2915,8 @@ var yyR1 = [...]int{ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, @@ -2879,8 +2933,7 @@ var yyR1 = [...]int{ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 210, - 211, 148, 149, 149, 149, + 134, 210, 211, 148, 149, 149, 149, } var yyR2 = [...]int{ @@ -2929,31 +2982,32 @@ var yyR2 = [...]int{ 2, 0, 1, 0, 1, 2, 1, 1, 1, 2, 2, 1, 2, 3, 2, 3, 2, 2, 2, 1, 1, 3, 3, 0, 5, 4, 5, 5, 0, 2, - 1, 3, 3, 2, 3, 1, 2, 0, 3, 1, - 1, 3, 3, 4, 4, 5, 3, 4, 5, 6, - 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 0, 2, 1, 1, 1, 3, - 1, 3, 1, 1, 1, 1, 1, 3, 3, 3, + 1, 3, 3, 3, 2, 3, 1, 2, 0, 3, + 1, 1, 3, 3, 4, 4, 5, 3, 4, 5, + 6, 2, 1, 2, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, + 3, 1, 3, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 1, 1, 1, 1, 4, 5, 5, 6, - 4, 4, 6, 6, 6, 8, 8, 8, 8, 9, - 8, 5, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 8, 8, 0, - 2, 3, 4, 4, 4, 4, 4, 4, 4, 0, - 3, 4, 7, 3, 1, 1, 2, 3, 3, 1, - 2, 2, 1, 2, 1, 2, 2, 1, 2, 0, - 1, 0, 2, 1, 2, 4, 0, 2, 1, 3, - 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 0, 3, 0, 2, 0, 3, 1, 3, - 2, 0, 1, 1, 0, 2, 4, 4, 0, 2, - 4, 2, 1, 5, 4, 1, 3, 3, 5, 0, - 5, 1, 3, 1, 2, 3, 1, 1, 3, 3, - 1, 2, 3, 3, 3, 3, 3, 1, 2, 1, - 1, 1, 1, 1, 1, 0, 2, 0, 3, 0, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 1, 1, 1, 1, 4, 5, 5, + 6, 4, 4, 6, 6, 6, 8, 8, 8, 8, + 9, 8, 5, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 0, 2, 3, 4, 4, 4, 4, 4, 4, 4, + 0, 3, 4, 7, 3, 1, 1, 2, 3, 3, + 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, + 0, 1, 0, 2, 1, 2, 4, 0, 2, 1, + 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 0, 3, 0, 2, 0, 3, 1, + 3, 2, 0, 1, 1, 0, 2, 4, 4, 0, + 2, 4, 2, 1, 5, 4, 1, 3, 3, 5, + 0, 5, 1, 3, 1, 2, 3, 1, 1, 3, + 3, 1, 2, 3, 3, 3, 3, 3, 1, 2, + 1, 1, 1, 1, 1, 1, 0, 2, 0, 3, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2982,352 +3036,351 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ -1000, -208, -1, -3, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -23, -24, -25, -27, -28, -29, -30, -31, -6, -26, -19, -20, -4, -210, 6, - 7, -35, 9, 10, 30, -21, 122, 123, 125, 124, - 158, 126, 151, 53, 172, 173, 175, 176, 177, 178, - -38, 156, 157, 31, 32, 128, 34, 57, 8, 261, - 153, 152, 25, -209, 363, -34, 5, -98, 15, -3, + 7, -35, 9, 10, 30, -21, 123, 124, 126, 125, + 159, 127, 152, 53, 173, 174, 176, 177, 178, 179, + -38, 157, 158, 31, 32, 129, 34, 57, 8, 262, + 154, 153, 25, -209, 364, -34, 5, -98, 15, -3, -32, -213, -32, -32, -32, -32, -32, -183, -185, 57, - 95, -132, 132, 77, 253, 129, 130, 136, -135, -201, - -134, 60, 61, 62, 271, 144, 303, 304, 172, 186, - 180, 207, 199, 272, 305, 145, 197, 200, 240, 142, - 306, 227, 234, 71, 175, 249, 307, 154, 195, 191, - 308, 280, 189, 27, 309, 236, 212, 310, 276, 238, - 190, 235, 128, 311, 147, 140, 312, 213, 217, 313, - 241, 314, 315, 316, 184, 185, 317, 143, 243, 211, - 141, 33, 273, 37, 162, 244, 215, 318, 210, 206, - 319, 320, 321, 322, 209, 183, 205, 41, 219, 218, - 220, 239, 202, 323, 324, 325, 148, 326, 192, 18, - 327, 328, 329, 330, 331, 247, 157, 332, 160, 333, - 334, 335, 336, 337, 338, 237, 214, 216, 137, 164, - 233, 275, 339, 245, 188, 340, 149, 161, 156, 248, - 150, 341, 342, 343, 344, 345, 346, 347, 176, 348, - 349, 350, 351, 171, 242, 251, 40, 224, 352, 182, - 139, 353, 173, 168, 229, 203, 163, 354, 355, 193, - 194, 208, 181, 204, 174, 165, 158, 356, 250, 225, - 277, 201, 198, 169, 357, 166, 167, 358, 230, 231, - 170, 274, 246, 196, 226, -118, 132, 253, 129, 231, - 134, 130, 130, 131, 132, 253, 129, 130, -64, -141, - -201, -134, 132, 130, 113, 200, 240, 122, 228, 236, - -124, 237, 164, -152, 130, -120, 227, 230, 231, 170, - -201, 238, 242, 241, 232, -141, 174, -146, 179, -135, - 177, -64, -36, 359, 126, -148, -148, 229, 229, -148, - -84, -49, -70, 79, -75, 29, 23, -74, -71, -91, - -88, -89, 113, 114, 116, 115, 117, 102, 103, 110, - 80, 118, -79, -77, -78, -80, 64, 63, 72, 65, + 96, -132, 133, 77, 254, 130, 131, 137, -135, -201, + -134, 60, 61, 62, 272, 145, 304, 305, 173, 187, + 181, 208, 200, 273, 306, 146, 198, 201, 241, 143, + 307, 228, 235, 71, 176, 250, 308, 155, 196, 192, + 309, 281, 190, 27, 310, 237, 213, 311, 277, 239, + 191, 236, 129, 312, 148, 141, 313, 214, 218, 314, + 242, 315, 316, 317, 185, 186, 318, 144, 244, 212, + 142, 33, 274, 37, 163, 245, 216, 319, 211, 207, + 320, 321, 322, 323, 210, 184, 206, 41, 220, 219, + 221, 240, 203, 324, 325, 326, 149, 327, 193, 18, + 328, 329, 330, 331, 332, 248, 158, 333, 161, 334, + 335, 336, 337, 338, 339, 238, 215, 217, 138, 165, + 234, 276, 340, 246, 189, 341, 150, 162, 157, 249, + 151, 342, 343, 344, 345, 346, 347, 348, 177, 349, + 350, 351, 352, 172, 243, 252, 40, 225, 353, 183, + 140, 354, 174, 169, 230, 204, 164, 355, 356, 194, + 195, 209, 182, 205, 175, 166, 159, 357, 251, 226, + 278, 202, 199, 170, 358, 167, 168, 359, 231, 232, + 171, 275, 247, 197, 227, -118, 133, 254, 130, 232, + 135, 131, 131, 132, 133, 254, 130, 131, -64, -141, + -201, -134, 133, 131, 114, 201, 241, 123, 229, 237, + -124, 238, 165, -152, 131, -120, 228, 231, 232, 171, + -201, 239, 243, 242, 233, -141, 175, -146, 180, -135, + 178, -64, -36, 360, 127, -148, -148, 230, 230, -148, + -84, -49, -70, 80, -75, 29, 23, -74, -71, -91, + -88, -89, 114, 115, 117, 116, 118, 103, 104, 111, + 81, 119, -79, -77, -78, -80, 64, 63, 72, 65, 66, 67, 68, 73, 74, 75, -135, -141, -86, -210, - 47, 48, 262, 263, 264, 265, 270, 266, 82, 36, - 252, 260, 259, 258, 256, 257, 254, 255, 268, 269, - 135, 253, 129, 108, 261, -201, -134, -5, -4, -210, + 47, 48, 263, 264, 265, 266, 271, 267, 83, 36, + 253, 261, 260, 259, 257, 258, 255, 256, 269, 270, + 136, 254, 130, 109, 262, -201, -134, -5, -4, -210, 6, 20, 21, -102, 17, 16, -211, 59, -40, -47, - 42, 43, -48, 21, 35, 46, 44, -33, -46, 104, + 42, 43, -48, 21, 35, 46, 44, -33, -46, 105, -49, -141, -118, -118, 11, -58, -59, -64, -66, -141, - -110, -151, 174, -113, 242, 241, -136, -111, -135, -133, - 240, 200, 239, 127, 278, 78, 22, 24, 222, 81, - 113, 16, 82, 112, 262, 122, 51, 279, 254, 255, - 252, 264, 265, 253, 228, 29, 10, 281, 25, 152, - 21, 35, 106, 124, 85, 86, 155, 23, 153, 75, - 284, 19, 54, 11, 13, 285, 286, 14, 135, 134, - 97, 131, 49, 8, 118, 26, 94, 45, 287, 28, - 288, 289, 290, 291, 47, 95, 17, 256, 257, 31, - 292, 270, 159, 108, 52, 38, 79, 293, 294, 73, - 295, 76, 55, 77, 15, 50, 296, 297, 298, 299, - 96, 125, 261, 48, 300, 129, 6, 267, 30, 151, - 46, 301, 130, 84, 268, 269, 133, 74, 5, 136, - 32, 9, 53, 56, 258, 259, 260, 36, 83, 12, - 302, -184, 95, -175, -201, -64, 131, -64, 261, -128, - 135, -128, -128, 130, -64, -201, -201, 122, 124, 127, - 55, -22, -64, -127, 135, -201, -127, -127, -127, -64, - 119, -64, -201, 30, -125, 95, 12, 253, -201, 164, - 130, 165, 132, -149, -210, -136, -179, 131, 33, 143, - -149, 168, 169, -149, -123, -122, 234, 235, 229, 233, - 12, 169, 229, 167, -149, 133, -135, -37, -135, 64, - -7, -3, -10, -9, -11, 87, -148, -148, 58, 78, - 77, 94, -49, -72, 97, 79, 95, 96, 81, 99, - 98, 109, 102, 103, 104, 105, 106, 107, 108, 100, - 101, 112, 87, 88, 89, 90, 91, 92, 93, -119, - -210, -89, -210, 120, 121, -75, -75, -75, -75, -75, - -75, -75, -75, -75, -75, -210, 119, -2, -84, -4, - -210, -210, -210, -210, -210, -210, -210, -210, -94, -49, - -210, -214, -81, -210, -214, -81, -214, -81, -214, -210, - -214, -81, -214, -81, -214, -214, -81, -210, -210, -210, - -210, -210, -210, -210, -98, -3, -32, -103, 19, 31, - -49, -99, -100, -49, -98, 38, -44, -46, -48, 42, - 43, 70, 11, -138, -137, 22, -135, 64, 119, -65, - 26, -64, -51, -52, -53, -54, -67, -90, -210, -64, - -64, -58, -212, 58, 11, 56, -212, 58, 119, 58, - 174, -113, -115, -114, 243, 245, 87, -140, -135, 64, - 29, 30, 59, 58, -64, -154, -157, -159, -158, -160, - -155, -156, 197, 198, 113, 201, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 30, 154, 193, 194, - 195, 196, 213, 214, 215, 216, 217, 218, 219, 220, - 180, 199, 272, 181, 182, 183, 184, 185, 186, 188, - 189, 190, 191, 192, -201, -149, 132, -201, 79, -201, - -64, -64, -149, -149, -149, 166, 166, 130, 130, 171, - -64, 58, 133, -58, 23, 55, -64, -201, -201, -142, - -141, -133, -149, -125, 64, -49, -149, -149, -149, -64, - -149, -149, -180, 11, 97, -149, -149, 11, -121, 11, - 97, -49, -126, 95, 55, -147, 177, 211, 360, 361, - 362, -49, -49, -49, -82, 73, 79, 74, 75, -75, - -83, -86, -89, 69, 97, 95, 96, 81, -75, -75, - -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, - -75, -75, -75, -150, -201, 64, -201, -74, -74, -135, - -45, 21, 35, -44, -136, -142, -133, -34, -211, -211, - -98, -44, -44, -49, -49, -91, 64, -44, -91, 64, - -44, -44, -39, 21, 35, -92, -93, 83, -91, -135, - -141, -211, -75, -135, -135, -44, -45, -45, -44, -44, - -102, -211, 9, 97, 58, 18, 58, -101, 24, 25, - -102, -76, -135, 65, 68, -50, 58, 11, -48, -64, - -137, 104, -142, -106, 160, -64, 30, 58, -60, -62, - -61, -63, 45, 49, 51, 46, 47, 48, 52, -145, - 22, -51, -3, -210, -144, 160, -143, 22, -141, 64, - -106, 56, -51, -64, -51, -66, -141, 104, -113, -115, - 58, 244, 246, 247, 55, 76, -49, -166, 112, -186, - -187, -188, -136, 64, 65, -175, -176, -177, -189, 146, - -194, 137, 139, 136, -178, 147, 131, 28, 59, -171, - 73, 79, -167, 225, -161, 57, -161, -161, -161, -161, - -165, 200, -165, -165, -165, 57, 57, -161, -161, -161, - -169, 57, -169, -169, -170, 57, -170, -139, 56, -64, - -149, 23, -149, -129, 127, 124, 125, -197, 123, 222, - 200, 71, 29, 15, 262, 160, 277, -201, 161, -64, - -64, -64, -64, -64, 127, 124, -64, -64, -64, -149, - -64, -64, -125, -141, -141, 64, -64, -135, 73, 74, - 75, -83, -75, -75, -75, -43, 155, 78, -211, -211, - -44, -44, -210, 119, -5, -102, -211, -211, 58, 56, - 22, 11, 11, -211, 11, 11, -211, -211, -44, -95, - -93, 85, -49, -211, 119, -211, 58, 58, -211, -211, - -211, -211, -211, -103, 40, -49, -49, -100, -103, -117, - 19, 11, 36, 36, -69, 12, -46, -51, -48, 119, - -73, 30, 36, -3, -210, -210, -109, -112, -91, -52, - -53, -53, -52, -53, 45, 45, 45, 50, 45, 50, - 45, -61, -141, -211, -211, -3, -68, 53, 134, 54, - -210, -143, -69, -51, -69, -69, 119, -114, -116, 248, - 245, 251, -201, 64, 58, -188, 87, 57, -201, 28, - -178, -178, -181, -201, -181, 28, -163, 29, 73, -168, - 226, 65, -165, -165, -166, 30, -166, -166, -166, -174, - 64, -174, 65, 65, 55, -135, -149, -148, -204, 142, - 138, 146, 147, 140, 60, 61, 62, 131, 28, 137, - 139, 160, 136, -204, -130, -131, 133, 22, 131, 28, - 160, -203, 56, 166, 222, 166, 133, -149, -121, -121, - -43, 78, -75, -75, -211, -211, -45, -136, -98, -103, - -153, 113, 197, 154, 195, 191, 211, 202, 224, 193, - 225, -150, -153, -75, -75, -75, -75, 271, -98, 86, - -49, 84, -136, -75, -75, 41, -64, -96, 13, -49, - 104, -108, 55, -109, -85, -87, -86, -210, -104, -135, - -107, -135, -69, 58, 87, -56, -55, 55, 56, -57, - 55, -55, 45, 45, -211, 131, 131, 131, -107, -98, - -69, 245, 249, 250, -187, -188, -191, -190, -135, -194, - -181, -181, 57, -164, 55, -75, 59, -166, -166, -201, - 113, 59, 58, 59, 58, 59, 58, -64, -148, -148, - -64, -148, -135, -200, 274, -202, -201, -135, -135, -135, - -64, -125, -125, -75, -211, -102, -211, -161, -161, -161, - -170, -161, 185, -161, 185, -211, -211, 19, 19, 19, - 19, -210, -42, 267, -49, 58, 58, -97, 14, 16, - 27, -108, 58, -211, -211, 58, 119, -211, 58, -98, - -112, -49, -49, 57, -49, -210, -210, -210, -211, -102, - 59, 58, -161, -105, -135, -172, 222, 9, -165, 64, - -165, 65, 65, -149, 26, -199, -198, -136, 57, 56, - -103, -165, -201, -75, -75, -75, -75, -75, -102, 64, - -75, -75, -49, -84, 28, -87, 36, -3, -135, -135, - -135, -102, -105, -105, -211, -105, -105, -144, -193, -192, - 56, 141, 71, -190, 59, 58, -173, 137, 28, 136, - -78, -166, -166, 59, 59, -210, 58, 87, -105, -64, - -211, -211, -211, -211, -41, 97, 274, -211, -211, -211, - 9, -85, 119, 59, -211, -211, -211, -68, -192, -201, - -182, 87, 64, 149, -135, -162, 71, 28, 28, -195, - -196, 160, -198, -188, 59, -211, 272, 52, 275, -109, - -135, 65, -64, 64, -211, 58, -135, -203, 41, 273, - 276, 57, -196, 36, -200, 41, -105, 162, 274, 59, - 163, 275, -206, -207, 55, -210, 276, -207, 55, 10, - 9, -75, 159, -205, 150, 145, 148, 30, -205, -211, - -211, 144, 29, 73, + -110, -151, 175, -113, 243, 242, -136, -111, -135, -133, + 241, 201, 240, 128, 279, 79, 22, 24, 223, 82, + 114, 16, 83, 113, 263, 123, 51, 280, 255, 256, + 253, 265, 266, 254, 229, 29, 10, 282, 25, 153, + 21, 35, 107, 125, 86, 87, 156, 23, 154, 75, + 285, 19, 54, 11, 13, 286, 287, 14, 136, 135, + 98, 132, 49, 8, 119, 26, 95, 45, 288, 28, + 289, 290, 291, 292, 47, 96, 17, 257, 258, 31, + 293, 271, 160, 109, 52, 38, 80, 294, 295, 73, + 296, 76, 55, 77, 15, 50, 297, 298, 299, 300, + 97, 126, 262, 48, 301, 130, 6, 268, 30, 152, + 46, 302, 131, 85, 269, 270, 134, 74, 5, 137, + 32, 9, 53, 56, 259, 260, 261, 36, 84, 12, + 303, 78, -184, 96, -175, -201, -64, 132, -64, 262, + -128, 136, -128, -128, 131, -64, -201, -201, 123, 125, + 128, 55, -22, -64, -127, 136, -201, -127, -127, -127, + -64, 120, -64, -201, 30, -125, 96, 12, 254, -201, + 165, 131, 166, 133, -149, -210, -136, -179, 132, 33, + 144, -149, 169, 170, -149, -123, -122, 235, 236, 230, + 234, 12, 170, 230, 168, -149, 134, -135, -37, -135, + 64, -7, -3, -10, -9, -11, 88, -148, -148, 58, + 79, 77, 78, 95, -49, -72, 98, 80, 96, 97, + 82, 100, 99, 110, 103, 104, 105, 106, 107, 108, + 109, 101, 102, 113, 88, 89, 90, 91, 92, 93, + 94, -119, -210, -89, -210, 121, 122, -75, -75, -75, + -75, -75, -75, -75, -75, -75, -75, -210, 120, -2, + -84, -4, -210, -210, -210, -210, -210, -210, -210, -210, + -94, -49, -210, -214, -81, -210, -214, -81, -214, -81, + -214, -210, -214, -81, -214, -81, -214, -214, -81, -210, + -210, -210, -210, -210, -210, -210, -98, -3, -32, -103, + 19, 31, -49, -99, -100, -49, -98, 38, -44, -46, + -48, 42, 43, 70, 11, -138, -137, 22, -135, 64, + 120, -65, 26, -64, -51, -52, -53, -54, -67, -90, + -210, -64, -64, -58, -212, 58, 11, 56, -212, 58, + 120, 58, 175, -113, -115, -114, 244, 246, 88, -140, + -135, 64, 29, 30, 59, 58, -64, -154, -157, -159, + -158, -160, -155, -156, 198, 199, 114, 202, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 30, 155, + 194, 195, 196, 197, 214, 215, 216, 217, 218, 219, + 220, 221, 181, 200, 273, 182, 183, 184, 185, 186, + 187, 189, 190, 191, 192, 193, -201, -149, 133, -201, + 80, -201, -64, -64, -149, -149, -149, 167, 167, 131, + 131, 172, -64, 58, 134, -58, 23, 55, -64, -201, + -201, -142, -141, -133, -149, -125, 64, -49, -149, -149, + -149, -64, -149, -149, -180, 11, 98, -149, -149, 11, + -121, 11, 98, -49, -126, 96, 55, -147, 178, 212, + 361, 362, 363, -49, -49, -49, -49, -82, 73, 80, + 74, 75, -75, -83, -86, -89, 69, 98, 96, 97, + 82, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, -75, -75, -75, -150, -201, 64, -201, + -74, -74, -135, -45, 21, 35, -44, -136, -142, -133, + -34, -211, -211, -98, -44, -44, -49, -49, -91, 64, + -44, -91, 64, -44, -44, -39, 21, 35, -92, -93, + 84, -91, -135, -141, -211, -75, -135, -135, -44, -45, + -45, -44, -44, -102, -211, 9, 98, 58, 18, 58, + -101, 24, 25, -102, -76, -135, 65, 68, -50, 58, + 11, -48, -64, -137, 105, -142, -106, 161, -64, 30, + 58, -60, -62, -61, -63, 45, 49, 51, 46, 47, + 48, 52, -145, 22, -51, -3, -210, -144, 161, -143, + 22, -141, 64, -106, 56, -51, -64, -51, -66, -141, + 105, -113, -115, 58, 245, 247, 248, 55, 76, -49, + -166, 113, -186, -187, -188, -136, 64, 65, -175, -176, + -177, -189, 147, -194, 138, 140, 137, -178, 148, 132, + 28, 59, -171, 73, 80, -167, 226, -161, 57, -161, + -161, -161, -161, -165, 201, -165, -165, -165, 57, 57, + -161, -161, -161, -169, 57, -169, -169, -170, 57, -170, + -139, 56, -64, -149, 23, -149, -129, 128, 125, 126, + -197, 124, 223, 201, 71, 29, 15, 263, 161, 278, + -201, 162, -64, -64, -64, -64, -64, 128, 125, -64, + -64, -64, -149, -64, -64, -125, -141, -141, 64, -64, + -135, 73, 74, 75, -83, -75, -75, -75, -43, 156, + 79, -211, -211, -44, -44, -210, 120, -5, -102, -211, + -211, 58, 56, 22, 11, 11, -211, 11, 11, -211, + -211, -44, -95, -93, 86, -49, -211, 120, -211, 58, + 58, -211, -211, -211, -211, -211, -103, 40, -49, -49, + -100, -103, -117, 19, 11, 36, 36, -69, 12, -46, + -51, -48, 120, -73, 30, 36, -3, -210, -210, -109, + -112, -91, -52, -53, -53, -52, -53, 45, 45, 45, + 50, 45, 50, 45, -61, -141, -211, -211, -3, -68, + 53, 135, 54, -210, -143, -69, -51, -69, -69, 120, + -114, -116, 249, 246, 252, -201, 64, 58, -188, 88, + 57, -201, 28, -178, -178, -181, -201, -181, 28, -163, + 29, 73, -168, 227, 65, -165, -165, -166, 30, -166, + -166, -166, -174, 64, -174, 65, 65, 55, -135, -149, + -148, -204, 143, 139, 147, 148, 141, 60, 61, 62, + 132, 28, 138, 140, 161, 137, -204, -130, -131, 134, + 22, 132, 28, 161, -203, 56, 167, 223, 167, 134, + -149, -121, -121, -43, 79, -75, -75, -211, -211, -45, + -136, -98, -103, -153, 114, 198, 155, 196, 192, 212, + 203, 225, 194, 226, -150, -153, -75, -75, -75, -75, + 272, -98, 87, -49, 85, -136, -75, -75, 41, -64, + -96, 13, -49, 105, -108, 55, -109, -85, -87, -86, + -210, -104, -135, -107, -135, -69, 58, 88, -56, -55, + 55, 56, -57, 55, -55, 45, 45, -211, 132, 132, + 132, -107, -98, -69, 246, 250, 251, -187, -188, -191, + -190, -135, -194, -181, -181, 57, -164, 55, -75, 59, + -166, -166, -201, 114, 59, 58, 59, 58, 59, 58, + -64, -148, -148, -64, -148, -135, -200, 275, -202, -201, + -135, -135, -135, -64, -125, -125, -75, -211, -102, -211, + -161, -161, -161, -170, -161, 186, -161, 186, -211, -211, + 19, 19, 19, 19, -210, -42, 268, -49, 58, 58, + -97, 14, 16, 27, -108, 58, -211, -211, 58, 120, + -211, 58, -98, -112, -49, -49, 57, -49, -210, -210, + -210, -211, -102, 59, 58, -161, -105, -135, -172, 223, + 9, -165, 64, -165, 65, 65, -149, 26, -199, -198, + -136, 57, 56, -103, -165, -201, -75, -75, -75, -75, + -75, -102, 64, -75, -75, -49, -84, 28, -87, 36, + -3, -135, -135, -135, -102, -105, -105, -211, -105, -105, + -144, -193, -192, 56, 142, 71, -190, 59, 58, -173, + 138, 28, 137, -78, -166, -166, 59, 59, -210, 58, + 88, -105, -64, -211, -211, -211, -211, -41, 98, 275, + -211, -211, -211, 9, -85, 120, 59, -211, -211, -211, + -68, -192, -201, -182, 88, 64, 150, -135, -162, 71, + 28, 28, -195, -196, 161, -198, -188, 59, -211, 273, + 52, 276, -109, -135, 65, -64, 64, -211, 58, -135, + -203, 41, 274, 277, 57, -196, 36, -200, 41, -105, + 163, 275, 59, 164, 276, -206, -207, 55, -210, 277, + -207, 55, 10, 9, -75, 160, -205, 151, 146, 149, + 30, -205, -211, -211, 145, 29, 73, } var yyDef = [...]int{ 28, -2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 616, 0, 358, - 358, 358, 358, 358, 358, 0, 686, 669, 0, 0, + 21, 22, 23, 24, 25, 26, 27, 617, 0, 358, + 358, 358, 358, 358, 358, 0, 687, 670, 0, 0, 0, 0, -2, 323, 324, 0, 326, -2, 0, 0, - 335, 991, 991, 0, 0, 991, 0, 989, 45, 46, - 341, 342, 343, 1, 3, 0, 362, 624, 0, 0, - -2, 360, 0, 669, 669, 0, 0, 74, 75, 0, - 0, 0, 978, 0, 667, 667, 667, 687, 688, 691, - 692, 29, 30, 31, 817, 818, 819, 820, 821, 822, - 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, - 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, - 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, - 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, - 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, - 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, - 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, - 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, - 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, - 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, - 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, - 973, 974, 975, 976, 977, 979, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 0, 0, 0, 0, 0, - 670, 0, 665, 0, 665, 665, 665, 0, 274, 440, - 695, 696, 978, 0, 0, 0, 314, 0, 992, 286, - 0, 288, 992, 0, 992, 0, 295, 0, 0, 301, - 992, 306, 320, 321, 308, 322, 325, 0, 330, 333, - 0, 348, 0, 0, 340, 353, 354, 991, 991, 357, - 32, 490, 450, 0, 455, 457, 0, 492, 493, 494, - 495, 496, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 522, 523, 524, 525, 601, 602, 603, 604, - 605, 606, 607, 608, 459, 460, 598, 0, 646, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, - 559, 559, 559, 559, 559, 559, 559, 559, 0, 0, - 0, 0, 0, 0, 0, -2, -2, 616, 41, 0, - 358, 363, 364, 628, 0, 0, 616, 990, 0, 0, + 335, 993, 993, 0, 0, 993, 0, 991, 45, 46, + 341, 342, 343, 1, 3, 0, 362, 625, 0, 0, + -2, 360, 0, 670, 670, 0, 0, 74, 75, 0, + 0, 0, 980, 0, 668, 668, 668, 688, 689, 692, + 693, 29, 30, 31, 819, 820, 821, 822, 823, 824, + 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, + 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, + 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, + 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, + 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, + 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, + 975, 976, 977, 978, 979, 981, 982, 983, 984, 985, + 986, 987, 988, 989, 990, 0, 0, 0, 0, 0, + 671, 0, 666, 0, 666, 666, 666, 0, 274, 440, + 696, 697, 980, 0, 0, 0, 314, 0, 994, 286, + 0, 288, 994, 0, 994, 0, 295, 0, 0, 301, + 994, 306, 320, 321, 308, 322, 325, 0, 330, 333, + 0, 348, 0, 0, 340, 353, 354, 993, 993, 357, + 32, 491, 450, 0, 456, 458, 0, 493, 494, 495, + 496, 497, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 523, 524, 525, 526, 602, 603, 604, 605, + 606, 607, 608, 609, 460, 461, 599, 0, 647, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 590, 0, + 560, 560, 560, 560, 560, 560, 560, 560, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 617, 41, 0, + 358, 363, 364, 629, 0, 0, 617, 992, 0, 0, -2, -2, 374, 380, 381, 382, 383, 359, 0, 386, 390, 0, 0, 0, 0, 0, 0, 54, 56, 440, - 60, 0, 967, 650, -2, -2, 0, 0, 693, 694, - -2, 830, -2, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, - 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, - 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, - 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, - 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, - 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, - 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, - 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, - 816, 0, 0, 93, 0, 91, 0, 992, 0, 0, - 0, 0, 0, 0, 992, 992, 992, 0, 0, 0, - 0, 265, 0, 0, 0, 0, 0, 0, 0, 273, - 0, 275, 992, 314, 278, 0, 0, 992, 992, 992, - 0, 992, 992, 285, 993, 994, 0, 195, 196, 197, - 289, 992, 992, 291, 0, 311, 309, 310, 303, 304, - 0, 317, 298, 299, 302, 331, 334, 351, 349, 350, - 352, 344, 345, 346, 347, 0, 355, 356, 0, 0, - 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 477, 478, 479, 480, 481, 482, 483, 456, - 0, 470, 0, 0, 0, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 0, 371, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 368, 0, 590, - 0, 543, 551, 0, 544, 552, 545, 553, 546, 0, - 547, 554, 548, 555, 549, 550, 556, 0, 0, 0, - 371, 371, 0, 0, 624, 0, 373, 33, 0, 0, - 625, 617, 618, 621, 624, 0, 395, 384, 375, 378, - 379, 361, 0, 387, 391, 0, 393, 394, 0, 58, - 0, 439, 0, 397, 399, 400, 401, 421, 0, 423, - -2, 0, 0, 0, 52, 53, 0, 0, 0, 0, - 967, 651, 62, 63, 0, 0, 0, 171, 660, 661, - 662, 658, 220, 0, 0, 159, 155, 99, 100, 101, - 148, 103, 148, 148, 148, 148, 168, 168, 168, 168, - 131, 132, 133, 134, 135, 0, 0, 118, 148, 148, - 148, 122, 138, 139, 140, 141, 142, 143, 144, 145, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 150, - 150, 150, 152, 152, 689, 77, 0, 992, 0, 992, - 89, 0, 234, 236, 237, 0, 0, 0, 0, 0, - 0, 0, 0, 268, 666, 0, 992, 271, 272, 441, - 697, 698, 276, 277, 315, 316, 279, 280, 281, 282, - 283, 284, 0, 198, 199, 290, 294, 0, 314, 0, - 0, 296, 297, 0, 0, 0, 332, 336, 337, 338, - 339, 491, 451, 452, 454, 471, 0, 473, 475, 461, - 462, 486, 487, 488, 0, 0, 0, 0, 484, 466, - 0, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 511, 574, 575, 0, 509, 510, 521, - 0, 0, 0, 372, 599, 0, -2, 0, 489, 645, - 624, 0, 0, 0, 0, 494, 601, 0, 494, 601, - 0, 0, 0, 369, 370, 596, 593, 0, 0, 598, - 0, 560, 0, 0, 0, 0, 0, 0, 0, 0, - 628, 42, 629, 0, 0, 0, 0, 620, 622, 623, - 628, 0, 609, 0, 0, 448, 0, 0, 376, 39, - 392, 388, 0, 0, 0, 438, 0, 0, 0, 0, - 0, 0, 428, 0, 0, 431, 0, 0, 0, 0, - 422, 0, 0, 0, 443, 911, 424, 0, 426, 427, - 448, 0, 448, 55, 448, 57, 0, 442, 652, 61, - 0, 0, 66, 67, 653, 654, 655, 656, 0, 90, - 221, 223, 226, 227, 228, 94, 95, 96, 0, 0, - 208, 0, 0, 202, 202, 0, 200, 201, 92, 162, - 160, 0, 157, 156, 102, 0, 168, 168, 125, 126, - 171, 0, 171, 171, 171, 0, 0, 119, 120, 121, - 113, 0, 114, 115, 116, 0, 117, 0, 0, 992, - 79, 668, 80, 991, 0, 0, 681, 235, 671, 672, - 673, 674, 675, 676, 677, 678, 679, 680, 0, 81, - 239, 241, 240, 244, 0, 0, 0, 266, 992, 270, - 311, 311, 293, 312, 313, 318, 300, 328, 472, 474, - 476, 463, 484, 467, 0, 464, 0, 0, 458, 526, - 0, 0, 371, 0, 616, 628, 530, 531, 0, 0, - 0, 0, 0, 567, 0, 0, 568, 0, 616, 0, - 594, 0, 0, 542, 0, 561, 0, 0, 562, 563, - 564, 565, 566, 35, 0, 626, 627, 619, 34, 0, - 663, 664, 610, 611, 612, 0, 385, 396, 377, 0, - 639, 0, 0, 632, 0, 0, 448, 647, 0, 398, - 417, 419, 0, 414, 429, 430, 432, 0, 434, 0, - 436, 437, 402, 403, 404, 0, 405, 0, 0, 0, - 0, 425, 616, 448, 50, 51, 0, 64, 65, 0, - 0, 71, 172, 173, 0, 224, 0, 0, 0, 190, - 202, 202, 193, 203, 194, 0, 164, 0, 161, 98, - 158, 0, 171, 171, 127, 0, 128, 129, 130, 0, - 146, 0, 0, 0, 0, 690, 78, 229, 991, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 991, 0, 991, 682, 683, 684, 685, - 0, 84, 0, 0, 0, 0, 0, 269, 314, 314, - 465, 0, 485, 468, 527, 528, 0, 600, 624, 37, - 0, 148, 148, 579, 148, 152, 582, 148, 584, 148, - 587, 0, 0, 0, 0, 0, 0, 0, 591, 541, - 597, 0, 599, 0, 0, 630, 36, 614, 0, 449, - 389, 43, 0, 639, 631, 641, 643, 0, 0, 635, - 0, 409, 616, 0, 0, 411, 418, 0, 0, 412, - 0, 413, 433, 435, -2, 0, 0, 0, 0, 624, - 49, 68, 69, 70, 222, 225, 0, 204, 148, 207, - 191, 192, 0, 166, 0, 163, 149, 123, 124, 169, - 170, 168, 0, 168, 0, 153, 0, 992, 230, 231, - 232, 233, 0, 238, 0, 82, 83, 0, 0, 243, - 267, 287, 292, 469, 529, 628, 532, 576, 168, 580, - 581, 583, 585, 586, 588, 534, 533, 0, 0, 0, - 0, 0, 624, 0, 595, 0, 0, 40, 0, 0, - 0, 44, 0, 644, 0, 0, 0, 59, 0, 624, - 648, 649, 415, 0, 420, 0, 0, 0, 423, 48, - 182, 0, 206, 0, 407, 174, 167, 0, 171, 147, - 171, 0, 0, 76, 0, 85, 86, 0, 0, 0, - 38, 577, 578, 0, 0, 0, 0, 569, 0, 592, - 0, 0, 615, 613, 0, 642, 0, 634, 637, 636, - 410, 47, 0, 0, 445, 0, 0, 443, 181, 183, - 0, 188, 0, 205, 0, 0, 179, 0, 176, 178, - 165, 136, 137, 151, 154, 0, 0, 0, 0, 245, - 535, 537, 536, 538, 0, 0, 0, 540, 557, 558, - 0, 633, 0, 416, 444, 446, 447, 406, 184, 185, - 0, 189, 187, 0, 408, 97, 0, 175, 177, 0, - 261, 0, 87, 88, 81, 539, 0, 0, 0, 640, - 638, 186, 0, 180, 260, 0, 0, 84, 570, 0, - 573, 0, 262, 0, 242, 571, 0, 0, 0, 209, - 0, 0, 210, 211, 0, 0, 572, 212, 0, 0, - 0, 0, 0, 213, 215, 216, 0, 0, 214, 263, - 264, 217, 218, 219, + 60, 0, 969, 651, -2, -2, 0, 0, 694, 695, + -2, 832, -2, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, + 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, + 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, + 817, 818, 0, 0, 93, 0, 91, 0, 994, 0, + 0, 0, 0, 0, 0, 994, 994, 994, 0, 0, + 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, + 273, 0, 275, 994, 314, 278, 0, 0, 994, 994, + 994, 0, 994, 994, 285, 995, 996, 0, 195, 196, + 197, 289, 994, 994, 291, 0, 311, 309, 310, 303, + 304, 0, 317, 298, 299, 302, 331, 334, 351, 349, + 350, 352, 344, 345, 346, 347, 0, 355, 356, 0, + 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 478, 479, 480, 481, 482, 483, + 484, 457, 0, 471, 0, 0, 0, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 0, 371, 0, 0, + 0, 617, 0, 0, 0, 0, 0, 0, 0, 368, + 0, 591, 0, 544, 552, 0, 545, 553, 546, 554, + 547, 0, 548, 555, 549, 556, 550, 551, 557, 0, + 0, 0, 371, 371, 0, 0, 625, 0, 373, 33, + 0, 0, 626, 618, 619, 622, 625, 0, 395, 384, + 375, 378, 379, 361, 0, 387, 391, 0, 393, 394, + 0, 58, 0, 439, 0, 397, 399, 400, 401, 421, + 0, 423, -2, 0, 0, 0, 52, 53, 0, 0, + 0, 0, 969, 652, 62, 63, 0, 0, 0, 171, + 661, 662, 663, 659, 220, 0, 0, 159, 155, 99, + 100, 101, 148, 103, 148, 148, 148, 148, 168, 168, + 168, 168, 131, 132, 133, 134, 135, 0, 0, 118, + 148, 148, 148, 122, 138, 139, 140, 141, 142, 143, + 144, 145, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 150, 150, 150, 152, 152, 690, 77, 0, 994, + 0, 994, 89, 0, 234, 236, 237, 0, 0, 0, + 0, 0, 0, 0, 0, 268, 667, 0, 994, 271, + 272, 441, 698, 699, 276, 277, 315, 316, 279, 280, + 281, 282, 283, 284, 0, 198, 199, 290, 294, 0, + 314, 0, 0, 296, 297, 0, 0, 0, 332, 336, + 337, 338, 339, 492, 451, 452, 453, 455, 472, 0, + 474, 476, 462, 463, 487, 488, 489, 0, 0, 0, + 0, 485, 467, 0, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 512, 575, 576, 0, + 510, 511, 522, 0, 0, 0, 372, 600, 0, -2, + 0, 490, 646, 625, 0, 0, 0, 0, 495, 602, + 0, 495, 602, 0, 0, 0, 369, 370, 597, 594, + 0, 0, 599, 0, 561, 0, 0, 0, 0, 0, + 0, 0, 0, 629, 42, 630, 0, 0, 0, 0, + 621, 623, 624, 629, 0, 610, 0, 0, 448, 0, + 0, 376, 39, 392, 388, 0, 0, 0, 438, 0, + 0, 0, 0, 0, 0, 428, 0, 0, 431, 0, + 0, 0, 0, 422, 0, 0, 0, 443, 913, 424, + 0, 426, 427, 448, 0, 448, 55, 448, 57, 0, + 442, 653, 61, 0, 0, 66, 67, 654, 655, 656, + 657, 0, 90, 221, 223, 226, 227, 228, 94, 95, + 96, 0, 0, 208, 0, 0, 202, 202, 0, 200, + 201, 92, 162, 160, 0, 157, 156, 102, 0, 168, + 168, 125, 126, 171, 0, 171, 171, 171, 0, 0, + 119, 120, 121, 113, 0, 114, 115, 116, 0, 117, + 0, 0, 994, 79, 669, 80, 993, 0, 0, 682, + 235, 672, 673, 674, 675, 676, 677, 678, 679, 680, + 681, 0, 81, 239, 241, 240, 244, 0, 0, 0, + 266, 994, 270, 311, 311, 293, 312, 313, 318, 300, + 328, 473, 475, 477, 464, 485, 468, 0, 465, 0, + 0, 459, 527, 0, 0, 371, 0, 617, 629, 531, + 532, 0, 0, 0, 0, 0, 568, 0, 0, 569, + 0, 617, 0, 595, 0, 0, 543, 0, 562, 0, + 0, 563, 564, 565, 566, 567, 35, 0, 627, 628, + 620, 34, 0, 664, 665, 611, 612, 613, 0, 385, + 396, 377, 0, 640, 0, 0, 633, 0, 0, 448, + 648, 0, 398, 417, 419, 0, 414, 429, 430, 432, + 0, 434, 0, 436, 437, 402, 403, 404, 0, 405, + 0, 0, 0, 0, 425, 617, 448, 50, 51, 0, + 64, 65, 0, 0, 71, 172, 173, 0, 224, 0, + 0, 0, 190, 202, 202, 193, 203, 194, 0, 164, + 0, 161, 98, 158, 0, 171, 171, 127, 0, 128, + 129, 130, 0, 146, 0, 0, 0, 0, 691, 78, + 229, 993, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 993, 0, 993, 683, + 684, 685, 686, 0, 84, 0, 0, 0, 0, 0, + 269, 314, 314, 466, 0, 486, 469, 528, 529, 0, + 601, 625, 37, 0, 148, 148, 580, 148, 152, 583, + 148, 585, 148, 588, 0, 0, 0, 0, 0, 0, + 0, 592, 542, 598, 0, 600, 0, 0, 631, 36, + 615, 0, 449, 389, 43, 0, 640, 632, 642, 644, + 0, 0, 636, 0, 409, 617, 0, 0, 411, 418, + 0, 0, 412, 0, 413, 433, 435, -2, 0, 0, + 0, 0, 625, 49, 68, 69, 70, 222, 225, 0, + 204, 148, 207, 191, 192, 0, 166, 0, 163, 149, + 123, 124, 169, 170, 168, 0, 168, 0, 153, 0, + 994, 230, 231, 232, 233, 0, 238, 0, 82, 83, + 0, 0, 243, 267, 287, 292, 470, 530, 629, 533, + 577, 168, 581, 582, 584, 586, 587, 589, 535, 534, + 0, 0, 0, 0, 0, 625, 0, 596, 0, 0, + 40, 0, 0, 0, 44, 0, 645, 0, 0, 0, + 59, 0, 625, 649, 650, 415, 0, 420, 0, 0, + 0, 423, 48, 182, 0, 206, 0, 407, 174, 167, + 0, 171, 147, 171, 0, 0, 76, 0, 85, 86, + 0, 0, 0, 38, 578, 579, 0, 0, 0, 0, + 570, 0, 593, 0, 0, 616, 614, 0, 643, 0, + 635, 638, 637, 410, 47, 0, 0, 445, 0, 0, + 443, 181, 183, 0, 188, 0, 205, 0, 0, 179, + 0, 176, 178, 165, 136, 137, 151, 154, 0, 0, + 0, 0, 245, 536, 538, 537, 539, 0, 0, 0, + 541, 558, 559, 0, 634, 0, 416, 444, 446, 447, + 406, 184, 185, 0, 189, 187, 0, 408, 97, 0, + 175, 177, 0, 261, 0, 87, 88, 81, 540, 0, + 0, 0, 641, 639, 186, 0, 180, 260, 0, 0, + 84, 571, 0, 574, 0, 262, 0, 242, 572, 0, + 0, 0, 209, 0, 0, 210, 211, 0, 0, 573, + 212, 0, 0, 0, 0, 0, 213, 215, 216, 0, + 0, 214, 263, 264, 217, 218, 219, } var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 80, 3, 3, 3, 107, 99, 3, - 57, 59, 104, 102, 58, 103, 119, 105, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 363, - 88, 87, 89, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 81, 3, 3, 3, 108, 100, 3, + 57, 59, 105, 103, 58, 104, 120, 106, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 364, + 89, 88, 90, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 109, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 110, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 98, 3, 110, + 3, 3, 3, 3, 99, 3, 111, } var yyTok2 = [...]int{ @@ -3338,10 +3391,10 @@ var yyTok2 = [...]int{ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, - 86, 90, 91, 92, 93, 94, 95, 96, 97, 100, - 101, 106, 108, 111, 112, 113, 114, 115, 116, 117, - 118, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, + 86, 87, 91, 92, 93, 94, 95, 96, 97, 98, + 101, 102, 107, 109, 112, 113, 114, 115, 116, 117, + 118, 119, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, @@ -3376,7 +3429,7 @@ var yyTok3 = [...]int{ 57670, 345, 57671, 346, 57672, 347, 57673, 348, 57674, 349, 57675, 350, 57676, 351, 57677, 352, 57678, 353, 57679, 354, 57680, 355, 57681, 356, 57682, 357, 57683, 358, 57684, 359, - 57685, 360, 57686, 361, 57687, 362, 0, + 57685, 360, 57686, 361, 57687, 362, 57688, 363, 0, } var yyErrorMessages = [...]struct { @@ -3718,59 +3771,59 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:336 +//line sql.y:337 { setParseTree(yylex, yyDollar[1].statement) } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:341 +//line sql.y:342 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:342 +//line sql.y:343 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:346 +//line sql.y:347 { yyVAL.statement = yyDollar[1].selStmt } case 28: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:373 +//line sql.y:374 { setParseTree(yylex, nil) } case 29: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:379 +//line sql.y:380 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), NoAt) } case 30: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:383 +//line sql.y:384 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), SingleAt) } case 31: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:387 +//line sql.y:388 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), DoubleAt) } case 32: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:393 +//line sql.y:394 { yyVAL.statement = &OtherAdmin{} } case 33: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:399 +//line sql.y:400 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3780,25 +3833,25 @@ yydefault: } case 34: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:407 +//line sql.y:408 { yyVAL.selStmt = &Union{FirstStatement: &ParenSelect{Select: yyDollar[2].selStmt}, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].str} } case 35: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:411 +//line sql.y:412 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } case 36: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:415 +//line sql.y:416 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } case 37: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:438 +//line sql.y:439 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3808,37 +3861,37 @@ yydefault: } case 38: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:446 +//line sql.y:447 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].str, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].str) } case 39: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:452 +//line sql.y:453 { yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} } case 40: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:460 +//line sql.y:461 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereStr, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingStr, yyDollar[8].expr)) } case 41: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:466 +//line sql.y:467 { yyVAL.selStmt = yyDollar[1].selStmt } case 42: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:470 +//line sql.y:471 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 43: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:477 +//line sql.y:478 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -3852,7 +3905,7 @@ yydefault: } case 44: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:489 +//line sql.y:490 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -3864,186 +3917,186 @@ yydefault: } case 45: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:501 +//line sql.y:502 { yyVAL.str = InsertStr } case 46: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:505 +//line sql.y:506 { yyVAL.str = ReplaceStr } case 47: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:511 +//line sql.y:512 { yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].str, TableExprs: yyDollar[4].tableExprs, Exprs: yyDollar[6].updateExprs, Where: NewWhere(WhereStr, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } case 48: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:517 +//line sql.y:518 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[4].tableName}}, Partitions: yyDollar[5].partitions, Where: NewWhere(WhereStr, yyDollar[6].expr), OrderBy: yyDollar[7].orderBy, Limit: yyDollar[8].limit} } case 49: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:521 +//line sql.y:522 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereStr, yyDollar[7].expr)} } case 50: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:525 +//line sql.y:526 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } case 51: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:529 +//line sql.y:530 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Targets: yyDollar[3].tableNames, TableExprs: yyDollar[5].tableExprs, Where: NewWhere(WhereStr, yyDollar[6].expr)} } case 52: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:534 +//line sql.y:535 { } case 53: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:535 +//line sql.y:536 { } case 54: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:539 +//line sql.y:540 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 55: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:543 +//line sql.y:544 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 56: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:549 +//line sql.y:550 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 57: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:553 +//line sql.y:554 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 58: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:558 +//line sql.y:559 { yyVAL.partitions = nil } case 59: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:562 +//line sql.y:563 { yyVAL.partitions = yyDollar[3].partitions } case 60: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:568 +//line sql.y:569 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } case 61: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:574 +//line sql.y:575 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].str, Characteristics: yyDollar[5].characteristics} } case 62: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:578 +//line sql.y:579 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Characteristics: yyDollar[4].characteristics} } case 63: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:584 +//line sql.y:585 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } case 64: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:588 +//line sql.y:589 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } case 65: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:594 +//line sql.y:595 { yyVAL.characteristic = &IsolationLevel{Level: string(yyDollar[3].str)} } case 66: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:598 +//line sql.y:599 { yyVAL.characteristic = &AccessMode{Mode: TxReadWrite} } case 67: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:602 +//line sql.y:603 { yyVAL.characteristic = &AccessMode{Mode: TxReadOnly} } case 68: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:608 +//line sql.y:609 { yyVAL.str = RepeatableRead } case 69: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:612 +//line sql.y:613 { yyVAL.str = ReadCommitted } case 70: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:616 +//line sql.y:617 { yyVAL.str = ReadUncommitted } case 71: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:620 +//line sql.y:621 { yyVAL.str = Serializable } case 72: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:626 +//line sql.y:627 { yyVAL.str = SessionStr } case 73: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:630 +//line sql.y:631 { yyVAL.str = GlobalStr } case 74: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:636 +//line sql.y:637 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } case 75: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:641 +//line sql.y:642 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike @@ -4051,139 +4104,139 @@ yydefault: } case 76: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:647 +//line sql.y:648 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[7].tableName} } case 77: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:652 +//line sql.y:653 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[3].tableName.ToViewName()} } case 78: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:656 +//line sql.y:657 { yyVAL.statement = &DDL{Action: CreateStr, Table: yyDollar[5].tableName.ToViewName()} } case 79: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:660 +//line sql.y:661 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } case 80: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:664 +//line sql.y:665 { yyVAL.statement = &DBDDL{Action: CreateStr, DBName: string(yyDollar[4].colIdent.String())} } case 81: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:669 +//line sql.y:670 { yyVAL.colIdent = NewColIdent("") } case 82: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:673 +//line sql.y:674 { yyVAL.colIdent = yyDollar[2].colIdent } case 83: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:679 +//line sql.y:680 { yyVAL.colIdent = yyDollar[1].colIdent } case 84: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:684 +//line sql.y:685 { var v []VindexParam yyVAL.vindexParams = v } case 85: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:689 +//line sql.y:690 { yyVAL.vindexParams = yyDollar[2].vindexParams } case 86: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:695 +//line sql.y:696 { yyVAL.vindexParams = make([]VindexParam, 0, 4) yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) } case 87: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:700 +//line sql.y:701 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } case 88: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:706 +//line sql.y:707 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } case 89: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:712 +//line sql.y:713 { yyVAL.ddl = &DDL{Action: CreateStr, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } case 90: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:719 +//line sql.y:720 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } case 91: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:726 +//line sql.y:727 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } case 92: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:730 +//line sql.y:731 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } case 93: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:736 +//line sql.y:737 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } case 94: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:741 +//line sql.y:742 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:745 +//line sql.y:746 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } case 96: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:749 +//line sql.y:750 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } case 97: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:755 +//line sql.y:756 { yyDollar[2].columnType.NotNull = yyDollar[3].boolVal yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4195,7 +4248,7 @@ yydefault: } case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:766 +//line sql.y:767 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolVal @@ -4203,74 +4256,74 @@ yydefault: } case 102: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:777 +//line sql.y:778 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].sqlVal } case 103: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:782 +//line sql.y:783 { yyVAL.columnType = yyDollar[1].columnType } case 104: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:788 +//line sql.y:789 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:792 +//line sql.y:793 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:796 +//line sql.y:797 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:800 +//line sql.y:801 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:804 +//line sql.y:805 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:808 +//line sql.y:809 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:812 +//line sql.y:813 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 111: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:816 +//line sql.y:817 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 112: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:820 +//line sql.y:821 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 113: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:826 +//line sql.y:827 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4278,7 +4331,7 @@ yydefault: } case 114: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:832 +//line sql.y:833 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4286,7 +4339,7 @@ yydefault: } case 115: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:838 +//line sql.y:839 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4294,7 +4347,7 @@ yydefault: } case 116: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:844 +//line sql.y:845 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4302,7 +4355,7 @@ yydefault: } case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:850 +//line sql.y:851 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4310,206 +4363,206 @@ yydefault: } case 118: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:858 +//line sql.y:859 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 119: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:862 +//line sql.y:863 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 120: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:866 +//line sql.y:867 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 121: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:870 +//line sql.y:871 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 122: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:874 +//line sql.y:875 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 123: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:880 +//line sql.y:881 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 124: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:884 +//line sql.y:885 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 125: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:888 +//line sql.y:889 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 126: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:892 +//line sql.y:893 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } case 127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:896 +//line sql.y:897 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 128: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:900 +//line sql.y:901 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 129: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:904 +//line sql.y:905 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 130: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:908 +//line sql.y:909 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 131: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:912 +//line sql.y:913 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 132: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:916 +//line sql.y:917 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 133: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:920 +//line sql.y:921 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 134: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:924 +//line sql.y:925 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:928 +//line sql.y:929 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 136: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:932 +//line sql.y:933 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 137: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:937 +//line sql.y:938 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:943 +//line sql.y:944 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 139: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:947 +//line sql.y:948 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 140: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:951 +//line sql.y:952 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:955 +//line sql.y:956 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:959 +//line sql.y:960 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:963 +//line sql.y:964 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 144: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:967 +//line sql.y:968 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 145: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:971 +//line sql.y:972 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 146: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:977 +//line sql.y:978 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") } case 147: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:982 +//line sql.y:983 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } case 148: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:987 +//line sql.y:988 { yyVAL.sqlVal = nil } case 149: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:991 +//line sql.y:992 { yyVAL.sqlVal = NewIntVal(yyDollar[2].bytes) } case 150: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:996 +//line sql.y:997 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 151: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1000 +//line sql.y:1001 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4518,13 +4571,13 @@ yydefault: } case 152: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1008 +//line sql.y:1009 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 153: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1012 +//line sql.y:1013 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4532,7 +4585,7 @@ yydefault: } case 154: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1018 +//line sql.y:1019 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntVal(yyDollar[2].bytes), @@ -4541,508 +4594,508 @@ yydefault: } case 155: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1026 +//line sql.y:1027 { yyVAL.boolVal = BoolVal(false) } case 156: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1030 +//line sql.y:1031 { yyVAL.boolVal = BoolVal(true) } case 157: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1035 +//line sql.y:1036 { yyVAL.boolVal = BoolVal(false) } case 158: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1039 +//line sql.y:1040 { yyVAL.boolVal = BoolVal(true) } case 159: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1045 +//line sql.y:1046 { yyVAL.boolVal = BoolVal(false) } case 160: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1049 +//line sql.y:1050 { yyVAL.boolVal = BoolVal(false) } case 161: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1053 +//line sql.y:1054 { yyVAL.boolVal = BoolVal(true) } case 162: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1058 +//line sql.y:1059 { yyVAL.optVal = nil } case 163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1062 +//line sql.y:1063 { yyVAL.optVal = yyDollar[2].expr } case 164: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1067 +//line sql.y:1068 { yyVAL.optVal = nil } case 165: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1071 +//line sql.y:1072 { yyVAL.optVal = yyDollar[3].expr } case 166: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1076 +//line sql.y:1077 { yyVAL.boolVal = BoolVal(false) } case 167: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1080 +//line sql.y:1081 { yyVAL.boolVal = BoolVal(true) } case 168: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1085 +//line sql.y:1086 { yyVAL.str = "" } case 169: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1089 +//line sql.y:1090 { yyVAL.str = string(yyDollar[3].colIdent.String()) } case 170: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1093 +//line sql.y:1094 { yyVAL.str = string(yyDollar[3].bytes) } case 171: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1098 +//line sql.y:1099 { yyVAL.str = "" } case 172: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1102 +//line sql.y:1103 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 173: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1106 +//line sql.y:1107 { yyVAL.str = string(yyDollar[2].bytes) } case 174: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1111 +//line sql.y:1112 { yyVAL.colKeyOpt = colKeyNone } case 175: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1115 +//line sql.y:1116 { yyVAL.colKeyOpt = colKeyPrimary } case 176: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1119 +//line sql.y:1120 { yyVAL.colKeyOpt = colKey } case 177: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1123 +//line sql.y:1124 { yyVAL.colKeyOpt = colKeyUniqueKey } case 178: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1127 +//line sql.y:1128 { yyVAL.colKeyOpt = colKeyUnique } case 179: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1132 +//line sql.y:1133 { yyVAL.sqlVal = nil } case 180: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1136 +//line sql.y:1137 { yyVAL.sqlVal = NewStrVal(yyDollar[2].bytes) } case 181: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1142 +//line sql.y:1143 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} } case 182: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1146 +//line sql.y:1147 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } case 183: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1152 +//line sql.y:1153 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } case 184: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1156 +//line sql.y:1157 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } case 185: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1162 +//line sql.y:1163 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].colIdent.String())} } case 186: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1166 +//line sql.y:1167 { // should not be string yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntVal(yyDollar[3].bytes)} } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1171 +//line sql.y:1172 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrVal(yyDollar[2].bytes)} } case 188: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1177 +//line sql.y:1178 { yyVAL.str = "" } case 189: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1181 +//line sql.y:1182 { yyVAL.str = string(yyDollar[1].bytes) } case 190: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1187 +//line sql.y:1188 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } case 191: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1191 +//line sql.y:1192 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } case 192: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1195 +//line sql.y:1196 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Unique: true} } case 193: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1199 +//line sql.y:1200 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(yyDollar[2].str), Unique: true} } case 194: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1203 +//line sql.y:1204 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } case 195: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1209 +//line sql.y:1210 { yyVAL.str = string(yyDollar[1].bytes) } case 196: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1213 +//line sql.y:1214 { yyVAL.str = string(yyDollar[1].bytes) } case 197: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1217 +//line sql.y:1218 { yyVAL.str = string(yyDollar[1].bytes) } case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1224 +//line sql.y:1225 { yyVAL.str = string(yyDollar[1].bytes) } case 199: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1228 +//line sql.y:1229 { yyVAL.str = string(yyDollar[1].bytes) } case 200: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1234 +//line sql.y:1235 { yyVAL.str = string(yyDollar[1].bytes) } case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1238 +//line sql.y:1239 { yyVAL.str = string(yyDollar[1].bytes) } case 202: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1243 +//line sql.y:1244 { yyVAL.str = "" } case 203: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1247 +//line sql.y:1248 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 204: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1253 +//line sql.y:1254 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } case 205: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1257 +//line sql.y:1258 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } case 206: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1263 +//line sql.y:1264 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].sqlVal} } case 207: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1269 +//line sql.y:1270 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } case 208: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1273 +//line sql.y:1274 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } case 209: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1280 +//line sql.y:1281 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns} } case 210: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1284 +//line sql.y:1285 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction} } case 211: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1288 +//line sql.y:1289 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnUpdate: yyDollar[11].ReferenceAction} } case 212: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1292 +//line sql.y:1293 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction, OnUpdate: yyDollar[12].ReferenceAction} } case 213: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1298 +//line sql.y:1299 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 214: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1304 +//line sql.y:1305 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 215: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1310 +//line sql.y:1311 { yyVAL.ReferenceAction = Restrict } case 216: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1314 +//line sql.y:1315 { yyVAL.ReferenceAction = Cascade } case 217: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1318 +//line sql.y:1319 { yyVAL.ReferenceAction = NoAction } case 218: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1322 +//line sql.y:1323 { yyVAL.ReferenceAction = SetDefault } case 219: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1326 +//line sql.y:1327 { yyVAL.ReferenceAction = SetNull } case 220: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1331 +//line sql.y:1332 { yyVAL.str = "" } case 221: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1335 +//line sql.y:1336 { yyVAL.str = " " + string(yyDollar[1].str) } case 222: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1339 +//line sql.y:1340 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1347 +//line sql.y:1348 { yyVAL.str = yyDollar[1].str } case 224: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1351 +//line sql.y:1352 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } case 225: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1355 +//line sql.y:1356 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } case 226: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1361 +//line sql.y:1362 { yyVAL.str = yyDollar[1].colIdent.String() } case 227: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1365 +//line sql.y:1366 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } case 228: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1369 +//line sql.y:1370 { yyVAL.str = string(yyDollar[1].bytes) } case 229: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1375 +//line sql.y:1376 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 230: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1379 +//line sql.y:1380 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 231: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1383 +//line sql.y:1384 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 232: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1387 +//line sql.y:1388 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[4].tableName}, ToTables: TableNames{yyDollar[7].tableName}} } case 233: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1392 +//line sql.y:1393 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName} } case 234: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1397 +//line sql.y:1398 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[3].tableName.ToViewName()} } case 235: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1401 +//line sql.y:1402 { yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } case 236: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1405 +//line sql.y:1406 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } case 237: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1409 +//line sql.y:1410 { yyVAL.statement = &DBDDL{Action: AlterStr, DBName: string(yyDollar[3].colIdent.String())} } case 238: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1413 +//line sql.y:1414 { yyVAL.statement = &DDL{ Action: CreateVindexStr, @@ -5056,7 +5109,7 @@ yydefault: } case 239: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1425 +//line sql.y:1426 { yyVAL.statement = &DDL{ Action: DropVindexStr, @@ -5068,19 +5121,19 @@ yydefault: } case 240: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1435 +//line sql.y:1436 { yyVAL.statement = &DDL{Action: AddVschemaTableStr, Table: yyDollar[5].tableName} } case 241: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1439 +//line sql.y:1440 { yyVAL.statement = &DDL{Action: DropVschemaTableStr, Table: yyDollar[5].tableName} } case 242: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1443 +//line sql.y:1444 { yyVAL.statement = &DDL{ Action: AddColVindexStr, @@ -5095,7 +5148,7 @@ yydefault: } case 243: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1456 +//line sql.y:1457 { yyVAL.statement = &DDL{ Action: DropColVindexStr, @@ -5107,13 +5160,13 @@ yydefault: } case 244: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1466 +//line sql.y:1467 { yyVAL.statement = &DDL{Action: AddSequenceStr, Table: yyDollar[5].tableName} } case 245: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1470 +//line sql.y:1471 { yyVAL.statement = &DDL{ Action: AddAutoIncStr, @@ -5126,49 +5179,49 @@ yydefault: } case 260: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1499 +//line sql.y:1500 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeStr, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1505 +//line sql.y:1506 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } case 262: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1509 +//line sql.y:1510 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } case 263: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1515 +//line sql.y:1516 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } case 264: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1519 +//line sql.y:1520 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } case 265: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1525 +//line sql.y:1526 { yyVAL.statement = yyDollar[3].ddl } case 266: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1531 +//line sql.y:1532 { yyVAL.ddl = &DDL{Action: RenameStr, FromTables: TableNames{yyDollar[1].tableName}, ToTables: TableNames{yyDollar[3].tableName}} } case 267: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1535 +//line sql.y:1536 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) @@ -5176,7 +5229,7 @@ yydefault: } case 268: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1543 +//line sql.y:1544 { var exists bool if yyDollar[3].byt != 0 { @@ -5186,14 +5239,14 @@ yydefault: } case 269: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1551 +//line sql.y:1552 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterStr, Table: yyDollar[5].tableName} } case 270: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1556 +//line sql.y:1557 { var exists bool if yyDollar[3].byt != 0 { @@ -5203,143 +5256,143 @@ yydefault: } case 271: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1564 +//line sql.y:1565 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } case 272: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1568 +//line sql.y:1569 { yyVAL.statement = &DBDDL{Action: DropStr, DBName: string(yyDollar[4].colIdent.String())} } case 273: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1574 +//line sql.y:1575 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[3].tableName} } case 274: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1578 +//line sql.y:1579 { yyVAL.statement = &DDL{Action: TruncateStr, Table: yyDollar[2].tableName} } case 275: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1583 +//line sql.y:1584 { yyVAL.statement = &OtherRead{} } case 276: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1589 +//line sql.y:1590 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } case 277: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1594 +//line sql.y:1595 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Type: CharsetStr, ShowTablesOpt: showTablesOpt} } case 278: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1599 +//line sql.y:1600 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt} } case 279: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1604 +//line sql.y:1605 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 280: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1609 +//line sql.y:1610 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String())} } case 281: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1613 +//line sql.y:1614 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 282: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1617 +//line sql.y:1618 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName} } case 283: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1621 +//line sql.y:1622 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 284: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1625 +//line sql.y:1626 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 285: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1629 +//line sql.y:1630 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 286: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1633 +//line sql.y:1634 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 287: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1637 +//line sql.y:1638 { showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } case 288: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1642 +//line sql.y:1643 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 289: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1646 +//line sql.y:1647 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 290: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1650 +//line sql.y:1651 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } case 291: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1654 +//line sql.y:1655 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 292: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1658 +//line sql.y:1659 { showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName} } case 293: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1663 +//line sql.y:1664 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5351,843 +5404,843 @@ yydefault: } case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1673 +//line sql.y:1674 { yyVAL.statement = &Show{Scope: yyDollar[2].str, Type: string(yyDollar[3].bytes)} } case 295: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1677 +//line sql.y:1678 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 296: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1681 +//line sql.y:1682 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowCollationFilterOpt: yyDollar[4].expr} } case 297: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1685 +//line sql.y:1686 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Scope: string(yyDollar[2].bytes), Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt} } case 298: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1690 +//line sql.y:1691 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 299: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1694 +//line sql.y:1695 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes)} } case 300: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1698 +//line sql.y:1699 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName} } case 301: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1702 +//line sql.y:1703 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes)} } case 302: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1716 +//line sql.y:1717 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String())} } case 303: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1722 +//line sql.y:1723 { yyVAL.str = string(yyDollar[1].bytes) } case 304: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1726 +//line sql.y:1727 { yyVAL.str = string(yyDollar[1].bytes) } case 305: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1732 +//line sql.y:1733 { yyVAL.str = "" } case 306: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1736 +//line sql.y:1737 { yyVAL.str = "extended " } case 307: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1742 +//line sql.y:1743 { yyVAL.str = "" } case 308: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1746 +//line sql.y:1747 { yyVAL.str = "full " } case 309: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1752 +//line sql.y:1753 { yyVAL.str = string(yyDollar[1].bytes) } case 310: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1756 +//line sql.y:1757 { yyVAL.str = string(yyDollar[1].bytes) } case 311: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1762 +//line sql.y:1763 { yyVAL.str = "" } case 312: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1766 +//line sql.y:1767 { yyVAL.str = yyDollar[2].tableIdent.v } case 313: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1770 +//line sql.y:1771 { yyVAL.str = yyDollar[2].tableIdent.v } case 314: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1776 +//line sql.y:1777 { yyVAL.showFilter = nil } case 315: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1780 +//line sql.y:1781 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 316: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1784 +//line sql.y:1785 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } case 317: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1790 +//line sql.y:1791 { yyVAL.showFilter = nil } case 318: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1794 +//line sql.y:1795 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 319: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1800 +//line sql.y:1801 { yyVAL.str = "" } case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1804 +//line sql.y:1805 { yyVAL.str = SessionStr } case 321: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1808 +//line sql.y:1809 { yyVAL.str = GlobalStr } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1814 +//line sql.y:1815 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } case 323: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1818 +//line sql.y:1819 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } case 324: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1824 +//line sql.y:1825 { yyVAL.statement = &Begin{} } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1828 +//line sql.y:1829 { yyVAL.statement = &Begin{} } case 326: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1834 +//line sql.y:1835 { yyVAL.statement = &Commit{} } case 327: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1840 +//line sql.y:1841 { yyVAL.statement = &Rollback{} } case 328: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1844 +//line sql.y:1845 { yyVAL.statement = &SRollback{Name: yyDollar[5].colIdent} } case 329: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1849 +//line sql.y:1850 { yyVAL.empty = struct{}{} } case 330: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1851 +//line sql.y:1852 { yyVAL.empty = struct{}{} } case 331: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1854 +//line sql.y:1855 { yyVAL.empty = struct{}{} } case 332: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1856 +//line sql.y:1857 { yyVAL.empty = struct{}{} } case 333: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1861 +//line sql.y:1862 { yyVAL.statement = &Savepoint{Name: yyDollar[2].colIdent} } case 334: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1867 +//line sql.y:1868 { yyVAL.statement = &Release{Name: yyDollar[3].colIdent} } case 335: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1872 +//line sql.y:1873 { yyVAL.str = "" } case 336: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1876 +//line sql.y:1877 { yyVAL.str = JSONStr } case 337: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1880 +//line sql.y:1881 { yyVAL.str = TreeStr } case 338: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1884 +//line sql.y:1885 { yyVAL.str = VitessStr } case 339: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1888 +//line sql.y:1889 { yyVAL.str = TraditionalStr } case 340: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1892 +//line sql.y:1893 { yyVAL.str = AnalyzeStr } case 341: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1898 +//line sql.y:1899 { yyVAL.bytes = yyDollar[1].bytes } case 342: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1902 +//line sql.y:1903 { yyVAL.bytes = yyDollar[1].bytes } case 343: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1906 +//line sql.y:1907 { yyVAL.bytes = yyDollar[1].bytes } case 344: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1912 +//line sql.y:1913 { yyVAL.statement = yyDollar[1].selStmt } case 345: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1916 +//line sql.y:1917 { yyVAL.statement = yyDollar[1].statement } case 346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1920 +//line sql.y:1921 { yyVAL.statement = yyDollar[1].statement } case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1924 +//line sql.y:1925 { yyVAL.statement = yyDollar[1].statement } case 348: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1929 +//line sql.y:1930 { yyVAL.str = "" } case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1933 +//line sql.y:1934 { yyVAL.str = "" } case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1937 +//line sql.y:1938 { yyVAL.str = "" } case 351: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1943 +//line sql.y:1944 { yyVAL.statement = &OtherRead{} } case 352: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1947 +//line sql.y:1948 { yyVAL.statement = &Explain{Type: yyDollar[2].str, Statement: yyDollar[3].statement} } case 353: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1953 +//line sql.y:1954 { yyVAL.statement = &OtherAdmin{} } case 354: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1957 +//line sql.y:1958 { yyVAL.statement = &OtherAdmin{} } case 355: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1961 +//line sql.y:1962 { yyVAL.statement = &OtherAdmin{} } case 356: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1965 +//line sql.y:1966 { yyVAL.statement = &OtherAdmin{} } case 357: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1971 +//line sql.y:1972 { yyVAL.statement = &DDL{Action: FlushStr} } case 358: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1975 +//line sql.y:1976 { setAllowComments(yylex, true) } case 359: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1979 +//line sql.y:1980 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } case 360: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1985 +//line sql.y:1986 { yyVAL.bytes2 = nil } case 361: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1989 +//line sql.y:1990 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } case 362: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1995 +//line sql.y:1996 { yyVAL.str = UnionStr } case 363: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1999 +//line sql.y:2000 { yyVAL.str = UnionAllStr } case 364: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2003 +//line sql.y:2004 { yyVAL.str = UnionDistinctStr } case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2008 +//line sql.y:2009 { yyVAL.str = "" } case 366: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2012 +//line sql.y:2013 { yyVAL.str = SQLNoCacheStr } case 367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2016 +//line sql.y:2017 { yyVAL.str = SQLCacheStr } case 368: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2021 +//line sql.y:2022 { yyVAL.str = "" } case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2025 +//line sql.y:2026 { yyVAL.str = DistinctStr } case 370: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2029 +//line sql.y:2030 { yyVAL.str = DistinctStr } case 371: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2034 +//line sql.y:2035 { yyVAL.selectExprs = nil } case 372: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2038 +//line sql.y:2039 { yyVAL.selectExprs = yyDollar[1].selectExprs } case 373: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2043 +//line sql.y:2044 { yyVAL.strs = nil } case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2047 +//line sql.y:2048 { yyVAL.strs = []string{yyDollar[1].str} } case 375: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2051 +//line sql.y:2052 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } case 376: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2055 +//line sql.y:2056 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } case 377: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2059 +//line sql.y:2060 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } case 378: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2065 +//line sql.y:2066 { yyVAL.str = SQLNoCacheStr } case 379: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2069 +//line sql.y:2070 { yyVAL.str = SQLCacheStr } case 380: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2073 +//line sql.y:2074 { yyVAL.str = DistinctStr } case 381: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2077 +//line sql.y:2078 { yyVAL.str = DistinctStr } case 382: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2081 +//line sql.y:2082 { yyVAL.str = StraightJoinHint } case 383: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2085 +//line sql.y:2086 { yyVAL.str = SQLCalcFoundRowsStr } case 384: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2091 +//line sql.y:2092 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } case 385: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2095 +//line sql.y:2096 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } case 386: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2101 +//line sql.y:2102 { yyVAL.selectExpr = &StarExpr{} } case 387: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2105 +//line sql.y:2106 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } case 388: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2109 +//line sql.y:2110 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } case 389: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2113 +//line sql.y:2114 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } case 390: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2118 +//line sql.y:2119 { yyVAL.colIdent = ColIdent{} } case 391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2122 +//line sql.y:2123 { yyVAL.colIdent = yyDollar[1].colIdent } case 392: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2126 +//line sql.y:2127 { yyVAL.colIdent = yyDollar[2].colIdent } case 394: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2133 +//line sql.y:2134 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 395: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2138 +//line sql.y:2139 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } case 396: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2142 +//line sql.y:2143 { yyVAL.tableExprs = yyDollar[2].tableExprs } case 397: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2148 +//line sql.y:2149 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } case 398: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2152 +//line sql.y:2153 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } case 401: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2162 +//line sql.y:2163 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } case 402: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2166 +//line sql.y:2167 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 403: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2170 +//line sql.y:2171 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 404: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2176 +//line sql.y:2177 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 405: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2182 +//line sql.y:2183 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } case 406: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2186 +//line sql.y:2187 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } case 407: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2192 +//line sql.y:2193 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 408: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2196 +//line sql.y:2197 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 409: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2202 +//line sql.y:2203 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } case 410: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2206 +//line sql.y:2207 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } case 411: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2219 +//line sql.y:2220 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 412: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2223 +//line sql.y:2224 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 413: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2227 +//line sql.y:2228 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 414: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2231 +//line sql.y:2232 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].str, RightExpr: yyDollar[3].tableExpr} } case 415: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2237 +//line sql.y:2238 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 416: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2239 +//line sql.y:2240 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } case 417: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2243 +//line sql.y:2244 { yyVAL.joinCondition = JoinCondition{} } case 418: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2245 +//line sql.y:2246 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 419: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2249 +//line sql.y:2250 { yyVAL.joinCondition = JoinCondition{} } case 420: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2251 +//line sql.y:2252 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 421: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2254 +//line sql.y:2255 { yyVAL.empty = struct{}{} } case 422: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2256 +//line sql.y:2257 { yyVAL.empty = struct{}{} } case 423: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2259 +//line sql.y:2260 { yyVAL.tableIdent = NewTableIdent("") } case 424: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2263 +//line sql.y:2264 { yyVAL.tableIdent = yyDollar[1].tableIdent } case 425: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2267 +//line sql.y:2268 { yyVAL.tableIdent = yyDollar[2].tableIdent } case 427: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2274 +//line sql.y:2275 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 428: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2280 +//line sql.y:2281 { yyVAL.str = JoinStr } case 429: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2284 +//line sql.y:2285 { yyVAL.str = JoinStr } case 430: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2288 +//line sql.y:2289 { yyVAL.str = JoinStr } case 431: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2294 +//line sql.y:2295 { yyVAL.str = StraightJoinStr } case 432: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2300 +//line sql.y:2301 { yyVAL.str = LeftJoinStr } case 433: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2304 +//line sql.y:2305 { yyVAL.str = LeftJoinStr } case 434: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2308 +//line sql.y:2309 { yyVAL.str = RightJoinStr } case 435: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2312 +//line sql.y:2313 { yyVAL.str = RightJoinStr } case 436: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2318 +//line sql.y:2319 { yyVAL.str = NaturalJoinStr } case 437: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2322 +//line sql.y:2323 { if yyDollar[2].str == LeftJoinStr { yyVAL.str = NaturalLeftJoinStr @@ -6197,481 +6250,487 @@ yydefault: } case 438: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2332 +//line sql.y:2333 { yyVAL.tableName = yyDollar[2].tableName } case 439: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2336 +//line sql.y:2337 { yyVAL.tableName = yyDollar[1].tableName } case 440: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2342 +//line sql.y:2343 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 441: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2346 +//line sql.y:2347 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2352 +//line sql.y:2353 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 443: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2357 +//line sql.y:2358 { yyVAL.indexHints = nil } case 444: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2361 +//line sql.y:2362 { yyVAL.indexHints = &IndexHints{Type: UseStr, Indexes: yyDollar[4].columns} } case 445: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2365 +//line sql.y:2366 { yyVAL.indexHints = &IndexHints{Type: UseStr} } case 446: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2369 +//line sql.y:2370 { yyVAL.indexHints = &IndexHints{Type: IgnoreStr, Indexes: yyDollar[4].columns} } case 447: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2373 +//line sql.y:2374 { yyVAL.indexHints = &IndexHints{Type: ForceStr, Indexes: yyDollar[4].columns} } case 448: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2378 +//line sql.y:2379 { yyVAL.expr = nil } case 449: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2382 +//line sql.y:2383 { yyVAL.expr = yyDollar[2].expr } case 450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2388 +//line sql.y:2389 { yyVAL.expr = yyDollar[1].expr } case 451: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2392 +//line sql.y:2393 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 452: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2396 +//line sql.y:2397 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 453: + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:2401 + { + yyVAL.expr = &XorExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} + } + case 454: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2400 +//line sql.y:2405 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } - case 454: + case 455: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2404 +//line sql.y:2409 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].str, Expr: yyDollar[1].expr} } - case 455: + case 456: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2408 +//line sql.y:2413 { yyVAL.expr = yyDollar[1].expr } - case 456: + case 457: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2412 +//line sql.y:2417 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } - case 457: + case 458: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2418 +//line sql.y:2423 { yyVAL.str = "" } - case 458: + case 459: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2422 +//line sql.y:2427 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 459: + case 460: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2428 +//line sql.y:2433 { yyVAL.boolVal = BoolVal(true) } - case 460: + case 461: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2432 +//line sql.y:2437 { yyVAL.boolVal = BoolVal(false) } - case 461: + case 462: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2438 +//line sql.y:2443 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].str, Right: yyDollar[3].expr} } - case 462: + case 463: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2442 +//line sql.y:2447 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InStr, Right: yyDollar[3].colTuple} } - case 463: + case 464: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2446 +//line sql.y:2451 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInStr, Right: yyDollar[4].colTuple} } - case 464: + case 465: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2450 +//line sql.y:2455 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeStr, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } - case 465: + case 466: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2454 +//line sql.y:2459 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeStr, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } - case 466: + case 467: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2458 +//line sql.y:2463 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpStr, Right: yyDollar[3].expr} } - case 467: + case 468: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2462 +//line sql.y:2467 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpStr, Right: yyDollar[4].expr} } - case 468: + case 469: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2466 +//line sql.y:2471 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenStr, From: yyDollar[3].expr, To: yyDollar[5].expr} } - case 469: + case 470: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2470 +//line sql.y:2475 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenStr, From: yyDollar[4].expr, To: yyDollar[6].expr} } - case 470: + case 471: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2474 +//line sql.y:2479 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } - case 471: + case 472: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2480 +//line sql.y:2485 { yyVAL.str = IsNullStr } - case 472: + case 473: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2484 +//line sql.y:2489 { yyVAL.str = IsNotNullStr } - case 473: + case 474: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2488 +//line sql.y:2493 { yyVAL.str = IsTrueStr } - case 474: + case 475: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2492 +//line sql.y:2497 { yyVAL.str = IsNotTrueStr } - case 475: + case 476: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2496 +//line sql.y:2501 { yyVAL.str = IsFalseStr } - case 476: + case 477: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2500 +//line sql.y:2505 { yyVAL.str = IsNotFalseStr } - case 477: + case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2506 +//line sql.y:2511 { yyVAL.str = EqualStr } - case 478: + case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2510 +//line sql.y:2515 { yyVAL.str = LessThanStr } - case 479: + case 480: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2514 +//line sql.y:2519 { yyVAL.str = GreaterThanStr } - case 480: + case 481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2518 +//line sql.y:2523 { yyVAL.str = LessEqualStr } - case 481: + case 482: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2522 +//line sql.y:2527 { yyVAL.str = GreaterEqualStr } - case 482: + case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2526 +//line sql.y:2531 { yyVAL.str = NotEqualStr } - case 483: + case 484: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2530 +//line sql.y:2535 { yyVAL.str = NullSafeEqualStr } - case 484: + case 485: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2535 +//line sql.y:2540 { yyVAL.expr = nil } - case 485: + case 486: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2539 +//line sql.y:2544 { yyVAL.expr = yyDollar[2].expr } - case 486: + case 487: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2545 +//line sql.y:2550 { yyVAL.colTuple = yyDollar[1].valTuple } - case 487: + case 488: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2549 +//line sql.y:2554 { yyVAL.colTuple = yyDollar[1].subquery } - case 488: + case 489: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2553 +//line sql.y:2558 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } - case 489: + case 490: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2559 +//line sql.y:2564 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } - case 490: + case 491: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2565 +//line sql.y:2570 { yyVAL.exprs = Exprs{yyDollar[1].expr} } - case 491: + case 492: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2569 +//line sql.y:2574 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } - case 492: + case 493: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2575 +//line sql.y:2580 { yyVAL.expr = yyDollar[1].expr } - case 493: + case 494: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2579 +//line sql.y:2584 { yyVAL.expr = yyDollar[1].boolVal } - case 494: + case 495: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2583 +//line sql.y:2588 { yyVAL.expr = yyDollar[1].colName } - case 495: + case 496: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2587 +//line sql.y:2592 { yyVAL.expr = yyDollar[1].expr } - case 496: + case 497: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2591 +//line sql.y:2596 { yyVAL.expr = yyDollar[1].subquery } - case 497: + case 498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2595 +//line sql.y:2600 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndStr, Right: yyDollar[3].expr} } - case 498: + case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2599 +//line sql.y:2604 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrStr, Right: yyDollar[3].expr} } - case 499: + case 500: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2603 +//line sql.y:2608 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorStr, Right: yyDollar[3].expr} } - case 500: + case 501: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2607 +//line sql.y:2612 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusStr, Right: yyDollar[3].expr} } - case 501: + case 502: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2611 +//line sql.y:2616 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusStr, Right: yyDollar[3].expr} } - case 502: + case 503: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2615 +//line sql.y:2620 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultStr, Right: yyDollar[3].expr} } - case 503: + case 504: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2619 +//line sql.y:2624 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivStr, Right: yyDollar[3].expr} } - case 504: + case 505: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2623 +//line sql.y:2628 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivStr, Right: yyDollar[3].expr} } - case 505: + case 506: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2627 +//line sql.y:2632 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 506: + case 507: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2631 +//line sql.y:2636 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModStr, Right: yyDollar[3].expr} } - case 507: + case 508: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2635 +//line sql.y:2640 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftStr, Right: yyDollar[3].expr} } - case 508: + case 509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2639 +//line sql.y:2644 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightStr, Right: yyDollar[3].expr} } - case 509: + case 510: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2643 +//line sql.y:2648 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } - case 510: + case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2647 +//line sql.y:2652 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } - case 511: + case 512: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2651 +//line sql.y:2656 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } - case 512: + case 513: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2655 +//line sql.y:2660 { yyVAL.expr = &UnaryExpr{Operator: BinaryStr, Expr: yyDollar[2].expr} } - case 513: + case 514: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2659 +//line sql.y:2664 { yyVAL.expr = &UnaryExpr{Operator: UBinaryStr, Expr: yyDollar[2].expr} } - case 514: + case 515: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2663 +//line sql.y:2668 { yyVAL.expr = &UnaryExpr{Operator: Utf8Str, Expr: yyDollar[2].expr} } - case 515: + case 516: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2667 +//line sql.y:2672 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Str, Expr: yyDollar[2].expr} } - case 516: + case 517: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2671 +//line sql.y:2676 { yyVAL.expr = &UnaryExpr{Operator: Latin1Str, Expr: yyDollar[2].expr} } - case 517: + case 518: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2675 +//line sql.y:2680 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6679,9 +6738,9 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UPlusStr, Expr: yyDollar[2].expr} } } - case 518: + case 519: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2683 +//line sql.y:2688 { if num, ok := yyDollar[2].expr.(*SQLVal); ok && num.Type == IntVal { // Handle double negative @@ -6695,21 +6754,21 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UMinusStr, Expr: yyDollar[2].expr} } } - case 519: + case 520: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2697 +//line sql.y:2702 { yyVAL.expr = &UnaryExpr{Operator: TildaStr, Expr: yyDollar[2].expr} } - case 520: + case 521: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2701 +//line sql.y:2706 { yyVAL.expr = &UnaryExpr{Operator: BangStr, Expr: yyDollar[2].expr} } - case 521: + case 522: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2705 +//line sql.y:2710 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6717,497 +6776,497 @@ yydefault: // will be non-trivial because of grammar conflicts. yyVAL.expr = &IntervalExpr{Expr: yyDollar[2].expr, Unit: yyDollar[3].colIdent.String()} } - case 526: + case 527: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2723 +//line sql.y:2728 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } - case 527: + case 528: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2727 +//line sql.y:2732 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 528: + case 529: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2731 +//line sql.y:2736 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 529: + case 530: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2735 +//line sql.y:2740 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } - case 530: + case 531: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2745 +//line sql.y:2750 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } - case 531: + case 532: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2749 +//line sql.y:2754 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } - case 532: + case 533: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2753 +//line sql.y:2758 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 533: + case 534: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2757 +//line sql.y:2762 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 534: + case 535: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2761 +//line sql.y:2766 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } - case 535: + case 536: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2765 +//line sql.y:2770 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 536: + case 537: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2769 +//line sql.y:2774 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 537: + case 538: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2773 +//line sql.y:2778 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 538: + case 539: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2777 +//line sql.y:2782 { yyVAL.expr = &SubstrExpr{StrVal: NewStrVal(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 539: + case 540: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:2781 +//line sql.y:2786 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].str} } - case 540: + case 541: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2785 +//line sql.y:2790 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].str, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } - case 541: + case 542: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2789 +//line sql.y:2794 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } - case 542: + case 543: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2793 +//line sql.y:2798 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } - case 543: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2803 - { - yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} - } case 544: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2807 +//line sql.y:2808 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } case 545: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2811 +//line sql.y:2812 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } case 546: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2816 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } case 547: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2821 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } case 548: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2826 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } case 549: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2832 +//line sql.y:2831 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } case 550: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2837 { - yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} + yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } case 551: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2842 { - yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} + yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } case 552: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2846 +//line sql.y:2847 { - yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} + yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } case 553: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2850 +//line sql.y:2851 { - yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} + yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } case 554: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2855 { - yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} + yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } case 555: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2860 { - yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} + yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } case 556: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2865 { - yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} + yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } case 557: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2870 + { + yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} + } + case 558: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2869 +//line sql.y:2874 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 558: + case 559: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2873 +//line sql.y:2878 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 561: + case 562: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2883 +//line sql.y:2888 { yyVAL.expr = yyDollar[2].expr } - case 562: + case 563: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2893 +//line sql.y:2898 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } - case 563: + case 564: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2897 +//line sql.y:2902 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } - case 564: + case 565: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2901 +//line sql.y:2906 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } - case 565: + case 566: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2905 +//line sql.y:2910 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } - case 566: + case 567: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2909 +//line sql.y:2914 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } - case 567: + case 568: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2913 +//line sql.y:2918 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 568: + case 569: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2917 +//line sql.y:2922 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 569: + case 570: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2923 +//line sql.y:2928 { yyVAL.str = "" } - case 570: + case 571: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2927 +//line sql.y:2932 { yyVAL.str = BooleanModeStr } - case 571: + case 572: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2931 +//line sql.y:2936 { yyVAL.str = NaturalLanguageModeStr } - case 572: + case 573: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2935 +//line sql.y:2940 { yyVAL.str = NaturalLanguageModeWithQueryExpansionStr } - case 573: + case 574: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2939 +//line sql.y:2944 { yyVAL.str = QueryExpansionStr } - case 574: + case 575: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2945 +//line sql.y:2950 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 575: + case 576: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2949 +//line sql.y:2954 { yyVAL.str = string(yyDollar[1].bytes) } - case 576: + case 577: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2955 +//line sql.y:2960 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 577: + case 578: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2959 +//line sql.y:2964 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: yyDollar[3].str, Operator: CharacterSetStr} } - case 578: + case 579: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2963 +//line sql.y:2968 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal, Charset: string(yyDollar[3].colIdent.String())} } - case 579: + case 580: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2967 +//line sql.y:2972 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 580: + case 581: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2971 +//line sql.y:2976 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 581: + case 582: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2975 +//line sql.y:2980 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.convertType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 582: + case 583: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2981 +//line sql.y:2986 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 583: + case 584: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2985 +//line sql.y:2990 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 584: + case 585: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2989 +//line sql.y:2994 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 585: + case 586: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2993 +//line sql.y:2998 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 586: + case 587: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2997 +//line sql.y:3002 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].sqlVal} } - case 587: + case 588: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3001 +//line sql.y:3006 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 588: + case 589: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3005 +//line sql.y:3010 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 589: + case 590: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3010 +//line sql.y:3015 { yyVAL.expr = nil } - case 590: + case 591: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3014 +//line sql.y:3019 { yyVAL.expr = yyDollar[1].expr } - case 591: + case 592: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3019 +//line sql.y:3024 { yyVAL.str = string("") } - case 592: + case 593: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3023 +//line sql.y:3028 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } - case 593: + case 594: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3029 +//line sql.y:3034 { yyVAL.whens = []*When{yyDollar[1].when} } - case 594: + case 595: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3033 +//line sql.y:3038 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } - case 595: + case 596: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3039 +//line sql.y:3044 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } - case 596: + case 597: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3044 +//line sql.y:3049 { yyVAL.expr = nil } - case 597: + case 598: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3048 +//line sql.y:3053 { yyVAL.expr = yyDollar[2].expr } - case 598: + case 599: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3054 +//line sql.y:3059 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } - case 599: + case 600: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3058 +//line sql.y:3063 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } - case 600: + case 601: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3062 +//line sql.y:3067 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } - case 601: + case 602: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3068 +//line sql.y:3073 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 602: + case 603: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3072 +//line sql.y:3077 { yyVAL.expr = NewHexVal(yyDollar[1].bytes) } - case 603: + case 604: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3076 +//line sql.y:3081 { yyVAL.expr = NewBitVal(yyDollar[1].bytes) } - case 604: + case 605: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3080 +//line sql.y:3085 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 605: + case 606: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3084 +//line sql.y:3089 { yyVAL.expr = NewFloatVal(yyDollar[1].bytes) } - case 606: + case 607: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3088 +//line sql.y:3093 { yyVAL.expr = NewHexNum(yyDollar[1].bytes) } - case 607: + case 608: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3092 +//line sql.y:3097 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 608: + case 609: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3096 +//line sql.y:3101 { yyVAL.expr = &NullVal{} } - case 609: + case 610: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3102 +//line sql.y:3107 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7216,225 +7275,225 @@ yydefault: } yyVAL.expr = NewIntVal([]byte("1")) } - case 610: + case 611: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3111 +//line sql.y:3116 { yyVAL.expr = NewIntVal(yyDollar[1].bytes) } - case 611: + case 612: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3115 +//line sql.y:3120 { yyVAL.expr = NewValArg(yyDollar[1].bytes) } - case 612: + case 613: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3120 +//line sql.y:3125 { yyVAL.exprs = nil } - case 613: + case 614: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3124 +//line sql.y:3129 { yyVAL.exprs = yyDollar[3].exprs } - case 614: + case 615: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3129 +//line sql.y:3134 { yyVAL.expr = nil } - case 615: + case 616: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3133 +//line sql.y:3138 { yyVAL.expr = yyDollar[2].expr } - case 616: + case 617: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3138 +//line sql.y:3143 { yyVAL.orderBy = nil } - case 617: + case 618: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3142 +//line sql.y:3147 { yyVAL.orderBy = yyDollar[3].orderBy } - case 618: + case 619: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3148 +//line sql.y:3153 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } - case 619: + case 620: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3152 +//line sql.y:3157 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } - case 620: + case 621: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3158 +//line sql.y:3163 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].str} } - case 621: + case 622: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3163 +//line sql.y:3168 { yyVAL.str = AscScr } - case 622: + case 623: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3167 +//line sql.y:3172 { yyVAL.str = AscScr } - case 623: + case 624: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3171 +//line sql.y:3176 { yyVAL.str = DescScr } - case 624: + case 625: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3176 +//line sql.y:3181 { yyVAL.limit = nil } - case 625: + case 626: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3180 +//line sql.y:3185 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } - case 626: + case 627: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3184 +//line sql.y:3189 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } - case 627: + case 628: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3188 +//line sql.y:3193 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } - case 628: + case 629: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3193 +//line sql.y:3198 { yyVAL.str = "" } - case 629: + case 630: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3197 +//line sql.y:3202 { yyVAL.str = ForUpdateStr } - case 630: + case 631: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3201 +//line sql.y:3206 { yyVAL.str = ShareModeStr } - case 631: + case 632: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3214 +//line sql.y:3219 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 632: + case 633: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3218 +//line sql.y:3223 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 633: + case 634: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3222 +//line sql.y:3227 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 634: + case 635: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3226 +//line sql.y:3231 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 635: + case 636: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3232 +//line sql.y:3237 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 636: + case 637: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3236 +//line sql.y:3241 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 637: + case 638: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3240 +//line sql.y:3245 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 638: + case 639: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3244 +//line sql.y:3249 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 639: + case 640: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3249 +//line sql.y:3254 { yyVAL.updateExprs = nil } - case 640: + case 641: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3253 +//line sql.y:3258 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 641: + case 642: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3259 +//line sql.y:3264 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 642: + case 643: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3263 +//line sql.y:3268 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 643: + case 644: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3269 +//line sql.y:3274 { yyVAL.valTuple = yyDollar[1].valTuple } - case 644: + case 645: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3273 +//line sql.y:3278 { yyVAL.valTuple = ValTuple{} } - case 645: + case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3279 +//line sql.y:3284 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 646: + case 647: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3285 +//line sql.y:3290 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7442,319 +7501,319 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 647: + case 648: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3295 +//line sql.y:3300 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 648: + case 649: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3299 +//line sql.y:3304 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 649: + case 650: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3305 +//line sql.y:3310 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 650: + case 651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3311 +//line sql.y:3316 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 651: + case 652: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3315 +//line sql.y:3320 { yyDollar[2].setExpr.Scope = yyDollar[1].str yyVAL.setExprs = SetExprs{yyDollar[2].setExpr} } - case 652: + case 653: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3320 +//line sql.y:3325 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 653: + case 654: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3326 +//line sql.y:3331 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("on"))} } - case 654: + case 655: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3330 +//line sql.y:3335 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: NewStrVal([]byte("off"))} } - case 655: + case 656: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3334 +//line sql.y:3339 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Expr: yyDollar[3].expr} } - case 656: + case 657: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3338 +//line sql.y:3343 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Expr: yyDollar[2].expr} } - case 658: + case 659: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3345 +//line sql.y:3350 { yyVAL.bytes = []byte("charset") } - case 660: + case 661: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3352 +//line sql.y:3357 { yyVAL.expr = NewStrVal([]byte(yyDollar[1].colIdent.String())) } - case 661: + case 662: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3356 +//line sql.y:3361 { yyVAL.expr = NewStrVal(yyDollar[1].bytes) } - case 662: + case 663: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3360 +//line sql.y:3365 { yyVAL.expr = &Default{} } - case 665: + case 666: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3369 +//line sql.y:3374 { yyVAL.byt = 0 } - case 666: + case 667: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3371 +//line sql.y:3376 { yyVAL.byt = 1 } - case 667: + case 668: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3374 +//line sql.y:3379 { yyVAL.empty = struct{}{} } - case 668: + case 669: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3376 +//line sql.y:3381 { yyVAL.empty = struct{}{} } - case 669: + case 670: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3379 +//line sql.y:3384 { yyVAL.str = "" } - case 670: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3381 - { - yyVAL.str = IgnoreStr - } case 671: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3385 +//line sql.y:3386 { - yyVAL.empty = struct{}{} + yyVAL.str = IgnoreStr } case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3387 +//line sql.y:3390 { yyVAL.empty = struct{}{} } case 673: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3389 +//line sql.y:3392 { yyVAL.empty = struct{}{} } case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3391 +//line sql.y:3394 { yyVAL.empty = struct{}{} } case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3393 +//line sql.y:3396 { yyVAL.empty = struct{}{} } case 676: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3395 +//line sql.y:3398 { yyVAL.empty = struct{}{} } case 677: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3397 +//line sql.y:3400 { yyVAL.empty = struct{}{} } case 678: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3399 +//line sql.y:3402 { yyVAL.empty = struct{}{} } case 679: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3401 +//line sql.y:3404 { yyVAL.empty = struct{}{} } case 680: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3403 +//line sql.y:3406 { yyVAL.empty = struct{}{} } case 681: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3406 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3408 { yyVAL.empty = struct{}{} } case 682: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3408 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3411 { yyVAL.empty = struct{}{} } case 683: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3410 +//line sql.y:3413 { yyVAL.empty = struct{}{} } case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3414 +//line sql.y:3415 { yyVAL.empty = struct{}{} } case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3416 +//line sql.y:3419 { yyVAL.empty = struct{}{} } case 686: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3419 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3421 { yyVAL.empty = struct{}{} } case 687: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3421 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3424 { yyVAL.empty = struct{}{} } case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3423 +//line sql.y:3426 { yyVAL.empty = struct{}{} } case 689: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3428 + { + yyVAL.empty = struct{}{} + } + case 690: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3426 +//line sql.y:3431 { yyVAL.colIdent = ColIdent{} } - case 690: + case 691: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3428 +//line sql.y:3433 { yyVAL.colIdent = yyDollar[2].colIdent } - case 691: + case 692: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3432 +//line sql.y:3437 { yyVAL.colIdent = yyDollar[1].colIdent } - case 692: + case 693: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3436 +//line sql.y:3441 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 694: + case 695: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3443 +//line sql.y:3448 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 695: + case 696: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3449 +//line sql.y:3454 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 696: + case 697: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3453 +//line sql.y:3458 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 698: + case 699: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3460 +//line sql.y:3465 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 989: + case 991: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3776 +//line sql.y:3782 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 990: + case 992: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3785 +//line sql.y:3791 { decNesting(yylex) } - case 991: + case 993: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3790 +//line sql.y:3796 { skipToEnd(yylex) } - case 992: + case 994: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3795 +//line sql.y:3801 { skipToEnd(yylex) } - case 993: + case 995: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3799 +//line sql.y:3805 { skipToEnd(yylex) } - case 994: + case 996: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3803 +//line sql.y:3809 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 4dd0a181838..bc1c6f88138 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -139,6 +139,7 @@ func skipToEnd(yylex interface{}) { // support all operators yet. // * NOTE: If you change anything here, update precedence.go as well * %left OR +%left XOR %left AND %right NOT '!' %left BETWEEN CASE WHEN THEN ELSE END @@ -2396,6 +2397,10 @@ expression: { $$ = &OrExpr{Left: $1, Right: $3} } +| expression XOR expression + { + $$ = &XorExpr{Left: $1, Right: $3} + } | NOT expression { $$ = &NotExpr{Expr: $2} @@ -3589,6 +3594,7 @@ reserved_keyword: | WHEN | WHERE | WINDOW +| XOR /* These are non-reserved Vitess, because they don't cause conflicts in the grammar. diff --git a/go/vt/sqlparser/token.go b/go/vt/sqlparser/token.go index 2456a9617e6..f891fb151db 100644 --- a/go/vt/sqlparser/token.go +++ b/go/vt/sqlparser/token.go @@ -410,7 +410,7 @@ var keywords = map[string]int{ "with": WITH, "work": WORK, "write": WRITE, - "xor": UNUSED, + "xor": XOR, "year": YEAR, "year_month": UNUSED, "zerofill": ZEROFILL, From bfe7cb332b0e2f7d867807a36304ccd869b797e4 Mon Sep 17 00:00:00 2001 From: Serry Park Date: Wed, 24 Jun 2020 17:03:20 -0700 Subject: [PATCH 088/430] fix unit test Signed-off-by: Serry Park --- go/vt/vtgate/executor_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index f018d8e840e..f28e7276caa 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -1883,7 +1883,6 @@ func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { session := NewSafeSession(&vtgatepb.Session{TargetString: "@master"}) warningCount := warnings.Counts()["WarnPayloadSizeExceeded"] testMaxPayloadSizeExceeded := []string{ - "select * from main1", "select * from main1", "insert into main1(id) values (1), (2)", "update main1 set id=1", @@ -1891,9 +1890,8 @@ func TestExecutorMaxPayloadSizeExceeded(t *testing.T) { } for _, query := range testMaxPayloadSizeExceeded { _, err := executor.Execute(context.Background(), "TestExecutorMaxPayloadSizeExceeded", session, query, nil) - if err == nil { - assert.EqualError(t, err, "query payload size above threshold") - } + require.NotNil(t, err) + assert.EqualError(t, err, "query payload size above threshold") } assert.Equal(t, warningCount, warnings.Counts()["WarnPayloadSizeExceeded"], "warnings count") From bfc632f740b3c8f64973d4c1402f689331e77bb3 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 25 Jun 2020 10:37:19 +0300 Subject: [PATCH 089/430] functional setup Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- docker/mini/Dockerfile | 6 +- docker/mini/docker-entry | 105 ++++++++++++------ docker/mini/orchestrator-up.sh | 17 +-- .../mini/orchestrator-vitess-mini.conf.json | 2 +- docker/mini/run.sh | 58 ++++++++++ docker/mini/vtctld-mini-up.sh | 40 +++++++ docker/mini/vttablet-mini-up.sh | 16 ++- 7 files changed, 189 insertions(+), 55 deletions(-) create mode 100755 docker/mini/run.sh create mode 100755 docker/mini/vtctld-mini-up.sh diff --git a/docker/mini/Dockerfile b/docker/mini/Dockerfile index 1ba28648352..c603c2ecfd6 100644 --- a/docker/mini/Dockerfile +++ b/docker/mini/Dockerfile @@ -40,8 +40,11 @@ COPY docker/mini/systemctl.py /usr/bin/systemctl COPY docker/mini/docker-entry /vt/dist/docker/mini/docker-entry COPY examples/local/scripts /vt/dist/scripts COPY examples/local/env.sh /vt/dist/scripts/env.sh +COPY docker/mini/vtctld-mini-up.sh /vt/dist/scripts/vtctld-mini-up.sh COPY docker/mini/vttablet-mini-up.sh /vt/dist/scripts/vttablet-mini-up.sh COPY docker/mini/orchestrator-up.sh /vt/dist/scripts/orchestrator-up.sh +RUN echo "hostname=127.0.0.1" >> /vt/dist/scripts/env.sh +RUN cat /vt/dist/scripts/env.sh | egrep "^alias" >> /etc/bash.bashrc COPY --from=base /vt/bin/vtctl /vt/bin/ COPY --from=base /vt/bin/mysqlctl /vt/bin/ @@ -57,4 +60,5 @@ ENV TOPO="etcd" # Create mount point for actual data (e.g. MySQL data dir) VOLUME /vt/vtdataroot USER vitess -CMD /vt/dist/docker/mini/docker-entry ; /bin/bash +EXPOSE 15000-15200 16000-16200 +CMD /vt/dist/docker/mini/docker-entry && /bin/bash diff --git a/docker/mini/docker-entry b/docker/mini/docker-entry index 849941a6d03..4c3e3d909bc 100755 --- a/docker/mini/docker-entry +++ b/docker/mini/docker-entry @@ -18,7 +18,7 @@ # echo_sleep() { - SECONDS="$1" + local SECONDS="$1" for i in $(seq 1 $SECONDS) ; do echo -n "." sleep 1 @@ -26,72 +26,107 @@ echo_sleep() { echo } +echo_header() { + local HEADER="$1" + echo "" + echo "# $HEADER" +} + SCRIPTS_PATH="/vt/dist/scripts" export CELL=${CELL:-zone1} export $TOPOLOGY_USER export $TOPOLOGY_PASSWORD -echo "############################################################" -echo "vitess self resolve cluster" -echo "############################################################" -if [ -z "$MYSQL_SCHEMA" ] ; then +cat <<- "EOF" +============================================= + +| \/ (_)_ __ (_) \ / (_) |_ ___ ___ ___ +| |\/| | | '_ \| |\ \ / /| | __/ _ \/ __/ __| +| | | | | | | | | \ V / | | || __/\__ \__ \ +|_| |_|_|_| |_|_| \_/ |_|\__\___||___/___/ + +============================================= +EOF + +if [ -z "$MYSQL_SCHEMA" ] ; then echo "Expected MYSQL_SCHEMA environment variable" exit 1 fi +if [ -z "$TOPOLOGY_SERVER" ] ; then + echo "TOPOLOGY_SERVER environment variable not found. You must specify a MySQL server within your topology." + echo "This mini-vitess setup will attempt to discover your topology using that server and will bootstrap to match your topology" + exit 1 +fi +if [ -z "$TOPOLOGY_USER" ] ; then + echo "TOPOLOGY_USER environment variable not found. You must specify a MySQL username accessible to vitess." + exit 1 +fi +if [ -z "$TOPOLOGY_PASSWORD" ] ; then + echo "TOPOLOGY_PASSWORD environment variable not found. You must specify a MySQL password accessible to vitess." + exit 1 +fi + +echo "MiniVitess is starting up..." +echo "- Given MySQL topology server: $TOPOLOGY_SERVER" +echo "- Given MySQL schema: $MYSQL_SCHEMA" cd $SCRIPTS_PATH -. ./env.sh +source ./env.sh +echo_header "orchestrator" ./orchestrator-up.sh +echo "- orchestrator will meanwhile probe and map your MySQL replication topology" +echo_header "etcd" ./etcd-up.sh -# start vtctld -./vtctld-up.sh - -./vtgate-up.sh +echo_header "vtctld" +./vtctld-mini-up.sh -echo "Waiting gracefully for topology to be detected and analyzed" -echo_sleep 5 +echo_header "Waiting for topology to be detected and analyzed" +echo_sleep 15 -echo "vitess/orchestrator have detected the following MySQL servers:" +echo_header "orchestrator has detected the following MySQL servers:" orchestrator-client -c all-instances +echo_header "Bootstrapping vttablets for the above instances..." + BASE_TABLET_UID=100 for i in $(orchestrator-client -c all-instances) ; do read -r mysql_host mysql_port <<<$(echo $i | tr ':' ' ') - # TABLET_UID=$BASE_TABLET_UID ./scripts/mysqlctl-up.sh - tablet_port=$[15000 + $BASE_TABLET_UID] - KEYSPACE=$MYSQL_SCHEMA TABLET_UID=$BASE_TABLET_UID ./vttablet-mini-up.sh $mysql_host $mysql_port $tablet_port - echo "+ vttablet started" - tablet_alias="$(curl -s http://$(hostname):${tablet_port}/debug/vars | jq -r '.TabletAlias')" + is_master="" if [ "$i" == "$(orchestrator-client -c which-cluster-master -i "$i")" ] ; then - echo "setting vttablet as master" - echo vtctlclient -server "$(hostname):$vtctld_web_port" InitShardMaster -force "${MYSQL_SCHEMA}/0" "$tablet_alias" - echo "+ done" + is_master="true" fi + + KEYSPACE=$MYSQL_SCHEMA TABLET_UID=$BASE_TABLET_UID ./vttablet-mini-up.sh "$mysql_host" "$mysql_port" "$is_master" BASE_TABLET_UID=$((BASE_TABLET_UID + 1)) done +echo_header "vtgate" +./vtgate-up.sh -exit -# start vttablets for keyspace commerce -for i in 100 101 102; do - CELL=zone1 TABLET_UID=$i ./scripts/mysqlctl-up.sh - CELL=zone1 KEYSPACE=commerce TABLET_UID=$i ./scripts/vttablet-up.sh -done +echo_header "Setup complete" + +echo_header "Your topology is:" +orchestrator-client -c topology-tabulated -i ${TOPOLOGY_SERVER} | tr '|' ' ' + +echo_header "vtgate is listening for MySQL connection on port 15306" + +echo_header "On this container, try running any of the following commands:" +echo " mysql ${MYSQL_SCHEMA} -e 'show tables'" +echo " mysql ${MYSQL_SCHEMA}@master -e 'select @@hostname, @@port'" +echo " mysql ${MYSQL_SCHEMA}@replica -e 'select @@hostname, @@port'" -# set one of the replicas to master -vtctlclient InitShardMaster -force commerce/0 zone1-100 +echo_header "Outside this container, try running any of the following commands:" +echo " mysql -h $(hostname) --port=15306 ${MYSQL_SCHEMA} -e 'show tables'" +echo " mysql -h $(hostname) --port=15306 ${MYSQL_SCHEMA}@master -e 'select @@hostname, @@port'" +echo " mysql -h $(hostname) --port=15306 ${MYSQL_SCHEMA}@replica -e 'select @@hostname, @@port'" -# create the schema -vtctlclient ApplySchema -sql-file create_commerce_schema.sql commerce +echo_header "Ready" -# create the vschema -vtctlclient ApplyVSchema -vschema_file vschema_commerce_initial.json commerce +echo "" -# start vtgate -CELL=zone1 ./scripts/vtgate-up.sh diff --git a/docker/mini/orchestrator-up.sh b/docker/mini/orchestrator-up.sh index 170a0133a1f..6e4ff486fad 100755 --- a/docker/mini/orchestrator-up.sh +++ b/docker/mini/orchestrator-up.sh @@ -2,20 +2,7 @@ source ./env.sh -if [ -z "$TOPOLOGY_SERVER" ] ; then - echo "TOPOLOGY_SERVER environment variable not found. You must specify a MySQL server within your topology." - echo "This mini-vitess setup will attempt to discover your topology using that server and will bootstrap to match your topology" - exit 1 -fi -if [ -z "$TOPOLOGY_USER" ] ; then - echo "TOPOLOGY_USER environment variable not found. You must specify a MySQL username accessible to vitess." - exit 1 -fi -if [ -z "$TOPOLOGY_PASSWORD" ] ; then - echo "TOPOLOGY_PASSWORD environment variable not found. You must specify a MySQL password accessible to vitess." - exit 1 -fi - +echo "- Configuring orchestrator with given topology server and credentials..." cp /etc/orchestrator.conf.json /tmp/ sed -i /tmp/orchestrator.conf.json -e "s/DISCOVERY_SEED_PLACEHOLDER/$TOPOLOGY_SERVER/g" sed -i /tmp/orchestrator.conf.json -e "s/MYSQL_TOPOLOGY_USER_PLACEHOLDER/$TOPOLOGY_USER/g" @@ -26,7 +13,7 @@ rm /tmp/orchestrator.conf.json ORCHESTRATOR_LOG="${VTDATAROOT}/tmp/orchestrator.out" -echo "Starting orchestrator... Logfile is $ORCHESTRATOR_LOG" +echo "- Starting orchestrator... Logfile is $ORCHESTRATOR_LOG" cd /usr/local/orchestrator ./orchestrator http > $ORCHESTRATOR_LOG 2>&1 & diff --git a/docker/mini/orchestrator-vitess-mini.conf.json b/docker/mini/orchestrator-vitess-mini.conf.json index 1da16b94160..352b22e3121 100644 --- a/docker/mini/orchestrator-vitess-mini.conf.json +++ b/docker/mini/orchestrator-vitess-mini.conf.json @@ -11,7 +11,7 @@ "DiscoverByShowSlaveHosts": true, "InstancePollSeconds": 1, "HostnameResolveMethod": "none", - "MySQLHostnameResolveMethod": "", + "MySQLHostnameResolveMethod": "@@report_host", "SkipBinlogServerUnresolveCheck": true, "ExpiryHostnameResolvesMinutes": 60, "VerifyReplicationFilters": false, diff --git a/docker/mini/run.sh b/docker/mini/run.sh new file mode 100755 index 00000000000..860df0bab3a --- /dev/null +++ b/docker/mini/run.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# +# Run a MiniVitess docker image, with details and credentials for a MySQL replication topology +# + +TOPOLOGY_SERVER="" +MYSQL_SCHEMA="" +TOPOLOGY_USER="" +TOPOLOGY_PASSWORD="" + +help() { +cat <<- "EOF" +Usage: + docker/mini/run.sh + +Mandatory options: + -s : in hostname[:port] format; a single MySQL server in your replication + topology from which MiniVitess will discover your entire topology + -d : database/schema name on your MySQL server. A single schema is supported. + -u : MySQL username with enough privileges for Vitess to run DML, and for + orchestrator to probe replication + -p : password for given user +EOF + exit 1 +} + +error_help() { + local message="$1" + echo "ERROR: $message" + help +} + +while getopts "s:d:u:p:h" OPTION +do + case $OPTION in + h) help ;; + s) TOPOLOGY_SERVER="$OPTARG" ;; + d) MYSQL_SCHEMA="$OPTARG" ;; + u) TOPOLOGY_USER="$OPTARG" ;; + p) TOPOLOGY_PASSWORD="$OPTARG" ;; + *) help ;; + esac +done + +if [ -z "$TOPOLOGY_SERVER" ] ; then + error_help "Expected topology server" +fi +if [ -z "$MYSQL_SCHEMA" ] ; then + error_help "Expected MySQL schema/database name" +fi +if [ -z "$TOPOLOGY_USER" ] ; then + error_help "Expected MySQL user" +fi +if [ -z "$TOPOLOGY_PASSWORD" ] ; then + error_help "Expected MySQL password" +fi + +docker run --rm -it -p 3000:3000 -p 15000:15000 -p 15001:15001 -e "TOPOLOGY_SERVER=$TOPOLOGY_SERVER" -e "TOPOLOGY_USER=$TOPOLOGY_USER" -e "TOPOLOGY_PASSWORD=$TOPOLOGY_PASSWORD" -e "MYSQL_SCHEMA=$MYSQL_SCHEMA" --network=host vitess/mini:latest diff --git a/docker/mini/vtctld-mini-up.sh b/docker/mini/vtctld-mini-up.sh new file mode 100755 index 00000000000..9d318949970 --- /dev/null +++ b/docker/mini/vtctld-mini-up.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Copyright 2019 The Vitess Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This is an example script that starts vtctld. + +source ./env.sh + +cell=${CELL:-'test'} +grpc_port=15999 + +echo "- Starting vtctld..." +# shellcheck disable=SC2086 +vtctld \ + $TOPOLOGY_FLAGS \ + --disable_active_reparents \ + -cell $cell \ + -workflow_manager_init \ + -workflow_manager_use_election \ + -service_map 'grpc-vtctl' \ + -backup_storage_implementation file \ + -file_backup_storage_root $VTDATAROOT/backups \ + -log_dir $VTDATAROOT/tmp \ + -port $vtctld_web_port \ + -grpc_port $grpc_port \ + -pid_file $VTDATAROOT/tmp/vtctld.pid \ + > $VTDATAROOT/tmp/vtctld.out 2>&1 & +echo "+ started" diff --git a/docker/mini/vttablet-mini-up.sh b/docker/mini/vttablet-mini-up.sh index e59e9d7115d..030a076bf40 100755 --- a/docker/mini/vttablet-mini-up.sh +++ b/docker/mini/vttablet-mini-up.sh @@ -16,7 +16,7 @@ mysql_host="$1" mysql_port="$2" -tablet_port="$3" +is_master="$3" source ./env.sh @@ -24,7 +24,7 @@ cell=${CELL:-'test'} keyspace=${KEYSPACE:-'test_keyspace'} shard=${SHARD:-'0'} uid=$TABLET_UID -port=$tablet_port +port=$[15000 + $TABLET_UID] grpc_port=$[16000 + $uid] printf -v alias '%s-%010d' $cell $uid printf -v tablet_dir 'vt_%010d' $uid @@ -35,7 +35,9 @@ mkdir -p "$VTDATAROOT/$tablet_dir" tablet_type=replica -echo "Starting vttablet for $alias on port $port and mysql $mysql_host:$mysql_port" +echo "> Starting vttablet for server $mysql_host:$mysql_port" +echo " - Tablet alias is $alias" +echo " - Tablet listens on http://$hostname:$port" # shellcheck disable=SC2086 vttablet \ $TOPOLOGY_FLAGS \ @@ -76,3 +78,11 @@ done # check one last time curl -I "http://$hostname:$port/debug/status" >/dev/null 2>&1 || fail "tablet could not be started!" + +echo " + vttablet started" + +if [ "$is_master" == "true" ] ; then + echo " > Setting this tablet as master" + vtctlclient TabletExternallyReparented "$alias" && + echo " + done" +fi From b5f08c82982b35984d7d8800a662a08cedc2fecd Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 25 Jun 2020 10:50:53 +0300 Subject: [PATCH 090/430] cleanup unused files Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- docker/mini/Dockerfile | 3 - docker/mini/etcd.service | 18 - docker/mini/orchestrator.service | 16 - docker/mini/systemctl.py | 4550 ------------------------------ 4 files changed, 4587 deletions(-) delete mode 100644 docker/mini/etcd.service delete mode 100644 docker/mini/orchestrator.service delete mode 100755 docker/mini/systemctl.py diff --git a/docker/mini/Dockerfile b/docker/mini/Dockerfile index c603c2ecfd6..df299ce8634 100644 --- a/docker/mini/Dockerfile +++ b/docker/mini/Dockerfile @@ -33,10 +33,7 @@ RUN /vt/dist/install_mini_dependencies.sh COPY docker/mini/orchestrator-vitess-mini.conf.json /etc/orchestrator.conf.json RUN chown vitess:vitess /etc/orchestrator.conf.json -# COPY docker/mini/etcd.service /etc/systemd/system/etcd.service -# COPY docker/mini/orchestrator.service /etc/systemd/system/orchestrator.service -COPY docker/mini/systemctl.py /usr/bin/systemctl COPY docker/mini/docker-entry /vt/dist/docker/mini/docker-entry COPY examples/local/scripts /vt/dist/scripts COPY examples/local/env.sh /vt/dist/scripts/env.sh diff --git a/docker/mini/etcd.service b/docker/mini/etcd.service deleted file mode 100644 index 192617add31..00000000000 --- a/docker/mini/etcd.service +++ /dev/null @@ -1,18 +0,0 @@ -[Unit] -Description="etcd server" -Requires=network-online.target -After=network-online.target - -[Service] -Type=simple -User=vitess -Group=vitess -ExecStart=/var/opt/etcd/etcd --data-dir=/var/run/etcd -KillMode=process -KillSignal=SIGINT -Restart=on-failure -LimitNOFILE=1024 -RestartSec=10s - -[Install] -WantedBy=multi-user.target diff --git a/docker/mini/orchestrator.service b/docker/mini/orchestrator.service deleted file mode 100644 index cf790404654..00000000000 --- a/docker/mini/orchestrator.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=orchestrator: MySQL replication management and visualization -Documentation=https://github.com/openark/orchestrator -After=syslog.target network.target - -[Service] -Type=simple -User=vitess -Group=vitess -WorkingDirectory=/usr/local/orchestrator -ExecStart=/usr/local/orchestrator/orchestrator http -EnvironmentFile=-/etc/sysconfig/orchestrator -ExecReload=/bin/kill -HUP $MAINPID - -[Install] -WantedBy=multi-user.target diff --git a/docker/mini/systemctl.py b/docker/mini/systemctl.py deleted file mode 100755 index 64287a30948..00000000000 --- a/docker/mini/systemctl.py +++ /dev/null @@ -1,4550 +0,0 @@ -#! /usr/bin/python3 -from __future__ import print_function - -__copyright__ = "(C) 2016-2019 Guido U. Draheim, licensed under the EUPL" -__version__ = "1.4.3424" - -import logging -logg = logging.getLogger("systemctl") - -import re -import fnmatch -import shlex -import collections -import errno -import os -import sys -import signal -import time -import socket -import datetime -import fcntl - -if sys.version[0] == '2': - string_types = basestring - BlockingIOError = IOError -else: - string_types = str - xrange = range - -COVERAGE = os.environ.get("SYSTEMCTL_COVERAGE", "") -DEBUG_AFTER = os.environ.get("SYSTEMCTL_DEBUG_AFTER", "") or False -EXIT_WHEN_NO_MORE_PROCS = os.environ.get("SYSTEMCTL_EXIT_WHEN_NO_MORE_PROCS", "") or False -EXIT_WHEN_NO_MORE_SERVICES = os.environ.get("SYSTEMCTL_EXIT_WHEN_NO_MORE_SERVICES", "") or False - -FOUND_OK = 0 -FOUND_INACTIVE = 2 -FOUND_UNKNOWN = 4 - -# defaults for options -_extra_vars = [] -_force = False -_full = False -_now = False -_no_legend = False -_no_ask_password = False -_preset_mode = "all" -_quiet = False -_root = "" -_unit_type = None -_unit_state = None -_unit_property = None -_show_all = False -_user_mode = False - -# common default paths -_default_target = "multi-user.target" -_system_folder1 = "/etc/systemd/system" -_system_folder2 = "/var/run/systemd/system" -_system_folder3 = "/usr/lib/systemd/system" -_system_folder4 = "/lib/systemd/system" -_system_folder9 = None -_user_folder1 = "~/.config/systemd/user" -_user_folder2 = "/etc/systemd/user" -_user_folder3 = "~.local/share/systemd/user" -_user_folder4 = "/usr/lib/systemd/user" -_user_folder9 = None -_init_folder1 = "/etc/init.d" -_init_folder2 = "/var/run/init.d" -_init_folder9 = None -_preset_folder1 = "/etc/systemd/system-preset" -_preset_folder2 = "/var/run/systemd/system-preset" -_preset_folder3 = "/usr/lib/systemd/system-preset" -_preset_folder4 = "/lib/systemd/system-preset" -_preset_folder9 = None - -SystemCompatibilityVersion = 219 -SysInitTarget = "sysinit.target" -SysInitWait = 5 # max for target -EpsilonTime = 0.1 -MinimumYield = 0.5 -MinimumTimeoutStartSec = 4 -MinimumTimeoutStopSec = 4 -DefaultTimeoutStartSec = int(os.environ.get("SYSTEMCTL_TIMEOUT_START_SEC", 90)) # official value -DefaultTimeoutStopSec = int(os.environ.get("SYSTEMCTL_TIMEOUT_STOP_SEC", 90)) # official value -DefaultMaximumTimeout = int(os.environ.get("SYSTEMCTL_MAXIMUM_TIMEOUT", 200)) # overrides all other -InitLoopSleep = int(os.environ.get("SYSTEMCTL_INITLOOP", 5)) -ProcMaxDepth = 100 -MaxLockWait = None # equals DefaultMaximumTimeout -DefaultPath = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" -ResetLocale = ["LANG", "LANGUAGE", "LC_CTYPE", "LC_NUMERIC", "LC_TIME", "LC_COLLATE", "LC_MONETARY", - "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", - "LC_IDENTIFICATION", "LC_ALL"] - -# The systemd default is NOTIFY_SOCKET="/var/run/systemd/notify" -_notify_socket_folder = "/var/run/systemd" # alias /run/systemd -_pid_file_folder = "/var/run" -_journal_log_folder = "/var/log/journal" - -_systemctl_debug_log = "/var/log/systemctl.debug.log" -_systemctl_extra_log = "/var/log/systemctl.log" - -_default_targets = [ "poweroff.target", "rescue.target", "sysinit.target", "basic.target", "multi-user.target", "graphical.target", "reboot.target" ] -_feature_targets = [ "network.target", "remote-fs.target", "local-fs.target", "timers.target", "nfs-client.target" ] -_all_common_targets = [ "default.target" ] + _default_targets + _feature_targets - -# inside a docker we pretend the following -_all_common_enabled = [ "default.target", "multi-user.target", "remote-fs.target" ] -_all_common_disabled = [ "graphical.target", "resue.target", "nfs-client.target" ] - -_runlevel_mappings = {} # the official list -_runlevel_mappings["0"] = "poweroff.target" -_runlevel_mappings["1"] = "rescue.target" -_runlevel_mappings["2"] = "multi-user.target" -_runlevel_mappings["3"] = "multi-user.target" -_runlevel_mappings["4"] = "multi-user.target" -_runlevel_mappings["5"] = "graphical.target" -_runlevel_mappings["6"] = "reboot.target" - -_sysv_mappings = {} # by rule of thumb -_sysv_mappings["$local_fs"] = "local-fs.target" -_sysv_mappings["$network"] = "network.target" -_sysv_mappings["$remote_fs"] = "remote-fs.target" -_sysv_mappings["$timer"] = "timers.target" - -def shell_cmd(cmd): - return " ".join(["'%s'" % part for part in cmd]) -def to_int(value, default = 0): - try: - return int(value) - except: - return default -def to_list(value): - if isinstance(value, string_types): - return [ value ] - return value -def unit_of(module): - if "." not in module: - return module + ".service" - return module - -def os_path(root, path): - if not root: - return path - if not path: - return path - while path.startswith(os.path.sep): - path = path[1:] - return os.path.join(root, path) - -def os_getlogin(): - """ NOT using os.getlogin() """ - import pwd - return pwd.getpwuid(os.geteuid()).pw_name - -def get_runtime_dir(): - explicit = os.environ.get("XDG_RUNTIME_DIR", "") - if explicit: return explicit - user = os_getlogin() - return "/tmp/run-"+user - -def get_home(): - explicit = os.environ.get("HOME", "") - if explicit: return explicit - return os.path.expanduser("~") - -def _var_path(path): - """ assumes that the path starts with /var - when in - user mode it shall be moved to /run/user/1001/run/ - or as a fallback path to /tmp/run-{user}/ so that - you may find /var/log in /tmp/run-{user}/log ..""" - if path.startswith("/var"): - runtime = get_runtime_dir() # $XDG_RUNTIME_DIR - if not os.path.isdir(runtime): - os.makedirs(runtime) - os.chmod(runtime, 0o700) - return re.sub("^(/var)?", get_runtime_dir(), path) - return path - - -def shutil_setuid(user = None, group = None): - """ set fork-child uid/gid (returns pw-info env-settings)""" - if group: - import grp - gid = grp.getgrnam(group).gr_gid - os.setgid(gid) - logg.debug("setgid %s '%s'", gid, group) - if user: - import pwd - import grp - pw = pwd.getpwnam(user) - gid = pw.pw_gid - gname = grp.getgrgid(gid).gr_name - if not group: - os.setgid(gid) - logg.debug("setgid %s", gid) - groups = [g.gr_gid for g in grp.getgrall() if gname in g.gr_mem] - if groups: - os.setgroups(groups) - uid = pw.pw_uid - os.setuid(uid) - logg.debug("setuid %s '%s'", uid, user) - home = pw.pw_dir - shell = pw.pw_shell - logname = pw.pw_name - return { "USER": user, "LOGNAME": logname, "HOME": home, "SHELL": shell } - return {} - -def shutil_truncate(filename): - """ truncates the file (or creates a new empty file)""" - filedir = os.path.dirname(filename) - if not os.path.isdir(filedir): - os.makedirs(filedir) - f = open(filename, "w") - f.write("") - f.close() - -# http://stackoverflow.com/questions/568271/how-to-check-if-there-exists-a-process-with-a-given-pid -def pid_exists(pid): - """Check whether pid exists in the current process table.""" - if pid is None: - return False - return _pid_exists(int(pid)) -def _pid_exists(pid): - """Check whether pid exists in the current process table. - UNIX only. - """ - if pid < 0: - return False - if pid == 0: - # According to "man 2 kill" PID 0 refers to every process - # in the process group of the calling process. - # On certain systems 0 is a valid PID but we have no way - # to know that in a portable fashion. - raise ValueError('invalid PID 0') - try: - os.kill(pid, 0) - except OSError as err: - if err.errno == errno.ESRCH: - # ESRCH == No such process - return False - elif err.errno == errno.EPERM: - # EPERM clearly means there's a process to deny access to - return True - else: - # According to "man 2 kill" possible error values are - # (EINVAL, EPERM, ESRCH) - raise - else: - return True -def pid_zombie(pid): - """ may be a pid exists but it is only a zombie """ - if pid is None: - return False - return _pid_zombie(int(pid)) -def _pid_zombie(pid): - """ may be a pid exists but it is only a zombie """ - if pid < 0: - return False - if pid == 0: - # According to "man 2 kill" PID 0 refers to every process - # in the process group of the calling process. - # On certain systems 0 is a valid PID but we have no way - # to know that in a portable fashion. - raise ValueError('invalid PID 0') - check = "/proc/%s/status" % pid - try: - for line in open(check): - if line.startswith("State:"): - return "Z" in line - except IOError as e: - if e.errno != errno.ENOENT: - logg.error("%s (%s): %s", check, e.errno, e) - return False - return False - -def checkstatus(cmd): - if cmd.startswith("-"): - return False, cmd[1:] - else: - return True, cmd - -# https://github.com/phusion/baseimage-docker/blob/rel-0.9.16/image/bin/my_init -def ignore_signals_and_raise_keyboard_interrupt(signame): - signal.signal(signal.SIGTERM, signal.SIG_IGN) - signal.signal(signal.SIGINT, signal.SIG_IGN) - raise KeyboardInterrupt(signame) - -class SystemctlConfigParser: - """ A *.service files has a structure similar to an *.ini file but it is - actually not like it. Settings may occur multiple times in each section - and they create an implicit list. In reality all the settings are - globally uniqute, so that an 'environment' can be printed without - adding prefixes. Settings are continued with a backslash at the end - of the line. """ - def __init__(self, defaults=None, dict_type=None, allow_no_value=False): - self._defaults = defaults or {} - self._dict_type = dict_type or collections.OrderedDict - self._allow_no_value = allow_no_value - self._conf = self._dict_type() - self._files = [] - def defaults(self): - return self._defaults - def sections(self): - return list(self._conf.keys()) - def add_section(self, section): - if section not in self._conf: - self._conf[section] = self._dict_type() - def has_section(self, section): - return section in self._conf - def has_option(self, section, option): - if section not in self._conf: - return False - return option in self._conf[section] - def set(self, section, option, value): - if section not in self._conf: - self._conf[section] = self._dict_type() - if option not in self._conf[section]: - self._conf[section][option] = [ value ] - else: - self._conf[section][option].append(value) - if value is None: - self._conf[section][option] = [] - def get(self, section, option, default = None, allow_no_value = False): - allow_no_value = allow_no_value or self._allow_no_value - if section not in self._conf: - if default is not None: - return default - if allow_no_value: - return None - logg.warning("section {} does not exist".format(section)) - logg.warning(" have {}".format(self.sections())) - raise AttributeError("section {} does not exist".format(section)) - if option not in self._conf[section]: - if default is not None: - return default - if allow_no_value: - return None - raise AttributeError("option {} in {} does not exist".format(option, section)) - if not self._conf[section][option]: # i.e. an empty list - if default is not None: - return default - if allow_no_value: - return None - raise AttributeError("option {} in {} is None".format(option, section)) - return self._conf[section][option][0] # the first line in the list of configs - def getlist(self, section, option, default = None, allow_no_value = False): - allow_no_value = allow_no_value or self._allow_no_value - if section not in self._conf: - if default is not None: - return default - if allow_no_value: - return [] - logg.warning("section {} does not exist".format(section)) - logg.warning(" have {}".format(self.sections())) - raise AttributeError("section {} does not exist".format(section)) - if option not in self._conf[section]: - if default is not None: - return default - if allow_no_value: - return [] - raise AttributeError("option {} in {} does not exist".format(option, section)) - return self._conf[section][option] # returns a list, possibly empty - def read(self, filename): - return self.read_sysd(filename) - def read_sysd(self, filename): - initscript = False - initinfo = False - section = None - nextline = False - name, text = "", "" - if os.path.isfile(filename): - self._files.append(filename) - for orig_line in open(filename): - if nextline: - text += orig_line - if text.rstrip().endswith("\\") or text.rstrip().endswith("\\\n"): - text = text.rstrip() + "\n" - else: - self.set(section, name, text) - nextline = False - continue - line = orig_line.strip() - if not line: - continue - if line.startswith("#"): - continue - if line.startswith(";"): - continue - if line.startswith(".include"): - logg.error("the '.include' syntax is deprecated. Use x.service.d/ drop-in files!") - includefile = re.sub(r'^\.include[ ]*', '', line).rstrip() - if not os.path.isfile(includefile): - raise Exception("tried to include file that doesn't exist: %s" % includefile) - self.read_sysd(includefile) - continue - if line.startswith("["): - x = line.find("]") - if x > 0: - section = line[1:x] - self.add_section(section) - continue - m = re.match(r"(\w+) *=(.*)", line) - if not m: - logg.warning("bad ini line: %s", line) - raise Exception("bad ini line") - name, text = m.group(1), m.group(2).strip() - if text.endswith("\\") or text.endswith("\\\n"): - nextline = True - text = text + "\n" - else: - # hint: an empty line shall reset the value-list - self.set(section, name, text and text or None) - def read_sysv(self, filename): - """ an LSB header is scanned and converted to (almost) - equivalent settings of a SystemD ini-style input """ - initscript = False - initinfo = False - section = None - if os.path.isfile(filename): - self._files.append(filename) - for orig_line in open(filename): - line = orig_line.strip() - if line.startswith("#"): - if " BEGIN INIT INFO" in line: - initinfo = True - section = "init.d" - if " END INIT INFO" in line: - initinfo = False - if initinfo: - m = re.match(r"\S+\s*(\w[\w_-]*):(.*)", line) - if m: - key, val = m.group(1), m.group(2).strip() - self.set(section, key, val) - continue - description = self.get("init.d", "Description", "") - if description: - self.set("Unit", "Description", description) - check = self.get("init.d", "Required-Start","") - if check: - for item in check.split(" "): - if item.strip() in _sysv_mappings: - self.set("Unit", "Requires", _sysv_mappings[item.strip()]) - provides = self.get("init.d", "Provides", "") - if provides: - self.set("Install", "Alias", provides) - # if already in multi-user.target then start it there. - runlevels = self.get("init.d", "Default-Start","") - if runlevels: - for item in runlevels.split(" "): - if item.strip() in _runlevel_mappings: - self.set("Install", "WantedBy", _runlevel_mappings[item.strip()]) - self.set("Service", "Type", "sysv") - def filenames(self): - return self._files - -# UnitConfParser = ConfigParser.RawConfigParser -UnitConfParser = SystemctlConfigParser - -class SystemctlConf: - def __init__(self, data, module = None): - self.data = data # UnitConfParser - self.env = {} - self.status = None - self.masked = None - self.module = module - self.drop_in_files = {} - self._root = _root - self._user_mode = _user_mode - def os_path(self, path): - return os_path(self._root, path) - def os_path_var(self, path): - if self._user_mode: - return os_path(self._root, _var_path(path)) - return os_path(self._root, path) - def loaded(self): - files = self.data.filenames() - if self.masked: - return "masked" - if len(files): - return "loaded" - return "" - def filename(self): - """ returns the last filename that was parsed """ - files = self.data.filenames() - if files: - return files[0] - return None - def overrides(self): - """ drop-in files are loaded alphabetically by name, not by full path """ - return [ self.drop_in_files[name] for name in sorted(self.drop_in_files) ] - def name(self): - """ the unit id or defaults to the file name """ - name = self.module or "" - filename = self.filename() - if filename: - name = os.path.basename(filename) - return self.get("Unit", "Id", name) - def set(self, section, name, value): - return self.data.set(section, name, value) - def get(self, section, name, default, allow_no_value = False): - return self.data.get(section, name, default, allow_no_value) - def getlist(self, section, name, default = None, allow_no_value = False): - return self.data.getlist(section, name, default or [], allow_no_value) - def getbool(self, section, name, default = None): - value = self.data.get(section, name, default or "no") - if value: - if value[0] in "TtYy123456789": - return True - return False - -class PresetFile: - def __init__(self): - self._files = [] - self._lines = [] - def filename(self): - """ returns the last filename that was parsed """ - if self._files: - return self._files[-1] - return None - def read(self, filename): - self._files.append(filename) - for line in open(filename): - self._lines.append(line.strip()) - return self - def get_preset(self, unit): - for line in self._lines: - m = re.match(r"(enable|disable)\s+(\S+)", line) - if m: - status, pattern = m.group(1), m.group(2) - if fnmatch.fnmatchcase(unit, pattern): - logg.debug("%s %s => %s [%s]", status, pattern, unit, self.filename()) - return status - return None - -## with waitlock(conf): self.start() -class waitlock: - def __init__(self, conf): - self.conf = conf # currently unused - self.opened = None - self.lockfolder = conf.os_path_var(_notify_socket_folder) - try: - folder = self.lockfolder - if not os.path.isdir(folder): - os.makedirs(folder) - except Exception as e: - logg.warning("oops, %s", e) - def lockfile(self): - unit = "" - if self.conf: - unit = self.conf.name() - return os.path.join(self.lockfolder, str(unit or "global") + ".lock") - def __enter__(self): - try: - lockfile = self.lockfile() - lockname = os.path.basename(lockfile) - self.opened = os.open(lockfile, os.O_RDWR | os.O_CREAT, 0o600) - for attempt in xrange(int(MaxLockWait or DefaultMaximumTimeout)): - try: - logg.debug("[%s] %s. trying %s _______ ", os.getpid(), attempt, lockname) - fcntl.flock(self.opened, fcntl.LOCK_EX | fcntl.LOCK_NB) - st = os.fstat(self.opened) - if not st.st_nlink: - logg.debug("[%s] %s. %s got deleted, trying again", os.getpid(), attempt, lockname) - os.close(self.opened) - self.opened = os.open(lockfile, os.O_RDWR | os.O_CREAT, 0o600) - continue - content = "{ 'systemctl': %s, 'lock': '%s' }\n" % (os.getpid(), lockname) - os.write(self.opened, content.encode("utf-8")) - logg.debug("[%s] %s. holding lock on %s", os.getpid(), attempt, lockname) - return True - except BlockingIOError as e: - whom = os.read(self.opened, 4096) - os.lseek(self.opened, 0, os.SEEK_SET) - logg.info("[%s] %s. systemctl locked by %s", os.getpid(), attempt, whom.rstrip()) - time.sleep(1) # until MaxLockWait - continue - logg.error("[%s] not able to get the lock to %s", os.getpid(), lockname) - except Exception as e: - logg.warning("[%s] oops %s, %s", os.getpid(), str(type(e)), e) - #TODO# raise Exception("no lock for %s", self.unit or "global") - return False - def __exit__(self, type, value, traceback): - try: - os.lseek(self.opened, 0, os.SEEK_SET) - os.ftruncate(self.opened, 0) - if "removelockfile" in COVERAGE: # actually an optional implementation - lockfile = self.lockfile() - lockname = os.path.basename(lockfile) - os.unlink(lockfile) # ino is kept allocated because opened by this process - logg.debug("[%s] lockfile removed for %s", os.getpid(), lockname) - fcntl.flock(self.opened, fcntl.LOCK_UN) - os.close(self.opened) # implies an unlock but that has happend like 6 seconds later - self.opened = None - except Exception as e: - logg.warning("oops, %s", e) - -def must_have_failed(waitpid, cmd): - # found to be needed on ubuntu:16.04 to match test result from ubuntu:18.04 and other distros - # .... I have tracked it down that python's os.waitpid() returns an exitcode==0 even when the - # .... underlying process has actually failed with an exitcode<>0. It is unknown where that - # .... bug comes from but it seems a bit serious to trash some very basic unix functionality. - # .... Essentially a parent process does not get the correct exitcode from its own children. - if cmd and cmd[0] == "/bin/kill": - pid = None - for arg in cmd[1:]: - if not arg.startswith("-"): - pid = arg - if pid is None: # unknown $MAINPID - if not waitpid.returncode: - logg.error("waitpid %s did return %s => correcting as 11", cmd, waitpid.returncode) - waitpidNEW = collections.namedtuple("waitpidNEW", ["pid", "returncode", "signal" ]) - waitpid = waitpidNEW(waitpid.pid, 11, waitpid.signal) - return waitpid - -def subprocess_waitpid(pid): - waitpid = collections.namedtuple("waitpid", ["pid", "returncode", "signal" ]) - run_pid, run_stat = os.waitpid(pid, 0) - return waitpid(run_pid, os.WEXITSTATUS(run_stat), os.WTERMSIG(run_stat)) -def subprocess_testpid(pid): - testpid = collections.namedtuple("testpid", ["pid", "returncode", "signal" ]) - run_pid, run_stat = os.waitpid(pid, os.WNOHANG) - if run_pid: - return testpid(run_pid, os.WEXITSTATUS(run_stat), os.WTERMSIG(run_stat)) - else: - return testpid(pid, None, 0) - -def parse_unit(name): # -> object(prefix, instance, suffix, ...., name, component) - unit_name, suffix = name, "" - has_suffix = name.rfind(".") - if has_suffix > 0: - unit_name = name[:has_suffix] - suffix = name[has_suffix+1:] - prefix, instance = unit_name, "" - has_instance = unit_name.find("@") - if has_instance > 0: - prefix = unit_name[:has_instance] - instance = unit_name[has_instance+1:] - component = "" - has_component = prefix.rfind("-") - if has_component > 0: - component = prefix[has_component+1:] - UnitName = collections.namedtuple("UnitName", ["name", "prefix", "instance", "suffix", "component" ]) - return UnitName(name, prefix, instance, suffix, component) - -def time_to_seconds(text, maximum = None): - if maximum is None: - maximum = DefaultMaximumTimeout - value = 0 - for part in str(text).split(" "): - item = part.strip() - if item == "infinity": - return maximum - if item.endswith("m"): - try: value += 60 * int(item[:-1]) - except: pass # pragma: no cover - if item.endswith("min"): - try: value += 60 * int(item[:-3]) - except: pass # pragma: no cover - elif item.endswith("ms"): - try: value += int(item[:-2]) / 1000. - except: pass # pragma: no cover - elif item.endswith("s"): - try: value += int(item[:-1]) - except: pass # pragma: no cover - elif item: - try: value += int(item) - except: pass # pragma: no cover - if value > maximum: - return maximum - if not value: - return 1 - return value -def seconds_to_time(seconds): - seconds = float(seconds) - mins = int(int(seconds) / 60) - secs = int(int(seconds) - (mins * 60)) - msecs = int(int(seconds * 1000) - (secs * 1000 + mins * 60000)) - if mins and secs and msecs: - return "%smin %ss %sms" % (mins, secs, msecs) - elif mins and secs: - return "%smin %ss" % (mins, secs) - elif secs and msecs: - return "%ss %sms" % (secs, msecs) - elif mins and msecs: - return "%smin %sms" % (mins, msecs) - elif mins: - return "%smin" % (mins) - else: - return "%ss" % (secs) - -def getBefore(conf): - result = [] - beforelist = conf.getlist("Unit", "Before", []) - for befores in beforelist: - for before in befores.split(" "): - name = before.strip() - if name and name not in result: - result.append(name) - return result - -def getAfter(conf): - result = [] - afterlist = conf.getlist("Unit", "After", []) - for afters in afterlist: - for after in afters.split(" "): - name = after.strip() - if name and name not in result: - result.append(name) - return result - -def compareAfter(confA, confB): - idA = confA.name() - idB = confB.name() - for after in getAfter(confA): - if after == idB: - logg.debug("%s After %s", idA, idB) - return -1 - for after in getAfter(confB): - if after == idA: - logg.debug("%s After %s", idB, idA) - return 1 - for before in getBefore(confA): - if before == idB: - logg.debug("%s Before %s", idA, idB) - return 1 - for before in getBefore(confB): - if before == idA: - logg.debug("%s Before %s", idB, idA) - return -1 - return 0 - -def sortedAfter(conflist, cmp = compareAfter): - # the normal sorted() does only look at two items - # so if "A after C" and a list [A, B, C] then - # it will see "A = B" and "B = C" assuming that - # "A = C" and the list is already sorted. - # - # To make a totalsorted we have to create a marker - # that informs sorted() that also B has a relation. - # It only works when 'after' has a direction, so - # anything without 'before' is a 'after'. In that - # case we find that "B after C". - class SortTuple: - def __init__(self, rank, conf): - self.rank = rank - self.conf = conf - sortlist = [ SortTuple(0, conf) for conf in conflist] - for check in xrange(len(sortlist)): # maxrank = len(sortlist) - changed = 0 - for A in xrange(len(sortlist)): - for B in xrange(len(sortlist)): - if A != B: - itemA = sortlist[A] - itemB = sortlist[B] - before = compareAfter(itemA.conf, itemB.conf) - if before > 0 and itemA.rank <= itemB.rank: - if DEBUG_AFTER: # pragma: no cover - logg.info(" %-30s before %s", itemA.conf.name(), itemB.conf.name()) - itemA.rank = itemB.rank + 1 - changed += 1 - if before < 0 and itemB.rank <= itemA.rank: - if DEBUG_AFTER: # pragma: no cover - logg.info(" %-30s before %s", itemB.conf.name(), itemA.conf.name()) - itemB.rank = itemA.rank + 1 - changed += 1 - if not changed: - if DEBUG_AFTER: # pragma: no cover - logg.info("done in check %s of %s", check, len(sortlist)) - break - # because Requires is almost always the same as the After clauses - # we are mostly done in round 1 as the list is in required order - for conf in conflist: - if DEBUG_AFTER: # pragma: no cover - logg.debug(".. %s", conf.name()) - for item in sortlist: - if DEBUG_AFTER: # pragma: no cover - logg.info("(%s) %s", item.rank, item.conf.name()) - sortedlist = sorted(sortlist, key = lambda item: -item.rank) - for item in sortedlist: - if DEBUG_AFTER: # pragma: no cover - logg.info("[%s] %s", item.rank, item.conf.name()) - return [ item.conf for item in sortedlist ] - -class Systemctl: - def __init__(self): - # from command line options or the defaults - self._extra_vars = _extra_vars - self._force = _force - self._full = _full - self._init = _init - self._no_ask_password = _no_ask_password - self._no_legend = _no_legend - self._now = _now - self._preset_mode = _preset_mode - self._quiet = _quiet - self._root = _root - self._show_all = _show_all - self._unit_property = _unit_property - self._unit_state = _unit_state - self._unit_type = _unit_type - # some common constants that may be changed - self._systemd_version = SystemCompatibilityVersion - self._pid_file_folder = _pid_file_folder - self._journal_log_folder = _journal_log_folder - # and the actual internal runtime state - self._loaded_file_sysv = {} # /etc/init.d/name => config data - self._loaded_file_sysd = {} # /etc/systemd/system/name.service => config data - self._file_for_unit_sysv = None # name.service => /etc/init.d/name - self._file_for_unit_sysd = None # name.service => /etc/systemd/system/name.service - self._preset_file_list = None # /etc/systemd/system-preset/* => file content - self._default_target = _default_target - self._sysinit_target = None - self.exit_when_no_more_procs = EXIT_WHEN_NO_MORE_PROCS or False - self.exit_when_no_more_services = EXIT_WHEN_NO_MORE_SERVICES or False - self._user_mode = _user_mode - self._user_getlogin = os_getlogin() - self._log_file = {} # init-loop - self._log_hold = {} # init-loop - def user(self): - return self._user_getlogin - def user_mode(self): - return self._user_mode - def user_folder(self): - for folder in self.user_folders(): - if folder: return folder - raise Exception("did not find any systemd/user folder") - def system_folder(self): - for folder in self.system_folders(): - if folder: return folder - raise Exception("did not find any systemd/system folder") - def init_folders(self): - if _init_folder1: yield _init_folder1 - if _init_folder2: yield _init_folder2 - if _init_folder9: yield _init_folder9 - def preset_folders(self): - if _preset_folder1: yield _preset_folder1 - if _preset_folder2: yield _preset_folder2 - if _preset_folder3: yield _preset_folder3 - if _preset_folder4: yield _preset_folder4 - if _preset_folder9: yield _preset_folder9 - def user_folders(self): - if _user_folder1: yield os.path.expanduser(_user_folder1) - if _user_folder2: yield os.path.expanduser(_user_folder2) - if _user_folder3: yield os.path.expanduser(_user_folder3) - if _user_folder4: yield os.path.expanduser(_user_folder4) - if _user_folder9: yield os.path.expanduser(_user_folder9) - def system_folders(self): - if _system_folder1: yield _system_folder1 - if _system_folder2: yield _system_folder2 - if _system_folder3: yield _system_folder3 - if _system_folder4: yield _system_folder4 - if _system_folder9: yield _system_folder9 - def sysd_folders(self): - """ if --user then these folders are preferred """ - if self.user_mode(): - for folder in self.user_folders(): - yield folder - if True: - for folder in self.system_folders(): - yield folder - def scan_unit_sysd_files(self, module = None): # -> [ unit-names,... ] - """ reads all unit files, returns the first filename for the unit given """ - if self._file_for_unit_sysd is None: - self._file_for_unit_sysd = {} - for folder in self.sysd_folders(): - if not folder: - continue - folder = os_path(self._root, folder) - if not os.path.isdir(folder): - continue - for name in os.listdir(folder): - path = os.path.join(folder, name) - if os.path.isdir(path): - continue - service_name = name - if service_name not in self._file_for_unit_sysd: - self._file_for_unit_sysd[service_name] = path - logg.debug("found %s sysd files", len(self._file_for_unit_sysd)) - return list(self._file_for_unit_sysd.keys()) - def scan_unit_sysv_files(self, module = None): # -> [ unit-names,... ] - """ reads all init.d files, returns the first filename when unit is a '.service' """ - if self._file_for_unit_sysv is None: - self._file_for_unit_sysv = {} - for folder in self.init_folders(): - if not folder: - continue - folder = os_path(self._root, folder) - if not os.path.isdir(folder): - continue - for name in os.listdir(folder): - path = os.path.join(folder, name) - if os.path.isdir(path): - continue - service_name = name + ".service" # simulate systemd - if service_name not in self._file_for_unit_sysv: - self._file_for_unit_sysv[service_name] = path - logg.debug("found %s sysv files", len(self._file_for_unit_sysv)) - return list(self._file_for_unit_sysv.keys()) - def unit_sysd_file(self, module = None): # -> filename? - """ file path for the given module (systemd) """ - self.scan_unit_sysd_files() - if module and module in self._file_for_unit_sysd: - return self._file_for_unit_sysd[module] - if module and unit_of(module) in self._file_for_unit_sysd: - return self._file_for_unit_sysd[unit_of(module)] - return None - def unit_sysv_file(self, module = None): # -> filename? - """ file path for the given module (sysv) """ - self.scan_unit_sysv_files() - if module and module in self._file_for_unit_sysv: - return self._file_for_unit_sysv[module] - if module and unit_of(module) in self._file_for_unit_sysv: - return self._file_for_unit_sysv[unit_of(module)] - return None - def unit_file(self, module = None): # -> filename? - """ file path for the given module (sysv or systemd) """ - path = self.unit_sysd_file(module) - if path is not None: return path - path = self.unit_sysv_file(module) - if path is not None: return path - return None - def is_sysv_file(self, filename): - """ for routines that have a special treatment for init.d services """ - self.unit_file() # scan all - if not filename: return None - if filename in self._file_for_unit_sysd.values(): return False - if filename in self._file_for_unit_sysv.values(): return True - return None # not True - def is_user_conf(self, conf): - if not conf: - return False # no such conf >> ignored - filename = conf.filename() - if filename and "/user/" in filename: - return True - return False - def not_user_conf(self, conf): - """ conf can not be started as user service (when --user)""" - if not conf: - return True # no such conf >> ignored - if not self.user_mode(): - logg.debug("%s no --user mode >> accept", conf.filename()) - return False - if self.is_user_conf(conf): - logg.debug("%s is /user/ conf >> accept", conf.filename()) - return False - # to allow for 'docker run -u user' with system services - user = self.expand_special(conf.get("Service", "User", ""), conf) - if user and user == self.user(): - logg.debug("%s with User=%s >> accept", conf.filename(), user) - return False - return True - def find_drop_in_files(self, unit): - """ search for some.service.d/extra.conf files """ - result = {} - basename_d = unit + ".d" - for folder in self.sysd_folders(): - if not folder: - continue - folder = os_path(self._root, folder) - override_d = os_path(folder, basename_d) - if not os.path.isdir(override_d): - continue - for name in os.listdir(override_d): - path = os.path.join(override_d, name) - if os.path.isdir(path): - continue - if not path.endswith(".conf"): - continue - if name not in result: - result[name] = path - return result - def load_sysd_template_conf(self, module): # -> conf? - """ read the unit template with a UnitConfParser (systemd) """ - if module and "@" in module: - unit = parse_unit(module) - service = "%s@.service" % unit.prefix - return self.load_sysd_unit_conf(service) - return None - def load_sysd_unit_conf(self, module): # -> conf? - """ read the unit file with a UnitConfParser (systemd) """ - path = self.unit_sysd_file(module) - if not path: return None - if path in self._loaded_file_sysd: - return self._loaded_file_sysd[path] - masked = None - if os.path.islink(path) and os.readlink(path).startswith("/dev"): - masked = os.readlink(path) - drop_in_files = {} - data = UnitConfParser() - if not masked: - data.read_sysd(path) - drop_in_files = self.find_drop_in_files(os.path.basename(path)) - # load in alphabetic order, irrespective of location - for name in sorted(drop_in_files): - path = drop_in_files[name] - data.read_sysd(path) - conf = SystemctlConf(data, module) - conf.masked = masked - conf.drop_in_files = drop_in_files - conf._root = self._root - self._loaded_file_sysd[path] = conf - return conf - def load_sysv_unit_conf(self, module): # -> conf? - """ read the unit file with a UnitConfParser (sysv) """ - path = self.unit_sysv_file(module) - if not path: return None - if path in self._loaded_file_sysv: - return self._loaded_file_sysv[path] - data = UnitConfParser() - data.read_sysv(path) - conf = SystemctlConf(data, module) - conf._root = self._root - self._loaded_file_sysv[path] = conf - return conf - def load_unit_conf(self, module): # -> conf | None(not-found) - """ read the unit file with a UnitConfParser (sysv or systemd) """ - try: - conf = self.load_sysd_unit_conf(module) - if conf is not None: - return conf - conf = self.load_sysd_template_conf(module) - if conf is not None: - return conf - conf = self.load_sysv_unit_conf(module) - if conf is not None: - return conf - except Exception as e: - logg.warning("%s not loaded: %s", module, e) - return None - def default_unit_conf(self, module, description = None): # -> conf - """ a unit conf that can be printed to the user where - attributes are empty and loaded() is False """ - data = UnitConfParser() - data.set("Unit","Id", module) - data.set("Unit", "Names", module) - data.set("Unit", "Description", description or ("NOT-FOUND " + str(module))) - # assert(not data.loaded()) - conf = SystemctlConf(data, module) - conf._root = self._root - return conf - def get_unit_conf(self, module): # -> conf (conf | default-conf) - """ accept that a unit does not exist - and return a unit conf that says 'not-loaded' """ - conf = self.load_unit_conf(module) - if conf is not None: - return conf - return self.default_unit_conf(module) - def match_sysd_templates(self, modules = None, suffix=".service"): # -> generate[ unit ] - """ make a file glob on all known template units (systemd areas). - It returns no modules (!!) if no modules pattern were given. - The module string should contain an instance name already. """ - modules = to_list(modules) - if not modules: - return - self.scan_unit_sysd_files() - for item in sorted(self._file_for_unit_sysd.keys()): - if "@" not in item: - continue - service_unit = parse_unit(item) - for module in modules: - if "@" not in module: - continue - module_unit = parse_unit(module) - if service_unit.prefix == module_unit.prefix: - yield "%s@%s.%s" % (service_unit.prefix, module_unit.instance, service_unit.suffix) - def match_sysd_units(self, modules = None, suffix=".service"): # -> generate[ unit ] - """ make a file glob on all known units (systemd areas). - It returns all modules if no modules pattern were given. - Also a single string as one module pattern may be given. """ - modules = to_list(modules) - self.scan_unit_sysd_files() - for item in sorted(self._file_for_unit_sysd.keys()): - if not modules: - yield item - elif [ module for module in modules if fnmatch.fnmatchcase(item, module) ]: - yield item - elif [ module for module in modules if module+suffix == item ]: - yield item - def match_sysv_units(self, modules = None, suffix=".service"): # -> generate[ unit ] - """ make a file glob on all known units (sysv areas). - It returns all modules if no modules pattern were given. - Also a single string as one module pattern may be given. """ - modules = to_list(modules) - self.scan_unit_sysv_files() - for item in sorted(self._file_for_unit_sysv.keys()): - if not modules: - yield item - elif [ module for module in modules if fnmatch.fnmatchcase(item, module) ]: - yield item - elif [ module for module in modules if module+suffix == item ]: - yield item - def match_units(self, modules = None, suffix=".service"): # -> [ units,.. ] - """ Helper for about any command with multiple units which can - actually be glob patterns on their respective unit name. - It returns all modules if no modules pattern were given. - Also a single string as one module pattern may be given. """ - found = [] - for unit in self.match_sysd_units(modules, suffix): - if unit not in found: - found.append(unit) - for unit in self.match_sysd_templates(modules, suffix): - if unit not in found: - found.append(unit) - for unit in self.match_sysv_units(modules, suffix): - if unit not in found: - found.append(unit) - return found - def list_service_unit_basics(self): - """ show all the basic loading state of services """ - filename = self.unit_file() # scan all - result = [] - for name, value in self._file_for_unit_sysd.items(): - result += [ (name, "SysD", value) ] - for name, value in self._file_for_unit_sysv.items(): - result += [ (name, "SysV", value) ] - return result - def list_service_units(self, *modules): # -> [ (unit,loaded+active+substate,description) ] - """ show all the service units """ - result = {} - active = {} - substate = {} - description = {} - for unit in self.match_units(modules): - result[unit] = "not-found" - active[unit] = "inactive" - substate[unit] = "dead" - description[unit] = "" - try: - conf = self.get_unit_conf(unit) - result[unit] = "loaded" - description[unit] = self.get_description_from(conf) - active[unit] = self.get_active_from(conf) - substate[unit] = self.get_substate_from(conf) - except Exception as e: - logg.warning("list-units: %s", e) - if self._unit_state: - if self._unit_state not in [ result[unit], active[unit], substate[unit] ]: - del result[unit] - return [ (unit, result[unit] + " " + active[unit] + " " + substate[unit], description[unit]) for unit in sorted(result) ] - def show_list_units(self, *modules): # -> [ (unit,loaded,description) ] - """ [PATTERN]... -- List loaded units. - If one or more PATTERNs are specified, only units matching one of - them are shown. NOTE: This is the default command.""" - hint = "To show all installed unit files use 'systemctl list-unit-files'." - result = self.list_service_units(*modules) - if self._no_legend: - return result - found = "%s loaded units listed." % len(result) - return result + [ "", found, hint ] - def list_service_unit_files(self, *modules): # -> [ (unit,enabled) ] - """ show all the service units and the enabled status""" - logg.debug("list service unit files for %s", modules) - result = {} - enabled = {} - for unit in self.match_units(modules): - result[unit] = None - enabled[unit] = "" - try: - conf = self.get_unit_conf(unit) - if self.not_user_conf(conf): - result[unit] = None - continue - result[unit] = conf - enabled[unit] = self.enabled_from(conf) - except Exception as e: - logg.warning("list-units: %s", e) - return [ (unit, enabled[unit]) for unit in sorted(result) if result[unit] ] - def each_target_file(self): - folders = self.system_folders() - if self.user_mode(): - folders = self.user_folders() - for folder in folders: - if not os.path.isdir(folder): - continue - for filename in os.listdir(folder): - if filename.endswith(".target"): - yield (filename, os.path.join(folder, filename)) - def list_target_unit_files(self, *modules): # -> [ (unit,enabled) ] - """ show all the target units and the enabled status""" - enabled = {} - targets = {} - for target, filepath in self.each_target_file(): - logg.info("target %s", filepath) - targets[target] = filepath - enabled[target] = "static" - for unit in _all_common_targets: - targets[unit] = None - enabled[unit] = "static" - if unit in _all_common_enabled: - enabled[unit] = "enabled" - if unit in _all_common_disabled: - enabled[unit] = "disabled" - return [ (unit, enabled[unit]) for unit in sorted(targets) ] - def show_list_unit_files(self, *modules): # -> [ (unit,enabled) ] - """[PATTERN]... -- List installed unit files - List installed unit files and their enablement state (as reported - by is-enabled). If one or more PATTERNs are specified, only units - whose filename (just the last component of the path) matches one of - them are shown. This command reacts to limitations of --type being - --type=service or --type=target (and --now for some basics).""" - if self._now: - result = self.list_service_unit_basics() - elif self._unit_type == "target": - result = self.list_target_unit_files() - elif self._unit_type == "service": - result = self.list_service_unit_files() - elif self._unit_type: - logg.warning("unsupported unit --type=%s", self._unit_type) - result = [] - else: - result = self.list_target_unit_files() - result += self.list_service_unit_files(*modules) - if self._no_legend: - return result - found = "%s unit files listed." % len(result) - return [ ("UNIT FILE", "STATE") ] + result + [ "", found ] - ## - ## - def get_description(self, unit, default = None): - return self.get_description_from(self.load_unit_conf(unit)) - def get_description_from(self, conf, default = None): # -> text - """ Unit.Description could be empty sometimes """ - if not conf: return default or "" - description = conf.get("Unit", "Description", default or "") - return self.expand_special(description, conf) - def read_pid_file(self, pid_file, default = None): - pid = default - if not pid_file: - return default - if not os.path.isfile(pid_file): - return default - if self.truncate_old(pid_file): - return default - try: - # some pid-files from applications contain multiple lines - for line in open(pid_file): - if line.strip(): - pid = to_int(line.strip()) - break - except Exception as e: - logg.warning("bad read of pid file '%s': %s", pid_file, e) - return pid - def wait_pid_file(self, pid_file, timeout = None): # -> pid? - """ wait some seconds for the pid file to appear and return the pid """ - timeout = int(timeout or (DefaultTimeoutStartSec/2)) - timeout = max(timeout, (MinimumTimeoutStartSec)) - dirpath = os.path.dirname(os.path.abspath(pid_file)) - for x in xrange(timeout): - if not os.path.isdir(dirpath): - time.sleep(1) # until TimeoutStartSec/2 - continue - pid = self.read_pid_file(pid_file) - if not pid: - time.sleep(1) # until TimeoutStartSec/2 - continue - if not pid_exists(pid): - time.sleep(1) # until TimeoutStartSec/2 - continue - return pid - return None - def test_pid_file(self, unit): # -> text - """ support for the testsuite.py """ - conf = self.get_unit_conf(unit) - return self.pid_file_from(conf) or self.status_file_from(conf) - def pid_file_from(self, conf, default = ""): - """ get the specified pid file path (not a computed default) """ - pid_file = conf.get("Service", "PIDFile", default) - return self.expand_special(pid_file, conf) - def read_mainpid_from(self, conf, default): - """ MAINPID is either the PIDFile content written from the application - or it is the value in the status file written by this systemctl.py code """ - pid_file = self.pid_file_from(conf) - if pid_file: - return self.read_pid_file(pid_file, default) - status = self.read_status_from(conf) - return status.get("MainPID", default) - def clean_pid_file_from(self, conf): - pid_file = self.pid_file_from(conf) - if pid_file and os.path.isfile(pid_file): - try: - os.remove(pid_file) - except OSError as e: - logg.warning("while rm %s: %s", pid_file, e) - self.write_status_from(conf, MainPID=None) - def get_status_file(self, unit): # for testing - conf = self.get_unit_conf(unit) - return self.status_file_from(conf) - def status_file_from(self, conf, default = None): - if default is None: - default = self.default_status_file(conf) - if conf is None: return default - status_file = conf.get("Service", "StatusFile", default) - # this not a real setting, but do the expand_special anyway - return self.expand_special(status_file, conf) - def default_status_file(self, conf): # -> text - """ default file pattern where to store a status mark """ - folder = conf.os_path_var(self._pid_file_folder) - name = "%s.status" % conf.name() - return os.path.join(folder, name) - def clean_status_from(self, conf): - status_file = self.status_file_from(conf) - if os.path.exists(status_file): - os.remove(status_file) - conf.status = {} - def write_status_from(self, conf, **status): # -> bool(written) - """ if a status_file is known then path is created and the - give status is written as the only content. """ - status_file = self.status_file_from(conf) - if not status_file: - logg.debug("status %s but no status_file", conf.name()) - return False - dirpath = os.path.dirname(os.path.abspath(status_file)) - if not os.path.isdir(dirpath): - os.makedirs(dirpath) - if conf.status is None: - conf.status = self.read_status_from(conf) - if True: - for key in sorted(status.keys()): - value = status[key] - if key.upper() == "AS": key = "ActiveState" - if key.upper() == "EXIT": key = "ExecMainCode" - if value is None: - try: del conf.status[key] - except KeyError: pass - else: - conf.status[key] = value - try: - with open(status_file, "w") as f: - for key in sorted(conf.status): - value = conf.status[key] - if key == "MainPID" and str(value) == "0": - logg.warning("ignore writing MainPID=0") - continue - content = "{}={}\n".format(key, str(value)) - logg.debug("writing to %s\n\t%s", status_file, content.strip()) - f.write(content) - except IOError as e: - logg.error("writing STATUS %s: %s\n\t to status file %s", status, e, status_file) - return True - def read_status_from(self, conf, defaults = None): - status_file = self.status_file_from(conf) - status = {} - if hasattr(defaults, "keys"): - for key in defaults.keys(): - status[key] = defaults[key] - elif isinstance(defaults, string_types): - status["ActiveState"] = defaults - if not status_file: - logg.debug("no status file. returning %s", status) - return status - if not os.path.isfile(status_file): - logg.debug("no status file: %s\n returning %s", status_file, status) - return status - if self.truncate_old(status_file): - logg.debug("old status file: %s\n returning %s", status_file, status) - return status - try: - logg.debug("reading %s", status_file) - for line in open(status_file): - if line.strip(): - m = re.match(r"(\w+)[:=](.*)", line) - if m: - key, value = m.group(1), m.group(2) - if key.strip(): - status[key.strip()] = value.strip() - elif line in [ "active", "inactive", "failed"]: - status["ActiveState"] = line - else: - logg.warning("ignored %s", line.strip()) - except: - logg.warning("bad read of status file '%s'", status_file) - return status - def get_status_from(self, conf, name, default = None): - if conf.status is None: - conf.status = self.read_status_from(conf) - return conf.status.get(name, default) - def set_status_from(self, conf, name, value): - if conf.status is None: - conf.status = self.read_status_from(conf) - if value is None: - try: del conf.status[name] - except KeyError: pass - else: - conf.status[name] = value - # - def wait_boot(self, hint = None): - booted = self.get_boottime() - while True: - now = time.time() - if booted + EpsilonTime <= now: - break - time.sleep(EpsilonTime) - logg.info(" %s ................. boot sleep %ss", hint or "", EpsilonTime) - def get_boottime(self): - if "oldest" in COVERAGE: - return self.get_boottime_oldest() - for pid in xrange(10): - proc = "/proc/%s/status" % pid - try: - if os.path.exists(proc): - return os.path.getmtime(proc) - except Exception as e: # pragma: nocover - logg.warning("could not access %s: %s", proc, e) - return self.get_boottime_oldest() - def get_boottime_oldest(self): - # otherwise get the oldest entry in /proc - booted = time.time() - for name in os.listdir("/proc"): - proc = "/proc/%s/status" % name - try: - if os.path.exists(proc): - ctime = os.path.getmtime(proc) - if ctime < booted: - booted = ctime - except Exception as e: # pragma: nocover - logg.warning("could not access %s: %s", proc, e) - return booted - def get_filetime(self, filename): - return os.path.getmtime(filename) - def truncate_old(self, filename): - filetime = self.get_filetime(filename) - boottime = self.get_boottime() - if isinstance(filetime, float): - filetime -= EpsilonTime - if filetime >= boottime : - logg.debug(" file time: %s", datetime.datetime.fromtimestamp(filetime)) - logg.debug(" boot time: %s", datetime.datetime.fromtimestamp(boottime)) - return False # OK - logg.info("truncate old %s", filename) - logg.info(" file time: %s", datetime.datetime.fromtimestamp(filetime)) - logg.info(" boot time: %s", datetime.datetime.fromtimestamp(boottime)) - try: - shutil_truncate(filename) - except Exception as e: - logg.warning("while truncating: %s", e) - return True # truncated - def getsize(self, filename): - if not filename: - return 0 - if not os.path.isfile(filename): - return 0 - if self.truncate_old(filename): - return 0 - try: - return os.path.getsize(filename) - except Exception as e: - logg.warning("while reading file size: %s\n of %s", e, filename) - return 0 - # - def read_env_file(self, env_file): # -> generate[ (name,value) ] - """ EnvironmentFile= is being scanned """ - if env_file.startswith("-"): - env_file = env_file[1:] - if not os.path.isfile(os_path(self._root, env_file)): - return - try: - for real_line in open(os_path(self._root, env_file)): - line = real_line.strip() - if not line or line.startswith("#"): - continue - m = re.match(r"(?:export +)?([\w_]+)[=]'([^']*)'", line) - if m: - yield m.group(1), m.group(2) - continue - m = re.match(r'(?:export +)?([\w_]+)[=]"([^"]*)"', line) - if m: - yield m.group(1), m.group(2) - continue - m = re.match(r'(?:export +)?([\w_]+)[=](.*)', line) - if m: - yield m.group(1), m.group(2) - continue - except Exception as e: - logg.info("while reading %s: %s", env_file, e) - def read_env_part(self, env_part): # -> generate[ (name, value) ] - """ Environment== is being scanned """ - ## systemd Environment= spec says it is a space-seperated list of - ## assignments. In order to use a space or an equals sign in a value - ## one should enclose the whole assignment with double quotes: - ## Environment="VAR1=word word" VAR2=word3 "VAR3=$word 5 6" - ## and the $word is not expanded by other environment variables. - try: - for real_line in env_part.split("\n"): - line = real_line.strip() - for found in re.finditer(r'\s*("[\w_]+=[^"]*"|[\w_]+=\S*)', line): - part = found.group(1) - if part.startswith('"'): - part = part[1:-1] - name, value = part.split("=", 1) - yield name, value - except Exception as e: - logg.info("while reading %s: %s", env_part, e) - def show_environment(self, unit): - """ [UNIT]. -- show environment parts """ - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if _unit_property: - return conf.getlist("Service", _unit_property) - return self.get_env(conf) - def extra_vars(self): - return self._extra_vars # from command line - def get_env(self, conf): - env = os.environ.copy() - for env_part in conf.getlist("Service", "Environment", []): - for name, value in self.read_env_part(self.expand_special(env_part, conf)): - env[name] = value # a '$word' is not special here - for env_file in conf.getlist("Service", "EnvironmentFile", []): - for name, value in self.read_env_file(self.expand_special(env_file, conf)): - env[name] = self.expand_env(value, env) - logg.debug("extra-vars %s", self.extra_vars()) - for extra in self.extra_vars(): - if extra.startswith("@"): - for name, value in self.read_env_file(extra[1:]): - logg.info("override %s=%s", name, value) - env[name] = self.expand_env(value, env) - else: - for name, value in self.read_env_part(extra): - logg.info("override %s=%s", name, value) - env[name] = value # a '$word' is not special here - return env - def expand_env(self, cmd, env): - def get_env1(m): - if m.group(1) in env: - return env[m.group(1)] - logg.debug("can not expand $%s", m.group(1)) - return "" # empty string - def get_env2(m): - if m.group(1) in env: - return env[m.group(1)] - logg.debug("can not expand ${%s}", m.group(1)) - return "" # empty string - # - maxdepth = 20 - expanded = re.sub("[$](\w+)", lambda m: get_env1(m), cmd.replace("\\\n","")) - for depth in xrange(maxdepth): - new_text = re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), expanded) - if new_text == expanded: - return expanded - expanded = new_text - logg.error("shell variable expansion exceeded maxdepth %s", maxdepth) - return expanded - def expand_special(self, cmd, conf = None): - """ expand %i %t and similar special vars. They are being expanded - before any other expand_env takes place which handles shell-style - $HOME references. """ - def sh_escape(value): - return "'" + value.replace("'","\\'") + "'" - def get_confs(conf): - confs={ "%": "%" } - if not conf: - return confs - unit = parse_unit(conf.name()) - confs["N"] = unit.name - confs["n"] = sh_escape(unit.name) - confs["P"] = unit.prefix - confs["p"] = sh_escape(unit.prefix) - confs["I"] = unit.instance - confs["i"] = sh_escape(unit.instance) - confs["J"] = unit.component - confs["j"] = sh_escape(unit.component) - confs["f"] = sh_escape(conf.filename()) - VARTMP = "/var/tmp" - TMP = "/tmp" - RUN = "/run" - DAT = "/var/lib" - LOG = "/var/log" - CACHE = "/var/cache" - CONFIG = "/etc" - HOME = "/root" - USER = "root" - UID = 0 - SHELL = "/bin/sh" - if self.is_user_conf(conf): - USER = os_getlogin() - HOME = get_home() - RUN = os.environ.get("XDG_RUNTIME_DIR", get_runtime_dir()) - CONFIG = os.environ.get("XDG_CONFIG_HOME", HOME + "/.config") - CACHE = os.environ.get("XDG_CACHE_HOME", HOME + "/.cache") - SHARE = os.environ.get("XDG_DATA_HOME", HOME + "/.local/share") - DAT = CONFIG - LOG = os.path.join(CONFIG, "log") - SHELL = os.environ.get("SHELL", SHELL) - VARTMP = os.environ.get("TMPDIR", os.environ.get("TEMP", os.environ.get("TMP", VARTMP))) - TMP = os.environ.get("TMPDIR", os.environ.get("TEMP", os.environ.get("TMP", TMP))) - confs["V"] = os_path(self._root, VARTMP) - confs["T"] = os_path(self._root, TMP) - confs["t"] = os_path(self._root, RUN) - confs["S"] = os_path(self._root, DAT) - confs["s"] = SHELL - confs["h"] = HOME - confs["u"] = USER - confs["C"] = os_path(self._root, CACHE) - confs["E"] = os_path(self._root, CONFIG) - return confs - def get_conf1(m): - confs = get_confs(conf) - if m.group(1) in confs: - return confs[m.group(1)] - logg.warning("can not expand %%%s", m.group(1)) - return "''" # empty escaped string - return re.sub("[%](.)", lambda m: get_conf1(m), cmd) - def exec_cmd(self, cmd, env, conf = None): - """ expand ExecCmd statements including %i and $MAINPID """ - cmd1 = cmd.replace("\\\n","") - # according to documentation the %n / %% need to be expanded where in - # most cases they are shell-escaped values. So we do it before shlex. - cmd2 = self.expand_special(cmd1, conf) - # according to documentation, when bar="one two" then the expansion - # of '$bar' is ["one","two"] and '${bar}' becomes ["one two"]. We - # tackle that by expand $bar before shlex, and the rest thereafter. - def get_env1(m): - if m.group(1) in env: - return env[m.group(1)] - logg.debug("can not expand $%s", m.group(1)) - return "" # empty string - def get_env2(m): - if m.group(1) in env: - return env[m.group(1)] - logg.debug("can not expand ${%s}", m.group(1)) - return "" # empty string - cmd3 = re.sub("[$](\w+)", lambda m: get_env1(m), cmd2) - newcmd = [] - for part in shlex.split(cmd3): - newcmd += [ re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), part) ] - return newcmd - def path_journal_log(self, conf): # never None - """ /var/log/zzz.service.log or /var/log/default.unit.log """ - filename = os.path.basename(conf.filename() or "") - unitname = (conf.name() or "default")+".unit" - name = filename or unitname - log_folder = conf.os_path_var(self._journal_log_folder) - log_file = name.replace(os.path.sep,".") + ".log" - if log_file.startswith("."): - log_file = "dot."+log_file - return os.path.join(log_folder, log_file) - def open_journal_log(self, conf): - log_file = self.path_journal_log(conf) - log_folder = os.path.dirname(log_file) - if not os.path.isdir(log_folder): - os.makedirs(log_folder) - return open(os.path.join(log_file), "a") - def chdir_workingdir(self, conf): - """ if specified then change the working directory """ - # the original systemd will start in '/' even if User= is given - if self._root: - os.chdir(self._root) - workingdir = conf.get("Service", "WorkingDirectory", "") - if workingdir: - ignore = False - if workingdir.startswith("-"): - workingdir = workingdir[1:] - ignore = True - into = os_path(self._root, self.expand_special(workingdir, conf)) - try: - logg.debug("chdir workingdir '%s'", into) - os.chdir(into) - return False - except Exception as e: - if not ignore: - logg.error("chdir workingdir '%s': %s", into, e) - return into - else: - logg.debug("chdir workingdir '%s': %s", into, e) - return None - return None - def notify_socket_from(self, conf, socketfile = None): - """ creates a notify-socket for the (non-privileged) user """ - NotifySocket = collections.namedtuple("NotifySocket", ["socket", "socketfile" ]) - notify_socket_folder = conf.os_path_var(_notify_socket_folder) - notify_name = "notify." + str(conf.name() or "systemctl") - notify_socket = os.path.join(notify_socket_folder, notify_name) - socketfile = socketfile or notify_socket - if len(socketfile) > 100: - logg.debug("https://unix.stackexchange.com/questions/367008/%s", - "why-is-socket-path-length-limited-to-a-hundred-chars") - logg.debug("old notify socketfile (%s) = %s", len(socketfile), socketfile) - notify_socket_folder = re.sub("^(/var)?", get_runtime_dir(), _notify_socket_folder) - notify_name = notify_name[0:min(100-len(notify_socket_folder),len(notify_name))] - socketfile = os.path.join(notify_socket_folder, notify_name) - # occurs during testsuite.py for ~user/test.tmp/root path - logg.info("new notify socketfile (%s) = %s", len(socketfile), socketfile) - try: - if not os.path.isdir(os.path.dirname(socketfile)): - os.makedirs(os.path.dirname(socketfile)) - if os.path.exists(socketfile): - os.unlink(socketfile) - except Exception as e: - logg.warning("error %s: %s", socketfile, e) - sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) - sock.bind(socketfile) - os.chmod(socketfile, 0o777) # the service my run under some User=setting - return NotifySocket(sock, socketfile) - def read_notify_socket(self, notify, timeout): - notify.socket.settimeout(timeout or DefaultMaximumTimeout) - result = "" - try: - result, client_address = notify.socket.recvfrom(4096) - if result: - result = result.decode("utf-8") - result_txt = result.replace("\n","|") - result_len = len(result) - logg.debug("read_notify_socket(%s):%s", result_len, result_txt) - except socket.timeout as e: - if timeout > 2: - logg.debug("socket.timeout %s", e) - return result - def wait_notify_socket(self, notify, timeout, pid = None): - if not os.path.exists(notify.socketfile): - logg.info("no $NOTIFY_SOCKET exists") - return {} - # - logg.info("wait $NOTIFY_SOCKET, timeout %s", timeout) - results = {} - seenREADY = None - for attempt in xrange(timeout+1): - if pid and not self.is_active_pid(pid): - logg.info("dead PID %s", pid) - return results - if not attempt: # first one - time.sleep(1) # until TimeoutStartSec - continue - result = self.read_notify_socket(notify, 1) # sleep max 1 second - if not result: # timeout - time.sleep(1) # until TimeoutStartSec - continue - for name, value in self.read_env_part(result): - results[name] = value - if name == "READY": - seenREADY = value - if name in ["STATUS", "ACTIVESTATE"]: - logg.debug("%s: %s", name, value) # TODO: update STATUS -> SubState - if seenREADY: - break - if not seenREADY: - logg.info(".... timeout while waiting for 'READY=1' status on $NOTIFY_SOCKET") - logg.debug("notify = %s", results) - try: - notify.socket.close() - except Exception as e: - logg.debug("socket.close %s", e) - return results - def start_modules(self, *modules): - """ [UNIT]... -- start these units - /// SPECIAL: with --now or --init it will - run the init-loop and stop the units afterwards """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - init = self._now or self._init - return self.start_units(units, init) and found_all - def start_units(self, units, init = None): - """ fails if any unit does not start - /// SPECIAL: may run the init-loop and - stop the named units afterwards """ - self.wait_system() - done = True - started_units = [] - for unit in self.sortedAfter(units): - started_units.append(unit) - if not self.start_unit(unit): - done = False - if init: - logg.info("init-loop start") - sig = self.init_loop_until_stop(started_units) - logg.info("init-loop %s", sig) - for unit in reversed(started_units): - self.stop_unit(unit) - return done - def start_unit(self, unit): - conf = self.load_unit_conf(unit) - if conf is None: - logg.debug("unit could not be loaded (%s)", unit) - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.start_unit_from(conf) - def get_TimeoutStartSec(self, conf): - timeout = conf.get("Service", "TimeoutSec", DefaultTimeoutStartSec) - timeout = conf.get("Service", "TimeoutStartSec", timeout) - return time_to_seconds(timeout, DefaultMaximumTimeout) - def start_unit_from(self, conf): - if not conf: return False - if self.syntax_check(conf) > 100: return False - with waitlock(conf): - logg.debug(" start unit %s => %s", conf.name(), conf.filename()) - return self.do_start_unit_from(conf) - def do_start_unit_from(self, conf): - timeout = self.get_TimeoutStartSec(conf) - doRemainAfterExit = conf.getbool("Service", "RemainAfterExit", "no") - runs = conf.get("Service", "Type", "simple").lower() - env = self.get_env(conf) - self.exec_check_service(conf, env, "Exec") # all... - # for StopPost on failure: - returncode = 0 - service_result = "success" - if True: - if runs in [ "simple", "forking", "notify" ]: - env["MAINPID"] = str(self.read_mainpid_from(conf, "")) - for cmd in conf.getlist("Service", "ExecStartPre", []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info(" pre-start %s", shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - logg.debug(" pre-start done (%s) <-%s>", - run.returncode or "OK", run.signal or "") - if run.returncode and check: - logg.error("the ExecStartPre control process exited with error code") - active = "failed" - self.write_status_from(conf, AS=active ) - return False - if runs in [ "sysv" ]: - status_file = self.status_file_from(conf) - if True: - exe = conf.filename() - cmd = "'%s' start" % exe - env["SYSTEMCTL_SKIP_REDIRECT"] = "yes" - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s start %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: # pragma: no cover - os.setsid() # detach child process from parent - self.execve_from(conf, newcmd, env) - run = subprocess_waitpid(forkpid) - self.set_status_from(conf, "ExecMainCode", run.returncode) - logg.info("%s start done (%s) <-%s>", runs, - run.returncode or "OK", run.signal or "") - active = run.returncode and "failed" or "active" - self.write_status_from(conf, AS=active ) - return True - elif runs in [ "oneshot" ]: - status_file = self.status_file_from(conf) - if self.get_status_from(conf, "ActiveState", "unknown") == "active": - logg.warning("the service was already up once") - return True - for cmd in conf.getlist("Service", "ExecStart", []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s start %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: # pragma: no cover - os.setsid() # detach child process from parent - self.execve_from(conf, newcmd, env) - run = subprocess_waitpid(forkpid) - if run.returncode and check: - returncode = run.returncode - service_result = "failed" - logg.error("%s start %s (%s) <-%s>", runs, service_result, - run.returncode or "OK", run.signal or "") - break - logg.info("%s start done (%s) <-%s>", runs, - run.returncode or "OK", run.signal or "") - if True: - self.set_status_from(conf, "ExecMainCode", returncode) - active = returncode and "failed" or "active" - self.write_status_from(conf, AS=active) - elif runs in [ "simple" ]: - status_file = self.status_file_from(conf) - pid = self.read_mainpid_from(conf, "") - if self.is_active_pid(pid): - logg.warning("the service is already running on PID %s", pid) - return True - if doRemainAfterExit: - logg.debug("%s RemainAfterExit -> AS=active", runs) - self.write_status_from(conf, AS="active") - cmdlist = conf.getlist("Service", "ExecStart", []) - for idx, cmd in enumerate(cmdlist): - logg.debug("ExecStart[%s]: %s", idx, cmd) - for cmd in cmdlist: - pid = self.read_mainpid_from(conf, "") - env["MAINPID"] = str(pid) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s start %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: # pragma: no cover - os.setsid() # detach child process from parent - self.execve_from(conf, newcmd, env) - self.write_status_from(conf, MainPID=forkpid) - logg.info("%s started PID %s", runs, forkpid) - env["MAINPID"] = str(forkpid) - time.sleep(MinimumYield) - run = subprocess_testpid(forkpid) - if run.returncode is not None: - logg.info("%s stopped PID %s (%s) <-%s>", runs, run.pid, - run.returncode or "OK", run.signal or "") - if doRemainAfterExit: - self.set_status_from(conf, "ExecMainCode", run.returncode) - active = run.returncode and "failed" or "active" - self.write_status_from(conf, AS=active) - if run.returncode: - service_result = "failed" - break - elif runs in [ "notify" ]: - # "notify" is the same as "simple" but we create a $NOTIFY_SOCKET - # and wait for startup completion by checking the socket messages - pid = self.read_mainpid_from(conf, "") - if self.is_active_pid(pid): - logg.error("the service is already running on PID %s", pid) - return False - notify = self.notify_socket_from(conf) - if notify: - env["NOTIFY_SOCKET"] = notify.socketfile - logg.debug("use NOTIFY_SOCKET=%s", notify.socketfile) - if doRemainAfterExit: - logg.debug("%s RemainAfterExit -> AS=active", runs) - self.write_status_from(conf, AS="active") - cmdlist = conf.getlist("Service", "ExecStart", []) - for idx, cmd in enumerate(cmdlist): - logg.debug("ExecStart[%s]: %s", idx, cmd) - mainpid = None - for cmd in cmdlist: - mainpid = self.read_mainpid_from(conf, "") - env["MAINPID"] = str(mainpid) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s start %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: # pragma: no cover - os.setsid() # detach child process from parent - self.execve_from(conf, newcmd, env) - # via NOTIFY # self.write_status_from(conf, MainPID=forkpid) - logg.info("%s started PID %s", runs, forkpid) - mainpid = forkpid - self.write_status_from(conf, MainPID=mainpid) - env["MAINPID"] = str(mainpid) - time.sleep(MinimumYield) - run = subprocess_testpid(forkpid) - if run.returncode is not None: - logg.info("%s stopped PID %s (%s) <-%s>", runs, run.pid, - run.returncode or "OK", run.signal or "") - if doRemainAfterExit: - self.set_status_from(conf, "ExecMainCode", run.returncode or 0) - active = run.returncode and "failed" or "active" - self.write_status_from(conf, AS=active) - if run.returncode: - service_result = "failed" - break - if service_result in [ "success" ] and mainpid: - logg.debug("okay, wating on socket for %ss", timeout) - results = self.wait_notify_socket(notify, timeout, mainpid) - if "MAINPID" in results: - new_pid = results["MAINPID"] - if new_pid and to_int(new_pid) != mainpid: - logg.info("NEW PID %s from sd_notify (was PID %s)", new_pid, mainpid) - self.write_status_from(conf, MainPID=new_pid) - mainpid = new_pid - logg.info("%s start done %s", runs, mainpid) - pid = self.read_mainpid_from(conf, "") - if pid: - env["MAINPID"] = str(pid) - else: - service_result = "timeout" # "could not start service" - elif runs in [ "forking" ]: - pid_file = self.pid_file_from(conf) - for cmd in conf.getlist("Service", "ExecStart", []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - if not newcmd: continue - logg.info("%s start %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: # pragma: no cover - os.setsid() # detach child process from parent - self.execve_from(conf, newcmd, env) - logg.info("%s started PID %s", runs, forkpid) - run = subprocess_waitpid(forkpid) - if run.returncode and check: - returncode = run.returncode - service_result = "failed" - logg.info("%s stopped PID %s (%s) <-%s>", runs, run.pid, - run.returncode or "OK", run.signal or "") - if pid_file and service_result in [ "success" ]: - pid = self.wait_pid_file(pid_file) # application PIDFile - logg.info("%s start done PID %s [%s]", runs, pid, pid_file) - if pid: - env["MAINPID"] = str(pid) - if not pid_file: - time.sleep(MinimumTimeoutStartSec) - logg.warning("No PIDFile for forking %s", conf.filename()) - status_file = self.status_file_from(conf) - self.set_status_from(conf, "ExecMainCode", returncode) - active = returncode and "failed" or "active" - self.write_status_from(conf, AS=active) - else: - logg.error("unsupported run type '%s'", runs) - return False - # POST sequence - active = self.is_active_from(conf) - if not active: - logg.warning("%s start not active", runs) - # according to the systemd documentation, a failed start-sequence - # should execute the ExecStopPost sequence allowing some cleanup. - env["SERVICE_RESULT"] = service_result - for cmd in conf.getlist("Service", "ExecStopPost", []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("post-fail %s", shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - logg.debug("post-fail done (%s) <-%s>", - run.returncode or "OK", run.signal or "") - return False - else: - for cmd in conf.getlist("Service", "ExecStartPost", []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("post-start %s", shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - logg.debug("post-start done (%s) <-%s>", - run.returncode or "OK", run.signal or "") - return True - def extend_exec_env(self, env): - env = env.copy() - # implant DefaultPath into $PATH - path = env.get("PATH", DefaultPath) - parts = path.split(os.pathsep) - for part in DefaultPath.split(os.pathsep): - if part and part not in parts: - parts.append(part) - env["PATH"] = str(os.pathsep).join(parts) - # reset locale to system default - for name in ResetLocale: - if name in env: - del env[name] - locale = {} - for var, val in self.read_env_file("/etc/locale.conf"): - locale[var] = val - env[var] = val - if "LANG" not in locale: - env["LANG"] = locale.get("LANGUAGE", locale.get("LC_CTYPE", "C")) - return env - def execve_from(self, conf, cmd, env): - """ this code is commonly run in a child process // returns exit-code""" - runs = conf.get("Service", "Type", "simple").lower() - logg.debug("%s process for %s", runs, conf.filename()) - inp = open("/dev/zero") - out = self.open_journal_log(conf) - os.dup2(inp.fileno(), sys.stdin.fileno()) - os.dup2(out.fileno(), sys.stdout.fileno()) - os.dup2(out.fileno(), sys.stderr.fileno()) - runuser = self.expand_special(conf.get("Service", "User", ""), conf) - rungroup = self.expand_special(conf.get("Service", "Group", ""), conf) - envs = shutil_setuid(runuser, rungroup) - badpath = self.chdir_workingdir(conf) # some dirs need setuid before - if badpath: - logg.error("(%s): bad workingdir: '%s'", shell_cmd(cmd), badpath) - sys.exit(1) - env = self.extend_exec_env(env) - env.update(envs) # set $HOME to ~$USER - try: - if "spawn" in COVERAGE: - os.spawnvpe(os.P_WAIT, cmd[0], cmd, env) - sys.exit(0) - else: # pragma: nocover - os.execve(cmd[0], cmd, env) - except Exception as e: - logg.error("(%s): %s", shell_cmd(cmd), e) - sys.exit(1) - def test_start_unit(self, unit): - """ helper function to test the code that is normally forked off """ - conf = self.load_unit_conf(unit) - env = self.get_env(conf) - for cmd in conf.getlist("Service", "ExecStart", []): - newcmd = self.exec_cmd(cmd, env, conf) - return self.execve_from(conf, newcmd, env) - return None - def stop_modules(self, *modules): - """ [UNIT]... -- stop these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.stop_units(units) and found_all - def stop_units(self, units): - """ fails if any unit fails to stop """ - self.wait_system() - done = True - for unit in self.sortedBefore(units): - if not self.stop_unit(unit): - done = False - return done - def stop_unit(self, unit): - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.stop_unit_from(conf) - - def get_TimeoutStopSec(self, conf): - timeout = conf.get("Service", "TimeoutSec", DefaultTimeoutStartSec) - timeout = conf.get("Service", "TimeoutStopSec", timeout) - return time_to_seconds(timeout, DefaultMaximumTimeout) - def stop_unit_from(self, conf): - if not conf: return False - if self.syntax_check(conf) > 100: return False - with waitlock(conf): - logg.info(" stop unit %s => %s", conf.name(), conf.filename()) - return self.do_stop_unit_from(conf) - def do_stop_unit_from(self, conf): - timeout = self.get_TimeoutStopSec(conf) - runs = conf.get("Service", "Type", "simple").lower() - env = self.get_env(conf) - self.exec_check_service(conf, env, "ExecStop") - returncode = 0 - service_result = "success" - if runs in [ "sysv" ]: - status_file = self.status_file_from(conf) - if True: - exe = conf.filename() - cmd = "'%s' stop" % exe - env["SYSTEMCTL_SKIP_REDIRECT"] = "yes" - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s stop %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - if run.returncode: - self.set_status_from(conf, "ExecStopCode", run.returncode) - self.write_status_from(conf, AS="failed") - else: - self.clean_status_from(conf) # "inactive" - return True - elif runs in [ "oneshot" ]: - status_file = self.status_file_from(conf) - if self.get_status_from(conf, "ActiveState", "unknown") == "inactive": - logg.warning("the service is already down once") - return True - for cmd in conf.getlist("Service", "ExecStop", []): - check, cmd = checkstatus(cmd) - logg.debug("{env} %s", env) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s stop %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - if run.returncode and check: - returncode = run.returncode - service_result = "failed" - break - if True: - if returncode: - self.set_status_from(conf, "ExecStopCode", returncode) - self.write_status_from(conf, AS="failed") - else: - self.clean_status_from(conf) # "inactive" - ### fallback Stop => Kill for ["simple","notify","forking"] - elif not conf.getlist("Service", "ExecStop", []): - logg.info("no ExecStop => systemctl kill") - if True: - self.do_kill_unit_from(conf) - self.clean_pid_file_from(conf) - self.clean_status_from(conf) # "inactive" - elif runs in [ "simple", "notify" ]: - status_file = self.status_file_from(conf) - size = os.path.exists(status_file) and os.path.getsize(status_file) - logg.info("STATUS %s %s", status_file, size) - pid = 0 - for cmd in conf.getlist("Service", "ExecStop", []): - check, cmd = checkstatus(cmd) - env["MAINPID"] = str(self.read_mainpid_from(conf, "")) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s stop %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - run = must_have_failed(run, newcmd) # TODO: a workaround - # self.write_status_from(conf, MainPID=run.pid) # no ExecStop - if run.returncode and check: - returncode = run.returncode - service_result = "failed" - break - pid = env.get("MAINPID",0) - if pid: - if self.wait_vanished_pid(pid, timeout): - self.clean_pid_file_from(conf) - self.clean_status_from(conf) # "inactive" - else: - logg.info("%s sleep as no PID was found on Stop", runs) - time.sleep(MinimumTimeoutStopSec) - pid = self.read_mainpid_from(conf, "") - if not pid or not pid_exists(pid) or pid_zombie(pid): - self.clean_pid_file_from(conf) - self.clean_status_from(conf) # "inactive" - elif runs in [ "forking" ]: - status_file = self.status_file_from(conf) - pid_file = self.pid_file_from(conf) - for cmd in conf.getlist("Service", "ExecStop", []): - active = self.is_active_from(conf) - if pid_file: - new_pid = self.read_mainpid_from(conf, "") - if new_pid: - env["MAINPID"] = str(new_pid) - check, cmd = checkstatus(cmd) - logg.debug("{env} %s", env) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("fork stop %s", shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - if run.returncode and check: - returncode = run.returncode - service_result = "failed" - break - pid = env.get("MAINPID",0) - if pid: - if self.wait_vanished_pid(pid, timeout): - self.clean_pid_file_from(conf) - else: - logg.info("%s sleep as no PID was found on Stop", runs) - time.sleep(MinimumTimeoutStopSec) - pid = self.read_mainpid_from(conf, "") - if not pid or not pid_exists(pid) or pid_zombie(pid): - self.clean_pid_file_from(conf) - if returncode: - if os.path.isfile(status_file): - self.set_status_from(conf, "ExecStopCode", returncode) - self.write_status_from(conf, AS="failed") - else: - self.clean_status_from(conf) # "inactive" - else: - logg.error("unsupported run type '%s'", runs) - return False - # POST sequence - active = self.is_active_from(conf) - if not active: - env["SERVICE_RESULT"] = service_result - for cmd in conf.getlist("Service", "ExecStopPost", []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("post-stop %s", shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - logg.debug("post-stop done (%s) <-%s>", - run.returncode or "OK", run.signal or "") - return service_result == "success" - def wait_vanished_pid(self, pid, timeout): - if not pid: - return True - logg.info("wait for PID %s to vanish (%ss)", pid, timeout) - for x in xrange(int(timeout)): - if not self.is_active_pid(pid): - logg.info("wait for PID %s is done (%s.)", pid, x) - return True - time.sleep(1) # until TimeoutStopSec - logg.info("wait for PID %s failed (%s.)", pid, x) - return False - def reload_modules(self, *modules): - """ [UNIT]... -- reload these units """ - self.wait_system() - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.reload_units(units) and found_all - def reload_units(self, units): - """ fails if any unit fails to reload """ - self.wait_system() - done = True - for unit in self.sortedAfter(units): - if not self.reload_unit(unit): - done = False - return done - def reload_unit(self, unit): - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.reload_unit_from(conf) - def reload_unit_from(self, conf): - if not conf: return False - if self.syntax_check(conf) > 100: return False - with waitlock(conf): - logg.info(" reload unit %s => %s", conf.name(), conf.filename()) - return self.do_reload_unit_from(conf) - def do_reload_unit_from(self, conf): - runs = conf.get("Service", "Type", "simple").lower() - env = self.get_env(conf) - self.exec_check_service(conf, env, "ExecReload") - if runs in [ "sysv" ]: - status_file = self.status_file_from(conf) - if True: - exe = conf.filename() - cmd = "'%s' reload" % exe - env["SYSTEMCTL_SKIP_REDIRECT"] = "yes" - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s reload %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - self.set_status_from(conf, "ExecReloadCode", run.returncode) - if run.returncode: - self.write_status_from(conf, AS="failed") - return False - else: - self.write_status_from(conf, AS="active") - return True - elif runs in [ "simple", "notify", "forking" ]: - if not self.is_active_from(conf): - logg.info("no reload on inactive service %s", conf.name()) - return True - for cmd in conf.getlist("Service", "ExecReload", []): - env["MAINPID"] = str(self.read_mainpid_from(conf, "")) - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - logg.info("%s reload %s", runs, shell_cmd(newcmd)) - forkpid = os.fork() - if not forkpid: - self.execve_from(conf, newcmd, env) # pragma: nocover - run = subprocess_waitpid(forkpid) - if check and run.returncode: - logg.error("Job for %s failed because the control process exited with error code. (%s)", - conf.name(), run.returncode) - return False - time.sleep(MinimumYield) - return True - elif runs in [ "oneshot" ]: - logg.debug("ignored run type '%s' for reload", runs) - return True - else: - logg.error("unsupported run type '%s'", runs) - return False - def restart_modules(self, *modules): - """ [UNIT]... -- restart these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.restart_units(units) and found_all - def restart_units(self, units): - """ fails if any unit fails to restart """ - self.wait_system() - done = True - for unit in self.sortedAfter(units): - if not self.restart_unit(unit): - done = False - return done - def restart_unit(self, unit): - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.restart_unit_from(conf) - def restart_unit_from(self, conf): - if not conf: return False - if self.syntax_check(conf) > 100: return False - with waitlock(conf): - logg.info(" restart unit %s => %s", conf.name(), conf.filename()) - if not self.is_active_from(conf): - return self.do_start_unit_from(conf) - else: - return self.do_restart_unit_from(conf) - def do_restart_unit_from(self, conf): - logg.info("(restart) => stop/start") - self.do_stop_unit_from(conf) - return self.do_start_unit_from(conf) - def try_restart_modules(self, *modules): - """ [UNIT]... -- try-restart these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.try_restart_units(units) and found_all - def try_restart_units(self, units): - """ fails if any module fails to try-restart """ - self.wait_system() - done = True - for unit in self.sortedAfter(units): - if not self.try_restart_unit(unit): - done = False - return done - def try_restart_unit(self, unit): - """ only do 'restart' if 'active' """ - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - with waitlock(conf): - logg.info(" try-restart unit %s => %s", conf.name(), conf.filename()) - if self.is_active_from(conf): - return self.do_restart_unit_from(conf) - return True - def reload_or_restart_modules(self, *modules): - """ [UNIT]... -- reload-or-restart these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.reload_or_restart_units(units) and found_all - def reload_or_restart_units(self, units): - """ fails if any unit does not reload-or-restart """ - self.wait_system() - done = True - for unit in self.sortedAfter(units): - if not self.reload_or_restart_unit(unit): - done = False - return done - def reload_or_restart_unit(self, unit): - """ do 'reload' if specified, otherwise do 'restart' """ - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.reload_or_restart_unit_from(conf) - def reload_or_restart_unit_from(self, conf): - """ do 'reload' if specified, otherwise do 'restart' """ - if not conf: return False - with waitlock(conf): - logg.info(" reload-or-restart unit %s => %s", conf.name(), conf.filename()) - return self.do_reload_or_restart_unit_from(conf) - def do_reload_or_restart_unit_from(self, conf): - if not self.is_active_from(conf): - # try: self.stop_unit_from(conf) - # except Exception as e: pass - return self.do_start_unit_from(conf) - elif conf.getlist("Service", "ExecReload", []): - logg.info("found service to have ExecReload -> 'reload'") - return self.do_reload_unit_from(conf) - else: - logg.info("found service without ExecReload -> 'restart'") - return self.do_restart_unit_from(conf) - def reload_or_try_restart_modules(self, *modules): - """ [UNIT]... -- reload-or-try-restart these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.reload_or_try_restart_units(units) and found_all - def reload_or_try_restart_units(self, units): - """ fails if any unit fails to reload-or-try-restart """ - self.wait_system() - done = True - for unit in self.sortedAfter(units): - if not self.reload_or_try_restart_unit(unit): - done = False - return done - def reload_or_try_restart_unit(self, unit): - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.reload_or_try_restart_unit_from(conf) - def reload_or_try_restart_unit_from(self, conf): - with waitlock(conf): - logg.info(" reload-or-try-restart unit %s => %s", conf.name(), conf.filename()) - return self.do_reload_or_try_restart_unit_from(conf) - def do_reload_or_try_restart_unit_from(self, conf): - if conf.getlist("Service", "ExecReload", []): - return self.do_reload_unit_from(conf) - elif not self.is_active_from(conf): - return True - else: - return self.do_restart_unit_from(conf) - def kill_modules(self, *modules): - """ [UNIT]... -- kill these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.kill_units(units) and found_all - def kill_units(self, units): - """ fails if any unit could not be killed """ - self.wait_system() - done = True - for unit in self.sortedBefore(units): - if not self.kill_unit(unit): - done = False - return done - def kill_unit(self, unit): - conf = self.load_unit_conf(unit) - if conf is None: - logg.error("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.kill_unit_from(conf) - def kill_unit_from(self, conf): - if not conf: return False - with waitlock(conf): - logg.info(" kill unit %s => %s", conf.name(), conf.filename()) - return self.do_kill_unit_from(conf) - def do_kill_unit_from(self, conf): - started = time.time() - doSendSIGKILL = conf.getbool("Service", "SendSIGKILL", "yes") - doSendSIGHUP = conf.getbool("Service", "SendSIGHUP", "no") - useKillMode = conf.get("Service", "KillMode", "control-group") - useKillSignal = conf.get("Service", "KillSignal", "SIGTERM") - kill_signal = getattr(signal, useKillSignal) - timeout = self.get_TimeoutStopSec(conf) - status_file = self.status_file_from(conf) - size = os.path.exists(status_file) and os.path.getsize(status_file) - logg.info("STATUS %s %s", status_file, size) - mainpid = to_int(self.read_mainpid_from(conf, "")) - self.clean_status_from(conf) # clear RemainAfterExit and TimeoutStartSec - if not mainpid: - if useKillMode in ["control-group"]: - logg.warning("no main PID [%s]", conf.filename()) - logg.warning("and there is no control-group here") - else: - logg.info("no main PID [%s]", conf.filename()) - return False - if not pid_exists(mainpid) or pid_zombie(mainpid): - logg.debug("ignoring children when mainpid is already dead") - # because we list child processes, not processes in control-group - return True - pidlist = self.pidlist_of(mainpid) # here - if pid_exists(mainpid): - logg.info("stop kill PID %s", mainpid) - self._kill_pid(mainpid, kill_signal) - if useKillMode in ["control-group"]: - if len(pidlist) > 1: - logg.info("stop control-group PIDs %s", pidlist) - for pid in pidlist: - if pid != mainpid: - self._kill_pid(pid, kill_signal) - if doSendSIGHUP: - logg.info("stop SendSIGHUP to PIDs %s", pidlist) - for pid in pidlist: - self._kill_pid(pid, signal.SIGHUP) - # wait for the processes to have exited - while True: - dead = True - for pid in pidlist: - if pid_exists(pid) and not pid_zombie(pid): - dead = False - break - if dead: - break - if time.time() > started + timeout: - logg.info("service PIDs not stopped after %s", timeout) - break - time.sleep(1) # until TimeoutStopSec - if dead or not doSendSIGKILL: - logg.info("done kill PID %s %s", mainpid, dead and "OK") - return dead - if useKillMode in [ "control-group", "mixed" ]: - logg.info("hard kill PIDs %s", pidlist) - for pid in pidlist: - if pid != mainpid: - self._kill_pid(pid, signal.SIGKILL) - time.sleep(MinimumYield) - # useKillMode in [ "control-group", "mixed", "process" ] - if pid_exists(mainpid): - logg.info("hard kill PID %s", mainpid) - self._kill_pid(mainpid, signal.SIGKILL) - time.sleep(MinimumYield) - dead = not pid_exists(mainpid) or pid_zombie(mainpid) - logg.info("done hard kill PID %s %s", mainpid, dead and "OK") - return dead - def _kill_pid(self, pid, kill_signal = None): - try: - sig = kill_signal or signal.SIGTERM - os.kill(pid, sig) - except OSError as e: - if e.errno == errno.ESRCH or e.errno == errno.ENOENT: - logg.debug("kill PID %s => No such process", pid) - return True - else: - logg.error("kill PID %s => %s", pid, str(e)) - return False - return not pid_exists(pid) or pid_zombie(pid) - def is_active_modules(self, *modules): - """ [UNIT].. -- check if these units are in active state - implements True if all is-active = True """ - # systemctl returns multiple lines, one for each argument - # "active" when is_active - # "inactive" when not is_active - # "unknown" when not enabled - # The return code is set to - # 0 when "active" - # 1 when unit is not found - # 3 when any "inactive" or "unknown" - # However: # TODO!!!!! BUG in original systemctl!! - # documentation says " exit code 0 if at least one is active" - # and "Unless --quiet is specified, print the unit state" - units = [] - results = [] - for module in modules: - units = self.match_units([ module ]) - if not units: - logg.error("Unit %s could not be found.", unit_of(module)) - results += [ "unknown" ] - continue - for unit in units: - active = self.get_active_unit(unit) - enabled = self.enabled_unit(unit) - if enabled != "enabled": active = "unknown" - results += [ active ] - break - ## how it should work: - status = "active" in results - ## how 'systemctl' works: - non_active = [ result for result in results if result != "active" ] - status = not non_active - if not status: - status = 3 - if not _quiet: - return status, results - else: - return status - def is_active_from(self, conf): - """ used in try-restart/other commands to check if needed. """ - if not conf: return False - return self.get_active_from(conf) == "active" - def active_pid_from(self, conf): - if not conf: return False - pid = self.read_mainpid_from(conf, "") - return self.is_active_pid(pid) - def is_active_pid(self, pid): - """ returns pid if the pid is still an active process """ - if pid and pid_exists(pid) and not pid_zombie(pid): - return pid # usually a string (not null) - return None - def get_active_unit(self, unit): - """ returns 'active' 'inactive' 'failed' 'unknown' """ - conf = self.get_unit_conf(unit) - if not conf.loaded(): - logg.warning("Unit %s could not be found.", unit) - return "unknown" - else: - return self.get_active_from(conf) - def get_active_from(self, conf): - """ returns 'active' 'inactive' 'failed' 'unknown' """ - # used in try-restart/other commands to check if needed. - if not conf: return "unknown" - pid_file = self.pid_file_from(conf) - if pid_file: # application PIDFile - if not os.path.exists(pid_file): - return "inactive" - status_file = self.status_file_from(conf) - if self.getsize(status_file): - state = self.get_status_from(conf, "ActiveState", "") - if state: - logg.info("get_status_from %s => %s", conf.name(), state) - return state - pid = self.read_mainpid_from(conf, "") - logg.debug("pid_file '%s' => PID %s", pid_file or status_file, pid) - if pid: - if not pid_exists(pid) or pid_zombie(pid): - return "failed" - return "active" - else: - return "inactive" - def get_substate_from(self, conf): - """ returns 'running' 'exited' 'dead' 'failed' 'plugged' 'mounted' """ - if not conf: return False - pid_file = self.pid_file_from(conf) - if pid_file: - if not os.path.exists(pid_file): - return "dead" - status_file = self.status_file_from(conf) - if self.getsize(status_file): - state = self.get_status_from(conf, "ActiveState", "") - if state: - if state in [ "active" ]: - return self.get_status_from(conf, "SubState", "running") - else: - return self.get_status_from(conf, "SubState", "dead") - pid = self.read_mainpid_from(conf, "") - logg.debug("pid_file '%s' => PID %s", pid_file or status_file, pid) - if pid: - if not pid_exists(pid) or pid_zombie(pid): - return "failed" - return "running" - else: - return "dead" - def is_failed_modules(self, *modules): - """ [UNIT]... -- check if these units are in failes state - implements True if any is-active = True """ - units = [] - results = [] - for module in modules: - units = self.match_units([ module ]) - if not units: - logg.error("Unit %s could not be found.", unit_of(module)) - results += [ "unknown" ] - continue - for unit in units: - active = self.get_active_unit(unit) - enabled = self.enabled_unit(unit) - if enabled != "enabled": active = "unknown" - results += [ active ] - break - status = "failed" in results - if not _quiet: - return status, results - else: - return status - def is_failed_from(self, conf): - if conf is None: return True - return self.get_active_from(conf) == "failed" - def reset_failed_modules(self, *modules): - """ [UNIT]... -- Reset failed state for all, one, or more units """ - units = [] - status = True - for module in modules: - units = self.match_units([ module ]) - if not units: - logg.error("Unit %s could not be found.", unit_of(module)) - return 1 - for unit in units: - if not self.reset_failed_unit(unit): - logg.error("Unit %s could not be reset.", unit_of(module)) - status = False - break - return status - def reset_failed_unit(self, unit): - conf = self.get_unit_conf(unit) - if not conf.loaded(): - logg.warning("Unit %s could not be found.", unit) - return False - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - return self.reset_failed_from(conf) - def reset_failed_from(self, conf): - if conf is None: return True - if not self.is_failed_from(conf): return False - done = False - status_file = self.status_file_from(conf) - if status_file and os.path.exists(status_file): - try: - os.remove(status_file) - done = True - logg.debug("done rm %s", status_file) - except Exception as e: - logg.error("while rm %s: %s", status_file, e) - pid_file = self.pid_file_from(conf) - if pid_file and os.path.exists(pid_file): - try: - os.remove(pid_file) - done = True - logg.debug("done rm %s", pid_file) - except Exception as e: - logg.error("while rm %s: %s", pid_file, e) - return done - def status_modules(self, *modules): - """ [UNIT]... check the status of these units. - """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - status, result = self.status_units(units) - if not found_all: - status = 3 # same as (dead) # original behaviour - return (status, result) - def status_units(self, units): - """ concatenates the status output of all units - and the last non-successful statuscode """ - status, result = 0, "" - for unit in units: - status1, result1 = self.status_unit(unit) - if status1: status = status1 - if result: result += "\n\n" - result += result1 - return status, result - def status_unit(self, unit): - conf = self.get_unit_conf(unit) - result = "%s - %s" % (unit, self.get_description_from(conf)) - loaded = conf.loaded() - if loaded: - filename = conf.filename() - enabled = self.enabled_from(conf) - result += "\n Loaded: {loaded} ({filename}, {enabled})".format(**locals()) - for path in conf.overrides(): - result += "\n Drop-In: {path}".format(**locals()) - else: - result += "\n Loaded: failed" - return 3, result - active = self.get_active_from(conf) - substate = self.get_substate_from(conf) - result += "\n Active: {} ({})".format(active, substate) - if active == "active": - return 0, result - else: - return 3, result - def cat_modules(self, *modules): - """ [UNIT]... show the *.system file for these" - """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - done, result = self.cat_units(units) - return (done and found_all, result) - def cat_units(self, units): - done = True - result = "" - for unit in units: - text = self.cat_unit(unit) - if not text: - done = False - else: - if result: - result += "\n\n" - result += text - return done, result - def cat_unit(self, unit): - try: - unit_file = self.unit_file(unit) - if unit_file: - return open(unit_file).read() - logg.error("no file for unit '%s'", unit) - except Exception as e: - print("Unit {} is not-loaded: {}".format(unit, e)) - return False - ## - ## - def load_preset_files(self, module = None): # -> [ preset-file-names,... ] - """ reads all preset files, returns the scanned files """ - if self._preset_file_list is None: - self._preset_file_list = {} - for folder in self.preset_folders(): - if not folder: - continue - if self._root: - folder = os_path(self._root, folder) - if not os.path.isdir(folder): - continue - for name in os.listdir(folder): - if not name.endswith(".preset"): - continue - if name not in self._preset_file_list: - path = os.path.join(folder, name) - if os.path.isdir(path): - continue - preset = PresetFile().read(path) - self._preset_file_list[name] = preset - logg.debug("found %s preset files", len(self._preset_file_list)) - return sorted(self._preset_file_list.keys()) - def get_preset_of_unit(self, unit): - """ [UNIT] check the *.preset of this unit - """ - self.load_preset_files() - for filename in sorted(self._preset_file_list.keys()): - preset = self._preset_file_list[filename] - status = preset.get_preset(unit) - if status: - return status - return None - def preset_modules(self, *modules): - """ [UNIT]... -- set 'enabled' when in *.preset - """ - if self.user_mode(): - logg.warning("preset makes no sense in --user mode") - return True - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.preset_units(units) and found_all - def preset_units(self, units): - """ fails if any unit could not be changed """ - self.wait_system() - fails = 0 - found = 0 - for unit in units: - status = self.get_preset_of_unit(unit) - if not status: continue - found += 1 - if status.startswith("enable"): - if self._preset_mode == "disable": continue - logg.info("preset enable %s", unit) - if not self.enable_unit(unit): - logg.warning("failed to enable %s", unit) - fails += 1 - if status.startswith("disable"): - if self._preset_mode == "enable": continue - logg.info("preset disable %s", unit) - if not self.disable_unit(unit): - logg.warning("failed to disable %s", unit) - fails += 1 - return not fails and not not found - def system_preset_all(self, *modules): - """ 'preset' all services - enable or disable services according to *.preset files - """ - if self.user_mode(): - logg.warning("preset-all makes no sense in --user mode") - return True - found_all = True - units = self.match_units() # TODO: how to handle module arguments - return self.preset_units(units) and found_all - def wanted_from(self, conf, default = None): - if not conf: return default - return conf.get("Install", "WantedBy", default, True) - def enablefolders(self, wanted): - if self.user_mode(): - for folder in self.user_folders(): - yield self.default_enablefolder(wanted, folder) - if True: - for folder in self.system_folders(): - yield self.default_enablefolder(wanted, folder) - def enablefolder(self, wanted = None): - if self.user_mode(): - user_folder = self.user_folder() - return self.default_enablefolder(wanted, user_folder) - else: - return self.default_enablefolder(wanted) - def default_enablefolder(self, wanted = None, basefolder = None): - basefolder = basefolder or self.system_folder() - if not wanted: - return wanted - if not wanted.endswith(".wants"): - wanted = wanted + ".wants" - return os.path.join(basefolder, wanted) - def enable_modules(self, *modules): - """ [UNIT]... -- enable these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - logg.info("matched %s", unit) #++ - if unit not in units: - units += [ unit ] - return self.enable_units(units) and found_all - def enable_units(self, units): - self.wait_system() - done = True - for unit in units: - if not self.enable_unit(unit): - done = False - elif self._now: - self.start_unit(unit) - return done - def enable_unit(self, unit): - unit_file = self.unit_file(unit) - if not unit_file: - logg.error("Unit %s could not be found.", unit) - return False - if self.is_sysv_file(unit_file): - if self.user_mode(): - logg.error("Initscript %s not for --user mode", unit) - return False - return self.enable_unit_sysv(unit_file) - conf = self.get_unit_conf(unit) - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - wanted = self.wanted_from(self.get_unit_conf(unit)) - if not wanted: - return False # "static" is-enabled - folder = self.enablefolder(wanted) - if self._root: - folder = os_path(self._root, folder) - if not os.path.isdir(folder): - os.makedirs(folder) - target = os.path.join(folder, os.path.basename(unit_file)) - if True: - _f = self._force and "-f" or "" - logg.info("ln -s {_f} '{unit_file}' '{target}'".format(**locals())) - if self._force and os.path.islink(target): - os.remove(target) - if not os.path.islink(target): - os.symlink(unit_file, target) - return True - def rc3_root_folder(self): - old_folder = "/etc/rc3.d" - new_folder = "/etc/init.d/rc3.d" - if self._root: - old_folder = os_path(self._root, old_folder) - new_folder = os_path(self._root, new_folder) - if os.path.isdir(old_folder): - return old_folder - return new_folder - def rc5_root_folder(self): - old_folder = "/etc/rc5.d" - new_folder = "/etc/init.d/rc5.d" - if self._root: - old_folder = os_path(self._root, old_folder) - new_folder = os_path(self._root, new_folder) - if os.path.isdir(old_folder): - return old_folder - return new_folder - def enable_unit_sysv(self, unit_file): - # a "multi-user.target"/rc3 is also started in /rc5 - rc3 = self._enable_unit_sysv(unit_file, self.rc3_root_folder()) - rc5 = self._enable_unit_sysv(unit_file, self.rc5_root_folder()) - return rc3 and rc5 - def _enable_unit_sysv(self, unit_file, rc_folder): - name = os.path.basename(unit_file) - nameS = "S50"+name - nameK = "K50"+name - if not os.path.isdir(rc_folder): - os.makedirs(rc_folder) - # do not double existing entries - for found in os.listdir(rc_folder): - m = re.match(r"S\d\d(.*)", found) - if m and m.group(1) == name: - nameS = found - m = re.match(r"K\d\d(.*)", found) - if m and m.group(1) == name: - nameK = found - target = os.path.join(rc_folder, nameS) - if not os.path.exists(target): - os.symlink(unit_file, target) - target = os.path.join(rc_folder, nameK) - if not os.path.exists(target): - os.symlink(unit_file, target) - return True - def disable_modules(self, *modules): - """ [UNIT]... -- disable these units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.disable_units(units) and found_all - def disable_units(self, units): - self.wait_system() - done = True - for unit in units: - if not self.disable_unit(unit): - done = False - return done - def disable_unit(self, unit): - unit_file = self.unit_file(unit) - if not unit_file: - logg.error("Unit %s could not be found.", unit) - return False - if self.is_sysv_file(unit_file): - if self.user_mode(): - logg.error("Initscript %s not for --user mode", unit) - return False - return self.disable_unit_sysv(unit_file) - conf = self.get_unit_conf(unit) - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - wanted = self.wanted_from(self.get_unit_conf(unit)) - if not wanted: - return False # "static" is-enabled - for folder in self.enablefolders(wanted): - if self._root: - folder = os_path(self._root, folder) - target = os.path.join(folder, os.path.basename(unit_file)) - if os.path.isfile(target): - try: - _f = self._force and "-f" or "" - logg.info("rm {_f} '{target}'".format(**locals())) - os.remove(target) - except IOError as e: - logg.error("disable %s: %s", target, e) - except OSError as e: - logg.error("disable %s: %s", target, e) - return True - def disable_unit_sysv(self, unit_file): - rc3 = self._disable_unit_sysv(unit_file, self.rc3_root_folder()) - rc5 = self._disable_unit_sysv(unit_file, self.rc5_root_folder()) - return rc3 and rc5 - def _disable_unit_sysv(self, unit_file, rc_folder): - # a "multi-user.target"/rc3 is also started in /rc5 - name = os.path.basename(unit_file) - nameS = "S50"+name - nameK = "K50"+name - # do not forget the existing entries - for found in os.listdir(rc_folder): - m = re.match(r"S\d\d(.*)", found) - if m and m.group(1) == name: - nameS = found - m = re.match(r"K\d\d(.*)", found) - if m and m.group(1) == name: - nameK = found - target = os.path.join(rc_folder, nameS) - if os.path.exists(target): - os.unlink(target) - target = os.path.join(rc_folder, nameK) - if os.path.exists(target): - os.unlink(target) - return True - def is_enabled_sysv(self, unit_file): - name = os.path.basename(unit_file) - target = os.path.join(self.rc3_root_folder(), "S50%s" % name) - if os.path.exists(target): - return True - return False - def is_enabled_modules(self, *modules): - """ [UNIT]... -- check if these units are enabled - returns True if any of them is enabled.""" - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.is_enabled_units(units) # and found_all - def is_enabled_units(self, units): - """ true if any is enabled, and a list of infos """ - result = False - infos = [] - for unit in units: - infos += [ self.enabled_unit(unit) ] - if self.is_enabled(unit): - result = True - return result, infos - def is_enabled(self, unit): - unit_file = self.unit_file(unit) - if not unit_file: - logg.error("Unit %s could not be found.", unit) - return False - if self.is_sysv_file(unit_file): - return self.is_enabled_sysv(unit_file) - wanted = self.wanted_from(self.get_unit_conf(unit)) - if not wanted: - return True # "static" - for folder in self.enablefolders(wanted): - if self._root: - folder = os_path(self._root, folder) - target = os.path.join(folder, os.path.basename(unit_file)) - if os.path.isfile(target): - return True - return False - def enabled_unit(self, unit): - conf = self.get_unit_conf(unit) - return self.enabled_from(conf) - def enabled_from(self, conf): - unit_file = conf.filename() - if self.is_sysv_file(unit_file): - state = self.is_enabled_sysv(unit_file) - if state: - return "enabled" - return "disabled" - if conf.masked: - return "masked" - wanted = self.wanted_from(conf) - if not wanted: - return "static" - for folder in self.enablefolders(wanted): - if self._root: - folder = os_path(self._root, folder) - target = os.path.join(folder, os.path.basename(unit_file)) - if os.path.isfile(target): - return "enabled" - return "disabled" - def mask_modules(self, *modules): - """ [UNIT]... -- mask non-startable units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.mask_units(units) and found_all - def mask_units(self, units): - self.wait_system() - done = True - for unit in units: - if not self.mask_unit(unit): - done = False - return done - def mask_unit(self, unit): - unit_file = self.unit_file(unit) - if not unit_file: - logg.error("Unit %s could not be found.", unit) - return False - if self.is_sysv_file(unit_file): - logg.error("Initscript %s can not be masked", unit) - return False - conf = self.get_unit_conf(unit) - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - folder = self.mask_folder() - if self._root: - folder = os_path(self._root, folder) - if not os.path.isdir(folder): - os.makedirs(folder) - target = os.path.join(folder, os.path.basename(unit_file)) - if True: - _f = self._force and "-f" or "" - logg.debug("ln -s {_f} /dev/null '{target}'".format(**locals())) - if self._force and os.path.islink(target): - os.remove(target) - if not os.path.exists(target): - os.symlink("/dev/null", target) - logg.info("Created symlink {target} -> /dev/null".format(**locals())) - return True - elif os.path.islink(target): - logg.debug("mask symlink does already exist: %s", target) - return True - else: - logg.error("mask target does already exist: %s", target) - return False - def mask_folder(self): - for folder in self.mask_folders(): - if folder: return folder - raise Exception("did not find any systemd/system folder") - def mask_folders(self): - if self.user_mode(): - for folder in self.user_folders(): - yield folder - if True: - for folder in self.system_folders(): - yield folder - def unmask_modules(self, *modules): - """ [UNIT]... -- unmask non-startable units """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.unmask_units(units) and found_all - def unmask_units(self, units): - self.wait_system() - done = True - for unit in units: - if not self.unmask_unit(unit): - done = False - return done - def unmask_unit(self, unit): - unit_file = self.unit_file(unit) - if not unit_file: - logg.error("Unit %s could not be found.", unit) - return False - if self.is_sysv_file(unit_file): - logg.error("Initscript %s can not be un/masked", unit) - return False - conf = self.get_unit_conf(unit) - if self.not_user_conf(conf): - logg.error("Unit %s not for --user mode", unit) - return False - folder = self.mask_folder() - if self._root: - folder = os_path(self._root, folder) - target = os.path.join(folder, os.path.basename(unit_file)) - if True: - _f = self._force and "-f" or "" - logg.info("rm {_f} '{target}'".format(**locals())) - if os.path.islink(target): - os.remove(target) - return True - elif not os.path.exists(target): - logg.debug("Symlink did exist anymore: %s", target) - return True - else: - logg.warning("target is not a symlink: %s", target) - return True - def list_dependencies_modules(self, *modules): - """ [UNIT]... show the dependency tree" - """ - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.list_dependencies_units(units) # and found_all - def list_dependencies_units(self, units): - if self._now: - return self.list_start_dependencies_units(units) - result = [] - for unit in units: - if result: - result += [ "", "" ] - result += self.list_dependencies_unit(unit) - return result - def list_dependencies_unit(self, unit): - result = [] - for line in self.list_dependencies(unit, ""): - result += [ line ] - return result - def list_dependencies(self, unit, indent = None, mark = None, loop = []): - mapping = {} - mapping["Requires"] = "required to start" - mapping["Wants"] = "wanted to start" - mapping["Requisite"] = "required started" - mapping["Bindsto"] = "binds to start" - mapping["PartOf"] = "part of started" - mapping[".requires"] = ".required to start" - mapping[".wants"] = ".wanted to start" - mapping["PropagateReloadTo"] = "(to be reloaded as well)" - mapping["Conflicts"] = "(to be stopped on conflict)" - restrict = ["Requires", "Requisite", "ConsistsOf", "Wants", - "BindsTo", ".requires", ".wants"] - indent = indent or "" - mark = mark or "" - deps = self.get_dependencies_unit(unit) - conf = self.get_unit_conf(unit) - if not conf.loaded(): - if not self._show_all: - return - yield "%s(%s): %s" % (indent, unit, mark) - else: - yield "%s%s: %s" % (indent, unit, mark) - for stop_recursion in [ "Conflict", "conflict", "reloaded", "Propagate" ]: - if stop_recursion in mark: - return - for dep in deps: - if dep in loop: - logg.debug("detected loop at %s", dep) - continue - new_loop = loop + list(deps.keys()) - new_indent = indent + "| " - new_mark = deps[dep] - if not self._show_all: - if new_mark not in restrict: - continue - if new_mark in mapping: - new_mark = mapping[new_mark] - restrict = ["Requires", "Requisite", "ConsistsOf", "Wants", - "BindsTo", ".requires", ".wants"] - for line in self.list_dependencies(dep, new_indent, new_mark, new_loop): - yield line - def get_dependencies_unit(self, unit): - conf = self.get_unit_conf(unit) - deps = {} - for style in [ "Requires", "Wants", "Requisite", "BindsTo", "PartOf", - ".requires", ".wants", "PropagateReloadTo", "Conflicts", ]: - if style.startswith("."): - for folder in self.sysd_folders(): - if not folder: - continue - require_path = os.path.join(folder, unit + style) - if self._root: - require_path = os_path(self._root, require_path) - if os.path.isdir(require_path): - for required in os.listdir(require_path): - if required not in deps: - deps[required] = style - else: - for requirelist in conf.getlist("Unit", style, []): - for required in requirelist.strip().split(" "): - deps[required.strip()] = style - return deps - def get_start_dependencies(self, unit): # pragma: no cover - """ the list of services to be started as well / TODO: unused """ - deps = {} - unit_deps = self.get_dependencies_unit(unit) - for dep_unit, dep_style in unit_deps.items(): - restrict = ["Requires", "Requisite", "ConsistsOf", "Wants", - "BindsTo", ".requires", ".wants"] - if dep_style in restrict: - if dep_unit in deps: - if dep_style not in deps[dep_unit]: - deps[dep_unit].append( dep_style) - else: - deps[dep_unit] = [ dep_style ] - next_deps = self.get_start_dependencies(dep_unit) - for dep, styles in next_deps.items(): - for style in styles: - if dep in deps: - if style not in deps[dep]: - deps[dep].append(style) - else: - deps[dep] = [ style ] - return deps - def list_start_dependencies_units(self, units): - unit_order = [] - deps = {} - for unit in units: - unit_order.append(unit) - # unit_deps = self.get_start_dependencies(unit) # TODO - unit_deps = self.get_dependencies_unit(unit) - for dep_unit, styles in unit_deps.items(): - styles = to_list(styles) - for dep_style in styles: - if dep_unit in deps: - if dep_style not in deps[dep_unit]: - deps[dep_unit].append( dep_style) - else: - deps[dep_unit] = [ dep_style ] - deps_conf = [] - for dep in deps: - if dep in unit_order: - continue - conf = self.get_unit_conf(dep) - if conf.loaded(): - deps_conf.append(conf) - for unit in unit_order: - deps[unit] = [ "Requested" ] - conf = self.get_unit_conf(unit) - if conf.loaded(): - deps_conf.append(conf) - result = [] - for dep in sortedAfter(deps_conf, cmp=compareAfter): - line = (dep.name(), "(%s)" % (" ".join(deps[dep.name()]))) - result.append(line) - return result - def sortedAfter(self, unitlist): - """ get correct start order for the unit list (ignoring masked units) """ - conflist = [ self.get_unit_conf(unit) for unit in unitlist ] - if True: - conflist = [] - for unit in unitlist: - conf = self.get_unit_conf(unit) - if conf.masked: - logg.debug("ignoring masked unit %s", unit) - continue - conflist.append(conf) - sortlist = sortedAfter(conflist) - return [ item.name() for item in sortlist ] - def sortedBefore(self, unitlist): - """ get correct start order for the unit list (ignoring masked units) """ - conflist = [ self.get_unit_conf(unit) for unit in unitlist ] - if True: - conflist = [] - for unit in unitlist: - conf = self.get_unit_conf(unit) - if conf.masked: - logg.debug("ignoring masked unit %s", unit) - continue - conflist.append(conf) - sortlist = sortedAfter(reversed(conflist)) - return [ item.name() for item in reversed(sortlist) ] - def system_daemon_reload(self): - """ reload does will only check the service files here. - The returncode will tell the number of warnings, - and it is over 100 if it can not continue even - for the relaxed systemctl.py style of execution. """ - errors = 0 - for unit in self.match_units(): - try: - conf = self.get_unit_conf(unit) - except Exception as e: - logg.error("%s: can not read unit file %s\n\t%s", - unit, conf.filename(), e) - continue - errors += self.syntax_check(conf) - if errors: - logg.warning(" (%s) found %s problems", errors, errors % 100) - return True # errors - def syntax_check(self, conf): - if conf.filename() and conf.filename().endswith(".service"): - return self.syntax_check_service(conf) - return 0 - def syntax_check_service(self, conf): - unit = conf.name() - if not conf.data.has_section("Service"): - logg.error(" %s: a .service file without [Service] section", unit) - return 101 - errors = 0 - haveType = conf.get("Service", "Type", "simple") - haveExecStart = conf.getlist("Service", "ExecStart", []) - haveExecStop = conf.getlist("Service", "ExecStop", []) - haveExecReload = conf.getlist("Service", "ExecReload", []) - usedExecStart = [] - usedExecStop = [] - usedExecReload = [] - if haveType not in [ "simple", "forking", "notify", "oneshot", "dbus", "idle", "sysv"]: - logg.error(" %s: Failed to parse service type, ignoring: %s", unit, haveType) - errors += 100 - for line in haveExecStart: - if not line.startswith("/") and not line.startswith("-/"): - logg.error(" %s: Executable path is not absolute, ignoring: %s", unit, line.strip()) - errors += 1 - usedExecStart.append(line) - for line in haveExecStop: - if not line.startswith("/") and not line.startswith("-/"): - logg.error(" %s: Executable path is not absolute, ignoring: %s", unit, line.strip()) - errors += 1 - usedExecStop.append(line) - for line in haveExecReload: - if not line.startswith("/") and not line.startswith("-/"): - logg.error(" %s: Executable path is not absolute, ignoring: %s", unit, line.strip()) - errors += 1 - usedExecReload.append(line) - if haveType in ["simple", "notify", "forking"]: - if not usedExecStart and not usedExecStop: - logg.error(" %s: Service lacks both ExecStart and ExecStop= setting. Refusing.", unit) - errors += 101 - elif not usedExecStart and haveType != "oneshot": - logg.error(" %s: Service has no ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.", unit) - errors += 101 - if len(usedExecStart) > 1 and haveType != "oneshot": - logg.error(" %s: there may be only one ExecStart statement (unless for 'oneshot' services)." - + "\n\t\t\tYou can use ExecStartPre / ExecStartPost to add additional commands.", unit) - errors += 1 - if len(usedExecStop) > 1 and haveType != "oneshot": - logg.info(" %s: there should be only one ExecStop statement (unless for 'oneshot' services)." - + "\n\t\t\tYou can use ExecStopPost to add additional commands (also executed on failed Start)", unit) - if len(usedExecReload) > 1: - logg.info(" %s: there should be only one ExecReload statement." - + "\n\t\t\tUse ' ; ' for multiple commands (ExecReloadPost or ExedReloadPre do not exist)", unit) - if len(usedExecReload) > 0 and "/bin/kill " in usedExecReload[0]: - logg.warning(" %s: the use of /bin/kill is not recommended for ExecReload as it is asychronous." - + "\n\t\t\tThat means all the dependencies will perform the reload simultanously / out of order.", unit) - if conf.getlist("Service", "ExecRestart", []): #pragma: no cover - logg.error(" %s: there no such thing as an ExecRestart (ignored)", unit) - if conf.getlist("Service", "ExecRestartPre", []): #pragma: no cover - logg.error(" %s: there no such thing as an ExecRestartPre (ignored)", unit) - if conf.getlist("Service", "ExecRestartPost", []): #pragma: no cover - logg.error(" %s: there no such thing as an ExecRestartPost (ignored)", unit) - if conf.getlist("Service", "ExecReloadPre", []): #pragma: no cover - logg.error(" %s: there no such thing as an ExecReloadPre (ignored)", unit) - if conf.getlist("Service", "ExecReloadPost", []): #pragma: no cover - logg.error(" %s: there no such thing as an ExecReloadPost (ignored)", unit) - if conf.getlist("Service", "ExecStopPre", []): #pragma: no cover - logg.error(" %s: there no such thing as an ExecStopPre (ignored)", unit) - for env_file in conf.getlist("Service", "EnvironmentFile", []): - if env_file.startswith("-"): continue - if not os.path.isfile(os_path(self._root, env_file)): - logg.error(" %s: Failed to load environment files: %s", unit, env_file) - errors += 101 - return errors - def exec_check_service(self, conf, env, exectype = ""): - if not conf: - return True - if not conf.data.has_section("Service"): - return True #pragma: no cover - haveType = conf.get("Service", "Type", "simple") - if haveType in [ "sysv" ]: - return True # we don't care about that - abspath = 0 - notexists = 0 - for execs in [ "ExecStartPre", "ExecStart", "ExecStartPost", "ExecStop", "ExecStopPost", "ExecReload" ]: - if not execs.startswith(exectype): - continue - for cmd in conf.getlist("Service", execs, []): - check, cmd = checkstatus(cmd) - newcmd = self.exec_cmd(cmd, env, conf) - if not newcmd: - continue - exe = newcmd[0] - if not exe: - continue - if exe[0] != "/": - logg.error(" Exec is not an absolute path: %s=%s", execs, cmd) - abspath += 1 - if not os.path.isfile(exe): - logg.error(" Exec command does not exist: (%s) %s", execs, exe) - notexists += 1 - newexe1 = os.path.join("/usr/bin", exe) - newexe2 = os.path.join("/bin", exe) - if os.path.exists(newexe1): - logg.error(" but this does exist: %s %s", " " * len(execs), newexe1) - elif os.path.exists(newexe2): - logg.error(" but this does exist: %s %s", " " * len(execs), newexe2) - if not abspath and not notexists: - return True - if True: - filename = conf.filename() - if len(filename) > 45: filename = "..." + filename[-42:] - logg.error(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - logg.error(" Found %s problems in %s", abspath + notexists, filename) - time.sleep(1) - if abspath: - logg.error(" The SystemD commands must always be absolute paths by definition.") - time.sleep(1) - logg.error(" Earlier versions of systemctl.py did use a subshell thus using $PATH") - time.sleep(1) - logg.error(" however newer versions use execve just like the real SystemD daemon") - time.sleep(1) - logg.error(" so that your docker-only service scripts may start to fail suddenly.") - time.sleep(1) - if notexists: - logg.error(" Now %s executable paths were not found in the current environment.", notexists) - time.sleep(1) - logg.error(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - return False - def show_modules(self, *modules): - """ [PATTERN]... -- Show properties of one or more units - Show properties of one or more units (or the manager itself). - If no argument is specified, properties of the manager will be - shown. If a unit name is specified, properties of the unit is - shown. By default, empty properties are suppressed. Use --all to - show those too. To select specific properties to show, use - --property=. This command is intended to be used whenever - computer-parsable output is required. Use status if you are looking - for formatted human-readable output. - - NOTE: only a subset of properties is implemented """ - notfound = [] - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - units += [ module ] - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - return self.show_units(units) + notfound # and found_all - def show_units(self, units): - logg.debug("show --property=%s", self._unit_property) - result = [] - for unit in units: - if result: result += [ "" ] - for var, value in self.show_unit_items(unit): - if self._unit_property: - if self._unit_property != var: - continue - else: - if not value and not self._show_all: - continue - result += [ "%s=%s" % (var, value) ] - return result - def show_unit_items(self, unit): - """ [UNIT]... -- show properties of a unit. - """ - logg.info("try read unit %s", unit) - conf = self.get_unit_conf(unit) - for entry in self.each_unit_items(unit, conf): - yield entry - def each_unit_items(self, unit, conf): - loaded = conf.loaded() - if not loaded: - loaded = "not-loaded" - if "NOT-FOUND" in self.get_description_from(conf): - loaded = "not-found" - yield "Id", unit - yield "Names", unit - yield "Description", self.get_description_from(conf) # conf.get("Unit", "Description") - yield "PIDFile", self.pid_file_from(conf) # not self.pid_file_from w/o default location - yield "MainPID", self.active_pid_from(conf) or "0" # status["MainPID"] or PIDFile-read - yield "SubState", self.get_substate_from(conf) # status["SubState"] or notify-result - yield "ActiveState", self.get_active_from(conf) # status["ActiveState"] - yield "LoadState", loaded - yield "UnitFileState", self.enabled_from(conf) - yield "TimeoutStartUSec", seconds_to_time(self.get_TimeoutStartSec(conf)) - yield "TimeoutStopUSec", seconds_to_time(self.get_TimeoutStopSec(conf)) - env_parts = [] - for env_part in conf.getlist("Service", "Environment", []): - env_parts.append(self.expand_special(env_part, conf)) - if env_parts: - yield "Environment", " ".join(env_parts) - env_files = [] - for env_file in conf.getlist("Service", "EnvironmentFile", []): - env_files.append(self.expand_special(env_file, conf)) - if env_files: - yield "EnvironmentFile", " ".join(env_files) - # - igno_centos = [ "netconsole", "network" ] - igno_opensuse = [ "raw", "pppoe", "*.local", "boot.*", "rpmconf*", "purge-kernels.service", "after-local.service", "postfix*" ] - igno_ubuntu = [ "mount*", "umount*", "ondemand", "*.local" ] - igno_always = [ "network*", "dbus", "systemd-*" ] - def _ignored_unit(self, unit, ignore_list): - for ignore in ignore_list: - if fnmatch.fnmatchcase(unit, ignore): - return True # ignore - if fnmatch.fnmatchcase(unit, ignore+".service"): - return True # ignore - return False - def system_default_services(self, sysv = "S", default_target = None): - """ show the default services - This is used internally to know the list of service to be started in 'default' - runlevel when the container is started through default initialisation. It will - ignore a number of services - use '--all' to show a longer list of services and - use '--all --force' if not even a minimal filter shall be used. - """ - igno = self.igno_centos + self.igno_opensuse + self.igno_ubuntu + self.igno_always - if self._show_all: - igno = self.igno_always - if self._force: - igno = [] - logg.debug("ignored services filter for default.target:\n\t%s", igno) - return self.enabled_default_services(sysv, default_target, igno) - def enabled_default_services(self, sysv = "S", default_target = None, igno = []): - if self.user_mode(): - return self.enabled_default_user_services(sysv, default_target, igno) - else: - return self.enabled_default_system_services(sysv, default_target, igno) - def enabled_default_user_services(self, sysv = "S", default_target = None, igno = []): - logg.debug("check for default user services") - default_target = default_target or self._default_target - default_services = [] - for basefolder in self.user_folders(): - if not basefolder: - continue - folder = self.default_enablefolder(default_target, basefolder) - if self._root: - folder = os_path(self._root, folder) - if os.path.isdir(folder): - for unit in sorted(os.listdir(folder)): - path = os.path.join(folder, unit) - if os.path.isdir(path): continue - if self._ignored_unit(unit, igno): - continue # ignore - if unit.endswith(".service"): - default_services.append(unit) - for basefolder in self.system_folders(): - if not basefolder: - continue - folder = self.default_enablefolder(default_target, basefolder) - if self._root: - folder = os_path(self._root, folder) - if os.path.isdir(folder): - for unit in sorted(os.listdir(folder)): - path = os.path.join(folder, unit) - if os.path.isdir(path): continue - if self._ignored_unit(unit, igno): - continue # ignore - if unit.endswith(".service"): - conf = self.load_unit_conf(unit) - if self.not_user_conf(conf): - pass - else: - default_services.append(unit) - return default_services - def enabled_default_system_services(self, sysv = "S", default_target = None, igno = []): - logg.debug("check for default system services") - default_target = default_target or self._default_target - default_services = [] - for basefolder in self.system_folders(): - if not basefolder: - continue - folder = self.default_enablefolder(default_target, basefolder) - if self._root: - folder = os_path(self._root, folder) - if os.path.isdir(folder): - for unit in sorted(os.listdir(folder)): - path = os.path.join(folder, unit) - if os.path.isdir(path): continue - if self._ignored_unit(unit, igno): - continue # ignore - if unit.endswith(".service"): - default_services.append(unit) - for folder in [ self.rc3_root_folder() ]: - if not os.path.isdir(folder): - logg.warning("non-existant %s", folder) - continue - for unit in sorted(os.listdir(folder)): - path = os.path.join(folder, unit) - if os.path.isdir(path): continue - m = re.match(sysv+r"\d\d(.*)", unit) - if m: - service = m.group(1) - unit = service + ".service" - if self._ignored_unit(unit, igno): - continue # ignore - default_services.append(unit) - return default_services - def system_default(self, arg = True): - """ start units for default system level - This will go through the enabled services in the default 'multi-user.target'. - However some services are ignored as being known to be installation garbage - from unintended services. Use '--all' so start all of the installed services - and with '--all --force' even those services that are otherwise wrong. - /// SPECIAL: with --now or --init the init-loop is run and afterwards - a system_halt is performed with the enabled services to be stopped.""" - self.sysinit_status(SubState = "initializing") - logg.info("system default requested - %s", arg) - init = self._now or self._init - self.start_system_default(init = init) - def start_system_default(self, init = False): - """ detect the default.target services and start them. - When --init is given then the init-loop is run and - the services are stopped again by 'systemctl halt'.""" - default_target = self._default_target - default_services = self.system_default_services("S", default_target) - self.sysinit_status(SubState = "starting") - self.start_units(default_services) - logg.info(" -- system is up") - if init: - logg.info("init-loop start") - sig = self.init_loop_until_stop(default_services) - logg.info("init-loop %s", sig) - self.stop_system_default() - def stop_system_default(self): - """ detect the default.target services and stop them. - This is commonly run through 'systemctl halt' or - at the end of a 'systemctl --init default' loop.""" - default_target = self._default_target - default_services = self.system_default_services("K", default_target) - self.sysinit_status(SubState = "stopping") - self.stop_units(default_services) - logg.info(" -- system is down") - def system_halt(self, arg = True): - """ stop units from default system level """ - logg.info("system halt requested - %s", arg) - self.stop_system_default() - try: - os.kill(1, signal.SIGQUIT) # exit init-loop on no_more_procs - except Exception as e: - logg.warning("SIGQUIT to init-loop on PID-1: %s", e) - def system_get_default(self): - """ get current default run-level""" - current = self._default_target - folder = os_path(self._root, self.mask_folder()) - target = os.path.join(folder, "default.target") - if os.path.islink(target): - current = os.path.basename(os.readlink(target)) - return current - def set_default_modules(self, *modules): - """ set current default run-level""" - if not modules: - logg.debug(".. no runlevel given") - return (1, "Too few arguments") - current = self._default_target - folder = os_path(self._root, self.mask_folder()) - target = os.path.join(folder, "default.target") - if os.path.islink(target): - current = os.path.basename(os.readlink(target)) - err, msg = 0, "" - for module in modules: - if module == current: - continue - targetfile = None - for targetname, targetpath in self.each_target_file(): - if targetname == module: - targetfile = targetpath - if not targetfile: - err, msg = 3, "No such runlevel %s" % (module) - continue - # - if os.path.islink(target): - os.unlink(target) - if not os.path.isdir(os.path.dirname(target)): - os.makedirs(os.path.dirname(target)) - os.symlink(targetfile, target) - msg = "Created symlink from %s -> %s" % (target, targetfile) - logg.debug("%s", msg) - return (err, msg) - def init_modules(self, *modules): - """ [UNIT*] -- init loop: '--init default' or '--init start UNIT*' - The systemctl init service will start the enabled 'default' services, - and then wait for any zombies to be reaped. When a SIGINT is received - then a clean shutdown of the enabled services is ensured. A Control-C in - in interactive mode will also run 'stop' on all the enabled services. // - When a UNIT name is given then only that one is started instead of the - services in the 'default.target'. Using 'init UNIT' is better than - '--init start UNIT' because the UNIT is also stopped cleanly even when - it was never enabled in the system. - /// SPECIAL: when using --now then only the init-loop is started, - with the reap-zombies function and waiting for an interrupt. - (and no unit is started/stoppped wether given or not). - """ - if self._now: - return self.init_loop_until_stop([]) - if not modules: - # like 'systemctl --init default' - if self._now or self._show_all: - logg.debug("init default --now --all => no_more_procs") - self.exit_when_no_more_procs = True - return self.start_system_default(init = True) - # - # otherwise quit when all the init-services have died - self.exit_when_no_more_services = True - if self._now or self._show_all: - logg.debug("init services --now --all => no_more_procs") - self.exit_when_no_more_procs = True - found_all = True - units = [] - for module in modules: - matched = self.match_units([ module ]) - if not matched: - logg.error("Unit %s could not be found.", unit_of(module)) - found_all = False - continue - for unit in matched: - if unit not in units: - units += [ unit ] - logg.info("init %s -> start %s", ",".join(modules), ",".join(units)) - done = self.start_units(units, init = True) - logg.info("-- init is done") - return done # and found_all - def start_log_files(self, units): - self._log_file = {} - self._log_hold = {} - for unit in units: - conf = self.load_unit_conf(unit) - if not conf: continue - log_path = self.path_journal_log(conf) - try: - opened = os.open(log_path, os.O_RDONLY | os.O_NONBLOCK) - self._log_file[unit] = opened - self._log_hold[unit] = b"" - except Exception as e: - logg.error("can not open %s log: %s\n\t%s", unit, log_path, e) - def read_log_files(self, units): - BUFSIZE=8192 - for unit in units: - if unit in self._log_file: - new_text = b"" - while True: - buf = os.read(self._log_file[unit], BUFSIZE) - if not buf: break - new_text += buf - continue - text = self._log_hold[unit] + new_text - if not text: continue - lines = text.split(b"\n") - if not text.endswith(b"\n"): - self._log_hold[unit] = lines[-1] - lines = lines[:-1] - for line in lines: - prefix = unit.encode("utf-8") - content = prefix+b": "+line+b"\n" - os.write(1, content) - try: os.fsync(1) - except: pass - def stop_log_files(self, units): - for unit in units: - try: - if unit in self._log_file: - if self._log_file[unit]: - os.close(self._log_file[unit]) - except Exception as e: - logg.error("can not close log: %s\n\t%s", unit, e) - self._log_file = {} - self._log_hold = {} - def init_loop_until_stop(self, units): - """ this is the init-loop - it checks for any zombies to be reaped and - waits for an interrupt. When a SIGTERM /SIGINT /Control-C signal - is received then the signal name is returned. Any other signal will - just raise an Exception like one would normally expect. As a special - the 'systemctl halt' emits SIGQUIT which puts it into no_more_procs mode.""" - signal.signal(signal.SIGQUIT, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt("SIGQUIT")) - signal.signal(signal.SIGINT, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt("SIGINT")) - signal.signal(signal.SIGTERM, lambda signum, frame: ignore_signals_and_raise_keyboard_interrupt("SIGTERM")) - self.start_log_files(units) - self.sysinit_status(ActiveState = "active", SubState = "running") - result = None - while True: - try: - time.sleep(InitLoopSleep) - self.read_log_files(units) - ##### the reaper goes round - running = self.system_reap_zombies() - # logg.debug("reap zombies - init-loop found %s running procs", running) - if self.exit_when_no_more_services: - active = False - for unit in units: - conf = self.load_unit_conf(unit) - if not conf: continue - if self.is_active_from(conf): - active = True - if not active: - logg.info("no more services - exit init-loop") - break - if self.exit_when_no_more_procs: - if not running: - logg.info("no more procs - exit init-loop") - break - except KeyboardInterrupt as e: - if e.args and e.args[0] == "SIGQUIT": - # the original systemd puts a coredump on that signal. - logg.info("SIGQUIT - switch to no more procs check") - self.exit_when_no_more_procs = True - continue - signal.signal(signal.SIGTERM, signal.SIG_DFL) - signal.signal(signal.SIGINT, signal.SIG_DFL) - logg.info("interrupted - exit init-loop") - result = e.message or "STOPPED" - break - except Exception as e: - logg.info("interrupted - exception %s", e) - raise - self.sysinit_status(ActiveState = None, SubState = "degraded") - self.read_log_files(units) - self.read_log_files(units) - self.stop_log_files(units) - logg.debug("done - init loop") - return result - def system_reap_zombies(self): - """ check to reap children """ - selfpid = os.getpid() - running = 0 - for pid in os.listdir("/proc"): - try: pid = int(pid) - except: continue - if pid == selfpid: - continue - proc_status = "/proc/%s/status" % pid - if os.path.isfile(proc_status): - zombie = False - ppid = -1 - try: - for line in open(proc_status): - m = re.match(r"State:\s*Z.*", line) - if m: zombie = True - m = re.match(r"PPid:\s*(\d+)", line) - if m: ppid = int(m.group(1)) - except IOError as e: - logg.warning("%s : %s", proc_status, e) - continue - if zombie and ppid == os.getpid(): - logg.info("reap zombie %s", pid) - try: os.waitpid(pid, os.WNOHANG) - except OSError as e: - logg.warning("reap zombie %s: %s", e.strerror) - if os.path.isfile(proc_status): - if pid > 1: - running += 1 - return running # except PID 0 and PID 1 - def sysinit_status(self, **status): - conf = self.sysinit_target() - self.write_status_from(conf, **status) - def sysinit_target(self): - if not self._sysinit_target: - self._sysinit_target = self.default_unit_conf("sysinit.target", "System Initialization") - return self._sysinit_target - def is_system_running(self): - conf = self.sysinit_target() - status_file = self.status_file_from(conf) - if not os.path.isfile(status_file): - time.sleep(EpsilonTime) - if not os.path.isfile(status_file): - return "offline" - status = self.read_status_from(conf) - return status.get("SubState", "unknown") - def system_is_system_running(self): - state = self.is_system_running() - if self._quiet: - return state in [ "running" ] - else: - if state in [ "running" ]: - return True, state - else: - return False, state - def wait_system(self, target = None): - target = target or SysInitTarget - for attempt in xrange(int(SysInitWait)): - state = self.is_system_running() - if "init" in state: - if target in [ "sysinit.target", "basic.target" ]: - logg.info("system not initialized - wait %s", target) - time.sleep(1) - continue - if "start" in state or "stop" in state: - if target in [ "basic.target" ]: - logg.info("system not running - wait %s", target) - time.sleep(1) - continue - if "running" not in state: - logg.info("system is %s", state) - break - def pidlist_of(self, pid): - try: pid = int(pid) - except: return [] - pidlist = [ pid ] - pids = [ pid ] - for depth in xrange(ProcMaxDepth): - for pid in os.listdir("/proc"): - try: pid = int(pid) - except: continue - proc_status = "/proc/%s/status" % pid - if os.path.isfile(proc_status): - try: - for line in open(proc_status): - if line.startswith("PPid:"): - ppid = line[len("PPid:"):].strip() - try: ppid = int(ppid) - except: continue - if ppid in pidlist and pid not in pids: - pids += [ pid ] - except IOError as e: - logg.warning("%s : %s", proc_status, e) - continue - if len(pids) != len(pidlist): - pidlist = pids[:] - continue - return pids - def etc_hosts(self): - path = "/etc/hosts" - if self._root: - return os_path(self._root, path) - return path - def force_ipv4(self, *args): - """ only ipv4 localhost in /etc/hosts """ - logg.debug("checking /etc/hosts for '::1 localhost'") - lines = [] - for line in open(self.etc_hosts()): - if "::1" in line: - newline = re.sub("\\slocalhost\\s", " ", line) - if line != newline: - logg.info("/etc/hosts: '%s' => '%s'", line.rstrip(), newline.rstrip()) - line = newline - lines.append(line) - f = open(self.etc_hosts(), "w") - for line in lines: - f.write(line) - f.close() - def force_ipv6(self, *args): - """ only ipv4 localhost in /etc/hosts """ - logg.debug("checking /etc/hosts for '127.0.0.1 localhost'") - lines = [] - for line in open(self.etc_hosts()): - if "127.0.0.1" in line: - newline = re.sub("\\slocalhost\\s", " ", line) - if line != newline: - logg.info("/etc/hosts: '%s' => '%s'", line.rstrip(), newline.rstrip()) - line = newline - lines.append(line) - f = open(self.etc_hosts(), "w") - for line in lines: - f.write(line) - f.close() - def show_help(self, *args): - """[command] -- show this help - """ - lines = [] - okay = True - prog = os.path.basename(sys.argv[0]) - if not args: - argz = {} - for name in dir(self): - arg = None - if name.startswith("system_"): - arg = name[len("system_"):].replace("_","-") - if name.startswith("show_"): - arg = name[len("show_"):].replace("_","-") - if name.endswith("_of_unit"): - arg = name[:-len("_of_unit")].replace("_","-") - if name.endswith("_modules"): - arg = name[:-len("_modules")].replace("_","-") - if arg: - argz[arg] = name - lines.append("%s command [options]..." % prog) - lines.append("") - lines.append("Commands:") - for arg in sorted(argz): - name = argz[arg] - method = getattr(self, name) - doc = "..." - doctext = getattr(method, "__doc__") - if doctext: - doc = doctext - elif not self._show_all: - continue # pragma: nocover - firstline = doc.split("\n")[0] - doc_text = firstline.strip() - if "--" not in firstline: - doc_text = "-- " + doc_text - lines.append(" %s %s" % (arg, firstline.strip())) - return lines - for arg in args: - arg = arg.replace("-","_") - func1 = getattr(self.__class__, arg+"_modules", None) - func2 = getattr(self.__class__, arg+"_of_unit", None) - func3 = getattr(self.__class__, "show_"+arg, None) - func4 = getattr(self.__class__, "system_"+arg, None) - func = func1 or func2 or func3 or func4 - if func is None: - print("error: no such command '%s'" % arg) - okay = False - else: - doc_text = "..." - doc = getattr(func, "__doc__", None) - if doc: - doc_text = doc.replace("\n","\n\n", 1).strip() - if "--" not in doc_text: - doc_text = "-- " + doc_text - else: - logg.debug("__doc__ of %s is none", func_name) - if not self._show_all: continue - lines.append("%s %s %s" % (prog, arg, doc_text)) - if not okay: - self.show_help() - return False - return lines - def systemd_version(self): - """ the version line for systemd compatibility """ - return "systemd %s\n - via systemctl.py %s" % (self._systemd_version, __version__) - def systemd_features(self): - """ the info line for systemd features """ - features1 = "-PAM -AUDIT -SELINUX -IMA -APPARMOR -SMACK" - features2 = " +SYSVINIT -UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS" - features3 = " -ACL -XZ -LZ4 -SECCOMP -BLKID -ELFUTILS -KMOD -IDN" - return features1+features2+features3 - def systems_version(self): - return [ self.systemd_version(), self.systemd_features() ] - -def print_result(result): - # logg_info = logg.info - # logg_debug = logg.debug - def logg_info(*msg): pass - def logg_debug(*msg): pass - exitcode = 0 - if result is None: - logg_info("EXEC END None") - elif result is True: - logg_info("EXEC END True") - result = None - exitcode = 0 - elif result is False: - logg_info("EXEC END False") - result = None - exitcode = 1 - elif isinstance(result, tuple) and len(result) == 2: - exitcode, status = result - logg_info("EXEC END %s '%s'", exitcode, status) - if exitcode is True: exitcode = 0 - if exitcode is False: exitcode = 1 - result = status - elif isinstance(result, int): - logg_info("EXEC END %s", result) - exitcode = result - result = None - # - if result is None: - pass - elif isinstance(result, string_types): - print(result) - result1 = result.split("\n")[0][:-20] - if result == result1: - logg_info("EXEC END '%s'", result) - else: - logg_info("EXEC END '%s...'", result1) - logg_debug(" END '%s'", result) - elif isinstance(result, list) or hasattr(result, "next") or hasattr(result, "__next__"): - shown = 0 - for element in result: - if isinstance(element, tuple): - print("\t".join([ str(elem) for elem in element] )) - else: - print(element) - shown += 1 - logg_info("EXEC END %s items", shown) - logg_debug(" END %s", result) - elif hasattr(result, "keys"): - shown = 0 - for key in sorted(result.keys()): - element = result[key] - if isinstance(element, tuple): - print(key,"=","\t".join([ str(elem) for elem in element])) - else: - print("%s=%s" % (key,element)) - shown += 1 - logg_info("EXEC END %s items", shown) - logg_debug(" END %s", result) - else: - logg.warning("EXEC END Unknown result type %s", str(type(result))) - return exitcode - -if __name__ == "__main__": - import optparse - _o = optparse.OptionParser("%prog [options] command [name...]", - epilog="use 'help' command for more information") - _o.add_option("--version", action="store_true", - help="Show package version") - _o.add_option("--system", action="store_true", default=False, - help="Connect to system manager (default)") # overrides --user - _o.add_option("--user", action="store_true", default=_user_mode, - help="Connect to user service manager") - # _o.add_option("-H", "--host", metavar="[USER@]HOST", - # help="Operate on remote host*") - # _o.add_option("-M", "--machine", metavar="CONTAINER", - # help="Operate on local container*") - _o.add_option("-t","--type", metavar="TYPE", dest="unit_type", default=_unit_type, - help="List units of a particual type") - _o.add_option("--state", metavar="STATE", default=_unit_state, - help="List units with particular LOAD or SUB or ACTIVE state") - _o.add_option("-p", "--property", metavar="NAME", dest="unit_property", default=_unit_property, - help="Show only properties by this name") - _o.add_option("-a", "--all", action="store_true", dest="show_all", default=_show_all, - help="Show all loaded units/properties, including dead empty ones. To list all units installed on the system, use the 'list-unit-files' command instead") - _o.add_option("-l","--full", action="store_true", default=_full, - help="Don't ellipsize unit names on output (never ellipsized)") - _o.add_option("--reverse", action="store_true", - help="Show reverse dependencies with 'list-dependencies' (ignored)") - _o.add_option("--job-mode", metavar="MODE", - help="Specifiy how to deal with already queued jobs, when queuing a new job (ignored)") - _o.add_option("--show-types", action="store_true", - help="When showing sockets, explicitly show their type (ignored)") - _o.add_option("-i","--ignore-inhibitors", action="store_true", - help="When shutting down or sleeping, ignore inhibitors (ignored)") - _o.add_option("--kill-who", metavar="WHO", - help="Who to send signal to (ignored)") - _o.add_option("-s", "--signal", metavar="SIG", - help="Which signal to send (ignored)") - _o.add_option("--now", action="store_true", default=_now, - help="Start or stop unit in addition to enabling or disabling it") - _o.add_option("-q","--quiet", action="store_true", default=_quiet, - help="Suppress output") - _o.add_option("--no-block", action="store_true", default=False, - help="Do not wait until operation finished (ignored)") - _o.add_option("--no-legend", action="store_true", default=_no_legend, - help="Do not print a legend (column headers and hints)") - _o.add_option("--no-wall", action="store_true", default=False, - help="Don't send wall message before halt/power-off/reboot (ignored)") - _o.add_option("--no-reload", action="store_true", - help="Don't reload daemon after en-/dis-abling unit files (ignored)") - _o.add_option("--no-ask-password", action="store_true", default=_no_ask_password, - help="Do not ask for system passwords") - # _o.add_option("--global", action="store_true", dest="globally", default=_globally, - # help="Enable/disable unit files globally") # for all user logins - # _o.add_option("--runtime", action="store_true", - # help="Enable unit files only temporarily until next reboot") - _o.add_option("--force", action="store_true", default=_force, - help="When enabling unit files, override existing symblinks / When shutting down, execute action immediately") - _o.add_option("--preset-mode", metavar="TYPE", default=_preset_mode, - help="Apply only enable, only disable, or all presets [%default]") - _o.add_option("--root", metavar="PATH", default=_root, - help="Enable unit files in the specified root directory (used for alternative root prefix)") - _o.add_option("-n","--lines", metavar="NUM", - help="Number of journal entries to show (ignored)") - _o.add_option("-o","--output", metavar="CAT", - help="change journal output mode [short, ..., cat] (ignored)") - _o.add_option("--plain", action="store_true", - help="Print unit dependencies as a list instead of a tree (ignored)") - _o.add_option("--no-pager", action="store_true", - help="Do not pipe output into pager (ignored)") - # - _o.add_option("--coverage", metavar="OPTIONLIST", default=COVERAGE, - help="..support for coverage (e.g. spawn,oldest,sleep) [%default]") - _o.add_option("-e","--extra-vars", "--environment", metavar="NAME=VAL", action="append", default=[], - help="..override settings in the syntax of 'Environment='") - _o.add_option("-v","--verbose", action="count", default=0, - help="..increase debugging information level") - _o.add_option("-4","--ipv4", action="store_true", default=False, - help="..only keep ipv4 localhost in /etc/hosts") - _o.add_option("-6","--ipv6", action="store_true", default=False, - help="..only keep ipv6 localhost in /etc/hosts") - _o.add_option("-1","--init", action="store_true", default=False, - help="..keep running as init-process (default if PID 1)") - opt, args = _o.parse_args() - logging.basicConfig(level = max(0, logging.FATAL - 10 * opt.verbose)) - logg.setLevel(max(0, logging.ERROR - 10 * opt.verbose)) - # - COVERAGE = opt.coverage - if "sleep" in COVERAGE: - MinimumTimeoutStartSec = 7 - MinimumTimeoutStopSec = 7 - if "quick" in COVERAGE: - MinimumTimeoutStartSec = 4 - MinimumTimeoutStopSec = 4 - DefaultTimeoutStartSec = 9 - DefaultTimeoutStopSec = 9 - _extra_vars = opt.extra_vars - _force = opt.force - _full = opt.full - _no_legend = opt.no_legend - _no_ask_password = opt.no_ask_password - _now = opt.now - _preset_mode = opt.preset_mode - _quiet = opt.quiet - _root = opt.root - _show_all = opt.show_all - _unit_state = opt.state - _unit_type = opt.unit_type - _unit_property = opt.unit_property - # being PID 1 (or 0) in a container will imply --init - _pid = os.getpid() - _init = opt.init or _pid in [ 1, 0 ] - _user_mode = opt.user - if os.geteuid() and _pid in [ 1, 0 ]: - _user_mode = True - if opt.system: - _user_mode = False # override --user - # - if _user_mode: - systemctl_debug_log = os_path(_root, _var_path(_systemctl_debug_log)) - systemctl_extra_log = os_path(_root, _var_path(_systemctl_extra_log)) - else: - systemctl_debug_log = os_path(_root, _systemctl_debug_log) - systemctl_extra_log = os_path(_root, _systemctl_extra_log) - if os.access(systemctl_extra_log, os.W_OK): - loggfile = logging.FileHandler(systemctl_extra_log) - loggfile.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) - logg.addHandler(loggfile) - logg.setLevel(max(0, logging.INFO - 10 * opt.verbose)) - if os.access(systemctl_debug_log, os.W_OK): - loggfile = logging.FileHandler(systemctl_debug_log) - loggfile.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) - logg.addHandler(loggfile) - logg.setLevel(logging.DEBUG) - logg.info("EXEC BEGIN %s %s%s%s", os.path.realpath(sys.argv[0]), " ".join(args), - _user_mode and " --user" or " --system", _init and " --init" or "", ) - # - # - systemctl = Systemctl() - if opt.version: - args = [ "version" ] - if not args: - if _init: - args = [ "default" ] - else: - args = [ "list-units" ] - logg.debug("======= systemctl.py " + " ".join(args)) - command = args[0] - modules = args[1:] - if opt.ipv4: - systemctl.force_ipv4() - elif opt.ipv6: - systemctl.force_ipv6() - found = False - # command NAME - if command.startswith("__"): - command_name = command[2:] - command_func = getattr(systemctl, command_name, None) - if callable(command_func) and not found: - found = True - result = command_func(*modules) - command_name = command.replace("-","_").replace(".","_")+"_modules" - command_func = getattr(systemctl, command_name, None) - if callable(command_func) and not found: - systemctl.wait_boot(command_name) - found = True - result = command_func(*modules) - command_name = "show_"+command.replace("-","_").replace(".","_") - command_func = getattr(systemctl, command_name, None) - if callable(command_func) and not found: - systemctl.wait_boot(command_name) - found = True - result = command_func(*modules) - command_name = "system_"+command.replace("-","_").replace(".","_") - command_func = getattr(systemctl, command_name, None) - if callable(command_func) and not found: - systemctl.wait_boot(command_name) - found = True - result = command_func() - command_name = "systems_"+command.replace("-","_").replace(".","_") - command_func = getattr(systemctl, command_name, None) - if callable(command_func) and not found: - systemctl.wait_boot(command_name) - found = True - result = command_func() - if not found: - logg.error("Unknown operation %s.", command) - sys.exit(1) - # - sys.exit(print_result(result)) From 917eda5fb8b806116ddaaded3599c7b2222f0939 Mon Sep 17 00:00:00 2001 From: Morgan Tocker Date: Thu, 25 Jun 2020 08:54:03 -0600 Subject: [PATCH 091/430] Remove references to slave where possible Signed-off-by: Morgan Tocker --- go/cmd/vtctld/schema.go | 2 +- go/vt/mysqlctl/mycnf_flag.go | 3 --- go/vt/mysqlctl/mysqld.go | 2 +- go/vt/vtctl/reparent.go | 8 ++++---- go/vt/vtctl/vtctl.go | 14 +++++++------- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/go/cmd/vtctld/schema.go b/go/cmd/vtctld/schema.go index 5f508d6e129..ddf178842c2 100644 --- a/go/cmd/vtctld/schema.go +++ b/go/cmd/vtctld/schema.go @@ -36,7 +36,7 @@ var ( schemaChangeController = flag.String("schema_change_controller", "", "schema change controller is responsible for finding schema changes and responding to schema change events") schemaChangeCheckInterval = flag.Int("schema_change_check_interval", 60, "this value decides how often we check schema change dir, in seconds") schemaChangeUser = flag.String("schema_change_user", "", "The user who submits this schema change.") - schemaChangeSlaveTimeout = flag.Duration("schema_change_slave_timeout", 10*time.Second, "how long to wait for slaves to receive the schema change") + schemaChangeSlaveTimeout = flag.Duration("schema_change_slave_timeout", 10*time.Second, "how long to wait for replicas to receive the schema change") ) func initSchema() { diff --git a/go/vt/mysqlctl/mycnf_flag.go b/go/vt/mysqlctl/mycnf_flag.go index ac1bc92d715..7197ec9633e 100644 --- a/go/vt/mysqlctl/mycnf_flag.go +++ b/go/vt/mysqlctl/mycnf_flag.go @@ -44,7 +44,6 @@ var ( flagMasterInfoFile *string flagPidFile *string flagTmpDir *string - flagSlaveLoadTmpDir *string // the file to use to specify them all flagMycnfFile *string @@ -70,7 +69,6 @@ func RegisterFlags() { flagMasterInfoFile = flag.String("mycnf_master_info_file", "", "mysql master.info file") flagPidFile = flag.String("mycnf_pid_file", "", "mysql pid file") flagTmpDir = flag.String("mycnf_tmp_dir", "", "mysql tmp directory") - flagSlaveLoadTmpDir = flag.String("mycnf_slave_load_tmp_dir", "", "slave load tmp directory") flagMycnfFile = flag.String("mycnf-file", "", "path to my.cnf, if reading all config params from there") } @@ -109,7 +107,6 @@ func NewMycnfFromFlags(uid uint32) (mycnf *Mycnf, err error) { MasterInfoFile: *flagMasterInfoFile, PidFile: *flagPidFile, TmpDir: *flagTmpDir, - SlaveLoadTmpDir: *flagSlaveLoadTmpDir, // This is probably not going to be used by anybody, // but fill in a default value. (Note it's used by diff --git a/go/vt/mysqlctl/mysqld.go b/go/vt/mysqlctl/mysqld.go index f58b6643cf4..578ed46b254 100644 --- a/go/vt/mysqlctl/mysqld.go +++ b/go/vt/mysqlctl/mysqld.go @@ -75,7 +75,7 @@ var ( socketFile = flag.String("mysqlctl_socket", "", "socket file to use for remote mysqlctl actions (empty for local actions)") // masterConnectRetry is used in 'SET MASTER' commands - masterConnectRetry = flag.Duration("master_connect_retry", 10*time.Second, "how long to wait in between slave -> connection attempts. Only precise to the second.") + masterConnectRetry = flag.Duration("master_connect_retry", 10*time.Second, "how long to wait in between replica reconnect attempts. Only precise to the second.") versionRegex = regexp.MustCompile(`Ver ([0-9]+)\.([0-9]+)\.([0-9]+)`) ) diff --git a/go/vt/vtctl/reparent.go b/go/vt/vtctl/reparent.go index e8ba700b36d..4d8905e5ecc 100644 --- a/go/vt/vtctl/reparent.go +++ b/go/vt/vtctl/reparent.go @@ -35,13 +35,13 @@ func init() { "ReparentTablet", commandReparentTablet, "", - "Reparent a tablet to the current master in the shard. This only works if the current slave position matches the last known reparent action."}) + "Reparent a tablet to the current master in the shard. This only works if the current replica position matches the last known reparent action."}) addCommand("Shards", command{ "InitShardMaster", commandInitShardMaster, "[-force] [-wait_slave_timeout=] ", - "Sets the initial master for a shard. Will make all other tablets in the shard slaves of the provided master. WARNING: this could cause data loss on an already replicating shard. PlannedReparentShard or EmergencyReparentShard should be used instead."}) + "Sets the initial master for a shard. Will make all other tablets in the shard replicas of the provided master. WARNING: this could cause data loss on an already replicating shard. PlannedReparentShard or EmergencyReparentShard should be used instead."}) addCommand("Shards", command{ "PlannedReparentShard", commandPlannedReparentShard, @@ -84,7 +84,7 @@ func commandInitShardMaster(ctx context.Context, wr *wrangler.Wrangler, subFlags } force := subFlags.Bool("force", false, "will force the reparent even if the provided tablet is not a master or the shard master") - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for slaves to catch up in reparenting") + waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for replicas to catch up in reparenting") if err := subFlags.Parse(args); err != nil { return err } @@ -150,7 +150,7 @@ func commandEmergencyReparentShard(ctx context.Context, wr *wrangler.Wrangler, s return fmt.Errorf("active reparent commands disabled (unset the -disable_active_reparents flag to enable)") } - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for slaves to catch up in reparenting") + waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for replicas to catch up in reparenting") keyspaceShard := subFlags.String("keyspace_shard", "", "keyspace/shard of the shard that needs to be reparented") newMaster := subFlags.String("new_master", "", "alias of a tablet that should be the new master") if err := subFlags.Parse(args); err != nil { diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index d39e5f0c43c..0f431d7386f 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -60,33 +60,33 @@ COMMAND ARGUMENT DEFINITIONS should be a positively signed value. - db type, tablet type: The vttablet's role. Valid values are: - -- backup: A slaved copy of data that is offline to queries other than + -- backup: A replica copy of data that is offline to queries other than for backup purposes -- batch: A slaved copy of data for OLAP load patterns (typically for MapReduce jobs) -- drained: A tablet that is reserved for a background process. For example, a tablet used by a vtworker process, where the tablet is likely lagging in replication. - -- experimental: A slaved copy of data that is ready but not serving query + -- experimental: A replica copy of data that is ready but not serving query traffic. The value indicates a special characteristic of the tablet that indicates the tablet should not be considered a potential master. Vitess also does not worry about lag for experimental tablets when reparenting. -- master: A primary copy of data - -- rdonly: A slaved copy of data for OLAP load patterns - -- replica: A slaved copy of data ready to be promoted to master + -- rdonly: A replica copy of data for OLAP load patterns + -- replica: A replica copy of data ready to be promoted to master -- restore: A tablet that is restoring from a snapshot. Typically, this happens at tablet startup, then it goes to its right state. - -- schema_apply: A slaved copy of data that had been serving query traffic + -- schema_apply: A replica copy of data that had been serving query traffic but that is now applying a schema change. Following the change, the tablet will revert to its serving type. - -- snapshot_source: A slaved copy of data where mysqld is not + -- snapshot_source: A replica copy of data where mysqld is not running and where Vitess is serving data files to clone slaves. Use this command to enter this mode:
vtctl Snapshot -server-mode ...
Use this command to exit this mode:
vtctl SnapshotSourceEnd ...
- -- spare: A slaved copy of data that is ready but not serving query traffic. + -- spare: A replica copy of data that is ready but not serving query traffic. The data could be a potential master tablet. */ From ca872147e36c485873ab71c684a421af0a1c4b0a Mon Sep 17 00:00:00 2001 From: deepthi Date: Thu, 25 Jun 2020 08:59:34 -0700 Subject: [PATCH 092/430] delete RPCs that were deprecated in 6.0 Signed-off-by: deepthi --- go/vt/mysqlctl/mysql_daemon.go | 3 - go/vt/mysqlctl/reparent.go | 5 - go/vt/proto/binlogdata/binlogdata.pb.go | 3 +- .../tabletmanagerdata/tabletmanagerdata.pb.go | 441 ++++++------------ .../tabletmanagerservice.pb.go | 208 +++------ go/vt/vttablet/grpctmclient/client.go | 32 -- go/vt/vttablet/grpctmserver/server.go | 24 - go/vt/vttablet/tabletmanager/rpc_agent.go | 6 - .../vttablet/tabletmanager/rpc_replication.go | 70 --- go/vt/vttablet/tmclient/rpc_client_api.go | 8 - go/vt/vttablet/tmrpctest/test_tm_rpc.go | 39 -- proto/tabletmanagerdata.proto | 19 - proto/tabletmanagerservice.proto | 9 - 13 files changed, 205 insertions(+), 662 deletions(-) diff --git a/go/vt/mysqlctl/mysql_daemon.go b/go/vt/mysqlctl/mysql_daemon.go index 5fc9b6cb3a1..6bc5c47cfb9 100644 --- a/go/vt/mysqlctl/mysql_daemon.go +++ b/go/vt/mysqlctl/mysql_daemon.go @@ -60,9 +60,6 @@ type MysqlDaemon interface { SetMaster(ctx context.Context, masterHost string, masterPort int, slaveStopBefore bool, slaveStartAfter bool) error WaitForReparentJournal(ctx context.Context, timeCreatedNS int64) error - // Deprecated: use MasterPosition() instead - DemoteMaster() (mysql.Position, error) - WaitMasterPos(context.Context, mysql.Position) error // Promote makes the current server master. It will not change diff --git a/go/vt/mysqlctl/reparent.go b/go/vt/mysqlctl/reparent.go index 7d4d5b0bafc..c253443e6bb 100644 --- a/go/vt/mysqlctl/reparent.go +++ b/go/vt/mysqlctl/reparent.go @@ -92,11 +92,6 @@ func (mysqld *Mysqld) WaitForReparentJournal(ctx context.Context, timeCreatedNS } } -// Deprecated: use mysqld.MasterPosition() instead -func (mysqld *Mysqld) DemoteMaster() (rp mysql.Position, err error) { - return mysqld.MasterPosition() -} - // Promote will promote this server to be the new master. func (mysqld *Mysqld) Promote(hookExtraEnv map[string]string) (mysql.Position, error) { ctx := context.TODO() diff --git a/go/vt/proto/binlogdata/binlogdata.pb.go b/go/vt/proto/binlogdata/binlogdata.pb.go index e1aeaa6a760..e4b530cd594 100644 --- a/go/vt/proto/binlogdata/binlogdata.pb.go +++ b/go/vt/proto/binlogdata/binlogdata.pb.go @@ -5,8 +5,9 @@ package binlogdata import ( fmt "fmt" - proto "github.com/golang/protobuf/proto" math "math" + + proto "github.com/golang/protobuf/proto" query "vitess.io/vitess/go/vt/proto/query" topodata "vitess.io/vitess/go/vt/proto/topodata" vtrpc "vitess.io/vitess/go/vt/proto/vtrpc" diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index f2913194895..62ef272de21 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -3085,86 +3085,6 @@ func (m *UndoDemoteMasterResponse) XXX_DiscardUnknown() { var xxx_messageInfo_UndoDemoteMasterResponse proto.InternalMessageInfo -// Deprecated -type PromoteSlaveWhenCaughtUpRequest struct { - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PromoteSlaveWhenCaughtUpRequest) Reset() { *m = PromoteSlaveWhenCaughtUpRequest{} } -func (m *PromoteSlaveWhenCaughtUpRequest) String() string { return proto.CompactTextString(m) } -func (*PromoteSlaveWhenCaughtUpRequest) ProtoMessage() {} -func (*PromoteSlaveWhenCaughtUpRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{76} -} - -func (m *PromoteSlaveWhenCaughtUpRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest.Unmarshal(m, b) -} -func (m *PromoteSlaveWhenCaughtUpRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest.Marshal(b, m, deterministic) -} -func (m *PromoteSlaveWhenCaughtUpRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest.Merge(m, src) -} -func (m *PromoteSlaveWhenCaughtUpRequest) XXX_Size() int { - return xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest.Size(m) -} -func (m *PromoteSlaveWhenCaughtUpRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest proto.InternalMessageInfo - -func (m *PromoteSlaveWhenCaughtUpRequest) GetPosition() string { - if m != nil { - return m.Position - } - return "" -} - -// Deprecated -type PromoteSlaveWhenCaughtUpResponse struct { - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PromoteSlaveWhenCaughtUpResponse) Reset() { *m = PromoteSlaveWhenCaughtUpResponse{} } -func (m *PromoteSlaveWhenCaughtUpResponse) String() string { return proto.CompactTextString(m) } -func (*PromoteSlaveWhenCaughtUpResponse) ProtoMessage() {} -func (*PromoteSlaveWhenCaughtUpResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{77} -} - -func (m *PromoteSlaveWhenCaughtUpResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse.Unmarshal(m, b) -} -func (m *PromoteSlaveWhenCaughtUpResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse.Marshal(b, m, deterministic) -} -func (m *PromoteSlaveWhenCaughtUpResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse.Merge(m, src) -} -func (m *PromoteSlaveWhenCaughtUpResponse) XXX_Size() int { - return xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse.Size(m) -} -func (m *PromoteSlaveWhenCaughtUpResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse proto.InternalMessageInfo - -func (m *PromoteSlaveWhenCaughtUpResponse) GetPosition() string { - if m != nil { - return m.Position - } - return "" -} - type SlaveWasPromotedRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3175,7 +3095,7 @@ func (m *SlaveWasPromotedRequest) Reset() { *m = SlaveWasPromotedRequest func (m *SlaveWasPromotedRequest) String() string { return proto.CompactTextString(m) } func (*SlaveWasPromotedRequest) ProtoMessage() {} func (*SlaveWasPromotedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{78} + return fileDescriptor_ff9ac4f89e61ffa4, []int{76} } func (m *SlaveWasPromotedRequest) XXX_Unmarshal(b []byte) error { @@ -3206,7 +3126,7 @@ func (m *SlaveWasPromotedResponse) Reset() { *m = SlaveWasPromotedRespon func (m *SlaveWasPromotedResponse) String() string { return proto.CompactTextString(m) } func (*SlaveWasPromotedResponse) ProtoMessage() {} func (*SlaveWasPromotedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{79} + return fileDescriptor_ff9ac4f89e61ffa4, []int{77} } func (m *SlaveWasPromotedResponse) XXX_Unmarshal(b []byte) error { @@ -3241,7 +3161,7 @@ func (m *SetMasterRequest) Reset() { *m = SetMasterRequest{} } func (m *SetMasterRequest) String() string { return proto.CompactTextString(m) } func (*SetMasterRequest) ProtoMessage() {} func (*SetMasterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{80} + return fileDescriptor_ff9ac4f89e61ffa4, []int{78} } func (m *SetMasterRequest) XXX_Unmarshal(b []byte) error { @@ -3300,7 +3220,7 @@ func (m *SetMasterResponse) Reset() { *m = SetMasterResponse{} } func (m *SetMasterResponse) String() string { return proto.CompactTextString(m) } func (*SetMasterResponse) ProtoMessage() {} func (*SetMasterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{81} + return fileDescriptor_ff9ac4f89e61ffa4, []int{79} } func (m *SetMasterResponse) XXX_Unmarshal(b []byte) error { @@ -3333,7 +3253,7 @@ func (m *SlaveWasRestartedRequest) Reset() { *m = SlaveWasRestartedReque func (m *SlaveWasRestartedRequest) String() string { return proto.CompactTextString(m) } func (*SlaveWasRestartedRequest) ProtoMessage() {} func (*SlaveWasRestartedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{82} + return fileDescriptor_ff9ac4f89e61ffa4, []int{80} } func (m *SlaveWasRestartedRequest) XXX_Unmarshal(b []byte) error { @@ -3371,7 +3291,7 @@ func (m *SlaveWasRestartedResponse) Reset() { *m = SlaveWasRestartedResp func (m *SlaveWasRestartedResponse) String() string { return proto.CompactTextString(m) } func (*SlaveWasRestartedResponse) ProtoMessage() {} func (*SlaveWasRestartedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{83} + return fileDescriptor_ff9ac4f89e61ffa4, []int{81} } func (m *SlaveWasRestartedResponse) XXX_Unmarshal(b []byte) error { @@ -3402,7 +3322,7 @@ func (m *StopReplicationAndGetStatusRequest) Reset() { *m = StopReplicat func (m *StopReplicationAndGetStatusRequest) String() string { return proto.CompactTextString(m) } func (*StopReplicationAndGetStatusRequest) ProtoMessage() {} func (*StopReplicationAndGetStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{84} + return fileDescriptor_ff9ac4f89e61ffa4, []int{82} } func (m *StopReplicationAndGetStatusRequest) XXX_Unmarshal(b []byte) error { @@ -3434,7 +3354,7 @@ func (m *StopReplicationAndGetStatusResponse) Reset() { *m = StopReplica func (m *StopReplicationAndGetStatusResponse) String() string { return proto.CompactTextString(m) } func (*StopReplicationAndGetStatusResponse) ProtoMessage() {} func (*StopReplicationAndGetStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{85} + return fileDescriptor_ff9ac4f89e61ffa4, []int{83} } func (m *StopReplicationAndGetStatusResponse) XXX_Unmarshal(b []byte) error { @@ -3462,78 +3382,6 @@ func (m *StopReplicationAndGetStatusResponse) GetStatus() *replicationdata.Statu return nil } -// Deprecated -type PromoteSlaveRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PromoteSlaveRequest) Reset() { *m = PromoteSlaveRequest{} } -func (m *PromoteSlaveRequest) String() string { return proto.CompactTextString(m) } -func (*PromoteSlaveRequest) ProtoMessage() {} -func (*PromoteSlaveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{86} -} - -func (m *PromoteSlaveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PromoteSlaveRequest.Unmarshal(m, b) -} -func (m *PromoteSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PromoteSlaveRequest.Marshal(b, m, deterministic) -} -func (m *PromoteSlaveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PromoteSlaveRequest.Merge(m, src) -} -func (m *PromoteSlaveRequest) XXX_Size() int { - return xxx_messageInfo_PromoteSlaveRequest.Size(m) -} -func (m *PromoteSlaveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PromoteSlaveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PromoteSlaveRequest proto.InternalMessageInfo - -// Deprecated -type PromoteSlaveResponse struct { - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PromoteSlaveResponse) Reset() { *m = PromoteSlaveResponse{} } -func (m *PromoteSlaveResponse) String() string { return proto.CompactTextString(m) } -func (*PromoteSlaveResponse) ProtoMessage() {} -func (*PromoteSlaveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{87} -} - -func (m *PromoteSlaveResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PromoteSlaveResponse.Unmarshal(m, b) -} -func (m *PromoteSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PromoteSlaveResponse.Marshal(b, m, deterministic) -} -func (m *PromoteSlaveResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PromoteSlaveResponse.Merge(m, src) -} -func (m *PromoteSlaveResponse) XXX_Size() int { - return xxx_messageInfo_PromoteSlaveResponse.Size(m) -} -func (m *PromoteSlaveResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PromoteSlaveResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PromoteSlaveResponse proto.InternalMessageInfo - -func (m *PromoteSlaveResponse) GetPosition() string { - if m != nil { - return m.Position - } - return "" -} - type PromoteReplicaRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3544,7 +3392,7 @@ func (m *PromoteReplicaRequest) Reset() { *m = PromoteReplicaRequest{} } func (m *PromoteReplicaRequest) String() string { return proto.CompactTextString(m) } func (*PromoteReplicaRequest) ProtoMessage() {} func (*PromoteReplicaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{88} + return fileDescriptor_ff9ac4f89e61ffa4, []int{84} } func (m *PromoteReplicaRequest) XXX_Unmarshal(b []byte) error { @@ -3576,7 +3424,7 @@ func (m *PromoteReplicaResponse) Reset() { *m = PromoteReplicaResponse{} func (m *PromoteReplicaResponse) String() string { return proto.CompactTextString(m) } func (*PromoteReplicaResponse) ProtoMessage() {} func (*PromoteReplicaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{89} + return fileDescriptor_ff9ac4f89e61ffa4, []int{85} } func (m *PromoteReplicaResponse) XXX_Unmarshal(b []byte) error { @@ -3616,7 +3464,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{90} + return fileDescriptor_ff9ac4f89e61ffa4, []int{86} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { @@ -3662,7 +3510,7 @@ func (m *BackupResponse) Reset() { *m = BackupResponse{} } func (m *BackupResponse) String() string { return proto.CompactTextString(m) } func (*BackupResponse) ProtoMessage() {} func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{91} + return fileDescriptor_ff9ac4f89e61ffa4, []int{87} } func (m *BackupResponse) XXX_Unmarshal(b []byte) error { @@ -3700,7 +3548,7 @@ func (m *RestoreFromBackupRequest) Reset() { *m = RestoreFromBackupReque func (m *RestoreFromBackupRequest) String() string { return proto.CompactTextString(m) } func (*RestoreFromBackupRequest) ProtoMessage() {} func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{92} + return fileDescriptor_ff9ac4f89e61ffa4, []int{88} } func (m *RestoreFromBackupRequest) XXX_Unmarshal(b []byte) error { @@ -3732,7 +3580,7 @@ func (m *RestoreFromBackupResponse) Reset() { *m = RestoreFromBackupResp func (m *RestoreFromBackupResponse) String() string { return proto.CompactTextString(m) } func (*RestoreFromBackupResponse) ProtoMessage() {} func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ff9ac4f89e61ffa4, []int{93} + return fileDescriptor_ff9ac4f89e61ffa4, []int{89} } func (m *RestoreFromBackupResponse) XXX_Unmarshal(b []byte) error { @@ -3840,8 +3688,6 @@ func init() { proto.RegisterType((*DemoteMasterResponse)(nil), "tabletmanagerdata.DemoteMasterResponse") proto.RegisterType((*UndoDemoteMasterRequest)(nil), "tabletmanagerdata.UndoDemoteMasterRequest") proto.RegisterType((*UndoDemoteMasterResponse)(nil), "tabletmanagerdata.UndoDemoteMasterResponse") - proto.RegisterType((*PromoteSlaveWhenCaughtUpRequest)(nil), "tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest") - proto.RegisterType((*PromoteSlaveWhenCaughtUpResponse)(nil), "tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse") proto.RegisterType((*SlaveWasPromotedRequest)(nil), "tabletmanagerdata.SlaveWasPromotedRequest") proto.RegisterType((*SlaveWasPromotedResponse)(nil), "tabletmanagerdata.SlaveWasPromotedResponse") proto.RegisterType((*SetMasterRequest)(nil), "tabletmanagerdata.SetMasterRequest") @@ -3850,8 +3696,6 @@ func init() { proto.RegisterType((*SlaveWasRestartedResponse)(nil), "tabletmanagerdata.SlaveWasRestartedResponse") proto.RegisterType((*StopReplicationAndGetStatusRequest)(nil), "tabletmanagerdata.StopReplicationAndGetStatusRequest") proto.RegisterType((*StopReplicationAndGetStatusResponse)(nil), "tabletmanagerdata.StopReplicationAndGetStatusResponse") - proto.RegisterType((*PromoteSlaveRequest)(nil), "tabletmanagerdata.PromoteSlaveRequest") - proto.RegisterType((*PromoteSlaveResponse)(nil), "tabletmanagerdata.PromoteSlaveResponse") proto.RegisterType((*PromoteReplicaRequest)(nil), "tabletmanagerdata.PromoteReplicaRequest") proto.RegisterType((*PromoteReplicaResponse)(nil), "tabletmanagerdata.PromoteReplicaResponse") proto.RegisterType((*BackupRequest)(nil), "tabletmanagerdata.BackupRequest") @@ -3863,135 +3707,132 @@ func init() { func init() { proto.RegisterFile("tabletmanagerdata.proto", fileDescriptor_ff9ac4f89e61ffa4) } var fileDescriptor_ff9ac4f89e61ffa4 = []byte{ - // 2067 bytes of a gzipped FileDescriptorProto + // 2029 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xdd, 0x6e, 0x1b, 0xc7, - 0xf5, 0x07, 0x49, 0x49, 0xa6, 0x0e, 0x3f, 0x44, 0x2e, 0x29, 0x91, 0x92, 0xff, 0x91, 0xe4, 0xb5, - 0xf3, 0x8f, 0xea, 0xa2, 0x54, 0xa2, 0xa4, 0x41, 0x90, 0x22, 0x45, 0x65, 0x59, 0xb2, 0x9d, 0x28, - 0xb1, 0xb2, 0xb2, 0xec, 0x22, 0x28, 0xb0, 0x18, 0x72, 0x47, 0xe4, 0x42, 0xcb, 0x9d, 0xf5, 0xcc, - 0x2c, 0x25, 0xbe, 0x44, 0x9f, 0xa0, 0x77, 0x05, 0xda, 0xfb, 0x5e, 0xf6, 0x41, 0xd2, 0x47, 0xe9, - 0x45, 0x2f, 0x5a, 0xcc, 0xc7, 0x92, 0xb3, 0xe4, 0xca, 0x96, 0x04, 0x17, 0xe8, 0x8d, 0xc0, 0xf9, - 0x9d, 0xef, 0x33, 0xe7, 0x9c, 0x39, 0x0b, 0x41, 0x8b, 0xa3, 0x6e, 0x80, 0xf9, 0x10, 0x85, 0xa8, - 0x8f, 0xa9, 0x87, 0x38, 0xea, 0x44, 0x94, 0x70, 0x62, 0xd5, 0xe7, 0x08, 0x1b, 0xa5, 0xb7, 0x31, - 0xa6, 0x63, 0x45, 0xdf, 0xa8, 0x72, 0x12, 0x91, 0x29, 0xff, 0xc6, 0x2a, 0xc5, 0x51, 0xe0, 0xf7, - 0x10, 0xf7, 0x49, 0x68, 0xc0, 0x95, 0x80, 0xf4, 0x63, 0xee, 0x07, 0xea, 0x68, 0xff, 0x3b, 0x07, - 0x2b, 0xaf, 0x84, 0xe2, 0xa7, 0xf8, 0xdc, 0x0f, 0x7d, 0xc1, 0x6c, 0x59, 0xb0, 0x10, 0xa2, 0x21, - 0x6e, 0xe7, 0xb6, 0x73, 0x3b, 0xcb, 0x8e, 0xfc, 0x6d, 0xad, 0xc1, 0x12, 0xeb, 0x0d, 0xf0, 0x10, - 0xb5, 0xf3, 0x12, 0xd5, 0x27, 0xab, 0x0d, 0xf7, 0x7a, 0x24, 0x88, 0x87, 0x21, 0x6b, 0x17, 0xb6, - 0x0b, 0x3b, 0xcb, 0x4e, 0x72, 0xb4, 0x3a, 0xd0, 0x88, 0xa8, 0x3f, 0x44, 0x74, 0xec, 0x5e, 0xe0, - 0xb1, 0x9b, 0x70, 0x2d, 0x48, 0xae, 0xba, 0x26, 0x7d, 0x87, 0xc7, 0x07, 0x9a, 0xdf, 0x82, 0x05, - 0x3e, 0x8e, 0x70, 0x7b, 0x51, 0x59, 0x15, 0xbf, 0xad, 0x2d, 0x28, 0x09, 0xd7, 0xdd, 0x00, 0x87, - 0x7d, 0x3e, 0x68, 0x2f, 0x6d, 0xe7, 0x76, 0x16, 0x1c, 0x10, 0xd0, 0xb1, 0x44, 0xac, 0xfb, 0xb0, - 0x4c, 0xc9, 0xa5, 0xdb, 0x23, 0x71, 0xc8, 0xdb, 0xf7, 0x24, 0xb9, 0x48, 0xc9, 0xe5, 0x81, 0x38, - 0x5b, 0x8f, 0x60, 0xe9, 0xdc, 0xc7, 0x81, 0xc7, 0xda, 0xc5, 0xed, 0xc2, 0x4e, 0x69, 0xaf, 0xdc, - 0x51, 0xf9, 0x3a, 0x12, 0xa0, 0xa3, 0x69, 0xf6, 0x5f, 0x72, 0x50, 0x3b, 0x95, 0xc1, 0x18, 0x29, - 0xf8, 0x04, 0x56, 0x84, 0x95, 0x2e, 0x62, 0xd8, 0xd5, 0x71, 0xab, 0x6c, 0x54, 0x13, 0x58, 0x89, - 0x58, 0x2f, 0x41, 0xdd, 0x8b, 0xeb, 0x4d, 0x84, 0x59, 0x3b, 0x2f, 0xcd, 0xd9, 0x9d, 0xf9, 0xab, - 0x9c, 0x49, 0xb5, 0x53, 0xe3, 0x69, 0x80, 0x89, 0x84, 0x8e, 0x30, 0x65, 0x3e, 0x09, 0xdb, 0x05, - 0x69, 0x31, 0x39, 0x0a, 0x47, 0x2d, 0x65, 0xf5, 0x60, 0x80, 0xc2, 0x3e, 0x76, 0x30, 0x8b, 0x03, - 0x6e, 0x3d, 0x87, 0x4a, 0x17, 0x9f, 0x13, 0x9a, 0x72, 0xb4, 0xb4, 0xf7, 0x30, 0xc3, 0xfa, 0x6c, - 0x98, 0x4e, 0x59, 0x49, 0xea, 0x58, 0x8e, 0xa0, 0x8c, 0xce, 0x39, 0xa6, 0xae, 0x71, 0xd3, 0x37, - 0x54, 0x54, 0x92, 0x82, 0x0a, 0xb6, 0xff, 0x99, 0x83, 0xea, 0x19, 0xc3, 0xf4, 0x04, 0xd3, 0xa1, - 0xcf, 0x98, 0x2e, 0xa9, 0x01, 0x61, 0x3c, 0x29, 0x29, 0xf1, 0x5b, 0x60, 0x31, 0xc3, 0x54, 0x17, - 0x94, 0xfc, 0x6d, 0xfd, 0x12, 0xea, 0x11, 0x62, 0xec, 0x92, 0x50, 0xcf, 0xed, 0x0d, 0x70, 0xef, - 0x82, 0xc5, 0x43, 0x99, 0x87, 0x05, 0xa7, 0x96, 0x10, 0x0e, 0x34, 0x6e, 0xfd, 0x08, 0x10, 0x51, - 0x7f, 0xe4, 0x07, 0xb8, 0x8f, 0x55, 0x61, 0x95, 0xf6, 0x3e, 0xcb, 0xf0, 0x36, 0xed, 0x4b, 0xe7, - 0x64, 0x22, 0x73, 0x18, 0x72, 0x3a, 0x76, 0x0c, 0x25, 0x1b, 0xdf, 0xc0, 0xca, 0x0c, 0xd9, 0xaa, - 0x41, 0xe1, 0x02, 0x8f, 0xb5, 0xe7, 0xe2, 0xa7, 0xd5, 0x84, 0xc5, 0x11, 0x0a, 0x62, 0xac, 0x3d, - 0x57, 0x87, 0xaf, 0xf3, 0x5f, 0xe5, 0xec, 0x9f, 0x73, 0x50, 0x7e, 0xda, 0x7d, 0x4f, 0xdc, 0x55, - 0xc8, 0x7b, 0x5d, 0x2d, 0x9b, 0xf7, 0xba, 0x93, 0x3c, 0x14, 0x8c, 0x3c, 0xbc, 0xcc, 0x08, 0x6d, - 0x37, 0x23, 0x34, 0xd3, 0xd8, 0x7f, 0x33, 0xb0, 0x3f, 0xe7, 0xa0, 0x34, 0xb5, 0xc4, 0xac, 0x63, - 0xa8, 0x09, 0x3f, 0xdd, 0x68, 0x8a, 0xb5, 0x73, 0xd2, 0xcb, 0x07, 0xef, 0xbd, 0x00, 0x67, 0x25, - 0x4e, 0x9d, 0x99, 0x75, 0x04, 0x55, 0xaf, 0x9b, 0xd2, 0xa5, 0x3a, 0x68, 0xeb, 0x3d, 0x11, 0x3b, - 0x15, 0xcf, 0x38, 0x31, 0xfb, 0x13, 0x28, 0x9d, 0xf8, 0x61, 0xdf, 0xc1, 0x6f, 0x63, 0xcc, 0xb8, - 0x68, 0xa5, 0x08, 0x8d, 0x03, 0x82, 0x3c, 0x1d, 0x64, 0x72, 0xb4, 0x77, 0xa0, 0xac, 0x18, 0x59, - 0x44, 0x42, 0x86, 0xdf, 0xc1, 0xf9, 0x18, 0xca, 0xa7, 0x01, 0xc6, 0x51, 0xa2, 0x73, 0x03, 0x8a, - 0x5e, 0x4c, 0xe5, 0x50, 0x95, 0xac, 0x05, 0x67, 0x72, 0xb6, 0x57, 0xa0, 0xa2, 0x79, 0x95, 0x5a, - 0xfb, 0x1f, 0x39, 0xb0, 0x0e, 0xaf, 0x70, 0x2f, 0xe6, 0xf8, 0x39, 0x21, 0x17, 0x89, 0x8e, 0xac, - 0xf9, 0xba, 0x09, 0x10, 0x21, 0x8a, 0x86, 0x98, 0x63, 0xaa, 0xc2, 0x5f, 0x76, 0x0c, 0xc4, 0x3a, - 0x81, 0x65, 0x7c, 0xc5, 0x29, 0x72, 0x71, 0x38, 0x92, 0x93, 0xb6, 0xb4, 0xf7, 0x79, 0x46, 0x76, - 0xe6, 0xad, 0x75, 0x0e, 0x85, 0xd8, 0x61, 0x38, 0x52, 0x35, 0x51, 0xc4, 0xfa, 0xb8, 0xf1, 0x1b, - 0xa8, 0xa4, 0x48, 0xb7, 0xaa, 0x87, 0x73, 0x68, 0xa4, 0x4c, 0xe9, 0x3c, 0x6e, 0x41, 0x09, 0x5f, - 0xf9, 0xdc, 0x65, 0x1c, 0xf1, 0x98, 0xe9, 0x04, 0x81, 0x80, 0x4e, 0x25, 0x22, 0x9f, 0x11, 0xee, - 0x91, 0x98, 0x4f, 0x9e, 0x11, 0x79, 0xd2, 0x38, 0xa6, 0x49, 0x17, 0xe8, 0x93, 0x3d, 0x82, 0xda, - 0x33, 0xcc, 0xd5, 0x5c, 0x49, 0xd2, 0xb7, 0x06, 0x4b, 0x32, 0x70, 0x55, 0x71, 0xcb, 0x8e, 0x3e, - 0x59, 0x0f, 0xa1, 0xe2, 0x87, 0xbd, 0x20, 0xf6, 0xb0, 0x3b, 0xf2, 0xf1, 0x25, 0x93, 0x26, 0x8a, - 0x4e, 0x59, 0x83, 0xaf, 0x05, 0x66, 0x7d, 0x0c, 0x55, 0x7c, 0xa5, 0x98, 0xb4, 0x12, 0xf5, 0x6c, - 0x55, 0x34, 0x2a, 0x07, 0x34, 0xb3, 0x31, 0xd4, 0x0d, 0xbb, 0x3a, 0xba, 0x13, 0xa8, 0xab, 0xc9, - 0x68, 0x0c, 0xfb, 0xdb, 0x4c, 0xdb, 0x1a, 0x9b, 0x41, 0xec, 0x16, 0xac, 0x3e, 0xc3, 0xdc, 0x28, - 0x61, 0x1d, 0xa3, 0xfd, 0x13, 0xac, 0xcd, 0x12, 0xb4, 0x13, 0xbf, 0x83, 0x52, 0xba, 0xe9, 0x84, - 0xf9, 0xcd, 0x0c, 0xf3, 0xa6, 0xb0, 0x29, 0x62, 0x37, 0xc1, 0x3a, 0xc5, 0xdc, 0xc1, 0xc8, 0x7b, - 0x19, 0x06, 0xe3, 0xc4, 0xe2, 0x2a, 0x34, 0x52, 0xa8, 0x2e, 0xe1, 0x29, 0xfc, 0x86, 0xfa, 0x1c, - 0x27, 0xdc, 0x6b, 0xd0, 0x4c, 0xc3, 0x9a, 0xfd, 0x5b, 0xa8, 0xab, 0xc7, 0xe9, 0xd5, 0x38, 0x4a, - 0x98, 0xad, 0x5f, 0x43, 0x49, 0xb9, 0xe7, 0xca, 0x07, 0x5e, 0xb8, 0x5c, 0xdd, 0x6b, 0x76, 0x26, - 0xfb, 0x8a, 0xcc, 0x39, 0x97, 0x12, 0xc0, 0x27, 0xbf, 0x85, 0x9f, 0xa6, 0xae, 0xa9, 0x43, 0x0e, - 0x3e, 0xa7, 0x98, 0x0d, 0x44, 0x49, 0x99, 0x0e, 0xa5, 0x61, 0xcd, 0xde, 0x82, 0x55, 0x27, 0x0e, - 0x9f, 0x63, 0x14, 0xf0, 0x81, 0x7c, 0x38, 0x12, 0x81, 0x36, 0xac, 0xcd, 0x12, 0xb4, 0xc8, 0x17, - 0xd0, 0x7e, 0xd1, 0x0f, 0x09, 0xc5, 0x8a, 0x78, 0x48, 0x29, 0xa1, 0xa9, 0x91, 0xc2, 0x39, 0xa6, - 0xe1, 0x74, 0x50, 0xc8, 0xa3, 0x7d, 0x1f, 0xd6, 0x33, 0xa4, 0xb4, 0xca, 0xaf, 0x85, 0xd3, 0x62, - 0x9e, 0xa4, 0x2b, 0xf9, 0x21, 0x54, 0x2e, 0x91, 0xcf, 0xdd, 0x88, 0xb0, 0x69, 0x31, 0x2d, 0x3b, - 0x65, 0x01, 0x9e, 0x68, 0x4c, 0x45, 0x66, 0xca, 0x6a, 0x9d, 0x7b, 0xb0, 0x76, 0x42, 0xf1, 0x79, - 0xe0, 0xf7, 0x07, 0x33, 0x0d, 0x22, 0x76, 0x32, 0x99, 0xb8, 0xa4, 0x43, 0x92, 0xa3, 0xdd, 0x87, - 0xd6, 0x9c, 0x8c, 0xae, 0xab, 0x63, 0xa8, 0x2a, 0x2e, 0x97, 0xca, 0xbd, 0x22, 0x99, 0xe7, 0x1f, - 0x5f, 0x5b, 0xd9, 0xe6, 0x16, 0xe2, 0x54, 0x7a, 0xc6, 0x89, 0xd9, 0xff, 0xca, 0x81, 0xb5, 0x1f, - 0x45, 0xc1, 0x38, 0xed, 0x59, 0x0d, 0x0a, 0xec, 0x6d, 0x90, 0x8c, 0x18, 0xf6, 0x36, 0x10, 0x23, - 0xe6, 0x9c, 0xd0, 0x1e, 0xd6, 0xcd, 0xaa, 0x0e, 0x62, 0x0d, 0x40, 0x41, 0x40, 0x2e, 0x5d, 0x63, - 0x87, 0x95, 0x93, 0xa1, 0xe8, 0xd4, 0x24, 0xc1, 0x99, 0xe2, 0xf3, 0x0b, 0xd0, 0xc2, 0x87, 0x5a, - 0x80, 0x16, 0xef, 0xb8, 0x00, 0xfd, 0x35, 0x07, 0x8d, 0x54, 0xf4, 0x3a, 0xc7, 0xff, 0x7b, 0xab, - 0x5a, 0x03, 0xea, 0xc7, 0xa4, 0x77, 0xa1, 0xa6, 0x5e, 0xd2, 0x1a, 0x4d, 0xb0, 0x4c, 0x70, 0xda, - 0x78, 0x67, 0x61, 0x30, 0xc7, 0xbc, 0x06, 0xcd, 0x34, 0xac, 0xd9, 0xff, 0x96, 0x83, 0xb6, 0x7e, - 0x22, 0x8e, 0x30, 0xef, 0x0d, 0xf6, 0xd9, 0xd3, 0xee, 0xa4, 0x0e, 0x9a, 0xb0, 0x28, 0x57, 0x71, - 0x99, 0x80, 0xb2, 0xa3, 0x0e, 0x56, 0x0b, 0xee, 0x79, 0x5d, 0x57, 0x3e, 0x8d, 0xfa, 0x75, 0xf0, - 0xba, 0x3f, 0x88, 0xc7, 0x71, 0x1d, 0x8a, 0x43, 0x74, 0xe5, 0x52, 0x72, 0xc9, 0xf4, 0x32, 0x78, - 0x6f, 0x88, 0xae, 0x1c, 0x72, 0xc9, 0xe4, 0xa2, 0xee, 0x33, 0xb9, 0x81, 0x77, 0xfd, 0x30, 0x20, - 0x7d, 0x26, 0xaf, 0xbf, 0xe8, 0x54, 0x35, 0xfc, 0x44, 0xa1, 0xa2, 0xd7, 0xa8, 0x6c, 0x23, 0xf3, - 0x72, 0x8b, 0x4e, 0x99, 0x1a, 0xbd, 0x65, 0x3f, 0x83, 0xf5, 0x0c, 0x9f, 0xf5, 0xed, 0x3d, 0x86, - 0x25, 0xd5, 0x1a, 0xfa, 0xda, 0x2c, 0xfd, 0x39, 0xf1, 0xa3, 0xf8, 0xab, 0xdb, 0x40, 0x73, 0xd8, - 0x7f, 0xcc, 0xc1, 0x47, 0x69, 0x4d, 0xfb, 0x41, 0x20, 0x16, 0x30, 0xf6, 0xe1, 0x53, 0x30, 0x17, - 0xd9, 0x42, 0x46, 0x64, 0xc7, 0xb0, 0x79, 0x9d, 0x3f, 0x77, 0x08, 0xef, 0xbb, 0xd9, 0xbb, 0xdd, - 0x8f, 0xa2, 0x77, 0x07, 0x66, 0xfa, 0x9f, 0x4f, 0xf9, 0x3f, 0x9f, 0x74, 0xa9, 0xec, 0x0e, 0x5e, - 0x89, 0x87, 0x2d, 0x40, 0x23, 0xac, 0x76, 0x8d, 0xa4, 0x40, 0x8f, 0xa0, 0x91, 0x42, 0xb5, 0xe2, - 0x5d, 0xb1, 0x71, 0x4c, 0xb6, 0x94, 0xd2, 0x5e, 0xab, 0x33, 0xfb, 0xbd, 0xac, 0x05, 0x34, 0x9b, - 0x78, 0x49, 0xbe, 0x47, 0x8c, 0x63, 0x9a, 0x4c, 0xe6, 0xc4, 0xc0, 0x17, 0xb0, 0x36, 0x4b, 0xd0, - 0x36, 0x36, 0xa0, 0x38, 0x33, 0xda, 0x27, 0x67, 0x21, 0xf5, 0x06, 0xf9, 0xfc, 0x88, 0xcc, 0xea, - 0x7b, 0xa7, 0xd4, 0x3a, 0xb4, 0xe6, 0xa4, 0x74, 0xc3, 0x59, 0x50, 0x3b, 0xe5, 0x24, 0x92, 0xb1, - 0x26, 0xae, 0x35, 0xa0, 0x6e, 0x60, 0x9a, 0xf1, 0xf7, 0xd0, 0x9a, 0x80, 0xdf, 0xfb, 0xa1, 0x3f, - 0x8c, 0x87, 0x37, 0x30, 0x6d, 0x3d, 0x00, 0xf9, 0x2e, 0xb9, 0xdc, 0x1f, 0xe2, 0x64, 0x81, 0x2b, - 0x38, 0x25, 0x81, 0xbd, 0x52, 0x90, 0xfd, 0x25, 0xb4, 0xe7, 0x35, 0xdf, 0x20, 0x17, 0xd2, 0x4d, - 0x44, 0x79, 0xca, 0x77, 0x71, 0x9b, 0x06, 0xa8, 0x9d, 0xff, 0x03, 0xdc, 0x9f, 0xa2, 0x67, 0x21, - 0xf7, 0x83, 0x7d, 0x31, 0xce, 0x3e, 0x50, 0x00, 0x9b, 0xf0, 0x7f, 0xd9, 0xda, 0xa7, 0x39, 0x16, - 0x6b, 0xa1, 0xa0, 0x4e, 0xea, 0xeb, 0x17, 0x6a, 0x55, 0xd4, 0x98, 0x8e, 0xb6, 0x09, 0x8b, 0xc8, - 0xf3, 0x68, 0xf2, 0x00, 0xab, 0x83, 0xb8, 0x3d, 0x07, 0x33, 0xb1, 0x37, 0x4d, 0x2a, 0x2d, 0xd1, - 0xb2, 0x01, 0xed, 0x79, 0x92, 0xb6, 0xba, 0x0b, 0xad, 0xd7, 0x06, 0x2e, 0x9a, 0x25, 0xb3, 0xd9, - 0x96, 0x75, 0xb3, 0xd9, 0x47, 0xd0, 0x9e, 0x17, 0xb8, 0x53, 0x9b, 0x7f, 0x64, 0xea, 0x99, 0x56, - 0x5e, 0x62, 0xbe, 0x0a, 0x79, 0xdf, 0xd3, 0x6b, 0x7e, 0xde, 0xf7, 0x52, 0xe9, 0xcf, 0xcf, 0x5c, - 0xf2, 0x36, 0x6c, 0x5e, 0xa7, 0x4c, 0xc7, 0xd9, 0x80, 0xfa, 0x8b, 0xd0, 0xe7, 0xaa, 0x99, 0x92, - 0xc4, 0x7c, 0x0a, 0x96, 0x09, 0xde, 0xa0, 0x9a, 0x7e, 0xce, 0xc1, 0xe6, 0x09, 0x89, 0xe2, 0x40, - 0xee, 0x81, 0x11, 0xa2, 0x38, 0xe4, 0xdf, 0x92, 0x98, 0x86, 0x28, 0x48, 0xfc, 0xfe, 0x7f, 0x58, - 0x11, 0x55, 0xe0, 0xf6, 0x28, 0x46, 0x1c, 0x7b, 0x6e, 0x98, 0x7c, 0xab, 0x54, 0x04, 0x7c, 0xa0, - 0xd0, 0x1f, 0x98, 0xf8, 0x9e, 0x41, 0x3d, 0xa1, 0xd4, 0x1c, 0xc9, 0xa0, 0x20, 0x39, 0x96, 0xbf, - 0x82, 0xf2, 0x50, 0x7a, 0xe6, 0xa2, 0xc0, 0x47, 0x6a, 0x34, 0x97, 0xf6, 0x56, 0x67, 0x77, 0xdb, - 0x7d, 0x41, 0x74, 0x4a, 0x8a, 0x55, 0x1e, 0xac, 0xcf, 0xa0, 0x69, 0x0c, 0x9c, 0xe9, 0x0a, 0xb8, - 0x20, 0x6d, 0x34, 0x0c, 0xda, 0x64, 0x13, 0x7c, 0x00, 0x5b, 0xd7, 0xc6, 0xa5, 0x53, 0xf8, 0xa7, - 0x1c, 0xd4, 0x44, 0xba, 0xcc, 0x4e, 0xb2, 0x7e, 0x05, 0x4b, 0x8a, 0x5b, 0x5f, 0xf9, 0x35, 0xee, - 0x69, 0xa6, 0x6b, 0x3d, 0xcb, 0x5f, 0xeb, 0x59, 0x56, 0x3e, 0x0b, 0x19, 0xf9, 0x4c, 0x6e, 0x38, - 0xdd, 0xd2, 0xab, 0xd0, 0x78, 0x8a, 0x87, 0x84, 0xe3, 0xf4, 0xc5, 0xef, 0x41, 0x33, 0x0d, 0xdf, - 0xe0, 0xea, 0xd7, 0xa1, 0x75, 0x16, 0x7a, 0x24, 0x4b, 0xdd, 0x06, 0xb4, 0xe7, 0x49, 0xda, 0x83, - 0x6f, 0x60, 0xeb, 0x84, 0x12, 0x41, 0x90, 0x9e, 0xbd, 0x19, 0xe0, 0xf0, 0x00, 0xc5, 0xfd, 0x01, - 0x3f, 0x8b, 0x6e, 0x32, 0x94, 0x7f, 0x0b, 0xdb, 0xd7, 0x8b, 0xdf, 0xcc, 0x6b, 0x25, 0x88, 0x98, - 0xd6, 0xe3, 0x19, 0x5e, 0xcf, 0x93, 0xb4, 0xd7, 0x7f, 0xcf, 0x41, 0xed, 0x14, 0xa7, 0xdb, 0xe5, - 0xb6, 0x77, 0x9d, 0x71, 0x71, 0xf9, 0xac, 0x46, 0x98, 0xfb, 0x52, 0x59, 0x98, 0xff, 0x52, 0xb1, - 0x1e, 0x43, 0x5d, 0xae, 0xef, 0xe2, 0xf3, 0x9f, 0x72, 0x97, 0x09, 0xc7, 0xf5, 0xd6, 0xbe, 0x22, - 0x09, 0xd3, 0xd9, 0x2a, 0x47, 0x3e, 0x9e, 0xe9, 0x6a, 0xfb, 0xc5, 0x34, 0x5a, 0x07, 0x4b, 0x25, - 0x93, 0x4c, 0xdc, 0x32, 0x30, 0xf1, 0x39, 0x96, 0xa1, 0x4a, 0xdb, 0x79, 0x04, 0xb6, 0x78, 0xa7, - 0x8c, 0x69, 0xb4, 0x1f, 0x7a, 0x62, 0x88, 0xa7, 0x16, 0x87, 0xd7, 0xf0, 0xf0, 0x9d, 0x5c, 0x77, - 0x5d, 0x24, 0x56, 0xa1, 0x61, 0x96, 0x8b, 0x51, 0xef, 0x69, 0xf8, 0x06, 0x95, 0xd3, 0x82, 0x55, - 0x2d, 0xa3, 0xbd, 0x34, 0x76, 0x92, 0x59, 0xc2, 0x0d, 0xd4, 0x9d, 0x42, 0xe5, 0x09, 0xea, 0x5d, - 0xc4, 0x93, 0xaa, 0xdf, 0x86, 0x52, 0x8f, 0x84, 0xbd, 0x98, 0x52, 0x1c, 0xf6, 0xc6, 0x7a, 0x46, - 0x9a, 0x90, 0xe0, 0x90, 0x1f, 0x64, 0xea, 0x26, 0xf5, 0x57, 0x9c, 0x09, 0xd9, 0x5f, 0x42, 0x35, - 0x51, 0xaa, 0x5d, 0x78, 0x04, 0x8b, 0x78, 0x34, 0xbd, 0xc9, 0x6a, 0x27, 0xf9, 0x97, 0xc4, 0xa1, - 0x40, 0x1d, 0x45, 0xd4, 0x2f, 0x22, 0x27, 0x14, 0x1f, 0x51, 0x32, 0x4c, 0xf9, 0x65, 0xef, 0xc3, - 0x7a, 0x06, 0xed, 0x36, 0xea, 0x9f, 0x7c, 0xfa, 0x53, 0x67, 0xe4, 0x73, 0xcc, 0x58, 0xc7, 0x27, - 0xbb, 0xea, 0xd7, 0x6e, 0x9f, 0xec, 0x8e, 0xf8, 0xae, 0xfc, 0xc7, 0xc8, 0xee, 0xdc, 0x97, 0x54, - 0x77, 0x49, 0x12, 0x3e, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xb5, 0x81, 0x15, 0xa2, - 0x19, 0x00, 0x00, + 0x15, 0x06, 0x49, 0x49, 0xa6, 0x0e, 0x7f, 0x44, 0x2e, 0x29, 0x91, 0x92, 0x1b, 0x59, 0x5e, 0x3b, + 0x8d, 0xeb, 0xa2, 0x54, 0xa2, 0xa4, 0x41, 0x90, 0xa2, 0x40, 0x65, 0x59, 0xb2, 0x9d, 0x28, 0xb1, + 0xb2, 0xf2, 0x4f, 0x11, 0x14, 0x58, 0x0c, 0x77, 0x47, 0xe4, 0x42, 0xcb, 0x9d, 0xf5, 0xcc, 0x2c, + 0x25, 0xbe, 0x44, 0x9f, 0xa0, 0x77, 0x05, 0xda, 0xfb, 0x5e, 0xf6, 0x41, 0xd2, 0x47, 0xe9, 0x45, + 0x2f, 0x5a, 0xcc, 0xcf, 0x92, 0xb3, 0xe4, 0xca, 0x96, 0x5c, 0x17, 0xe8, 0x8d, 0xc1, 0xf9, 0xce, + 0xff, 0x99, 0x73, 0xce, 0x9c, 0xb5, 0xa0, 0xc3, 0x51, 0x3f, 0xc4, 0x7c, 0x84, 0x22, 0x34, 0xc0, + 0xd4, 0x47, 0x1c, 0xf5, 0x62, 0x4a, 0x38, 0xb1, 0x9a, 0x0b, 0x84, 0xad, 0xca, 0x9b, 0x04, 0xd3, + 0x89, 0xa2, 0x6f, 0xd5, 0x39, 0x89, 0xc9, 0x8c, 0x7f, 0x6b, 0x9d, 0xe2, 0x38, 0x0c, 0x3c, 0xc4, + 0x03, 0x12, 0x19, 0x70, 0x2d, 0x24, 0x83, 0x84, 0x07, 0xa1, 0x3a, 0xda, 0xff, 0x2e, 0xc0, 0xda, + 0x0b, 0xa1, 0xf8, 0x31, 0x3e, 0x0b, 0xa2, 0x40, 0x30, 0x5b, 0x16, 0x2c, 0x45, 0x68, 0x84, 0xbb, + 0x85, 0x9d, 0xc2, 0x83, 0x55, 0x47, 0xfe, 0xb6, 0x36, 0x60, 0x85, 0x79, 0x43, 0x3c, 0x42, 0xdd, + 0xa2, 0x44, 0xf5, 0xc9, 0xea, 0xc2, 0x2d, 0x8f, 0x84, 0xc9, 0x28, 0x62, 0xdd, 0xd2, 0x4e, 0xe9, + 0xc1, 0xaa, 0x93, 0x1e, 0xad, 0x1e, 0xb4, 0x62, 0x1a, 0x8c, 0x10, 0x9d, 0xb8, 0xe7, 0x78, 0xe2, + 0xa6, 0x5c, 0x4b, 0x92, 0xab, 0xa9, 0x49, 0xdf, 0xe2, 0xc9, 0x81, 0xe6, 0xb7, 0x60, 0x89, 0x4f, + 0x62, 0xdc, 0x5d, 0x56, 0x56, 0xc5, 0x6f, 0xeb, 0x0e, 0x54, 0x84, 0xeb, 0x6e, 0x88, 0xa3, 0x01, + 0x1f, 0x76, 0x57, 0x76, 0x0a, 0x0f, 0x96, 0x1c, 0x10, 0xd0, 0xb1, 0x44, 0xac, 0xdb, 0xb0, 0x4a, + 0xc9, 0x85, 0xeb, 0x91, 0x24, 0xe2, 0xdd, 0x5b, 0x92, 0x5c, 0xa6, 0xe4, 0xe2, 0x40, 0x9c, 0xad, + 0xfb, 0xb0, 0x72, 0x16, 0xe0, 0xd0, 0x67, 0xdd, 0xf2, 0x4e, 0xe9, 0x41, 0x65, 0xaf, 0xda, 0x53, + 0xf9, 0x3a, 0x12, 0xa0, 0xa3, 0x69, 0xf6, 0x5f, 0x0a, 0xd0, 0x38, 0x95, 0xc1, 0x18, 0x29, 0xf8, + 0x04, 0xd6, 0x84, 0x95, 0x3e, 0x62, 0xd8, 0xd5, 0x71, 0xab, 0x6c, 0xd4, 0x53, 0x58, 0x89, 0x58, + 0xcf, 0x41, 0xdd, 0x8b, 0xeb, 0x4f, 0x85, 0x59, 0xb7, 0x28, 0xcd, 0xd9, 0xbd, 0xc5, 0xab, 0x9c, + 0x4b, 0xb5, 0xd3, 0xe0, 0x59, 0x80, 0x89, 0x84, 0x8e, 0x31, 0x65, 0x01, 0x89, 0xba, 0x25, 0x69, + 0x31, 0x3d, 0x0a, 0x47, 0x2d, 0x65, 0xf5, 0x60, 0x88, 0xa2, 0x01, 0x76, 0x30, 0x4b, 0x42, 0x6e, + 0x3d, 0x85, 0x5a, 0x1f, 0x9f, 0x11, 0x9a, 0x71, 0xb4, 0xb2, 0x77, 0x2f, 0xc7, 0xfa, 0x7c, 0x98, + 0x4e, 0x55, 0x49, 0xea, 0x58, 0x8e, 0xa0, 0x8a, 0xce, 0x38, 0xa6, 0xae, 0x71, 0xd3, 0xd7, 0x54, + 0x54, 0x91, 0x82, 0x0a, 0xb6, 0xff, 0x59, 0x80, 0xfa, 0x4b, 0x86, 0xe9, 0x09, 0xa6, 0xa3, 0x80, + 0x31, 0x5d, 0x52, 0x43, 0xc2, 0x78, 0x5a, 0x52, 0xe2, 0xb7, 0xc0, 0x12, 0x86, 0xa9, 0x2e, 0x28, + 0xf9, 0xdb, 0xfa, 0x25, 0x34, 0x63, 0xc4, 0xd8, 0x05, 0xa1, 0xbe, 0xeb, 0x0d, 0xb1, 0x77, 0xce, + 0x92, 0x91, 0xcc, 0xc3, 0x92, 0xd3, 0x48, 0x09, 0x07, 0x1a, 0xb7, 0x7e, 0x00, 0x88, 0x69, 0x30, + 0x0e, 0x42, 0x3c, 0xc0, 0xaa, 0xb0, 0x2a, 0x7b, 0x9f, 0xe5, 0x78, 0x9b, 0xf5, 0xa5, 0x77, 0x32, + 0x95, 0x39, 0x8c, 0x38, 0x9d, 0x38, 0x86, 0x92, 0xad, 0xdf, 0xc2, 0xda, 0x1c, 0xd9, 0x6a, 0x40, + 0xe9, 0x1c, 0x4f, 0xb4, 0xe7, 0xe2, 0xa7, 0xd5, 0x86, 0xe5, 0x31, 0x0a, 0x13, 0xac, 0x3d, 0x57, + 0x87, 0xaf, 0x8b, 0x5f, 0x15, 0xec, 0x9f, 0x0a, 0x50, 0x7d, 0xdc, 0x7f, 0x47, 0xdc, 0x75, 0x28, + 0xfa, 0x7d, 0x2d, 0x5b, 0xf4, 0xfb, 0xd3, 0x3c, 0x94, 0x8c, 0x3c, 0x3c, 0xcf, 0x09, 0x6d, 0x37, + 0x27, 0x34, 0xd3, 0xd8, 0xff, 0x32, 0xb0, 0x3f, 0x17, 0xa0, 0x32, 0xb3, 0xc4, 0xac, 0x63, 0x68, + 0x08, 0x3f, 0xdd, 0x78, 0x86, 0x75, 0x0b, 0xd2, 0xcb, 0xbb, 0xef, 0xbc, 0x00, 0x67, 0x2d, 0xc9, + 0x9c, 0x99, 0x75, 0x04, 0x75, 0xbf, 0x9f, 0xd1, 0xa5, 0x3a, 0xe8, 0xce, 0x3b, 0x22, 0x76, 0x6a, + 0xbe, 0x71, 0x62, 0xf6, 0x27, 0x50, 0x39, 0x09, 0xa2, 0x81, 0x83, 0xdf, 0x24, 0x98, 0x71, 0xd1, + 0x4a, 0x31, 0x9a, 0x84, 0x04, 0xf9, 0x3a, 0xc8, 0xf4, 0x68, 0x3f, 0x80, 0xaa, 0x62, 0x64, 0x31, + 0x89, 0x18, 0x7e, 0x0b, 0xe7, 0x43, 0xa8, 0x9e, 0x86, 0x18, 0xc7, 0xa9, 0xce, 0x2d, 0x28, 0xfb, + 0x09, 0x95, 0x43, 0x55, 0xb2, 0x96, 0x9c, 0xe9, 0xd9, 0x5e, 0x83, 0x9a, 0xe6, 0x55, 0x6a, 0xed, + 0x7f, 0x14, 0xc0, 0x3a, 0xbc, 0xc4, 0x5e, 0xc2, 0xf1, 0x53, 0x42, 0xce, 0x53, 0x1d, 0x79, 0xf3, + 0x75, 0x1b, 0x20, 0x46, 0x14, 0x8d, 0x30, 0xc7, 0x54, 0x85, 0xbf, 0xea, 0x18, 0x88, 0x75, 0x02, + 0xab, 0xf8, 0x92, 0x53, 0xe4, 0xe2, 0x68, 0x2c, 0x27, 0x6d, 0x65, 0xef, 0xf3, 0x9c, 0xec, 0x2c, + 0x5a, 0xeb, 0x1d, 0x0a, 0xb1, 0xc3, 0x68, 0xac, 0x6a, 0xa2, 0x8c, 0xf5, 0x71, 0xeb, 0x37, 0x50, + 0xcb, 0x90, 0x6e, 0x54, 0x0f, 0x67, 0xd0, 0xca, 0x98, 0xd2, 0x79, 0xbc, 0x03, 0x15, 0x7c, 0x19, + 0x70, 0x97, 0x71, 0xc4, 0x13, 0xa6, 0x13, 0x04, 0x02, 0x3a, 0x95, 0x88, 0x7c, 0x46, 0xb8, 0x4f, + 0x12, 0x3e, 0x7d, 0x46, 0xe4, 0x49, 0xe3, 0x98, 0xa6, 0x5d, 0xa0, 0x4f, 0xf6, 0x18, 0x1a, 0x4f, + 0x30, 0x57, 0x73, 0x25, 0x4d, 0xdf, 0x06, 0xac, 0xc8, 0xc0, 0x55, 0xc5, 0xad, 0x3a, 0xfa, 0x64, + 0xdd, 0x83, 0x5a, 0x10, 0x79, 0x61, 0xe2, 0x63, 0x77, 0x1c, 0xe0, 0x0b, 0x26, 0x4d, 0x94, 0x9d, + 0xaa, 0x06, 0x5f, 0x09, 0xcc, 0xfa, 0x18, 0xea, 0xf8, 0x52, 0x31, 0x69, 0x25, 0xea, 0xd9, 0xaa, + 0x69, 0x54, 0x0e, 0x68, 0x66, 0x63, 0x68, 0x1a, 0x76, 0x75, 0x74, 0x27, 0xd0, 0x54, 0x93, 0xd1, + 0x18, 0xf6, 0x37, 0x99, 0xb6, 0x0d, 0x36, 0x87, 0xd8, 0x1d, 0x58, 0x7f, 0x82, 0xb9, 0x51, 0xc2, + 0x3a, 0x46, 0xfb, 0x47, 0xd8, 0x98, 0x27, 0x68, 0x27, 0x7e, 0x07, 0x95, 0x6c, 0xd3, 0x09, 0xf3, + 0xdb, 0x39, 0xe6, 0x4d, 0x61, 0x53, 0xc4, 0x6e, 0x83, 0x75, 0x8a, 0xb9, 0x83, 0x91, 0xff, 0x3c, + 0x0a, 0x27, 0xa9, 0xc5, 0x75, 0x68, 0x65, 0x50, 0x5d, 0xc2, 0x33, 0xf8, 0x35, 0x0d, 0x38, 0x4e, + 0xb9, 0x37, 0xa0, 0x9d, 0x85, 0x35, 0xfb, 0x37, 0xd0, 0x54, 0x8f, 0xd3, 0x8b, 0x49, 0x9c, 0x32, + 0x5b, 0xbf, 0x86, 0x8a, 0x72, 0xcf, 0x95, 0x0f, 0xbc, 0x70, 0xb9, 0xbe, 0xd7, 0xee, 0x4d, 0xf7, + 0x15, 0x99, 0x73, 0x2e, 0x25, 0x80, 0x4f, 0x7f, 0x0b, 0x3f, 0x4d, 0x5d, 0x33, 0x87, 0x1c, 0x7c, + 0x46, 0x31, 0x1b, 0x8a, 0x92, 0x32, 0x1d, 0xca, 0xc2, 0x9a, 0xbd, 0x03, 0xeb, 0x4e, 0x12, 0x3d, + 0xc5, 0x28, 0xe4, 0x43, 0xf9, 0x70, 0xa4, 0x02, 0x5d, 0xd8, 0x98, 0x27, 0x68, 0x91, 0x2f, 0xa0, + 0xfb, 0x6c, 0x10, 0x11, 0x8a, 0x15, 0xf1, 0x90, 0x52, 0x42, 0x33, 0x23, 0x85, 0x73, 0x4c, 0xa3, + 0xd9, 0xa0, 0x90, 0x47, 0xfb, 0x36, 0x6c, 0xe6, 0x48, 0x69, 0x95, 0x5f, 0x0b, 0xa7, 0xc5, 0x3c, + 0xc9, 0x56, 0xf2, 0x3d, 0xa8, 0x5d, 0xa0, 0x80, 0xbb, 0x31, 0x61, 0xb3, 0x62, 0x5a, 0x75, 0xaa, + 0x02, 0x3c, 0xd1, 0x98, 0x8a, 0xcc, 0x94, 0xd5, 0x3a, 0xf7, 0x60, 0xe3, 0x84, 0xe2, 0xb3, 0x30, + 0x18, 0x0c, 0xe7, 0x1a, 0x44, 0xec, 0x64, 0x32, 0x71, 0x69, 0x87, 0xa4, 0x47, 0x7b, 0x00, 0x9d, + 0x05, 0x19, 0x5d, 0x57, 0xc7, 0x50, 0x57, 0x5c, 0x2e, 0x95, 0x7b, 0x45, 0x3a, 0xcf, 0x3f, 0xbe, + 0xb2, 0xb2, 0xcd, 0x2d, 0xc4, 0xa9, 0x79, 0xc6, 0x89, 0xd9, 0xff, 0x2a, 0x80, 0xb5, 0x1f, 0xc7, + 0xe1, 0x24, 0xeb, 0x59, 0x03, 0x4a, 0xec, 0x4d, 0x98, 0x8e, 0x18, 0xf6, 0x26, 0x14, 0x23, 0xe6, + 0x8c, 0x50, 0x0f, 0xeb, 0x66, 0x55, 0x07, 0xb1, 0x06, 0xa0, 0x30, 0x24, 0x17, 0xae, 0xb1, 0xc3, + 0xca, 0xc9, 0x50, 0x76, 0x1a, 0x92, 0xe0, 0xcc, 0xf0, 0xc5, 0x05, 0x68, 0xe9, 0x43, 0x2d, 0x40, + 0xcb, 0xef, 0xb9, 0x00, 0xfd, 0xb5, 0x00, 0xad, 0x4c, 0xf4, 0x3a, 0xc7, 0xff, 0x7f, 0xab, 0x5a, + 0x0b, 0x9a, 0xc7, 0xc4, 0x3b, 0x57, 0x53, 0x2f, 0x6d, 0x8d, 0x36, 0x58, 0x26, 0x38, 0x6b, 0xbc, + 0x97, 0x51, 0xb8, 0xc0, 0xbc, 0x01, 0xed, 0x2c, 0xac, 0xd9, 0xff, 0x56, 0x80, 0xae, 0x7e, 0x22, + 0x8e, 0x30, 0xf7, 0x86, 0xfb, 0xec, 0x71, 0x7f, 0x5a, 0x07, 0x6d, 0x58, 0x96, 0xab, 0xb8, 0x4c, + 0x40, 0xd5, 0x51, 0x07, 0xab, 0x03, 0xb7, 0xfc, 0xbe, 0x2b, 0x9f, 0x46, 0xfd, 0x3a, 0xf8, 0xfd, + 0xef, 0xc5, 0xe3, 0xb8, 0x09, 0xe5, 0x11, 0xba, 0x74, 0x29, 0xb9, 0x60, 0x7a, 0x19, 0xbc, 0x35, + 0x42, 0x97, 0x0e, 0xb9, 0x60, 0x72, 0x51, 0x0f, 0x98, 0xdc, 0xc0, 0xfb, 0x41, 0x14, 0x92, 0x01, + 0x93, 0xd7, 0x5f, 0x76, 0xea, 0x1a, 0x7e, 0xa4, 0x50, 0xd1, 0x6b, 0x54, 0xb6, 0x91, 0x79, 0xb9, + 0x65, 0xa7, 0x4a, 0x8d, 0xde, 0xb2, 0x9f, 0xc0, 0x66, 0x8e, 0xcf, 0xfa, 0xf6, 0x1e, 0xc2, 0x8a, + 0x6a, 0x0d, 0x7d, 0x6d, 0x96, 0xfe, 0x9c, 0xf8, 0x41, 0xfc, 0xab, 0xdb, 0x40, 0x73, 0xd8, 0x7f, + 0x2c, 0xc0, 0x47, 0x59, 0x4d, 0xfb, 0x61, 0x28, 0x16, 0x30, 0xf6, 0xe1, 0x53, 0xb0, 0x10, 0xd9, + 0x52, 0x4e, 0x64, 0xc7, 0xb0, 0x7d, 0x95, 0x3f, 0xef, 0x11, 0xde, 0xb7, 0xf3, 0x77, 0xbb, 0x1f, + 0xc7, 0x6f, 0x0f, 0xcc, 0xf4, 0xbf, 0x98, 0xf1, 0x7f, 0x31, 0xe9, 0x52, 0xd9, 0x7b, 0x78, 0x25, + 0x1e, 0xb6, 0x10, 0x8d, 0xb1, 0xda, 0x35, 0xd2, 0x02, 0x3d, 0x82, 0x56, 0x06, 0xd5, 0x8a, 0x77, + 0xc5, 0xc6, 0x31, 0xdd, 0x52, 0x2a, 0x7b, 0x9d, 0xde, 0xfc, 0xf7, 0xb2, 0x16, 0xd0, 0x6c, 0xe2, + 0x25, 0xf9, 0x0e, 0x31, 0x8e, 0x69, 0x3a, 0x99, 0x53, 0x03, 0x5f, 0xc0, 0xc6, 0x3c, 0x41, 0xdb, + 0xd8, 0x82, 0xf2, 0xdc, 0x68, 0x9f, 0x9e, 0x85, 0xd4, 0x6b, 0x14, 0xf0, 0x23, 0x32, 0xaf, 0xef, + 0xad, 0x52, 0x9b, 0xd0, 0x59, 0x90, 0xd2, 0x0d, 0x67, 0x41, 0xe3, 0x94, 0x93, 0x58, 0xc6, 0x9a, + 0xba, 0xd6, 0x82, 0xa6, 0x81, 0x69, 0xc6, 0xdf, 0x43, 0x67, 0x0a, 0x7e, 0x17, 0x44, 0xc1, 0x28, + 0x19, 0x5d, 0xc3, 0xb4, 0x75, 0x17, 0xe4, 0xbb, 0xe4, 0xf2, 0x60, 0x84, 0xd3, 0x05, 0xae, 0xe4, + 0x54, 0x04, 0xf6, 0x42, 0x41, 0xf6, 0x97, 0xd0, 0x5d, 0xd4, 0x7c, 0x8d, 0x5c, 0x48, 0x37, 0x11, + 0xe5, 0x19, 0xdf, 0xc5, 0x6d, 0x1a, 0xa0, 0x76, 0xfe, 0x0f, 0x70, 0x7b, 0x86, 0xbe, 0x8c, 0x78, + 0x10, 0xee, 0x8b, 0x71, 0xf6, 0x81, 0x02, 0xd8, 0x86, 0x9f, 0xe5, 0x6b, 0x9f, 0xe5, 0x58, 0xac, + 0x85, 0x82, 0x3a, 0xad, 0xaf, 0x5f, 0xa8, 0x55, 0x51, 0x63, 0x3a, 0xda, 0x36, 0x2c, 0x23, 0xdf, + 0xa7, 0xe9, 0x03, 0xac, 0x0e, 0xe2, 0xf6, 0x1c, 0xcc, 0xc4, 0xde, 0x34, 0xad, 0xb4, 0x54, 0xcb, + 0x16, 0x74, 0x17, 0x49, 0xda, 0xea, 0x2e, 0x74, 0x5e, 0x19, 0xb8, 0x68, 0x96, 0xdc, 0x66, 0x5b, + 0xd5, 0xcd, 0x66, 0x1f, 0x41, 0x77, 0x51, 0xe0, 0xbd, 0xda, 0xfc, 0x23, 0x53, 0xcf, 0xac, 0xf2, + 0x52, 0xf3, 0x75, 0x28, 0x06, 0xbe, 0x5e, 0xf3, 0x8b, 0x81, 0x9f, 0x49, 0x7f, 0x71, 0xee, 0x92, + 0x77, 0x60, 0xfb, 0x2a, 0x65, 0x3a, 0xce, 0x16, 0x34, 0x9f, 0x45, 0x01, 0x57, 0xcd, 0x94, 0x26, + 0xe6, 0x53, 0xb0, 0x4c, 0xf0, 0x1a, 0xd5, 0xf4, 0x53, 0x01, 0xb6, 0x4f, 0x48, 0x9c, 0x84, 0x72, + 0x0f, 0x8c, 0x11, 0xc5, 0x11, 0xff, 0x86, 0x24, 0x34, 0x42, 0x61, 0xea, 0xf7, 0xcf, 0x61, 0x4d, + 0x54, 0x81, 0xeb, 0x51, 0x8c, 0x38, 0xf6, 0xdd, 0x28, 0xfd, 0x56, 0xa9, 0x09, 0xf8, 0x40, 0xa1, + 0xdf, 0x33, 0xf1, 0x3d, 0x83, 0x3c, 0xa1, 0xd4, 0x1c, 0xc9, 0xa0, 0x20, 0x39, 0x96, 0xbf, 0x82, + 0xea, 0x48, 0x7a, 0xe6, 0xa2, 0x30, 0x40, 0x6a, 0x34, 0x57, 0xf6, 0xd6, 0xe7, 0x77, 0xdb, 0x7d, + 0x41, 0x74, 0x2a, 0x8a, 0x55, 0x1e, 0xac, 0xcf, 0xa0, 0x6d, 0x0c, 0x9c, 0xd9, 0x0a, 0xb8, 0x24, + 0x6d, 0xb4, 0x0c, 0xda, 0x74, 0x13, 0xbc, 0x0b, 0x77, 0xae, 0x8c, 0x4b, 0xa7, 0xf0, 0x4f, 0x05, + 0x68, 0x88, 0x74, 0x99, 0x9d, 0x64, 0xfd, 0x0a, 0x56, 0x14, 0xb7, 0xbe, 0xf2, 0x2b, 0xdc, 0xd3, + 0x4c, 0x57, 0x7a, 0x56, 0xbc, 0xd2, 0xb3, 0xbc, 0x7c, 0x96, 0x72, 0xf2, 0x99, 0xde, 0x70, 0xb6, + 0xa5, 0xd7, 0xa1, 0xf5, 0x18, 0x8f, 0x08, 0xc7, 0xd9, 0x8b, 0xdf, 0x83, 0x76, 0x16, 0xbe, 0xc6, + 0xd5, 0x6f, 0x42, 0xe7, 0x65, 0xe4, 0x93, 0x3c, 0x75, 0x5b, 0xd0, 0x5d, 0x24, 0x69, 0x0f, 0x36, + 0xa1, 0x23, 0x5d, 0x7a, 0x8d, 0xd8, 0x09, 0x25, 0x82, 0xc1, 0x37, 0xc4, 0x16, 0x49, 0x5a, 0xec, + 0xef, 0x05, 0x68, 0x9c, 0xe2, 0x6c, 0xbd, 0xde, 0x34, 0xd9, 0x39, 0x99, 0x2b, 0xe6, 0x55, 0xe2, + 0xc2, 0xa7, 0xc2, 0xd2, 0xe2, 0xa7, 0x82, 0xf5, 0x10, 0x9a, 0x72, 0x7f, 0x16, 0xdf, 0xdf, 0x94, + 0xbb, 0x4c, 0x38, 0xae, 0xd7, 0xe6, 0x35, 0x49, 0x98, 0x0d, 0x37, 0x39, 0x73, 0xf1, 0x5c, 0x5b, + 0xd9, 0xcf, 0x66, 0xd1, 0x3a, 0x58, 0x2a, 0x99, 0x66, 0xe2, 0x86, 0x81, 0x89, 0xef, 0xa1, 0x1c, + 0x55, 0xda, 0xce, 0x7d, 0xb0, 0xc5, 0x43, 0x61, 0x8c, 0x83, 0xfd, 0xc8, 0x17, 0x53, 0x34, 0xf3, + 0x72, 0xbf, 0x82, 0x7b, 0x6f, 0xe5, 0xfa, 0x2f, 0x5e, 0x72, 0x7d, 0x97, 0x5a, 0xb5, 0xf1, 0x92, + 0xcf, 0x13, 0xae, 0x51, 0x74, 0xa7, 0x50, 0x7b, 0x84, 0xbc, 0xf3, 0x64, 0xba, 0x01, 0xed, 0x40, + 0xc5, 0x23, 0x91, 0x97, 0x50, 0x8a, 0x23, 0x6f, 0xa2, 0x27, 0x8b, 0x09, 0x09, 0x0e, 0xf9, 0x19, + 0xa3, 0xd2, 0xaf, 0xbf, 0x7d, 0x4c, 0xc8, 0xfe, 0x12, 0xea, 0xa9, 0x52, 0xed, 0xc2, 0x7d, 0x58, + 0xc6, 0xe3, 0x59, 0xfa, 0xeb, 0xbd, 0xf4, 0x3f, 0xf2, 0x0f, 0x05, 0xea, 0x28, 0xa2, 0x7e, 0x47, + 0x38, 0xa1, 0xf8, 0x88, 0x92, 0x51, 0xc6, 0x2f, 0x7b, 0x1f, 0x36, 0x73, 0x68, 0x37, 0x51, 0xff, + 0xe8, 0xd3, 0x1f, 0x7b, 0xe3, 0x80, 0x63, 0xc6, 0x7a, 0x01, 0xd9, 0x55, 0xbf, 0x76, 0x07, 0x64, + 0x77, 0xcc, 0x77, 0xe5, 0x9f, 0x13, 0x76, 0x17, 0xbe, 0x3f, 0xfa, 0x2b, 0x92, 0xf0, 0xf9, 0x7f, + 0x02, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xf1, 0x1f, 0x3a, 0xd8, 0x18, 0x00, 0x00, } diff --git a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go index e5fca39d81f..83864faddba 100644 --- a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go +++ b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go @@ -29,70 +29,68 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("tabletmanagerservice.proto", fileDescriptor_9ee75fe63cfd9360) } var fileDescriptor_9ee75fe63cfd9360 = []byte{ - // 1002 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x98, 0xdf, 0x6f, 0x1c, 0x35, - 0x10, 0xc7, 0x89, 0x04, 0x95, 0x30, 0x3f, 0x6b, 0x55, 0x14, 0x05, 0x89, 0x5f, 0x4d, 0xf9, 0x91, - 0xa2, 0x5c, 0xdb, 0x08, 0xde, 0xaf, 0x69, 0xd3, 0x06, 0x35, 0xe2, 0xb8, 0x6b, 0x08, 0x02, 0x09, - 0xc9, 0xb9, 0x9b, 0xdc, 0x2e, 0xd9, 0xb3, 0x8d, 0xed, 0x3d, 0x91, 0x27, 0x04, 0x12, 0xaf, 0xfc, - 0xcd, 0x68, 0xf7, 0xd6, 0xde, 0xf1, 0xde, 0xac, 0xef, 0xf2, 0x16, 0xdd, 0xf7, 0x33, 0x33, 0xf6, - 0x78, 0x66, 0xec, 0x2c, 0xdb, 0x75, 0xe2, 0xa2, 0x00, 0xb7, 0x10, 0x52, 0xcc, 0xc1, 0x58, 0x30, - 0xcb, 0x7c, 0x0a, 0x07, 0xda, 0x28, 0xa7, 0xf8, 0x1d, 0x4a, 0xdb, 0xbd, 0x1b, 0xfd, 0x3a, 0x13, - 0x4e, 0xac, 0xf0, 0xc7, 0x7f, 0xef, 0xb1, 0x77, 0x5e, 0xd5, 0xda, 0xe9, 0x4a, 0xe3, 0x27, 0xec, - 0xf5, 0x51, 0x2e, 0xe7, 0xfc, 0xe3, 0x83, 0x75, 0x9b, 0x4a, 0x18, 0xc3, 0x1f, 0x25, 0x58, 0xb7, - 0xfb, 0x49, 0xaf, 0x6e, 0xb5, 0x92, 0x16, 0x3e, 0x7f, 0x8d, 0xbf, 0x64, 0x6f, 0x4c, 0x0a, 0x00, - 0xcd, 0x29, 0xb6, 0x56, 0xbc, 0xb3, 0x4f, 0xfb, 0x81, 0xe0, 0xed, 0x37, 0xf6, 0xd6, 0xb3, 0x3f, - 0x61, 0x5a, 0x3a, 0x78, 0xa1, 0xd4, 0x15, 0xbf, 0x4f, 0x98, 0x20, 0xdd, 0x7b, 0xfe, 0x62, 0x13, - 0x16, 0xfc, 0xff, 0xcc, 0xde, 0x7c, 0x0e, 0x6e, 0x32, 0xcd, 0x60, 0x21, 0xf8, 0x3d, 0xc2, 0x2c, - 0xa8, 0xde, 0xf7, 0x5e, 0x1a, 0x0a, 0x9e, 0xe7, 0xec, 0xdd, 0xe7, 0xe0, 0x46, 0x60, 0x16, 0xb9, - 0xb5, 0xb9, 0x92, 0x96, 0x7f, 0x45, 0x5b, 0x22, 0xc4, 0xc7, 0xf8, 0x7a, 0x0b, 0x12, 0xa7, 0x68, - 0x02, 0x6e, 0x0c, 0x62, 0xf6, 0x83, 0x2c, 0xae, 0xc9, 0x14, 0x21, 0x3d, 0x95, 0xa2, 0x08, 0x0b, - 0xfe, 0x05, 0x7b, 0xbb, 0x11, 0xce, 0x4d, 0xee, 0x80, 0x27, 0x2c, 0x6b, 0xc0, 0x47, 0xf8, 0x72, - 0x23, 0x17, 0x42, 0xfc, 0xca, 0xd8, 0x51, 0x26, 0xe4, 0x1c, 0x5e, 0x5d, 0x6b, 0xe0, 0x54, 0x86, - 0x5b, 0xd9, 0xbb, 0xbf, 0xbf, 0x81, 0xc2, 0xeb, 0x1f, 0xc3, 0xa5, 0x01, 0x9b, 0x4d, 0x9c, 0xe8, - 0x59, 0x3f, 0x06, 0x52, 0xeb, 0x8f, 0x39, 0x7c, 0xd6, 0xe3, 0x52, 0xbe, 0x00, 0x51, 0xb8, 0xec, - 0x28, 0x83, 0xe9, 0x15, 0x79, 0xd6, 0x31, 0x92, 0x3a, 0xeb, 0x2e, 0x19, 0x02, 0x69, 0x76, 0xfb, - 0x64, 0x2e, 0x95, 0x81, 0x95, 0xfc, 0xcc, 0x18, 0x65, 0xf8, 0x03, 0xc2, 0xc3, 0x1a, 0xe5, 0xc3, - 0x7d, 0xb3, 0x1d, 0x1c, 0x67, 0xaf, 0x50, 0x62, 0xd6, 0xf4, 0x08, 0x9d, 0xbd, 0x16, 0x48, 0x67, - 0x0f, 0x73, 0x21, 0xc4, 0xef, 0xec, 0xbd, 0x91, 0x81, 0xcb, 0x22, 0x9f, 0x67, 0xbe, 0x13, 0xa9, - 0xa4, 0x74, 0x18, 0x1f, 0x68, 0x7f, 0x1b, 0x14, 0x37, 0xcb, 0x50, 0xeb, 0xe2, 0xba, 0x89, 0x43, - 0x15, 0x11, 0xd2, 0x53, 0xcd, 0x12, 0x61, 0xb8, 0x92, 0x5f, 0xaa, 0xe9, 0x55, 0x3d, 0x5d, 0x2d, - 0x59, 0xc9, 0xad, 0x9c, 0xaa, 0x64, 0x4c, 0xe1, 0xb3, 0x38, 0x93, 0x45, 0xeb, 0x9e, 0x5a, 0x16, - 0x06, 0x52, 0x67, 0x11, 0x73, 0xb8, 0xc0, 0x9a, 0x41, 0x79, 0x0c, 0x6e, 0x9a, 0x0d, 0xed, 0xd3, - 0x0b, 0x41, 0x16, 0xd8, 0x1a, 0x95, 0x2a, 0x30, 0x02, 0x0e, 0x11, 0xff, 0x62, 0x1f, 0xc4, 0xf2, - 0xb0, 0x28, 0x46, 0x26, 0x5f, 0x5a, 0xfe, 0x70, 0xa3, 0x27, 0x8f, 0xfa, 0xd8, 0x8f, 0x6e, 0x60, - 0xd1, 0xbf, 0xe5, 0xa1, 0xd6, 0x5b, 0x6c, 0x79, 0xa8, 0xf5, 0xf6, 0x5b, 0xae, 0xe1, 0x68, 0x62, - 0x17, 0x62, 0x09, 0xd5, 0x18, 0x29, 0x2d, 0x3d, 0xb1, 0x5b, 0x3d, 0x39, 0xb1, 0x31, 0x86, 0xc7, - 0xd1, 0xa9, 0xb0, 0x0e, 0xcc, 0x48, 0xd9, 0xdc, 0xe5, 0x4a, 0x92, 0xe3, 0x28, 0x46, 0x52, 0xe3, - 0xa8, 0x4b, 0xe2, 0xce, 0x3d, 0x17, 0xb9, 0x3b, 0x56, 0x6d, 0x24, 0xca, 0xbe, 0xc3, 0xa4, 0x3a, - 0x77, 0x0d, 0xc5, 0x37, 0xf5, 0xc4, 0x29, 0x5d, 0xef, 0x98, 0xbc, 0xa9, 0x83, 0x9a, 0xba, 0xa9, - 0x11, 0x14, 0x3c, 0x2f, 0xd8, 0xfb, 0xe1, 0xe7, 0xd3, 0x5c, 0xe6, 0x8b, 0x72, 0xc1, 0xf7, 0x53, - 0xb6, 0x0d, 0xe4, 0xe3, 0x3c, 0xd8, 0x8a, 0xc5, 0x23, 0x62, 0xe2, 0x84, 0x71, 0xab, 0x9d, 0xd0, - 0x8b, 0xf4, 0x72, 0x6a, 0x44, 0x60, 0x2a, 0x38, 0xbf, 0x66, 0x77, 0xda, 0xdf, 0xcf, 0xa4, 0xcb, - 0x8b, 0xe1, 0xa5, 0x03, 0xc3, 0x0f, 0x92, 0x0e, 0x5a, 0xd0, 0x07, 0x1c, 0x6c, 0xcd, 0x77, 0x9f, - 0x52, 0x95, 0x6e, 0x7b, 0x9f, 0x52, 0xb5, 0xba, 0xe9, 0x29, 0xd5, 0x40, 0xf8, 0x80, 0x7e, 0x1a, - 0x83, 0x2e, 0xf2, 0xa9, 0xa8, 0x8a, 0xa2, 0x6a, 0x2d, 0xf2, 0x80, 0xba, 0x50, 0xea, 0x80, 0xd6, - 0x59, 0x3c, 0x91, 0xb0, 0xda, 0x96, 0x24, 0x39, 0x91, 0x68, 0x34, 0x35, 0x91, 0xfa, 0x2c, 0xf0, - 0x7e, 0xc7, 0x60, 0xab, 0xa7, 0x52, 0xe0, 0xc8, 0xfd, 0x76, 0xa1, 0xd4, 0x7e, 0xd7, 0x59, 0x5c, - 0x90, 0x27, 0x32, 0x77, 0xab, 0x2e, 0x27, 0x0b, 0xb2, 0x95, 0x53, 0x05, 0x89, 0xa9, 0xe0, 0xfc, - 0x9f, 0x1d, 0x76, 0x77, 0xa4, 0x74, 0x59, 0xd4, 0x2f, 0x26, 0x2d, 0x0c, 0x48, 0xf7, 0xbd, 0x2a, - 0x8d, 0x14, 0x05, 0xa7, 0x92, 0xd3, 0xc3, 0xfa, 0xb8, 0x8f, 0x6f, 0x62, 0x82, 0x4b, 0xb3, 0x5a, - 0x5c, 0xff, 0xec, 0x08, 0x6a, 0xaa, 0x34, 0x11, 0x84, 0xaf, 0xe4, 0xa7, 0xb0, 0x50, 0x0e, 0x9a, - 0xec, 0x51, 0x43, 0x1a, 0x03, 0xa9, 0x2b, 0x39, 0xe6, 0x70, 0x35, 0x9c, 0xc9, 0x99, 0x8a, 0xc2, - 0xec, 0x93, 0x37, 0x7a, 0x0c, 0xa5, 0xaa, 0x61, 0x9d, 0x0d, 0xe1, 0xfe, 0xdd, 0x61, 0x1f, 0x8e, - 0x8c, 0xaa, 0xb4, 0x7a, 0xb3, 0xe7, 0x19, 0xc8, 0x23, 0x51, 0xce, 0x33, 0x77, 0xa6, 0x39, 0x99, - 0xfe, 0x1e, 0xd8, 0xc7, 0x3f, 0xbc, 0x91, 0x4d, 0x34, 0x95, 0x6b, 0x59, 0xd8, 0x86, 0x9e, 0xd1, - 0x53, 0xb9, 0x03, 0x25, 0xa7, 0xf2, 0x1a, 0x1b, 0x5d, 0x2f, 0xe0, 0x7b, 0xe0, 0x1e, 0xfd, 0xaf, - 0x4b, 0x9c, 0xd7, 0xbd, 0x34, 0x84, 0xdf, 0x17, 0x3e, 0xee, 0x18, 0x6c, 0x35, 0x43, 0x61, 0xc6, - 0x53, 0xab, 0x0b, 0x54, 0xea, 0x7d, 0x41, 0xc0, 0x21, 0xe2, 0x7f, 0x3b, 0xec, 0xa3, 0xea, 0x02, - 0x42, 0xed, 0x3e, 0x94, 0xb3, 0x6a, 0xb2, 0xae, 0x1e, 0x1c, 0xdf, 0xf6, 0x5c, 0x58, 0x3d, 0xbc, - 0x5f, 0xc6, 0x77, 0x37, 0x35, 0xc3, 0x5d, 0x82, 0x4f, 0x9c, 0xec, 0x12, 0x0c, 0xa4, 0xba, 0x24, - 0xe6, 0xf0, 0x9b, 0xa7, 0x51, 0x9a, 0xe5, 0x90, 0x6f, 0x9e, 0x18, 0x49, 0xbd, 0x79, 0xba, 0x64, - 0x08, 0xf4, 0x23, 0xbb, 0xf5, 0x44, 0x4c, 0xaf, 0x4a, 0xcd, 0xa9, 0xef, 0x17, 0x2b, 0xc9, 0x3b, - 0xfe, 0x2c, 0x41, 0x78, 0x87, 0x0f, 0x77, 0xb8, 0x61, 0xb7, 0xab, 0x63, 0x54, 0x06, 0x8e, 0x8d, - 0x5a, 0x34, 0xde, 0x7b, 0x86, 0x78, 0x4c, 0xa5, 0x2a, 0x84, 0x80, 0xdb, 0x98, 0x4f, 0x0e, 0x7f, - 0x79, 0xb4, 0xcc, 0x1d, 0x58, 0x7b, 0x90, 0xab, 0xc1, 0xea, 0xaf, 0xc1, 0x5c, 0x0d, 0x96, 0x6e, - 0x50, 0x7f, 0x23, 0x1a, 0x50, 0x5f, 0x94, 0x2e, 0x6e, 0xd5, 0xda, 0xe1, 0xff, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xd4, 0x4a, 0x50, 0x02, 0x8c, 0x12, 0x00, 0x00, + // 962 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x98, 0x5b, 0x6f, 0x23, 0x35, + 0x14, 0xc7, 0xa9, 0x04, 0x2b, 0x61, 0xae, 0x6b, 0xad, 0x58, 0xa9, 0x48, 0x5c, 0xf6, 0xc2, 0xa5, + 0x8b, 0x9a, 0xbd, 0x08, 0xde, 0xb3, 0x97, 0xee, 0x16, 0x6d, 0x45, 0x48, 0x5a, 0x8a, 0x40, 0x42, + 0x72, 0x93, 0xd3, 0xc4, 0x74, 0x62, 0x1b, 0xdb, 0x89, 0xc8, 0x13, 0x12, 0x1f, 0x80, 0x47, 0x3e, + 0xef, 0x6a, 0x26, 0x63, 0xcf, 0xf1, 0xe4, 0x8c, 0x93, 0xbe, 0x55, 0xf3, 0xff, 0xf9, 0x1c, 0xfb, + 0xf8, 0xf8, 0x6f, 0x37, 0x6c, 0xdf, 0x8b, 0x8b, 0x02, 0xfc, 0x5c, 0x28, 0x31, 0x05, 0xeb, 0xc0, + 0x2e, 0xe5, 0x18, 0x0e, 0x8d, 0xd5, 0x5e, 0xf3, 0x5b, 0x94, 0xb6, 0x7f, 0x3b, 0xf9, 0x3a, 0x11, + 0x5e, 0xac, 0xf1, 0xc7, 0xff, 0xdf, 0x61, 0x1f, 0x9c, 0x56, 0xda, 0xc9, 0x5a, 0xe3, 0xc7, 0xec, + 0xed, 0x81, 0x54, 0x53, 0xfe, 0xd9, 0xe1, 0xe6, 0x98, 0x52, 0x18, 0xc2, 0x5f, 0x0b, 0x70, 0x7e, + 0xff, 0xf3, 0x4e, 0xdd, 0x19, 0xad, 0x1c, 0xdc, 0x79, 0x8b, 0xbf, 0x66, 0xef, 0x8c, 0x0a, 0x00, + 0xc3, 0x29, 0xb6, 0x52, 0x42, 0xb0, 0x2f, 0xba, 0x81, 0x18, 0xed, 0x0f, 0xf6, 0xde, 0x8b, 0xbf, + 0x61, 0xbc, 0xf0, 0xf0, 0x4a, 0xeb, 0x2b, 0x7e, 0x9f, 0x18, 0x82, 0xf4, 0x10, 0xf9, 0xab, 0x6d, + 0x58, 0x8c, 0xff, 0x2b, 0x7b, 0xf7, 0x25, 0xf8, 0xd1, 0x78, 0x06, 0x73, 0xc1, 0xef, 0x12, 0xc3, + 0xa2, 0x1a, 0x62, 0xdf, 0xcb, 0x43, 0x31, 0xf2, 0x94, 0x7d, 0xf8, 0x12, 0xfc, 0x00, 0xec, 0x5c, + 0x3a, 0x27, 0xb5, 0x72, 0xfc, 0x1b, 0x7a, 0x24, 0x42, 0x42, 0x8e, 0x6f, 0x77, 0x20, 0x71, 0x89, + 0x46, 0xe0, 0x87, 0x20, 0x26, 0x3f, 0xa9, 0x62, 0x45, 0x96, 0x08, 0xe9, 0xb9, 0x12, 0x25, 0x58, + 0x8c, 0x2f, 0xd8, 0xfb, 0xb5, 0x70, 0x6e, 0xa5, 0x07, 0x9e, 0x19, 0x59, 0x01, 0x21, 0xc3, 0xd7, + 0x5b, 0xb9, 0x98, 0xe2, 0x77, 0xc6, 0x9e, 0xcd, 0x84, 0x9a, 0xc2, 0xe9, 0xca, 0x00, 0xa7, 0x2a, + 0xdc, 0xc8, 0x21, 0xfc, 0xfd, 0x2d, 0x14, 0x9e, 0xff, 0x10, 0x2e, 0x2d, 0xb8, 0xd9, 0xc8, 0x8b, + 0x8e, 0xf9, 0x63, 0x20, 0x37, 0xff, 0x94, 0xc3, 0x7b, 0x3d, 0x5c, 0xa8, 0x57, 0x20, 0x0a, 0x3f, + 0x7b, 0x36, 0x83, 0xf1, 0x15, 0xb9, 0xd7, 0x29, 0x92, 0xdb, 0xeb, 0x36, 0x19, 0x13, 0x19, 0x76, + 0xf3, 0x78, 0xaa, 0xb4, 0x85, 0xb5, 0xfc, 0xc2, 0x5a, 0x6d, 0xf9, 0x03, 0x22, 0xc2, 0x06, 0x15, + 0xd2, 0x7d, 0xb7, 0x1b, 0x9c, 0x56, 0xaf, 0xd0, 0x62, 0x52, 0x9f, 0x11, 0xba, 0x7a, 0x0d, 0x90, + 0xaf, 0x1e, 0xe6, 0x62, 0x8a, 0x3f, 0xd9, 0x47, 0x03, 0x0b, 0x97, 0x85, 0x9c, 0xce, 0xc2, 0x49, + 0xa4, 0x8a, 0xd2, 0x62, 0x42, 0xa2, 0x83, 0x5d, 0x50, 0x7c, 0x58, 0xfa, 0xc6, 0x14, 0xab, 0x3a, + 0x0f, 0xd5, 0x44, 0x48, 0xcf, 0x1d, 0x96, 0x04, 0xc3, 0x9d, 0xfc, 0x5a, 0x8f, 0xaf, 0x2a, 0x77, + 0x75, 0x64, 0x27, 0x37, 0x72, 0xae, 0x93, 0x31, 0x85, 0xf7, 0xe2, 0x4c, 0x15, 0x4d, 0x78, 0x6a, + 0x5a, 0x18, 0xc8, 0xed, 0x45, 0xca, 0xe1, 0x06, 0xab, 0x8d, 0xf2, 0x08, 0xfc, 0x78, 0xd6, 0x77, + 0xcf, 0x2f, 0x04, 0xd9, 0x60, 0x1b, 0x54, 0xae, 0xc1, 0x08, 0x38, 0x66, 0xfc, 0x87, 0x7d, 0x92, + 0xca, 0xfd, 0xa2, 0x18, 0x58, 0xb9, 0x74, 0xfc, 0xe1, 0xd6, 0x48, 0x01, 0x0d, 0xb9, 0x1f, 0x5d, + 0x63, 0x44, 0xf7, 0x92, 0xfb, 0xc6, 0xec, 0xb0, 0xe4, 0xbe, 0x31, 0xbb, 0x2f, 0xb9, 0x82, 0x13, + 0xc7, 0x2e, 0xc4, 0x12, 0x4a, 0x1b, 0x59, 0x38, 0xda, 0xb1, 0x1b, 0x3d, 0xeb, 0xd8, 0x18, 0xc3, + 0x76, 0x74, 0x22, 0x9c, 0x07, 0x3b, 0xd0, 0x4e, 0x7a, 0xa9, 0x15, 0x69, 0x47, 0x29, 0x92, 0xb3, + 0xa3, 0x36, 0x89, 0x4f, 0xee, 0xb9, 0x90, 0xfe, 0x48, 0x37, 0x99, 0xa8, 0xf1, 0x2d, 0x26, 0x77, + 0x72, 0x37, 0x50, 0x7c, 0x53, 0x8f, 0xbc, 0x36, 0xd5, 0x8a, 0xc9, 0x9b, 0x3a, 0xaa, 0xb9, 0x9b, + 0x1a, 0x41, 0x31, 0xf2, 0x9c, 0x7d, 0x1c, 0x3f, 0x9f, 0x48, 0x25, 0xe7, 0x8b, 0x39, 0x3f, 0xc8, + 0x8d, 0xad, 0xa1, 0x90, 0xe7, 0xc1, 0x4e, 0x2c, 0xb6, 0x88, 0x91, 0x17, 0xd6, 0xaf, 0x57, 0x42, + 0x4f, 0x32, 0xc8, 0x39, 0x8b, 0xc0, 0x54, 0x0c, 0xbe, 0x62, 0xb7, 0x9a, 0xef, 0x67, 0xca, 0xcb, + 0xa2, 0x7f, 0xe9, 0xc1, 0xf2, 0xc3, 0x6c, 0x80, 0x06, 0x0c, 0x09, 0x7b, 0x3b, 0xf3, 0xed, 0xa7, + 0x54, 0xa9, 0xbb, 0xce, 0xa7, 0x54, 0xa5, 0x6e, 0x7b, 0x4a, 0xd5, 0x10, 0xde, 0xa0, 0x5f, 0x86, + 0x60, 0x0a, 0x39, 0x16, 0x65, 0x53, 0x94, 0x47, 0x8b, 0xdc, 0xa0, 0x36, 0x94, 0xdb, 0xa0, 0x4d, + 0x16, 0x3b, 0x12, 0x56, 0x9b, 0x96, 0x24, 0x1d, 0x89, 0x46, 0x73, 0x8e, 0xd4, 0x35, 0x02, 0xaf, + 0x77, 0x08, 0xae, 0x7c, 0x2a, 0x45, 0x8e, 0x5c, 0x6f, 0x1b, 0xca, 0xad, 0x77, 0x93, 0xc5, 0x0d, + 0x79, 0xac, 0xa4, 0x5f, 0x9f, 0x72, 0xb2, 0x21, 0x1b, 0x39, 0xd7, 0x90, 0x98, 0x8a, 0xc1, 0xff, + 0xdd, 0x63, 0xb7, 0x07, 0xda, 0x2c, 0x8a, 0xea, 0xc5, 0x64, 0x84, 0x05, 0xe5, 0x7f, 0xd4, 0x0b, + 0xab, 0x44, 0xc1, 0xa9, 0xe2, 0x74, 0xb0, 0x21, 0xef, 0xe3, 0xeb, 0x0c, 0xc1, 0xad, 0x59, 0x4e, + 0xae, 0xdb, 0x3b, 0xa2, 0x9a, 0x6b, 0x4d, 0x04, 0xe1, 0x2b, 0xf9, 0x39, 0xcc, 0xb5, 0x87, 0xba, + 0x7a, 0x94, 0x49, 0x63, 0x20, 0x77, 0x25, 0xa7, 0x1c, 0xee, 0x86, 0x33, 0x35, 0xd1, 0x49, 0x9a, + 0x03, 0xf2, 0x46, 0x4f, 0xa1, 0x5c, 0x37, 0x6c, 0xb2, 0x89, 0x1b, 0x96, 0x8b, 0x3c, 0x17, 0x6e, + 0x60, 0x75, 0x89, 0x4c, 0x68, 0x37, 0x6c, 0x41, 0x59, 0x37, 0xdc, 0x60, 0x13, 0x5b, 0x87, 0xd0, + 0x7b, 0x77, 0xe9, 0x7f, 0x19, 0xd2, 0xf5, 0xdc, 0xcb, 0x43, 0xf8, 0x5e, 0x0f, 0x79, 0x87, 0xe0, + 0x4a, 0xef, 0x82, 0x09, 0xcf, 0xcd, 0x2e, 0x52, 0xb9, 0x7b, 0x9d, 0x80, 0x63, 0xc6, 0xff, 0xf6, + 0xd8, 0xa7, 0xa5, 0xf1, 0xa3, 0x63, 0xd6, 0x57, 0x93, 0xd2, 0xd1, 0xd6, 0x17, 0xfd, 0xf7, 0x1d, + 0x17, 0x45, 0x07, 0x1f, 0xa6, 0xf1, 0xc3, 0x75, 0x87, 0xe1, 0x87, 0x40, 0x5d, 0xf2, 0x9a, 0x25, + 0x1f, 0x02, 0x29, 0x92, 0x7b, 0x08, 0xb4, 0xc9, 0x98, 0xe8, 0x67, 0x76, 0xe3, 0xa9, 0x18, 0x5f, + 0x2d, 0x0c, 0xa7, 0xfe, 0xa9, 0x5f, 0x4b, 0x21, 0xf0, 0x97, 0x19, 0x22, 0x04, 0x7c, 0xb8, 0xc7, + 0x2d, 0xbb, 0x59, 0xd6, 0x58, 0x5b, 0x38, 0xb2, 0x7a, 0x5e, 0x47, 0xef, 0x70, 0xb6, 0x94, 0xca, + 0x6d, 0x1f, 0x01, 0x37, 0x39, 0x9f, 0x3e, 0xf9, 0xed, 0xd1, 0x52, 0x7a, 0x70, 0xee, 0x50, 0xea, + 0xde, 0xfa, 0xaf, 0xde, 0x54, 0xf7, 0x96, 0xbe, 0x57, 0xfd, 0x70, 0xd2, 0xa3, 0x7e, 0x66, 0xb9, + 0xb8, 0x51, 0x69, 0x4f, 0xde, 0x04, 0x00, 0x00, 0xff, 0xff, 0x46, 0xfb, 0x8e, 0xa1, 0xa1, 0x11, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -166,10 +164,6 @@ type TabletManagerClient interface { DemoteMaster(ctx context.Context, in *tabletmanagerdata.DemoteMasterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.DemoteMasterResponse, error) // UndoDemoteMaster reverts all changes made by DemoteMaster UndoDemoteMaster(ctx context.Context, in *tabletmanagerdata.UndoDemoteMasterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UndoDemoteMasterResponse, error) - // PromoteSlaveWhenCaughtUp tells the remote tablet to catch up, - // and then be the master - // Deprecated - PromoteSlaveWhenCaughtUp(ctx context.Context, in *tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse, error) // SlaveWasPromoted tells the remote tablet it is now the master SlaveWasPromoted(ctx context.Context, in *tabletmanagerdata.SlaveWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasPromotedResponse, error) // SetMaster tells the slave to reparent @@ -179,9 +173,6 @@ type TabletManagerClient interface { // StopReplicationAndGetStatus stops MySQL replication, and returns the // replication status StopReplicationAndGetStatus(ctx context.Context, in *tabletmanagerdata.StopReplicationAndGetStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopReplicationAndGetStatusResponse, error) - // PromoteSlave makes the slave the new master - // Deprecated - PromoteSlave(ctx context.Context, in *tabletmanagerdata.PromoteSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PromoteSlaveResponse, error) // PromoteReplica makes the replica the new master PromoteReplica(ctx context.Context, in *tabletmanagerdata.PromoteReplicaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PromoteReplicaResponse, error) Backup(ctx context.Context, in *tabletmanagerdata.BackupRequest, opts ...grpc.CallOption) (TabletManager_BackupClient, error) @@ -512,15 +503,6 @@ func (c *tabletManagerClient) UndoDemoteMaster(ctx context.Context, in *tabletma return out, nil } -func (c *tabletManagerClient) PromoteSlaveWhenCaughtUp(ctx context.Context, in *tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse, error) { - out := new(tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/PromoteSlaveWhenCaughtUp", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *tabletManagerClient) SlaveWasPromoted(ctx context.Context, in *tabletmanagerdata.SlaveWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasPromotedResponse, error) { out := new(tabletmanagerdata.SlaveWasPromotedResponse) err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveWasPromoted", in, out, opts...) @@ -557,15 +539,6 @@ func (c *tabletManagerClient) StopReplicationAndGetStatus(ctx context.Context, i return out, nil } -func (c *tabletManagerClient) PromoteSlave(ctx context.Context, in *tabletmanagerdata.PromoteSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PromoteSlaveResponse, error) { - out := new(tabletmanagerdata.PromoteSlaveResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/PromoteSlave", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *tabletManagerClient) PromoteReplica(ctx context.Context, in *tabletmanagerdata.PromoteReplicaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PromoteReplicaResponse, error) { out := new(tabletmanagerdata.PromoteReplicaResponse) err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/PromoteReplica", in, out, opts...) @@ -700,10 +673,6 @@ type TabletManagerServer interface { DemoteMaster(context.Context, *tabletmanagerdata.DemoteMasterRequest) (*tabletmanagerdata.DemoteMasterResponse, error) // UndoDemoteMaster reverts all changes made by DemoteMaster UndoDemoteMaster(context.Context, *tabletmanagerdata.UndoDemoteMasterRequest) (*tabletmanagerdata.UndoDemoteMasterResponse, error) - // PromoteSlaveWhenCaughtUp tells the remote tablet to catch up, - // and then be the master - // Deprecated - PromoteSlaveWhenCaughtUp(context.Context, *tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest) (*tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse, error) // SlaveWasPromoted tells the remote tablet it is now the master SlaveWasPromoted(context.Context, *tabletmanagerdata.SlaveWasPromotedRequest) (*tabletmanagerdata.SlaveWasPromotedResponse, error) // SetMaster tells the slave to reparent @@ -713,9 +682,6 @@ type TabletManagerServer interface { // StopReplicationAndGetStatus stops MySQL replication, and returns the // replication status StopReplicationAndGetStatus(context.Context, *tabletmanagerdata.StopReplicationAndGetStatusRequest) (*tabletmanagerdata.StopReplicationAndGetStatusResponse, error) - // PromoteSlave makes the slave the new master - // Deprecated - PromoteSlave(context.Context, *tabletmanagerdata.PromoteSlaveRequest) (*tabletmanagerdata.PromoteSlaveResponse, error) // PromoteReplica makes the replica the new master PromoteReplica(context.Context, *tabletmanagerdata.PromoteReplicaRequest) (*tabletmanagerdata.PromoteReplicaResponse, error) Backup(*tabletmanagerdata.BackupRequest, TabletManager_BackupServer) error @@ -832,9 +798,6 @@ func (*UnimplementedTabletManagerServer) DemoteMaster(ctx context.Context, req * func (*UnimplementedTabletManagerServer) UndoDemoteMaster(ctx context.Context, req *tabletmanagerdata.UndoDemoteMasterRequest) (*tabletmanagerdata.UndoDemoteMasterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UndoDemoteMaster not implemented") } -func (*UnimplementedTabletManagerServer) PromoteSlaveWhenCaughtUp(ctx context.Context, req *tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest) (*tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PromoteSlaveWhenCaughtUp not implemented") -} func (*UnimplementedTabletManagerServer) SlaveWasPromoted(ctx context.Context, req *tabletmanagerdata.SlaveWasPromotedRequest) (*tabletmanagerdata.SlaveWasPromotedResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SlaveWasPromoted not implemented") } @@ -847,9 +810,6 @@ func (*UnimplementedTabletManagerServer) SlaveWasRestarted(ctx context.Context, func (*UnimplementedTabletManagerServer) StopReplicationAndGetStatus(ctx context.Context, req *tabletmanagerdata.StopReplicationAndGetStatusRequest) (*tabletmanagerdata.StopReplicationAndGetStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method StopReplicationAndGetStatus not implemented") } -func (*UnimplementedTabletManagerServer) PromoteSlave(ctx context.Context, req *tabletmanagerdata.PromoteSlaveRequest) (*tabletmanagerdata.PromoteSlaveResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PromoteSlave not implemented") -} func (*UnimplementedTabletManagerServer) PromoteReplica(ctx context.Context, req *tabletmanagerdata.PromoteReplicaRequest) (*tabletmanagerdata.PromoteReplicaResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PromoteReplica not implemented") } @@ -1494,24 +1454,6 @@ func _TabletManager_UndoDemoteMaster_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } -func _TabletManager_PromoteSlaveWhenCaughtUp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TabletManagerServer).PromoteSlaveWhenCaughtUp(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/PromoteSlaveWhenCaughtUp", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).PromoteSlaveWhenCaughtUp(ctx, req.(*tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _TabletManager_SlaveWasPromoted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(tabletmanagerdata.SlaveWasPromotedRequest) if err := dec(in); err != nil { @@ -1584,24 +1526,6 @@ func _TabletManager_StopReplicationAndGetStatus_Handler(srv interface{}, ctx con return interceptor(ctx, in, info, handler) } -func _TabletManager_PromoteSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.PromoteSlaveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TabletManagerServer).PromoteSlave(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/PromoteSlave", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).PromoteSlave(ctx, req.(*tabletmanagerdata.PromoteSlaveRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _TabletManager_PromoteReplica_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(tabletmanagerdata.PromoteReplicaRequest) if err := dec(in); err != nil { @@ -1806,10 +1730,6 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ MethodName: "UndoDemoteMaster", Handler: _TabletManager_UndoDemoteMaster_Handler, }, - { - MethodName: "PromoteSlaveWhenCaughtUp", - Handler: _TabletManager_PromoteSlaveWhenCaughtUp_Handler, - }, { MethodName: "SlaveWasPromoted", Handler: _TabletManager_SlaveWasPromoted_Handler, @@ -1826,10 +1746,6 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ MethodName: "StopReplicationAndGetStatus", Handler: _TabletManager_StopReplicationAndGetStatus_Handler, }, - { - MethodName: "PromoteSlave", - Handler: _TabletManager_PromoteSlave_Handler, - }, { MethodName: "PromoteReplica", Handler: _TabletManager_PromoteReplica_Handler, diff --git a/go/vt/vttablet/grpctmclient/client.go b/go/vt/vttablet/grpctmclient/client.go index 441ed22de2c..110c6a55a85 100644 --- a/go/vt/vttablet/grpctmclient/client.go +++ b/go/vt/vttablet/grpctmclient/client.go @@ -672,23 +672,6 @@ func (client *Client) UndoDemoteMaster(ctx context.Context, tablet *topodatapb.T return err } -// PromoteSlaveWhenCaughtUp is part of the tmclient.TabletManagerClient interface. -// Deprecated -func (client *Client) PromoteSlaveWhenCaughtUp(ctx context.Context, tablet *topodatapb.Tablet, pos string) (string, error) { - cc, c, err := client.dial(tablet) - if err != nil { - return "", err - } - defer cc.Close() - response, err := c.PromoteSlaveWhenCaughtUp(ctx, &tabletmanagerdatapb.PromoteSlaveWhenCaughtUpRequest{ - Position: pos, - }) - if err != nil { - return "", err - } - return response.Position, nil -} - // SlaveWasPromoted is part of the tmclient.TabletManagerClient interface. func (client *Client) SlaveWasPromoted(ctx context.Context, tablet *topodatapb.Tablet) error { cc, c, err := client.dial(tablet) @@ -757,21 +740,6 @@ func (client *Client) PromoteReplica(ctx context.Context, tablet *topodatapb.Tab return response.Position, nil } -// PromoteSlave is part of the tmclient.TabletManagerClient interface. -// Deprecated -func (client *Client) PromoteSlave(ctx context.Context, tablet *topodatapb.Tablet) (string, error) { - cc, c, err := client.dial(tablet) - if err != nil { - return "", err - } - defer cc.Close() - response, err := c.PromoteSlave(ctx, &tabletmanagerdatapb.PromoteSlaveRequest{}) - if err != nil { - return "", err - } - return response.Position, nil -} - // // Backup related methods // diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index a38b305037e..379388b5a9e 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -376,18 +376,6 @@ func (s *server) UndoDemoteMaster(ctx context.Context, request *tabletmanagerdat return response, err } -// Deprecated -func (s *server) PromoteSlaveWhenCaughtUp(ctx context.Context, request *tabletmanagerdatapb.PromoteSlaveWhenCaughtUpRequest) (response *tabletmanagerdatapb.PromoteSlaveWhenCaughtUpResponse, err error) { - defer s.tm.HandleRPCPanic(ctx, "PromoteSlaveWhenCaughtUp", request, response, true /*verbose*/, &err) - ctx = callinfo.GRPCCallInfo(ctx) - response = &tabletmanagerdatapb.PromoteSlaveWhenCaughtUpResponse{} - position, err := s.tm.PromoteSlaveWhenCaughtUp(ctx, request.Position) - if err == nil { - response.Position = position - } - return response, err -} - func (s *server) SlaveWasPromoted(ctx context.Context, request *tabletmanagerdatapb.SlaveWasPromotedRequest) (response *tabletmanagerdatapb.SlaveWasPromotedResponse, err error) { defer s.tm.HandleRPCPanic(ctx, "SlaveWasPromoted", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) @@ -420,18 +408,6 @@ func (s *server) StopReplicationAndGetStatus(ctx context.Context, request *table return response, err } -// Deprecated -func (s *server) PromoteSlave(ctx context.Context, request *tabletmanagerdatapb.PromoteSlaveRequest) (response *tabletmanagerdatapb.PromoteSlaveResponse, err error) { - defer s.tm.HandleRPCPanic(ctx, "PromoteSlave", request, response, true /*verbose*/, &err) - ctx = callinfo.GRPCCallInfo(ctx) - response = &tabletmanagerdatapb.PromoteSlaveResponse{} - position, err := s.tm.PromoteSlave(ctx) - if err == nil { - response.Position = position - } - return response, err -} - func (s *server) PromoteReplica(ctx context.Context, request *tabletmanagerdatapb.PromoteReplicaRequest) (response *tabletmanagerdatapb.PromoteReplicaResponse, err error) { defer s.tm.HandleRPCPanic(ctx, "PromoteReplica", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) diff --git a/go/vt/vttablet/tabletmanager/rpc_agent.go b/go/vt/vttablet/tabletmanager/rpc_agent.go index cdbdc1c492f..769183fe327 100644 --- a/go/vt/vttablet/tabletmanager/rpc_agent.go +++ b/go/vt/vttablet/tabletmanager/rpc_agent.go @@ -112,9 +112,6 @@ type RPCTM interface { UndoDemoteMaster(ctx context.Context) error - // Deprecated - PromoteSlaveWhenCaughtUp(ctx context.Context, replicationPosition string) (string, error) - SlaveWasPromoted(ctx context.Context) error SetMaster(ctx context.Context, parent *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error @@ -125,9 +122,6 @@ type RPCTM interface { PromoteReplica(ctx context.Context) (string, error) - // Deprecated - PromoteSlave(ctx context.Context) (string, error) - // Backup / restore related methods Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index f16435fc6b7..69855d99aad 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -437,46 +437,6 @@ func (tm *TabletManager) UndoDemoteMaster(ctx context.Context) error { return nil } -// PromoteSlaveWhenCaughtUp waits for this slave to be caught up on -// replication up to the provided point, and then makes the slave the -// shard master. -// Deprecated -func (tm *TabletManager) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { - if err := tm.lock(ctx); err != nil { - return "", err - } - defer tm.unlock() - - pos, err := mysql.DecodePosition(position) - if err != nil { - return "", err - } - - if err := tm.MysqlDaemon.WaitMasterPos(ctx, pos); err != nil { - return "", err - } - - pos, err = tm.MysqlDaemon.Promote(tm.hookExtraEnv()) - if err != nil { - return "", err - } - - // If using semi-sync, we need to enable it before going read-write. - if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { - return "", err - } - - if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { - return "", err - } - - if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { - return "", err - } - - return mysql.EncodePosition(pos), nil -} - // SlaveWasPromoted promotes a slave to master, no questions asked. func (tm *TabletManager) SlaveWasPromoted(ctx context.Context) error { return tm.ChangeType(ctx, topodatapb.TabletType_MASTER) @@ -698,36 +658,6 @@ func (tm *TabletManager) PromoteReplica(ctx context.Context) (string, error) { return mysql.EncodePosition(pos), nil } -// PromoteSlave makes the current tablet the master -// Deprecated -func (tm *TabletManager) PromoteSlave(ctx context.Context) (string, error) { - if err := tm.lock(ctx); err != nil { - return "", err - } - defer tm.unlock() - - pos, err := tm.MysqlDaemon.Promote(tm.hookExtraEnv()) - if err != nil { - return "", err - } - - // If using semi-sync, we need to enable it before going read-write. - if err := tm.fixSemiSync(topodatapb.TabletType_MASTER); err != nil { - return "", err - } - - // Set the server read-write - if err := tm.MysqlDaemon.SetReadOnly(false); err != nil { - return "", err - } - - if err := tm.changeTypeLocked(ctx, topodatapb.TabletType_MASTER); err != nil { - return "", err - } - - return mysql.EncodePosition(pos), nil -} - func isMasterEligible(tabletType topodatapb.TabletType) bool { switch tabletType { case topodatapb.TabletType_MASTER, topodatapb.TabletType_REPLICA: diff --git a/go/vt/vttablet/tmclient/rpc_client_api.go b/go/vt/vttablet/tmclient/rpc_client_api.go index 1aa1723ee11..014e101ca46 100644 --- a/go/vt/vttablet/tmclient/rpc_client_api.go +++ b/go/vt/vttablet/tmclient/rpc_client_api.go @@ -170,10 +170,6 @@ type TabletManagerClient interface { // To be used if we are unable to promote the chosen new master UndoDemoteMaster(ctx context.Context, tablet *topodatapb.Tablet) error - // PromoteSlaveWhenCaughtUp transforms the tablet from a slave to a master. - // Deprecated - PromoteSlaveWhenCaughtUp(ctx context.Context, tablet *topodatapb.Tablet, pos string) (string, error) - // SlaveWasPromoted tells the remote tablet it is now the master SlaveWasPromoted(ctx context.Context, tablet *topodatapb.Tablet) error @@ -189,10 +185,6 @@ type TabletManagerClient interface { // current position. StopReplicationAndGetStatus(ctx context.Context, tablet *topodatapb.Tablet) (*replicationdatapb.Status, error) - // PromoteSlave makes the tablet the new master - // Deprecated - PromoteSlave(ctx context.Context, tablet *topodatapb.Tablet) (string, error) - // PromoteReplica makes the tablet the new master PromoteReplica(ctx context.Context, tablet *topodatapb.Tablet) (string, error) diff --git a/go/vt/vttablet/tmrpctest/test_tm_rpc.go b/go/vt/vttablet/tmrpctest/test_tm_rpc.go index 8c385500c1b..b31d80a086a 100644 --- a/go/vt/vttablet/tmrpctest/test_tm_rpc.go +++ b/go/vt/vttablet/tmrpctest/test_tm_rpc.go @@ -1015,24 +1015,6 @@ func tmRPCTestUndoDemoteMasterPanic(ctx context.Context, t *testing.T, client tm var testReplicationPositionReturned = "MariaDB/5-567-3456" -func (fra *fakeRPCTM) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error) { - if fra.panics { - panic(fmt.Errorf("test-triggered panic")) - } - compare(fra.t, "PromoteSlaveWhenCaughtUp pos", position, testReplicationPosition) - return testReplicationPositionReturned, nil -} - -func tmRPCTestPromoteSlaveWhenCaughtUp(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { - rp, err := client.PromoteSlaveWhenCaughtUp(ctx, tablet, testReplicationPosition) - compareError(t, "PromoteSlaveWhenCaughtUp", err, rp, testReplicationPositionReturned) -} - -func tmRPCTestPromoteSlaveWhenCaughtUpPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { - _, err := client.PromoteSlaveWhenCaughtUp(ctx, tablet, testReplicationPosition) - expectHandleRPCPanic(t, "PromoteSlaveWhenCaughtUp", true /*verbose*/, err) -} - var testSlaveWasPromotedCalled = false func (fra *fakeRPCTM) SlaveWasPromoted(ctx context.Context) error { @@ -1120,23 +1102,6 @@ func tmRPCTestStopReplicationAndGetStatusPanic(ctx context.Context, t *testing.T expectHandleRPCPanic(t, "StopReplicationAndGetStatus", true /*verbose*/, err) } -func (fra *fakeRPCTM) PromoteSlave(ctx context.Context) (string, error) { - if fra.panics { - panic(fmt.Errorf("test-triggered panic")) - } - return testReplicationPosition, nil -} - -func tmRPCTestPromoteSlave(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { - rp, err := client.PromoteSlave(ctx, tablet) - compareError(t, "PromoteSlave", err, rp, testReplicationPosition) -} - -func tmRPCTestPromoteSlavePanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { - _, err := client.PromoteSlave(ctx, tablet) - expectHandleRPCPanic(t, "PromoteSlave", true /*verbose*/, err) -} - func (fra *fakeRPCTM) PromoteReplica(ctx context.Context) (string, error) { if fra.panics { panic(fmt.Errorf("test-triggered panic")) @@ -1288,12 +1253,10 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T tmRPCTestInitSlave(ctx, t, client, tablet) tmRPCTestDemoteMaster(ctx, t, client, tablet) tmRPCTestUndoDemoteMaster(ctx, t, client, tablet) - tmRPCTestPromoteSlaveWhenCaughtUp(ctx, t, client, tablet) tmRPCTestSlaveWasPromoted(ctx, t, client, tablet) tmRPCTestSetMaster(ctx, t, client, tablet) tmRPCTestSlaveWasRestarted(ctx, t, client, tablet) tmRPCTestStopReplicationAndGetStatus(ctx, t, client, tablet) - tmRPCTestPromoteSlave(ctx, t, client, tablet) tmRPCTestPromoteReplica(ctx, t, client, tablet) // Backup / restore related methods @@ -1342,12 +1305,10 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T tmRPCTestInitSlavePanic(ctx, t, client, tablet) tmRPCTestDemoteMasterPanic(ctx, t, client, tablet) tmRPCTestUndoDemoteMasterPanic(ctx, t, client, tablet) - tmRPCTestPromoteSlaveWhenCaughtUpPanic(ctx, t, client, tablet) tmRPCTestSlaveWasPromotedPanic(ctx, t, client, tablet) tmRPCTestSetMasterPanic(ctx, t, client, tablet) tmRPCTestSlaveWasRestartedPanic(ctx, t, client, tablet) tmRPCTestStopReplicationAndGetStatusPanic(ctx, t, client, tablet) - tmRPCTestPromoteSlavePanic(ctx, t, client, tablet) tmRPCTestPromoteReplicaPanic(ctx, t, client, tablet) // Backup / restore related methods diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index 73d165f0b59..5d9a9076abd 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -379,16 +379,6 @@ message UndoDemoteMasterRequest { message UndoDemoteMasterResponse { } -// Deprecated -message PromoteSlaveWhenCaughtUpRequest { - string position = 1; -} - -// Deprecated -message PromoteSlaveWhenCaughtUpResponse { - string position = 1; -} - message SlaveWasPromotedRequest { } @@ -420,15 +410,6 @@ message StopReplicationAndGetStatusResponse { replicationdata.Status status = 1; } -// Deprecated -message PromoteSlaveRequest { -} - -// Deprecated -message PromoteSlaveResponse { - string position = 1; -} - message PromoteReplicaRequest { } diff --git a/proto/tabletmanagerservice.proto b/proto/tabletmanagerservice.proto index d3a113832f2..5755982b32c 100644 --- a/proto/tabletmanagerservice.proto +++ b/proto/tabletmanagerservice.proto @@ -135,11 +135,6 @@ service TabletManager { // UndoDemoteMaster reverts all changes made by DemoteMaster rpc UndoDemoteMaster(tabletmanagerdata.UndoDemoteMasterRequest) returns (tabletmanagerdata.UndoDemoteMasterResponse) {}; - // PromoteSlaveWhenCaughtUp tells the remote tablet to catch up, - // and then be the master - // Deprecated - rpc PromoteSlaveWhenCaughtUp(tabletmanagerdata.PromoteSlaveWhenCaughtUpRequest) returns (tabletmanagerdata.PromoteSlaveWhenCaughtUpResponse) {}; - // SlaveWasPromoted tells the remote tablet it is now the master rpc SlaveWasPromoted(tabletmanagerdata.SlaveWasPromotedRequest) returns (tabletmanagerdata.SlaveWasPromotedResponse) {}; @@ -153,10 +148,6 @@ service TabletManager { // replication status rpc StopReplicationAndGetStatus(tabletmanagerdata.StopReplicationAndGetStatusRequest) returns (tabletmanagerdata.StopReplicationAndGetStatusResponse) {}; - // PromoteSlave makes the slave the new master - // Deprecated - rpc PromoteSlave(tabletmanagerdata.PromoteSlaveRequest) returns (tabletmanagerdata.PromoteSlaveResponse) {}; - // PromoteReplica makes the replica the new master rpc PromoteReplica(tabletmanagerdata.PromoteReplicaRequest) returns (tabletmanagerdata.PromoteReplicaResponse) {}; From 9d4a9b73464920420f0588225c5c40eb6dc8b180 Mon Sep 17 00:00:00 2001 From: Tom Krouper Date: Thu, 25 Jun 2020 20:26:48 -0700 Subject: [PATCH 093/430] Add `-rename_tables` to DropSources This addition allows the optional bool -rename_tables for DropSources. This can be useful when dropping sources for larger tables. Instead of a `drop table`, a `rename table` is run. This will be faster in most cases but will require the user to clean up the tables at a later date. Signed-off-by: Tom Krouper --- .../vreplication/vreplication_test.go | 8 +++- .../vreplication/vreplication_test_env.go | 20 +++++++++- go/vt/vtctl/vtctl.go | 11 +++++- go/vt/wrangler/stream_migrater_test.go | 2 +- go/vt/wrangler/switcher.go | 4 +- go/vt/wrangler/switcher_dry_run.go | 6 +-- go/vt/wrangler/switcher_interface.go | 2 +- go/vt/wrangler/traffic_switcher.go | 39 ++++++++++++++++--- go/vt/wrangler/traffic_switcher_test.go | 37 +++++++++++++++--- 9 files changed, 105 insertions(+), 24 deletions(-) diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index 6e625ba338d..7d657f6d9f6 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -209,12 +209,18 @@ func shardCustomer(t *testing.T, testReverse bool) { if output, err := vc.VtctlClient.ExecuteCommandWithOutput("SwitchWrites", "customer.p2c"); err != nil { t.Fatalf("SwitchWrites error: %s\n", output) } - want = dryRunResultsDropSourcesCustomerShard + want = dryRunResultsDropSourcesDropCustomerShard if output, err = vc.VtctlClient.ExecuteCommandWithOutput("DropSources", "-dry_run", "customer.p2c"); err != nil { t.Fatalf("DropSources dry run error: %s\n", output) } validateDryRunResults(t, output, want) + want = dryRunResultsDropSourcesRenameCustomerShard + if output, err = vc.VtctlClient.ExecuteCommandWithOutput("DropSources", "-dry_run", "-rename_tables", "customer.p2c"); err != nil { + t.Fatalf("DropSources dry run with rename error: %s\n", output) + } + validateDryRunResults(t, output, want) + var exists bool if exists, err = checkIfBlacklistExists(t, vc, "product:0", "customer"); err != nil { t.Fatal("Error getting blacklist for customer:0") diff --git a/go/test/endtoend/vreplication/vreplication_test_env.go b/go/test/endtoend/vreplication/vreplication_test_env.go index dc8dfac8d53..dacdee4ee3f 100644 --- a/go/test/endtoend/vreplication/vreplication_test_env.go +++ b/go/test/endtoend/vreplication/vreplication_test_env.go @@ -94,11 +94,27 @@ var dryrunresultsswitchwritesM2m3 = []string{ "Unlock keyspace merchant", } -var dryRunResultsDropSourcesCustomerShard = []string{ +var dryRunResultsDropSourcesDropCustomerShard = []string{ "Lock keyspace product", "Lock keyspace customer", "Dropping following tables:", - " Keyspace product Shard 0 DbName vt_product Tablet 100 Table customer", + " Keyspace product Shard 0 DbName vt_product Tablet 100 Table customer RemovalType DROP TABLE", + "Blacklisted tables customer will be removed from:", + " Keyspace product Shard 0 Tablet 100", + "Delete reverse vreplication streams on source:", + " Keyspace product Shard 0 Workflow p2c_reverse DbName vt_product Tablet 100", + "Delete vreplication streams on target:", + " Keyspace customer Shard -80 Workflow p2c DbName vt_customer Tablet 200", + " Keyspace customer Shard 80- Workflow p2c DbName vt_customer Tablet 300", + "Unlock keyspace customer", + "Unlock keyspace product", +} + +var dryRunResultsDropSourcesRenameCustomerShard = []string{ + "Lock keyspace product", + "Lock keyspace customer", + "Dropping following tables:", + " Keyspace product Shard 0 DbName vt_product Tablet 100 Table customer RemovalType RENAME TABLE", "Blacklisted tables customer will be removed from:", " Keyspace product Shard 0 Tablet 100", "Delete reverse vreplication streams on source:", diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 0f431d7386f..c0c6ebb5632 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -315,7 +315,7 @@ var commands = []commandGroup{ "[-cell=] [-tablet_types=] -workflow= ", `Move table(s) to another keyspace, table_specs is a list of tables or the tables section of the vschema for the target keyspace. Example: '{"t1":{"column_vindexes": [{""column": "id1", "name": "hash"}]}, "t2":{"column_vindexes": [{""column": "id2", "name": "hash"}]}}`}, {"DropSources", commandDropSources, - "[-dry_run] ", + "[-dry_run] [-rename_tables] ", "After a MoveTables or Resharding workflow cleanup unused artifacts like source tables, source shards and blacklists"}, {"CreateLookupVindex", commandCreateLookupVindex, "[-cell=] [-tablet_types=] ", @@ -2042,6 +2042,7 @@ func commandMigrateServedFrom(ctx context.Context, wr *wrangler.Wrangler, subFla func commandDropSources(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { dryRun := subFlags.Bool("dry_run", false, "Does a dry run of commandDropSources and only reports the actions to be taken") + renameTables := subFlags.Bool("rename_tables", false, "Rename tables instead of dropping them") if err := subFlags.Parse(args); err != nil { return err } @@ -2052,8 +2053,14 @@ func commandDropSources(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl if err != nil { return err } + + removalType := wrangler.DropTable + if *renameTables { + removalType = wrangler.RenameTable + } + _, _, _ = dryRun, keyspace, workflow - dryRunResults, err := wr.DropSources(ctx, keyspace, workflow, *dryRun) + dryRunResults, err := wr.DropSources(ctx, keyspace, workflow, removalType, *dryRun) if err != nil { return err } diff --git a/go/vt/wrangler/stream_migrater_test.go b/go/vt/wrangler/stream_migrater_test.go index 1ca5b4950d2..b850ce3c2e0 100644 --- a/go/vt/wrangler/stream_migrater_test.go +++ b/go/vt/wrangler/stream_migrater_test.go @@ -178,7 +178,7 @@ func TestStreamMigrateMainflow(t *testing.T) { tme.expectDeleteReverseVReplication() tme.expectDeleteTargetVReplication() - if _, err := tme.wr.DropSources(ctx, tme.targetKeyspace, "test", false); err != nil { + if _, err := tme.wr.DropSources(ctx, tme.targetKeyspace, "test", DropTable, false); err != nil { t.Fatal(err) } verifyQueries(t, tme.allDBClients) diff --git a/go/vt/wrangler/switcher.go b/go/vt/wrangler/switcher.go index a8fb24e89a3..e721211bf5f 100644 --- a/go/vt/wrangler/switcher.go +++ b/go/vt/wrangler/switcher.go @@ -41,8 +41,8 @@ func (r *switcher) validateWorkflowHasCompleted(ctx context.Context) error { //TODO: do we need to disable ForeignKey before dropping tables? //TODO: delete multiple tables in single statement? -func (r *switcher) dropSourceTables(ctx context.Context) error { - return r.ts.dropSourceTables(ctx) +func (r *switcher) removeSourceTables(ctx context.Context, removalType TableRemovalType) error { + return r.ts.removeSourceTables(ctx, removalType) } func (r *switcher) dropSourceShards(ctx context.Context) error { diff --git a/go/vt/wrangler/switcher_dry_run.go b/go/vt/wrangler/switcher_dry_run.go index 5cb6a33eb65..f80245bfd23 100644 --- a/go/vt/wrangler/switcher_dry_run.go +++ b/go/vt/wrangler/switcher_dry_run.go @@ -225,12 +225,12 @@ func (dr *switcherDryRun) lockKeyspace(ctx context.Context, keyspace, _ string) }, nil } -func (dr *switcherDryRun) dropSourceTables(ctx context.Context) error { +func (dr *switcherDryRun) removeSourceTables(ctx context.Context, removalType TableRemovalType) error { logs := make([]string, 0) for _, source := range dr.ts.sources { for _, tableName := range dr.ts.tables { - logs = append(logs, fmt.Sprintf("\tKeyspace %s Shard %s DbName %s Tablet %d Table %s", - source.master.Keyspace, source.master.Shard, source.master.DbName(), source.master.Alias.Uid, tableName)) + logs = append(logs, fmt.Sprintf("\tKeyspace %s Shard %s DbName %s Tablet %d Table %s RemovalType %s", + source.master.Keyspace, source.master.Shard, source.master.DbName(), source.master.Alias.Uid, tableName, TableRemovalType(removalType))) } } if len(logs) > 0 { diff --git a/go/vt/wrangler/switcher_interface.go b/go/vt/wrangler/switcher_interface.go index 49f84859cf0..77f40904e92 100644 --- a/go/vt/wrangler/switcher_interface.go +++ b/go/vt/wrangler/switcher_interface.go @@ -40,7 +40,7 @@ type iswitcher interface { switchTableReads(ctx context.Context, cells []string, servedType topodatapb.TabletType, direction TrafficSwitchDirection) error switchShardReads(ctx context.Context, cells []string, servedType topodatapb.TabletType, direction TrafficSwitchDirection) error validateWorkflowHasCompleted(ctx context.Context) error - dropSourceTables(ctx context.Context) error + removeSourceTables(ctx context.Context, removalType TableRemovalType) error dropSourceShards(ctx context.Context) error dropSourceBlacklistedTables(ctx context.Context) error freezeTargetVReplication(ctx context.Context) error diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index d9d8ca1501d..48885cc3849 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -59,6 +59,27 @@ const ( DirectionBackward ) +// TableRemovalType specifies the way the a table will be removed +type TableRemovalType int + +// The following consts define if DropSource will drop or rename the table +const ( + DropTable = TableRemovalType(iota) + RenameTable +) + +func (trt TableRemovalType) String() string { + types := [...]string{ + "DROP TABLE", + "RENAME TABLE", + } + if trt < DropTable || trt > RenameTable { + return "Unknown" + } + + return types[trt] +} + // accessType specifies the type of access for a shard (allow/disallow writes). type accessType int @@ -293,7 +314,7 @@ func (wr *Wrangler) SwitchWrites(ctx context.Context, targetKeyspace, workflow s } // DropSources cleans up source tables, shards and blacklisted tables after a MoveTables/Reshard is completed -func (wr *Wrangler) DropSources(ctx context.Context, targetKeyspace, workflow string, dryRun bool) (*[]string, error) { +func (wr *Wrangler) DropSources(ctx context.Context, targetKeyspace, workflow string, removalType TableRemovalType, dryRun bool) (*[]string, error) { ts, err := wr.buildTrafficSwitcher(ctx, targetKeyspace, workflow) if err != nil { wr.Logger().Errorf("buildTrafficSwitcher failed: %v", err) @@ -328,7 +349,7 @@ func (wr *Wrangler) DropSources(ctx context.Context, targetKeyspace, workflow st } switch ts.migrationType { case binlogdatapb.MigrationType_TABLES: - if err := sw.dropSourceTables(ctx); err != nil { + if err := sw.removeSourceTables(ctx, removalType); err != nil { return nil, err } if err := sw.dropSourceBlacklistedTables(ctx); err != nil { @@ -1122,17 +1143,23 @@ func doValidateWorkflowHasCompleted(ctx context.Context, ts *trafficSwitcher) er } -func (ts *trafficSwitcher) dropSourceTables(ctx context.Context) error { +func (ts *trafficSwitcher) removeSourceTables(ctx context.Context, removalType TableRemovalType) error { return ts.forAllSources(func(source *tsSource) error { for _, tableName := range ts.tables { - ts.wr.Logger().Infof("Dropping table %s.%s\n", source.master.DbName(), tableName) query := fmt.Sprintf("drop table %s.%s", source.master.DbName(), tableName) + if removalType == DropTable { + ts.wr.Logger().Infof("Dropping table %s.%s\n", source.master.DbName(), tableName) + } else { + renameName := fmt.Sprintf("_%.63s", tableName) + ts.wr.Logger().Infof("Renaming table %s.%s to %s.%s\n", source.master.DbName(), tableName, source.master.DbName(), renameName) + query = fmt.Sprintf("rename table %s.%s TO %s.%s", source.master.DbName(), tableName, source.master.DbName(), renameName) + } _, err := ts.wr.ExecuteFetchAsDba(ctx, source.master.Alias, query, 1, false, true) if err != nil { - ts.wr.Logger().Errorf("Error dropping table %s: %v", tableName, err) + ts.wr.Logger().Errorf("Error removing table %s: %v", tableName, err) return err } - ts.wr.Logger().Infof("Dropped table %s.%s\n", source.master.DbName(), tableName) + ts.wr.Logger().Infof("Removed table %s.%s\n", source.master.DbName(), tableName) } return nil diff --git a/go/vt/wrangler/traffic_switcher_test.go b/go/vt/wrangler/traffic_switcher_test.go index a3d3d8da3e1..3a0538e3d56 100644 --- a/go/vt/wrangler/traffic_switcher_test.go +++ b/go/vt/wrangler/traffic_switcher_test.go @@ -802,7 +802,7 @@ func TestTableMigrateOneToMany(t *testing.T) { tme.dbTargetClients[1].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil) } dropSourcesInvalid() - _, err = tme.wr.DropSources(ctx, tme.targetKeyspace, "test", false) + _, err = tme.wr.DropSources(ctx, tme.targetKeyspace, "test", DropTable, false) require.Error(t, err, "Workflow has not completed, cannot DropSources") _, _, err = tme.wr.SwitchWrites(ctx, tme.targetKeyspace, "test", 1*time.Second, false, false, false) @@ -815,13 +815,12 @@ func TestTableMigrateOneToMany(t *testing.T) { tme.dbTargetClients[1].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil) } dropSourcesDryRun() - wantdryRunDropSources := []string{ "Lock keyspace ks1", "Lock keyspace ks2", "Dropping following tables:", - " Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t1", - " Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t2", + " Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t1 RemovalType DROP TABLE", + " Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t2 RemovalType DROP TABLE", "Blacklisted tables t1,t2 will be removed from:", " Keyspace ks1 Shard 0 Tablet 10", "Delete reverse vreplication streams on source:", @@ -832,11 +831,37 @@ func TestTableMigrateOneToMany(t *testing.T) { "Unlock keyspace ks2", "Unlock keyspace ks1", } - results, err := tme.wr.DropSources(ctx, tme.targetKeyspace, "test", true) + results, err := tme.wr.DropSources(ctx, tme.targetKeyspace, "test", DropTable, true) require.NoError(t, err) require.Empty(t, cmp.Diff(wantdryRunDropSources, *results)) checkBlacklist(t, tme.ts, fmt.Sprintf("%s:%s", "ks1", "0"), []string{"t1", "t2"}) + dropSourcesDryRunRename := func() { + tme.dbTargetClients[0].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil) + tme.dbTargetClients[1].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil) + } + dropSourcesDryRunRename() + wantdryRunRenameSources := []string{ + "Lock keyspace ks1", + "Lock keyspace ks2", + "Dropping following tables:", + " Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t1 RemovalType RENAME TABLE", + " Keyspace ks1 Shard 0 DbName vt_ks1 Tablet 10 Table t2 RemovalType RENAME TABLE", + "Blacklisted tables t1,t2 will be removed from:", + " Keyspace ks1 Shard 0 Tablet 10", + "Delete reverse vreplication streams on source:", + " Keyspace ks1 Shard 0 Workflow test_reverse DbName vt_ks1 Tablet 10", + "Delete vreplication streams on target:", + " Keyspace ks2 Shard -80 Workflow test DbName vt_ks2 Tablet 20", + " Keyspace ks2 Shard 80- Workflow test DbName vt_ks2 Tablet 30", + "Unlock keyspace ks2", + "Unlock keyspace ks1", + } + results, err = tme.wr.DropSources(ctx, tme.targetKeyspace, "test", RenameTable, true) + require.NoError(t, err) + require.Empty(t, cmp.Diff(wantdryRunRenameSources, *results)) + checkBlacklist(t, tme.ts, fmt.Sprintf("%s:%s", "ks1", "0"), []string{"t1", "t2"}) + dropSources := func() { tme.dbTargetClients[0].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil) tme.dbTargetClients[1].addQuery("select 1 from _vt.vreplication where db_name='vt_ks2' and workflow='test' and message!='FROZEN'", &sqltypes.Result{}, nil) @@ -852,7 +877,7 @@ func TestTableMigrateOneToMany(t *testing.T) { } dropSources() - _, err = tme.wr.DropSources(ctx, tme.targetKeyspace, "test", false) + _, err = tme.wr.DropSources(ctx, tme.targetKeyspace, "test", DropTable, false) require.NoError(t, err) checkBlacklist(t, tme.ts, fmt.Sprintf("%s:%s", "ks1", "0"), nil) From c773f4a13c6532843c8a44c62443809735dae350 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Thu, 25 Jun 2020 21:53:55 -0700 Subject: [PATCH 094/430] vttablet: bring back demote_master_type Ref #6345 We need to allow this flag until existing users can migrate out. Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/tm_init.go | 13 ++++++++++++- go/vt/vttablet/tabletmanager/tm_init_test.go | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 80ee3a5c11d..be0b914cf77 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -110,6 +110,10 @@ var ( // The following variables can be changed to speed up tests. mysqlPortRetryInterval = 1 * time.Second rebuildKeyspaceRetryInterval = 1 * time.Second + + // demoteMasterType is deprecated. + // TODO(sougou); remove after release 7.0. + demoteMasterType = flag.String("demote_master_type", "REPLICA", "the tablet type a demoted master will transition to") ) func init() { @@ -281,6 +285,13 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet) error { tm.DBConfigs.DBName = topoproto.TabletDbName(tablet) tm.History = history.New(historyLength) tm.tabletAlias = tablet.Alias + demoteType, err := topoproto.ParseTabletType(*demoteMasterType) + if err != nil { + return err + } + if demoteType != tablet.Type { + return fmt.Errorf("deprecated demote_master_type %v must match init_tablet_type %v", demoteType, tablet.Type) + } tm.baseTabletType = tablet.Type tm._healthy = fmt.Errorf("healthcheck not run yet") @@ -299,7 +310,7 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet) error { return err } - err := tm.QueryServiceControl.InitDBConfig(querypb.Target{ + err = tm.QueryServiceControl.InitDBConfig(querypb.Target{ Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type, diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index d1bf8275580..b16b0eb8cb6 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -114,6 +114,24 @@ func TestStartBuildTabletFromInput(t *testing.T) { assert.Contains(t, err.Error(), "invalid init_tablet_type MASTER") } +func TestDemoteMasterType(t *testing.T) { + defer func(saved string) { *demoteMasterType = saved }(*demoteMasterType) + *demoteMasterType = "rdonly" + + cell := "cell1" + ts := memorytopo.NewServer(cell) + tablet := newTestTablet(t, 1, "ks", "0") + tm := &TabletManager{ + BatchCtx: context.Background(), + TopoServer: ts, + MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(1)}, + DBConfigs: &dbconfigs.DBConfigs{}, + QueryServiceControl: tabletservermock.NewController(), + } + err := tm.Start(tablet) + assert.Equal(t, "deprecated demote_master_type RDONLY must match init_tablet_type REPLICA", err.Error()) +} + func TestStartCreateKeyspaceShard(t *testing.T) { defer func(saved time.Duration) { rebuildKeyspaceRetryInterval = saved }(rebuildKeyspaceRetryInterval) rebuildKeyspaceRetryInterval = 10 * time.Millisecond From f279fc1c6700a76ca7dff3853faa11ad0a98c608 Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Thu, 25 Jun 2020 22:30:31 -0700 Subject: [PATCH 095/430] vttablet: don't enforce demote_master_type It causes some tests to fail. This means that it could break some production code also. Signed-off-by: Sugu Sougoumarane --- go/vt/vttablet/tabletmanager/tm_init.go | 4 ++-- go/vt/vttablet/tabletmanager/tm_init_test.go | 18 ------------------ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index be0b914cf77..04532a8e839 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -113,7 +113,7 @@ var ( // demoteMasterType is deprecated. // TODO(sougou); remove after release 7.0. - demoteMasterType = flag.String("demote_master_type", "REPLICA", "the tablet type a demoted master will transition to") + demoteMasterType = flag.String("demote_master_type", "REPLICA", "DEPRECATED: the tablet type a demoted master will transition to") ) func init() { @@ -290,7 +290,7 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet) error { return err } if demoteType != tablet.Type { - return fmt.Errorf("deprecated demote_master_type %v must match init_tablet_type %v", demoteType, tablet.Type) + log.Warningf("deprecated demote_master_type %v must match init_tablet_type %v", demoteType, tablet.Type) } tm.baseTabletType = tablet.Type tm._healthy = fmt.Errorf("healthcheck not run yet") diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index b16b0eb8cb6..d1bf8275580 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -114,24 +114,6 @@ func TestStartBuildTabletFromInput(t *testing.T) { assert.Contains(t, err.Error(), "invalid init_tablet_type MASTER") } -func TestDemoteMasterType(t *testing.T) { - defer func(saved string) { *demoteMasterType = saved }(*demoteMasterType) - *demoteMasterType = "rdonly" - - cell := "cell1" - ts := memorytopo.NewServer(cell) - tablet := newTestTablet(t, 1, "ks", "0") - tm := &TabletManager{ - BatchCtx: context.Background(), - TopoServer: ts, - MysqlDaemon: &fakemysqldaemon.FakeMysqlDaemon{MysqlPort: sync2.NewAtomicInt32(1)}, - DBConfigs: &dbconfigs.DBConfigs{}, - QueryServiceControl: tabletservermock.NewController(), - } - err := tm.Start(tablet) - assert.Equal(t, "deprecated demote_master_type RDONLY must match init_tablet_type REPLICA", err.Error()) -} - func TestStartCreateKeyspaceShard(t *testing.T) { defer func(saved time.Duration) { rebuildKeyspaceRetryInterval = saved }(rebuildKeyspaceRetryInterval) rebuildKeyspaceRetryInterval = 10 * time.Millisecond From 0b7a255e703e160ca853ea1de417655237879632 Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Sun, 28 Jun 2020 17:43:44 +0530 Subject: [PATCH 096/430] Added timeout of gtid to time lookup Signed-off-by: Arindam Nayak --- go/vt/vttablet/tabletmanager/restore.go | 40 ++++++++++++++----------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 069ab105c91..4d4f66a1c82 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -54,10 +54,11 @@ var ( waitForBackupInterval = flag.Duration("wait_for_backup_interval", 0, "(init restore parameter) if this is greater than 0, instead of starting up empty when no backups are found, keep checking at this interval for a backup to appear") // Flags for PITR - binlogHost = flag.String("binlog_host", "", "(init restore parameter) host name of binlog server.") - binlogPort = flag.Int("binlog_port", 0, "(init restore parameter) port of binlog server.") - binlogUser = flag.String("binlog_user", "", "(init restore parameter) username of binlog server.") - binlogPwd = flag.String("binlog_password", "", "(init restore parameter) password of binlog server.") + binlogHost = flag.String("binlog_host", "", "(init restore parameter) host name of binlog server.") + binlogPort = flag.Int("binlog_port", 0, "(init restore parameter) port of binlog server.") + binlogUser = flag.String("binlog_user", "", "(init restore parameter) username of binlog server.") + binlogPwd = flag.String("binlog_password", "", "(init restore parameter) password of binlog server.") + timeoutForGTIDLookup = flag.Duration("binlog_timeout", 60*time.Second, "(init restore parameter) timeout for fetching gtid from timestamp.") ) // RestoreData is the main entry point for backup restore. @@ -236,10 +237,11 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po }}, } - // Todo: we need to safely return from vstream if it takes more time + timeoutCtx, cancelFnc := context.WithTimeout(ctx, *timeoutForGTIDLookup) + defer cancelFnc() found := make(chan string) go func() { - err := vsClient.VStream(ctx, mysql.EncodePosition(pos), filter, func(events []*binlogdatapb.VEvent) error { + err := vsClient.VStream(timeoutCtx, mysql.EncodePosition(pos), filter, func(events []*binlogdatapb.VEvent) error { for _, event := range events { if event.Gtid != "" && event.Timestamp > restoreTime { found <- event.Gtid @@ -252,29 +254,33 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po found <- "" } }() - timeout := time.Now().Add(60 * time.Second) - for time.Now().Before(timeout) { - select { - case <-found: - return <-found - default: - time.Sleep(300 * time.Millisecond) - } + + select { + case <-found: + return <-found + case <-timeoutCtx.Done(): + log.Warningf("Can't find the GTID from restore time stamp, exiting.") + return "" } - return "" } // replicateUptoGTID replicates upto specified gtid from binlog server func (agent *ActionAgent) catchupToGTID(ctx context.Context, gtid string) error { - gtid = strings.Replace(gtid, "MySQL56/", "", 1) + gtidParsed, err := mysql.DecodePosition(gtid) + if err != nil { + return err + } + gtidStr := gtidParsed.GTIDSet.String() - gtidNew := strings.Split(gtid, ":")[0] + ":" + strings.Split(strings.Split(gtid, ":")[1], "-")[1] + gtidNew := strings.Split(gtidStr, ":")[0] + ":" + strings.Split(strings.Split(gtidStr, ":")[1], "-")[1] // TODO: we can use agent.MysqlDaemon.SetMaster , but it uses replDbConfig cmds := []string{ "STOP SLAVE FOR CHANNEL '' ", "STOP SLAVE IO_THREAD FOR CHANNEL ''", fmt.Sprintf("CHANGE MASTER TO MASTER_HOST='%s',MASTER_PORT=%d, MASTER_USER='%s', MASTER_AUTO_POSITION = 1;", *binlogHost, *binlogPort, *binlogUser), fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtidNew), + "STOP SLAVE", + "RESET SLAVE ALL", } fmt.Printf("%v", cmds) From 6805b62189dcd5143ddece6b955ff5937c3392dc Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Mon, 29 Jun 2020 00:17:39 +0530 Subject: [PATCH 097/430] added last method to gtid Signed-off-by: Arindam Nayak --- go/mysql/filepos_gtid.go | 4 ++++ go/mysql/gtid_set.go | 3 +++ go/mysql/gtid_test.go | 1 + go/mysql/mariadb_gtid.go | 5 +++++ go/mysql/mysql56_gtid_set.go | 17 +++++++++++++++++ go/vt/vttablet/tabletmanager/restore.go | 13 ++++++------- .../vreplication/replica_connector.go | 1 + 7 files changed, 37 insertions(+), 7 deletions(-) diff --git a/go/mysql/filepos_gtid.go b/go/mysql/filepos_gtid.go index 07606a4fc69..d707e74ad5b 100644 --- a/go/mysql/filepos_gtid.go +++ b/go/mysql/filepos_gtid.go @@ -146,6 +146,10 @@ func (gtid filePosGTID) Union(other GTIDSet) GTIDSet { return filePosOther } +func (gtid filePosGTID) Last() string { + panic("not implemented") +} + func init() { gtidParsers[filePosFlavorID] = parseFilePosGTID gtidSetParsers[filePosFlavorID] = parseFilePosGTIDSet diff --git a/go/mysql/gtid_set.go b/go/mysql/gtid_set.go index b966e8bc2a5..812b7f33caf 100644 --- a/go/mysql/gtid_set.go +++ b/go/mysql/gtid_set.go @@ -49,6 +49,9 @@ type GTIDSet interface { // Union returns a union of the receiver GTIDSet and the supplied GTIDSet. Union(GTIDSet) GTIDSet + + // Union returns a union of the receiver GTIDSet and the supplied GTIDSet. + Last() string } // gtidSetParsers maps flavor names to parser functions. It is used by diff --git a/go/mysql/gtid_test.go b/go/mysql/gtid_test.go index bad7daabc85..67ac707224f 100644 --- a/go/mysql/gtid_test.go +++ b/go/mysql/gtid_test.go @@ -193,6 +193,7 @@ type fakeGTID struct { } func (f fakeGTID) String() string { return f.value } +func (f fakeGTID) Last() string { panic("not implemented") } func (f fakeGTID) Flavor() string { return f.flavor } func (fakeGTID) SourceServer() interface{} { return int(1) } func (fakeGTID) SequenceNumber() interface{} { return int(1) } diff --git a/go/mysql/mariadb_gtid.go b/go/mysql/mariadb_gtid.go index 57cca52bc78..9f320bbebfb 100644 --- a/go/mysql/mariadb_gtid.go +++ b/go/mysql/mariadb_gtid.go @@ -232,6 +232,11 @@ func (gtidSet MariadbGTIDSet) Union(other GTIDSet) GTIDSet { return newSet } +//Last returns the last gtid +func (gtidSet MariadbGTIDSet) Last() string { + panic("not implemented") +} + // deepCopy returns a deep copy of the set. func (gtidSet MariadbGTIDSet) deepCopy() MariadbGTIDSet { newSet := make(MariadbGTIDSet, len(gtidSet)) diff --git a/go/mysql/mysql56_gtid_set.go b/go/mysql/mysql56_gtid_set.go index 97ccb820b37..e2b6b3e4efb 100644 --- a/go/mysql/mysql56_gtid_set.go +++ b/go/mysql/mysql56_gtid_set.go @@ -171,6 +171,23 @@ func (set Mysql56GTIDSet) String() string { return buf.String() } +//Last returns the last gtid +func (set Mysql56GTIDSet) Last() string { + buf := &bytes.Buffer{} + + if len(set.SIDs()) > 0 { + sid := set.SIDs()[len(set.SIDs())-1] + buf.WriteString(sid.String()) + for _, interval := range set[sid] { + buf.WriteByte(':') + buf.WriteString(strconv.FormatInt(interval.end, 10)) + } + + } + + return buf.String() +} + // Flavor implements GTIDSet. func (Mysql56GTIDSet) Flavor() string { return mysql56FlavorID } diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 4d4f66a1c82..40051d9e6cc 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -19,7 +19,6 @@ package tabletmanager import ( "flag" "fmt" - "strings" "time" "vitess.io/vitess/go/vt/proto/vttime" @@ -257,8 +256,10 @@ func (agent *ActionAgent) getGTIDFromTimestamp(ctx context.Context, pos mysql.Po select { case <-found: + vsClient.Close(timeoutCtx) return <-found case <-timeoutCtx.Done(): + vsClient.Close(timeoutCtx) log.Warningf("Can't find the GTID from restore time stamp, exiting.") return "" } @@ -270,24 +271,22 @@ func (agent *ActionAgent) catchupToGTID(ctx context.Context, gtid string) error if err != nil { return err } - gtidStr := gtidParsed.GTIDSet.String() + gtidStr := gtidParsed.GTIDSet.Last() + log.Infof("gtid to restore upto %s", gtidStr) - gtidNew := strings.Split(gtidStr, ":")[0] + ":" + strings.Split(strings.Split(gtidStr, ":")[1], "-")[1] + //gtidNew := strings.Split(gtidStr, ":")[0] + ":" + strings.Split(strings.Split(gtidStr, ":")[1], "-")[1] // TODO: we can use agent.MysqlDaemon.SetMaster , but it uses replDbConfig cmds := []string{ "STOP SLAVE FOR CHANNEL '' ", "STOP SLAVE IO_THREAD FOR CHANNEL ''", fmt.Sprintf("CHANGE MASTER TO MASTER_HOST='%s',MASTER_PORT=%d, MASTER_USER='%s', MASTER_AUTO_POSITION = 1;", *binlogHost, *binlogPort, *binlogUser), - fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtidNew), - "STOP SLAVE", - "RESET SLAVE ALL", + fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtidStr), } fmt.Printf("%v", cmds) if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { return vterrors.Wrap(err, "failed to reset slave") } - println("it should have cought up") // TODO: Wait for the replication to happen and then reset the slave, so that we don't be connected to binlog server return nil } diff --git a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go index 3133f7d9610..f7c2db50acf 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go @@ -78,6 +78,7 @@ func (c *replicaConnector) Open(ctx context.Context) error { } func (c *replicaConnector) Close(ctx context.Context) error { + c.shutdown() return nil } From c6f3ae6244607af5279bc20692384c72507d9655 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 11 Jun 2020 20:16:17 +0200 Subject: [PATCH 098/430] Mostly implemented ReserveBeginExecute Signed-off-by: Andres Taylor --- go/vt/vtcombo/tablet_map.go | 8 +++ go/vt/vttablet/grpctabletconn/conn.go | 32 ++++++++++ go/vt/vttablet/queryservice/queryservice.go | 2 + go/vt/vttablet/queryservice/wrapped.go | 13 ++++ go/vt/vttablet/sandboxconn/sandboxconn.go | 5 ++ .../tabletconntest/fakequeryservice.go | 7 +++ go/vt/vttablet/tabletserver/query_executor.go | 12 ++-- .../tabletserver/query_executor_test.go | 14 ++--- go/vt/vttablet/tabletserver/tabletserver.go | 28 ++++++++- .../tabletserver/tabletserver_test.go | 33 ++++++++-- go/vt/vttablet/tabletserver/tx_engine.go | 61 +++++++++++++++++++ go/vt/vttablet/tabletserver/tx_pool.go | 16 ++++- 12 files changed, 208 insertions(+), 23 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 0035dbc23dd..a5b59f5ab18 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -333,6 +333,8 @@ type internalTabletConn struct { topoTablet *topodatapb.Tablet } +var _ queryservice.QueryService = (*internalTabletConn)(nil) + // Execute is part of queryservice.QueryService // We need to copy the bind variables as tablet server will change them. func (itc *internalTabletConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { @@ -474,6 +476,12 @@ func (itc *internalTabletConn) MessageAck(ctx context.Context, target *querypb.T func (itc *internalTabletConn) HandlePanic(err *error) { } +//ReserveBeginExecute is part of the QueryService interface. +func (itc *internalTabletConn) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + res, txID, reservedID, alias, err := itc.tablet.qsc.QueryService().ReserveBeginExecute(ctx, target, sql, preQueries, bindVariables, options) + return res, txID, reservedID, alias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +} + // Close is part of queryservice.QueryService func (itc *internalTabletConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index 8c87a49f580..289c3efd967 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -60,6 +60,8 @@ type gRPCQueryClient struct { c queryservicepb.QueryClient } +var _ queryservice.QueryService = (*gRPCQueryClient)(nil) + // DialTablet creates and initializes gRPCQueryClient. func DialTablet(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) { // create the RPC client @@ -727,6 +729,36 @@ func (conn *gRPCQueryClient) VStreamResults(ctx context.Context, target *querypb func (conn *gRPCQueryClient) HandlePanic(err *error) { } +//ReserveBeginExecute implements the queryservice interface +func (conn *gRPCQueryClient) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + conn.mu.RLock() + defer conn.mu.RUnlock() + if conn.cc == nil { + return nil, 0, 0, nil, tabletconn.ConnClosed + } + + req := &querypb.ReserveBeginExecuteRequest{ + Target: target, + EffectiveCallerId: callerid.EffectiveCallerIDFromContext(ctx), + ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), + Options: options, + PreQueries: preQueries, + Query: &querypb.BoundQuery{ + Sql: sql, + BindVariables: bindVariables, + }, + } + reply, err := conn.c.ReserveBeginExecute(ctx, req) + if err != nil { + return nil, 0, 0, nil, tabletconn.ErrorFromGRPC(err) + } + if reply.Error != nil { + return nil, reply.TransactionId, reply.ReservedId, conn.tablet.Alias, tabletconn.ErrorFromVTRPC(reply.Error) + } + + return sqltypes.Proto3ToResult(reply.Result), reply.TransactionId, reply.ReservedId, conn.tablet.Alias, nil +} + // Close closes underlying gRPC channel. func (conn *gRPCQueryClient) Close(ctx context.Context) error { conn.mu.Lock() diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 2dcf5ebab81..88db7ada43c 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -111,6 +111,8 @@ type QueryService interface { // HandlePanic will be called if any of the functions panic. HandlePanic(err *error) + ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) + // Close must be called for releasing resources. Close(ctx context.Context) error } diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index c0af4a273c8..4ea9404ff4c 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -268,6 +268,19 @@ func (ws *wrappedService) HandlePanic(err *error) { // No-op. Wrappers must call HandlePanic. } +func (ws *wrappedService) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + var res *sqltypes.Result + var txID, reservedID int64 + var alias *topodatapb.TabletAlias + err := ws.wrapper(ctx, target, ws.impl, "ReserveBeginExecute", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + var err error + res, txID, reservedID, alias, err = conn.ReserveBeginExecute(ctx, target, sql, preQueries, bindVariables, options) + return canRetry(ctx, err), err + }) + + return res, txID, reservedID, alias, err +} + func (ws *wrappedService) Close(ctx context.Context) error { return ws.wrapper(ctx, nil, ws.impl, "Close", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { // No point retrying Close. diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index a4fd397028b..3edbe6b3962 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -384,6 +384,11 @@ func (sbc *SandboxConn) QueryServiceByAlias(_ *topodatapb.TabletAlias) (queryser func (sbc *SandboxConn) HandlePanic(err *error) { } +//ReserveBeginExecute implements the QueryService interface +func (sbc *SandboxConn) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + panic("implement me") +} + // Close does not change ExecCount func (sbc *SandboxConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index 2d5993f8f7a..c66bcdfd79f 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -60,6 +60,8 @@ type FakeQueryService struct { StreamHealthResponse *querypb.StreamHealthResponse } +var _ queryservice.QueryService = (*FakeQueryService)(nil) + // Close is a no-op. func (f *FakeQueryService) Close(ctx context.Context) error { return nil @@ -718,6 +720,11 @@ func (f *FakeQueryService) QueryServiceByAlias(_ *topodatapb.TabletAlias) (query panic("not implemented") } +// ReserveBeginExecute satisfies the Gateway interface +func (f *FakeQueryService) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + panic("implement me") +} + // CreateFakeServer returns the fake server for the tests func CreateFakeServer(t *testing.T) *FakeQueryService { return &FakeQueryService{ diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index eb472ed3fc5..9df15894891 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -52,7 +52,7 @@ type QueryExecutor struct { query string marginComments sqlparser.MarginComments bindVars map[string]*querypb.BindVariable - transactionID int64 + connID int64 options *querypb.ExecuteOptions plan *TabletPlan ctx context.Context @@ -70,7 +70,7 @@ var sequenceFields = []*querypb.Field{ // Execute performs a non-streaming query execution. func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { - qre.logStats.TransactionID = qre.transactionID + qre.logStats.TransactionID = qre.connID planName := qre.plan.PlanID.String() qre.logStats.PlanType = planName defer func(start time.Time) { @@ -113,9 +113,9 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { } } - if qre.transactionID != 0 { + if qre.connID != 0 { // Need upfront connection for DMLs and transactions - conn, err := qre.tsv.te.txPool.GetAndLock(qre.transactionID, "for query") + conn, err := qre.tsv.te.txPool.GetAndLock(qre.connID, "for query") if err != nil { return nil, err } @@ -234,8 +234,8 @@ func (qre *QueryExecutor) Stream(callback func(*sqltypes.Result) error) error { // if we have a transaction id, let's use the txPool for this query var conn *connpool.DBConn - if qre.transactionID != 0 { - txConn, err := qre.tsv.te.txPool.GetAndLock(qre.transactionID, "for streaming query") + if qre.connID != 0 { + txConn, err := qre.tsv.te.txPool.GetAndLock(qre.connID, "for streaming query") if err != nil { return err } diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index 0c794c44bca..aaab3f47dcd 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -1094,13 +1094,13 @@ func newTestQueryExecutor(ctx context.Context, tsv *TabletServer, sql string, tx panic(err) } return &QueryExecutor{ - ctx: ctx, - query: sql, - bindVars: make(map[string]*querypb.BindVariable), - transactionID: txID, - plan: plan, - logStats: logStats, - tsv: tsv, + ctx: ctx, + query: sql, + bindVars: make(map[string]*querypb.BindVariable), + connID: txID, + plan: plan, + logStats: logStats, + tsv: tsv, } } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 97fd3394eaf..dd14df73b69 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -186,6 +186,8 @@ type TabletServer struct { alias topodatapb.TabletAlias } +var _ queryservice.QueryService = (*TabletServer)(nil) + // RegisterFunctions is a list of all the // RegisterFunction that will be called upon // Register() on a TabletServer @@ -978,7 +980,7 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq query: query, marginComments: comments, bindVars: bindVariables, - transactionID: transactionID, + connID: transactionID, options: options, plan: plan, ctx: ctx, @@ -1018,7 +1020,7 @@ func (tsv *TabletServer) StreamExecute(ctx context.Context, target *querypb.Targ query: query, marginComments: comments, bindVars: bindVariables, - transactionID: transactionID, + connID: transactionID, options: options, plan: plan, ctx: ctx, @@ -1355,6 +1357,28 @@ func (tsv *TabletServer) VStreamResults(ctx context.Context, target *querypb.Tar return tsv.vstreamer.StreamResults(ctx, query, send) } +//ReserveBeginExecute implements the QueryService interface +func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + if tsv.enableHotRowProtection { + txDone, err := tsv.beginWaitForSameRangeTransactions(ctx, target, options, sql, bindVariables) + if err != nil { + return nil, 0, 0, nil, err + } + if txDone != nil { + defer txDone() + } + } + + connID, err := tsv.te.ReserveBegin(ctx, options, preQueries) + if err != nil { + return nil, 0, 0, nil, err + } + + // TODO + result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) + return result, connID, connID, &tsv.alias, err +} + // execRequest performs verifications, sets up the necessary environments // and calls the supplied function for executing the request. func (tsv *TabletServer) execRequest( diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 2478f92ee76..020ae30ab0a 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -1429,7 +1429,7 @@ func TestSerializeTransactionsSameRow_ExecuteBatchAsTransaction(t *testing.T) { results, err := tsv.ExecuteBatch(ctx, &target, []*querypb.BoundQuery{{ Sql: q1, BindVariables: bvTx1, - }}, true /*asTransaction*/, 0 /*transactionID*/, nil /*options*/) + }}, true /*asTransaction*/, 0 /*connID*/, nil /*options*/) if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } @@ -1447,7 +1447,7 @@ func TestSerializeTransactionsSameRow_ExecuteBatchAsTransaction(t *testing.T) { results, err := tsv.ExecuteBatch(ctx, &target, []*querypb.BoundQuery{{ Sql: q2, BindVariables: bvTx2, - }}, true /*asTransaction*/, 0 /*transactionID*/, nil /*options*/) + }}, true /*asTransaction*/, 0 /*connID*/, nil /*options*/) if err != nil { t.Errorf("failed to execute query: %s: %s", q2, err) } @@ -1465,7 +1465,7 @@ func TestSerializeTransactionsSameRow_ExecuteBatchAsTransaction(t *testing.T) { results, err := tsv.ExecuteBatch(ctx, &target, []*querypb.BoundQuery{{ Sql: q3, BindVariables: bvTx3, - }}, true /*asTransaction*/, 0 /*transactionID*/, nil /*options*/) + }}, true /*asTransaction*/, 0 /*connID*/, nil /*options*/) if err != nil { t.Errorf("failed to execute query: %s: %s", q3, err) } @@ -1765,7 +1765,7 @@ func TestSerializeTransactionsSameRow_TooManyPendingRequests_ExecuteBatchAsTrans results, err := tsv.ExecuteBatch(ctx, &target, []*querypb.BoundQuery{{ Sql: q1, BindVariables: bvTx1, - }}, true /*asTransaction*/, 0 /*transactionID*/, nil /*options*/) + }}, true /*asTransaction*/, 0 /*connID*/, nil /*options*/) if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } @@ -1784,7 +1784,7 @@ func TestSerializeTransactionsSameRow_TooManyPendingRequests_ExecuteBatchAsTrans results, err := tsv.ExecuteBatch(ctx, &target, []*querypb.BoundQuery{{ Sql: q2, BindVariables: bvTx2, - }}, true /*asTransaction*/, 0 /*transactionID*/, nil /*options*/) + }}, true /*asTransaction*/, 0 /*connID*/, nil /*options*/) if err == nil || vterrors.Code(err) != vtrpcpb.Code_RESOURCE_EXHAUSTED || err.Error() != "hot row protection: too many queued transactions (1 >= 1) for the same row (table + WHERE clause: 'test_table where pk = 1 and name = 1')" { t.Errorf("tx2 should have failed because there are too many pending requests: %v results: %+v", err, results) } @@ -2369,6 +2369,29 @@ func TestConfigChanges(t *testing.T) { } } +func TestReserveBeginExecute(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + + _, txID, connID, _, err := tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) + require.NoError(t, err) + assert.Greater(t, txID, 0, "txID") + assert.Equal(t, connID, txID, "connID should equal txID") + expected := []string{ + "select 43", + "begin", + "select 42", + } + assert.Contains(t, expected, db.QueryLog(), "expected queries to run") +} + func setUpTabletServerTest(t *testing.T) *fakesqldb.DB { db := fakesqldb.New(t) for query, result := range getSupportedQueries() { diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 6ee95c29f17..befd90ac1ba 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -545,3 +545,64 @@ func (te *TxEngine) startWatchdog() { func (te *TxEngine) stopWatchdog() { te.ticks.Stop() } + +//ReserveBegin creates a reserved connection, and in it opens a transaction +func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (int64, error) { + conn, err := te.reserve(ctx, options, preQueries) + if err != nil { + return 0, err + } + defer conn.Unlock() + _, err = te.txPool.begin(ctx, options, te.state == AcceptingReadOnly, conn) + if err != nil { + conn.Close() + conn.Release(tx.ConnInitFail) + return 0, err + } + return conn.ID(), nil +} + +//Reserve creates a reserved connection and returns the id to it +func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (int64, error) { + conn, err := te.reserve(ctx, options, preQueries) + if err != nil { + return 0, err + } + defer conn.Unlock() + return conn.ID(), nil +} + +//Reserve creates a reserved connection and returns the id to it +func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (*StatefulConnection, error) { + span, ctx := trace.NewSpan(ctx, "TxEngine.Reserve") + defer span.Finish() + te.stateLock.Lock() + + canOpenTransactions := te.state == AcceptingReadOnly || te.state == AcceptingReadAndWrite + if !canOpenTransactions { + // We are not in a state where we can start new transactions. Abort. + te.stateLock.Unlock() + return nil, vterrors.Errorf(vtrpc.Code_UNAVAILABLE, "tx engine can't accept new transactions in state %v", te.state) + } + // By Add() to beginRequests, we block others from initiating state + // changes until we have finished adding this transaction + te.beginRequests.Add(1) + defer te.beginRequests.Done() + + te.stateLock.Unlock() + + conn, err := te.txPool.scp.NewConn(ctx, options) + if err != nil { + return nil, err + } + + for _, query := range preQueries { + _, err = conn.Exec(ctx, query, 0 /*maxrows*/, false /*wantFields*/) + if err != nil { + conn.Releasef("error during connection setup: %s\n%v", query, err) + return nil, err + } + } + + return conn, err +} diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index 66b790f0205..13b6bf29fa1 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -147,7 +147,7 @@ func (tp *TxPool) NewTxProps(immediateCaller *querypb.VTGateCallerID, effectiveC } } -// GetAndLock fetches the connection associated to the transactionID and blocks it from concurrent use +// GetAndLock fetches the connection associated to the connID and blocks it from concurrent use // You must call Unlock on TxConnection once done. func (tp *TxPool) GetAndLock(connID tx.ConnID, reason string) (tx.IStatefulConnection, error) { conn, err := tp.scp.GetAndLock(connID, reason) @@ -222,16 +222,26 @@ func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, re if err != nil { return nil, "", err } - beginQueries, autocommit, err := createTransaction(ctx, options, conn, readOnly) + sql, err := tp.begin(ctx, options, readOnly, conn) if err != nil { conn.Close() conn.Release(tx.ConnInitFail) return nil, "", err } + return conn, sql, nil +} + +func (tp *TxPool) begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, conn *StatefulConnection) (string, error) { + immediateCaller := callerid.ImmediateCallerIDFromContext(ctx) + effectiveCaller := callerid.EffectiveCallerIDFromContext(ctx) + beginQueries, autocommit, err := createTransaction(ctx, options, conn, readOnly) + if err != nil { + return "", err + } conn.txProps = tp.NewTxProps(immediateCaller, effectiveCaller, autocommit) - return conn, beginQueries, nil + return beginQueries, nil } func (tp *TxPool) createConn(ctx context.Context, options *querypb.ExecuteOptions) (*StatefulConnection, error) { From e18baddde49567913fe71043eb2ab66390be8fa3 Mon Sep 17 00:00:00 2001 From: deepthi Date: Thu, 11 Jun 2020 17:58:38 -0700 Subject: [PATCH 099/430] Mostly implemented ReserveExecute Signed-off-by: deepthi --- go/vt/vttablet/tabletserver/tabletserver.go | 22 +++++++++ .../tabletserver/tabletserver_test.go | 49 ++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index dd14df73b69..4cf32087793 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1379,6 +1379,28 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp return result, connID, connID, &tsv.alias, err } +//ReserveExecute implements the QueryService interface +func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { + if tsv.enableHotRowProtection { + txDone, err := tsv.beginWaitForSameRangeTransactions(ctx, target, options, sql, bindVariables) + if err != nil { + return nil, 0, 0, nil, err + } + if txDone != nil { + defer txDone() + } + } + + connID, err := tsv.te.Reserve(ctx, options, preQueries) + if err != nil { + return nil, 0, 0, nil, err + } + + // TODO + result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) + return result, connID, connID, &tsv.alias, err +} + // execRequest performs verifications, sets up the necessary environments // and calls the supplied function for executing the request. func (tsv *TabletServer) execRequest( diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 020ae30ab0a..a8419a89915 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2382,12 +2382,38 @@ func TestReserveBeginExecute(t *testing.T) { _, txID, connID, _, err := tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) require.NoError(t, err) - assert.Greater(t, txID, 0, "txID") + // TODO defer a call to tsv.ReserveRelease here + assert.Greater(t, txID, int64(0), "txID") assert.Equal(t, connID, txID, "connID should equal txID") expected := []string{ "select 43", "begin", - "select 42", + "select 42 from dual where 1 != 1", + "select 42 from dual limit 10001", + } + assert.Contains(t, expected, db.QueryLog(), "expected queries to run") +} + +func TestReserveExecute(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + + _, txID, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) + require.NoError(t, err) + // TODO defer a call to tsv.ReserveRelease here + assert.Greater(t, txID, int64(0), "txID") + assert.Equal(t, connID, txID, "connID should equal txID") + expected := []string{ + "select 43", + "select 42 from dual where 1 != 1", + "select 42 from dual limit 10001", } assert.Contains(t, expected, db.QueryLog(), "expected queries to run") } @@ -2483,6 +2509,25 @@ func getSupportedQueries() map[string]*sqltypes.Result { mysql.ShowPrimaryRow("msg", "id"), }, }, + // queries for TestReserve* + "select 42 from dual where 1 != 1": { + Fields: []*querypb.Field{{ + Name: "42", + Type: sqltypes.Int32, + }}, + }, + "select 42 from dual limit 10001": { + Fields: []*querypb.Field{{ + Name: "42", + Type: sqltypes.Int32, + }}, + }, + "select 43": { + Fields: []*querypb.Field{{ + Name: "43", + Type: sqltypes.Int32, + }}, + }, "select * from test_table where 1 != 1": { Fields: []*querypb.Field{{ Name: "pk", From 982991bb631b02ed2170f322eb130b53dcce4ca1 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 15 Jun 2020 12:27:07 +0530 Subject: [PATCH 100/430] reserved-conn: fix test Signed-off-by: Harshit Gangal --- go/vt/vttablet/tabletserver/tabletserver_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index a8419a89915..107a466a69a 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2391,7 +2391,7 @@ func TestReserveBeginExecute(t *testing.T) { "select 42 from dual where 1 != 1", "select 42 from dual limit 10001", } - assert.Contains(t, expected, db.QueryLog(), "expected queries to run") + assert.Contains(t, db.QueryLog(), strings.Join(expected, ";"), "expected queries to run") } func TestReserveExecute(t *testing.T) { @@ -2415,7 +2415,7 @@ func TestReserveExecute(t *testing.T) { "select 42 from dual where 1 != 1", "select 42 from dual limit 10001", } - assert.Contains(t, expected, db.QueryLog(), "expected queries to run") + assert.Contains(t, db.QueryLog(), strings.Join(expected, ";"), "expected queries to run") } func setUpTabletServerTest(t *testing.T) *fakesqldb.DB { From 7699addd33d71426be2eae025efb6adf3c9d4110 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 15 Jun 2020 15:47:08 +0530 Subject: [PATCH 101/430] Added tainted and renew logic to connection Signed-off-by: Harshit Gangal --- .../vttablet/tabletserver/connpool/dbconn.go | 9 ++++++ .../tabletserver/stateful_connection.go | 29 +++++++++++++++---- .../tabletserver/stateful_connection_pool.go | 18 ++++++++---- go/vt/vttablet/tabletserver/tx_engine.go | 2 ++ 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/go/vt/vttablet/tabletserver/connpool/dbconn.go b/go/vt/vttablet/tabletserver/connpool/dbconn.go index 103e3f2816c..1e1ffef45f0 100644 --- a/go/vt/vttablet/tabletserver/connpool/dbconn.go +++ b/go/vt/vttablet/tabletserver/connpool/dbconn.go @@ -290,6 +290,15 @@ func (dbc *DBConn) Recycle() { } } +// Taint unregister connection from original pool and taints the connection. +func (dbc *DBConn) Taint() { + if dbc.pool == nil { + return + } + dbc.pool.Put(nil) + dbc.pool = nil +} + // Kill kills the currently executing query both on MySQL side // and on the connection side. If no query is executing, it's a no-op. // Kill will also not kill a query more than once. diff --git a/go/vt/vttablet/tabletserver/stateful_connection.go b/go/vt/vttablet/tabletserver/stateful_connection.go index b698cf392ea..7d540c18107 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection.go +++ b/go/vt/vttablet/tabletserver/stateful_connection.go @@ -36,12 +36,13 @@ import ( // This is used for transactions and reserved connections. // NOTE: After use, if must be returned either by doing a Unlock() or a Release(). type StatefulConnection struct { - pool *StatefulConnectionPool - dbConn *connpool.DBConn - ConnID tx.ConnID - env tabletenv.Env - - txProps *tx.Properties + pool *StatefulConnectionPool + dbConn *connpool.DBConn + ConnID tx.ConnID + env tabletenv.Env + txProps *tx.Properties + tainted bool + enforceTimeout bool } // Close closes the underlying connection. When the connection is Unblocked, it will be Released @@ -125,6 +126,16 @@ func (sc *StatefulConnection) Releasef(reasonFormat string, a ...interface{}) { sc.dbConn = nil } +//Renew the existing connection with new connection id. +func (sc *StatefulConnection) Renew() error { + err := sc.pool.RenewConn(sc) + if err != nil { + sc.Close() + return vterrors.Wrap(err, "connection renew failed: ") + } + return nil +} + // String returns a printable version of the connection info. func (sc *StatefulConnection) String() string { return fmt.Sprintf( @@ -159,4 +170,10 @@ func (sc *StatefulConnection) Stats() *tabletenv.Stats { return sc.env.Stats() } +//Taint Taints the existing connection. +func (sc *StatefulConnection) Taint() { + sc.tainted = true + sc.dbConn.Taint() +} + var _ tx.IStatefulConnection = (*StatefulConnection)(nil) diff --git a/go/vt/vttablet/tabletserver/stateful_connection_pool.go b/go/vt/vttablet/tabletserver/stateful_connection_pool.go index f2d2903ee68..799140e476e 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection_pool.go +++ b/go/vt/vttablet/tabletserver/stateful_connection_pool.go @@ -149,16 +149,17 @@ func (sf *StatefulConnectionPool) NewConn(ctx context.Context, options *querypb. connID := sf.lastID.Add(1) sfConn := &StatefulConnection{ - dbConn: conn, - ConnID: connID, - pool: sf, - env: sf.env, + dbConn: conn, + ConnID: connID, + pool: sf, + env: sf.env, + enforceTimeout: options.GetWorkload() != querypb.ExecuteOptions_DBA, } err = sf.active.Register( sfConn.ConnID, sfConn, - options.GetWorkload() != querypb.ExecuteOptions_DBA, + sfConn.enforceTimeout, ) if err != nil { sfConn.Release(tx.ConnInitFail) @@ -192,3 +193,10 @@ func (sf *StatefulConnectionPool) markAsNotInUse(id tx.ConnID) { func (sf *StatefulConnectionPool) Capacity() int { return int(sf.conns.Capacity()) } + +//RenewConn unregister and registers with new id. +func (sf *StatefulConnectionPool) RenewConn(sc *StatefulConnection) error { + sf.active.Unregister(sc.ConnID, "renew existing connection") + sc.ConnID = sf.lastID.Add(1) + return sf.active.Register(sc.ConnID, sc, sc.enforceTimeout) +} diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index befd90ac1ba..e040eff25af 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -596,6 +596,8 @@ func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions return nil, err } + conn.tainted = true // Taint the connection before executing preQueries + conn.Taint() for _, query := range preQueries { _, err = conn.Exec(ctx, query, 0 /*maxrows*/, false /*wantFields*/) if err != nil { From 3f71c83befe1b32f7b11c2d36da4c8b5e9a62f4a Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 15 Jun 2020 17:44:51 +0530 Subject: [PATCH 102/430] reserve-conn: implements release method in tabletserver Signed-off-by: Harshit Gangal --- go/vt/vttablet/tabletserver/tabletserver.go | 45 ++++++++++--------- .../tabletserver/tabletserver_test.go | 4 +- go/vt/vttablet/tabletserver/tx/api.go | 5 +++ go/vt/vttablet/tabletserver/tx_engine.go | 10 +++++ 4 files changed, 40 insertions(+), 24 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 4cf32087793..6e0ba844bbb 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1359,48 +1359,49 @@ func (tsv *TabletServer) VStreamResults(ctx context.Context, target *querypb.Tar //ReserveBeginExecute implements the QueryService interface func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { - if tsv.enableHotRowProtection { - txDone, err := tsv.beginWaitForSameRangeTransactions(ctx, target, options, sql, bindVariables) - if err != nil { - return nil, 0, 0, nil, err - } - if txDone != nil { - defer txDone() - } - } - connID, err := tsv.te.ReserveBegin(ctx, options, preQueries) if err != nil { return nil, 0, 0, nil, err } - // TODO result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) return result, connID, connID, &tsv.alias, err } //ReserveExecute implements the QueryService interface func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { - if tsv.enableHotRowProtection { - txDone, err := tsv.beginWaitForSameRangeTransactions(ctx, target, options, sql, bindVariables) - if err != nil { - return nil, 0, 0, nil, err - } - if txDone != nil { - defer txDone() - } - } - connID, err := tsv.te.Reserve(ctx, options, preQueries) if err != nil { return nil, 0, 0, nil, err } - // TODO result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) return result, connID, connID, &tsv.alias, err } +//Release implements the QueryService interface +func (tsv *TabletServer) Release(ctx context.Context, target *querypb.Target, connID int64, txID int64) error { + if connID == 0 && txID == 0 { + return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "Connection Id and Transaction ID does not exists") + } + return tsv.execRequest( + ctx, tsv.QueryTimeout.Get(), + "Release", "", nil, //TODO (hgangal): Do we need to set any sql query to be logged? + target, nil, true, /* allowOnShutdown */ + func(ctx context.Context, logStats *tabletenv.LogStats) error { + defer tsv.stats.QueryTimings.Record("RELEASE", time.Now()) + if connID != 0 { + //Release to close the underlying connection. + logStats.TransactionID = connID + return tsv.te.Release(ctx, connID) + } + // Rollback to cleanup the transaction before returning to the pool. + logStats.TransactionID = txID + return tsv.te.Rollback(ctx, txID) + }, + ) +} + // execRequest performs verifications, sets up the necessary environments // and calls the supplied function for executing the request. func (tsv *TabletServer) execRequest( diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 107a466a69a..b7f6e08ad2c 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2382,7 +2382,7 @@ func TestReserveBeginExecute(t *testing.T) { _, txID, connID, _, err := tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) require.NoError(t, err) - // TODO defer a call to tsv.ReserveRelease here + defer tsv.Release(ctx, &target, connID, txID) assert.Greater(t, txID, int64(0), "txID") assert.Equal(t, connID, txID, "connID should equal txID") expected := []string{ @@ -2407,7 +2407,7 @@ func TestReserveExecute(t *testing.T) { _, txID, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) require.NoError(t, err) - // TODO defer a call to tsv.ReserveRelease here + defer tsv.Release(ctx, &target, connID, txID) assert.Greater(t, txID, int64(0), "txID") assert.Equal(t, connID, txID, "connID should equal txID") expected := []string{ diff --git a/go/vt/vttablet/tabletserver/tx/api.go b/go/vt/vttablet/tabletserver/tx/api.go index b11bdec7f6e..860074d73ad 100644 --- a/go/vt/vttablet/tabletserver/tx/api.go +++ b/go/vt/vttablet/tabletserver/tx/api.go @@ -104,6 +104,9 @@ const ( // ConnInitFail - connection released on failed to start tx. ConnInitFail + + // ConnRelease - connection closed. + ConnRelease ) func (r ReleaseReason) String() string { @@ -121,6 +124,7 @@ var txResolutions = map[ReleaseReason]string{ TxRollback: "transaction rolled back", TxKill: "kill", ConnInitFail: "initFail", + ConnRelease: "release connection", } var txNames = map[ReleaseReason]string{ @@ -129,6 +133,7 @@ var txNames = map[ReleaseReason]string{ TxRollback: "rollback", TxKill: "kill", ConnInitFail: "initFail", + ConnRelease: "release", } // RecordQuery records the query against this transaction. diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index e040eff25af..3721237d987 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -608,3 +608,13 @@ func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions return conn, err } + +//Release closes the underlying connection. +func (te *TxEngine) Release(ctx context.Context, connID int64) error { + conn, err := te.txPool.GetAndLock(connID, "for release") + if err != nil { + return err + } + conn.Release(tx.ConnRelease) + return nil +} From 9ff548a0c22a352a24cb77c90d3b9c98a04a8550 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 15 Jun 2020 17:57:54 +0530 Subject: [PATCH 103/430] reserve-conn: use execRequest in tabletserver for tracing Signed-off-by: Harshit Gangal --- go/vt/vttablet/tabletserver/tabletserver.go | 45 ++++++++++++++++--- .../tabletserver/tabletserver_test.go | 7 ++- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 6e0ba844bbb..63715a9bbae 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1359,7 +1359,25 @@ func (tsv *TabletServer) VStreamResults(ctx context.Context, target *querypb.Tar //ReserveBeginExecute implements the QueryService interface func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { - connID, err := tsv.te.ReserveBegin(ctx, options, preQueries) + + var connID int64 + var err error + + err = tsv.execRequest( + ctx, tsv.QueryTimeout.Get(), + "ReserveBegin", "begin", nil, + target, options, false, /* allowOnShutdown */ + func(ctx context.Context, logStats *tabletenv.LogStats) error { + defer tsv.stats.QueryTimings.Record("ReserveBegin", time.Now()) + connID, err = tsv.te.ReserveBegin(ctx, options, preQueries) + if err != nil { + return err + } + logStats.TransactionID = connID + return nil + }, + ) + if err != nil { return nil, 0, 0, nil, err } @@ -1369,14 +1387,31 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp } //ReserveExecute implements the QueryService interface -func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { - connID, err := tsv.te.Reserve(ctx, options, preQueries) +func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + var connID int64 + var err error + + err = tsv.execRequest( + ctx, tsv.QueryTimeout.Get(), + "Reserve", "", nil, + target, options, false, /* allowOnShutdown */ + func(ctx context.Context, logStats *tabletenv.LogStats) error { + defer tsv.stats.QueryTimings.Record("Reserve", time.Now()) + connID, err = tsv.te.Reserve(ctx, options, preQueries) + if err != nil { + return err + } + logStats.TransactionID = connID + return nil + }, + ) + if err != nil { - return nil, 0, 0, nil, err + return nil, 0, nil, err } result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) - return result, connID, connID, &tsv.alias, err + return result, connID, &tsv.alias, err } //Release implements the QueryService interface diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index b7f6e08ad2c..cee6057faa5 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2405,11 +2405,10 @@ func TestReserveExecute(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - _, txID, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) + _, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) require.NoError(t, err) - defer tsv.Release(ctx, &target, connID, txID) - assert.Greater(t, txID, int64(0), "txID") - assert.Equal(t, connID, txID, "connID should equal txID") + defer tsv.Release(ctx, &target, connID, 0) + assert.NotEqual(t, int64(0), connID, "connID should not be zero") expected := []string{ "select 43", "select 42 from dual where 1 != 1", From 626a70215fa0198a6b66a8717e3ee80148898dba Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 15 Jun 2020 18:12:46 +0530 Subject: [PATCH 104/430] reserve-conn: added txID test on reserveExecute method Signed-off-by: Harshit Gangal --- go/vt/vttablet/tabletserver/tabletserver.go | 2 +- .../tabletserver/tabletserver_test.go | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 63715a9bbae..8a483867c9a 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1387,7 +1387,7 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp } //ReserveExecute implements the QueryService interface -func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { var connID int64 var err error diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index cee6057faa5..5e02c5d27a0 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2394,7 +2394,7 @@ func TestReserveBeginExecute(t *testing.T) { assert.Contains(t, db.QueryLog(), strings.Join(expected, ";"), "expected queries to run") } -func TestReserveExecute(t *testing.T) { +func TestReserveExecute_WithoutTx(t *testing.T) { db := setUpTabletServerTest(t) defer db.Close() config := tabletenv.NewDefaultConfig() @@ -2405,7 +2405,7 @@ func TestReserveExecute(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - _, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) + _, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, 0, &querypb.ExecuteOptions{}) require.NoError(t, err) defer tsv.Release(ctx, &target, connID, 0) assert.NotEqual(t, int64(0), connID, "connID should not be zero") @@ -2417,6 +2417,34 @@ func TestReserveExecute(t *testing.T) { assert.Contains(t, db.QueryLog(), strings.Join(expected, ";"), "expected queries to run") } +func TestReserveExecute_WithTx(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + + txID, _, err := tsv.Begin(ctx, &target, &querypb.ExecuteOptions{}) + require.NoError(t, err) + require.NotEqual(t, int64(0), txID) + db.ResetQueryLog() + + _, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, txID, &querypb.ExecuteOptions{}) + require.NoError(t, err) + defer tsv.Release(ctx, &target, connID, txID) + assert.Equal(t, txID, connID, "connID should be equal to txID") + expected := []string{ + "select 43", + "select 42 from dual where 1 != 1", + "select 42 from dual limit 10001", + } + assert.Contains(t, db.QueryLog(), strings.Join(expected, ";"), "expected queries to run") +} + func setUpTabletServerTest(t *testing.T) *fakesqldb.DB { db := fakesqldb.New(t) for query, result := range getSupportedQueries() { From 1606b075915eaa3ceb4a9116819d986ef9ee72df Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 15 Jun 2020 15:01:14 +0200 Subject: [PATCH 105/430] reserve-conn: allow reserving on a transaction Signed-off-by: Andres Taylor --- go/vt/vttablet/tabletserver/tabletserver.go | 2 +- go/vt/vttablet/tabletserver/tx/api.go | 3 ++ go/vt/vttablet/tabletserver/tx_engine.go | 39 ++++++++++++++++----- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 8a483867c9a..2d1b85135ae 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1397,7 +1397,7 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { defer tsv.stats.QueryTimings.Record("Reserve", time.Now()) - connID, err = tsv.te.Reserve(ctx, options, preQueries) + connID, err = tsv.te.Reserve(ctx, options, txID, preQueries) if err != nil { return err } diff --git a/go/vt/vttablet/tabletserver/tx/api.go b/go/vt/vttablet/tabletserver/tx/api.go index 860074d73ad..fa30d54fc5b 100644 --- a/go/vt/vttablet/tabletserver/tx/api.go +++ b/go/vt/vttablet/tabletserver/tx/api.go @@ -68,6 +68,9 @@ type ( CleanTxState() Stats() *tabletenv.Stats + + //Taint taints the existing connection. + Taint() } // ReleaseReason as type int diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 3721237d987..06533370f00 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -548,6 +548,8 @@ func (te *TxEngine) stopWatchdog() { //ReserveBegin creates a reserved connection, and in it opens a transaction func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (int64, error) { + span, ctx := trace.NewSpan(ctx, "TxEngine.ReserveBegin") + defer span.Finish() conn, err := te.reserve(ctx, options, preQueries) if err != nil { return 0, err @@ -563,19 +565,31 @@ func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOp } //Reserve creates a reserved connection and returns the id to it -func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (int64, error) { - conn, err := te.reserve(ctx, options, preQueries) +func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions, txID int64, preQueries []string) (int64, error) { + span, ctx := trace.NewSpan(ctx, "TxEngine.Reserve") + defer span.Finish() + if txID == 0 { + conn, err := te.reserve(ctx, options, preQueries) + if err != nil { + return 0, err + } + defer conn.Unlock() + return conn.ID(), nil + } + + conn, err := te.txPool.GetAndLock(txID, "to reserve") if err != nil { return 0, err } defer conn.Unlock() + + te.taintConn(ctx, conn, preQueries) + return conn.ID(), nil } //Reserve creates a reserved connection and returns the id to it func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (*StatefulConnection, error) { - span, ctx := trace.NewSpan(ctx, "TxEngine.Reserve") - defer span.Finish() te.stateLock.Lock() canOpenTransactions := te.state == AcceptingReadOnly || te.state == AcceptingReadAndWrite @@ -596,17 +610,24 @@ func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions return nil, err } - conn.tainted = true // Taint the connection before executing preQueries + err = te.taintConn(ctx, conn, preQueries) + if err != nil { + return nil, err + } + + return conn, err +} + +func (te *TxEngine) taintConn(ctx context.Context, conn tx.IStatefulConnection, preQueries []string) error { conn.Taint() for _, query := range preQueries { - _, err = conn.Exec(ctx, query, 0 /*maxrows*/, false /*wantFields*/) + _, err := conn.Exec(ctx, query, 0 /*maxrows*/, false /*wantFields*/) if err != nil { conn.Releasef("error during connection setup: %s\n%v", query, err) - return nil, err + return err } } - - return conn, err + return nil } //Release closes the underlying connection. From 2c0d3cb90c7c9f169ecf04a6fdaa74ade691174c Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 15 Jun 2020 15:36:52 +0200 Subject: [PATCH 106/430] reserve-conn: added tests around release Signed-off-by: Andres Taylor --- .../tabletserver/tabletserver_test.go | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 5e02c5d27a0..81bee437fb3 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2445,6 +2445,79 @@ func TestReserveExecute_WithTx(t *testing.T) { assert.Contains(t, db.QueryLog(), strings.Join(expected, ";"), "expected queries to run") } +func TestRelease(t *testing.T) { + type testcase struct { + begin, reserve bool + expectedQueries []string + err bool + } + + tests := []testcase{{ + begin: true, + reserve: false, + expectedQueries: []string{"rollback"}, + }, { + begin: true, + reserve: true, + }, { + begin: false, + reserve: true, + }, { + begin: false, + reserve: false, + err: true, + }} + + for i, test := range tests { + + name := fmt.Sprintf("%d", i) + if test.begin { + name += " begin" + } + if test.reserve { + name += " reserve" + } + t.Run(name, func(t *testing.T) { + db := setUpTabletServerTest(t) + db.AddQueryPattern(".*", &sqltypes.Result{}) + defer db.Close() + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + + var txID, connID int64 + + switch { + case test.begin && test.reserve: + _, txID, connID, _, err = tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 1212"}, nil, &querypb.ExecuteOptions{}) + require.NotEqual(t, int64(0), txID) + require.NotEqual(t, int64(0), connID) + case test.begin: + _, txID, _, err = tsv.BeginExecute(ctx, &target, "select 42", nil, &querypb.ExecuteOptions{}) + require.NotEqual(t, int64(0), txID) + case test.reserve: + _, connID, _, err = tsv.ReserveExecute(ctx, &target, "select 42", nil, nil, 0, &querypb.ExecuteOptions{}) + require.NotEqual(t, int64(0), connID) + } + require.NoError(t, err) + + db.ResetQueryLog() + + err = tsv.Release(ctx, &target, connID, txID) + if test.err { + require.Error(t, err) + } else { + require.NoError(t, err) + } + assert.Contains(t, db.QueryLog(), strings.Join(test.expectedQueries, ";"), "expected queries to run") + }) + } +} + func setUpTabletServerTest(t *testing.T) *fakesqldb.DB { db := fakesqldb.New(t) for query, result := range getSupportedQueries() { From 26d2ffaff27bf03a8fa7a6b9f4a21c3bc66538f7 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 15 Jun 2020 16:44:02 +0200 Subject: [PATCH 107/430] reserve-conn: Add ReserveExecute to the QueryService interface Signed-off-by: Andres Taylor --- go/vt/vtcombo/tablet_map.go | 6 ++++ go/vt/vttablet/grpctabletconn/conn.go | 31 +++++++++++++++++++ go/vt/vttablet/queryservice/queryservice.go | 1 + go/vt/vttablet/queryservice/wrapped.go | 13 ++++++++ go/vt/vttablet/sandboxconn/sandboxconn.go | 5 +++ .../tabletconntest/fakequeryservice.go | 5 +++ 6 files changed, 61 insertions(+) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index a5b59f5ab18..25d2f19fe39 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -482,6 +482,12 @@ func (itc *internalTabletConn) ReserveBeginExecute(ctx context.Context, target * return res, txID, reservedID, alias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } +//ReserveBeginExecute is part of the QueryService interface. +func (itc *internalTabletConn) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + res, reservedID, alias, err := itc.tablet.qsc.QueryService().ReserveExecute(ctx, target, sql, preQueries, bindVariables, txID, options) + return res, reservedID, alias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +} + // Close is part of queryservice.QueryService func (itc *internalTabletConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index 289c3efd967..d0f47e300cd 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -759,6 +759,37 @@ func (conn *gRPCQueryClient) ReserveBeginExecute(ctx context.Context, target *qu return sqltypes.Proto3ToResult(reply.Result), reply.TransactionId, reply.ReservedId, conn.tablet.Alias, nil } +//ReserveBeginExecute implements the queryservice interface +func (conn *gRPCQueryClient) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + conn.mu.RLock() + defer conn.mu.RUnlock() + if conn.cc == nil { + return nil, 0, nil, tabletconn.ConnClosed + } + + req := &querypb.ReserveExecuteRequest{ + EffectiveCallerId: callerid.EffectiveCallerIDFromContext(ctx), + ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), + Target: target, + Query: &querypb.BoundQuery{ + Sql: sql, + BindVariables: bindVariables, + }, + TransactionId: txID, + Options: options, + PreQueries: preQueries, + } + reply, err := conn.c.ReserveExecute(ctx, req) + if err != nil { + return nil, 0, nil, tabletconn.ErrorFromGRPC(err) + } + if reply.Error != nil { + return nil, reply.ReservedId, conn.tablet.Alias, tabletconn.ErrorFromVTRPC(reply.Error) + } + + return sqltypes.Proto3ToResult(reply.Result), reply.ReservedId, conn.tablet.Alias, nil +} + // Close closes underlying gRPC channel. func (conn *gRPCQueryClient) Close(ctx context.Context) error { conn.mu.Lock() diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 88db7ada43c..9c8ab6458bf 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -112,6 +112,7 @@ type QueryService interface { HandlePanic(err *error) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) + ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) // Close must be called for releasing resources. Close(ctx context.Context) error diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 4ea9404ff4c..1cb5a6cd1df 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -281,6 +281,19 @@ func (ws *wrappedService) ReserveBeginExecute(ctx context.Context, target *query return res, txID, reservedID, alias, err } +func (ws *wrappedService) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + var res *sqltypes.Result + var reservedID int64 + var alias *topodatapb.TabletAlias + err := ws.wrapper(ctx, target, ws.impl, "ReserveExecute", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + var err error + res, reservedID, alias, err = conn.ReserveExecute(ctx, target, sql, preQueries, bindVariables, txID, options) + return canRetry(ctx, err), err + }) + + return res, reservedID, alias, err +} + func (ws *wrappedService) Close(ctx context.Context) error { return ws.wrapper(ctx, nil, ws.impl, "Close", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { // No point retrying Close. diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 3edbe6b3962..5aeaed7eadc 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -389,6 +389,11 @@ func (sbc *SandboxConn) ReserveBeginExecute(ctx context.Context, target *querypb panic("implement me") } +//ReserveExecute implements the QueryService interface +func (sbc *SandboxConn) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + panic("implement me") +} + // Close does not change ExecCount func (sbc *SandboxConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index c66bcdfd79f..9af4dd95f5f 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -725,6 +725,11 @@ func (f *FakeQueryService) ReserveBeginExecute(ctx context.Context, target *quer panic("implement me") } +//ReserveExecute implements the QueryService interface +func (f *FakeQueryService) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + panic("implement me") +} + // CreateFakeServer returns the fake server for the tests func CreateFakeServer(t *testing.T) *FakeQueryService { return &FakeQueryService{ From 6bb1df3689184ec3c481890db24e91d7f32fdf88 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 15 Jun 2020 19:20:21 +0200 Subject: [PATCH 108/430] Add reserved id to QueryService.Execute Signed-off-by: Andres Taylor --- go/vt/vtcombo/tablet_map.go | 4 +-- go/vt/vtexplain/vtexplain_vttablet.go | 6 ++-- go/vt/vttablet/grpctabletconn/conn.go | 7 ++-- .../fakes/stream_health_query_service.go | 2 +- go/vt/vttablet/queryservice/queryservice.go | 2 +- go/vt/vttablet/queryservice/wrapped.go | 6 ++-- go/vt/vttablet/sandboxconn/sandboxconn.go | 2 +- .../tabletconntest/fakequeryservice.go | 6 ++-- go/vt/vttablet/tabletserver/tabletserver.go | 36 +++++++++---------- 9 files changed, 37 insertions(+), 34 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 25d2f19fe39..16231f2331f 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -337,9 +337,9 @@ var _ queryservice.QueryService = (*internalTabletConn)(nil) // Execute is part of queryservice.QueryService // We need to copy the bind variables as tablet server will change them. -func (itc *internalTabletConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (itc *internalTabletConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { bindVars = sqltypes.CopyBindVariables(bindVars) - reply, err := itc.tablet.qsc.QueryService().Execute(ctx, target, query, bindVars, transactionID, options) + reply, err := itc.tablet.qsc.QueryService().Execute(ctx, target, query, bindVars, transactionID, connID, options) if err != nil { return nil, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index b8c16525ffd..3d1ffd7dde0 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -73,6 +73,8 @@ type explainTablet struct { currentTime int } +var _ queryservice.QueryService = (*explainTablet)(nil) + func newTablet(opts *Options, t *topodatapb.Tablet) *explainTablet { db := fakesqldb.New(nil) @@ -155,7 +157,7 @@ func (t *explainTablet) Rollback(ctx context.Context, target *querypb.Target, tr } // Execute is part of the QueryService interface. -func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { t.mu.Lock() t.currentTime = batchTime.Wait() @@ -169,7 +171,7 @@ func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql }) t.mu.Unlock() - return t.tsv.Execute(ctx, target, sql, bindVariables, transactionID, options) + return t.tsv.Execute(ctx, target, sql, bindVariables, txID, connID, options) } // Prepare is part of the QueryService interface. diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index d0f47e300cd..d11157c491c 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -91,7 +91,7 @@ func DialTablet(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (querys } // Execute sends the query to VTTablet. -func (conn *gRPCQueryClient) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (conn *gRPCQueryClient) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { @@ -99,15 +99,16 @@ func (conn *gRPCQueryClient) Execute(ctx context.Context, target *querypb.Target } req := &querypb.ExecuteRequest{ - Target: target, EffectiveCallerId: callerid.EffectiveCallerIDFromContext(ctx), ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), + Target: target, Query: &querypb.BoundQuery{ Sql: query, BindVariables: bindVars, }, - TransactionId: transactionID, + TransactionId: txID, Options: options, + ReservedId: connID, } er, err := conn.c.Execute(ctx, req) if err != nil { diff --git a/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go b/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go index f5e1f37abf4..392657f6d7f 100644 --- a/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go +++ b/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go @@ -63,7 +63,7 @@ func (q *StreamHealthQueryService) Begin(ctx context.Context, target *querypb.Ta } // Execute implemented as a no op -func (q *StreamHealthQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (q *StreamHealthQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { return &sqltypes.Result{}, nil } diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 9c8ab6458bf..87005bb4aaa 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -79,7 +79,7 @@ type QueryService interface { ReadTransaction(ctx context.Context, target *querypb.Target, dtid string) (metadata *querypb.TransactionMetadata, err error) // Query execution - Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) + Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) // Currently always called with transactionID = 0 StreamExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions, callback func(*sqltypes.Result) error) error // Currently always called with transactionID = 0 diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 1cb5a6cd1df..c08922fa3f0 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -165,11 +165,11 @@ func (ws *wrappedService) ReadTransaction(ctx context.Context, target *querypb.T return metadata, err } -func (ws *wrappedService) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, err error) { - inTransaction := (transactionID != 0) +func (ws *wrappedService) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, err error) { + inTransaction := txID != 0 err = ws.wrapper(ctx, target, ws.impl, "Execute", inTransaction, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error - qr, innerErr = conn.Execute(ctx, target, query, bindVars, transactionID, options) + qr, innerErr = conn.Execute(ctx, target, query, bindVars, txID, connID, options) // You cannot retry if you're in a transaction. retryable := canRetry(ctx, innerErr) && (!inTransaction) return retryable, innerErr diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 5aeaed7eadc..77c4f987625 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -122,7 +122,7 @@ func (sbc *SandboxConn) SetResults(r []*sqltypes.Result) { } // Execute is part of the QueryService interface. -func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { sbc.ExecCount.Add(1) bv := make(map[string]*querypb.BindVariable) for k, v := range bindVars { diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index 9af4dd95f5f..50a737a1f03 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -395,7 +395,7 @@ var ExecuteQueryResult = sqltypes.Result{ } // Execute is part of the queryservice.QueryService interface -func (f *FakeQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (f *FakeQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { if f.HasError { return nil, f.TabletError } @@ -412,8 +412,8 @@ func (f *FakeQueryService) Execute(ctx context.Context, target *querypb.Target, f.t.Errorf("invalid Execute.ExecuteOptions: got %v expected %v", options, TestExecuteOptions) } f.checkTargetCallerID(ctx, "Execute", target) - if transactionID != f.ExpectedTransactionID { - f.t.Errorf("invalid Execute.TransactionId: got %v expected %v", transactionID, f.ExpectedTransactionID) + if txID != f.ExpectedTransactionID { + f.t.Errorf("invalid Execute.TransactionId: got %v expected %v", txID, f.ExpectedTransactionID) } return &ExecuteQueryResult, nil } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 2d1b85135ae..a1da60e712e 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -957,12 +957,12 @@ func (tsv *TabletServer) ReadTransaction(ctx context.Context, target *querypb.Ta } // Execute executes the query and returns the result as response. -func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (result *sqltypes.Result, err error) { +func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (result *sqltypes.Result, err error) { span, ctx := trace.NewSpan(ctx, "TabletServer.Execute") trace.AnnotateSQL(span, sql) defer span.Finish() - allowOnShutdown := transactionID != 0 + allowOnShutdown := txID != 0 err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "Execute", sql, bindVariables, @@ -1020,7 +1020,7 @@ func (tsv *TabletServer) StreamExecute(ctx context.Context, target *querypb.Targ query: query, marginComments: comments, bindVars: bindVariables, - connID: transactionID, + connID: txID, options: options, plan: plan, ctx: ctx, @@ -1036,14 +1036,14 @@ func (tsv *TabletServer) StreamExecute(ctx context.Context, target *querypb.Targ // ExecuteBatch can be called for an existing transaction, or it can be called with // the AsTransaction flag which will execute all statements inside an independent // transaction. If AsTransaction is true, TransactionId must be 0. -func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Target, queries []*querypb.BoundQuery, asTransaction bool, transactionID int64, options *querypb.ExecuteOptions) (results []sqltypes.Result, err error) { +func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Target, queries []*querypb.BoundQuery, asTransaction bool, txID int64, options *querypb.ExecuteOptions) (results []sqltypes.Result, err error) { span, ctx := trace.NewSpan(ctx, "TabletServer.ExecuteBatch") defer span.Finish() if len(queries) == 0 { return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Empty query list") } - if asTransaction && transactionID != 0 { + if asTransaction && txID != 0 { return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "cannot start a new transaction in the scope of an existing one") } @@ -1062,7 +1062,7 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe } } - allowOnShutdown := transactionID != 0 + allowOnShutdown := txID != 0 // TODO(sougou): Convert startRequest/endRequest pattern to use wrapper // function tsv.execRequest() instead. // Note that below we always return "err" right away and do not call @@ -1092,32 +1092,32 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe if asTransaction { // We ignore the return alias because this transaction only exists in the scope of this call - transactionID, _, err = tsv.Begin(ctx, target, options) + txID, _, err = tsv.Begin(ctx, target, options) if err != nil { return nil, err } // If transaction was not committed by the end, it means // that there was an error, roll it back. defer func() { - if transactionID != 0 { - tsv.Rollback(ctx, target, transactionID) + if txID != 0 { + tsv.Rollback(ctx, target, txID) } }() } results = make([]sqltypes.Result, 0, len(queries)) for _, bound := range queries { - localReply, err := tsv.Execute(ctx, target, bound.Sql, bound.BindVariables, transactionID, options) + localReply, err := tsv.Execute(ctx, target, bound.Sql, bound.BindVariables, txID, 0, options) // TODO (systay) should we accept connID as a param? if err != nil { return nil, err } results = append(results, *localReply) } if asTransaction { - if err = tsv.Commit(ctx, target, transactionID); err != nil { - transactionID = 0 + if err = tsv.Commit(ctx, target, txID); err != nil { + txID = 0 return nil, err } - transactionID = 0 + txID = 0 } return results, nil } @@ -1139,7 +1139,7 @@ func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Targe return nil, 0, nil, err } - result, err := tsv.Execute(ctx, target, sql, bindVariables, transactionID, options) + result, err := tsv.Execute(ctx, target, sql, bindVariables, transactionID, 0, options) return result, transactionID, alias, err } @@ -1313,7 +1313,7 @@ func (tsv *TabletServer) execDML(ctx context.Context, target *querypb.Target, qu tsv.Rollback(ctx, target, transactionID) } }() - qr, err := tsv.Execute(ctx, target, query, bv, transactionID, nil) + qr, err := tsv.Execute(ctx, target, query, bv, transactionID, 0, nil) if err != nil { return 0, err } @@ -1365,7 +1365,7 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), - "ReserveBegin", "begin", nil, + "ReserveBegin", "begin", bindVariables, target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { defer tsv.stats.QueryTimings.Record("ReserveBegin", time.Now()) @@ -1382,7 +1382,7 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp return nil, 0, 0, nil, err } - result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) + result, err := tsv.Execute(ctx, target, sql, bindVariables, txID, connID, options) return result, connID, connID, &tsv.alias, err } @@ -1393,7 +1393,7 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), - "Reserve", "", nil, + "Reserve", "", bindVariables, target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { defer tsv.stats.QueryTimings.Record("Reserve", time.Now()) From 40b63a357409872e65db85771700357e97f4f1b0 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 16 Jun 2020 16:49:56 +0530 Subject: [PATCH 109/430] reserve-conn: added reserveID to BeginExecute and Execute Signed-off-by: Harshit Gangal --- go/vt/vtcombo/tablet_map.go | 8 +-- go/vt/vtctl/query.go | 2 +- go/vt/vterrors/aggregate.go | 16 +++++ go/vt/vtexplain/vtexplain_vttablet.go | 8 +-- go/vt/vtgate/discoverygateway_test.go | 6 +- go/vt/vtgate/scatter_conn.go | 8 +-- go/vt/vttablet/endtoend/framework/client.go | 3 + go/vt/vttablet/grpcqueryservice/server.go | 4 +- go/vt/vttablet/grpctabletconn/conn.go | 11 ++-- .../fakes/stream_health_query_service.go | 2 +- go/vt/vttablet/queryservice/queryservice.go | 6 +- go/vt/vttablet/queryservice/wrapped.go | 10 ++-- go/vt/vttablet/sandboxconn/sandboxconn.go | 6 +- .../tabletconntest/fakequeryservice.go | 13 ++-- .../vttablet/tabletconntest/tabletconntest.go | 14 ++--- go/vt/vttablet/tabletserver/bench_test.go | 4 +- go/vt/vttablet/tabletserver/tabletserver.go | 18 ++++-- .../tabletserver/tabletserver_test.go | 60 +++++++++---------- .../vttablet/tabletserver/tx_executor_test.go | 2 +- go/vtbench/client.go | 2 +- 20 files changed, 116 insertions(+), 87 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 16231f2331f..fd850bdab00 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -337,9 +337,9 @@ var _ queryservice.QueryService = (*internalTabletConn)(nil) // Execute is part of queryservice.QueryService // We need to copy the bind variables as tablet server will change them. -func (itc *internalTabletConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (itc *internalTabletConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { bindVars = sqltypes.CopyBindVariables(bindVars) - reply, err := itc.tablet.qsc.QueryService().Execute(ctx, target, query, bindVars, transactionID, connID, options) + reply, err := itc.tablet.qsc.QueryService().Execute(ctx, target, query, bindVars, transactionID, reservedID, options) if err != nil { return nil, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } @@ -441,12 +441,12 @@ func (itc *internalTabletConn) ReadTransaction(ctx context.Context, target *quer } // BeginExecute is part of queryservice.QueryService -func (itc *internalTabletConn) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (itc *internalTabletConn) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { transactionID, alias, err := itc.Begin(ctx, target, options) if err != nil { return nil, 0, nil, err } - result, err := itc.Execute(ctx, target, query, bindVars, transactionID, options) + result, err := itc.Execute(ctx, target, query, bindVars, transactionID, reservedID, options) return result, transactionID, alias, err } diff --git a/go/vt/vtctl/query.go b/go/vt/vtctl/query.go index b30b6ab83a7..25fe88eae43 100644 --- a/go/vt/vtctl/query.go +++ b/go/vt/vtctl/query.go @@ -232,7 +232,7 @@ func commandVtTabletExecute(ctx context.Context, wr *wrangler.Wrangler, subFlags Keyspace: tabletInfo.Tablet.Keyspace, Shard: tabletInfo.Tablet.Shard, TabletType: tabletInfo.Tablet.Type, - }, subFlags.Arg(1), bindVars, int64(*transactionID), executeOptions) + }, subFlags.Arg(1), bindVars, int64(*transactionID), 0, executeOptions) if err != nil { return fmt.Errorf("execute failed: %v", err) } diff --git a/go/vt/vterrors/aggregate.go b/go/vt/vterrors/aggregate.go index 232d778908b..8ac4b4626d1 100644 --- a/go/vt/vterrors/aggregate.go +++ b/go/vt/vterrors/aggregate.go @@ -80,12 +80,25 @@ func Aggregate(errors []error) error { if len(errors) == 0 { return nil } + found := false + for _, e := range errors { + if e == nil { // e can be nil when we are collecting errors across shards and some shards have no error + continue + } + found = true + } + if !found { + return nil + } return New(aggregateCodes(errors), aggregateErrors(errors)) } func aggregateCodes(errors []error) vtrpcpb.Code { highCode := vtrpcpb.Code_OK for _, e := range errors { + if e == nil { // e can be nil when we are collecting errors across shards and some shards have no error + continue + } code := Code(e) if errorPriorities[code] > errorPriorities[highCode] { highCode = code @@ -98,6 +111,9 @@ func aggregateCodes(errors []error) vtrpcpb.Code { func aggregateErrors(errs []error) string { errStrs := make([]string, 0, len(errs)) for _, e := range errs { + if e == nil { // e can be nil when we are collecting errors across shards and some shards have no error + continue + } errStrs = append(errStrs, e.Error()) } // sort the error strings so we always have deterministic ordering diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 3d1ffd7dde0..926bd756ea9 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -157,7 +157,7 @@ func (t *explainTablet) Rollback(ctx context.Context, target *querypb.Target, tr } // Execute is part of the QueryService interface. -func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { t.mu.Lock() t.currentTime = batchTime.Wait() @@ -171,7 +171,7 @@ func (t *explainTablet) Execute(ctx context.Context, target *querypb.Target, sql }) t.mu.Unlock() - return t.tsv.Execute(ctx, target, sql, bindVariables, txID, connID, options) + return t.tsv.Execute(ctx, target, sql, bindVariables, transactionID, reservedID, options) } // Prepare is part of the QueryService interface. @@ -251,7 +251,7 @@ func (t *explainTablet) ExecuteBatch(ctx context.Context, target *querypb.Target } // BeginExecute is part of the QueryService interface. -func (t *explainTablet) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (t *explainTablet) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { t.mu.Lock() t.currentTime = batchTime.Wait() bindVariables = sqltypes.CopyBindVariables(bindVariables) @@ -262,7 +262,7 @@ func (t *explainTablet) BeginExecute(ctx context.Context, target *querypb.Target }) t.mu.Unlock() - return t.tsv.BeginExecute(ctx, target, sql, bindVariables, options) + return t.tsv.BeginExecute(ctx, target, sql, bindVariables, reservedID, options) } // Close is part of the QueryService interface. diff --git a/go/vt/vtgate/discoverygateway_test.go b/go/vt/vtgate/discoverygateway_test.go index 678e580350f..f17d4a019e5 100644 --- a/go/vt/vtgate/discoverygateway_test.go +++ b/go/vt/vtgate/discoverygateway_test.go @@ -40,11 +40,11 @@ import ( func TestDiscoveryGatewayExecute(t *testing.T) { testDiscoveryGatewayGeneric(t, func(dg *DiscoveryGateway, target *querypb.Target) error { - _, err := dg.Execute(context.Background(), target, "query", nil, 0, nil) + _, err := dg.Execute(context.Background(), target, "query", nil, 0, 0, nil) return err }) testDiscoveryGatewayTransact(t, func(dg *DiscoveryGateway, target *querypb.Target) error { - _, err := dg.Execute(context.Background(), target, "query", nil, 1, nil) + _, err := dg.Execute(context.Background(), target, "query", nil, 1, 0, nil) return err }) } @@ -92,7 +92,7 @@ func TestDiscoveryGatewayRollback(t *testing.T) { func TestDiscoveryGatewayBeginExecute(t *testing.T) { testDiscoveryGatewayGeneric(t, func(dg *DiscoveryGateway, target *querypb.Target) error { - _, _, _, err := dg.BeginExecute(context.Background(), target, "query", nil, nil) + _, _, _, err := dg.BeginExecute(context.Background(), target, "query", nil, 0, nil) return err }) } diff --git a/go/vt/vtgate/scatter_conn.go b/go/vt/vtgate/scatter_conn.go index 4ece8d648fb..1f60017ba86 100644 --- a/go/vt/vtgate/scatter_conn.go +++ b/go/vt/vtgate/scatter_conn.go @@ -170,7 +170,7 @@ func (stc *ScatterConn) Execute( case autocommit: innerqr, err = stc.executeAutocommit(ctx, rs, query, bindVars, opts) case shouldBegin: - innerqr, transactionID, alias, err = rs.Gateway.BeginExecute(ctx, rs.Target, query, bindVars, options) + innerqr, transactionID, alias, err = rs.Gateway.BeginExecute(ctx, rs.Target, query, bindVars, 0, options) default: var qs queryservice.QueryService _, usingLegacy := rs.Gateway.(*DiscoveryGateway) @@ -184,7 +184,7 @@ func (stc *ScatterConn) Execute( qs, err = rs.Gateway.QueryServiceByAlias(alias) } if err == nil { - innerqr, err = qs.Execute(ctx, rs.Target, query, bindVars, transactionID, options) + innerqr, err = qs.Execute(ctx, rs.Target, query, bindVars, transactionID, 0, options) } } if err != nil { @@ -248,7 +248,7 @@ func (stc *ScatterConn) ExecuteMultiShard( // tansactionID and alias are not used by this call, it is one round trip innerqr, err = stc.executeAutocommit(ctx, rs, queries[i].Sql, queries[i].BindVariables, opts) case shouldBegin: - innerqr, transactionID, alias, err = rs.Gateway.BeginExecute(ctx, rs.Target, queries[i].Sql, queries[i].BindVariables, opts) + innerqr, transactionID, alias, err = rs.Gateway.BeginExecute(ctx, rs.Target, queries[i].Sql, queries[i].BindVariables, 0, opts) default: var qs queryservice.QueryService _, usingLegacy := rs.Gateway.(*DiscoveryGateway) @@ -258,7 +258,7 @@ func (stc *ScatterConn) ExecuteMultiShard( qs, err = rs.Gateway.QueryServiceByAlias(alias) } if err == nil { - innerqr, err = qs.Execute(ctx, rs.Target, queries[i].Sql, queries[i].BindVariables, transactionID, opts) + innerqr, err = qs.Execute(ctx, rs.Target, queries[i].Sql, queries[i].BindVariables, transactionID, 0, opts) } } if err != nil { diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index a1c3021b6fe..2ff65451e25 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -169,6 +169,7 @@ func (client *QueryClient) BeginExecute(query string, bindvars map[string]*query &client.target, query, bindvars, + 0, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, ) if err != nil { @@ -186,6 +187,8 @@ func (client *QueryClient) ExecuteWithOptions(query string, bindvars map[string] query, bindvars, client.transactionID, + // TODO: client needs a reservedID field to write tests + 0, options, ) } diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index 1fad3da87cd..fc52aa85ba5 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -47,7 +47,7 @@ func (q *query) Execute(ctx context.Context, request *querypb.ExecuteRequest) (r request.EffectiveCallerId, request.ImmediateCallerId, ) - result, err := q.server.Execute(ctx, request.Target, request.Query.Sql, request.Query.BindVariables, request.TransactionId, request.Options) + result, err := q.server.Execute(ctx, request.Target, request.Query.Sql, request.Query.BindVariables, request.TransactionId, request.ReservedId, request.Options) if err != nil { return nil, vterrors.ToGRPC(err) } @@ -252,7 +252,7 @@ func (q *query) BeginExecute(ctx context.Context, request *querypb.BeginExecuteR request.EffectiveCallerId, request.ImmediateCallerId, ) - result, transactionID, alias, err := q.server.BeginExecute(ctx, request.Target, request.Query.Sql, request.Query.BindVariables, request.Options) + result, transactionID, alias, err := q.server.BeginExecute(ctx, request.Target, request.Query.Sql, request.Query.BindVariables, request.ReservedId, request.Options) if err != nil { // if we have a valid transactionID, return the error in-band if transactionID != 0 { diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index d11157c491c..01ea659d309 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -91,7 +91,7 @@ func DialTablet(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (querys } // Execute sends the query to VTTablet. -func (conn *gRPCQueryClient) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (conn *gRPCQueryClient) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { @@ -106,9 +106,9 @@ func (conn *gRPCQueryClient) Execute(ctx context.Context, target *querypb.Target Sql: query, BindVariables: bindVars, }, - TransactionId: txID, + TransactionId: transactionID, Options: options, - ReservedId: connID, + ReservedId: reservedID, } er, err := conn.c.Execute(ctx, req) if err != nil { @@ -443,7 +443,7 @@ func (conn *gRPCQueryClient) ReadTransaction(ctx context.Context, target *queryp } // BeginExecute starts a transaction and runs an Execute. -func (conn *gRPCQueryClient) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (result *sqltypes.Result, transactionID int64, alias *topodatapb.TabletAlias, err error) { +func (conn *gRPCQueryClient) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (result *sqltypes.Result, transactionID int64, alias *topodatapb.TabletAlias, err error) { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { @@ -458,7 +458,8 @@ func (conn *gRPCQueryClient) BeginExecute(ctx context.Context, target *querypb.T Sql: query, BindVariables: bindVars, }, - Options: options, + ReservedId: reservedID, + Options: options, } reply, err := conn.c.BeginExecute(ctx, req) if err != nil { diff --git a/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go b/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go index 392657f6d7f..0a280c0c322 100644 --- a/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go +++ b/go/vt/vttablet/queryservice/fakes/stream_health_query_service.go @@ -63,7 +63,7 @@ func (q *StreamHealthQueryService) Begin(ctx context.Context, target *querypb.Ta } // Execute implemented as a no op -func (q *StreamHealthQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (q *StreamHealthQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { return &sqltypes.Result{}, nil } diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 87005bb4aaa..f5dd175280f 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -79,7 +79,7 @@ type QueryService interface { ReadTransaction(ctx context.Context, target *querypb.Target, dtid string) (metadata *querypb.TransactionMetadata, err error) // Query execution - Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) + Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) // Currently always called with transactionID = 0 StreamExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions, callback func(*sqltypes.Result) error) error // Currently always called with transactionID = 0 @@ -89,7 +89,7 @@ type QueryService interface { // Begin part. If err != nil, the transactionID may still be // non-zero, and needs to be propagated back (like for a DB // Integrity Error) - BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) + BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) BeginExecuteBatch(ctx context.Context, target *querypb.Target, queries []*querypb.BoundQuery, asTransaction bool, options *querypb.ExecuteOptions) ([]sqltypes.Result, int64, *topodatapb.TabletAlias, error) // Messaging methods. @@ -112,7 +112,7 @@ type QueryService interface { HandlePanic(err *error) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) - ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) + ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) // Close must be called for releasing resources. Close(ctx context.Context) error diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index c08922fa3f0..c762199a367 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -165,11 +165,11 @@ func (ws *wrappedService) ReadTransaction(ctx context.Context, target *querypb.T return metadata, err } -func (ws *wrappedService) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, err error) { - inTransaction := txID != 0 +func (ws *wrappedService) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, err error) { + inTransaction := transactionID != 0 err = ws.wrapper(ctx, target, ws.impl, "Execute", inTransaction, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error - qr, innerErr = conn.Execute(ctx, target, query, bindVars, txID, connID, options) + qr, innerErr = conn.Execute(ctx, target, query, bindVars, transactionID, reservedID, options) // You cannot retry if you're in a transaction. retryable := canRetry(ctx, innerErr) && (!inTransaction) return retryable, innerErr @@ -202,10 +202,10 @@ func (ws *wrappedService) ExecuteBatch(ctx context.Context, target *querypb.Targ return qrs, err } -func (ws *wrappedService) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (qr *sqltypes.Result, transactionID int64, alias *topodatapb.TabletAlias, err error) { +func (ws *wrappedService) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, transactionID int64, alias *topodatapb.TabletAlias, err error) { err = ws.wrapper(ctx, target, ws.impl, "BeginExecute", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error - qr, transactionID, alias, innerErr = conn.BeginExecute(ctx, target, query, bindVars, options) + qr, transactionID, alias, innerErr = conn.BeginExecute(ctx, target, query, bindVars, reservedID, options) return canRetry(ctx, innerErr), innerErr }) return qr, transactionID, alias, err diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 77c4f987625..1a5b232a2b7 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -122,7 +122,7 @@ func (sbc *SandboxConn) SetResults(r []*sqltypes.Result) { } // Execute is part of the QueryService interface. -func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { sbc.ExecCount.Add(1) bv := make(map[string]*querypb.BindVariable) for k, v := range bindVars { @@ -286,12 +286,12 @@ func (sbc *SandboxConn) ReadTransaction(ctx context.Context, target *querypb.Tar } // BeginExecute is part of the QueryService interface. -func (sbc *SandboxConn) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (sbc *SandboxConn) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { transactionID, alias, err := sbc.Begin(ctx, target, options) if err != nil { return nil, 0, nil, err } - result, err := sbc.Execute(ctx, target, query, bindVars, transactionID, options) + result, err := sbc.Execute(ctx, target, query, bindVars, transactionID, reservedID, options) return result, transactionID, alias, err } diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index 50a737a1f03..0e2ce4123e6 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -368,6 +368,9 @@ var ExecuteBindVars = map[string]*querypb.BindVariable{ // ExecuteTransactionID is a test transaction id. const ExecuteTransactionID int64 = 678 +// ReserveConnectionID is a test reserved connection id. +const ReserveConnectionID int64 = 933 + // ExecuteQueryResult is a test query result. var ExecuteQueryResult = sqltypes.Result{ Fields: []*querypb.Field{ @@ -395,7 +398,7 @@ var ExecuteQueryResult = sqltypes.Result{ } // Execute is part of the queryservice.QueryService interface -func (f *FakeQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { +func (f *FakeQueryService) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { if f.HasError { return nil, f.TabletError } @@ -412,8 +415,8 @@ func (f *FakeQueryService) Execute(ctx context.Context, target *querypb.Target, f.t.Errorf("invalid Execute.ExecuteOptions: got %v expected %v", options, TestExecuteOptions) } f.checkTargetCallerID(ctx, "Execute", target) - if txID != f.ExpectedTransactionID { - f.t.Errorf("invalid Execute.TransactionId: got %v expected %v", txID, f.ExpectedTransactionID) + if transactionID != f.ExpectedTransactionID { + f.t.Errorf("invalid Execute.TransactionId: got %v expected %v", transactionID, f.ExpectedTransactionID) } return &ExecuteQueryResult, nil } @@ -577,14 +580,14 @@ func (f *FakeQueryService) ExecuteBatch(ctx context.Context, target *querypb.Tar } // BeginExecute combines Begin and Execute. -func (f *FakeQueryService) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (f *FakeQueryService) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { transactionID, _, err := f.Begin(ctx, target, options) if err != nil { return nil, 0, nil, err } // TODO(deepthi): what alias should we actually return here? - result, err := f.Execute(ctx, target, sql, bindVariables, transactionID, options) + result, err := f.Execute(ctx, target, sql, bindVariables, transactionID, reservedID, options) return result, transactionID, nil, err } diff --git a/go/vt/vttablet/tabletconntest/tabletconntest.go b/go/vt/vttablet/tabletconntest/tabletconntest.go index 80a01603cd0..5ff8ce9b34b 100644 --- a/go/vt/vttablet/tabletconntest/tabletconntest.go +++ b/go/vt/vttablet/tabletconntest/tabletconntest.go @@ -398,7 +398,7 @@ func testExecute(t *testing.T, conn queryservice.QueryService, f *FakeQueryServi f.ExpectedTransactionID = ExecuteTransactionID ctx := context.Background() ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) - qr, err := conn.Execute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ExecuteTransactionID, TestExecuteOptions) + qr, err := conn.Execute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ExecuteTransactionID, ReserveConnectionID, TestExecuteOptions) if err != nil { t.Fatalf("Execute failed: %v", err) } @@ -411,7 +411,7 @@ func testExecuteError(t *testing.T, conn queryservice.QueryService, f *FakeQuery t.Log("testExecuteError") f.HasError = true testErrorHelper(t, f, "Execute", func(ctx context.Context) error { - _, err := conn.Execute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ExecuteTransactionID, TestExecuteOptions) + _, err := conn.Execute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ExecuteTransactionID, ReserveConnectionID, TestExecuteOptions) return err }) f.HasError = false @@ -420,7 +420,7 @@ func testExecuteError(t *testing.T, conn queryservice.QueryService, f *FakeQuery func testExecutePanics(t *testing.T, conn queryservice.QueryService, f *FakeQueryService) { t.Log("testExecutePanics") testPanicHelper(t, f, "Execute", func(ctx context.Context) error { - _, err := conn.Execute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ExecuteTransactionID, TestExecuteOptions) + _, err := conn.Execute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ExecuteTransactionID, ReserveConnectionID, TestExecuteOptions) return err }) } @@ -430,7 +430,7 @@ func testBeginExecute(t *testing.T, conn queryservice.QueryService, f *FakeQuery f.ExpectedTransactionID = beginTransactionID ctx := context.Background() ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) - qr, transactionID, alias, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, TestExecuteOptions) + qr, transactionID, alias, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ReserveConnectionID, TestExecuteOptions) if err != nil { t.Fatalf("BeginExecute failed: %v", err) } @@ -447,7 +447,7 @@ func testBeginExecuteErrorInBegin(t *testing.T, conn queryservice.QueryService, t.Log("testBeginExecuteErrorInBegin") f.HasBeginError = true testErrorHelper(t, f, "BeginExecute.Begin", func(ctx context.Context) error { - _, transactionID, _, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, TestExecuteOptions) + _, transactionID, _, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ReserveConnectionID, TestExecuteOptions) if transactionID != 0 { t.Errorf("Unexpected transactionID from BeginExecute: got %v wanted 0", transactionID) } @@ -461,7 +461,7 @@ func testBeginExecuteErrorInExecute(t *testing.T, conn queryservice.QueryService f.HasError = true testErrorHelper(t, f, "BeginExecute.Execute", func(ctx context.Context) error { ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) - _, transactionID, _, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, TestExecuteOptions) + _, transactionID, _, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ReserveConnectionID, TestExecuteOptions) if transactionID != beginTransactionID { t.Errorf("Unexpected transactionID from BeginExecute: got %v wanted %v", transactionID, beginTransactionID) } @@ -473,7 +473,7 @@ func testBeginExecuteErrorInExecute(t *testing.T, conn queryservice.QueryService func testBeginExecutePanics(t *testing.T, conn queryservice.QueryService, f *FakeQueryService) { t.Log("testBeginExecutePanics") testPanicHelper(t, f, "BeginExecute", func(ctx context.Context) error { - _, _, _, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, TestExecuteOptions) + _, _, _, err := conn.BeginExecute(ctx, TestTarget, ExecuteQuery, ExecuteBindVars, ReserveConnectionID, TestExecuteOptions) return err }) } diff --git a/go/vt/vttablet/tabletserver/bench_test.go b/go/vt/vttablet/tabletserver/bench_test.go index 496b70230ab..c757454db45 100644 --- a/go/vt/vttablet/tabletserver/bench_test.go +++ b/go/vt/vttablet/tabletserver/bench_test.go @@ -77,7 +77,7 @@ func BenchmarkExecuteVarBinary(b *testing.B) { db.AllowAll = true for i := 0; i < b.N; i++ { - if _, err := tsv.Execute(context.Background(), &target, benchQuery, bv, 0, nil); err != nil { + if _, err := tsv.Execute(context.Background(), &target, benchQuery, bv, 0, 0, nil); err != nil { panic(err) } } @@ -107,7 +107,7 @@ func BenchmarkExecuteExpression(b *testing.B) { db.AllowAll = true for i := 0; i < b.N; i++ { - if _, err := tsv.Execute(context.Background(), &target, benchQuery, bv, 0, nil); err != nil { + if _, err := tsv.Execute(context.Background(), &target, benchQuery, bv, 0, 0, nil); err != nil { panic(err) } } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index a1da60e712e..1ae2736ae8f 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -665,6 +665,7 @@ func (tsv *TabletServer) IsHealthy() error { "/* health */ select 1 from dual", nil, 0, + 0, nil, ) return err @@ -957,12 +958,12 @@ func (tsv *TabletServer) ReadTransaction(ctx context.Context, target *querypb.Ta } // Execute executes the query and returns the result as response. -func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, txID, connID int64, options *querypb.ExecuteOptions) (result *sqltypes.Result, err error) { +func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (result *sqltypes.Result, err error) { span, ctx := trace.NewSpan(ctx, "TabletServer.Execute") trace.AnnotateSQL(span, sql) defer span.Finish() - allowOnShutdown := txID != 0 + allowOnShutdown := transactionID != 0 err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "Execute", sql, bindVariables, @@ -1123,7 +1124,9 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe } // BeginExecute combines Begin and Execute. -func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + + // TODO: if reservedID != 0, then skip hotrow protection if tsv.enableHotRowProtection { txDone, err := tsv.beginWaitForSameRangeTransactions(ctx, target, options, sql, bindVariables) if err != nil { @@ -1134,12 +1137,15 @@ func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Targe } } + // TODO: tsv.Begin creates a new connection, that's a big no-no if we already have a reservedID + // Begin needs to take a reservedID and start a transaction on that connection if it exists + // if reservedID is 0, then create a new connection as before transactionID, alias, err := tsv.Begin(ctx, target, options) if err != nil { return nil, 0, nil, err } - result, err := tsv.Execute(ctx, target, sql, bindVariables, transactionID, 0, options) + result, err := tsv.Execute(ctx, target, sql, bindVariables, transactionID, reservedID, options) return result, transactionID, alias, err } @@ -1382,7 +1388,7 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp return nil, 0, 0, nil, err } - result, err := tsv.Execute(ctx, target, sql, bindVariables, txID, connID, options) + result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, connID, options) return result, connID, connID, &tsv.alias, err } @@ -1410,7 +1416,7 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar return nil, 0, nil, err } - result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, options) + result, err := tsv.Execute(ctx, target, sql, bindVariables, connID, connID, options) return result, connID, &tsv.alias, err } diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 81bee437fb3..1d34e196cc6 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -344,12 +344,12 @@ func TestTabletServerReconnect(t *testing.T) { if err != nil { t.Fatalf("TabletServer.StartService should success but get error: %v", err) } - _, err = tsv.Execute(context.Background(), &target, query, nil, 0, nil) + _, err = tsv.Execute(context.Background(), &target, query, nil, 0, 0, nil) require.NoError(t, err) // make mysql conn fail db.Close() - _, err = tsv.Execute(context.Background(), &target, query, nil, 0, nil) + _, err = tsv.Execute(context.Background(), &target, query, nil, 0, 0, nil) if err == nil { t.Error("Execute: want error, got nil") } @@ -365,7 +365,7 @@ func TestTabletServerReconnect(t *testing.T) { dbcfgs = newDBConfigs(db) err = tsv.StartService(target, dbcfgs) require.NoError(t, err) - _, err = tsv.Execute(context.Background(), &target, query, nil, 0, nil) + _, err = tsv.Execute(context.Background(), &target, query, nil, 0, 0, nil) require.NoError(t, err) } @@ -388,28 +388,28 @@ func TestTabletServerTarget(t *testing.T) { // query that works db.AddQuery("select * from test_table limit 1000", &sqltypes.Result{}) - _, err = tsv.Execute(ctx, &target1, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, &target1, "select * from test_table limit 1000", nil, 0, 0, nil) require.NoError(t, err) // wrong tablet type target2 := proto.Clone(&target1).(*querypb.Target) target2.TabletType = topodatapb.TabletType_REPLICA - _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, 0, nil) want := "invalid tablet type" require.Error(t, err) assert.Contains(t, err.Error(), want) // set expected target type to MASTER, but also accept REPLICA tsv.SetServingType(topodatapb.TabletType_MASTER, true, []topodatapb.TabletType{topodatapb.TabletType_REPLICA}) - _, err = tsv.Execute(ctx, &target1, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, &target1, "select * from test_table limit 1000", nil, 0, 0, nil) require.NoError(t, err) - _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, 0, nil) require.NoError(t, err) // wrong keyspace target2 = proto.Clone(&target1).(*querypb.Target) target2.Keyspace = "bad" - _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, 0, nil) want = "invalid keyspace bad" require.Error(t, err) assert.Contains(t, err.Error(), want) @@ -417,20 +417,20 @@ func TestTabletServerTarget(t *testing.T) { // wrong shard target2 = proto.Clone(&target1).(*querypb.Target) target2.Shard = "bad" - _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, target2, "select * from test_table limit 1000", nil, 0, 0, nil) want = "invalid shard bad" require.Error(t, err) assert.Contains(t, err.Error(), want) // no target - _, err = tsv.Execute(ctx, nil, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, nil, "select * from test_table limit 1000", nil, 0, 0, nil) want = "No target" require.Error(t, err) assert.Contains(t, err.Error(), want) // Disallow all if service is stopped. tsv.StopService() - _, err = tsv.Execute(ctx, &target1, "select * from test_table limit 1000", nil, 0, nil) + _, err = tsv.Execute(ctx, &target1, "select * from test_table limit 1000", nil, 0, 0, nil) want = "operation not allowed in state NOT_SERVING" require.Error(t, err) assert.Contains(t, err.Error(), want) @@ -478,7 +478,7 @@ func TestTabletServerMasterToReplica(t *testing.T) { txid1, _, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) - _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, txid1, nil) + _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, txid1, 0, nil) require.NoError(t, err) err = tsv.Prepare(ctx, &target, txid1, "aa") require.NoError(t, err) @@ -793,7 +793,7 @@ func TestTabletServerCommitTransaction(t *testing.T) { if err != nil { t.Fatalf("call TabletServer.Begin failed: %v", err) } - if _, err := tsv.Execute(ctx, &target, executeSQL, nil, transactionID, nil); err != nil { + if _, err := tsv.Execute(ctx, &target, executeSQL, nil, transactionID, 0, nil); err != nil { t.Fatalf("failed to execute query: %s: %s", executeSQL, err) } if err := tsv.Commit(ctx, &target, transactionID); err != nil { @@ -851,7 +851,7 @@ func TestTabletServerRollback(t *testing.T) { if err != nil { t.Fatalf("call TabletServer.Begin failed: %v", err) } - if _, err := tsv.Execute(ctx, &target, executeSQL, nil, transactionID, nil); err != nil { + if _, err := tsv.Execute(ctx, &target, executeSQL, nil, transactionID, 0, nil); err != nil { t.Fatalf("failed to execute query: %s: %v", executeSQL, err) } if err := tsv.Rollback(ctx, &target, transactionID); err != nil { @@ -867,7 +867,7 @@ func TestTabletServerPrepare(t *testing.T) { target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} transactionID, _, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) - _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, transactionID, nil) + _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, transactionID, 0, nil) require.NoError(t, err) defer tsv.RollbackPrepared(ctx, &target, "aa", 0) err = tsv.Prepare(ctx, &target, transactionID, "aa") @@ -882,7 +882,7 @@ func TestTabletServerCommitPrepared(t *testing.T) { target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} transactionID, _, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) - _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, transactionID, nil) + _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, transactionID, 0, nil) require.NoError(t, err) err = tsv.Prepare(ctx, &target, transactionID, "aa") require.NoError(t, err) @@ -899,7 +899,7 @@ func TestTabletServerRollbackPrepared(t *testing.T) { target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} transactionID, _, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) - _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, transactionID, nil) + _, err = tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, transactionID, 0, nil) require.NoError(t, err) err = tsv.Prepare(ctx, &target, transactionID, "aa") require.NoError(t, err) @@ -1279,7 +1279,7 @@ func TestSerializeTransactionsSameRow(t *testing.T) { go func() { defer wg.Done() - _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, nil) + _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } @@ -1294,7 +1294,7 @@ func TestSerializeTransactionsSameRow(t *testing.T) { defer wg.Done() <-tx1Started - _, tx2, _, err := tsv.BeginExecute(ctx, &target, q2, bvTx2, nil) + _, tx2, _, err := tsv.BeginExecute(ctx, &target, q2, bvTx2, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q2, err) } @@ -1314,7 +1314,7 @@ func TestSerializeTransactionsSameRow(t *testing.T) { defer wg.Done() <-tx1Started - _, tx3, _, err := tsv.BeginExecute(ctx, &target, q3, bvTx3, nil) + _, tx3, _, err := tsv.BeginExecute(ctx, &target, q3, bvTx3, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q3, err) } @@ -1351,7 +1351,7 @@ func TestDMLQueryWithoutWhereClause(t *testing.T) { db.AddQuery(q+" limit 10001", &sqltypes.Result{}) - _, txid, _, err := tsv.BeginExecute(ctx, &target, q, nil, nil) + _, txid, _, err := tsv.BeginExecute(ctx, &target, q, nil, 0, nil) require.NoError(t, err) err = tsv.Commit(ctx, &target, txid) require.NoError(t, err) @@ -1539,7 +1539,7 @@ func TestSerializeTransactionsSameRow_ConcurrentTransactions(t *testing.T) { go func() { defer wg.Done() - _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, nil) + _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } @@ -1558,7 +1558,7 @@ func TestSerializeTransactionsSameRow_ConcurrentTransactions(t *testing.T) { // In that case, we would see less than 3 pending transactions. <-tx1Started - _, tx2, _, err := tsv.BeginExecute(ctx, &target, q2, bvTx2, nil) + _, tx2, _, err := tsv.BeginExecute(ctx, &target, q2, bvTx2, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q2, err) } @@ -1577,7 +1577,7 @@ func TestSerializeTransactionsSameRow_ConcurrentTransactions(t *testing.T) { // In that case, we would see less than 3 pending transactions. <-tx1Started - _, tx3, _, err := tsv.BeginExecute(ctx, &target, q3, bvTx3, nil) + _, tx3, _, err := tsv.BeginExecute(ctx, &target, q3, bvTx3, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q3, err) } @@ -1675,7 +1675,7 @@ func TestSerializeTransactionsSameRow_TooManyPendingRequests(t *testing.T) { go func() { defer wg.Done() - _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, nil) + _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } @@ -1691,7 +1691,7 @@ func TestSerializeTransactionsSameRow_TooManyPendingRequests(t *testing.T) { defer close(tx2Failed) <-tx1Started - _, _, _, err := tsv.BeginExecute(ctx, &target, q2, bvTx2, nil) + _, _, _, err := tsv.BeginExecute(ctx, &target, q2, bvTx2, 0, nil) if err == nil || vterrors.Code(err) != vtrpcpb.Code_RESOURCE_EXHAUSTED || err.Error() != "hot row protection: too many queued transactions (1 >= 1) for the same row (table + WHERE clause: 'test_table where pk = 1 and name = 1')" { t.Errorf("tx2 should have failed because there are too many pending requests: %v", err) } @@ -1858,7 +1858,7 @@ func TestSerializeTransactionsSameRow_RequestCanceled(t *testing.T) { go func() { defer wg.Done() - _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, nil) + _, tx1, _, err := tsv.BeginExecute(ctx, &target, q1, bvTx1, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } @@ -1878,7 +1878,7 @@ func TestSerializeTransactionsSameRow_RequestCanceled(t *testing.T) { // Wait until tx1 has started to make the test deterministic. <-tx1Started - _, _, _, err := tsv.BeginExecute(ctxTx2, &target, q2, bvTx2, nil) + _, _, _, err := tsv.BeginExecute(ctxTx2, &target, q2, bvTx2, 0, nil) if err == nil || vterrors.Code(err) != vtrpcpb.Code_CANCELED || err.Error() != "context canceled" { t.Errorf("tx2 should have failed because the context was canceled: %v", err) } @@ -1895,7 +1895,7 @@ func TestSerializeTransactionsSameRow_RequestCanceled(t *testing.T) { t.Error(err) } - _, tx3, _, err := tsv.BeginExecute(ctx, &target, q3, bvTx3, nil) + _, tx3, _, err := tsv.BeginExecute(ctx, &target, q3, bvTx3, 0, nil) if err != nil { t.Errorf("failed to execute query: %s: %s", q3, err) } @@ -2497,7 +2497,7 @@ func TestRelease(t *testing.T) { require.NotEqual(t, int64(0), txID) require.NotEqual(t, int64(0), connID) case test.begin: - _, txID, _, err = tsv.BeginExecute(ctx, &target, "select 42", nil, &querypb.ExecuteOptions{}) + _, txID, _, err = tsv.BeginExecute(ctx, &target, "select 42", nil, 0, &querypb.ExecuteOptions{}) require.NotEqual(t, int64(0), txID) case test.reserve: _, connID, _, err = tsv.ReserveExecute(ctx, &target, "select 42", nil, nil, 0, &querypb.ExecuteOptions{}) diff --git a/go/vt/vttablet/tabletserver/tx_executor_test.go b/go/vt/vttablet/tabletserver/tx_executor_test.go index b8c2c02aa8c..efd3a9b8868 100644 --- a/go/vt/vttablet/tabletserver/tx_executor_test.go +++ b/go/vt/vttablet/tabletserver/tx_executor_test.go @@ -541,7 +541,7 @@ func newNoTwopcExecutor(t *testing.T) (txe *TxExecutor, tsv *TabletServer, db *f func newTxForPrep(tsv *TabletServer) int64 { txid := newTransaction(tsv, nil) target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} - _, err := tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, txid, nil) + _, err := tsv.Execute(ctx, &target, "update test_table set name = 2 where pk = 1", nil, txid, 0, nil) if err != nil { panic(err) } diff --git a/go/vtbench/client.go b/go/vtbench/client.go index dc29d3dc423..1bc36c78460 100644 --- a/go/vtbench/client.go +++ b/go/vtbench/client.go @@ -160,5 +160,5 @@ func (c *grpcVttabletConn) connect(ctx context.Context, cp ConnParams) error { } func (c *grpcVttabletConn) execute(ctx context.Context, query string, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { - return c.qs.Execute(ctx, &c.target, query, bindVars, 0, nil) + return c.qs.Execute(ctx, &c.target, query, bindVars, 0, 0, nil) } From faf26574aa7661b90d5d4f3d5cdc71515e1e49e2 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 16 Jun 2020 19:02:46 +0530 Subject: [PATCH 110/430] reserve-conn: used reserveId in Execute method and added endtoend on tabletserver Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/framework/client.go | 54 +++++++++++++++- go/vt/vttablet/endtoend/reserve_test.go | 72 +++++++++++++++++++++ go/vt/vttablet/tabletserver/tabletserver.go | 8 ++- 3 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 go/vt/vttablet/endtoend/reserve_test.go diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 2ff65451e25..9306e9100cd 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -37,6 +37,7 @@ type QueryClient struct { target querypb.Target server *tabletserver.TabletServer transactionID int64 + reserveID int64 } // NewClient creates a new client for Server. @@ -169,7 +170,7 @@ func (client *QueryClient) BeginExecute(query string, bindvars map[string]*query &client.target, query, bindvars, - 0, + client.reserveID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, ) if err != nil { @@ -187,8 +188,7 @@ func (client *QueryClient) ExecuteWithOptions(query string, bindvars map[string] query, bindvars, client.transactionID, - // TODO: client needs a reservedID field to write tests - 0, + client.reserveID, options, ) } @@ -264,3 +264,51 @@ func (client *QueryClient) MessageAck(name string, ids []string) (int64, error) } return client.server.MessageAck(client.ctx, &client.target, name, bids) } + +// ReserveExecute performs a ReserveExecute. +func (client *QueryClient) ReserveExecute(query string, preQueries []string, bindvars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + if client.reserveID != 0 { + return nil, errors.New("already reserved a connection") + } + qr, reserveID, _, err := client.server.ReserveExecute(client.ctx, &client.target, query, preQueries, bindvars, client.transactionID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}) + if err != nil { + return nil, err + } + client.reserveID = reserveID + return qr, nil +} + +// ReserveBeginExecute performs a ReserveBeginExecute. +func (client *QueryClient) ReserveBeginExecute(query string, preQueries []string, bindvars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + if client.reserveID != 0 { + return nil, errors.New("already reserved a connection") + } + if client.transactionID != 0 { + return nil, errors.New("already in transaction") + } + qr, transactionID, reserveID, _, err := client.server.ReserveBeginExecute( + client.ctx, + &client.target, + query, + preQueries, + bindvars, + &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, + ) + if err != nil { + return nil, err + } + client.transactionID = transactionID + client.reserveID = reserveID + return qr, nil +} + +// Release performs a Release. +func (client *QueryClient) Release() error { + err := client.server.Release(client.ctx, &client.target, client.reserveID, client.transactionID) + if err != nil { + return err + } + client.reserveID = 0 + client.transactionID = 0 + return nil +} diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go new file mode 100644 index 00000000000..9f2eb827246 --- /dev/null +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -0,0 +1,72 @@ +package endtoend + +import ( + "testing" + + "github.com/stretchr/testify/require" + "vitess.io/vitess/go/vt/vttablet/endtoend/framework" +) + +func TestReserve(t *testing.T) { + client1 := framework.NewClient() + client2 := framework.NewClient() + + //vstart := framework.DebugVars() + + query := "select connection_id()" + + qrc1_1, err := client1.ReserveExecute(query, nil, nil) + require.NoError(t, err) + defer client1.Release() + qrc2_1, err := client2.ReserveExecute(query, nil, nil) + require.NoError(t, err) + defer client2.Release() + require.NotEqual(t, qrc1_1.Rows, qrc2_1.Rows) + + qrc1_2, err := client1.Execute(query, nil) + require.NoError(t, err) + qrc2_2, err := client2.Execute(query, nil) + require.NoError(t, err) + require.Equal(t, qrc1_1.Rows, qrc1_2.Rows) + require.Equal(t, qrc2_1.Rows, qrc2_2.Rows) + + //TODO: Add Counter tests. + //expectedDiffs := []struct { + // tag string + // diff int + //}{{ + // tag: "Release/TotalCount", + // diff: 2, + //}, { + // tag: "Transactions/Histograms/commit/Count", + // diff: 2, + //}, { + // tag: "Queries/TotalCount", + // diff: 4, + //}, { + // tag: "Queries/Histograms/BEGIN/Count", + // diff: 0, + //}, { + // tag: "Queries/Histograms/COMMIT/Count", + // diff: 0, + //}, { + // tag: "Queries/Histograms/Insert/Count", + // diff: 1, + //}, { + // tag: "Queries/Histograms/DeleteLimit/Count", + // diff: 1, + //}, { + // tag: "Queries/Histograms/Select/Count", + // diff: 2, + //}} + //vend := framework.DebugVars() + //for _, expected := range expectedDiffs { + // got := framework.FetchInt(vend, expected.tag) + // want := framework.FetchInt(vstart, expected.tag) + expected.diff + // // It's possible that other house-keeping transactions (like messaging) + // // can happen during this test. So, don't perform equality comparisons. + // if got < want { + // t.Errorf("%s: %d, must be at least %d", expected.tag, got, want) + // } + //} +} diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 1ae2736ae8f..0e472f0ba1f 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -977,11 +977,17 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq if err != nil { return err } + // If reserveID or transactionID is non zero it should be assigned as connID and passed to query executor. + connID := reservedID + if transactionID != 0 { + connID = transactionID + } + qre := &QueryExecutor{ query: query, marginComments: comments, bindVars: bindVariables, - connID: transactionID, + connID: connID, options: options, plan: plan, ctx: ctx, From 023096a43300e8df467f0bf4cadffe79a5af838d Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Tue, 16 Jun 2020 19:44:59 +0530 Subject: [PATCH 111/430] reserve-conn: use reserveID in beginExecute and added endtoend test for same Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/framework/client.go | 10 +++++ go/vt/vttablet/endtoend/reserve_test.go | 38 ++++++++++++++++++- go/vt/vttablet/tabletserver/query_executor.go | 4 +- go/vt/vttablet/tabletserver/tabletserver.go | 12 ++++-- go/vt/vttablet/tabletserver/tx_engine.go | 6 +-- go/vt/vttablet/tabletserver/tx_engine_test.go | 16 ++++---- go/vt/vttablet/tabletserver/tx_executor.go | 4 +- go/vt/vttablet/tabletserver/tx_pool.go | 19 ++++++---- go/vt/vttablet/tabletserver/tx_pool_test.go | 36 +++++++++--------- 9 files changed, 99 insertions(+), 46 deletions(-) diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 9306e9100cd..1fd9e5c957a 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -312,3 +312,13 @@ func (client *QueryClient) Release() error { client.transactionID = 0 return nil } + +//TransactionID returns transactionID +func (client *QueryClient) TransactionID() int64 { + return client.transactionID +} + +//ReserveID returns reserveID +func (client *QueryClient) ReserveID() int64 { + return client.reserveID +} diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 9f2eb827246..e07ba88d3ea 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -1,13 +1,33 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package endtoend import ( "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/vt/vttablet/endtoend/framework" ) -func TestReserve(t *testing.T) { +//TODO: Add Counter checks in all the tests. + +func Test_DifferentConnIDOnMultipleReserve(t *testing.T) { client1 := framework.NewClient() client2 := framework.NewClient() @@ -30,7 +50,6 @@ func TestReserve(t *testing.T) { require.Equal(t, qrc1_1.Rows, qrc1_2.Rows) require.Equal(t, qrc2_1.Rows, qrc2_2.Rows) - //TODO: Add Counter tests. //expectedDiffs := []struct { // tag string // diff int @@ -70,3 +89,18 @@ func TestReserve(t *testing.T) { // } //} } + +func Test_TransactionOnReserveConn(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qr1, err := client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + qr2, err := client.BeginExecute(query, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) + assert.Equal(t, client.ReserveID(), client.TransactionID()) +} diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index 9df15894891..1206ff4cfcd 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -153,7 +153,7 @@ func (qre *QueryExecutor) execAutocommit(f func(conn tx.IStatefulConnection) (*s } qre.options.TransactionIsolation = querypb.ExecuteOptions_AUTOCOMMIT - conn, _, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false) + conn, _, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0) if err != nil { return nil, err @@ -164,7 +164,7 @@ func (qre *QueryExecutor) execAutocommit(f func(conn tx.IStatefulConnection) (*s } func (qre *QueryExecutor) execAsTransaction(f func(conn tx.IStatefulConnection) (*sqltypes.Result, error)) (*sqltypes.Result, error) { - conn, beginSQL, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false) + conn, beginSQL, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0) if err != nil { return nil, err } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 0e472f0ba1f..50cb3591eb5 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -747,6 +747,10 @@ func (tsv *TabletServer) SchemaEngine() *schema.Engine { // Begin starts a new transaction. This is allowed only if the state is StateServing. func (tsv *TabletServer) Begin(ctx context.Context, target *querypb.Target, options *querypb.ExecuteOptions) (transactionID int64, tablet *topodatapb.TabletAlias, err error) { + return tsv.begin(ctx, target, 0, options) +} + +func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, reserveID int64, options *querypb.ExecuteOptions) (transactionID int64, tablet *topodatapb.TabletAlias, err error) { err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "Begin", "begin", nil, @@ -757,7 +761,7 @@ func (tsv *TabletServer) Begin(ctx context.Context, target *querypb.Target, opti return vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "Transaction throttled") } var beginSQL string - transactionID, beginSQL, err = tsv.te.Begin(ctx, options) + transactionID, beginSQL, err = tsv.te.Begin(ctx, reserveID, options) logStats.TransactionID = transactionID // Record the actual statements that were executed in the logStats. @@ -1146,7 +1150,7 @@ func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Targe // TODO: tsv.Begin creates a new connection, that's a big no-no if we already have a reservedID // Begin needs to take a reservedID and start a transaction on that connection if it exists // if reservedID is 0, then create a new connection as before - transactionID, alias, err := tsv.Begin(ctx, target, options) + transactionID, alias, err := tsv.begin(ctx, target, reservedID, options) if err != nil { return nil, 0, nil, err } @@ -1399,7 +1403,7 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp } //ReserveExecute implements the QueryService interface -func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { +func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { var connID int64 var err error @@ -1409,7 +1413,7 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { defer tsv.stats.QueryTimings.Record("Reserve", time.Now()) - connID, err = tsv.te.Reserve(ctx, options, txID, preQueries) + connID, err = tsv.te.Reserve(ctx, options, transactionID, preQueries) if err != nil { return err } diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 06533370f00..0425ed03923 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -217,7 +217,7 @@ func (te *TxEngine) AcceptReadOnly() error { // statement(s) used to execute the begin (if any). // // Subsequent statements can access the connection through the transaction id. -func (te *TxEngine) Begin(ctx context.Context, options *querypb.ExecuteOptions) (int64, string, error) { +func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb.ExecuteOptions) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Begin") defer span.Finish() te.stateLock.Lock() @@ -235,7 +235,7 @@ func (te *TxEngine) Begin(ctx context.Context, options *querypb.ExecuteOptions) te.stateLock.Unlock() defer te.beginRequests.Done() - conn, beginSQL, err := te.txPool.Begin(ctx, options, te.state == AcceptingReadOnly) + conn, beginSQL, err := te.txPool.Begin(ctx, options, te.state == AcceptingReadOnly, reserveID) if err != nil { return 0, "", err } @@ -432,7 +432,7 @@ outer: if txid > maxid { maxid = txid } - conn, _, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { allErr.RecordError(err) continue diff --git a/go/vt/vttablet/tabletserver/tx_engine_test.go b/go/vt/vttablet/tabletserver/tx_engine_test.go index 1c899d19fef..4059a492de9 100644 --- a/go/vt/vttablet/tabletserver/tx_engine_test.go +++ b/go/vt/vttablet/tabletserver/tx_engine_test.go @@ -57,7 +57,7 @@ func TestTxEngineClose(t *testing.T) { // Normal close with timeout wait. te.open() - c, beginSQL, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + c, beginSQL, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) require.Equal(t, "begin", beginSQL) c.Unlock() @@ -69,7 +69,7 @@ func TestTxEngineClose(t *testing.T) { // Immediate close. te.open() - c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { t.Fatal(err) } @@ -83,7 +83,7 @@ func TestTxEngineClose(t *testing.T) { // Normal close with short grace period. te.shutdownGracePeriod = 250 * time.Millisecond te.open() - c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { t.Fatal(err) } @@ -100,7 +100,7 @@ func TestTxEngineClose(t *testing.T) { // Normal close with short grace period, but pool gets empty early. te.shutdownGracePeriod = 250 * time.Millisecond te.open() - c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { t.Fatal(err) } @@ -122,7 +122,7 @@ func TestTxEngineClose(t *testing.T) { // Immediate close, but connection is in use. te.open() - c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + c, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) go func() { time.Sleep(100 * time.Millisecond) @@ -146,7 +146,7 @@ func TestTxEngineBegin(t *testing.T) { config.DB = newDBConfigs(db) te := NewTxEngine(tabletenv.NewEnv(config, "TabletServerTest")) te.AcceptReadOnly() - tx1, _, err := te.Begin(ctx, &querypb.ExecuteOptions{}) + tx1, _, err := te.Begin(ctx, 0, &querypb.ExecuteOptions{}) require.NoError(t, err) _, err = te.Commit(ctx, tx1) require.NoError(t, err) @@ -154,7 +154,7 @@ func TestTxEngineBegin(t *testing.T) { db.ResetQueryLog() te.AcceptReadWrite() - tx2, _, err := te.Begin(ctx, &querypb.ExecuteOptions{}) + tx2, _, err := te.Begin(ctx, 0, &querypb.ExecuteOptions{}) require.NoError(t, err) _, err = te.Commit(ctx, tx2) require.NoError(t, err) @@ -501,6 +501,6 @@ func startTransaction(te *TxEngine, writeTransaction bool) error { } else { options.TransactionIsolation = querypb.ExecuteOptions_CONSISTENT_SNAPSHOT_READ_ONLY } - _, _, err := te.Begin(context.Background(), options) + _, _, err := te.Begin(context.Background(), 0, options) return err } diff --git a/go/vt/vttablet/tabletserver/tx_executor.go b/go/vt/vttablet/tabletserver/tx_executor.go index cb013952778..e5aa61132f3 100644 --- a/go/vt/vttablet/tabletserver/tx_executor.go +++ b/go/vt/vttablet/tabletserver/tx_executor.go @@ -118,7 +118,7 @@ func (txe *TxExecutor) CommitPrepared(dtid string) error { func (txe *TxExecutor) markFailed(ctx context.Context, dtid string) { txe.te.env.Stats().InternalErrors.Add("TwopcCommit", 1) txe.te.preparedPool.SetFailed(dtid) - conn, _, err := txe.te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := txe.te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { log.Errorf("markFailed: Begin failed for dtid %s: %v", dtid, err) return @@ -261,7 +261,7 @@ func (txe *TxExecutor) ReadTwopcInflight() (distributed []*tx.DistributedTx, pre } func (txe *TxExecutor) inTransaction(f func(tx.IStatefulConnection) error) error { - conn, _, err := txe.te.txPool.Begin(txe.ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := txe.te.txPool.Begin(txe.ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { return err } diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index 13b6bf29fa1..95c2cd8365f 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -208,17 +208,22 @@ func (tp *TxPool) Rollback(ctx context.Context, txConn tx.IStatefulConnection) e // the statements (if any) executed to initiate the transaction. In autocommit // mode the statement will be "". // The connection returned is locked for the callee and its responsibility is to unlock the connection. -func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool) (tx.IStatefulConnection, string, error) { +func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reserveID int64) (tx.IStatefulConnection, string, error) { span, ctx := trace.NewSpan(ctx, "TxPool.Begin") defer span.Finish() - immediateCaller := callerid.ImmediateCallerIDFromContext(ctx) - effectiveCaller := callerid.EffectiveCallerIDFromContext(ctx) - if !tp.limiter.Get(immediateCaller, effectiveCaller) { - return nil, "", vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "per-user transaction pool connection limit exceeded") + var conn *StatefulConnection + var err error + if reserveID != 0 { + conn, err = tp.scp.GetAndLock(reserveID, "start transaction on reserve conn") + } else { + immediateCaller := callerid.ImmediateCallerIDFromContext(ctx) + effectiveCaller := callerid.EffectiveCallerIDFromContext(ctx) + if !tp.limiter.Get(immediateCaller, effectiveCaller) { + return nil, "", vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "per-user transaction pool connection limit exceeded") + } + conn, err = tp.createConn(ctx, options) } - - conn, err := tp.createConn(ctx, options) if err != nil { return nil, "", err } diff --git a/go/vt/vttablet/tabletserver/tx_pool_test.go b/go/vt/vttablet/tabletserver/tx_pool_test.go index 66f8b377430..3c4feb17c5b 100644 --- a/go/vt/vttablet/tabletserver/tx_pool_test.go +++ b/go/vt/vttablet/tabletserver/tx_pool_test.go @@ -45,7 +45,7 @@ func TestTxPoolExecuteCommit(t *testing.T) { sql := "select 'this is a query'" // begin a transaction and then return the connection - conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) id := conn.ID() @@ -77,7 +77,7 @@ func TestTxPoolExecuteRollback(t *testing.T) { db, txPool, closer := setup(t) defer closer() - conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) defer conn.Release(tx.TxRollback) @@ -95,7 +95,7 @@ func TestTxPoolExecuteRollbackOnClosedConn(t *testing.T) { db, txPool, closer := setup(t) defer closer() - conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) defer conn.Release(tx.TxRollback) @@ -113,9 +113,9 @@ func TestTxPoolRollbackNonBusy(t *testing.T) { defer closer() // start two transactions, and mark one of them as unused - conn1, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn1, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) - conn2, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn2, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) conn2.Unlock() // this marks conn2 as NonBusy @@ -138,7 +138,7 @@ func TestTxPoolTransactionIsolation(t *testing.T) { db, txPool, closer := setup(t) defer closer() - c2, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_READ_COMMITTED}, false) + c2, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_READ_COMMITTED}, false, 0) require.NoError(t, err) c2.Release(tx.TxClose) @@ -153,7 +153,7 @@ func TestTxPoolAutocommit(t *testing.T) { // to mysql. // This test is meaningful because if txPool.Begin were to send a BEGIN statement to the connection, it will fatal // because is not in the list of expected queries (i.e db.AddQuery hasn't been called). - conn1, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_AUTOCOMMIT}, false) + conn1, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_AUTOCOMMIT}, false, 0) require.NoError(t, err) // run a query to see it in the query log @@ -182,7 +182,7 @@ func TestTxPoolBeginWithPoolConnectionError_Errno2006_Transient(t *testing.T) { err := db.WaitForClose(2 * time.Second) require.NoError(t, err) - txConn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + txConn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err, "Begin should have succeeded after the retry in DBConn.Exec()") txConn.Release(tx.TxCommit) } @@ -201,7 +201,7 @@ func primeTxPoolWithConnection(t *testing.T) (*fakesqldb.DB, *TxPool) { // reused by subsequent transactions. db.AddQuery("begin", &sqltypes.Result{}) db.AddQuery("rollback", &sqltypes.Result{}) - txConn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + txConn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) txConn.Release(tx.TxCommit) @@ -212,7 +212,7 @@ func TestTxPoolBeginWithError(t *testing.T) { db, txPool, closer := setup(t) defer closer() db.AddRejectedQuery("begin", errRejected) - _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.Error(t, err) require.Contains(t, err.Error(), "error: rejected") require.Equal(t, vtrpcpb.Code_UNKNOWN, vterrors.Code(err), "wrong error code for Begin error") @@ -226,7 +226,7 @@ func TestTxPoolCancelledContextError(t *testing.T) { cancel() // when - _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) // then require.Error(t, err) @@ -245,12 +245,12 @@ func TestTxPoolWaitTimeoutError(t *testing.T) { defer closer() // lock the only connection in the pool. - conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) defer conn.Unlock() // try locking one more connection. - _, _, err = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + _, _, err = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) // then require.Error(t, err) @@ -266,7 +266,7 @@ func TestTxPoolRollbackFailIsPassedThrough(t *testing.T) { defer closer() db.AddRejectedQuery("rollback", errRejected) - conn1, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn1, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) _, err = conn1.Exec(ctx, sql, 1, true) @@ -283,7 +283,7 @@ func TestTxPoolRollbackFailIsPassedThrough(t *testing.T) { func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { db, txPool, _ := setup(t) defer db.Close() - conn1, _, _ := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn1, _, _ := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) id := conn1.ID() conn1.Unlock() txPool.Close() @@ -305,7 +305,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { txPool = newTxPool() txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) - conn1, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn1, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) id = conn1.ID() _, err := txPool.Commit(ctx, conn1) require.NoError(t, err) @@ -319,7 +319,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) defer txPool.Close() - conn1, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false) + conn1, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0) conn1.Unlock() id = conn1.ID() time.Sleep(20 * time.Millisecond) @@ -334,7 +334,7 @@ func TestTxPoolCloseKillsStrayTransactions(t *testing.T) { startingStray := txPool.env.Stats().InternalErrors.Counts()["StrayTransactions"] // Start stray transaction. - conn, _, err := txPool.Begin(context.Background(), &querypb.ExecuteOptions{}, false) + conn, _, err := txPool.Begin(context.Background(), &querypb.ExecuteOptions{}, false, 0) require.NoError(t, err) conn.Unlock() From 14b620562a0e59f91c363b19060f998117c6c6b6 Mon Sep 17 00:00:00 2001 From: deepthi Date: Tue, 16 Jun 2020 11:02:23 -0700 Subject: [PATCH 112/430] reserve-conn: add tests for ReserveBeginExecute Signed-off-by: deepthi --- go/vt/vttablet/endtoend/framework/client.go | 28 ++++---- go/vt/vttablet/endtoend/reserve_test.go | 73 ++++++++++++++++++++- 2 files changed, 84 insertions(+), 17 deletions(-) diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 1fd9e5c957a..20085efdc89 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -37,7 +37,7 @@ type QueryClient struct { target querypb.Target server *tabletserver.TabletServer transactionID int64 - reserveID int64 + reservedID int64 } // NewClient creates a new client for Server. @@ -170,7 +170,7 @@ func (client *QueryClient) BeginExecute(query string, bindvars map[string]*query &client.target, query, bindvars, - client.reserveID, + client.reservedID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, ) if err != nil { @@ -188,7 +188,7 @@ func (client *QueryClient) ExecuteWithOptions(query string, bindvars map[string] query, bindvars, client.transactionID, - client.reserveID, + client.reservedID, options, ) } @@ -267,26 +267,26 @@ func (client *QueryClient) MessageAck(name string, ids []string) (int64, error) // ReserveExecute performs a ReserveExecute. func (client *QueryClient) ReserveExecute(query string, preQueries []string, bindvars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { - if client.reserveID != 0 { + if client.reservedID != 0 { return nil, errors.New("already reserved a connection") } - qr, reserveID, _, err := client.server.ReserveExecute(client.ctx, &client.target, query, preQueries, bindvars, client.transactionID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}) + qr, reservedID, _, err := client.server.ReserveExecute(client.ctx, &client.target, query, preQueries, bindvars, client.transactionID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}) if err != nil { return nil, err } - client.reserveID = reserveID + client.reservedID = reservedID return qr, nil } // ReserveBeginExecute performs a ReserveBeginExecute. func (client *QueryClient) ReserveBeginExecute(query string, preQueries []string, bindvars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { - if client.reserveID != 0 { + if client.reservedID != 0 { return nil, errors.New("already reserved a connection") } if client.transactionID != 0 { return nil, errors.New("already in transaction") } - qr, transactionID, reserveID, _, err := client.server.ReserveBeginExecute( + qr, transactionID, reservedID, _, err := client.server.ReserveBeginExecute( client.ctx, &client.target, query, @@ -298,17 +298,17 @@ func (client *QueryClient) ReserveBeginExecute(query string, preQueries []string return nil, err } client.transactionID = transactionID - client.reserveID = reserveID + client.reservedID = reservedID return qr, nil } // Release performs a Release. func (client *QueryClient) Release() error { - err := client.server.Release(client.ctx, &client.target, client.reserveID, client.transactionID) + err := client.server.Release(client.ctx, &client.target, client.reservedID, client.transactionID) if err != nil { return err } - client.reserveID = 0 + client.reservedID = 0 client.transactionID = 0 return nil } @@ -318,7 +318,7 @@ func (client *QueryClient) TransactionID() int64 { return client.transactionID } -//ReserveID returns reserveID -func (client *QueryClient) ReserveID() int64 { - return client.reserveID +//ReservedID returns reservedID +func (client *QueryClient) ReservedID() int64 { + return client.reservedID } diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index e07ba88d3ea..08f1a928659 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -17,6 +17,7 @@ limitations under the License. package endtoend import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -27,7 +28,7 @@ import ( //TODO: Add Counter checks in all the tests. -func Test_DifferentConnIDOnMultipleReserve(t *testing.T) { +func TestDifferentConnIDOnMultipleReserve(t *testing.T) { client1 := framework.NewClient() client2 := framework.NewClient() @@ -90,7 +91,7 @@ func Test_DifferentConnIDOnMultipleReserve(t *testing.T) { //} } -func Test_TransactionOnReserveConn(t *testing.T) { +func TestTransactionOnReserveConn(t *testing.T) { client := framework.NewClient() query := "select connection_id()" @@ -102,5 +103,71 @@ func Test_TransactionOnReserveConn(t *testing.T) { qr2, err := client.BeginExecute(query, nil) require.NoError(t, err) assert.Equal(t, qr1.Rows, qr2.Rows) - assert.Equal(t, client.ReserveID(), client.TransactionID()) + assert.Equal(t, client.ReservedID(), client.TransactionID()) +} + +func TestReserveBeginExecute(t *testing.T) { + client1 := framework.NewClient() + client2 := framework.NewClient() + + query := "select connection_id()" + + qrc1_1, err := client1.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer func() { + if client1.ReservedID() != 0 { + _ = client1.Release() + } + }() + qrc2_1, err := client2.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer func() { + if client2.ReservedID() != 0 { + _ = client2.Release() + } + }() + require.NotEqual(t, qrc1_1.Rows, qrc2_1.Rows) + assert.Equal(t, client1.ReservedID(), client1.TransactionID()) + assert.Equal(t, client2.ReservedID(), client2.TransactionID()) + + // rows with values 1, 2 and 3 already exist + query1 := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" + qrc1_2, err := client1.Execute(query1, nil) + require.NoError(t, err) + assert.Equal(t, uint64(1), qrc1_2.RowsAffected, "insert should create 1 row") + + query2 := "insert into vitess_test (intval, floatval, charval, binval) values (5, null, null, null)" + qrc2_2, err := client2.Execute(query2, nil) + require.NoError(t, err) + assert.Equal(t, uint64(1), qrc2_2.RowsAffected, "insert should create 1 row") + + query = "select intval from vitess_test" + qrc1_2, err = client1.Execute(query, nil) + require.NoError(t, err) + // client1 does not see row inserted by client2 + expectedRows1 := "[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)]]" + assert.Equal(t, expectedRows1, fmt.Sprintf("%v", qrc1_2.Rows), "wrong result from select1") + + qrc2_2, err = client2.Execute(query, nil) + require.NoError(t, err) + expectedRows2 := "[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(5)]]" + assert.Equal(t, expectedRows2, fmt.Sprintf("%v", qrc2_2.Rows), "wrong result from select2") + + // Release connections without committing + err = client1.Release() + require.NoError(t, err) + err = client1.Release() + require.Error(t, err) + err = client2.Release() + require.NoError(t, err) + err = client2.Release() + require.Error(t, err) + + // test that inserts were rolled back + client3 := framework.NewClient() + qrc3, err := client3.Execute(query, nil) + require.NoError(t, err) + expectedRows := "[[INT32(1)] [INT32(2)] [INT32(3)]]" + assert.Equal(t, expectedRows, fmt.Sprintf("%v", qrc3.Rows), "wrong result from select after release") + } From 490c04ef5022515bd1a34fa31e82a4d22c93da72 Mon Sep 17 00:00:00 2001 From: deepthi Date: Tue, 16 Jun 2020 14:56:59 -0700 Subject: [PATCH 113/430] reserve-conn: QueryService.Commit now returns a new reservedID, TxEngine.Commit renews and taints the new connection. Added endtoend test for Commit with Reserve. Signed-off-by: deepthi --- go/vt/vtcombo/tablet_map.go | 6 ++-- go/vt/vtctl/query.go | 4 ++- go/vt/vtexplain/vtexplain_vttablet.go | 2 +- go/vt/vtgate/discoverygateway_test.go | 3 +- go/vt/vtgate/tx_conn.go | 4 ++- go/vt/vttablet/endtoend/framework/client.go | 9 +++-- go/vt/vttablet/endtoend/framework/testcase.go | 3 +- go/vt/vttablet/endtoend/reserve_test.go | 21 +++++++++++ go/vt/vttablet/endtoend/stream_test.go | 3 +- go/vt/vttablet/endtoend/transaction_test.go | 4 +-- go/vt/vttablet/grpcqueryservice/server.go | 5 +-- go/vt/vttablet/grpctabletconn/conn.go | 10 +++--- go/vt/vttablet/queryservice/queryservice.go | 3 +- go/vt/vttablet/queryservice/wrapped.go | 8 +++-- go/vt/vttablet/sandboxconn/sandboxconn.go | 4 +-- .../tabletconntest/fakequeryservice.go | 6 ++-- .../vttablet/tabletconntest/tabletconntest.go | 8 +++-- .../tabletserver/stateful_connection.go | 7 +++- go/vt/vttablet/tabletserver/tabletserver.go | 11 +++--- .../tabletserver/tabletserver_test.go | 26 +++++++------- go/vt/vttablet/tabletserver/tx_engine.go | 35 +++++++++++++++---- go/vt/vttablet/tabletserver/tx_engine_test.go | 4 +-- 22 files changed, 126 insertions(+), 60 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index fd850bdab00..f110587d34a 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -381,9 +381,9 @@ func (itc *internalTabletConn) Begin(ctx context.Context, target *querypb.Target } // Commit is part of queryservice.QueryService -func (itc *internalTabletConn) Commit(ctx context.Context, target *querypb.Target, transactionID int64) error { - err := itc.tablet.qsc.QueryService().Commit(ctx, target, transactionID) - return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +func (itc *internalTabletConn) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { + rID, err := itc.tablet.qsc.QueryService().Commit(ctx, target, transactionID) + return rID, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } // Rollback is part of queryservice.QueryService diff --git a/go/vt/vtctl/query.go b/go/vt/vtctl/query.go index 25fe88eae43..c685d0265ab 100644 --- a/go/vt/vtctl/query.go +++ b/go/vt/vtctl/query.go @@ -327,11 +327,13 @@ func commandVtTabletCommit(ctx context.Context, wr *wrangler.Wrangler, subFlags } defer conn.Close(ctx) - return conn.Commit(ctx, &querypb.Target{ + // we do not support reserving through vtctl commands + _, err = conn.Commit(ctx, &querypb.Target{ Keyspace: tabletInfo.Tablet.Keyspace, Shard: tabletInfo.Tablet.Shard, TabletType: tabletInfo.Tablet.Type, }, transactionID) + return err } func commandVtTabletRollback(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index 926bd756ea9..c80dd3e620f 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -136,7 +136,7 @@ func (t *explainTablet) Begin(ctx context.Context, target *querypb.Target, optio } // Commit is part of the QueryService interface. -func (t *explainTablet) Commit(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (t *explainTablet) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { t.mu.Lock() t.currentTime = batchTime.Wait() t.tabletQueries = append(t.tabletQueries, &TabletQuery{ diff --git a/go/vt/vtgate/discoverygateway_test.go b/go/vt/vtgate/discoverygateway_test.go index f17d4a019e5..d5988f25fe5 100644 --- a/go/vt/vtgate/discoverygateway_test.go +++ b/go/vt/vtgate/discoverygateway_test.go @@ -80,7 +80,8 @@ func TestDiscoveryGatewayBegin(t *testing.T) { func TestDiscoveryGatewayCommit(t *testing.T) { testDiscoveryGatewayTransact(t, func(dg *DiscoveryGateway, target *querypb.Target) error { - return dg.Commit(context.Background(), target, 1) + _, err := dg.Commit(context.Background(), target, 1) + return err }) } diff --git a/go/vt/vtgate/tx_conn.go b/go/vt/vtgate/tx_conn.go index 4041497c20a..98ebab3fb01 100644 --- a/go/vt/vtgate/tx_conn.go +++ b/go/vt/vtgate/tx_conn.go @@ -97,7 +97,9 @@ func (txc *TxConn) commitShard(ctx context.Context, s *vtgatepb.Session_ShardSes if err != nil { return err } - return qs.Commit(ctx, s.Target, s.TransactionId) + // TODO: is it ok to ignore reservedID here? + _, err = qs.Commit(ctx, s.Target, s.TransactionId) + return err } func (txc *TxConn) commitNormal(ctx context.Context, session *SafeSession) error { diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 20085efdc89..12bcdb341a1 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -95,9 +95,14 @@ func (client *QueryClient) Begin(clientFoundRows bool) error { } // Commit commits the current transaction. -func (client *QueryClient) Commit() error { +func (client *QueryClient) Commit() (int64, error) { defer func() { client.transactionID = 0 }() - return client.server.Commit(client.ctx, &client.target, client.transactionID) + rID, err := client.server.Commit(client.ctx, &client.target, client.transactionID) + if err != nil { + return 0, err + } + client.reservedID = rID + return rID, nil } // Rollback rolls back the current transaction. diff --git a/go/vt/vttablet/endtoend/framework/testcase.go b/go/vt/vttablet/endtoend/framework/testcase.go index 61ec7713034..ebe47b219f2 100644 --- a/go/vt/vttablet/endtoend/framework/testcase.go +++ b/go/vt/vttablet/endtoend/framework/testcase.go @@ -166,7 +166,8 @@ func exec(client *QueryClient, query string, bv map[string]*querypb.BindVariable case "begin": return nil, client.Begin(false) case "commit": - return nil, client.Commit() + _, err := client.Commit() + return nil, err case "rollback": return nil, client.Rollback() } diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 08f1a928659..38eef40fedf 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -169,5 +169,26 @@ func TestReserveBeginExecute(t *testing.T) { require.NoError(t, err) expectedRows := "[[INT32(1)] [INT32(2)] [INT32(3)]]" assert.Equal(t, expectedRows, fmt.Sprintf("%v", qrc3.Rows), "wrong result from select after release") +} + +func TestCommitOnReserveConn(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qr1, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + oldRID := client.ReservedID() + newRID, err := client.Commit() + require.NoError(t, err) + assert.Equal(t, newRID, client.ReservedID(), "returned and saved reservedID must be the same") + assert.NotEqual(t, client.ReservedID(), oldRID, "reservedID must change after commit") + assert.EqualValues(t, 0, client.TransactionID(), "transactionID should be 0 after commit") + qr2, err := client.Execute(query, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) + // TODO test that new connection obtained after Commit has been tainted correctly } diff --git a/go/vt/vttablet/endtoend/stream_test.go b/go/vt/vttablet/endtoend/stream_test.go index ff47e2d2158..a6920167fa8 100644 --- a/go/vt/vttablet/endtoend/stream_test.go +++ b/go/vt/vttablet/endtoend/stream_test.go @@ -148,7 +148,8 @@ func populateBigData(client *framework.QueryClient) error { return err } } - return client.Commit() + _, err = client.Commit() + return err } func TestStreamError(t *testing.T) { diff --git a/go/vt/vttablet/endtoend/transaction_test.go b/go/vt/vttablet/endtoend/transaction_test.go index e588ea03bb2..4141c3e3769 100644 --- a/go/vt/vttablet/endtoend/transaction_test.go +++ b/go/vt/vttablet/endtoend/transaction_test.go @@ -50,7 +50,7 @@ func TestCommit(t *testing.T) { _, err = client.Execute(query, nil) require.NoError(t, err) - err = client.Commit() + _, err = client.Commit() require.NoError(t, err) qr, err := client.Execute("select * from vitess_test", nil) @@ -244,7 +244,7 @@ func TestForUpdate(t *testing.T) { require.NoError(t, err) _, err = client.Execute(query, nil) require.NoError(t, err) - err = client.Commit() + _, err = client.Commit() require.NoError(t, err) } } diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index fc52aa85ba5..5ac37c60700 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -112,10 +112,11 @@ func (q *query) Commit(ctx context.Context, request *querypb.CommitRequest) (res request.EffectiveCallerId, request.ImmediateCallerId, ) - if err := q.server.Commit(ctx, request.Target, request.TransactionId); err != nil { + rID, err := q.server.Commit(ctx, request.Target, request.TransactionId) + if err != nil { return nil, vterrors.ToGRPC(err) } - return &querypb.CommitResponse{}, nil + return &querypb.CommitResponse{ReservedId: rID}, nil } // Rollback is part of the queryservice.QueryServer interface diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index 01ea659d309..f540991e13b 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -225,11 +225,11 @@ func (conn *gRPCQueryClient) Begin(ctx context.Context, target *querypb.Target, } // Commit commits the ongoing transaction. -func (conn *gRPCQueryClient) Commit(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (conn *gRPCQueryClient) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { - return tabletconn.ConnClosed + return 0, tabletconn.ConnClosed } req := &querypb.CommitRequest{ @@ -238,11 +238,11 @@ func (conn *gRPCQueryClient) Commit(ctx context.Context, target *querypb.Target, ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), TransactionId: transactionID, } - _, err := conn.c.Commit(ctx, req) + resp, err := conn.c.Commit(ctx, req) if err != nil { - return tabletconn.ErrorFromGRPC(err) + return 0, tabletconn.ErrorFromGRPC(err) } - return nil + return resp.ReservedId, nil } // Rollback rolls back the ongoing transaction. diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index f5dd175280f..15cca12ca69 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -46,7 +46,8 @@ type QueryService interface { Begin(ctx context.Context, target *querypb.Target, options *querypb.ExecuteOptions) (int64, *topodatapb.TabletAlias, error) // Commit commits the current transaction - Commit(ctx context.Context, target *querypb.Target, transactionID int64) error + // TODO: should this also take in a reservedID? + Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) // Rollback aborts the current transaction Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index c762199a367..3f385077264 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -93,11 +93,13 @@ func (ws *wrappedService) Begin(ctx context.Context, target *querypb.Target, opt return transactionID, alias, err } -func (ws *wrappedService) Commit(ctx context.Context, target *querypb.Target, transactionID int64) error { - return ws.wrapper(ctx, target, ws.impl, "Commit", true, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { - innerErr := conn.Commit(ctx, target, transactionID) +func (ws *wrappedService) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (reservedID int64, err error) { + err = ws.wrapper(ctx, target, ws.impl, "Commit", true, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + var innerErr error + reservedID, innerErr = conn.Commit(ctx, target, transactionID) return canRetry(ctx, innerErr), innerErr }) + return reservedID, err } func (ws *wrappedService) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 1a5b232a2b7..2f60eb9adad 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -187,9 +187,9 @@ func (sbc *SandboxConn) Begin(ctx context.Context, target *querypb.Target, optio } // Commit is part of the QueryService interface. -func (sbc *SandboxConn) Commit(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (sbc *SandboxConn) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { sbc.CommitCount.Add(1) - return sbc.getError() + return 0, sbc.getError() } // Rollback is part of the QueryService interface. diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index 0e2ce4123e6..ed7bd7bfd61 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -157,9 +157,9 @@ func (f *FakeQueryService) Begin(ctx context.Context, target *querypb.Target, op const commitTransactionID int64 = 999044 // Commit is part of the queryservice.QueryService interface -func (f *FakeQueryService) Commit(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (f *FakeQueryService) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { if f.HasError { - return f.TabletError + return 0, f.TabletError } if f.Panics { panic(fmt.Errorf("test-triggered panic")) @@ -168,7 +168,7 @@ func (f *FakeQueryService) Commit(ctx context.Context, target *querypb.Target, t if transactionID != commitTransactionID { f.t.Errorf("Commit: invalid TransactionId: got %v expected %v", transactionID, commitTransactionID) } - return nil + return 0, nil } // rollbackTransactionID is a test transactin id for Rollback. diff --git a/go/vt/vttablet/tabletconntest/tabletconntest.go b/go/vt/vttablet/tabletconntest/tabletconntest.go index 5ff8ce9b34b..bc6e4952979 100644 --- a/go/vt/vttablet/tabletconntest/tabletconntest.go +++ b/go/vt/vttablet/tabletconntest/tabletconntest.go @@ -132,7 +132,7 @@ func testCommit(t *testing.T, conn queryservice.QueryService, f *FakeQueryServic t.Log("testCommit") ctx := context.Background() ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) - err := conn.Commit(ctx, TestTarget, commitTransactionID) + _, err := conn.Commit(ctx, TestTarget, commitTransactionID) if err != nil { t.Fatalf("Commit failed: %v", err) } @@ -142,7 +142,8 @@ func testCommitError(t *testing.T, conn queryservice.QueryService, f *FakeQueryS t.Log("testCommitError") f.HasError = true testErrorHelper(t, f, "Commit", func(ctx context.Context) error { - return conn.Commit(ctx, TestTarget, commitTransactionID) + _, err := conn.Commit(ctx, TestTarget, commitTransactionID) + return err }) f.HasError = false } @@ -150,7 +151,8 @@ func testCommitError(t *testing.T, conn queryservice.QueryService, f *FakeQueryS func testCommitPanics(t *testing.T, conn queryservice.QueryService, f *FakeQueryService) { t.Log("testCommitPanics") testPanicHelper(t, f, "Commit", func(ctx context.Context) error { - return conn.Commit(ctx, TestTarget, commitTransactionID) + _, err := conn.Commit(ctx, TestTarget, commitTransactionID) + return err }) } diff --git a/go/vt/vttablet/tabletserver/stateful_connection.go b/go/vt/vttablet/tabletserver/stateful_connection.go index 7d540c18107..612f5095f64 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection.go +++ b/go/vt/vttablet/tabletserver/stateful_connection.go @@ -170,10 +170,15 @@ func (sc *StatefulConnection) Stats() *tabletenv.Stats { return sc.env.Stats() } -//Taint Taints the existing connection. +//Taint taints the existing connection. func (sc *StatefulConnection) Taint() { sc.tainted = true sc.dbConn.Taint() } +//IsTainted tells us whether this connection is tainted +func (sc *StatefulConnection) IsTainted() bool { + return sc.tainted +} + var _ tx.IStatefulConnection = (*StatefulConnection)(nil) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 50cb3591eb5..7244246d50b 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -781,8 +781,8 @@ func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, rese } // Commit commits the specified transaction. -func (tsv *TabletServer) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (err error) { - return tsv.execRequest( +func (tsv *TabletServer) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (newReservedID int64, err error) { + err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "Commit", "commit", nil, target, nil, true, /* allowOnShutdown */ @@ -791,7 +791,7 @@ func (tsv *TabletServer) Commit(ctx context.Context, target *querypb.Target, tra logStats.TransactionID = transactionID var commitSQL string - commitSQL, err = tsv.te.Commit(ctx, transactionID) + newReservedID, commitSQL, err = tsv.te.Commit(ctx, transactionID) // If nothing was actually executed, don't count the operation in // the tablet metrics, and clear out the logStats Method so that @@ -804,6 +804,7 @@ func (tsv *TabletServer) Commit(ctx context.Context, target *querypb.Target, tra return err }, ) + return newReservedID, err } // Rollback rollsback the specified transaction. @@ -1124,7 +1125,7 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe results = append(results, *localReply) } if asTransaction { - if err = tsv.Commit(ctx, target, txID); err != nil { + if _, err = tsv.Commit(ctx, target, txID); err != nil { txID = 0 return nil, err } @@ -1333,7 +1334,7 @@ func (tsv *TabletServer) execDML(ctx context.Context, target *querypb.Target, qu if err != nil { return 0, err } - if err = tsv.Commit(ctx, target, transactionID); err != nil { + if _, err = tsv.Commit(ctx, target, transactionID); err != nil { transactionID = 0 return 0, err } diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 1d34e196cc6..ba9426c8a7f 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -796,12 +796,12 @@ func TestTabletServerCommitTransaction(t *testing.T) { if _, err := tsv.Execute(ctx, &target, executeSQL, nil, transactionID, 0, nil); err != nil { t.Fatalf("failed to execute query: %s: %s", executeSQL, err) } - if err := tsv.Commit(ctx, &target, transactionID); err != nil { + if _, err := tsv.Commit(ctx, &target, transactionID); err != nil { t.Fatalf("call TabletServer.Commit failed: %v", err) } } -func TestTabletServerCommiRollbacktFail(t *testing.T) { +func TestTabletServerCommitRollbackFail(t *testing.T) { db := setUpTabletServerTest(t) defer db.Close() config := tabletenv.NewDefaultConfig() @@ -813,7 +813,7 @@ func TestTabletServerCommiRollbacktFail(t *testing.T) { t.Fatalf("StartService failed: %v", err) } defer tsv.StopService() - err = tsv.Commit(ctx, &target, -1) + _, err = tsv.Commit(ctx, &target, -1) want := "transaction -1: not found" if err == nil || err.Error() != want { t.Fatalf("Commit err: %v, want %v", err, want) @@ -1283,7 +1283,7 @@ func TestSerializeTransactionsSameRow(t *testing.T) { if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } - if err := tsv.Commit(ctx, &target, tx1); err != nil { + if _, err := tsv.Commit(ctx, &target, tx1); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1303,7 +1303,7 @@ func TestSerializeTransactionsSameRow(t *testing.T) { // open a second connection while the request of the first connection is // still pending. <-tx3Finished - if err := tsv.Commit(ctx, &target, tx2); err != nil { + if _, err := tsv.Commit(ctx, &target, tx2); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1318,7 +1318,7 @@ func TestSerializeTransactionsSameRow(t *testing.T) { if err != nil { t.Errorf("failed to execute query: %s: %s", q3, err) } - if err := tsv.Commit(ctx, &target, tx3); err != nil { + if _, err := tsv.Commit(ctx, &target, tx3); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } close(tx3Finished) @@ -1353,7 +1353,7 @@ func TestDMLQueryWithoutWhereClause(t *testing.T) { _, txid, _, err := tsv.BeginExecute(ctx, &target, q, nil, 0, nil) require.NoError(t, err) - err = tsv.Commit(ctx, &target, txid) + _, err = tsv.Commit(ctx, &target, txid) require.NoError(t, err) } @@ -1544,7 +1544,7 @@ func TestSerializeTransactionsSameRow_ConcurrentTransactions(t *testing.T) { t.Errorf("failed to execute query: %s: %s", q1, err) } - if err := tsv.Commit(ctx, &target, tx1); err != nil { + if _, err := tsv.Commit(ctx, &target, tx1); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1563,7 +1563,7 @@ func TestSerializeTransactionsSameRow_ConcurrentTransactions(t *testing.T) { t.Errorf("failed to execute query: %s: %s", q2, err) } - if err := tsv.Commit(ctx, &target, tx2); err != nil { + if _, err := tsv.Commit(ctx, &target, tx2); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1582,7 +1582,7 @@ func TestSerializeTransactionsSameRow_ConcurrentTransactions(t *testing.T) { t.Errorf("failed to execute query: %s: %s", q3, err) } - if err := tsv.Commit(ctx, &target, tx3); err != nil { + if _, err := tsv.Commit(ctx, &target, tx3); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1679,7 +1679,7 @@ func TestSerializeTransactionsSameRow_TooManyPendingRequests(t *testing.T) { if err != nil { t.Errorf("failed to execute query: %s: %s", q1, err) } - if err := tsv.Commit(ctx, &target, tx1); err != nil { + if _, err := tsv.Commit(ctx, &target, tx1); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1863,7 +1863,7 @@ func TestSerializeTransactionsSameRow_RequestCanceled(t *testing.T) { t.Errorf("failed to execute query: %s: %s", q1, err) } - if err := tsv.Commit(ctx, &target, tx1); err != nil { + if _, err := tsv.Commit(ctx, &target, tx1); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() @@ -1900,7 +1900,7 @@ func TestSerializeTransactionsSameRow_RequestCanceled(t *testing.T) { t.Errorf("failed to execute query: %s: %s", q3, err) } - if err := tsv.Commit(ctx, &target, tx3); err != nil { + if _, err := tsv.Commit(ctx, &target, tx3); err != nil { t.Errorf("call TabletServer.Commit failed: %v", err) } }() diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 0425ed03923..21fbc8fb080 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -244,19 +244,39 @@ func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb } // Commit commits the specified transaction. -func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (string, error) { +func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Commit") defer span.Finish() conn, err := te.txPool.GetAndLock(transactionID, "for commit") if err != nil { - return "", err + return 0, "", err + } + sc, ok := conn.(*StatefulConnection) + if !ok { + return 0, "", vterrors.New(vtrpc.Code_INTERNAL, "wrong type of connection") } - defer conn.Release(tx.TxCommit) - queries, err := te.txPool.Commit(ctx, conn) + // check if coneection is tainted + // and if yes, release and renew after commit? + var newReservedID int64 + if !sc.IsTainted() { + newReservedID = 0 + defer conn.Release(tx.TxCommit) + } + queries, err := te.txPool.Commit(ctx, sc) if err != nil { - return "", err + return 0, "", err + } + if sc.IsTainted() { + err = sc.Renew() + if err != nil { + sc.Releasef("error from RenewConn:%v", err) + } else { + // must taint the new connectionID + sc.Taint() + newReservedID = sc.ConnID + } } - return queries, nil + return newReservedID, queries, nil } // Rollback rolls back the specified transaction. @@ -583,7 +603,8 @@ func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions } defer conn.Unlock() - te.taintConn(ctx, conn, preQueries) + // TODO: is it safe to ignore this error? + _ = te.taintConn(ctx, conn, preQueries) return conn.ID(), nil } diff --git a/go/vt/vttablet/tabletserver/tx_engine_test.go b/go/vt/vttablet/tabletserver/tx_engine_test.go index 4059a492de9..94c542b38fa 100644 --- a/go/vt/vttablet/tabletserver/tx_engine_test.go +++ b/go/vt/vttablet/tabletserver/tx_engine_test.go @@ -148,7 +148,7 @@ func TestTxEngineBegin(t *testing.T) { te.AcceptReadOnly() tx1, _, err := te.Begin(ctx, 0, &querypb.ExecuteOptions{}) require.NoError(t, err) - _, err = te.Commit(ctx, tx1) + _, _, err = te.Commit(ctx, tx1) require.NoError(t, err) require.Equal(t, "start transaction read only;commit", db.QueryLog()) db.ResetQueryLog() @@ -156,7 +156,7 @@ func TestTxEngineBegin(t *testing.T) { te.AcceptReadWrite() tx2, _, err := te.Begin(ctx, 0, &querypb.ExecuteOptions{}) require.NoError(t, err) - _, err = te.Commit(ctx, tx2) + _, _, err = te.Commit(ctx, tx2) require.NoError(t, err) require.Equal(t, "begin;commit", db.QueryLog()) From 75f82e3dbb95acb2da7bfed343123b8a546607a4 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 12:19:39 +0530 Subject: [PATCH 114/430] reserve-conn: removed IStatefulConnection interface and use StatefulConnection Signed-off-by: Harshit Gangal --- go/vt/vttablet/queryservice/queryservice.go | 1 - go/vt/vttablet/tabletserver/query_executor.go | 18 ++++---- .../tabletserver/stateful_connection.go | 5 ++- go/vt/vttablet/tabletserver/twopc.go | 14 +++--- go/vt/vttablet/tabletserver/tx/api.go | 45 +++---------------- go/vt/vttablet/tabletserver/tx_engine.go | 20 ++++----- go/vt/vttablet/tabletserver/tx_executor.go | 12 ++--- go/vt/vttablet/tabletserver/tx_pool.go | 14 +++--- go/vt/vttablet/tabletserver/tx_prep_pool.go | 18 ++++---- 9 files changed, 54 insertions(+), 93 deletions(-) diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 15cca12ca69..0e5529ec03c 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -46,7 +46,6 @@ type QueryService interface { Begin(ctx context.Context, target *querypb.Target, options *querypb.ExecuteOptions) (int64, *topodatapb.TabletAlias, error) // Commit commits the current transaction - // TODO: should this also take in a reservedID? Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) // Rollback aborts the current transaction diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index 1206ff4cfcd..cb49b89d377 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -22,8 +22,6 @@ import ( "strings" "time" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" - "vitess.io/vitess/go/vt/vtgate/evalengine" "golang.org/x/net/context" @@ -147,7 +145,7 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "%s unexpected plan type", qre.plan.PlanID.String()) } -func (qre *QueryExecutor) execAutocommit(f func(conn tx.IStatefulConnection) (*sqltypes.Result, error)) (reply *sqltypes.Result, err error) { +func (qre *QueryExecutor) execAutocommit(f func(conn *StatefulConnection) (*sqltypes.Result, error)) (reply *sqltypes.Result, err error) { if qre.options == nil { qre.options = &querypb.ExecuteOptions{} } @@ -163,7 +161,7 @@ func (qre *QueryExecutor) execAutocommit(f func(conn tx.IStatefulConnection) (*s return f(conn) } -func (qre *QueryExecutor) execAsTransaction(f func(conn tx.IStatefulConnection) (*sqltypes.Result, error)) (*sqltypes.Result, error) { +func (qre *QueryExecutor) execAsTransaction(f func(conn *StatefulConnection) (*sqltypes.Result, error)) (*sqltypes.Result, error) { conn, beginSQL, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0) if err != nil { return nil, err @@ -191,7 +189,7 @@ func (qre *QueryExecutor) execAsTransaction(f func(conn tx.IStatefulConnection) return result, nil } -func (qre *QueryExecutor) txConnExec(conn tx.IStatefulConnection) (*sqltypes.Result, error) { +func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result, error) { switch qre.plan.PlanID { case planbuilder.PlanInsert, planbuilder.PlanUpdate, planbuilder.PlanDelete: return qre.txFetch(conn, true) @@ -364,7 +362,7 @@ func (qre *QueryExecutor) checkAccess(authorized *tableacl.ACLResult, tableName return nil } -func (qre *QueryExecutor) execDDL(conn tx.IStatefulConnection) (*sqltypes.Result, error) { +func (qre *QueryExecutor) execDDL(conn *StatefulConnection) (*sqltypes.Result, error) { defer func() { if err := qre.tsv.se.Reload(qre.ctx); err != nil { log.Errorf("failed to reload schema %v", err) @@ -383,7 +381,7 @@ func (qre *QueryExecutor) execDDL(conn tx.IStatefulConnection) (*sqltypes.Result } // BeginAgain commits the existing transaction and begins a new one -func (*QueryExecutor) BeginAgain(ctx context.Context, dc tx.IStatefulConnection) error { +func (*QueryExecutor) BeginAgain(ctx context.Context, dc *StatefulConnection) error { if dc.IsClosed() || dc.TxProperties().Autocommit { return nil } @@ -410,7 +408,7 @@ func (qre *QueryExecutor) execNextval() (*sqltypes.Result, error) { t.SequenceInfo.Lock() defer t.SequenceInfo.Unlock() if t.SequenceInfo.NextVal == 0 || t.SequenceInfo.NextVal+inc > t.SequenceInfo.LastVal { - _, err := qre.execAsTransaction(func(conn tx.IStatefulConnection) (*sqltypes.Result, error) { + _, err := qre.execAsTransaction(func(conn *StatefulConnection) (*sqltypes.Result, error) { query := fmt.Sprintf("select next_id, cache from %s where id = 0 for update", sqlparser.String(tableName)) qr, err := qre.execSQL(conn, query, false) if err != nil { @@ -490,7 +488,7 @@ func (qre *QueryExecutor) execSelect() (*sqltypes.Result, error) { return qre.dbConnFetch(conn, qre.plan.FullQuery, qre.bindVars) } -func (qre *QueryExecutor) execDMLLimit(conn tx.IStatefulConnection) (*sqltypes.Result, error) { +func (qre *QueryExecutor) execDMLLimit(conn *StatefulConnection) (*sqltypes.Result, error) { maxrows := qre.tsv.qe.maxResultSize.Get() qre.bindVars["#maxLimit"] = sqltypes.Int64BindVariable(maxrows + 1) result, err := qre.txFetch(conn, true) @@ -602,7 +600,7 @@ func (qre *QueryExecutor) qFetch(logStats *tabletenv.LogStats, parsedQuery *sqlp } // txFetch fetches from a TxConnection. -func (qre *QueryExecutor) txFetch(conn tx.IStatefulConnection, record bool) (*sqltypes.Result, error) { +func (qre *QueryExecutor) txFetch(conn *StatefulConnection, record bool) (*sqltypes.Result, error) { sql, _, err := qre.generateFinalSQL(qre.plan.FullQuery, qre.bindVars) if err != nil { return nil, err diff --git a/go/vt/vttablet/tabletserver/stateful_connection.go b/go/vt/vttablet/tabletserver/stateful_connection.go index 612f5095f64..c1a58a23ee9 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection.go +++ b/go/vt/vttablet/tabletserver/stateful_connection.go @@ -172,6 +172,9 @@ func (sc *StatefulConnection) Stats() *tabletenv.Stats { //Taint taints the existing connection. func (sc *StatefulConnection) Taint() { + if sc.tainted { + return + } sc.tainted = true sc.dbConn.Taint() } @@ -180,5 +183,3 @@ func (sc *StatefulConnection) Taint() { func (sc *StatefulConnection) IsTainted() bool { return sc.tainted } - -var _ tx.IStatefulConnection = (*StatefulConnection)(nil) diff --git a/go/vt/vttablet/tabletserver/twopc.go b/go/vt/vttablet/tabletserver/twopc.go index df03db170e0..d990a6344a5 100644 --- a/go/vt/vttablet/tabletserver/twopc.go +++ b/go/vt/vttablet/tabletserver/twopc.go @@ -211,7 +211,7 @@ func (tpc *TwoPC) Close() { } // SaveRedo saves the statements in the redo log using the supplied connection. -func (tpc *TwoPC) SaveRedo(ctx context.Context, conn tx.IStatefulConnection, dtid string, queries []string) error { +func (tpc *TwoPC) SaveRedo(ctx context.Context, conn *StatefulConnection, dtid string, queries []string) error { bindVars := map[string]*querypb.BindVariable{ "dtid": sqltypes.StringBindVariable(dtid), "state": sqltypes.Int64BindVariable(RedoStatePrepared), @@ -242,7 +242,7 @@ func (tpc *TwoPC) SaveRedo(ctx context.Context, conn tx.IStatefulConnection, dti } // UpdateRedo changes the state of the redo log for the dtid. -func (tpc *TwoPC) UpdateRedo(ctx context.Context, conn tx.IStatefulConnection, dtid string, state int) error { +func (tpc *TwoPC) UpdateRedo(ctx context.Context, conn *StatefulConnection, dtid string, state int) error { bindVars := map[string]*querypb.BindVariable{ "dtid": sqltypes.StringBindVariable(dtid), "state": sqltypes.Int64BindVariable(int64(state)), @@ -252,7 +252,7 @@ func (tpc *TwoPC) UpdateRedo(ctx context.Context, conn tx.IStatefulConnection, d } // DeleteRedo deletes the redo log for the dtid. -func (tpc *TwoPC) DeleteRedo(ctx context.Context, conn tx.IStatefulConnection, dtid string) error { +func (tpc *TwoPC) DeleteRedo(ctx context.Context, conn *StatefulConnection, dtid string) error { bindVars := map[string]*querypb.BindVariable{ "dtid": sqltypes.StringBindVariable(dtid), } @@ -331,7 +331,7 @@ func (tpc *TwoPC) CountUnresolvedRedo(ctx context.Context, unresolvedTime time.T } // CreateTransaction saves the metadata of a 2pc transaction as Prepared. -func (tpc *TwoPC) CreateTransaction(ctx context.Context, conn tx.IStatefulConnection, dtid string, participants []*querypb.Target) error { +func (tpc *TwoPC) CreateTransaction(ctx context.Context, conn *StatefulConnection, dtid string, participants []*querypb.Target) error { bindVars := map[string]*querypb.BindVariable{ "dtid": sqltypes.StringBindVariable(dtid), "state": sqltypes.Int64BindVariable(int64(DTStatePrepare)), @@ -364,7 +364,7 @@ func (tpc *TwoPC) CreateTransaction(ctx context.Context, conn tx.IStatefulConnec // Transition performs a transition from Prepare to the specified state. // If the transaction is not a in the Prepare state, an error is returned. -func (tpc *TwoPC) Transition(ctx context.Context, conn tx.IStatefulConnection, dtid string, state querypb.TransactionState) error { +func (tpc *TwoPC) Transition(ctx context.Context, conn *StatefulConnection, dtid string, state querypb.TransactionState) error { bindVars := map[string]*querypb.BindVariable{ "dtid": sqltypes.StringBindVariable(dtid), "state": sqltypes.Int64BindVariable(int64(state)), @@ -381,7 +381,7 @@ func (tpc *TwoPC) Transition(ctx context.Context, conn tx.IStatefulConnection, d } // DeleteTransaction deletes the metadata for the specified transaction. -func (tpc *TwoPC) DeleteTransaction(ctx context.Context, conn tx.IStatefulConnection, dtid string) error { +func (tpc *TwoPC) DeleteTransaction(ctx context.Context, conn *StatefulConnection, dtid string) error { bindVars := map[string]*querypb.BindVariable{ "dtid": sqltypes.StringBindVariable(dtid), } @@ -516,7 +516,7 @@ func (tpc *TwoPC) ReadAllTransactions(ctx context.Context) ([]*tx.DistributedTx, return distributed, nil } -func (tpc *TwoPC) exec(ctx context.Context, conn tx.IStatefulConnection, pq *sqlparser.ParsedQuery, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { +func (tpc *TwoPC) exec(ctx context.Context, conn *StatefulConnection, pq *sqlparser.ParsedQuery, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { q, err := pq.GenerateQuery(bindVars, nil) if err != nil { return nil, err diff --git a/go/vt/vttablet/tabletserver/tx/api.go b/go/vt/vttablet/tabletserver/tx/api.go index fa30d54fc5b..7678d6bbd68 100644 --- a/go/vt/vttablet/tabletserver/tx/api.go +++ b/go/vt/vttablet/tabletserver/tx/api.go @@ -17,17 +17,13 @@ limitations under the License. package tx import ( - "context" "fmt" "strings" "time" - "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/servenv" - "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" ) type ( @@ -37,40 +33,13 @@ type ( //DTID as type string DTID = string - //IStatefulConnection is a connection where the user is trusted to clean things up after using the connection - IStatefulConnection interface { - // Executes a query on the connection - Exec(ctx context.Context, query string, maxrows int, wantfields bool) (*sqltypes.Result, error) - - // Release is used after we are done with the connection and will not use it again - Release(reason ReleaseReason) - - // Releasef is used after we are done with the connection and will not use it again - Releasef(format string, params ...interface{}) - - // Unlock marks the connection as not in use. The connection remains active. - Unlock() - - IsInTransaction() bool - - Close() - - IsClosed() bool - - String() string - - TxProperties() *Properties - - ID() ConnID - - UnderlyingdDBConn() *connpool.DBConn - - CleanTxState() - - Stats() *tabletenv.Stats - - //Taint taints the existing connection. - Taint() + //EngineStateMachine is used to control the state the transactional engine - + //whether new connections and/or transactions are allowed or not. + EngineStateMachine interface { + Init() error + AcceptReadWrite() error + AcceptReadOnly() error + StopGently() } // ReleaseReason as type int diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 21fbc8fb080..3d67e83ba2f 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -251,29 +251,25 @@ func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, str if err != nil { return 0, "", err } - sc, ok := conn.(*StatefulConnection) - if !ok { - return 0, "", vterrors.New(vtrpc.Code_INTERNAL, "wrong type of connection") - } // check if coneection is tainted // and if yes, release and renew after commit? var newReservedID int64 - if !sc.IsTainted() { + if !conn.IsTainted() { newReservedID = 0 defer conn.Release(tx.TxCommit) } - queries, err := te.txPool.Commit(ctx, sc) + queries, err := te.txPool.Commit(ctx, conn) if err != nil { return 0, "", err } - if sc.IsTainted() { - err = sc.Renew() + if conn.IsTainted() { + err = conn.Renew() if err != nil { - sc.Releasef("error from RenewConn:%v", err) + conn.Releasef("error from RenewConn:%v", err) } else { // must taint the new connectionID - sc.Taint() - newReservedID = sc.ConnID + conn.Taint() + newReservedID = conn.ConnID } } return newReservedID, queries, nil @@ -639,7 +635,7 @@ func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions return conn, err } -func (te *TxEngine) taintConn(ctx context.Context, conn tx.IStatefulConnection, preQueries []string) error { +func (te *TxEngine) taintConn(ctx context.Context, conn *StatefulConnection, preQueries []string) error { conn.Taint() for _, query := range preQueries { _, err := conn.Exec(ctx, query, 0 /*maxrows*/, false /*wantFields*/) diff --git a/go/vt/vttablet/tabletserver/tx_executor.go b/go/vt/vttablet/tabletserver/tx_executor.go index e5aa61132f3..50f7941211d 100644 --- a/go/vt/vttablet/tabletserver/tx_executor.go +++ b/go/vt/vttablet/tabletserver/tx_executor.go @@ -69,7 +69,7 @@ func (txe *TxExecutor) Prepare(transactionID int64, dtid string) error { return vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "prepare failed for transaction %d: %v", transactionID, err) } - return txe.inTransaction(func(localConn tx.IStatefulConnection) error { + return txe.inTransaction(func(localConn *StatefulConnection) error { return txe.te.twoPC.SaveRedo(txe.ctx, localConn, dtid, conn.TxProperties().Queries) }) @@ -166,7 +166,7 @@ func (txe *TxExecutor) RollbackPrepared(dtid string, originalID int64) error { txe.te.Rollback(txe.ctx, originalID) } }() - return txe.inTransaction(func(conn tx.IStatefulConnection) error { + return txe.inTransaction(func(conn *StatefulConnection) error { return txe.te.twoPC.DeleteRedo(txe.ctx, conn, dtid) }) } @@ -177,7 +177,7 @@ func (txe *TxExecutor) CreateTransaction(dtid string, participants []*querypb.Ta return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "2pc is not enabled") } defer txe.te.env.Stats().QueryTimings.Record("CREATE_TRANSACTION", time.Now()) - return txe.inTransaction(func(conn tx.IStatefulConnection) error { + return txe.inTransaction(func(conn *StatefulConnection) error { return txe.te.twoPC.CreateTransaction(txe.ctx, conn, dtid, participants) }) } @@ -218,7 +218,7 @@ func (txe *TxExecutor) SetRollback(dtid string, transactionID int64) error { txe.te.Rollback(txe.ctx, transactionID) } - return txe.inTransaction(func(conn tx.IStatefulConnection) error { + return txe.inTransaction(func(conn *StatefulConnection) error { return txe.te.twoPC.Transition(txe.ctx, conn, dtid, querypb.TransactionState_ROLLBACK) }) } @@ -231,7 +231,7 @@ func (txe *TxExecutor) ConcludeTransaction(dtid string) error { } defer txe.te.env.Stats().QueryTimings.Record("RESOLVE", time.Now()) - return txe.inTransaction(func(conn tx.IStatefulConnection) error { + return txe.inTransaction(func(conn *StatefulConnection) error { return txe.te.twoPC.DeleteTransaction(txe.ctx, conn, dtid) }) } @@ -260,7 +260,7 @@ func (txe *TxExecutor) ReadTwopcInflight() (distributed []*tx.DistributedTx, pre return distributed, prepared, failed, nil } -func (txe *TxExecutor) inTransaction(f func(tx.IStatefulConnection) error) error { +func (txe *TxExecutor) inTransaction(f func(*StatefulConnection) error) error { conn, _, err := txe.te.txPool.Begin(txe.ctx, &querypb.ExecuteOptions{}, false, 0) if err != nil { return err diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index 95c2cd8365f..8dd553a181e 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -149,7 +149,7 @@ func (tp *TxPool) NewTxProps(immediateCaller *querypb.VTGateCallerID, effectiveC // GetAndLock fetches the connection associated to the connID and blocks it from concurrent use // You must call Unlock on TxConnection once done. -func (tp *TxPool) GetAndLock(connID tx.ConnID, reason string) (tx.IStatefulConnection, error) { +func (tp *TxPool) GetAndLock(connID tx.ConnID, reason string) (*StatefulConnection, error) { conn, err := tp.scp.GetAndLock(connID, reason) if err != nil { return nil, vterrors.Errorf(vtrpcpb.Code_ABORTED, "transaction %d: %v", connID, err) @@ -158,7 +158,7 @@ func (tp *TxPool) GetAndLock(connID tx.ConnID, reason string) (tx.IStatefulConne } // Commit commits the transaction on the connection. -func (tp *TxPool) Commit(ctx context.Context, txConn tx.IStatefulConnection) (string, error) { +func (tp *TxPool) Commit(ctx context.Context, txConn *StatefulConnection) (string, error) { if !txConn.IsInTransaction() { return "", vterrors.New(vtrpcpb.Code_INTERNAL, "not in a transaction") } @@ -177,7 +177,7 @@ func (tp *TxPool) Commit(ctx context.Context, txConn tx.IStatefulConnection) (st } // RollbackAndRelease rolls back the transaction on the specified connection, and releases the connection when done -func (tp *TxPool) RollbackAndRelease(ctx context.Context, txConn tx.IStatefulConnection) { +func (tp *TxPool) RollbackAndRelease(ctx context.Context, txConn *StatefulConnection) { defer txConn.Release(tx.TxRollback) rollbackError := tp.Rollback(ctx, txConn) if rollbackError != nil { @@ -186,7 +186,7 @@ func (tp *TxPool) RollbackAndRelease(ctx context.Context, txConn tx.IStatefulCon } // Rollback rolls back the transaction on the specified connection. -func (tp *TxPool) Rollback(ctx context.Context, txConn tx.IStatefulConnection) error { +func (tp *TxPool) Rollback(ctx context.Context, txConn *StatefulConnection) error { span, ctx := trace.NewSpan(ctx, "TxPool.Rollback") defer span.Finish() if txConn.IsClosed() || !txConn.IsInTransaction() { @@ -208,7 +208,7 @@ func (tp *TxPool) Rollback(ctx context.Context, txConn tx.IStatefulConnection) e // the statements (if any) executed to initiate the transaction. In autocommit // mode the statement will be "". // The connection returned is locked for the callee and its responsibility is to unlock the connection. -func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reserveID int64) (tx.IStatefulConnection, string, error) { +func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reserveID int64) (*StatefulConnection, string, error) { span, ctx := trace.NewSpan(ctx, "TxPool.Begin") defer span.Finish() @@ -320,13 +320,13 @@ func (tp *TxPool) SetTimeout(timeout time.Duration) { tp.ticks.SetInterval(timeout / 10) } -func (tp *TxPool) txComplete(conn tx.IStatefulConnection, reason tx.ReleaseReason) { +func (tp *TxPool) txComplete(conn *StatefulConnection, reason tx.ReleaseReason) { tp.log(conn, reason) tp.limiter.Release(conn.TxProperties().ImmediateCaller, conn.TxProperties().EffectiveCaller) conn.CleanTxState() } -func (tp *TxPool) log(txc tx.IStatefulConnection, reason tx.ReleaseReason) { +func (tp *TxPool) log(txc *StatefulConnection, reason tx.ReleaseReason) { if txc.TxProperties() == nil { return //Nothing to log as no transaction exists on this connection. } diff --git a/go/vt/vttablet/tabletserver/tx_prep_pool.go b/go/vt/vttablet/tabletserver/tx_prep_pool.go index 1be341eef18..89547570cfc 100644 --- a/go/vt/vttablet/tabletserver/tx_prep_pool.go +++ b/go/vt/vttablet/tabletserver/tx_prep_pool.go @@ -20,8 +20,6 @@ import ( "errors" "fmt" "sync" - - "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" ) var ( @@ -34,7 +32,7 @@ var ( // is done by TxPool. type TxPreparedPool struct { mu sync.Mutex - conns map[string]tx.IStatefulConnection + conns map[string]*StatefulConnection reserved map[string]error capacity int } @@ -46,7 +44,7 @@ func NewTxPreparedPool(capacity int) *TxPreparedPool { capacity = 0 } return &TxPreparedPool{ - conns: make(map[string]tx.IStatefulConnection, capacity), + conns: make(map[string]*StatefulConnection, capacity), reserved: make(map[string]error), capacity: capacity, } @@ -54,7 +52,7 @@ func NewTxPreparedPool(capacity int) *TxPreparedPool { // Put adds the connection to the pool. It returns an error // if the pool is full or on duplicate key. -func (pp *TxPreparedPool) Put(c tx.IStatefulConnection, dtid string) error { +func (pp *TxPreparedPool) Put(c *StatefulConnection, dtid string) error { pp.mu.Lock() defer pp.mu.Unlock() if _, ok := pp.reserved[dtid]; ok { @@ -75,7 +73,7 @@ func (pp *TxPreparedPool) Put(c tx.IStatefulConnection, dtid string) error { // is in the reserved list, it means that an operator is trying // to resolve a previously failed commit. So, it removes the entry // and returns nil. -func (pp *TxPreparedPool) FetchForRollback(dtid string) tx.IStatefulConnection { +func (pp *TxPreparedPool) FetchForRollback(dtid string) *StatefulConnection { pp.mu.Lock() defer pp.mu.Unlock() if _, ok := pp.reserved[dtid]; ok { @@ -94,7 +92,7 @@ func (pp *TxPreparedPool) FetchForRollback(dtid string) tx.IStatefulConnection { // reserved list by calling Forget. If the commit failed, SetFailed // must be called. This will inform future retries that the previous // commit failed. -func (pp *TxPreparedPool) FetchForCommit(dtid string) (tx.IStatefulConnection, error) { +func (pp *TxPreparedPool) FetchForCommit(dtid string) (*StatefulConnection, error) { pp.mu.Lock() defer pp.mu.Unlock() if err, ok := pp.reserved[dtid]; ok { @@ -125,14 +123,14 @@ func (pp *TxPreparedPool) Forget(dtid string) { // FetchAll removes all connections and returns them as a list. // It also forgets all reserved dtids. -func (pp *TxPreparedPool) FetchAll() []tx.IStatefulConnection { +func (pp *TxPreparedPool) FetchAll() []*StatefulConnection { pp.mu.Lock() defer pp.mu.Unlock() - conns := make([]tx.IStatefulConnection, 0, len(pp.conns)) + conns := make([]*StatefulConnection, 0, len(pp.conns)) for _, c := range pp.conns { conns = append(conns, c) } - pp.conns = make(map[string]tx.IStatefulConnection, pp.capacity) + pp.conns = make(map[string]*StatefulConnection, pp.capacity) pp.reserved = make(map[string]error) return conns } From ad3e63163a72ddaa8732285422f104021ebaae50 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 12:24:00 +0530 Subject: [PATCH 115/430] reserve-conn: removed tainted existing tainted reserve connection on commit Signed-off-by: Harshit Gangal --- go/vt/vttablet/tabletserver/tx/api.go | 29 ++++++++++++++---------- go/vt/vttablet/tabletserver/tx_engine.go | 29 +++++++++--------------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tx/api.go b/go/vt/vttablet/tabletserver/tx/api.go index 7678d6bbd68..204a285c20c 100644 --- a/go/vt/vttablet/tabletserver/tx/api.go +++ b/go/vt/vttablet/tabletserver/tx/api.go @@ -79,6 +79,9 @@ const ( // ConnRelease - connection closed. ConnRelease + + // ConnRenewFail - reserve connection renew failed. + ConnRenewFail ) func (r ReleaseReason) String() string { @@ -91,21 +94,23 @@ func (r ReleaseReason) Name() string { } var txResolutions = map[ReleaseReason]string{ - TxClose: "closed", - TxCommit: "transaction committed", - TxRollback: "transaction rolled back", - TxKill: "kill", - ConnInitFail: "initFail", - ConnRelease: "release connection", + TxClose: "closed", + TxCommit: "transaction committed", + TxRollback: "transaction rolled back", + TxKill: "kill", + ConnInitFail: "initFail", + ConnRelease: "release connection", + ConnRenewFail: "connection renew failed", } var txNames = map[ReleaseReason]string{ - TxClose: "close", - TxCommit: "commit", - TxRollback: "rollback", - TxKill: "kill", - ConnInitFail: "initFail", - ConnRelease: "release", + TxClose: "close", + TxCommit: "commit", + TxRollback: "rollback", + TxKill: "kill", + ConnInitFail: "initFail", + ConnRelease: "release", + ConnRenewFail: "renewFail", } // RecordQuery records the query against this transaction. diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 3d67e83ba2f..3154205e9a8 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -243,7 +243,7 @@ func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb return conn.ID(), beginSQL, err } -// Commit commits the specified transaction. +// Commit commits the specified transaction and renew connection id if exists. func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Commit") defer span.Finish() @@ -251,28 +251,21 @@ func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, str if err != nil { return 0, "", err } - // check if coneection is tainted - // and if yes, release and renew after commit? - var newReservedID int64 - if !conn.IsTainted() { - newReservedID = 0 - defer conn.Release(tx.TxCommit) - } queries, err := te.txPool.Commit(ctx, conn) if err != nil { + conn.Release(tx.TxCommit) return 0, "", err } - if conn.IsTainted() { - err = conn.Renew() - if err != nil { - conn.Releasef("error from RenewConn:%v", err) - } else { - // must taint the new connectionID - conn.Taint() - newReservedID = conn.ConnID - } + if !conn.IsTainted() { + conn.Release(tx.TxCommit) + return 0, queries, nil + } + err = conn.Renew() + if err != nil { + conn.Release(tx.ConnRenewFail) + return 0, "", err } - return newReservedID, queries, nil + return conn.ConnID, queries, nil } // Rollback rolls back the specified transaction. From a6cf2d956dcdc581d0f82be40d3f05820959d69a Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 13:30:32 +0530 Subject: [PATCH 116/430] reserve-conn: added reserve connection support in rollback Signed-off-by: Harshit Gangal --- go/vt/vtcombo/tablet_map.go | 6 ++--- go/vt/vtctl/query.go | 4 +++- go/vt/vtexplain/vtexplain_vttablet.go | 2 +- go/vt/vtgate/discoverygateway_test.go | 3 ++- go/vt/vtgate/tx_conn.go | 6 +++-- go/vt/vttablet/endtoend/framework/client.go | 13 ++++++---- go/vt/vttablet/endtoend/framework/testcase.go | 3 +-- go/vt/vttablet/endtoend/reserve_test.go | 24 ++++++++++++++++--- go/vt/vttablet/endtoend/stream_test.go | 3 +-- go/vt/vttablet/endtoend/transaction_test.go | 4 ++-- go/vt/vttablet/grpcqueryservice/server.go | 5 ++-- go/vt/vttablet/grpctabletconn/conn.go | 10 ++++---- go/vt/vttablet/queryservice/queryservice.go | 2 +- go/vt/vttablet/queryservice/wrapped.go | 24 +++++++++++++------ go/vt/vttablet/sandboxconn/sandboxconn.go | 4 ++-- .../tabletconntest/fakequeryservice.go | 6 ++--- .../vttablet/tabletconntest/tabletconntest.go | 8 ++++--- go/vt/vttablet/tabletserver/tabletserver.go | 11 +++++---- .../tabletserver/tabletserver_test.go | 8 +++---- go/vt/vttablet/tabletserver/tx_engine.go | 21 ++++++++++++---- go/vt/worker/diff_utils.go | 24 ++----------------- 21 files changed, 113 insertions(+), 78 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index f110587d34a..05471ba5389 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -387,9 +387,9 @@ func (itc *internalTabletConn) Commit(ctx context.Context, target *querypb.Targe } // Rollback is part of queryservice.QueryService -func (itc *internalTabletConn) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { - err := itc.tablet.qsc.QueryService().Rollback(ctx, target, transactionID) - return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +func (itc *internalTabletConn) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { + rID, err := itc.tablet.qsc.QueryService().Rollback(ctx, target, transactionID) + return rID, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } // Prepare is part of queryservice.QueryService diff --git a/go/vt/vtctl/query.go b/go/vt/vtctl/query.go index c685d0265ab..8e5c7e52fa2 100644 --- a/go/vt/vtctl/query.go +++ b/go/vt/vtctl/query.go @@ -373,11 +373,13 @@ func commandVtTabletRollback(ctx context.Context, wr *wrangler.Wrangler, subFlag } defer conn.Close(ctx) - return conn.Rollback(ctx, &querypb.Target{ + // we do not support reserving through vtctl commands + _, err = conn.Rollback(ctx, &querypb.Target{ Keyspace: tabletInfo.Tablet.Keyspace, Shard: tabletInfo.Tablet.Shard, TabletType: tabletInfo.Tablet.Type, }, transactionID) + return err } func commandVtTabletStreamHealth(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { diff --git a/go/vt/vtexplain/vtexplain_vttablet.go b/go/vt/vtexplain/vtexplain_vttablet.go index c80dd3e620f..d558d56a4d7 100644 --- a/go/vt/vtexplain/vtexplain_vttablet.go +++ b/go/vt/vtexplain/vtexplain_vttablet.go @@ -149,7 +149,7 @@ func (t *explainTablet) Commit(ctx context.Context, target *querypb.Target, tran } // Rollback is part of the QueryService interface. -func (t *explainTablet) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (t *explainTablet) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { t.mu.Lock() t.currentTime = batchTime.Wait() t.mu.Unlock() diff --git a/go/vt/vtgate/discoverygateway_test.go b/go/vt/vtgate/discoverygateway_test.go index d5988f25fe5..1d84495bcde 100644 --- a/go/vt/vtgate/discoverygateway_test.go +++ b/go/vt/vtgate/discoverygateway_test.go @@ -87,7 +87,8 @@ func TestDiscoveryGatewayCommit(t *testing.T) { func TestDiscoveryGatewayRollback(t *testing.T) { testDiscoveryGatewayTransact(t, func(dg *DiscoveryGateway, target *querypb.Target) error { - return dg.Rollback(context.Background(), target, 1) + _, err := dg.Rollback(context.Background(), target, 1) + return err }) } diff --git a/go/vt/vtgate/tx_conn.go b/go/vt/vtgate/tx_conn.go index 98ebab3fb01..aca938c9cf8 100644 --- a/go/vt/vtgate/tx_conn.go +++ b/go/vt/vtgate/tx_conn.go @@ -97,7 +97,7 @@ func (txc *TxConn) commitShard(ctx context.Context, s *vtgatepb.Session_ShardSes if err != nil { return err } - // TODO: is it ok to ignore reservedID here? + // TODO(reserve-conn): Add logic for returned reservedID. _, err = qs.Commit(ctx, s.Target, s.TransactionId) return err } @@ -209,7 +209,9 @@ func (txc *TxConn) Rollback(ctx context.Context, session *SafeSession) error { if err != nil { return err } - return qs.Rollback(ctx, s.Target, s.TransactionId) + // TODO(reserve-conn): Add logic for returned reservedID. + _, err = qs.Rollback(ctx, s.Target, s.TransactionId) + return err }) } diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 12bcdb341a1..8de772f4e41 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -95,20 +95,25 @@ func (client *QueryClient) Begin(clientFoundRows bool) error { } // Commit commits the current transaction. -func (client *QueryClient) Commit() (int64, error) { +func (client *QueryClient) Commit() error { defer func() { client.transactionID = 0 }() rID, err := client.server.Commit(client.ctx, &client.target, client.transactionID) if err != nil { - return 0, err + return err } client.reservedID = rID - return rID, nil + return nil } // Rollback rolls back the current transaction. func (client *QueryClient) Rollback() error { defer func() { client.transactionID = 0 }() - return client.server.Rollback(client.ctx, &client.target, client.transactionID) + rID, err := client.server.Rollback(client.ctx, &client.target, client.transactionID) + if err != nil { + return err + } + client.reservedID = rID + return nil } // Prepare executes a prepare on the current transaction. diff --git a/go/vt/vttablet/endtoend/framework/testcase.go b/go/vt/vttablet/endtoend/framework/testcase.go index ebe47b219f2..61ec7713034 100644 --- a/go/vt/vttablet/endtoend/framework/testcase.go +++ b/go/vt/vttablet/endtoend/framework/testcase.go @@ -166,8 +166,7 @@ func exec(client *QueryClient, query string, bv map[string]*querypb.BindVariable case "begin": return nil, client.Begin(false) case "commit": - _, err := client.Commit() - return nil, err + return nil, client.Commit() case "rollback": return nil, client.Rollback() } diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 38eef40fedf..7c745330258 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -181,14 +181,32 @@ func TestCommitOnReserveConn(t *testing.T) { defer client.Release() oldRID := client.ReservedID() - newRID, err := client.Commit() + err = client.Commit() require.NoError(t, err) - assert.Equal(t, newRID, client.ReservedID(), "returned and saved reservedID must be the same") assert.NotEqual(t, client.ReservedID(), oldRID, "reservedID must change after commit") assert.EqualValues(t, 0, client.TransactionID(), "transactionID should be 0 after commit") qr2, err := client.Execute(query, nil) require.NoError(t, err) assert.Equal(t, qr1.Rows, qr2.Rows) - // TODO test that new connection obtained after Commit has been tainted correctly +} + +func TestRollbackOnReserveConn(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qr1, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + oldRID := client.ReservedID() + err = client.Rollback() + require.NoError(t, err) + assert.NotEqual(t, client.ReservedID(), oldRID, "reservedID must change after rollback") + assert.EqualValues(t, 0, client.TransactionID(), "transactionID should be 0 after commit") + + qr2, err := client.Execute(query, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) } diff --git a/go/vt/vttablet/endtoend/stream_test.go b/go/vt/vttablet/endtoend/stream_test.go index a6920167fa8..ff47e2d2158 100644 --- a/go/vt/vttablet/endtoend/stream_test.go +++ b/go/vt/vttablet/endtoend/stream_test.go @@ -148,8 +148,7 @@ func populateBigData(client *framework.QueryClient) error { return err } } - _, err = client.Commit() - return err + return client.Commit() } func TestStreamError(t *testing.T) { diff --git a/go/vt/vttablet/endtoend/transaction_test.go b/go/vt/vttablet/endtoend/transaction_test.go index 4141c3e3769..e588ea03bb2 100644 --- a/go/vt/vttablet/endtoend/transaction_test.go +++ b/go/vt/vttablet/endtoend/transaction_test.go @@ -50,7 +50,7 @@ func TestCommit(t *testing.T) { _, err = client.Execute(query, nil) require.NoError(t, err) - _, err = client.Commit() + err = client.Commit() require.NoError(t, err) qr, err := client.Execute("select * from vitess_test", nil) @@ -244,7 +244,7 @@ func TestForUpdate(t *testing.T) { require.NoError(t, err) _, err = client.Execute(query, nil) require.NoError(t, err) - _, err = client.Commit() + err = client.Commit() require.NoError(t, err) } } diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index 5ac37c60700..3e4c3192887 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -126,11 +126,12 @@ func (q *query) Rollback(ctx context.Context, request *querypb.RollbackRequest) request.EffectiveCallerId, request.ImmediateCallerId, ) - if err := q.server.Rollback(ctx, request.Target, request.TransactionId); err != nil { + rID, err := q.server.Rollback(ctx, request.Target, request.TransactionId) + if err != nil { return nil, vterrors.ToGRPC(err) } - return &querypb.RollbackResponse{}, nil + return &querypb.RollbackResponse{ReservedId: rID}, nil } // Prepare is part of the queryservice.QueryServer interface diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index f540991e13b..3963223e539 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -246,11 +246,11 @@ func (conn *gRPCQueryClient) Commit(ctx context.Context, target *querypb.Target, } // Rollback rolls back the ongoing transaction. -func (conn *gRPCQueryClient) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (conn *gRPCQueryClient) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { - return tabletconn.ConnClosed + return 0, tabletconn.ConnClosed } req := &querypb.RollbackRequest{ @@ -259,11 +259,11 @@ func (conn *gRPCQueryClient) Rollback(ctx context.Context, target *querypb.Targe ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), TransactionId: transactionID, } - _, err := conn.c.Rollback(ctx, req) + resp, err := conn.c.Rollback(ctx, req) if err != nil { - return tabletconn.ErrorFromGRPC(err) + return 0, tabletconn.ErrorFromGRPC(err) } - return nil + return resp.ReservedId, nil } // Prepare executes a Prepare on the ongoing transaction. diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 0e5529ec03c..6bf85c17312 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -49,7 +49,7 @@ type QueryService interface { Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) // Rollback aborts the current transaction - Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error + Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) // Prepare prepares the specified transaction. Prepare(ctx context.Context, target *querypb.Target, transactionID int64, dtid string) (err error) diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 3f385077264..282eca292f3 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -93,20 +93,30 @@ func (ws *wrappedService) Begin(ctx context.Context, target *querypb.Target, opt return transactionID, alias, err } -func (ws *wrappedService) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (reservedID int64, err error) { - err = ws.wrapper(ctx, target, ws.impl, "Commit", true, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { +func (ws *wrappedService) Commit(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { + var rID int64 + err := ws.wrapper(ctx, target, ws.impl, "Commit", true, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error - reservedID, innerErr = conn.Commit(ctx, target, transactionID) + rID, innerErr = conn.Commit(ctx, target, transactionID) return canRetry(ctx, innerErr), innerErr }) - return reservedID, err + if err != nil { + return 0, err + } + return rID, nil } -func (ws *wrappedService) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { - return ws.wrapper(ctx, target, ws.impl, "Rollback", true, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { - innerErr := conn.Rollback(ctx, target, transactionID) +func (ws *wrappedService) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { + var rID int64 + err := ws.wrapper(ctx, target, ws.impl, "Rollback", true, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + var innerErr error + rID, innerErr = conn.Rollback(ctx, target, transactionID) return canRetry(ctx, innerErr), innerErr }) + if err != nil { + return 0, err + } + return rID, nil } func (ws *wrappedService) Prepare(ctx context.Context, target *querypb.Target, transactionID int64, dtid string) error { diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 2f60eb9adad..5e70d509193 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -193,9 +193,9 @@ func (sbc *SandboxConn) Commit(ctx context.Context, target *querypb.Target, tran } // Rollback is part of the QueryService interface. -func (sbc *SandboxConn) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (sbc *SandboxConn) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { sbc.RollbackCount.Add(1) - return sbc.getError() + return 0, sbc.getError() } // Prepare prepares the specified transaction. diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index ed7bd7bfd61..b7d72663551 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -175,9 +175,9 @@ func (f *FakeQueryService) Commit(ctx context.Context, target *querypb.Target, t const rollbackTransactionID int64 = 999044 // Rollback is part of the queryservice.QueryService interface -func (f *FakeQueryService) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) error { +func (f *FakeQueryService) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (int64, error) { if f.HasError { - return f.TabletError + return 0, f.TabletError } if f.Panics { panic(fmt.Errorf("test-triggered panic")) @@ -186,7 +186,7 @@ func (f *FakeQueryService) Rollback(ctx context.Context, target *querypb.Target, if transactionID != rollbackTransactionID { f.t.Errorf("Rollback: invalid TransactionId: got %v expected %v", transactionID, rollbackTransactionID) } - return nil + return 0, nil } // Dtid is a test dtid diff --git a/go/vt/vttablet/tabletconntest/tabletconntest.go b/go/vt/vttablet/tabletconntest/tabletconntest.go index bc6e4952979..782a399747e 100644 --- a/go/vt/vttablet/tabletconntest/tabletconntest.go +++ b/go/vt/vttablet/tabletconntest/tabletconntest.go @@ -160,7 +160,7 @@ func testRollback(t *testing.T, conn queryservice.QueryService, f *FakeQueryServ t.Log("testRollback") ctx := context.Background() ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) - err := conn.Rollback(ctx, TestTarget, rollbackTransactionID) + _, err := conn.Rollback(ctx, TestTarget, rollbackTransactionID) if err != nil { t.Fatalf("Rollback failed: %v", err) } @@ -170,7 +170,8 @@ func testRollbackError(t *testing.T, conn queryservice.QueryService, f *FakeQuer t.Log("testRollbackError") f.HasError = true testErrorHelper(t, f, "Rollback", func(ctx context.Context) error { - return conn.Rollback(ctx, TestTarget, commitTransactionID) + _, err := conn.Rollback(ctx, TestTarget, commitTransactionID) + return err }) f.HasError = false } @@ -178,7 +179,8 @@ func testRollbackError(t *testing.T, conn queryservice.QueryService, f *FakeQuer func testRollbackPanics(t *testing.T, conn queryservice.QueryService, f *FakeQueryService) { t.Log("testRollbackPanics") testPanicHelper(t, f, "Rollback", func(ctx context.Context) error { - return conn.Rollback(ctx, TestTarget, rollbackTransactionID) + _, err := conn.Rollback(ctx, TestTarget, rollbackTransactionID) + return err }) } diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 7244246d50b..55e60b9c013 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -808,17 +808,19 @@ func (tsv *TabletServer) Commit(ctx context.Context, target *querypb.Target, tra } // Rollback rollsback the specified transaction. -func (tsv *TabletServer) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (err error) { - return tsv.execRequest( +func (tsv *TabletServer) Rollback(ctx context.Context, target *querypb.Target, transactionID int64) (newReservedID int64, err error) { + err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "Rollback", "rollback", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { defer tsv.stats.QueryTimings.Record("ROLLBACK", time.Now()) logStats.TransactionID = transactionID - return tsv.te.Rollback(ctx, transactionID) + newReservedID, err = tsv.te.Rollback(ctx, transactionID) + return err }, ) + return newReservedID, err } // Prepare prepares the specified transaction. @@ -1449,7 +1451,8 @@ func (tsv *TabletServer) Release(ctx context.Context, target *querypb.Target, co } // Rollback to cleanup the transaction before returning to the pool. logStats.TransactionID = txID - return tsv.te.Rollback(ctx, txID) + _, err := tsv.te.Rollback(ctx, txID) + return err }, ) } diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index ba9426c8a7f..a654b4632c4 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -459,14 +459,14 @@ func TestBeginOnReplica(t *testing.T) { txID, alias, err := tsv.Begin(ctx, &target1, &options) require.NoError(t, err, "failed to create read only tx on replica") assert.Equal(t, tsv.alias, *alias, "Wrong tablet alias from Begin") - err = tsv.Rollback(ctx, &target1, txID) + _, err = tsv.Rollback(ctx, &target1, txID) require.NoError(t, err, "failed to rollback read only tx") // test that we can still create transactions even in read-only mode options = querypb.ExecuteOptions{} txID, _, err = tsv.Begin(ctx, &target1, &options) require.NoError(t, err, "expected write tx to be allowed") - err = tsv.Rollback(ctx, &target1, txID) + _, err = tsv.Rollback(ctx, &target1, txID) require.NoError(t, err) } @@ -818,7 +818,7 @@ func TestTabletServerCommitRollbackFail(t *testing.T) { if err == nil || err.Error() != want { t.Fatalf("Commit err: %v, want %v", err, want) } - err = tsv.Rollback(ctx, &target, -1) + _, err = tsv.Rollback(ctx, &target, -1) if err == nil || err.Error() != want { t.Fatalf("Commit err: %v, want %v", err, want) } @@ -854,7 +854,7 @@ func TestTabletServerRollback(t *testing.T) { if _, err := tsv.Execute(ctx, &target, executeSQL, nil, transactionID, 0, nil); err != nil { t.Fatalf("failed to execute query: %s: %v", executeSQL, err) } - if err := tsv.Rollback(ctx, &target, transactionID); err != nil { + if _, err := tsv.Rollback(ctx, &target, transactionID); err != nil { t.Fatalf("call TabletServer.Rollback failed: %v", err) } } diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 3154205e9a8..1b7c6934cbf 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -269,16 +269,29 @@ func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, str } // Rollback rolls back the specified transaction. -func (te *TxEngine) Rollback(ctx context.Context, transactionID int64) error { +func (te *TxEngine) Rollback(ctx context.Context, transactionID int64) (int64, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Rollback") defer span.Finish() conn, err := te.txPool.GetAndLock(transactionID, "for rollback") if err != nil { - return err + return 0, err + } + err = te.txPool.Rollback(ctx, conn) + if err != nil { + conn.Release(tx.TxRollback) + return 0, err + } + if !conn.IsTainted() { + conn.Release(tx.TxRollback) + return 0, nil + } + err = conn.Renew() + if err != nil { + conn.Release(tx.ConnRenewFail) + return 0, err } - defer conn.Release(tx.TxRollback) - return te.txPool.Rollback(ctx, conn) + return conn.ConnID, nil } func (te *TxEngine) unknownStateError() error { diff --git a/go/vt/worker/diff_utils.go b/go/vt/worker/diff_utils.go index 4084b598768..685b470afa7 100644 --- a/go/vt/worker/diff_utils.go +++ b/go/vt/worker/diff_utils.go @@ -130,27 +130,6 @@ func NewTransactionalQueryResultReaderForTablet(ctx context.Context, ts *topo.Se }, nil } -// RollbackTransaction rolls back the transaction -func RollbackTransaction(ctx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, txID int64) error { - shortCtx, cancel := context.WithTimeout(ctx, *remoteActionsTimeout) - tablet, err := ts.GetTablet(shortCtx, tabletAlias) - cancel() - if err != nil { - return err - } - - conn, err := tabletconn.GetDialer()(tablet.Tablet, grpcclient.FailFast(false)) - if err != nil { - return err - } - - return conn.Rollback(ctx, &querypb.Target{ - Keyspace: tablet.Tablet.Keyspace, - Shard: tablet.Tablet.Shard, - TabletType: tablet.Tablet.Type, - }, txID) -} - // Next returns the next result on the stream. It implements ResultReader. func (qrr *QueryResultReader) Next() (*sqltypes.Result, error) { return qrr.output.Recv() @@ -675,7 +654,8 @@ func createTransactions(ctx context.Context, numberOfScanners int, wr *wrangler. if err != nil { return err } - return queryService.Rollback(ctx, target, tx) + _, err = queryService.Rollback(ctx, target, tx) + return err }) scanners[i] = tx From 9cf470354583270d134e3d5907d3b20895ade76f Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Wed, 17 Jun 2020 12:28:09 +0200 Subject: [PATCH 117/430] Added endtoend tests Signed-off-by: Andres Taylor --- go/vt/vttablet/endtoend/framework/client.go | 10 ++ go/vt/vttablet/endtoend/reserve_test.go | 139 +++++++++++++++++++- go/vt/vttablet/tabletserver/tx_engine.go | 41 +++--- 3 files changed, 166 insertions(+), 24 deletions(-) diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 8de772f4e41..768225bf68b 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -332,3 +332,13 @@ func (client *QueryClient) TransactionID() int64 { func (client *QueryClient) ReservedID() int64 { return client.reservedID } + +//SetTransactionID does what it says +func (client *QueryClient) SetTransactionID(id int64) { + client.transactionID = id +} + +//SetReservedID does what it says +func (client *QueryClient) SetReservedID(id int64) { + client.reservedID = id +} diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 7c745330258..2270bec9a41 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -91,7 +91,7 @@ func TestDifferentConnIDOnMultipleReserve(t *testing.T) { //} } -func TestTransactionOnReserveConn(t *testing.T) { +func TestReserveBeginRelease(t *testing.T) { client := framework.NewClient() query := "select connection_id()" @@ -104,6 +104,25 @@ func TestTransactionOnReserveConn(t *testing.T) { require.NoError(t, err) assert.Equal(t, qr1.Rows, qr2.Rows) assert.Equal(t, client.ReservedID(), client.TransactionID()) + + require.NoError(t, client.Release()) +} + +func TestBeginReserveRelease(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qr1, err := client.BeginExecute(query, nil) + require.NoError(t, err) + defer client.Release() + + qr2, err := client.BeginExecute(query, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) + assert.Equal(t, client.ReservedID(), client.TransactionID()) + + require.NoError(t, client.Release()) } func TestReserveBeginExecute(t *testing.T) { @@ -116,6 +135,7 @@ func TestReserveBeginExecute(t *testing.T) { require.NoError(t, err) defer func() { if client1.ReservedID() != 0 { + t.Error("should not be reserved after release") _ = client1.Release() } }() @@ -123,6 +143,7 @@ func TestReserveBeginExecute(t *testing.T) { require.NoError(t, err) defer func() { if client2.ReservedID() != 0 { + t.Error("should not be reserved after release") _ = client2.Release() } }() @@ -210,3 +231,119 @@ func TestRollbackOnReserveConn(t *testing.T) { require.NoError(t, err) assert.Equal(t, qr1.Rows, qr2.Rows) } + +func TestReserveBeginRollbackAndBeginCommitAgain(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qr1, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + oldRID := client.ReservedID() + err = client.Rollback() + require.NoError(t, err) + assert.EqualValues(t, 0, client.TransactionID(), "transactionID should be 0 after rollback") + assert.NotEqual(t, client.ReservedID(), oldRID, "reservedID must change after rollback") + + oldRID = client.ReservedID() + + qr2, err := client.BeginExecute(query, nil) + require.NoError(t, err) + + err = client.Commit() + require.NoError(t, err) + assert.EqualValues(t, 0, client.TransactionID(), "transactionID should be 0 after commit") + assert.NotEqual(t, client.ReservedID(), oldRID, "reservedID must change after rollback") + + qr3, err := client.Execute(query, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) + assert.Equal(t, qr2.Rows, qr3.Rows) + + require.NoError(t, + client.Release()) +} + +func TestReserveBeginCommitTryToReuseTxID(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + _, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + oldTxID := client.TransactionID() + + err = client.Commit() + require.NoError(t, err) + + client.SetTransactionID(oldTxID) + + _, err = client.Execute(query, nil) + require.Error(t, err) + require.NoError(t, + client.Release()) +} + +func TestReserveBeginRollbackTryToReuseTxID(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + _, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + oldTxID := client.TransactionID() + + err = client.Rollback() + require.NoError(t, err) + + client.SetTransactionID(oldTxID) + + _, err = client.Execute(query, nil) + require.Error(t, err) + require.NoError(t, + client.Release()) +} + +func TestReserveReleaseAndTryToUseReservedIDAgain(t *testing.T) { + client := framework.NewClient() + + query := "select 42" + + _, err := client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + + rID := client.ReservedID() + require.NoError(t, + client.Release()) + + client.SetReservedID(rID) + + _, err = client.Execute(query, nil) + require.Error(t, err) +} + +func TestReserveAndTryToRunTwiceConcurrently(t *testing.T) { + client := framework.NewClient() + + query := "select 42" + + _, err := client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + defer client.Release() + + go func() { + _, err = client.Execute("select sleep(1)", nil) + }() + + _, err2 := client.Execute("select sleep(1)", nil) + + if err == nil && err2 == nil { + assert.Fail(t, "at least one execution should fail") + } +} diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 1b7c6934cbf..63094e9c02e 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -247,25 +247,14 @@ func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Commit") defer span.Finish() - conn, err := te.txPool.GetAndLock(transactionID, "for commit") - if err != nil { - return 0, "", err - } - queries, err := te.txPool.Commit(ctx, conn) - if err != nil { - conn.Release(tx.TxCommit) - return 0, "", err - } - if !conn.IsTainted() { - conn.Release(tx.TxCommit) - return 0, queries, nil - } - err = conn.Renew() - if err != nil { - conn.Release(tx.ConnRenewFail) - return 0, "", err - } - return conn.ConnID, queries, nil + var query string + var err error + rID, err := te.txFinish(transactionID, tx.TxCommit, func(conn *StatefulConnection) error { + query, err = te.txPool.Commit(ctx, conn) + return err + }) + + return rID, query, err } // Rollback rolls back the specified transaction. @@ -273,17 +262,23 @@ func (te *TxEngine) Rollback(ctx context.Context, transactionID int64) (int64, e span, ctx := trace.NewSpan(ctx, "TxEngine.Rollback") defer span.Finish() - conn, err := te.txPool.GetAndLock(transactionID, "for rollback") + return te.txFinish(transactionID, tx.TxRollback, func(conn *StatefulConnection) error { + return te.txPool.Rollback(ctx, conn) + }) +} + +func (te *TxEngine) txFinish(transactionID int64, reason tx.ReleaseReason, f func(*StatefulConnection) error) (int64, error) { + conn, err := te.txPool.GetAndLock(transactionID, reason.String()) if err != nil { return 0, err } - err = te.txPool.Rollback(ctx, conn) + err = f(conn) if err != nil { - conn.Release(tx.TxRollback) + conn.Release(reason) return 0, err } if !conn.IsTainted() { - conn.Release(tx.TxRollback) + conn.Release(reason) return 0, nil } err = conn.Renew() From f2d4b9aadf9010b86e59284f16192752d8356fc8 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 17:39:44 +0530 Subject: [PATCH 118/430] reserve-conn: added unhappy test related to using old reservedID Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/reserve_test.go | 224 +++++++++++++++++++----- 1 file changed, 179 insertions(+), 45 deletions(-) diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 2270bec9a41..31d992145a8 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -18,6 +18,7 @@ package endtoend import ( "fmt" + "sync" "testing" "github.com/stretchr/testify/assert" @@ -28,7 +29,7 @@ import ( //TODO: Add Counter checks in all the tests. -func TestDifferentConnIDOnMultipleReserve(t *testing.T) { +func TestMultipleReserveHaveDifferentConnection(t *testing.T) { client1 := framework.NewClient() client2 := framework.NewClient() @@ -51,44 +52,6 @@ func TestDifferentConnIDOnMultipleReserve(t *testing.T) { require.Equal(t, qrc1_1.Rows, qrc1_2.Rows) require.Equal(t, qrc2_1.Rows, qrc2_2.Rows) - //expectedDiffs := []struct { - // tag string - // diff int - //}{{ - // tag: "Release/TotalCount", - // diff: 2, - //}, { - // tag: "Transactions/Histograms/commit/Count", - // diff: 2, - //}, { - // tag: "Queries/TotalCount", - // diff: 4, - //}, { - // tag: "Queries/Histograms/BEGIN/Count", - // diff: 0, - //}, { - // tag: "Queries/Histograms/COMMIT/Count", - // diff: 0, - //}, { - // tag: "Queries/Histograms/Insert/Count", - // diff: 1, - //}, { - // tag: "Queries/Histograms/DeleteLimit/Count", - // diff: 1, - //}, { - // tag: "Queries/Histograms/Select/Count", - // diff: 2, - //}} - //vend := framework.DebugVars() - //for _, expected := range expectedDiffs { - // got := framework.FetchInt(vend, expected.tag) - // want := framework.FetchInt(vstart, expected.tag) + expected.diff - // // It's possible that other house-keeping transactions (like messaging) - // // can happen during this test. So, don't perform equality comparisons. - // if got < want { - // t.Errorf("%s: %d, must be at least %d", expected.tag, got, want) - // } - //} } func TestReserveBeginRelease(t *testing.T) { @@ -117,7 +80,7 @@ func TestBeginReserveRelease(t *testing.T) { require.NoError(t, err) defer client.Release() - qr2, err := client.BeginExecute(query, nil) + qr2, err := client.ReserveExecute(query, nil, nil) require.NoError(t, err) assert.Equal(t, qr1.Rows, qr2.Rows) assert.Equal(t, client.ReservedID(), client.TransactionID()) @@ -266,7 +229,7 @@ func TestReserveBeginRollbackAndBeginCommitAgain(t *testing.T) { client.Release()) } -func TestReserveBeginCommitTryToReuseTxID(t *testing.T) { +func TestReserveBeginCommitFailToReuseTxID(t *testing.T) { client := framework.NewClient() query := "select connection_id()" @@ -288,7 +251,7 @@ func TestReserveBeginCommitTryToReuseTxID(t *testing.T) { client.Release()) } -func TestReserveBeginRollbackTryToReuseTxID(t *testing.T) { +func TestReserveBeginRollbackFailToReuseTxID(t *testing.T) { client := framework.NewClient() query := "select connection_id()" @@ -310,7 +273,54 @@ func TestReserveBeginRollbackTryToReuseTxID(t *testing.T) { client.Release()) } -func TestReserveReleaseAndTryToUseReservedIDAgain(t *testing.T) { +func TestReserveBeginCommitFailToReuseOldReservedID(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + _, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + + oldRID := client.ReservedID() + + err = client.Commit() + require.NoError(t, err) + newRID := client.ReservedID() + + client.SetReservedID(oldRID) + + _, err = client.Execute(query, nil) + require.Error(t, err) + + client.SetReservedID(newRID) + require.NoError(t, + client.Release()) +} + +func TestReserveBeginRollbackFailToReuseOldReservedID(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + _, err := client.ReserveBeginExecute(query, nil, nil) + require.NoError(t, err) + + oldRID := client.ReservedID() + + err = client.Rollback() + require.NoError(t, err) + newRID := client.ReservedID() + + client.SetReservedID(oldRID) + _, err = client.Execute(query, nil) + require.Error(t, err) + + client.SetReservedID(newRID) + require.NoError(t, + client.Release()) +} + +func TestReserveReleaseAndFailToUseReservedIDAgain(t *testing.T) { client := framework.NewClient() query := "select 42" @@ -328,7 +338,7 @@ func TestReserveReleaseAndTryToUseReservedIDAgain(t *testing.T) { require.Error(t, err) } -func TestReserveAndTryToRunTwiceConcurrently(t *testing.T) { +func TestReserveAndFailToRunTwiceConcurrently(t *testing.T) { client := framework.NewClient() query := "select 42" @@ -337,13 +347,137 @@ func TestReserveAndTryToRunTwiceConcurrently(t *testing.T) { require.NoError(t, err) defer client.Release() + // WaitGroup will make defer call to wait for go func to complete. + wg := &sync.WaitGroup{} + wg.Add(1) go func() { _, err = client.Execute("select sleep(1)", nil) + wg.Done() }() - _, err2 := client.Execute("select sleep(1)", nil) + wg.Wait() if err == nil && err2 == nil { assert.Fail(t, "at least one execution should fail") } } + +func TestBeginReserveCommitAndNewTransactionsOnSameReservedID(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qrTx, err := client.BeginExecute(query, nil) + require.NoError(t, err) + + qrRID, err := client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + require.Equal(t, qrTx.Rows, qrRID.Rows) + + err = client.Commit() + require.NoError(t, err) + + qrTx, err = client.BeginExecute(query, nil) + require.NoError(t, err) + require.Equal(t, qrTx.Rows, qrRID.Rows) + + err = client.Commit() + require.NoError(t, err) + + qrTx, err = client.BeginExecute(query, nil) + require.NoError(t, err) + require.Equal(t, qrTx.Rows, qrRID.Rows) + + err = client.Rollback() + require.NoError(t, err) + + require.NoError(t, + client.Release()) +} + +func TestBeginReserveRollbackAndNewTransactionsOnSameReservedID(t *testing.T) { + client := framework.NewClient() + + query := "select connection_id()" + + qrTx, err := client.BeginExecute(query, nil) + require.NoError(t, err) + + qrRID, err := client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + require.Equal(t, qrTx.Rows, qrRID.Rows) + + err = client.Rollback() + require.NoError(t, err) + + qrTx, err = client.BeginExecute(query, nil) + require.NoError(t, err) + require.Equal(t, qrTx.Rows, qrRID.Rows) + + err = client.Commit() + require.NoError(t, err) + + qrTx, err = client.BeginExecute(query, nil) + require.NoError(t, err) + require.Equal(t, qrTx.Rows, qrRID.Rows) + + err = client.Rollback() + require.NoError(t, err) + + require.NoError(t, + client.Release()) +} + +func TestBeginReserveReleaseAndFailToUseReservedIDAndTxIDAgain(t *testing.T) { + client := framework.NewClient() + + query := "select 42" + + _, err := client.BeginExecute(query, nil) + require.NoError(t, err) + + _, err = client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + + rID := client.ReservedID() + txID := client.TransactionID() + + require.NoError(t, + client.Release()) + + client.SetReservedID(rID) + _, err = client.Execute(query, nil) + require.Error(t, err) + + client.SetReservedID(0) + client.SetTransactionID(txID) + _, err = client.Execute(query, nil) + require.Error(t, err) +} + +func TestReserveBeginReleaseAndFailToUseReservedIDAndTxIDAgain(t *testing.T) { + client := framework.NewClient() + + query := "select 42" + + _, err := client.ReserveExecute(query, nil, nil) + require.NoError(t, err) + + _, err = client.BeginExecute(query, nil) + require.NoError(t, err) + + rID := client.ReservedID() + txID := client.TransactionID() + + require.NoError(t, + client.Release()) + + client.SetReservedID(rID) + _, err = client.Execute(query, nil) + require.Error(t, err) + + client.SetReservedID(0) + client.SetTransactionID(txID) + _, err = client.Execute(query, nil) + require.Error(t, err) +} From 11b03263bf1889117508aa4e4134e38e0895c532 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 18:08:05 +0530 Subject: [PATCH 119/430] reserve-conn: added test that checks connection on failed execute query Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/framework/client.go | 8 +- go/vt/vttablet/endtoend/reserve_test.go | 91 +++++++++++++++++++++ 2 files changed, 95 insertions(+), 4 deletions(-) diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 768225bf68b..e2d67dc7128 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -183,10 +183,10 @@ func (client *QueryClient) BeginExecute(query string, bindvars map[string]*query client.reservedID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, ) + client.transactionID = transactionID if err != nil { return nil, err } - client.transactionID = transactionID return qr, nil } @@ -281,10 +281,10 @@ func (client *QueryClient) ReserveExecute(query string, preQueries []string, bin return nil, errors.New("already reserved a connection") } qr, reservedID, _, err := client.server.ReserveExecute(client.ctx, &client.target, query, preQueries, bindvars, client.transactionID, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}) + client.reservedID = reservedID if err != nil { return nil, err } - client.reservedID = reservedID return qr, nil } @@ -304,11 +304,11 @@ func (client *QueryClient) ReserveBeginExecute(query string, preQueries []string bindvars, &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, ) + client.transactionID = transactionID + client.reservedID = reservedID if err != nil { return nil, err } - client.transactionID = transactionID - client.reservedID = reservedID return qr, nil } diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 31d992145a8..062f646c250 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -481,3 +481,94 @@ func TestReserveBeginReleaseAndFailToUseReservedIDAndTxIDAgain(t *testing.T) { _, err = client.Execute(query, nil) require.Error(t, err) } + +func TestReserveExecuteWithFailingQueryAndReserveConnectionRemainsOpen(t *testing.T) { + client := framework.NewClient() + + _, err := client.ReserveExecute("select foo", nil, nil) + require.Error(t, err) + defer client.Release() + require.NotEqual(t, int64(0), client.ReservedID()) + + _, err = client.Execute("select 42", nil) + require.NoError(t, err) + require.NoError(t, client.Release()) +} + +func TestReserveAndExecuteWithFailingQueryAndReserveConnectionRemainsOpen(t *testing.T) { + client := framework.NewClient() + + qr1, err := client.ReserveExecute("select connection_id()", nil, nil) + require.NoError(t, err) + defer client.Release() + + _, err = client.Execute("select foo", nil) + require.Error(t, err) + + qr2, err := client.Execute("select connection_id()", nil) + require.NoError(t, err) + require.Equal(t, qr1.Rows, qr2.Rows) + require.NoError(t, client.Release()) +} + +func TestReserveBeginExecuteWithFailingQueryAndReserveConnAndTxRemainsOpen(t *testing.T) { + client := framework.NewClient() + + _, err := client.ReserveBeginExecute("select foo", nil, nil) + require.Error(t, err) + + // Save the connection id to check in the end that everything got executed on same connection. + qr1, err := client.Execute("select connection_id()", nil) + require.NoError(t, err) + + _, err = client.Execute("insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)", nil) + require.NoError(t, err) + + qr, err := client.Execute("select intval from vitess_test", nil) + require.NoError(t, err) + assert.Equal(t, "[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)]]", fmt.Sprintf("%v", qr.Rows)) + + err = client.Rollback() + require.NoError(t, err) + + qr, err = client.Execute("select intval from vitess_test", nil) + require.NoError(t, err) + assert.Equal(t, "[[INT32(1)] [INT32(2)] [INT32(3)]]", fmt.Sprintf("%v", qr.Rows)) + + qr2, err := client.Execute("select connection_id()", nil) + require.NoError(t, err) + require.Equal(t, qr1.Rows, qr2.Rows) + + require.NoError(t, client.Release()) +} + +func TestReserveAndBeginExecuteWithFailingQueryAndReserveConnAndTxRemainsOpen(t *testing.T) { + client := framework.NewClient() + + // Save the connection id to check in the end that everything got executed on same connection. + qr1, err := client.ReserveExecute("select connection_id()", nil, nil) + require.NoError(t, err) + + _, err = client.BeginExecute("select foo", nil) + require.Error(t, err) + + _, err = client.Execute("insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)", nil) + require.NoError(t, err) + + qr, err := client.Execute("select intval from vitess_test", nil) + require.NoError(t, err) + assert.Equal(t, "[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)]]", fmt.Sprintf("%v", qr.Rows)) + + err = client.Rollback() + require.NoError(t, err) + + qr, err = client.Execute("select intval from vitess_test", nil) + require.NoError(t, err) + assert.Equal(t, "[[INT32(1)] [INT32(2)] [INT32(3)]]", fmt.Sprintf("%v", qr.Rows)) + + qr2, err := client.Execute("select connection_id()", nil) + require.NoError(t, err) + require.Equal(t, qr1.Rows, qr2.Rows) + + require.NoError(t, client.Release()) +} From 5f691140a8f0ce23c28601f23c6466e218e2b1e1 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 19:30:33 +0530 Subject: [PATCH 120/430] reserve-conn: added preQueries endtoend test on reserveExecute and reserveBeginExecute Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/reserve_test.go | 102 ++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 062f646c250..cbaa714b9db 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -572,3 +572,105 @@ func TestReserveAndBeginExecuteWithFailingQueryAndReserveConnAndTxRemainsOpen(t require.NoError(t, client.Release()) } + +func TestReserveExecuteWithPreQueriesAndCheckConnection(t *testing.T) { + client1 := framework.NewClient() + client2 := framework.NewClient() + + selQuery := "select str_to_date('00/00/0000', '%m/%d/%Y')" + warnQuery := "show warnings" + preQueries1 := []string{ + "set sql_mode = ''", + } + preQueries2 := []string{ + "set sql_mode = 'NO_ZERO_DATE'", + } + + qr1, err := client1.ReserveExecute(selQuery, preQueries1, nil) + require.NoError(t, err) + defer client1.Release() + + qr2, err := client2.ReserveExecute(selQuery, preQueries2, nil) + require.NoError(t, err) + defer client2.Release() + + assert.NotEqual(t, qr1.Rows, qr2.Rows) + assert.Equal(t, `[[DATE("0000-00-00")]]`, fmt.Sprintf("%v", qr1.Rows)) + assert.Equal(t, `[[NULL]]`, fmt.Sprintf("%v", qr2.Rows)) + + qr1, err = client1.Execute(warnQuery, nil) + require.NoError(t, err) + + qr2, err = client2.Execute(warnQuery, nil) + require.NoError(t, err) + + assert.NotEqual(t, qr1.Rows, qr2.Rows) + assert.Equal(t, `[]`, fmt.Sprintf("%v", qr1.Rows)) + assert.Equal(t, `[[VARCHAR("Warning") UINT32(1411) VARCHAR("Incorrect datetime value: '00/00/0000' for function str_to_date")]]`, fmt.Sprintf("%v", qr2.Rows)) +} + +func TestReserveBeginExecuteWithPreQueriesAndCheckConnection(t *testing.T) { + rcClient := framework.NewClient() + rucClient := framework.NewClient() + + insRcQuery := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" + insRucQuery := "insert into vitess_test (intval, floatval, charval, binval) values (5, null, null, null)" + selQuery := "select intval from vitess_test" + delQuery := "delete from vitess_test where intval = 5" + rcQuery := []string{ + "set session transaction isolation level read committed", + } + rucQuery := []string{ + "set session transaction isolation level read uncommitted", + } + + _, err := rcClient.ReserveBeginExecute(insRcQuery, rcQuery, nil) + require.NoError(t, err) + defer rcClient.Release() + + _, err = rucClient.ReserveBeginExecute(insRucQuery, rucQuery, nil) + require.NoError(t, err) + defer rucClient.Release() + + qr1, err := rcClient.Execute(selQuery, nil) + require.NoError(t, err) + + qr2, err := rucClient.Execute(selQuery, nil) + require.NoError(t, err) + + assert.NotEqual(t, qr1.Rows, qr2.Rows) + // As the transaction is read commited it is not able to see #5. + assert.Equal(t, `[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)]]`, fmt.Sprintf("%v", qr1.Rows)) + // As the transaction is read uncommited it is able to see #4. + assert.Equal(t, `[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)] [INT32(5)]]`, fmt.Sprintf("%v", qr2.Rows)) + + err = rucClient.Commit() + require.NoError(t, err) + + qr1, err = rcClient.Execute(selQuery, nil) + require.NoError(t, err) + + qr2, err = rucClient.Execute(selQuery, nil) + require.NoError(t, err) + + // As the transaction on read uncommitted client got committed, transaction with read committed will be able to see #5. + assert.Equal(t, qr1.Rows, qr2.Rows) + assert.Equal(t, `[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)] [INT32(5)]]`, fmt.Sprintf("%v", qr1.Rows)) + + err = rcClient.Rollback() + require.NoError(t, err) + + qr1, err = rcClient.Execute(selQuery, nil) + require.NoError(t, err) + + qr2, err = rucClient.Execute(selQuery, nil) + require.NoError(t, err) + + // As the transaction on read committed client got rollbacked back, table will forget #4. + assert.Equal(t, qr1.Rows, qr2.Rows) + assert.Equal(t, `[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(5)]]`, fmt.Sprintf("%v", qr2.Rows)) + + // This is executed on reserved connection without transaction as the transaction was committed. + _, err = rucClient.Execute(delQuery, nil) + require.NoError(t, err) +} From 0452a14972ca5a649f0b8c72892cab83d7eb3ff6 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 17 Jun 2020 19:44:23 +0530 Subject: [PATCH 121/430] reserve-conn: added failing preQueries endtoend test on reserveExecute and reserveBeginExecute Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/reserve_test.go | 58 ++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index cbaa714b9db..a90ffd6ea87 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -573,7 +573,7 @@ func TestReserveAndBeginExecuteWithFailingQueryAndReserveConnAndTxRemainsOpen(t require.NoError(t, client.Release()) } -func TestReserveExecuteWithPreQueriesAndCheckConnection(t *testing.T) { +func TestReserveExecuteWithPreQueriesAndCheckConnectionState(t *testing.T) { client1 := framework.NewClient() client2 := framework.NewClient() @@ -609,7 +609,7 @@ func TestReserveExecuteWithPreQueriesAndCheckConnection(t *testing.T) { assert.Equal(t, `[[VARCHAR("Warning") UINT32(1411) VARCHAR("Incorrect datetime value: '00/00/0000' for function str_to_date")]]`, fmt.Sprintf("%v", qr2.Rows)) } -func TestReserveBeginExecuteWithPreQueriesAndCheckConnection(t *testing.T) { +func TestReserveBeginExecuteWithPreQueriesAndCheckConnectionState(t *testing.T) { rcClient := framework.NewClient() rucClient := framework.NewClient() @@ -674,3 +674,57 @@ func TestReserveBeginExecuteWithPreQueriesAndCheckConnection(t *testing.T) { _, err = rucClient.Execute(delQuery, nil) require.NoError(t, err) } + +func TestReserveExecuteWithFailingPreQueriesAndCheckConnectionState(t *testing.T) { + client := framework.NewClient() + + selQuery := "select 42" + preQueries := []string{ + "set @@no_sys_var = 42", + } + + _, err := client.ReserveExecute(selQuery, preQueries, nil) + require.Error(t, err) + + err = client.Release() + require.Error(t, err) +} + +func TestReserveBeginExecuteWithFailingPreQueriesAndCheckConnectionState(t *testing.T) { + client := framework.NewClient() + + selQuery := "select 42" + preQueries := []string{ + "set @@no_sys_var = 42", + } + + _, err := client.ReserveBeginExecute(selQuery, preQueries, nil) + require.Error(t, err) + + err = client.Commit() + require.Error(t, err) + + err = client.Release() + require.Error(t, err) +} + +func TestBeginReserveExecuteWithFailingPreQueriesAndCheckConnectionState(t *testing.T) { + client := framework.NewClient() + + selQuery := "select 42" + preQueries := []string{ + "set @@no_sys_var = 42", + } + + _, err := client.BeginExecute(selQuery, nil) + require.NoError(t, err) + + _, err = client.ReserveExecute(selQuery, preQueries, nil) + require.Error(t, err) + + err = client.Commit() + require.Error(t, err) + + err = client.Release() + require.Error(t, err) +} From 436c615b18d30ccd26ea5135987cbeadc2afdc10 Mon Sep 17 00:00:00 2001 From: deepthi Date: Wed, 17 Jun 2020 15:18:49 -0700 Subject: [PATCH 122/430] reserve-conn: consistent naming Signed-off-by: deepthi --- go/vt/vttablet/tabletserver/tabletserver.go | 26 ++++++++++----------- go/vt/vttablet/tabletserver/tx_engine.go | 16 +++++-------- go/vt/vttablet/tabletserver/tx_pool.go | 6 ++--- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 55e60b9c013..5068d972779 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -750,7 +750,7 @@ func (tsv *TabletServer) Begin(ctx context.Context, target *querypb.Target, opti return tsv.begin(ctx, target, 0, options) } -func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, reserveID int64, options *querypb.ExecuteOptions) (transactionID int64, tablet *topodatapb.TabletAlias, err error) { +func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, reservedID int64, options *querypb.ExecuteOptions) (transactionID int64, tablet *topodatapb.TabletAlias, err error) { err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), "Begin", "begin", nil, @@ -761,7 +761,7 @@ func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, rese return vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "Transaction throttled") } var beginSQL string - transactionID, beginSQL, err = tsv.te.Begin(ctx, reserveID, options) + transactionID, beginSQL, err = tsv.te.Begin(ctx, reservedID, options) logStats.TransactionID = transactionID // Record the actual statements that were executed in the logStats. @@ -984,7 +984,7 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq if err != nil { return err } - // If reserveID or transactionID is non zero it should be assigned as connID and passed to query executor. + // If reservedID or transactionID is non zero it should be assigned as connID and passed to query executor. connID := reservedID if transactionID != 0 { connID = transactionID @@ -1050,14 +1050,14 @@ func (tsv *TabletServer) StreamExecute(ctx context.Context, target *querypb.Targ // ExecuteBatch can be called for an existing transaction, or it can be called with // the AsTransaction flag which will execute all statements inside an independent // transaction. If AsTransaction is true, TransactionId must be 0. -func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Target, queries []*querypb.BoundQuery, asTransaction bool, txID int64, options *querypb.ExecuteOptions) (results []sqltypes.Result, err error) { +func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Target, queries []*querypb.BoundQuery, asTransaction bool, transactionID int64, options *querypb.ExecuteOptions) (results []sqltypes.Result, err error) { span, ctx := trace.NewSpan(ctx, "TabletServer.ExecuteBatch") defer span.Finish() if len(queries) == 0 { return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Empty query list") } - if asTransaction && txID != 0 { + if asTransaction && transactionID != 0 { return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "cannot start a new transaction in the scope of an existing one") } @@ -1076,7 +1076,7 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe } } - allowOnShutdown := txID != 0 + allowOnShutdown := transactionID != 0 // TODO(sougou): Convert startRequest/endRequest pattern to use wrapper // function tsv.execRequest() instead. // Note that below we always return "err" right away and do not call @@ -1106,32 +1106,32 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe if asTransaction { // We ignore the return alias because this transaction only exists in the scope of this call - txID, _, err = tsv.Begin(ctx, target, options) + transactionID, _, err = tsv.Begin(ctx, target, options) if err != nil { return nil, err } // If transaction was not committed by the end, it means // that there was an error, roll it back. defer func() { - if txID != 0 { - tsv.Rollback(ctx, target, txID) + if transactionID != 0 { + tsv.Rollback(ctx, target, transactionID) } }() } results = make([]sqltypes.Result, 0, len(queries)) for _, bound := range queries { - localReply, err := tsv.Execute(ctx, target, bound.Sql, bound.BindVariables, txID, 0, options) // TODO (systay) should we accept connID as a param? + localReply, err := tsv.Execute(ctx, target, bound.Sql, bound.BindVariables, transactionID, 0, options) // TODO (systay) should we accept connID as a param? if err != nil { return nil, err } results = append(results, *localReply) } if asTransaction { - if _, err = tsv.Commit(ctx, target, txID); err != nil { - txID = 0 + if _, err = tsv.Commit(ctx, target, transactionID); err != nil { + transactionID = 0 return nil, err } - txID = 0 + transactionID = 0 } return results, nil } diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 63094e9c02e..74a761f3213 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -217,7 +217,7 @@ func (te *TxEngine) AcceptReadOnly() error { // statement(s) used to execute the begin (if any). // // Subsequent statements can access the connection through the transaction id. -func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb.ExecuteOptions) (int64, string, error) { +func (te *TxEngine) Begin(ctx context.Context, reservedID int64, options *querypb.ExecuteOptions) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Begin") defer span.Finish() te.stateLock.Lock() @@ -235,7 +235,7 @@ func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb te.stateLock.Unlock() defer te.beginRequests.Done() - conn, beginSQL, err := te.txPool.Begin(ctx, options, te.state == AcceptingReadOnly, reserveID) + conn, beginSQL, err := te.txPool.Begin(ctx, options, te.state == AcceptingReadOnly, reservedID) if err != nil { return 0, "", err } @@ -243,18 +243,18 @@ func (te *TxEngine) Begin(ctx context.Context, reserveID int64, options *querypb return conn.ID(), beginSQL, err } -// Commit commits the specified transaction and renew connection id if exists. +// Commit commits the specified transaction and renews connection id if one exists. func (te *TxEngine) Commit(ctx context.Context, transactionID int64) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Commit") defer span.Finish() var query string var err error - rID, err := te.txFinish(transactionID, tx.TxCommit, func(conn *StatefulConnection) error { + connID, err := te.txFinish(transactionID, tx.TxCommit, func(conn *StatefulConnection) error { query, err = te.txPool.Commit(ctx, conn) return err }) - return rID, query, err + return connID, query, err } // Rollback rolls back the specified transaction. @@ -273,14 +273,10 @@ func (te *TxEngine) txFinish(transactionID int64, reason tx.ReleaseReason, f fun return 0, err } err = f(conn) - if err != nil { + if err != nil || !conn.IsTainted() { conn.Release(reason) return 0, err } - if !conn.IsTainted() { - conn.Release(reason) - return 0, nil - } err = conn.Renew() if err != nil { conn.Release(tx.ConnRenewFail) diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index 8dd553a181e..840604d3c26 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -208,14 +208,14 @@ func (tp *TxPool) Rollback(ctx context.Context, txConn *StatefulConnection) erro // the statements (if any) executed to initiate the transaction. In autocommit // mode the statement will be "". // The connection returned is locked for the callee and its responsibility is to unlock the connection. -func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reserveID int64) (*StatefulConnection, string, error) { +func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reservedID int64) (*StatefulConnection, string, error) { span, ctx := trace.NewSpan(ctx, "TxPool.Begin") defer span.Finish() var conn *StatefulConnection var err error - if reserveID != 0 { - conn, err = tp.scp.GetAndLock(reserveID, "start transaction on reserve conn") + if reservedID != 0 { + conn, err = tp.scp.GetAndLock(reservedID, "start transaction on reserve conn") } else { immediateCaller := callerid.ImmediateCallerIDFromContext(ctx) effectiveCaller := callerid.EffectiveCallerIDFromContext(ctx) From 76ee1ec3baee5dd12e0a6cc085ec282623ca7c69 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 18 Jun 2020 13:21:05 +0530 Subject: [PATCH 123/430] reserve-conn: minor refactor Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/reserve_test.go | 84 +++++++-------------- go/vt/vttablet/tabletserver/tabletserver.go | 2 +- 2 files changed, 29 insertions(+), 57 deletions(-) diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index a90ffd6ea87..2fef8adff96 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -33,8 +33,6 @@ func TestMultipleReserveHaveDifferentConnection(t *testing.T) { client1 := framework.NewClient() client2 := framework.NewClient() - //vstart := framework.DebugVars() - query := "select connection_id()" qrc1_1, err := client1.ReserveExecute(query, nil, nil) @@ -51,7 +49,6 @@ func TestMultipleReserveHaveDifferentConnection(t *testing.T) { require.NoError(t, err) require.Equal(t, qrc1_1.Rows, qrc1_2.Rows) require.Equal(t, qrc2_1.Rows, qrc2_2.Rows) - } func TestReserveBeginRelease(t *testing.T) { @@ -88,74 +85,49 @@ func TestBeginReserveRelease(t *testing.T) { require.NoError(t, client.Release()) } -func TestReserveBeginExecute(t *testing.T) { - client1 := framework.NewClient() - client2 := framework.NewClient() - - query := "select connection_id()" +func TestReserveBeginExecuteRelease(t *testing.T) { + client := framework.NewClient() - qrc1_1, err := client1.ReserveBeginExecute(query, nil, nil) + insQuery := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" + selQuery := "select intval from vitess_test where intval = 4" + _, err := client.ReserveBeginExecute(insQuery, nil, nil) require.NoError(t, err) - defer func() { - if client1.ReservedID() != 0 { - t.Error("should not be reserved after release") - _ = client1.Release() - } - }() - qrc2_1, err := client2.ReserveBeginExecute(query, nil, nil) - require.NoError(t, err) - defer func() { - if client2.ReservedID() != 0 { - t.Error("should not be reserved after release") - _ = client2.Release() - } - }() - require.NotEqual(t, qrc1_1.Rows, qrc2_1.Rows) - assert.Equal(t, client1.ReservedID(), client1.TransactionID()) - assert.Equal(t, client2.ReservedID(), client2.TransactionID()) - // rows with values 1, 2 and 3 already exist - query1 := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" - qrc1_2, err := client1.Execute(query1, nil) + qr, err := client.Execute(selQuery, nil) require.NoError(t, err) - assert.Equal(t, uint64(1), qrc1_2.RowsAffected, "insert should create 1 row") + assert.Equal(t, `[[INT32(4)]]`, fmt.Sprintf("%v", qr.Rows)) - query2 := "insert into vitess_test (intval, floatval, charval, binval) values (5, null, null, null)" - qrc2_2, err := client2.Execute(query2, nil) + err = client.Release() require.NoError(t, err) - assert.Equal(t, uint64(1), qrc2_2.RowsAffected, "insert should create 1 row") - query = "select intval from vitess_test" - qrc1_2, err = client1.Execute(query, nil) + qr, err = client.Execute(selQuery, nil) require.NoError(t, err) - // client1 does not see row inserted by client2 - expectedRows1 := "[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(4)]]" - assert.Equal(t, expectedRows1, fmt.Sprintf("%v", qrc1_2.Rows), "wrong result from select1") + assert.Equal(t, `[]`, fmt.Sprintf("%v", qr.Rows)) +} - qrc2_2, err = client2.Execute(query, nil) - require.NoError(t, err) - expectedRows2 := "[[INT32(1)] [INT32(2)] [INT32(3)] [INT32(5)]]" - assert.Equal(t, expectedRows2, fmt.Sprintf("%v", qrc2_2.Rows), "wrong result from select2") +func TestMultipleReserveBeginHaveDifferentConnection(t *testing.T) { + client1 := framework.NewClient() + client2 := framework.NewClient() + + query := "select connection_id()" - // Release connections without committing - err = client1.Release() + qrc1_1, err := client1.ReserveBeginExecute(query, nil, nil) require.NoError(t, err) - err = client1.Release() - require.Error(t, err) - err = client2.Release() + defer client1.Release() + qrc2_1, err := client2.ReserveBeginExecute(query, nil, nil) require.NoError(t, err) - err = client2.Release() - require.Error(t, err) + defer client2.Release() + require.NotEqual(t, qrc1_1.Rows, qrc2_1.Rows) - // test that inserts were rolled back - client3 := framework.NewClient() - qrc3, err := client3.Execute(query, nil) + qrc1_2, err := client1.Execute(query, nil) require.NoError(t, err) - expectedRows := "[[INT32(1)] [INT32(2)] [INT32(3)]]" - assert.Equal(t, expectedRows, fmt.Sprintf("%v", qrc3.Rows), "wrong result from select after release") + qrc2_2, err := client2.Execute(query, nil) + require.NoError(t, err) + require.Equal(t, qrc1_1.Rows, qrc1_2.Rows) + require.Equal(t, qrc2_1.Rows, qrc2_2.Rows) } -func TestCommitOnReserveConn(t *testing.T) { +func TestCommitOnReserveBeginConn(t *testing.T) { client := framework.NewClient() query := "select connection_id()" @@ -175,7 +147,7 @@ func TestCommitOnReserveConn(t *testing.T) { assert.Equal(t, qr1.Rows, qr2.Rows) } -func TestRollbackOnReserveConn(t *testing.T) { +func TestRollbackOnReserveBeginConn(t *testing.T) { client := framework.NewClient() query := "select connection_id()" diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 5068d972779..0c0da03c46a 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -984,7 +984,7 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq if err != nil { return err } - // If reservedID or transactionID is non zero it should be assigned as connID and passed to query executor. + // If both the values are non-zero then by design they are same value. So, it is safe to overwrite. connID := reservedID if transactionID != 0 { connID = transactionID From 26f05f79b7e8183e7ab177eab0b3843eac5be556 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 18 Jun 2020 17:06:36 +0530 Subject: [PATCH 124/430] reserve-conn: added commit rollback execute failure test on reserved connection Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/framework/client.go | 4 +- go/vt/vttablet/endtoend/reserve_test.go | 105 ++++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index e2d67dc7128..65abc3708d3 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -98,10 +98,10 @@ func (client *QueryClient) Begin(clientFoundRows bool) error { func (client *QueryClient) Commit() error { defer func() { client.transactionID = 0 }() rID, err := client.server.Commit(client.ctx, &client.target, client.transactionID) + client.reservedID = rID if err != nil { return err } - client.reservedID = rID return nil } @@ -109,10 +109,10 @@ func (client *QueryClient) Commit() error { func (client *QueryClient) Rollback() error { defer func() { client.transactionID = 0 }() rID, err := client.server.Rollback(client.ctx, &client.target, client.transactionID) + client.reservedID = rID if err != nil { return err } - client.reservedID = rID return nil } diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index 2fef8adff96..2798e4f88da 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -700,3 +700,108 @@ func TestBeginReserveExecuteWithFailingPreQueriesAndCheckConnectionState(t *test err = client.Release() require.Error(t, err) } + +func TestReserveBeginExecuteWithCommitFailureAndCheckConnectionAndDBState(t *testing.T) { + client := framework.NewClient() + + connQuery := "select connection_id()" + insQuery := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" + selQuery := "select intval from vitess_test where intval = 4" + + connQr, err := client.ReserveBeginExecute(connQuery, nil, nil) + require.NoError(t, err) + + _, err = client.Execute(insQuery, nil) + require.NoError(t, err) + + killConnection(t, connQr.Rows[0][0].ToString()) + + err = client.Commit() + require.Error(t, err) + require.Zero(t, client.ReservedID()) + + qr, err := client.Execute(selQuery, nil) + require.NoError(t, err) + require.Empty(t, qr.Rows) + + qr, err = client.Execute(connQuery, nil) + require.NoError(t, err) + require.NotEqual(t, connQr.Rows, qr.Rows) + + require.Error(t, client.Release()) +} + +func TestReserveBeginExecuteWithRollbackFailureAndCheckConnectionAndDBState(t *testing.T) { + client := framework.NewClient() + + connQuery := "select connection_id()" + insQuery := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" + selQuery := "select intval from vitess_test where intval = 4" + + connQr, err := client.ReserveBeginExecute(connQuery, nil, nil) + require.NoError(t, err) + + _, err = client.Execute(insQuery, nil) + require.NoError(t, err) + + killConnection(t, connQr.Rows[0][0].ToString()) + + err = client.Rollback() + require.Error(t, err) + require.Zero(t, client.ReservedID()) + + qr, err := client.Execute(selQuery, nil) + require.NoError(t, err) + require.Empty(t, qr.Rows) + + qr, err = client.Execute(connQuery, nil) + require.NoError(t, err) + require.NotEqual(t, connQr.Rows, qr.Rows) + + require.Error(t, client.Release()) +} + +func TestReserveExecuteWithExecuteFailureAndCheckConnectionAndDBState(t *testing.T) { + client := framework.NewClient() + + connQuery := "select connection_id()" + insQuery := "insert into vitess_test (intval, floatval, charval, binval) values (4, null, null, null)" + selQuery := "select intval from vitess_test where intval = 4" + + connQr, err := client.ReserveExecute(connQuery, nil, nil) + require.NoError(t, err) + + killConnection(t, connQr.Rows[0][0].ToString()) + + _, err = client.Execute(insQuery, nil) + require.Error(t, err) + // Expectation - require.Zero(t, client.ReservedID()) + // Reality + require.NotZero(t, client.ReservedID()) + + // Client still has transaction id and client id as non-zero. + _, err = client.Execute(selQuery, nil) + require.Error(t, err) + client.SetTransactionID(0) + + _, err = client.Execute(selQuery, nil) + require.Error(t, err) + client.SetReservedID(0) + + qr, err := client.Execute(selQuery, nil) + require.NoError(t, err) + require.Empty(t, qr.Rows) + + qr, err = client.Execute(connQuery, nil) + require.NoError(t, err) + require.NotEqual(t, connQr.Rows, qr.Rows) + + require.Error(t, client.Release()) +} + +func killConnection(t *testing.T, connID string) { + client := framework.NewClient() + _, err := client.ReserveExecute("select 1", []string{fmt.Sprintf("kill %s", connID)}, nil) + require.NoError(t, err) + defer client.Release() +} From 41640ee12934680006b8e4f5bf0431d0a268ac72 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 18 Jun 2020 18:43:53 +0530 Subject: [PATCH 125/430] reserve-conn: added Release method to QueryService interface Signed-off-by: Harshit Gangal --- go/vt/vtcombo/tablet_map.go | 10 ++++- go/vt/vtctl/query.go | 1 + go/vt/vterrors/aggregate.go | 16 ------- go/vt/vttablet/endtoend/framework/client.go | 2 +- go/vt/vttablet/grpctabletconn/conn.go | 21 ++++++++++ go/vt/vttablet/queryservice/queryservice.go | 3 ++ go/vt/vttablet/queryservice/wrapped.go | 13 ++++-- go/vt/vttablet/sandboxconn/sandboxconn.go | 5 +++ .../tabletconntest/fakequeryservice.go | 5 +++ go/vt/vttablet/tabletserver/tabletserver.go | 26 ++++++------ .../tabletserver/tabletserver_test.go | 42 +++++++++---------- go/vt/vttablet/tabletserver/tx_engine.go | 7 ++-- 12 files changed, 91 insertions(+), 60 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 05471ba5389..d15479edc6e 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -478,8 +478,8 @@ func (itc *internalTabletConn) HandlePanic(err *error) { //ReserveBeginExecute is part of the QueryService interface. func (itc *internalTabletConn) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { - res, txID, reservedID, alias, err := itc.tablet.qsc.QueryService().ReserveBeginExecute(ctx, target, sql, preQueries, bindVariables, options) - return res, txID, reservedID, alias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) + res, transactionID, reservedID, alias, err := itc.tablet.qsc.QueryService().ReserveBeginExecute(ctx, target, sql, preQueries, bindVariables, options) + return res, transactionID, reservedID, alias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } //ReserveBeginExecute is part of the QueryService interface. @@ -488,6 +488,12 @@ func (itc *internalTabletConn) ReserveExecute(ctx context.Context, target *query return res, reservedID, alias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } +//Release is part of the QueryService interface. +func (itc *internalTabletConn) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { + err := itc.tablet.qsc.QueryService().Release(ctx, target, transactionID, reservedID) + return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) +} + // Close is part of queryservice.QueryService func (itc *internalTabletConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vtctl/query.go b/go/vt/vtctl/query.go index 8e5c7e52fa2..8faf4f01684 100644 --- a/go/vt/vtctl/query.go +++ b/go/vt/vtctl/query.go @@ -228,6 +228,7 @@ func commandVtTabletExecute(ctx context.Context, wr *wrangler.Wrangler, subFlags return fmt.Errorf("BuildBindVariables failed: %v", err) } + // We do not support reserve connection through vtctl commands, so reservedID is always 0. qr, err := conn.Execute(ctx, &querypb.Target{ Keyspace: tabletInfo.Tablet.Keyspace, Shard: tabletInfo.Tablet.Shard, diff --git a/go/vt/vterrors/aggregate.go b/go/vt/vterrors/aggregate.go index 8ac4b4626d1..232d778908b 100644 --- a/go/vt/vterrors/aggregate.go +++ b/go/vt/vterrors/aggregate.go @@ -80,25 +80,12 @@ func Aggregate(errors []error) error { if len(errors) == 0 { return nil } - found := false - for _, e := range errors { - if e == nil { // e can be nil when we are collecting errors across shards and some shards have no error - continue - } - found = true - } - if !found { - return nil - } return New(aggregateCodes(errors), aggregateErrors(errors)) } func aggregateCodes(errors []error) vtrpcpb.Code { highCode := vtrpcpb.Code_OK for _, e := range errors { - if e == nil { // e can be nil when we are collecting errors across shards and some shards have no error - continue - } code := Code(e) if errorPriorities[code] > errorPriorities[highCode] { highCode = code @@ -111,9 +98,6 @@ func aggregateCodes(errors []error) vtrpcpb.Code { func aggregateErrors(errs []error) string { errStrs := make([]string, 0, len(errs)) for _, e := range errs { - if e == nil { // e can be nil when we are collecting errors across shards and some shards have no error - continue - } errStrs = append(errStrs, e.Error()) } // sort the error strings so we always have deterministic ordering diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 65abc3708d3..dcd0feda4da 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -314,7 +314,7 @@ func (client *QueryClient) ReserveBeginExecute(query string, preQueries []string // Release performs a Release. func (client *QueryClient) Release() error { - err := client.server.Release(client.ctx, &client.target, client.reservedID, client.transactionID) + err := client.server.Release(client.ctx, &client.target, client.transactionID, client.reservedID) if err != nil { return err } diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index 3963223e539..6861abdaf8a 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -792,6 +792,27 @@ func (conn *gRPCQueryClient) ReserveExecute(ctx context.Context, target *querypb return sqltypes.Proto3ToResult(reply.Result), reply.ReservedId, conn.tablet.Alias, nil } +func (conn *gRPCQueryClient) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { + conn.mu.RLock() + defer conn.mu.RUnlock() + if conn.cc == nil { + return tabletconn.ConnClosed + } + + req := &querypb.ReleaseRequest{ + EffectiveCallerId: callerid.EffectiveCallerIDFromContext(ctx), + ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), + Target: target, + TransactionId: transactionID, + ReservedId: reservedID, + } + _, err := conn.c.Release(ctx, req) + if err != nil { + return tabletconn.ErrorFromGRPC(err) + } + return nil +} + // Close closes underlying gRPC channel. func (conn *gRPCQueryClient) Close(ctx context.Context) error { conn.mu.Lock() diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 6bf85c17312..6acfa117e9a 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -112,8 +112,11 @@ type QueryService interface { HandlePanic(err *error) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) + ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) + Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error + // Close must be called for releasing resources. Close(ctx context.Context) error } diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 282eca292f3..fedca2479ff 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -282,15 +282,15 @@ func (ws *wrappedService) HandlePanic(err *error) { func (ws *wrappedService) ReserveBeginExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, int64, *topodatapb.TabletAlias, error) { var res *sqltypes.Result - var txID, reservedID int64 + var transactionID, reservedID int64 var alias *topodatapb.TabletAlias err := ws.wrapper(ctx, target, ws.impl, "ReserveBeginExecute", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var err error - res, txID, reservedID, alias, err = conn.ReserveBeginExecute(ctx, target, sql, preQueries, bindVariables, options) + res, transactionID, reservedID, alias, err = conn.ReserveBeginExecute(ctx, target, sql, preQueries, bindVariables, options) return canRetry(ctx, err), err }) - return res, txID, reservedID, alias, err + return res, transactionID, reservedID, alias, err } func (ws *wrappedService) ReserveExecute(ctx context.Context, target *querypb.Target, sql string, preQueries []string, bindVariables map[string]*querypb.BindVariable, txID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { @@ -306,6 +306,13 @@ func (ws *wrappedService) ReserveExecute(ctx context.Context, target *querypb.Ta return res, reservedID, alias, err } +func (ws *wrappedService) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { + return ws.wrapper(ctx, target, ws.impl, "Release", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + // No point retrying Release. + return false, conn.Release(ctx, target, transactionID, reservedID) + }) +} + func (ws *wrappedService) Close(ctx context.Context) error { return ws.wrapper(ctx, nil, ws.impl, "Close", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { // No point retrying Close. diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 5e70d509193..4a75deb5cc7 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -394,6 +394,11 @@ func (sbc *SandboxConn) ReserveExecute(ctx context.Context, target *querypb.Targ panic("implement me") } +//Release implements the QueryService interface +func (sbc *SandboxConn) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { + panic("implement me") +} + // Close does not change ExecCount func (sbc *SandboxConn) Close(ctx context.Context) error { return nil diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index b7d72663551..5005290c6f9 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -733,6 +733,11 @@ func (f *FakeQueryService) ReserveExecute(ctx context.Context, target *querypb.T panic("implement me") } +//Release implements the QueryService interface +func (f *FakeQueryService) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { + panic("implement me") +} + // CreateFakeServer returns the fake server for the tests func CreateFakeServer(t *testing.T) *FakeQueryService { return &FakeQueryService{ diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 0c0da03c46a..592bd5e4055 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -1050,6 +1050,7 @@ func (tsv *TabletServer) StreamExecute(ctx context.Context, target *querypb.Targ // ExecuteBatch can be called for an existing transaction, or it can be called with // the AsTransaction flag which will execute all statements inside an independent // transaction. If AsTransaction is true, TransactionId must be 0. +// TODO(reserve-conn): Validate the use-case and Add support for reserve connection in ExecuteBatch func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Target, queries []*querypb.BoundQuery, asTransaction bool, transactionID int64, options *querypb.ExecuteOptions) (results []sqltypes.Result, err error) { span, ctx := trace.NewSpan(ctx, "TabletServer.ExecuteBatch") defer span.Finish() @@ -1120,7 +1121,7 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe } results = make([]sqltypes.Result, 0, len(queries)) for _, bound := range queries { - localReply, err := tsv.Execute(ctx, target, bound.Sql, bound.BindVariables, transactionID, 0, options) // TODO (systay) should we accept connID as a param? + localReply, err := tsv.Execute(ctx, target, bound.Sql, bound.BindVariables, transactionID, 0, options) if err != nil { return nil, err } @@ -1139,8 +1140,8 @@ func (tsv *TabletServer) ExecuteBatch(ctx context.Context, target *querypb.Targe // BeginExecute combines Begin and Execute. func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { - // TODO: if reservedID != 0, then skip hotrow protection - if tsv.enableHotRowProtection { + // Disable hot row protection in case of reserve connection. + if tsv.enableHotRowProtection && reservedID == 0 { txDone, err := tsv.beginWaitForSameRangeTransactions(ctx, target, options, sql, bindVariables) if err != nil { return nil, 0, nil, err @@ -1150,9 +1151,6 @@ func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Targe } } - // TODO: tsv.Begin creates a new connection, that's a big no-no if we already have a reservedID - // Begin needs to take a reservedID and start a transaction on that connection if it exists - // if reservedID is 0, then create a new connection as before transactionID, alias, err := tsv.begin(ctx, target, reservedID, options) if err != nil { return nil, 0, nil, err @@ -1434,24 +1432,24 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar } //Release implements the QueryService interface -func (tsv *TabletServer) Release(ctx context.Context, target *querypb.Target, connID int64, txID int64) error { - if connID == 0 && txID == 0 { +func (tsv *TabletServer) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { + if reservedID == 0 && transactionID == 0 { return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "Connection Id and Transaction ID does not exists") } return tsv.execRequest( ctx, tsv.QueryTimeout.Get(), - "Release", "", nil, //TODO (hgangal): Do we need to set any sql query to be logged? + "Release", "", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { defer tsv.stats.QueryTimings.Record("RELEASE", time.Now()) - if connID != 0 { + if reservedID != 0 { //Release to close the underlying connection. - logStats.TransactionID = connID - return tsv.te.Release(ctx, connID) + logStats.TransactionID = reservedID + return tsv.te.Release(ctx, reservedID) } // Rollback to cleanup the transaction before returning to the pool. - logStats.TransactionID = txID - _, err := tsv.te.Rollback(ctx, txID) + logStats.TransactionID = transactionID + _, err := tsv.te.Rollback(ctx, transactionID) return err }, ) diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index a654b4632c4..08b74761fc4 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -2380,11 +2380,11 @@ func TestReserveBeginExecute(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - _, txID, connID, _, err := tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) + _, transactionID, reservedID, _, err := tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 43"}, nil, &querypb.ExecuteOptions{}) require.NoError(t, err) - defer tsv.Release(ctx, &target, connID, txID) - assert.Greater(t, txID, int64(0), "txID") - assert.Equal(t, connID, txID, "connID should equal txID") + defer tsv.Release(ctx, &target, transactionID, reservedID) + assert.Greater(t, transactionID, int64(0), "transactionID") + assert.Equal(t, reservedID, transactionID, "reservedID should equal transactionID") expected := []string{ "select 43", "begin", @@ -2405,10 +2405,10 @@ func TestReserveExecute_WithoutTx(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - _, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, 0, &querypb.ExecuteOptions{}) + _, reservedID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, 0, &querypb.ExecuteOptions{}) require.NoError(t, err) - defer tsv.Release(ctx, &target, connID, 0) - assert.NotEqual(t, int64(0), connID, "connID should not be zero") + defer tsv.Release(ctx, &target, 0, reservedID) + assert.NotEqual(t, int64(0), reservedID, "reservedID should not be zero") expected := []string{ "select 43", "select 42 from dual where 1 != 1", @@ -2428,15 +2428,15 @@ func TestReserveExecute_WithTx(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - txID, _, err := tsv.Begin(ctx, &target, &querypb.ExecuteOptions{}) + transactionID, _, err := tsv.Begin(ctx, &target, &querypb.ExecuteOptions{}) require.NoError(t, err) - require.NotEqual(t, int64(0), txID) + require.NotEqual(t, int64(0), transactionID) db.ResetQueryLog() - _, connID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, txID, &querypb.ExecuteOptions{}) + _, reservedID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", []string{"select 43"}, nil, transactionID, &querypb.ExecuteOptions{}) require.NoError(t, err) - defer tsv.Release(ctx, &target, connID, txID) - assert.Equal(t, txID, connID, "connID should be equal to txID") + defer tsv.Release(ctx, &target, transactionID, reservedID) + assert.Equal(t, transactionID, reservedID, "reservedID should be equal to transactionID") expected := []string{ "select 43", "select 42 from dual where 1 != 1", @@ -2489,25 +2489,25 @@ func TestRelease(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - var txID, connID int64 + var transactionID, reservedID int64 switch { case test.begin && test.reserve: - _, txID, connID, _, err = tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 1212"}, nil, &querypb.ExecuteOptions{}) - require.NotEqual(t, int64(0), txID) - require.NotEqual(t, int64(0), connID) + _, transactionID, reservedID, _, err = tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{"select 1212"}, nil, &querypb.ExecuteOptions{}) + require.NotEqual(t, int64(0), transactionID) + require.NotEqual(t, int64(0), reservedID) case test.begin: - _, txID, _, err = tsv.BeginExecute(ctx, &target, "select 42", nil, 0, &querypb.ExecuteOptions{}) - require.NotEqual(t, int64(0), txID) + _, transactionID, _, err = tsv.BeginExecute(ctx, &target, "select 42", nil, 0, &querypb.ExecuteOptions{}) + require.NotEqual(t, int64(0), transactionID) case test.reserve: - _, connID, _, err = tsv.ReserveExecute(ctx, &target, "select 42", nil, nil, 0, &querypb.ExecuteOptions{}) - require.NotEqual(t, int64(0), connID) + _, reservedID, _, err = tsv.ReserveExecute(ctx, &target, "select 42", nil, nil, 0, &querypb.ExecuteOptions{}) + require.NotEqual(t, int64(0), reservedID) } require.NoError(t, err) db.ResetQueryLog() - err = tsv.Release(ctx, &target, connID, txID) + err = tsv.Release(ctx, &target, transactionID, reservedID) if test.err { require.Error(t, err) } else { diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 74a761f3213..1802e159b13 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -596,9 +596,10 @@ func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions } defer conn.Unlock() - // TODO: is it safe to ignore this error? - _ = te.taintConn(ctx, conn, preQueries) - + err = te.taintConn(ctx, conn, preQueries) + if err != nil { + return 0, err + } return conn.ID(), nil } From 98d0678c27c1c914e64eeb622841ba9efddd0650 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 29 Jun 2020 12:18:32 +0200 Subject: [PATCH 126/430] reserve-conn: add unit tests Signed-off-by: Andres Taylor Signed-off-by: Harshit Gangal --- go/vt/vtcombo/tablet_map.go | 11 +- .../tabletserver/stateful_connection.go | 2 +- .../stateful_connection_pool_test.go | 15 ++ go/vt/vttablet/tabletserver/tabletserver.go | 6 +- .../tabletserver/tabletserver_test.go | 142 ++++++++++++++++++ 5 files changed, 167 insertions(+), 9 deletions(-) diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index d15479edc6e..d0f824660c5 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -441,13 +441,10 @@ func (itc *internalTabletConn) ReadTransaction(ctx context.Context, target *quer } // BeginExecute is part of queryservice.QueryService -func (itc *internalTabletConn) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { - transactionID, alias, err := itc.Begin(ctx, target, options) - if err != nil { - return nil, 0, nil, err - } - result, err := itc.Execute(ctx, target, query, bindVars, transactionID, reservedID, options) - return result, transactionID, alias, err +func (itc *internalTabletConn) BeginExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, reserveID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { + bindVars = sqltypes.CopyBindVariables(bindVars) + result, transactionID, tabletAlias, err := itc.tablet.qsc.QueryService().BeginExecute(ctx, target, query, bindVars, reserveID, options) + return result, transactionID, tabletAlias, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } // BeginExecuteBatch is part of queryservice.QueryService diff --git a/go/vt/vttablet/tabletserver/stateful_connection.go b/go/vt/vttablet/tabletserver/stateful_connection.go index c1a58a23ee9..e357643828b 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection.go +++ b/go/vt/vttablet/tabletserver/stateful_connection.go @@ -88,7 +88,7 @@ func (sc *StatefulConnection) Exec(ctx context.Context, query string, maxrows in func (sc *StatefulConnection) execWithRetry(ctx context.Context, query string, maxrows int, wantfields bool) error { if sc.IsClosed() { - return nil + return vterrors.New(vtrpcpb.Code_CANCELED, "connection is closed") } if _, err := sc.dbConn.Exec(ctx, query, maxrows, wantfields); err != nil { return err diff --git a/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go b/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go index 5ae132a04a8..deb5f02979d 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go +++ b/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go @@ -131,6 +131,21 @@ func TestExecWithDbconnClosedHavingTx(t *testing.T) { require.EqualError(t, err, "transaction was aborted: foobar") } +func TestFailOnConnectionRegistering(t *testing.T) { + db := fakesqldb.New(t) + defer db.Close() + pool := newActivePool() + pool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) + conn, err := pool.NewConn(ctx, &querypb.ExecuteOptions{}) + require.NoError(t, err) + defer conn.Close() + + pool.lastID.Set(conn.ConnID - 1) + + _, err = pool.NewConn(ctx, &querypb.ExecuteOptions{}) + require.Error(t, err, "already present") +} + func newActivePool() *StatefulConnectionPool { env := newEnv("ActivePoolTest") diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 592bd5e4055..4df776c186c 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -970,6 +970,10 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq trace.AnnotateSQL(span, sql) defer span.Finish() + if transactionID != 0 && reservedID != 0 && transactionID != reservedID { + return nil, vterrors.New(vtrpcpb.Code_INTERNAL, "transactionID and reserveID must match if both are non-zero") + } + allowOnShutdown := transactionID != 0 err = tsv.execRequest( ctx, tsv.QueryTimeout.Get(), @@ -1034,7 +1038,7 @@ func (tsv *TabletServer) StreamExecute(ctx context.Context, target *querypb.Targ query: query, marginComments: comments, bindVars: bindVariables, - connID: txID, + connID: transactionID, options: options, plan: plan, ctx: ctx, diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 08b74761fc4..6ea2c1b190f 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -17,6 +17,7 @@ limitations under the License. package tabletserver import ( + "errors" "fmt" "io" "io/ioutil" @@ -891,6 +892,147 @@ func TestTabletServerCommitPrepared(t *testing.T) { require.NoError(t, err) } +func TestTabletServerReserveConnection(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + + db.AddQueryPattern(".*", &sqltypes.Result{}) + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + options := &querypb.ExecuteOptions{} + + // reserve a connection + _, rID, _, err := tsv.ReserveExecute(ctx, &target, "select 42", nil, nil, 0, options) + require.NoError(t, err) + + // run a query in it + _, err = tsv.Execute(ctx, &target, "select 42", nil, 0, rID, options) + require.NoError(t, err) + + // release the connection + err = tsv.Release(ctx, &target, 0, rID) + require.NoError(t, err) +} + +func TestTabletServerExecNonExistentConnection(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + + db.AddQueryPattern(".*", &sqltypes.Result{}) + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + options := &querypb.ExecuteOptions{} + + // run a query in a non-existingt reserved id + _, err = tsv.Execute(ctx, &target, "select 42", nil, 0, 123456, options) + require.Error(t, err) +} + +func TestTabletServerReleaseNonExistentConnection(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + + db.AddQueryPattern(".*", &sqltypes.Result{}) + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + + // run a query in a non-existingt reserved id + err = tsv.Release(ctx, &target, 0, 123456) + require.Error(t, err) +} + +func TestMakeSureToCloseDbConnWhenBeginQueryFails(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + + db.AddRejectedQuery("begin", errors.New("it broke")) + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + options := &querypb.ExecuteOptions{} + + // run a query in a non-existingt reserved id + _, _, _, _, err = tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{}, nil, options) + require.Error(t, err) +} + +func TestTabletServerReserveAndBeginCommit(t *testing.T) { + db := setUpTabletServerTest(t) + defer db.Close() + + db.AddQueryPattern(".*", &sqltypes.Result{}) + config := tabletenv.NewDefaultConfig() + tsv := NewTabletServer("TabletServerTest", config, memorytopo.NewServer(""), topodatapb.TabletAlias{}) + dbcfgs := newDBConfigs(db) + target := querypb.Target{TabletType: topodatapb.TabletType_MASTER} + err := tsv.StartService(target, dbcfgs) + require.NoError(t, err) + defer tsv.StopService() + options := &querypb.ExecuteOptions{} + + // reserve a connection and a transaction + _, txID, rID, _, err := tsv.ReserveBeginExecute(ctx, &target, "select 42", nil, nil, options) + require.NoError(t, err) + defer func() { + // fallback so the test finishes quickly + tsv.Release(ctx, &target, txID, rID) + }() + + // run a query in it + _, err = tsv.Execute(ctx, &target, "select 42", nil, txID, rID, options) + require.NoError(t, err) + + // run a query in a non-existent connection + _, err = tsv.Execute(ctx, &target, "select 42", nil, txID, rID+100, options) + require.Error(t, err) + _, err = tsv.Execute(ctx, &target, "select 42", nil, txID+100, rID, options) + require.Error(t, err) + + // commit + newRID, err := tsv.Commit(ctx, &target, txID) + require.NoError(t, err) + assert.NotEqual(t, rID, newRID) + rID = newRID + + // begin and rollback + _, txID, _, err = tsv.BeginExecute(ctx, &target, "select 42", nil, rID, options) + require.NoError(t, err) + assert.Equal(t, newRID, txID) + rID = newRID + + newRID, err = tsv.Rollback(ctx, &target, txID) + require.NoError(t, err) + assert.NotEqual(t, rID, newRID) + rID = newRID + + // release the connection + err = tsv.Release(ctx, &target, 0, rID) + require.NoError(t, err) + + // release the connection again and fail + err = tsv.Release(ctx, &target, 0, rID) + require.Error(t, err) +} + func TestTabletServerRollbackPrepared(t *testing.T) { // Reuse code from tx_executor_test. _, tsv, db := newTestTxExecutor(t) From 72f3ddfda50d5f1207cd8c6c98e9c85f789f102c Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Mon, 29 Jun 2020 15:50:00 +0300 Subject: [PATCH 127/430] make docker_local, docker/local/run.sh utility Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- Makefile | 4 +++ docker/local/Dockerfile | 30 ++++++++++++++++++++++ docker/local/install_local_dependencies.sh | 22 ++++++++++++++++ docker/local/run.sh | 3 +++ 4 files changed, 59 insertions(+) create mode 100644 docker/local/Dockerfile create mode 100755 docker/local/install_local_dependencies.sh create mode 100755 docker/local/run.sh diff --git a/Makefile b/Makefile index e6d44a39e24..4dc673e5ae5 100644 --- a/Makefile +++ b/Makefile @@ -287,6 +287,10 @@ docker_lite_testing: chmod -R o=g * docker build -f docker/lite/Dockerfile.testing -t vitess/lite:testing . +docker_local: + chmod -R o=g * + docker build -f docker/local/Dockerfile -t vitess/local . + # This rule loads the working copy of the code into a bootstrap image, # and then runs the tests inside Docker. # Example: $ make docker_test flavor=mariadb diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile new file mode 100644 index 00000000000..a4e76e1a7d1 --- /dev/null +++ b/docker/local/Dockerfile @@ -0,0 +1,30 @@ +FROM vitess/bootstrap:common + +RUN apt-get update +RUN apt-get install -y sudo curl vim jq mysql-server + +COPY docker/local/install_local_dependencies.sh /vt/dist/install_local_dependencies.sh +RUN /vt/dist/install_local_dependencies.sh +RUN echo "source /vt/local/env.sh" >> /etc/bash.bashrc + +# Allows some docker builds to disable CGO +ARG CGO_ENABLED=0 + +# Re-copy sources from working tree. +COPY --chown=vitess:vitess . /vt/src/vitess.io/vitess + +# Build and install Vitess in a temporary output directory. +USER vitess + +WORKDIR /vt/src/vitess.io/vitess +RUN make install PREFIX=/vt/install + +ENV VTROOT /vt/src/vitess.io/vitess +ENV VTDATAROOT /vt/vtdataroot +ENV PATH $VTROOT/bin:$PATH +ENV PATH="/var/opt/etcd:${PATH}" + +RUN mkdir /vt/local +COPY examples/local /vt/local + +CMD cd /vt/local && ./101_initial_cluster.sh && /bin/bash diff --git a/docker/local/install_local_dependencies.sh b/docker/local/install_local_dependencies.sh new file mode 100755 index 00000000000..b723ee99452 --- /dev/null +++ b/docker/local/install_local_dependencies.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# This is a script that gets run as part of the Dockerfile build +# to install dependencies for the vitess/mini image. +# +# Usage: install_mini_dependencies.sh + +set -euo pipefail + +# Install etcd +ETCD_VER=v3.4.9 +DOWNLOAD_URL=https://storage.googleapis.com/etcd + +curl -k -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz +mkdir -p /var/opt/etcd +sudo tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /var/opt/etcd --strip-components=1 +rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz + +mkdir -p /var/run/etcd && chown -R vitess:vitess /var/run/etcd + +# Clean up files we won't need in the final image. +rm -rf /var/lib/apt/lists/* diff --git a/docker/local/run.sh b/docker/local/run.sh new file mode 100755 index 00000000000..1774d091d05 --- /dev/null +++ b/docker/local/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker run -p 15000:15000 -p 15001:15001 --rm -it vitess/local From 11d5b09918ec60bafc679bb60e5902c1b8d562dc Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 29 Jun 2020 09:13:47 -0400 Subject: [PATCH 128/430] Fix segfault in backup retryer Not every case has `OrigErr` as non-nil, and getting at the underlying error this way can cause segfaults. It's much better to use the `Error()` function will which will safely include the error strings of any underlying errors. Signed-off-by: Andrew Mason --- go/vt/mysqlctl/s3backupstorage/retryer.go | 2 +- .../mysqlctl/s3backupstorage/retryer_test.go | 79 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 go/vt/mysqlctl/s3backupstorage/retryer_test.go diff --git a/go/vt/mysqlctl/s3backupstorage/retryer.go b/go/vt/mysqlctl/s3backupstorage/retryer.go index d3aab346259..18aaa4ed09a 100644 --- a/go/vt/mysqlctl/s3backupstorage/retryer.go +++ b/go/vt/mysqlctl/s3backupstorage/retryer.go @@ -35,7 +35,7 @@ func (retryer *ClosedConnectionRetryer) ShouldRetry(r *request.Request) bool { if r.Error != nil { if awsErr, ok := r.Error.(awserr.Error); ok { - return strings.Contains(awsErr.OrigErr().Error(), "use of closed network connection") + return strings.Contains(awsErr.Error(), "use of closed network connection") } } diff --git a/go/vt/mysqlctl/s3backupstorage/retryer_test.go b/go/vt/mysqlctl/s3backupstorage/retryer_test.go new file mode 100644 index 00000000000..35f83221170 --- /dev/null +++ b/go/vt/mysqlctl/s3backupstorage/retryer_test.go @@ -0,0 +1,79 @@ +package s3backupstorage + +import ( + "errors" + "testing" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" + "github.com/stretchr/testify/assert" +) + +type testRetryer struct{} + +func (r *testRetryer) MaxRetries() int { return 5 } +func (r *testRetryer) RetryRules(req *request.Request) time.Duration { return time.Second } +func (r *testRetryer) ShouldRetry(req *request.Request) bool { return false } + +func TestShouldRetry(t *testing.T) { + tests := []struct { + name string + r *request.Request + expected bool + }{ + + { + name: "non retryable request", + r: &request.Request{ + Retryable: aws.Bool(false), + }, + expected: false, + }, + { + name: "retryable request", + r: &request.Request{ + Retryable: aws.Bool(true), + }, + expected: true, + }, + { + name: "non aws error", + r: &request.Request{ + Retryable: nil, + Error: errors.New("some error"), + }, + expected: false, + }, + { + name: "closed connection error", + r: &request.Request{ + Retryable: nil, + Error: awserr.New("5xx", "use of closed network connection", nil), + }, + expected: true, + }, + { + name: "closed connection error (non nil origError)", + r: &request.Request{ + Retryable: nil, + Error: awserr.New("5xx", "use of closed network connection", errors.New("some error")), + }, + expected: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + retryer := &ClosedConnectionRetryer{&testRetryer{}} + msg := "" + if test.r.Error != nil { + if awsErr, ok := test.r.Error.(awserr.Error); ok { + msg = awsErr.Error() + } + } + assert.Equal(t, test.expected, retryer.ShouldRetry(test.r), msg) + }) + } +} From 779c72c83b7e0f12dac1784f06e288aaf224cc6a Mon Sep 17 00:00:00 2001 From: huiqing Date: Mon, 29 Jun 2020 11:12:12 -0700 Subject: [PATCH 129/430] address review comments Signed-off-by: huiqing --- go/vt/vtgate/executor_test.go | 32 +++++++++++++++++++++++++++++++ go/vt/vtgate/vcursor_impl.go | 2 +- go/vt/vtgate/vcursor_impl_test.go | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index 60d0dc2de3b..c7a4a854643 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -2013,6 +2013,22 @@ func TestGetPlanCacheUnnormalized(t *testing.T) { if len(r.plans.Keys()) != 1 { t.Errorf("Plan keys should be 1, got: %v", len(r.plans.Keys())) } + + // the target string will be resolved and become part of the plan cache key, which adds a new entry + ksIDVc1, _ := newVCursorImpl(context.Background(), NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "[deadbeef]"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver) + _, err = r.getPlan(ksIDVc1, query1, makeComments(" /* comment */"), map[string]*querypb.BindVariable{}, false, logStats1) + require.NoError(t, err) + if len(r.plans.Keys()) != 2 { + t.Errorf("Plan keys should be 2, got: %v", len(r.plans.Keys())) + } + + // the target string will be resolved and become part of the plan cache key, as it's an unsharded ks, it will be the same entry as above + ksIDVc2, _ := newVCursorImpl(context.Background(), NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "[beefdead]"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver) + _, err = r.getPlan(ksIDVc2, query1, makeComments(" /* comment */"), map[string]*querypb.BindVariable{}, false, logStats1) + require.NoError(t, err) + if len(r.plans.Keys()) != 2 { + t.Errorf("Plan keys should be 2, got: %v", len(r.plans.Keys())) + } } func TestGetPlanCacheNormalized(t *testing.T) { @@ -2059,6 +2075,22 @@ func TestGetPlanCacheNormalized(t *testing.T) { if len(r.plans.Keys()) != 1 { t.Errorf("Plan keys should be 1, got: %v", len(r.plans.Keys())) } + + // the target string will be resolved and become part of the plan cache key, which adds a new entry + ksIDVc1, _ := newVCursorImpl(context.Background(), NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "[deadbeef]"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver) + _, err = r.getPlan(ksIDVc1, query1, makeComments(" /* comment */"), map[string]*querypb.BindVariable{}, false, logStats1) + require.NoError(t, err) + if len(r.plans.Keys()) != 2 { + t.Errorf("Plan keys should be 2, got: %v", len(r.plans.Keys())) + } + + // the target string will be resolved and become part of the plan cache key, as it's an unsharded ks, it will be the same entry as above + ksIDVc2, _ := newVCursorImpl(context.Background(), NewSafeSession(&vtgatepb.Session{TargetString: KsTestUnsharded + "[beefdead]"}), makeComments(""), r, nil, r.vm, r.VSchema(), r.resolver.resolver) + _, err = r.getPlan(ksIDVc2, query1, makeComments(" /* comment */"), map[string]*querypb.BindVariable{}, false, logStats1) + require.NoError(t, err) + if len(r.plans.Keys()) != 2 { + t.Errorf("Plan keys should be 2, got: %v", len(r.plans.Keys())) + } } func TestGetPlanNormalized(t *testing.T) { diff --git a/go/vt/vtgate/vcursor_impl.go b/go/vt/vtgate/vcursor_impl.go index c0dfeb98772..dc9cd7df9c9 100644 --- a/go/vt/vtgate/vcursor_impl.go +++ b/go/vt/vtgate/vcursor_impl.go @@ -431,7 +431,7 @@ func (vc *vcursorImpl) planPrefixKey() string { shards[i] = resolved[i].Target.GetShard() } sort.Strings(shards) - return fmt.Sprintf("%s%sDestinationKeyspaceIDsResolved(%s)", vc.keyspace, vindexes.TabletTypeSuffix[vc.tabletType], strings.Join(shards, ",")) + return fmt.Sprintf("%s%sKsIDsResolved(%s)", vc.keyspace, vindexes.TabletTypeSuffix[vc.tabletType], strings.Join(shards, ",")) } default: // use destination string (out of the switch) diff --git a/go/vt/vtgate/vcursor_impl_test.go b/go/vt/vtgate/vcursor_impl_test.go index d3252034eb2..823f8e77eb2 100644 --- a/go/vt/vtgate/vcursor_impl_test.go +++ b/go/vt/vtgate/vcursor_impl_test.go @@ -300,7 +300,7 @@ func TestPlanPrefixKey(t *testing.T) { }, { vschema: vschemaWith1KS, targetString: "ks1[deadbeef]", - expectedPlanPrefixKey: "ks1@masterDestinationKeyspaceIDsResolved(80-)", + expectedPlanPrefixKey: "ks1@masterKsIDsResolved(80-)", }} for i, tc := range tests { From f4b8375508b8c2c4fbb9fc8a81ffe0c48b770483 Mon Sep 17 00:00:00 2001 From: Arindam Nayak Date: Tue, 30 Jun 2020 00:25:47 +0530 Subject: [PATCH 130/430] added wait for gtid catch up Signed-off-by: Arindam Nayak --- go/vt/vtctl/vtctl.go | 3 +++ go/vt/vttablet/tabletmanager/restore.go | 35 +++++++++++++++---------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 524cd2b84ba..f64f5607809 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -1640,6 +1640,9 @@ func commandCreateKeyspace(ctx context.Context, wr *wrangler.Wrangler, subFlags if err != nil { return err } + if timeTime.After(time.Now()) { + return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "snapshot_time can not be more than current time") + } snapshotTime = logutil.TimeToProto(timeTime) } ki := &topodatapb.Keyspace{ diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 40051d9e6cc..9240d6aae98 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -144,6 +144,7 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. if keyspaceInfo.SnapshotTime != nil { err = agent.restoreToTimeFromBinlog(ctx, pos, keyspaceInfo.SnapshotTime) if err != nil { + log.Errorf("unable to restore to the desired point, error : %v", err) return nil } } @@ -187,26 +188,21 @@ func (agent *ActionAgent) restoreDataLocked(ctx context.Context, logger logutil. return nil } +// restoreToTimeFromBinlog restores to the snapshot time of the keyspace +// currently this works with mysql based database only (as it uses mysql specific queries for restoring func (agent *ActionAgent) restoreToTimeFromBinlog(ctx context.Context, pos mysql.Position, restoreTime *vttime.Time) error { // validate the dependent settings if *binlogHost == "" || *binlogPort <= 0 || *binlogUser == "" { - return vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "restore_to_time flag depends on binlog server flags(binlog_host, binlog_port, binlog_user, binlog_password)") + log.Warning("invalid binlog server setting, restoring to last available backup.") + return nil } - //if restoreTime.Seconds > int64(time.Now().Second()) { - // println(restoreTime.Seconds) - // println(time.Now().Second()) - // log.Warning("Restore time request is a future date, so skipping it") - // return nil - //} - println("restoring from below time") - println(restoreTime.Seconds) gtid := agent.getGTIDFromTimestamp(ctx, pos, restoreTime.Seconds) if gtid == "" { return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "unable to fetch the GTID for the specified restore_to_time") } - println(fmt.Sprintf("going to restore upto the gtid - %s", gtid)) + log.Infof("going to restore upto the gtid - %s", gtid) err := agent.catchupToGTID(ctx, gtid) if err != nil { return vterrors.Wrapf(err, "unable to replicate upto specified gtid : %s", gtid) @@ -274,20 +270,31 @@ func (agent *ActionAgent) catchupToGTID(ctx context.Context, gtid string) error gtidStr := gtidParsed.GTIDSet.Last() log.Infof("gtid to restore upto %s", gtidStr) - //gtidNew := strings.Split(gtidStr, ":")[0] + ":" + strings.Split(strings.Split(gtidStr, ":")[1], "-")[1] - // TODO: we can use agent.MysqlDaemon.SetMaster , but it uses replDbConfig + // it uses mysql specific queries here cmds := []string{ "STOP SLAVE FOR CHANNEL '' ", "STOP SLAVE IO_THREAD FOR CHANNEL ''", fmt.Sprintf("CHANGE MASTER TO MASTER_HOST='%s',MASTER_PORT=%d, MASTER_USER='%s', MASTER_AUTO_POSITION = 1;", *binlogHost, *binlogPort, *binlogUser), fmt.Sprintf(" START SLAVE UNTIL SQL_BEFORE_GTIDS = '%s'", gtidStr), } - fmt.Printf("%v", cmds) if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { return vterrors.Wrap(err, "failed to reset slave") } - // TODO: Wait for the replication to happen and then reset the slave, so that we don't be connected to binlog server + log.Infof("Wating for position to reach") + err = agent.MysqlDaemon.WaitMasterPos(ctx, gtidParsed) + if err != nil { + return err + } + log.Infof("Position reached, resetting the slave") + // Once the position is reached, then reset the slave + cmds = []string{ + "STOP SLAVE", + "RESET SLAVE ALL", + } + if err := agent.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds); err != nil { + return vterrors.Wrap(err, "failed to reset slave") + } return nil } From e76b82bf84d1dc8177f66409c1955089c5b995ab Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Tue, 30 Jun 2020 10:01:37 +0200 Subject: [PATCH 131/430] reserve-conn: improved unit test coverage Signed-off-by: Andres Taylor Signed-off-by: Harshit Gangal --- go/vt/vttablet/tabletserver/query_executor.go | 2 +- .../tabletserver/stateful_connection.go | 16 ++-- .../tabletserver/stateful_connection_pool.go | 4 +- .../stateful_connection_pool_test.go | 2 +- go/vt/vttablet/tabletserver/tx_engine.go | 15 ++-- go/vt/vttablet/tabletserver/tx_engine_test.go | 74 +++++++++++++++++++ 6 files changed, 91 insertions(+), 22 deletions(-) diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index cb49b89d377..1a15a330841 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -238,7 +238,7 @@ func (qre *QueryExecutor) Stream(callback func(*sqltypes.Result) error) error { return err } defer txConn.Unlock() - conn = txConn.UnderlyingdDBConn() + conn = txConn.UnderlyingDBConn() } else { dbConn, err := qre.getStreamConn() if err != nil { diff --git a/go/vt/vttablet/tabletserver/stateful_connection.go b/go/vt/vttablet/tabletserver/stateful_connection.go index e357643828b..e5b4809764c 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection.go +++ b/go/vt/vttablet/tabletserver/stateful_connection.go @@ -128,10 +128,10 @@ func (sc *StatefulConnection) Releasef(reasonFormat string, a ...interface{}) { //Renew the existing connection with new connection id. func (sc *StatefulConnection) Renew() error { - err := sc.pool.RenewConn(sc) + err := sc.pool.renewConn(sc) if err != nil { sc.Close() - return vterrors.Wrap(err, "connection renew failed: ") + return vterrors.Wrap(err, "connection renew failed") } return nil } @@ -155,8 +155,8 @@ func (sc *StatefulConnection) ID() tx.ConnID { return sc.ConnID } -//UnderlyingdDBConn returns the underlying database connection -func (sc *StatefulConnection) UnderlyingdDBConn() *connpool.DBConn { +//UnderlyingDBConn returns the underlying database connection +func (sc *StatefulConnection) UnderlyingDBConn() *connpool.DBConn { return sc.dbConn } @@ -172,11 +172,11 @@ func (sc *StatefulConnection) Stats() *tabletenv.Stats { //Taint taints the existing connection. func (sc *StatefulConnection) Taint() { - if sc.tainted { - return - } sc.tainted = true - sc.dbConn.Taint() + // if we don't have an active dbConn, we can silently ignore this request + if sc.dbConn != nil { + sc.dbConn.Taint() + } } //IsTainted tells us whether this connection is tainted diff --git a/go/vt/vttablet/tabletserver/stateful_connection_pool.go b/go/vt/vttablet/tabletserver/stateful_connection_pool.go index 799140e476e..f4e7acc32cb 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection_pool.go +++ b/go/vt/vttablet/tabletserver/stateful_connection_pool.go @@ -194,8 +194,8 @@ func (sf *StatefulConnectionPool) Capacity() int { return int(sf.conns.Capacity()) } -//RenewConn unregister and registers with new id. -func (sf *StatefulConnectionPool) RenewConn(sc *StatefulConnection) error { +//renewConn unregister and registers with new id. +func (sf *StatefulConnectionPool) renewConn(sc *StatefulConnection) error { sf.active.Unregister(sc.ConnID, "renew existing connection") sc.ConnID = sf.lastID.Add(1) return sf.active.Register(sc.ConnID, sc, sc.enforceTimeout) diff --git a/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go b/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go index deb5f02979d..a0a69e89bf3 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go +++ b/go/vt/vttablet/tabletserver/stateful_connection_pool_test.go @@ -20,8 +20,8 @@ import ( "context" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gotest.tools/assert" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 1802e159b13..4396793fb67 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -565,7 +565,7 @@ func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOp defer span.Finish() conn, err := te.reserve(ctx, options, preQueries) if err != nil { - return 0, err + return 0, vterrors.Wrap(err, "TxEngine.ReserveBegin") } defer conn.Unlock() _, err = te.txPool.begin(ctx, options, te.state == AcceptingReadOnly, conn) @@ -584,7 +584,7 @@ func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions if txID == 0 { conn, err := te.reserve(ctx, options, preQueries) if err != nil { - return 0, err + return 0, vterrors.Wrap(err, "TxEngine.Reserve") } defer conn.Unlock() return conn.ID(), nil @@ -592,13 +592,13 @@ func (te *TxEngine) Reserve(ctx context.Context, options *querypb.ExecuteOptions conn, err := te.txPool.GetAndLock(txID, "to reserve") if err != nil { - return 0, err + return 0, vterrors.Wrap(err, "TxEngine.Reserve") } defer conn.Unlock() err = te.taintConn(ctx, conn, preQueries) if err != nil { - return 0, err + return 0, vterrors.Wrap(err, "TxEngine.Reserve") } return conn.ID(), nil } @@ -611,13 +611,8 @@ func (te *TxEngine) reserve(ctx context.Context, options *querypb.ExecuteOptions if !canOpenTransactions { // We are not in a state where we can start new transactions. Abort. te.stateLock.Unlock() - return nil, vterrors.Errorf(vtrpc.Code_UNAVAILABLE, "tx engine can't accept new transactions in state %v", te.state) + return nil, vterrors.Errorf(vtrpc.Code_UNAVAILABLE, "cannot provide new connection in state %v", te.state) } - // By Add() to beginRequests, we block others from initiating state - // changes until we have finished adding this transaction - te.beginRequests.Add(1) - defer te.beginRequests.Done() - te.stateLock.Unlock() conn, err := te.txPool.scp.NewConn(ctx, options) diff --git a/go/vt/vttablet/tabletserver/tx_engine_test.go b/go/vt/vttablet/tabletserver/tx_engine_test.go index 94c542b38fa..a045b89a019 100644 --- a/go/vt/vttablet/tabletserver/tx_engine_test.go +++ b/go/vt/vttablet/tabletserver/tx_engine_test.go @@ -17,12 +17,15 @@ limitations under the License. package tabletserver import ( + "errors" "fmt" "strings" "sync" "testing" "time" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -159,7 +162,36 @@ func TestTxEngineBegin(t *testing.T) { _, _, err = te.Commit(ctx, tx2) require.NoError(t, err) require.Equal(t, "begin;commit", db.QueryLog()) +} + +func TestTxEngineRenewFails(t *testing.T) { + db := setUpQueryExecutorTest(t) + defer db.Close() + db.AddQueryPattern(".*", &sqltypes.Result{}) + config := tabletenv.NewDefaultConfig() + config.DB = newDBConfigs(db) + te := NewTxEngine(tabletenv.NewEnv(config, "TabletServerTest")) + te.AcceptReadOnly() + options := &querypb.ExecuteOptions{} + connID, err := te.ReserveBegin(ctx, options, nil) + require.NoError(t, err) + + conn, err := te.txPool.GetAndLock(connID, "for test") + require.NoError(t, err) + conn.Unlock() // but we keep holding on to it... sneaky.... + // this next bit sets up the scp so our renew will fail + conn2, err := te.txPool.scp.NewConn(ctx, options) + require.NoError(t, err) + defer conn2.Release(tx.TxCommit) + te.txPool.scp.lastID.Set(conn2.ConnID - 1) + + // commit will do a renew + dbConn := conn.dbConn + _, _, err = te.Commit(ctx, connID) + require.Error(t, err) + assert.True(t, conn.IsClosed(), "connection was not closed") + assert.True(t, dbConn.IsClosed(), "underlying connection was not closed") } type TxType int @@ -504,3 +536,45 @@ func startTransaction(te *TxEngine, writeTransaction bool) error { _, _, err := te.Begin(context.Background(), 0, options) return err } + +func TestTxEngineFailReserve(t *testing.T) { + db := setUpQueryExecutorTest(t) + defer db.Close() + db.AddQueryPattern(".*", &sqltypes.Result{}) + config := tabletenv.NewDefaultConfig() + config.DB = newDBConfigs(db) + te := NewTxEngine(tabletenv.NewEnv(config, "TabletServerTest")) + + options := &querypb.ExecuteOptions{} + _, err := te.Reserve(ctx, options, 0, nil) + require.EqualError(t, err, "TxEngine.Reserve: cannot provide new connection in state NotServing") + + _, err = te.ReserveBegin(ctx, options, nil) + require.EqualError(t, err, "TxEngine.ReserveBegin: cannot provide new connection in state NotServing") + + te.AcceptReadOnly() + + db.AddRejectedQuery("dummy_query", errors.New("failed executing dummy_query")) + _, err = te.Reserve(ctx, options, 0, []string{"dummy_query"}) + require.EqualError(t, err, "TxEngine.Reserve: unknown error: failed executing dummy_query (errno 1105) (sqlstate HY000) during query: dummy_query") + + _, err = te.ReserveBegin(ctx, options, []string{"dummy_query"}) + require.EqualError(t, err, "TxEngine.ReserveBegin: unknown error: failed executing dummy_query (errno 1105) (sqlstate HY000) during query: dummy_query") + + nonExistingID := int64(42) + _, err = te.Reserve(ctx, options, nonExistingID, nil) + require.EqualError(t, err, "TxEngine.Reserve: transaction 42: not found") + + txID, _, err := te.Begin(ctx, 0, options) + require.NoError(t, err) + conn, err := te.txPool.GetAndLock(txID, "for test") + require.NoError(t, err) + conn.Unlock() // but we keep holding on to it... sneaky.... + + _, err = te.Reserve(ctx, options, txID, []string{"dummy_query"}) + require.EqualError(t, err, "TxEngine.Reserve: unknown error: failed executing dummy_query (errno 1105) (sqlstate HY000) during query: dummy_query") + + connID, _, err := te.Commit(ctx, txID) + require.Error(t, err) + assert.Zero(t, connID) +} From 94a8c7e48ad06a403a5b0364dfb61f0243daabd2 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sun, 28 Jun 2020 11:25:32 +0200 Subject: [PATCH 132/430] VStream Client: send current position events immediately Signed-off-by: Rohit Nayak --- go/vt/vtgate/endtoend/vstream_test.go | 58 +++++++++++++++++++++++++++ go/vt/vtgate/vstream_manager.go | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/go/vt/vtgate/endtoend/vstream_test.go b/go/vt/vtgate/endtoend/vstream_test.go index 301cda7a753..e2632077e08 100644 --- a/go/vt/vtgate/endtoend/vstream_test.go +++ b/go/vt/vtgate/endtoend/vstream_test.go @@ -210,6 +210,64 @@ func TestVStreamCopyBasic(t *testing.T) { } } +func TestVStreamCurrent(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + gconn, conn, mconn, closeConnections := initialize(ctx, t) + defer closeConnections() + + _, err := conn.ExecuteFetch("insert into t1(id1,id2) values(1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8)", 1, false) + if err != nil { + t.Fatal(err) + } + + var shardGtids []*binlogdatapb.ShardGtid + var vgtid = &binlogdatapb.VGtid{} + shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ + Keyspace: "ks", + Shard: "-80", + Gtid: "current", + }) + shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ + Keyspace: "ks", + Shard: "80-", + Gtid: "current", + }) + vgtid.ShardGtids = shardGtids + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + Filter: "select * from t1", + }}, + } + reader, err := gconn.VStream(ctx, topodatapb.TabletType_MASTER, vgtid, filter) + _, _ = conn, mconn + if err != nil { + t.Fatal(err) + } + numExpectedEvents := 4 // vgtid+other per shard for "current" + require.NotNil(t, reader) + var evs []*binlogdatapb.VEvent + for { + e, err := reader.Recv() + switch err { + case nil: + evs = append(evs, e...) + printEvents(evs) // for debugging ci failures + if len(evs) == numExpectedEvents { + t.Logf("TestVStreamCurrent was successful") + return + } + case io.EOF: + log.Infof("stream ended\n") + cancel() + default: + log.Errorf("Returned err %v", err) + t.Fatalf("remote error: %v\n", err) + } + } +} + var printMu sync.Mutex func printEvents(evs []*binlogdatapb.VEvent) { diff --git a/go/vt/vtgate/vstream_manager.go b/go/vt/vtgate/vstream_manager.go index 21813cb1c85..7e4e4a189df 100644 --- a/go/vt/vtgate/vstream_manager.go +++ b/go/vt/vtgate/vstream_manager.go @@ -244,7 +244,7 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha ev := proto.Clone(event).(*binlogdatapb.VEvent) ev.RowEvent.TableName = sgtid.Keyspace + "." + ev.RowEvent.TableName sendevents = append(sendevents, ev) - case binlogdatapb.VEventType_COMMIT, binlogdatapb.VEventType_DDL: + case binlogdatapb.VEventType_COMMIT, binlogdatapb.VEventType_DDL, binlogdatapb.VEventType_OTHER: sendevents = append(sendevents, event) eventss = append(eventss, sendevents) if err := vs.sendAll(sgtid, eventss); err != nil { From 75e4f696614342f14fecf36c8128c6e722c04f8d Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Tue, 30 Jun 2020 12:30:47 +0200 Subject: [PATCH 133/430] VStream Client: simplify test Signed-off-by: Rohit Nayak --- go/vt/vtgate/endtoend/vstream_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/go/vt/vtgate/endtoend/vstream_test.go b/go/vt/vtgate/endtoend/vstream_test.go index e2632077e08..4d32cf7c126 100644 --- a/go/vt/vtgate/endtoend/vstream_test.go +++ b/go/vt/vtgate/endtoend/vstream_test.go @@ -216,11 +216,6 @@ func TestVStreamCurrent(t *testing.T) { gconn, conn, mconn, closeConnections := initialize(ctx, t) defer closeConnections() - _, err := conn.ExecuteFetch("insert into t1(id1,id2) values(1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8)", 1, false) - if err != nil { - t.Fatal(err) - } - var shardGtids []*binlogdatapb.ShardGtid var vgtid = &binlogdatapb.VGtid{} shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ From c9bbeb55ee8e59b64c4274066390025e7105abc6 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Tue, 30 Jun 2020 14:40:29 +0300 Subject: [PATCH 134/430] enable heartbeat Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- docker/mini/vttablet-mini-up.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/mini/vttablet-mini-up.sh b/docker/mini/vttablet-mini-up.sh index 030a076bf40..6d31ccc9b9c 100755 --- a/docker/mini/vttablet-mini-up.sh +++ b/docker/mini/vttablet-mini-up.sh @@ -50,6 +50,8 @@ vttablet \ -init_shard $shard \ -init_tablet_type $tablet_type \ -health_check_interval 5s \ + -heartbeat_enable \ + -heartbeat_interval 500ms \ -enable_semi_sync \ -enable_replication_reporter \ -backup_storage_implementation file \ From bd3c8ba24ef0a012ba7a6fd2f91d59c488f86884 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Tue, 30 Jun 2020 10:11:02 -0700 Subject: [PATCH 135/430] Apply suggestions from code review Signed-off-by: deepthi --- go/vt/vttablet/tabletserver/tabletserver_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 6ea2c1b190f..4e506ef1f21 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -933,7 +933,7 @@ func TestTabletServerExecNonExistentConnection(t *testing.T) { defer tsv.StopService() options := &querypb.ExecuteOptions{} - // run a query in a non-existingt reserved id + // run a query with a non-existent reserved id _, err = tsv.Execute(ctx, &target, "select 42", nil, 0, 123456, options) require.Error(t, err) } @@ -951,7 +951,7 @@ func TestTabletServerReleaseNonExistentConnection(t *testing.T) { require.NoError(t, err) defer tsv.StopService() - // run a query in a non-existingt reserved id + // run a query with a non-existent reserved id err = tsv.Release(ctx, &target, 0, 123456) require.Error(t, err) } @@ -970,7 +970,7 @@ func TestMakeSureToCloseDbConnWhenBeginQueryFails(t *testing.T) { defer tsv.StopService() options := &querypb.ExecuteOptions{} - // run a query in a non-existingt reserved id + // run a query with a non-existent reserved id _, _, _, _, err = tsv.ReserveBeginExecute(ctx, &target, "select 42", []string{}, nil, options) require.Error(t, err) } From 0681f8112adbe5196e7325ba603a06b6938407c3 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Tue, 30 Jun 2020 19:31:58 +0200 Subject: [PATCH 136/430] Schema Version Table: change ddl column to blob. Breaking change! Signed-off-by: Rohit Nayak --- go/vt/vttablet/endtoend/vstreamer_test.go | 91 ++++++++++++++++++- go/vt/vttablet/tabletserver/schema/tracker.go | 2 +- go/vt/withddl/withddl.go | 2 +- 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/go/vt/vttablet/endtoend/vstreamer_test.go b/go/vt/vttablet/endtoend/vstreamer_test.go index 7c1f6e39234..4041e246266 100644 --- a/go/vt/vttablet/endtoend/vstreamer_test.go +++ b/go/vt/vttablet/endtoend/vstreamer_test.go @@ -302,6 +302,95 @@ func TestSchemaVersioning(t *testing.T) { log.Info("=== END OF TEST") } +func TestSchemaVersioningLongDDL(t *testing.T) { + // Let's disable the already running tracker to prevent it from + // picking events from the previous test, and then re-enable it at the end. + tsv := framework.Server + tsv.EnableHistorian(false) + tsv.SetTracking(false) + defer tsv.EnableHistorian(true) + defer tsv.SetTracking(true) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + tsv.EnableHistorian(true) + tsv.SetTracking(true) + + target := &querypb.Target{ + Keyspace: "vttest", + Shard: "0", + TabletType: tabletpb.TabletType_MASTER, + Cell: "", + } + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "/.*/", + }}, + } + longDDL := "create table vitess_version (" + for i := 0; i < 100; i++ { + col := fmt.Sprintf("id%d_%s int", i, strings.Repeat("0", 10)) + if i != 99 { + col += ", " + } + longDDL += col + } + longDDL += ")" + + var cases = []test{ + { + query: longDDL, + output: []string{ + `gtid`, //gtid+other => vstream current pos + `other`, + `gtid`, //gtid+ddl => actual query + fmt.Sprintf("type:DDL ddl:\"%s\" ", longDDL), + `gtid`, + `other`, //gtid+other => for ddl "insert into _vt.schema_version ...", ddl is not sent + `version`, + `gtid`, + }, + }, + } + eventCh := make(chan []*binlogdatapb.VEvent) + var startPos string + send := func(events []*binlogdatapb.VEvent) error { + var evs []*binlogdatapb.VEvent + for _, event := range events { + if event.Type == binlogdatapb.VEventType_GTID { + if startPos == "" { + startPos = event.Gtid + } + } + if event.Type == binlogdatapb.VEventType_HEARTBEAT { + continue + } + log.Infof("Received event %v", event) + evs = append(evs, event) + } + select { + case eventCh <- evs: + case <-ctx.Done(): + return nil + } + return nil + } + go func() { + defer close(eventCh) + if err := tsv.VStream(ctx, target, "current", nil, filter, send); err != nil { + fmt.Printf("Error in tsv.VStream: %v", err) + t.Error(err) + } + }() + runCases(ctx, t, cases, eventCh) + + cancel() + + client := framework.NewClient() + client.Execute("drop table vitess_version", nil) + client.Execute("drop table _vt.schema_version", nil) +} + func runCases(ctx context.Context, t *testing.T, tests []test, eventCh chan []*binlogdatapb.VEvent) { client := framework.NewClient() @@ -325,7 +414,7 @@ func expectLogs(ctx context.Context, t *testing.T, query string, eventCh chan [] timer := time.NewTimer(5 * time.Second) defer timer.Stop() var evs []*binlogdatapb.VEvent - log.Infof("In expectLogs for query %s, output len %s", query, len(output)) + log.Infof("In expectLogs for query %s, output len %d", query, len(output)) for { select { case allevs, ok := <-eventCh: diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 274eba88175..1ad3416bbc2 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -36,7 +36,7 @@ const createSchemaTrackingTable = `CREATE TABLE IF NOT EXISTS _vt.schema_version id INT AUTO_INCREMENT, pos VARBINARY(10000) NOT NULL, time_updated BIGINT(20) NOT NULL, - ddl VARBINARY(1000) DEFAULT NULL, + ddl BLOB NOT NULL, schemax BLOB NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB` diff --git a/go/vt/withddl/withddl.go b/go/vt/withddl/withddl.go index 9cfb3c3329d..95fb3fd3aaf 100644 --- a/go/vt/withddl/withddl.go +++ b/go/vt/withddl/withddl.go @@ -64,7 +64,7 @@ func (wd *WithDDL) Exec(ctx context.Context, query string, f interface{}) (*sqlt return nil, err } - log.Info("Updating schema for %v and retrying: %v", query, err) + log.Infof("Updating schema for %v and retrying: %v", query, err) for _, query := range wd.ddls { _, merr := exec(query) if merr == nil { From 1cc4907ddfacae9b45ebf04661920265a2b9d777 Mon Sep 17 00:00:00 2001 From: akilan Date: Wed, 1 Jul 2020 05:58:16 +0400 Subject: [PATCH 137/430] fixing linter errors Signed-off-by: akilan --- .github/workflows/golangci-linter.yml | 23 +++++++++++++++++++ go/cmd/automation_client/automation_client.go | 4 ++-- go/cmd/mysqlctl/mysqlctl.go | 3 ++- go/cmd/zkctl/zkctl.go | 3 ++- go/mysql/binlog_event_make_test.go | 10 +++++++- go/mysql/query_test.go | 2 +- go/mysql/replication.go | 16 ++++++------- go/mysql/replication_constants.go | 4 ++-- .../backup/vtctlbackup/backup_utils.go | 4 ++-- .../vtctldweb/vtctld_web_main_test.go | 15 ++++++------ go/test/endtoend/vtgate/schema/schema_test.go | 2 +- go/vt/grpcclient/client.go | 2 +- go/vt/mysqlctl/builtinbackupengine.go | 2 +- go/vt/mysqlctl/grpcmysqlctlclient/client.go | 2 +- go/vt/mysqlctl/mycnf_test.go | 3 ++- go/vt/mysqlctl/mysqld.go | 2 +- go/vt/mysqlctl/replication.go | 6 ++--- go/vt/mysqlctl/tmutils/schema_test.go | 2 +- go/vt/sqlparser/precedence_test.go | 2 +- go/vt/throttler/max_replication_lag_module.go | 2 +- go/vt/topo/consultopo/server.go | 2 +- .../clientset/versioned/fake/register.go | 2 +- go/vt/topo/k8stopo/server.go | 2 +- go/vt/vtctl/backup.go | 2 +- go/vt/vtgate/executor.go | 2 +- go/vt/vtgate/executor_vschema_ddl_test.go | 3 ++- go/vt/vtgate/planbuilder/plan_test.go | 2 +- go/vt/workflow/resharding/workflow.go | 2 +- .../reshardingworkflowgen/workflow.go | 4 ++-- go/vt/wrangler/reparent.go | 2 +- misc/git/hooks/golangci-lint | 18 +++++++++------ misc/git/ps1 | 0 32 files changed, 95 insertions(+), 55 deletions(-) create mode 100644 .github/workflows/golangci-linter.yml mode change 100644 => 100755 misc/git/ps1 diff --git a/.github/workflows/golangci-linter.yml b/.github/workflows/golangci-linter.yml new file mode 100644 index 00000000000..0862c6fed3e --- /dev/null +++ b/.github/workflows/golangci-linter.yml @@ -0,0 +1,23 @@ +name: golangci-lint +on: [push,pull_request] +jobs: + + build: + name: Build + runs-on: ubuntu-latest + steps: + + - name: Set up Go 1.13 + uses: actions/setup-go@v1 + with: + go-version: 1.13 + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v1 + + - name: Install golangci-lint + run: curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(go env GOPATH)/bin v1.27.0 + + - name: Run golangci-lint + run: $(go env GOPATH)/bin/golangci-lint run --disable=errcheck --timeout=10m go/... diff --git a/go/cmd/automation_client/automation_client.go b/go/cmd/automation_client/automation_client.go index 4cea96c83d0..94553f1318d 100644 --- a/go/cmd/automation_client/automation_client.go +++ b/go/cmd/automation_client/automation_client.go @@ -92,7 +92,7 @@ func main() { Parameters: params.parameters, } fmt.Printf("Sending request:\n%v", proto.MarshalTextString(enqueueRequest)) - enqueueResponse, err := client.EnqueueClusterOperation(context.Background(), enqueueRequest, grpc.FailFast(false)) + enqueueResponse, err := client.EnqueueClusterOperation(context.Background(), enqueueRequest, grpc.FailFast(false)) //nolint if err != nil { fmt.Println("Failed to enqueue ClusterOperation. Error:", err) os.Exit(4) @@ -113,7 +113,7 @@ func waitForClusterOp(client automationservicepb.AutomationClient, id string) (* Id: id, } - resp, err := client.GetClusterOperationDetails(context.Background(), req, grpc.FailFast(false)) + resp, err := client.GetClusterOperationDetails(context.Background(), req, grpc.FailFast(false)) //nolint if err != nil { return nil, fmt.Errorf("failed to get ClusterOperation Details. Request: %v Error: %v", req, err) } diff --git a/go/cmd/mysqlctl/mysqlctl.go b/go/cmd/mysqlctl/mysqlctl.go index 8793d8420a6..362e2a41bfa 100644 --- a/go/cmd/mysqlctl/mysqlctl.go +++ b/go/cmd/mysqlctl/mysqlctl.go @@ -42,7 +42,8 @@ var ( tabletUID = flag.Uint("tablet_uid", 41983, "tablet uid") mysqlSocket = flag.String("mysql_socket", "", "path to the mysql socket") - tabletAddr string + // Reason for nolint : Being used in line 246 (tabletAddr = netutil.JoinHostPort("localhost", int32(*port)) + tabletAddr string //nolint ) func initConfigCmd(subFlags *flag.FlagSet, args []string) error { diff --git a/go/cmd/zkctl/zkctl.go b/go/cmd/zkctl/zkctl.go index 7e19fd079d2..310e88c705b 100644 --- a/go/cmd/zkctl/zkctl.go +++ b/go/cmd/zkctl/zkctl.go @@ -41,7 +41,8 @@ var ( myID = flag.Uint("zk.myid", 0, "which server do you want to be? only needed when running multiple instance on one box, otherwise myid is implied by hostname") - stdin *bufio.Reader + // Reason for nolint : Used in line 54 (stdin = bufio.NewReader(os.Stdin)) in the init function + stdin *bufio.Reader //nolint ) func init() { diff --git a/go/mysql/binlog_event_make_test.go b/go/mysql/binlog_event_make_test.go index 040a0ac77c3..03de2febeca 100644 --- a/go/mysql/binlog_event_make_test.go +++ b/go/mysql/binlog_event_make_test.go @@ -307,7 +307,15 @@ func TestRowsEvent(t *testing.T) { f := NewMySQL56BinlogFormat() s := NewFakeBinlogStream() - tableID := uint64(0x102030405060) + /* + Reason for nolint + Used in line 384 to 387 + tableID = event.TableID(f) + if tableID != 0x102030405060 { + t.Fatalf("NewRowsEvent().TableID returned %x", tableID) + } + */ + tableID := uint64(0x102030405060) //nolint tm := &TableMap{ Flags: 0x8090, diff --git a/go/mysql/query_test.go b/go/mysql/query_test.go index f0529a1bc90..8273759c38d 100644 --- a/go/mysql/query_test.go +++ b/go/mysql/query_test.go @@ -641,7 +641,7 @@ func checkQueryInternal(t *testing.T, query string, sConn, cConn *Conn, result * } } -//lint:ignore U1000 for now, because deleting this function causes more errors +//nolint func writeResult(conn *Conn, result *sqltypes.Result) error { if len(result.Fields) == 0 { return conn.writeOKPacket(result.RowsAffected, result.InsertID, conn.StatusFlags, 0) diff --git a/go/mysql/replication.go b/go/mysql/replication.go index d10925b6ddd..c46642a4dc5 100644 --- a/go/mysql/replication.go +++ b/go/mysql/replication.go @@ -54,14 +54,14 @@ func (c *Conn) WriteComBinlogDumpGTID(serverID uint32, binlogFilename string, bi 4 + // data-size len(gtidSet) // data data, pos := c.startEphemeralPacketWithHeader(length) - pos = writeByte(data, pos, ComBinlogDumpGTID) - pos = writeUint16(data, pos, flags) - pos = writeUint32(data, pos, serverID) - pos = writeUint32(data, pos, uint32(len(binlogFilename))) - pos = writeEOFString(data, pos, binlogFilename) - pos = writeUint64(data, pos, binlogPos) - pos = writeUint32(data, pos, uint32(len(gtidSet))) - pos += copy(data[pos:], gtidSet) + pos = writeByte(data, pos, ComBinlogDumpGTID) //nolint + pos = writeUint16(data, pos, flags) //nolint + pos = writeUint32(data, pos, serverID) //nolint + pos = writeUint32(data, pos, uint32(len(binlogFilename))) //nolint + pos = writeEOFString(data, pos, binlogFilename) //nolint + pos = writeUint64(data, pos, binlogPos) //nolint + pos = writeUint32(data, pos, uint32(len(gtidSet))) //nolint + pos += copy(data[pos:], gtidSet) //nolint if err := c.writeEphemeralPacket(); err != nil { return NewSQLError(CRServerGone, SSUnknownSQLState, "%v", err) } diff --git a/go/mysql/replication_constants.go b/go/mysql/replication_constants.go index da0a4740744..f6689313f94 100644 --- a/go/mysql/replication_constants.go +++ b/go/mysql/replication_constants.go @@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ - +//nolint:unparam package mysql // This file contains the constant definitions for this package. @@ -208,7 +208,7 @@ const ( //eXAPrepareLogEvent = 38 // MariaDB specific values. They start at 160. - eMariaAnnotateRowsEvent = 160 + eMariaAnnotateRowsEvent = 160 //nolint // Unused //eMariaBinlogCheckpointEvent = 161 eMariaGTIDEvent = 162 diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index b8922e402c7..2754baf6e76 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -128,7 +128,7 @@ func LaunchCluster(setupType int, streamMode string, stripes int) (int, error) { // if streamMode is xbstream, add some additional args to test other xtrabackup flags if streamMode == "xbstream" { - xtrabackupArgs = append(xtrabackupArgs, "-xtrabackup_prepare_flags", fmt.Sprintf("--use-memory=100M")) + xtrabackupArgs = append(xtrabackupArgs, "-xtrabackup_prepare_flags", fmt.Sprintf("--use-memory=100M")) //nolint } commonTabletArg = append(commonTabletArg, xtrabackupArgs...) @@ -661,7 +661,7 @@ func terminateRestore(t *testing.T) { assert.Fail(t, "restore in progress file missing") } tmpProcess.Process.Signal(syscall.SIGTERM) - found = true + found = true //nolint return } } diff --git a/go/test/endtoend/vtctldweb/vtctld_web_main_test.go b/go/test/endtoend/vtctldweb/vtctld_web_main_test.go index 4e70e315824..72c2fcd031c 100644 --- a/go/test/endtoend/vtctldweb/vtctld_web_main_test.go +++ b/go/test/endtoend/vtctldweb/vtctld_web_main_test.go @@ -36,9 +36,10 @@ import ( "vitess.io/vitess/go/vt/vttest" ) +//nolint var ( localCluster *vttest.LocalCluster - hostname = "localhost" + hostname = "localhost" //nolint wd selenium.WebDriver seleniumService *selenium.Service vtctldAddr string @@ -175,7 +176,7 @@ func CreateWebDriver(port int) error { return err } - name, err := wd.CurrentWindowHandle() + name, err := wd.CurrentWindowHandle() //nolint return wd.ResizeWindow(name, 1280, 1024) } @@ -201,7 +202,7 @@ func CreateWebDriver(port int) error { if err != nil { return err } - name, err := wd.CurrentWindowHandle() + name, err := wd.CurrentWindowHandle() //nolint return wd.ResizeWindow(name, 1280, 1024) } @@ -346,7 +347,7 @@ func getDashboardKeyspaces(t *testing.T) []string { dashboardContent, err := wd.FindElement(selenium.ByTagName, "vt-dashboard") require.Nil(t, err) - ksCards, err := dashboardContent.FindElements(selenium.ByClassName, "vt-keyspace-card") + ksCards, err := dashboardContent.FindElements(selenium.ByClassName, "vt-keyspace-card") //nolint var out []string for _, ks := range ksCards { out = append(out, text(t, ks)) @@ -358,10 +359,10 @@ func getDashboardKeyspaces(t *testing.T) []string { func getDashboardShards(t *testing.T) []string { wait(t, selenium.ByTagName, "vt-dashboard") - dashboardContent, err := wd.FindElement(selenium.ByTagName, "vt-dashboard") + dashboardContent, err := wd.FindElement(selenium.ByTagName, "vt-dashboard") //nolint require.Nil(t, err) - ksCards, err := dashboardContent.FindElements(selenium.ByClassName, "vt-shard-stats") + ksCards, err := dashboardContent.FindElements(selenium.ByClassName, "vt-shard-stats") //nolint var out []string for _, ks := range ksCards { out = append(out, text(t, ks)) @@ -390,7 +391,7 @@ func getShardTablets(t *testing.T) ([]string, []string) { shardContent, err := wd.FindElement(selenium.ByTagName, "vt-shard-view") require.Nil(t, err) - tableRows, err := shardContent.FindElements(selenium.ByTagName, "tr") + tableRows, err := shardContent.FindElements(selenium.ByTagName, "tr") //nolint tableRows = tableRows[1:] var tabletTypes, tabletUIDs []string diff --git a/go/test/endtoend/vtgate/schema/schema_test.go b/go/test/endtoend/vtgate/schema/schema_test.go index 0363bdcf8af..b648aafb76b 100644 --- a/go/test/endtoend/vtgate/schema/schema_test.go +++ b/go/test/endtoend/vtgate/schema/schema_test.go @@ -115,7 +115,7 @@ func TestSchemaChange(t *testing.T) { func testWithInitialSchema(t *testing.T) { // Create 4 tables - var sqlQuery = "" + var sqlQuery = "" //nolint for i := 0; i < totalTableCount; i++ { sqlQuery = fmt.Sprintf(createTable, fmt.Sprintf("vt_select_test_%02d", i)) err := clusterInstance.VtctlclientProcess.ApplySchema(keyspaceName, sqlQuery) diff --git a/go/vt/grpcclient/client.go b/go/vt/grpcclient/client.go index 612c7b6ba1d..2c317d3d30f 100644 --- a/go/vt/grpcclient/client.go +++ b/go/vt/grpcclient/client.go @@ -62,7 +62,7 @@ func Dial(target string, failFast FailFast, opts ...grpc.DialOption) (*grpc.Clie grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(*grpccommon.MaxMessageSize), grpc.MaxCallSendMsgSize(*grpccommon.MaxMessageSize), - grpc.FailFast(bool(failFast)), + grpc.FailFast(bool(failFast)), //nolint ), } diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go index 25c8b87a768..96dfa0cead0 100644 --- a/go/vt/mysqlctl/builtinbackupengine.go +++ b/go/vt/mysqlctl/builtinbackupengine.go @@ -133,7 +133,7 @@ func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, params BackupP // Save initial state so we can restore. slaveStartRequired := false sourceIsMaster := false - readOnly := true + readOnly := true //nolint var replicationPosition mysql.Position semiSyncMaster, semiSyncSlave := params.Mysqld.SemiSyncEnabled() diff --git a/go/vt/mysqlctl/grpcmysqlctlclient/client.go b/go/vt/mysqlctl/grpcmysqlctlclient/client.go index 0bf8323dc04..129cb226970 100644 --- a/go/vt/mysqlctl/grpcmysqlctlclient/client.go +++ b/go/vt/mysqlctl/grpcmysqlctlclient/client.go @@ -42,7 +42,7 @@ type client struct { func factory(network, addr string) (mysqlctlclient.MysqlctlClient, error) { // create the RPC client - cc, err := grpcclient.Dial(addr, grpcclient.FailFast(false), grpc.WithInsecure(), grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { + cc, err := grpcclient.Dial(addr, grpcclient.FailFast(false), grpc.WithInsecure(), grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { //nolint:staticcheck return net.DialTimeout(network, addr, timeout) })) if err != nil { diff --git a/go/vt/mysqlctl/mycnf_test.go b/go/vt/mysqlctl/mycnf_test.go index 903cae62927..a013ad33fcb 100644 --- a/go/vt/mysqlctl/mycnf_test.go +++ b/go/vt/mysqlctl/mycnf_test.go @@ -22,7 +22,6 @@ import ( "os" "strings" "testing" - "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/servenv" ) @@ -79,6 +78,8 @@ func TestMycnf(t *testing.T) { // 3. go test // 4. \rm $VTROOT/vthook/make_mycnf // 5. Add No Prefix back + +//nolint func NoTestMycnfHook(t *testing.T) { uid := uint32(11111) cnf := NewMycnf(uid, 6802) diff --git a/go/vt/mysqlctl/mysqld.go b/go/vt/mysqlctl/mysqld.go index 578ed46b254..22a512e0d1e 100644 --- a/go/vt/mysqlctl/mysqld.go +++ b/go/vt/mysqlctl/mysqld.go @@ -343,7 +343,7 @@ func (mysqld *Mysqld) startNoWait(ctx context.Context, cnf *Mycnf, mysqldArgs .. switch hr := hook.NewHook("mysqld_start", mysqldArgs).Execute(); hr.ExitStatus { case hook.HOOK_SUCCESS: // hook exists and worked, we can keep going - name = "mysqld_start hook" + name = "mysqld_start hook" //nolint case hook.HOOK_DOES_NOT_EXIST: // hook doesn't exist, run mysqld_safe ourselves log.Infof("%v: No mysqld_start hook, running mysqld_safe directly", ts) diff --git a/go/vt/mysqlctl/replication.go b/go/vt/mysqlctl/replication.go index 14fa5b39417..44e8d857316 100644 --- a/go/vt/mysqlctl/replication.go +++ b/go/vt/mysqlctl/replication.go @@ -319,10 +319,10 @@ func (mysqld *Mysqld) ResetReplication(ctx context.Context) error { // // Array indices for the results of SHOW PROCESSLIST. const ( - colConnectionID = iota - colUsername + colConnectionID = iota //nolint + colUsername //nolint colClientAddr - colDbName + colDbName //nolint colCommand ) diff --git a/go/vt/mysqlctl/tmutils/schema_test.go b/go/vt/mysqlctl/tmutils/schema_test.go index 0b851721614..812b28291b3 100644 --- a/go/vt/mysqlctl/tmutils/schema_test.go +++ b/go/vt/mysqlctl/tmutils/schema_test.go @@ -240,7 +240,7 @@ func TestSchemaDiff(t *testing.T) { }) testDiff(t, sd4, sd5, "sd4", "sd5", []string{ - fmt.Sprintf("schemas differ on table type for table table2:\nsd4: VIEW\n differs from:\nsd5: BASE TABLE"), + fmt.Sprintf("schemas differ on table type for table table2:\nsd4: VIEW\n differs from:\nsd5: BASE TABLE"), //nolint }) sd1.DatabaseSchema = "CREATE DATABASE {{.DatabaseName}}" diff --git a/go/vt/sqlparser/precedence_test.go b/go/vt/sqlparser/precedence_test.go index 8292ccddff9..c0676dee9be 100644 --- a/go/vt/sqlparser/precedence_test.go +++ b/go/vt/sqlparser/precedence_test.go @@ -158,7 +158,7 @@ func TestRandom(t *testing.T) { // The purpose of this test is to find discrepancies between Format and parsing. If for example our precedence rules are not consistent between the two, this test should find it. // The idea is to generate random queries, and pass them through the parser and then the unparser, and one more time. The result of the first unparse should be the same as the second result. seed := time.Now().UnixNano() - fmt.Println(fmt.Sprintf("seed is %d", seed)) + fmt.Println(fmt.Sprintf("seed is %d", seed)) //nolint g := newGenerator(seed, 5) endBy := time.Now().Add(1 * time.Second) diff --git a/go/vt/throttler/max_replication_lag_module.go b/go/vt/throttler/max_replication_lag_module.go index 857e8ba52ed..68b7be2bce3 100644 --- a/go/vt/throttler/max_replication_lag_module.go +++ b/go/vt/throttler/max_replication_lag_module.go @@ -594,7 +594,7 @@ func (m *MaxReplicationLagModule) decreaseAndGuessRate(r *result, now time.Time, if replicationLagChange == equal { // The replication lag did not change. Keep going at the current rate. - r.Reason = fmt.Sprintf("did not decrease the rate because the lag did not change (assuming a 1s error margin)") + r.Reason = fmt.Sprintf("did not decrease the rate because the lag did not change (assuming a 1s error margin)") //nolint return } diff --git a/go/vt/topo/consultopo/server.go b/go/vt/topo/consultopo/server.go index d141116cbf6..95f371196d5 100644 --- a/go/vt/topo/consultopo/server.go +++ b/go/vt/topo/consultopo/server.go @@ -72,7 +72,7 @@ func getClientCreds() (creds map[string]*ClientAuthCred, err error) { } if err := json.Unmarshal(data, &creds); err != nil { - err = vterrors.Wrapf(err, fmt.Sprintf("Error parsing consul_auth_static_file")) + err = vterrors.Wrapf(err, fmt.Sprintf("Error parsing consul_auth_static_file")) //nolint return creds, err } return creds, nil diff --git a/go/vt/topo/k8stopo/client/clientset/versioned/fake/register.go b/go/vt/topo/k8stopo/client/clientset/versioned/fake/register.go index 55ae45f14c3..08ff48b7608 100644 --- a/go/vt/topo/k8stopo/client/clientset/versioned/fake/register.go +++ b/go/vt/topo/k8stopo/client/clientset/versioned/fake/register.go @@ -29,7 +29,7 @@ import ( var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) -var parameterCodec = runtime.NewParameterCodec(scheme) +var parameterCodec = runtime.NewParameterCodec(scheme) //nolint var localSchemeBuilder = runtime.SchemeBuilder{ topov1beta1.AddToScheme, } diff --git a/go/vt/topo/k8stopo/server.go b/go/vt/topo/k8stopo/server.go index 50b81465c71..b51e9fc144f 100644 --- a/go/vt/topo/k8stopo/server.go +++ b/go/vt/topo/k8stopo/server.go @@ -150,7 +150,7 @@ func NewServer(_, root string) (*Server, error) { var config *rest.Config var err error - namespace := "default" + namespace := "default" //nolint if *kubeconfigPath == "" { log.Info("Creating new in-cluster Kubernetes config") diff --git a/go/vt/vtctl/backup.go b/go/vt/vtctl/backup.go index 89b6b1ed434..24703e37e46 100644 --- a/go/vt/vtctl/backup.go +++ b/go/vt/vtctl/backup.go @@ -134,7 +134,7 @@ func commandBackupShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl switch tablets[i].Type { case topodatapb.TabletType_MASTER: tabletForBackup = tablets[i].Tablet - secondsBehind = 0 + secondsBehind = 0 //nolint break ChooseMaster default: continue diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index 58bb05ee3ff..bd037086539 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -1604,7 +1604,7 @@ func (e *Executor) handlePrepare(ctx context.Context, safeSession *SafeSession, var errCount uint64 if err != nil { logStats.Error = err - errCount = 1 + errCount = 1 //nolint return nil, err } logStats.RowsAffected = qr.RowsAffected diff --git a/go/vt/vtgate/executor_vschema_ddl_test.go b/go/vt/vtgate/executor_vschema_ddl_test.go index d7f320842d1..37f8b9cf6cb 100644 --- a/go/vt/vtgate/executor_vschema_ddl_test.go +++ b/go/vt/vtgate/executor_vschema_ddl_test.go @@ -92,6 +92,7 @@ func waitForVschemaTables(t *testing.T, ks string, tables []string, executor *Ex return nil } +//nolint func waitForColVindexes(t *testing.T, ks, table string, names []string, executor *Executor) *vschemapb.SrvVSchema { t.Helper() @@ -383,7 +384,7 @@ func TestExecutorAddDropVindexDDL(t *testing.T) { defer func() { *vschemaacl.AuthorizedDDLUsers = "" }() - executor, sbc1, sbc2, sbclookup := createExecutorEnv() + executor, sbc1, sbc2, sbclookup := createExecutorEnv() //nolint ks := "TestExecutor" session := NewSafeSession(&vtgatepb.Session{TargetString: ks}) vschemaUpdates := make(chan *vschemapb.SrvVSchema, 4) diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index 38582e14cce..30771dd9c03 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -345,7 +345,7 @@ func testFile(t *testing.T, filename, tempDir string, vschema *vschemaWrapper) { if fail && tempDir != "" { gotFile := fmt.Sprintf("%s/%s", tempDir, filename) ioutil.WriteFile(gotFile, []byte(strings.TrimSpace(expected.String())+"\n"), 0644) - fmt.Println(fmt.Sprintf("Errors found in plantests. If the output is correct, run `cp %s/* testdata/` to update test expectations", tempDir)) + fmt.Println(fmt.Sprintf("Errors found in plantests. If the output is correct, run `cp %s/* testdata/` to update test expectations", tempDir)) //nolint } }) } diff --git a/go/vt/workflow/resharding/workflow.go b/go/vt/workflow/resharding/workflow.go index c1c94a683dd..bfd99214d45 100644 --- a/go/vt/workflow/resharding/workflow.go +++ b/go/vt/workflow/resharding/workflow.go @@ -416,7 +416,7 @@ func (hw *horizontalReshardingWorkflow) Run(ctx context.Context, manager *workfl if err := hw.runWorkflow(); err != nil { return err } - hw.setUIMessage(fmt.Sprintf("Horizontal Resharding is finished successfully.")) + hw.setUIMessage(fmt.Sprintf("Horizontal Resharding is finished successfully.")) //nolint return nil } diff --git a/go/vt/workflow/reshardingworkflowgen/workflow.go b/go/vt/workflow/reshardingworkflowgen/workflow.go index 8485551526f..bcde4c98a8b 100644 --- a/go/vt/workflow/reshardingworkflowgen/workflow.go +++ b/go/vt/workflow/reshardingworkflowgen/workflow.go @@ -298,10 +298,10 @@ func (hw *reshardingWorkflowGen) Run(ctx context.Context, manager *workflow.Mana hw.rootUINode.BroadcastChanges(true /* updateChildren */) if err := hw.runWorkflow(); err != nil { - hw.setUIMessage(hw.rootUINode, fmt.Sprintf("Keyspace resharding failed to create workflows")) + hw.setUIMessage(hw.rootUINode, fmt.Sprintf("Keyspace resharding failed to create workflows")) //nolint return err } - hw.setUIMessage(hw.rootUINode, fmt.Sprintf("Keyspace resharding is finished successfully.")) + hw.setUIMessage(hw.rootUINode, fmt.Sprintf("Keyspace resharding is finished successfully.")) //nolint return nil } diff --git a/go/vt/wrangler/reparent.go b/go/vt/wrangler/reparent.go index 12135de9dc8..e5843a5f904 100644 --- a/go/vt/wrangler/reparent.go +++ b/go/vt/wrangler/reparent.go @@ -46,7 +46,7 @@ const ( initShardMasterOperation = "InitShardMaster" plannedReparentShardOperation = "PlannedReparentShard" emergencyReparentShardOperation = "EmergencyReparentShard" - tabletExternallyReparentedOperation = "TabletExternallyReparented" + tabletExternallyReparentedOperation = "TabletExternallyReparented" //nolint ) // ShardReplicationStatuses returns the ReplicationStatus for each tablet in a shard. diff --git a/misc/git/hooks/golangci-lint b/misc/git/hooks/golangci-lint index b21d016da5e..416cc3969bb 100755 --- a/misc/git/hooks/golangci-lint +++ b/misc/git/hooks/golangci-lint @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2019 The Vitess Authors. -# +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,13 +17,17 @@ # We will enable it for everything here, but with most of the linters disabled. # See: https://github.com/vitessio/vitess/issues/5503 -# NOTE(sougou): tool is disabled till it's fixed -exit +gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '^go/.*\.go$' | grep -v '^go/vt/proto/' | grep -v 'go/vt/sqlparser/sql.go') GOLANGCI_LINT=$(command -v golangci-lint >/dev/null 2>&1) if [ $? -eq 1 ]; then echo "Downloading golangci-lint..." - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.21.0 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.27.0 fi -golangci-lint run --disable=ineffassign,unused,gosimple,staticcheck,errcheck,structcheck,varcheck,deadcode +#golangci-lint run --disable=ineffassign,unused,gosimple,staticcheck,errcheck,structcheck,varcheck,deadcode +for gofile in $gofiles +do + golangci-lint run --disable=errcheck --timeout=10m $gofile + echo $gofile +done diff --git a/misc/git/ps1 b/misc/git/ps1 old mode 100644 new mode 100755 From a75e95abf494f92607f172bb3f8e11e40cd4ed70 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 22 Jun 2020 14:36:04 +0530 Subject: [PATCH 138/430] union-all: added concatenate primitive Signed-off-by: Harshit Gangal --- go/vt/vtgate/engine/concatenate.go | 89 +++++++++++++++++++ go/vt/vtgate/engine/concatenate_test.go | 57 ++++++++++++ go/vt/vtgate/planbuilder/testdata/onecase.txt | 5 +- 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 go/vt/vtgate/engine/concatenate.go create mode 100644 go/vt/vtgate/engine/concatenate_test.go diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go new file mode 100644 index 00000000000..8ef8cfcf320 --- /dev/null +++ b/go/vt/vtgate/engine/concatenate.go @@ -0,0 +1,89 @@ +package engine + +import ( + "sort" + "strings" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" +) + +var _ Primitive = (*Concatenate)(nil) + +type Concatenate struct { + Sources []Primitive +} + +func (c Concatenate) RouteType() string { + return "Concatenate" +} + +func (c Concatenate) GetKeyspaceName() string { + ksMap := map[string]interface{}{} + for _, source := range c.Sources { + ksMap[source.GetKeyspaceName()] = nil + } + var ksArr []string + for ks := range ksMap { + ksArr = append(ksArr, ks) + } + sort.Strings(ksArr) + return strings.Join(ksArr, "_") +} + +func (c Concatenate) GetTableName() string { + var tabArr []string + for _, source := range c.Sources { + tabArr = append(tabArr, source.GetTableName()) + } + return strings.Join(tabArr, "_") +} + +func (c Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + panic("implement me") +} + +func (c Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantields bool, callback func(*sqltypes.Result) error) error { + panic("implement me") +} + +func (c Concatenate) GetFields(vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + firstQr, err := c.Sources[0].GetFields(vcursor, bindVars) + if err != nil { + return nil, err + } + for i, source := range c.Sources { + if i == 0 { + continue + } + qr, err := source.GetFields(vcursor, bindVars) + if err != nil { + return nil, err + } + for i, field := range qr.Fields { + if firstQr.Fields[i].Type != field.Type { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "column field type does not match for name: (%v, %v) types: (%v, %v)", firstQr.Fields[i].Name, field.Name, firstQr.Fields[i].Type, field.Type) + } + } + } + return firstQr, nil +} + +func (c Concatenate) NeedsTransaction() bool { + for _, source := range c.Sources { + if source.NeedsTransaction() { + return true + } + } + return false +} + +func (c Concatenate) Inputs() []Primitive { + return c.Sources +} + +func (c Concatenate) description() PrimitiveDescription { + return PrimitiveDescription{OperatorType: c.RouteType()} +} diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go new file mode 100644 index 00000000000..89a294ecb48 --- /dev/null +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -0,0 +1,57 @@ +package engine + +import ( + "testing" + + "github.com/stretchr/testify/require" + "vitess.io/vitess/go/sqltypes" +) + +func TestConcatenate_Execute(t *testing.T) { + type testCase struct { + testName string + inputs []*sqltypes.Result + expectedResult *sqltypes.Result + expectedError string + } + + testCases := []*testCase{ + { + testName: "2 empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + }, + expectedResult: nil, + expectedError: "", + }, + { + testName: "3 empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + }, + expectedResult: nil, + expectedError: "", + }, + } + + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + var fps []Primitive + for _, input := range tc.inputs { + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input}}) + } + concatenate := Concatenate{Sources: fps} + qr, err := concatenate.Execute(&noopVCursor{}, nil, true) + if tc.expectedError == "" { + require.NoError(t, err) + require.Equal(t, tc.expectedResult, qr) + } else { + require.EqualError(t, err, tc.expectedError) + } + }) + } + +} diff --git a/go/vt/vtgate/planbuilder/testdata/onecase.txt b/go/vt/vtgate/planbuilder/testdata/onecase.txt index e819513f354..f821c90b4e5 100644 --- a/go/vt/vtgate/planbuilder/testdata/onecase.txt +++ b/go/vt/vtgate/planbuilder/testdata/onecase.txt @@ -1 +1,4 @@ -# Add your test case here for debugging and run go test -run=One. +# union all using sharded +"select id from user union all select id from user" +{ +} From 1ffea268c6d6ac86818b5ea784d17eba98933324 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 22 Jun 2020 17:41:08 +0530 Subject: [PATCH 139/430] union-all: concatenate engine implementation Signed-off-by: Harshit Gangal --- go/vt/vtgate/engine/concatenate.go | 76 ++++++++++++++++++++----- go/vt/vtgate/engine/concatenate_test.go | 66 +++++++++++++++------ 2 files changed, 112 insertions(+), 30 deletions(-) diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index 8ef8cfcf320..32970517f13 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -4,23 +4,29 @@ import ( "sort" "strings" + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" ) +// Concatenate Primitive is used to concatenate results from multiple sources. var _ Primitive = (*Concatenate)(nil) +//Concatenate specified the parameter for concatenate primitive type Concatenate struct { Sources []Primitive } -func (c Concatenate) RouteType() string { +//RouteType returns a description of the query routing type used by the primitive +func (c *Concatenate) RouteType() string { return "Concatenate" } -func (c Concatenate) GetKeyspaceName() string { +// GetKeyspaceName specifies the Keyspace that this primitive routes to +func (c *Concatenate) GetKeyspaceName() string { ksMap := map[string]interface{}{} for _, source := range c.Sources { ksMap[source.GetKeyspaceName()] = nil @@ -33,7 +39,8 @@ func (c Concatenate) GetKeyspaceName() string { return strings.Join(ksArr, "_") } -func (c Concatenate) GetTableName() string { +// GetTableName specifies the table that this primitive routes to. +func (c *Concatenate) GetTableName() string { var tabArr []string for _, source := range c.Sources { tabArr = append(tabArr, source.GetTableName()) @@ -41,15 +48,42 @@ func (c Concatenate) GetTableName() string { return strings.Join(tabArr, "_") } -func (c Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { - panic("implement me") +// Execute performs a non-streaming exec. +func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + result := &sqltypes.Result{} + for _, source := range c.Sources { + qr, err := source.Execute(vcursor, bindVars, wantfields) + if err != nil { + return nil, vterrors.Wrap(err, "Concatenate.Execute: ") + } + if wantfields { + wantfields = false + result.Fields = qr.Fields + } + if result.Fields != nil { + err = compareFields(result.Fields, qr.Fields) + if err != nil { + return nil, err + } + } + if len(qr.Rows) > 0 { + result.Rows = append(result.Rows, qr.Rows...) + if len(result.Rows[0]) != len(qr.Rows[0]) { + return nil, mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The used SELECT statements have a different number of columns") + } + result.RowsAffected += qr.RowsAffected + } + } + return result, nil } -func (c Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantields bool, callback func(*sqltypes.Result) error) error { +// StreamExecute performs a streaming exec. +func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantields bool, callback func(*sqltypes.Result) error) error { panic("implement me") } -func (c Concatenate) GetFields(vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { +// GetFields fetches the field info. +func (c *Concatenate) GetFields(vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { firstQr, err := c.Sources[0].GetFields(vcursor, bindVars) if err != nil { return nil, err @@ -62,16 +96,16 @@ func (c Concatenate) GetFields(vcursor VCursor, bindVars map[string]*querypb.Bin if err != nil { return nil, err } - for i, field := range qr.Fields { - if firstQr.Fields[i].Type != field.Type { - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "column field type does not match for name: (%v, %v) types: (%v, %v)", firstQr.Fields[i].Name, field.Name, firstQr.Fields[i].Type, field.Type) - } + err = compareFields(firstQr.Fields, qr.Fields) + if err != nil { + return nil, err } } return firstQr, nil } -func (c Concatenate) NeedsTransaction() bool { +//NeedsTransaction returns whether a transaction is needed for this primitive +func (c *Concatenate) NeedsTransaction() bool { for _, source := range c.Sources { if source.NeedsTransaction() { return true @@ -80,10 +114,24 @@ func (c Concatenate) NeedsTransaction() bool { return false } -func (c Concatenate) Inputs() []Primitive { +// Inputs returns the input primitives for this +func (c *Concatenate) Inputs() []Primitive { return c.Sources } -func (c Concatenate) description() PrimitiveDescription { +func (c *Concatenate) description() PrimitiveDescription { return PrimitiveDescription{OperatorType: c.RouteType()} } + +func compareFields(fields1 []*querypb.Field, fields2 []*querypb.Field) error { + if len(fields1) != len(fields2) { + return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The used SELECT statements have a different number of columns") + } + for i, field2 := range fields2 { + field1 := fields1[i] + if field1.Type != field2.Type { + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "column field type does not match for name: (%v, %v) types: (%v, %v)", field1.Name, field2.Name, field1.Type, field2.Type) + } + } + return nil +} diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index 89a294ecb48..fa9085d125d 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -9,31 +9,54 @@ import ( func TestConcatenate_Execute(t *testing.T) { type testCase struct { - testName string - inputs []*sqltypes.Result - expectedResult *sqltypes.Result - expectedError string + testName string + inputs []*sqltypes.Result + expectedResult *sqltypes.Result + expectedError string + skipTestWithFalseWantsFields bool } testCases := []*testCase{ { - testName: "2 empty result", + testName: "empty results", inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), }, - expectedResult: nil, - expectedError: "", + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), }, { - testName: "3 empty result", + testName: "2 non empty result", inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("", ""), ""), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, - expectedResult: nil, - expectedError: "", + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2", "1|a1|b1", "2|a2|b2"), + }, + { + testName: "mismatch field type", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + expectedError: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + skipTestWithFalseWantsFields: true, + }, + { + testName: "input source has different column count", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varchar"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), + }, + expectedError: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + }, + { + testName: "1 empty result and 1 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, } @@ -41,7 +64,7 @@ func TestConcatenate_Execute(t *testing.T) { t.Run(tc.testName, func(t *testing.T) { var fps []Primitive for _, input := range tc.inputs { - fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input}}) + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}}) } concatenate := Concatenate{Sources: fps} qr, err := concatenate.Execute(&noopVCursor{}, nil, true) @@ -51,6 +74,17 @@ func TestConcatenate_Execute(t *testing.T) { } else { require.EqualError(t, err, tc.expectedError) } + if tc.skipTestWithFalseWantsFields { + return + } + qr, err = concatenate.Execute(&noopVCursor{}, nil, false) + if tc.expectedError == "" { + require.NoError(t, err) + tc.expectedResult.Fields = nil + require.Equal(t, tc.expectedResult, qr) + } else { + require.EqualError(t, err, tc.expectedError) + } }) } From de3d16a438c6a023844edf47eba7d92f3d7f8071 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 22 Jun 2020 17:47:31 +0200 Subject: [PATCH 140/430] union-all: implemented StreamExecute Signed-off-by: Andres Taylor --- go/vt/vtgate/engine/concatenate.go | 62 +++++++++-- go/vt/vtgate/engine/concatenate_test.go | 137 +++++++++++++----------- 2 files changed, 125 insertions(+), 74 deletions(-) diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index 32970517f13..45331c3cbe6 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -1,3 +1,19 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package engine import ( @@ -54,17 +70,14 @@ func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.Bind for _, source := range c.Sources { qr, err := source.Execute(vcursor, bindVars, wantfields) if err != nil { - return nil, vterrors.Wrap(err, "Concatenate.Execute: ") + return nil, vterrors.Wrap(err, "Concatenate.Execute") } - if wantfields { - wantfields = false + if result.Fields == nil { result.Fields = qr.Fields } - if result.Fields != nil { - err = compareFields(result.Fields, qr.Fields) - if err != nil { - return nil, err - } + err = compareFields(result.Fields, qr.Fields) + if err != nil { + return nil, err } if len(qr.Rows) > 0 { result.Rows = append(result.Rows, qr.Rows...) @@ -78,8 +91,37 @@ func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.Bind } // StreamExecute performs a streaming exec. -func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantields bool, callback func(*sqltypes.Result) error) error { - panic("implement me") +func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + var seenFields []*querypb.Field + columnCount := 0 + for _, source := range c.Sources { + err := source.StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { + // if we have fields to compare, make sure all the fields are all the same + if seenFields == nil { + seenFields = resultChunk.Fields + } else if resultChunk.Fields != nil { + err := compareFields(seenFields, resultChunk.Fields) + if err != nil { + return err + } + } + if len(resultChunk.Rows) > 0 { + if columnCount == 0 { + columnCount = len(resultChunk.Rows[0]) + } else { + if len(resultChunk.Rows[0]) != columnCount { + return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The usasdfasded SELECT statements have a different number of columns") + } + } + } + + return callback(resultChunk) + }) + if err != nil { + return err + } + } + return nil } // GetFields fetches the field info. diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index fa9085d125d..796eb3da73f 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package engine import ( @@ -9,83 +25,76 @@ import ( func TestConcatenate_Execute(t *testing.T) { type testCase struct { - testName string - inputs []*sqltypes.Result - expectedResult *sqltypes.Result - expectedError string - skipTestWithFalseWantsFields bool + testName string + inputs []*sqltypes.Result + expectedResult *sqltypes.Result + expectedError string } - testCases := []*testCase{ - { - testName: "empty results", - inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), - }, - expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), + testCases := []*testCase{{ + testName: "empty results", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), }, - { - testName: "2 non empty result", - inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2"), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), - }, - expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2", "1|a1|b1", "2|a2|b2"), + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), + }, { + testName: "2 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, - { - testName: "mismatch field type", - inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary"), "1|a1|b1", "2|a2|b2"), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), - }, - expectedError: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", - skipTestWithFalseWantsFields: true, + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2", "1|a1|b1", "2|a2|b2"), + }, { + testName: "mismatch field type", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, - { - testName: "input source has different column count", - inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varchar"), "1|a1|b1", "2|a2|b2"), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), - }, - expectedError: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + expectedError: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + }, { + testName: "input source has different column count", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varchar"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), }, - { - testName: "1 empty result and 1 non empty result", - inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary")), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), - }, - expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + expectedError: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + }, { + testName: "1 empty result and 1 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, - } + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }} for _, tc := range testCases { t.Run(tc.testName, func(t *testing.T) { var fps []Primitive for _, input := range tc.inputs { - fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}}) - } - concatenate := Concatenate{Sources: fps} - qr, err := concatenate.Execute(&noopVCursor{}, nil, true) - if tc.expectedError == "" { - require.NoError(t, err) - require.Equal(t, tc.expectedResult, qr) - } else { - require.EqualError(t, err, tc.expectedError) - } - if tc.skipTestWithFalseWantsFields { - return - } - qr, err = concatenate.Execute(&noopVCursor{}, nil, false) - if tc.expectedError == "" { - require.NoError(t, err) - tc.expectedResult.Fields = nil - require.Equal(t, tc.expectedResult, qr) - } else { - require.EqualError(t, err, tc.expectedError) + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input, input, input}}) } + concatenate := &Concatenate{Sources: fps} + + t.Run("Execute wantfields true", func(t *testing.T) { + qr, err := concatenate.Execute(&noopVCursor{}, nil, true) + if tc.expectedError == "" { + require.NoError(t, err) + require.Equal(t, tc.expectedResult, qr) + } else { + require.EqualError(t, err, tc.expectedError) + } + }) + + t.Run("StreamExecute wantfields true", func(t *testing.T) { + qr, err := wrapStreamExecute(concatenate, &noopVCursor{}, nil, true) + if tc.expectedError == "" { + require.NoError(t, err) + require.Equal(t, tc.expectedResult, qr) + } else { + require.EqualError(t, err, tc.expectedError) + } + }) }) } - } From 5d56e28d2efa16ac311ce31e4f0e510b80133b83 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Tue, 23 Jun 2020 16:38:06 +0200 Subject: [PATCH 141/430] union-all: added endtoendtest Signed-off-by: Andres Taylor --- go/test/endtoend/vtgate/misc_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index 3ee049f0e6d..684d3a5de1b 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -558,6 +558,22 @@ func TestCastConvert(t *testing.T) { assertMatches(t, conn, `SELECT CAST("test" AS CHAR(60))`, `[[VARCHAR("test")]]`) } +func TestUnionAll(t *testing.T) { + conn, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + defer conn.Close() + + exec(t, conn, "insert into t1(id1, id2) values(1, 1), (2, 2)") + exec(t, conn, "insert into t2(id3, id4) values(3, 3), (4, 4)") + + // union all between two selectuniqueequal + assertMatches(t, conn, "select id1 from t1 where id1 = 1 union all select id1 from t1 where id1 = 4", "[[INT64(1)]]") + + // union all between two different tables + assertMatches(t, conn, "(select id1,id2 from t1 order by id1) union all (select id3,id4 from t2 order by id3)", + "[[INT64(1) INT64(1)] [INT64(2) INT64(2)] [INT64(3) INT64(3)] [INT64(4) INT64(4)]]") +} + func TestUnion(t *testing.T) { conn, err := mysql.Connect(context.Background(), &vtParams) require.NoError(t, err) From a9b9898a1f039c323ad44a95ab830c5b178193d7 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Tue, 23 Jun 2020 15:45:42 +0200 Subject: [PATCH 142/430] union-all: added planning for UNION ALL Signed-off-by: Andres Taylor --- go/test/endtoend/vtgate/misc_test.go | 5 +- go/vt/sqlparser/ast.go | 1 + go/vt/sqlparser/ast_funcs.go | 19 +- go/vt/vtgate/planbuilder/builder.go | 3 + go/vt/vtgate/planbuilder/concatenate.go | 124 +++++++++ go/vt/vtgate/planbuilder/join.go | 10 + go/vt/vtgate/planbuilder/limit.go | 5 + go/vt/vtgate/planbuilder/memory_sort.go | 5 + go/vt/vtgate/planbuilder/merge_sort.go | 10 +- go/vt/vtgate/planbuilder/ordered_aggregate.go | 5 + go/vt/vtgate/planbuilder/plan_test.go | 7 +- go/vt/vtgate/planbuilder/pullout_subquery.go | 10 + go/vt/vtgate/planbuilder/route.go | 11 +- go/vt/vtgate/planbuilder/subquery.go | 5 + go/vt/vtgate/planbuilder/testdata/onecase.txt | 5 +- .../planbuilder/testdata/union_cases.txt | 243 ++++++++++++++++++ .../testdata/unsupported_cases.txt | 28 +- go/vt/vtgate/planbuilder/union.go | 82 +++++- go/vt/vtgate/planbuilder/vindex_func.go | 5 + 19 files changed, 542 insertions(+), 41 deletions(-) create mode 100644 go/vt/vtgate/planbuilder/concatenate.go create mode 100644 go/vt/vtgate/planbuilder/testdata/union_cases.txt diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index 684d3a5de1b..d3f379f0d78 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -563,6 +563,9 @@ func TestUnionAll(t *testing.T) { require.NoError(t, err) defer conn.Close() + exec(t, conn, "delete from t1") + exec(t, conn, "delete from t2") + exec(t, conn, "insert into t1(id1, id2) values(1, 1), (2, 2)") exec(t, conn, "insert into t2(id3, id4) values(3, 3), (4, 4)") @@ -585,7 +588,7 @@ func TestUnion(t *testing.T) { assertMatches(t, conn, `SELECT 1,'a' UNION ALL SELECT 1,'a' UNION ALL SELECT 1,'a' ORDER BY 1`, `[[INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")]]`) assertMatches(t, conn, `(SELECT 1,'a') UNION ALL (SELECT 1,'a') UNION ALL (SELECT 1,'a') ORDER BY 1`, `[[INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")] [INT64(1) VARCHAR("a")]]`) assertMatches(t, conn, `(SELECT 1,'a') ORDER BY 1`, `[[INT64(1) VARCHAR("a")]]`) - assertMatches(t, conn, `(SELECT 1,'a' order by 1) union SELECT 1,'a' ORDER BY 1`, `[[INT64(1) VARCHAR("a")]]`) + assertMatches(t, conn, `(SELECT 1,'a' order by 1) union (SELECT 1,'a' ORDER BY 1)`, `[[INT64(1) VARCHAR("a")]]`) } func assertMatches(t *testing.T, conn *mysql.Conn, query, expected string) { diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 06e8d6e706f..60a699d993a 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -50,6 +50,7 @@ type ( iInsertRows() AddOrder(*Order) SetLimit(*Limit) + SetLock(lock string) SQLNode } diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 82844737e46..cd966f82426 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -717,6 +717,11 @@ func (node *Select) SetLimit(limit *Limit) { node.Limit = limit } +// SetLock sets the lock clause +func (node *Select) SetLock(lock string) { + node.Lock = lock +} + // AddWhere adds the boolean expression to the // WHERE clause as an AND condition. func (node *Select) AddWhere(expr Expr) { @@ -751,12 +756,17 @@ func (node *Select) AddHaving(expr Expr) { // AddOrder adds an order by element func (node *ParenSelect) AddOrder(order *Order) { - panic("unreachable") + node.Select.AddOrder(order) } // SetLimit sets the limit clause func (node *ParenSelect) SetLimit(limit *Limit) { - panic("unreachable") + node.Select.SetLimit(limit) +} + +// SetLock sets the lock clause +func (node *ParenSelect) SetLock(lock string) { + node.Select.SetLock(lock) } // AddOrder adds an order by element @@ -769,6 +779,11 @@ func (node *Union) SetLimit(limit *Limit) { node.Limit = limit } +// SetLock sets the lock clause +func (node *Union) SetLock(lock string) { + node.Lock = lock +} + //Unionize returns a UNION, either creating one or adding SELECT to an existing one func Unionize(lhs, rhs SelectStatement, typ string, by OrderBy, limit *Limit, lock string) *Union { union, isUnion := lhs.(*Union) diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go index 175f61846d1..ae348a23290 100644 --- a/go/vt/vtgate/planbuilder/builder.go +++ b/go/vt/vtgate/planbuilder/builder.go @@ -110,6 +110,9 @@ type builder interface { // specified column. SupplyWeightString(colNumber int) (weightcolNumber int, err error) + // PushLock pushes "FOR UPDATE", "LOCK IN SHARE MODE" down to all routes + PushLock(lock string) error + // Primitive returns the underlying primitive. // This function should only be called after Wireup is finished. Primitive() engine.Primitive diff --git a/go/vt/vtgate/planbuilder/concatenate.go b/go/vt/vtgate/planbuilder/concatenate.go new file mode 100644 index 00000000000..fe3e4d8eea9 --- /dev/null +++ b/go/vt/vtgate/planbuilder/concatenate.go @@ -0,0 +1,124 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package planbuilder + +import ( + "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/engine" +) + +type concatenate struct { + lhs, rhs builder + order int +} + +var _ builder = (*concatenate)(nil) + +func (c *concatenate) Order() int { + return c.order +} + +func (c *concatenate) ResultColumns() []*resultColumn { + return c.lhs.ResultColumns() +} + +func (c *concatenate) Reorder(order int) { + c.lhs.Reorder(order) + c.rhs.Reorder(c.lhs.Order()) + c.order = c.rhs.Order() + 1 +} + +func (c *concatenate) First() builder { + panic("implement me") +} + +func (c *concatenate) SetUpperLimit(count *sqlparser.SQLVal) { + // not doing anything by design +} + +func (c *concatenate) PushMisc(sel *sqlparser.Select) { + c.lhs.PushMisc(sel) + c.rhs.PushMisc(sel) +} + +func (c *concatenate) Wireup(bldr builder, jt *jointab) error { + // TODO systay should we do something different here? + err := c.lhs.Wireup(bldr, jt) + if err != nil { + return err + } + return c.rhs.Wireup(bldr, jt) +} + +func (c *concatenate) SupplyVar(from, to int, col *sqlparser.ColName, varname string) { + panic("implement me") +} + +func (c *concatenate) SupplyCol(col *sqlparser.ColName) (rc *resultColumn, colNumber int) { + panic("implement me") +} + +func (c *concatenate) SupplyWeightString(colNumber int) (weightcolNumber int, err error) { + panic("implement me") +} + +func (c *concatenate) PushFilter(pb *primitiveBuilder, filter sqlparser.Expr, whereType string, origin builder) error { + return unreachable("Filter") +} + +func (c *concatenate) PushSelect(pb *primitiveBuilder, expr *sqlparser.AliasedExpr, origin builder) (rc *resultColumn, colNumber int, err error) { + return nil, 0, unreachable("Select") +} + +func (c *concatenate) MakeDistinct() error { + return vterrors.New(vtrpc.Code_UNIMPLEMENTED, "only union-all is supported for this operator") +} + +func (c *concatenate) PushGroupBy(by sqlparser.GroupBy) error { + return unreachable("GroupBy") +} + +func (c *concatenate) PushOrderBy(by sqlparser.OrderBy) (builder, error) { + if by == nil { + return c, nil + } + return nil, unreachable("OrderBy") +} + +func (c *concatenate) Primitive() engine.Primitive { + lhs := c.lhs.Primitive() + rhs := c.rhs.Primitive() + + return &engine.Concatenate{ + Sources: []engine.Primitive{lhs, rhs}, + } +} + +// PushLock satisfies the builder interface. +func (c *concatenate) PushLock(lock string) error { + err := c.lhs.PushLock(lock) + if err != nil { + return err + } + return c.rhs.PushLock(lock) +} + +func unreachable(name string) error { + return vterrors.Errorf(vtrpc.Code_UNIMPLEMENTED, "concatenate.%s: unreachable", name) +} diff --git a/go/vt/vtgate/planbuilder/join.go b/go/vt/vtgate/planbuilder/join.go index 6ec4abffce4..0ee90033f4c 100644 --- a/go/vt/vtgate/planbuilder/join.go +++ b/go/vt/vtgate/planbuilder/join.go @@ -134,6 +134,16 @@ func (jb *join) Primitive() engine.Primitive { return jb.ejoin } +// PushLock satisfies the builder interface. +func (jb *join) PushLock(lock string) error { + err := jb.Left.PushLock(lock) + if err != nil { + return err + } + + return jb.Right.PushLock(lock) +} + // First satisfies the builder interface. func (jb *join) First() builder { return jb.Left.First() diff --git a/go/vt/vtgate/planbuilder/limit.go b/go/vt/vtgate/planbuilder/limit.go index c6830400a05..210da3399c1 100644 --- a/go/vt/vtgate/planbuilder/limit.go +++ b/go/vt/vtgate/planbuilder/limit.go @@ -50,6 +50,11 @@ func (l *limit) Primitive() engine.Primitive { return l.elimit } +// PushLock satisfies the builder interface. +func (l *limit) PushLock(lock string) error { + return l.input.PushLock(lock) +} + // PushFilter satisfies the builder interface. func (l *limit) PushFilter(_ *primitiveBuilder, _ sqlparser.Expr, whereType string, _ builder) error { return errors.New("limit.PushFilter: unreachable") diff --git a/go/vt/vtgate/planbuilder/memory_sort.go b/go/vt/vtgate/planbuilder/memory_sort.go index 8fed34d0ba9..9255af36d79 100644 --- a/go/vt/vtgate/planbuilder/memory_sort.go +++ b/go/vt/vtgate/planbuilder/memory_sort.go @@ -83,6 +83,11 @@ func (ms *memorySort) Primitive() engine.Primitive { return ms.eMemorySort } +// PushLock satisfies the builder interface. +func (ms *memorySort) PushLock(lock string) error { + return ms.input.PushLock(lock) +} + // PushFilter satisfies the builder interface. func (ms *memorySort) PushFilter(_ *primitiveBuilder, _ sqlparser.Expr, whereType string, _ builder) error { return errors.New("memorySort.PushFilter: unreachable") diff --git a/go/vt/vtgate/planbuilder/merge_sort.go b/go/vt/vtgate/planbuilder/merge_sort.go index 0b423321041..249d15604e5 100644 --- a/go/vt/vtgate/planbuilder/merge_sort.go +++ b/go/vt/vtgate/planbuilder/merge_sort.go @@ -17,7 +17,8 @@ limitations under the License. package planbuilder import ( - "errors" + "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/sqlparser" @@ -59,6 +60,11 @@ func (ms *mergeSort) Primitive() engine.Primitive { return ms.input.Primitive() } +// PushLock satisfies the builder interface. +func (ms *mergeSort) PushLock(lock string) error { + return ms.input.PushLock(lock) +} + // PushFilter satisfies the builder interface. func (ms *mergeSort) PushFilter(pb *primitiveBuilder, expr sqlparser.Expr, whereType string, origin builder) error { return ms.input.PushFilter(pb, expr, whereType, origin) @@ -83,7 +89,7 @@ func (ms *mergeSort) PushGroupBy(groupBy sqlparser.GroupBy) error { // A merge sort is created due to the push of an ORDER BY clause. // So, this function should never get called. func (ms *mergeSort) PushOrderBy(orderBy sqlparser.OrderBy) (builder, error) { - return nil, errors.New("mergeSort.PushOrderBy: unreachable") + return nil, vterrors.Errorf(vtrpc.Code_UNIMPLEMENTED, "can't do ORDER BY on top of ORDER BY") } // Wireup satisfies the builder interface. diff --git a/go/vt/vtgate/planbuilder/ordered_aggregate.go b/go/vt/vtgate/planbuilder/ordered_aggregate.go index bb9853c4eaf..6a7324e6f5e 100644 --- a/go/vt/vtgate/planbuilder/ordered_aggregate.go +++ b/go/vt/vtgate/planbuilder/ordered_aggregate.go @@ -243,6 +243,11 @@ func (oa *orderedAggregate) Primitive() engine.Primitive { return oa.eaggr } +// PushLock satisfies the builder interface. +func (oa *orderedAggregate) PushLock(lock string) error { + return oa.input.PushLock(lock) +} + // PushFilter satisfies the builder interface. func (oa *orderedAggregate) PushFilter(_ *primitiveBuilder, _ sqlparser.Expr, whereType string, _ builder) error { return errors.New("unsupported: filtering on results of aggregates") diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index 38582e14cce..f91aa539210 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -26,10 +26,11 @@ import ( "strings" "testing" + "github.com/google/go-cmp/cmp" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" - "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" "vitess.io/vitess/go/sqltypes" @@ -171,6 +172,7 @@ func TestPlan(t *testing.T) { testFile(t, "use_cases.txt", testOutputTempDir, vschemaWrapper) testFile(t, "set_cases.txt", testOutputTempDir, vschemaWrapper) testFile(t, "set_sysvar_cases.txt", testOutputTempDir, vschemaWrapper) + testFile(t, "union_cases.txt", testOutputTempDir, vschemaWrapper) } func TestOne(t *testing.T) { @@ -331,7 +333,7 @@ func testFile(t *testing.T, filename, tempDir string, vschema *vschemaWrapper) { if out != tcase.output { fail = true - t.Errorf("File: %s, Line: %v\n %s \n%s", filename, tcase.lineno, cmp.Diff(tcase.output, out), out) + t.Errorf("File: %s, Line: %d\nDiff:\n%s\n[%s] \n[%s]", filename, tcase.lineno, cmp.Diff(tcase.output, out), tcase.output, out) } if err != nil { @@ -339,7 +341,6 @@ func testFile(t *testing.T, filename, tempDir string, vschema *vschemaWrapper) { } expected.WriteString(fmt.Sprintf("%s\"%s\"\n%s\n\n", tcase.comments, tcase.input, out)) - }) } if fail && tempDir != "" { diff --git a/go/vt/vtgate/planbuilder/pullout_subquery.go b/go/vt/vtgate/planbuilder/pullout_subquery.go index 35d189df8b1..9977b0a6359 100644 --- a/go/vt/vtgate/planbuilder/pullout_subquery.go +++ b/go/vt/vtgate/planbuilder/pullout_subquery.go @@ -71,6 +71,16 @@ func (ps *pulloutSubquery) Primitive() engine.Primitive { return ps.eSubquery } +// PushLock satisfies the builder interface. +func (ps *pulloutSubquery) PushLock(lock string) error { + err := ps.subquery.PushLock(lock) + if err != nil { + return err + } + + return ps.underlying.PushLock(lock) +} + // First satisfies the builder interface. func (ps *pulloutSubquery) First() builder { return ps.underlying.First() diff --git a/go/vt/vtgate/planbuilder/route.go b/go/vt/vtgate/planbuilder/route.go index 6a7488e8441..4f810805cdf 100644 --- a/go/vt/vtgate/planbuilder/route.go +++ b/go/vt/vtgate/planbuilder/route.go @@ -92,6 +92,12 @@ func (rb *route) Primitive() engine.Primitive { return rb.routeOptions[0].eroute } +// PushLock satisfies the builder interface. +func (rb *route) PushLock(lock string) error { + rb.Select.SetLock(lock) + return nil +} + // First satisfies the builder interface. func (rb *route) First() builder { return rb @@ -390,7 +396,10 @@ func (rb *route) generateFieldQuery(sel sqlparser.SelectStatement, jt *jointab) sqlparser.FormatImpossibleQuery(buf, node) } - return sqlparser.NewTrackedBuffer(formatter).WriteNode(sel).ParsedQuery().Query + buffer := sqlparser.NewTrackedBuffer(formatter) + node := buffer.WriteNode(sel) + query := node.ParsedQuery() + return query.Query } // SupplyVar satisfies the builder interface. diff --git a/go/vt/vtgate/planbuilder/subquery.go b/go/vt/vtgate/planbuilder/subquery.go index 98c5772d73e..fcfeac63419 100644 --- a/go/vt/vtgate/planbuilder/subquery.go +++ b/go/vt/vtgate/planbuilder/subquery.go @@ -74,6 +74,11 @@ func (sq *subquery) Primitive() engine.Primitive { return sq.esubquery } +// PushLock satisfies the builder interface. +func (sq *subquery) PushLock(lock string) error { + return sq.input.PushLock(lock) +} + // First satisfies the builder interface. func (sq *subquery) First() builder { return sq diff --git a/go/vt/vtgate/planbuilder/testdata/onecase.txt b/go/vt/vtgate/planbuilder/testdata/onecase.txt index f821c90b4e5..e819513f354 100644 --- a/go/vt/vtgate/planbuilder/testdata/onecase.txt +++ b/go/vt/vtgate/planbuilder/testdata/onecase.txt @@ -1,4 +1 @@ -# union all using sharded -"select id from user union all select id from user" -{ -} +# Add your test case here for debugging and run go test -run=One. diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.txt b/go/vt/vtgate/planbuilder/testdata/union_cases.txt new file mode 100644 index 00000000000..f975b7e4e06 --- /dev/null +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.txt @@ -0,0 +1,243 @@ +# union all between two scatter selects +"select id from user union all select id from music" +{ + "QueryType": "SELECT", + "Original": "select id from user union all select id from music", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1", + "Query": "select id from user", + "Table": "user" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "Query": "select id from music", + "Table": "music" + } + ] + } +} + +# union all between two SelectEqualUnique +"select id from user where id = 1 union all select id from user where id = 5" +{ + "QueryType": "SELECT", + "Original": "select id from user where id = 1 union all select id from user where id = 5", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1", + "Query": "select id from user where id = 1", + "Table": "user", + "Values": [ + 1 + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1", + "Query": "select id from user where id = 5", + "Table": "user", + "Values": [ + 5 + ], + "Vindex": "user_index" + } + ] + } +} + +#almost dereks query - two queries with order by and limit being scattered to two different sets of tablets +"(SELECT id FROM user ORDER BY id DESC LIMIT 1) UNION ALL (SELECT id FROM music ORDER BY id DESC LIMIT 1)" +{ + "QueryType": "SELECT", + "Original": "(SELECT id FROM user ORDER BY id DESC LIMIT 1) UNION ALL (SELECT id FROM music ORDER BY id DESC LIMIT 1)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Limit", + "Count": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1", + "Query": "select id from user order by id desc limit :__upper_limit", + "Table": "user" + } + ] + }, + { + "OperatorType": "Limit", + "Count": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "Query": "select id from music order by id desc limit :__upper_limit", + "Table": "music" + } + ] + } + ] + } +} + +# Union all +"select col1, col2 from user union all select col1, col2 from user_extra" +{ + "QueryType": "SELECT", + "Original": "select col1, col2 from user union all select col1, col2 from user_extra", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select col1, col2 from user where 1 != 1", + "Query": "select col1, col2 from user", + "Table": "user" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select col1, col2 from user_extra where 1 != 1", + "Query": "select col1, col2 from user_extra", + "Table": "user_extra" + } + ] + } +} + +# union operations in subqueries (FROM) +"select * from (select * from user union all select * from user_extra) as t" +{ + "QueryType": "SELECT", + "Original": "select * from (select * from user union all select * from user_extra) as t", + "Instructions": { + "OperatorType": "Subquery", + "Columns": [ + 0 + ], + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from user where 1 != 1", + "Query": "select * from user", + "Table": "user" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from user_extra where 1 != 1", + "Query": "select * from user_extra", + "Table": "user_extra" + } + ] + } + ] + } +} + +# union all between two scatter selects, with order by +"(select id from user order by id limit 5) union all (select id from music order by id desc limit 5)" +{ + "QueryType": "SELECT", + "Original": "(select id from user order by id limit 5) union all (select id from music order by id desc limit 5)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Limit", + "Count": 5, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1", + "Query": "select id from user order by id asc limit :__upper_limit", + "Table": "user" + } + ] + }, + { + "OperatorType": "Limit", + "Count": 5, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "Query": "select id from music order by id desc limit :__upper_limit", + "Table": "music" + } + ] + } + ] + } +} diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt index 8943b38b889..ca4723ae58b 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt @@ -14,10 +14,6 @@ "show create database" "plan building not supported" -# union operations in subqueries (FROM) -"select * from (select * from user union all select * from user_extra) as t" -"unsupported: UNION cannot be executed as a single route" - # union operations in subqueries (expressions) "select * from user where id in (select * from user union select * from user_extra)" "unsupported: UNION cannot be executed as a single route" @@ -348,16 +344,12 @@ # multi-shard union "select 1 from music union (select id from user union all select name from unsharded)" -"unsupported: UNION cannot be executed as a single route" +"unsupported: SELECT of UNION is non-trivial" # multi-shard union "select 1 from music union (select id from user union select name from unsharded)" "unsupported: UNION cannot be executed as a single route" -# multi-shard union -"select id from user union all select id from music" -"unsupported: UNION cannot be executed as a single route" - # union with the same target shard because of vindex "select * from music where id = 1 union select * from user where id = 1" "unsupported: UNION cannot be executed as a single route" @@ -366,10 +358,6 @@ "select 1 from music where id = 1 union select 1 from music where id = 2" "unsupported: UNION cannot be executed as a single route" -# Union all -"select col1, col2 from user union all select col1, col2 from user_extra" -"unsupported: UNION cannot be executed as a single route" - "(select user.id, user.name from user join user_extra where user_extra.extra = 'asdf') union select 'b','c' from user" "unsupported: SELECT of UNION is non-trivial" @@ -414,12 +402,24 @@ # order by inside and outside parenthesis select "(select 1 from user order by 1 desc) order by 1 asc limit 2" -"expected union to produce a route" +"can't do ORDER BY on top of ORDER BY" # multiple select statement have inner order by with union "(select 1 from user order by 1 desc) union (select 1 from user order by 1 asc)" "unsupported: SELECT of UNION is non-trivial" +# different number of columns +"select id, 42 from user where id = 1 union all select id from user where id = 5" +"The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000) during query: select id, 42 from user where id = 1 union all select id from user where id = 5" + +# ambiguous ORDER BY +"select id from user order by id union all select id from music order by id desc" +"Incorrect usage of UNION and ORDER BY - add parens to disambiguate your query (errno 1221) (sqlstate 21000)" + +# ambiguous LIMIT +"select id from user limit 1 union all select id from music limit 1" +"Incorrect usage of UNION and LIMIT - add parens to disambiguate your query (errno 1221) (sqlstate 21000)" + # Savepoint "savepoint a" "unsupported: Savepoint construct savepoint a" diff --git a/go/vt/vtgate/planbuilder/union.go b/go/vt/vtgate/planbuilder/union.go index fb3845bc198..42f692cedb6 100644 --- a/go/vt/vtgate/planbuilder/union.go +++ b/go/vt/vtgate/planbuilder/union.go @@ -20,8 +20,7 @@ import ( "errors" "fmt" - "vitess.io/vitess/go/vt/proto/vtrpc" - "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/engine" @@ -41,25 +40,40 @@ func buildUnionPlan(stmt sqlparser.Statement, vschema ContextVSchema) (engine.Pr } func (pb *primitiveBuilder) processUnion(union *sqlparser.Union, outer *symtab) error { - if err := pb.processPart(union.FirstStatement, outer); err != nil { + if err := pb.processPart(union.FirstStatement, outer, false); err != nil { return err } for _, us := range union.UnionSelects { rpb := newPrimitiveBuilder(pb.vschema, pb.jt) - if err := rpb.processPart(us.Statement, outer); err != nil { + if err := rpb.processPart(us.Statement, outer, false); err != nil { return err } + err := unionRouteMerge(pb.bldr, rpb.bldr, us) + if err != nil { + if us.Type != sqlparser.UnionAllStr { + return err + } - if err := unionRouteMerge(pb.bldr, rpb.bldr); err != nil { - return err + // we are merging between two routes - let's check if we can see so that we have the same amount of columns on both sides of the union + lhsCols := len(pb.bldr.ResultColumns()) + rhsCols := len(rpb.bldr.ResultColumns()) + if lhsCols != rhsCols { + return &mysql.SQLError{ + Num: mysql.ERWrongNumberOfColumnsInSelect, + State: "21000", + Message: "The used SELECT statements have a different number of columns", + Query: sqlparser.String(union), + } + } + + pb.bldr = &concatenate{ + lhs: pb.bldr, + rhs: rpb.bldr, + } } pb.st.Outer = outer } - unionRoute, ok := pb.bldr.(*route) - if !ok { - return vterrors.Errorf(vtrpc.Code_INTERNAL, "expected union to produce a route") - } - unionRoute.Select = &sqlparser.Union{FirstStatement: union.FirstStatement, UnionSelects: union.UnionSelects, Lock: union.Lock} + pb.bldr.PushLock(union.Lock) if err := pb.pushOrderBy(union.OrderBy); err != nil { return err @@ -67,19 +81,52 @@ func (pb *primitiveBuilder) processUnion(union *sqlparser.Union, outer *symtab) return pb.pushLimit(union.Limit) } -func (pb *primitiveBuilder) processPart(part sqlparser.SelectStatement, outer *symtab) error { +func (pb *primitiveBuilder) processPart(part sqlparser.SelectStatement, outer *symtab, hasParens bool) error { switch part := part.(type) { case *sqlparser.Union: return pb.processUnion(part, outer) case *sqlparser.Select: + if !hasParens { + err := checkOrderByAndLimit(part) + if err != nil { + return err + } + } return pb.processSelect(part, outer) case *sqlparser.ParenSelect: - return pb.processPart(part.Select, outer) + err := pb.processPart(part.Select, outer, true) + if err != nil { + return err + } + // TODO: This is probably not a great idea. If we ended up with something other than a route, we'll lose the parens + routeOp, ok := pb.bldr.(*route) + if ok { + routeOp.Select = &sqlparser.ParenSelect{Select: routeOp.Select} + } + return nil } return fmt.Errorf("BUG: unexpected SELECT type: %T", part) } -func unionRouteMerge(left, right builder) error { +func checkOrderByAndLimit(part *sqlparser.Select) error { + if part.OrderBy != nil { + return &mysql.SQLError{ + Num: mysql.ERWrongUsage, + State: "21000", + Message: "Incorrect usage of UNION and ORDER BY - add parens to disambiguate your query", + } + } + if part.Limit != nil { + return &mysql.SQLError{ + Num: mysql.ERWrongUsage, + State: "21000", + Message: "Incorrect usage of UNION and LIMIT - add parens to disambiguate your query", + } + } + return nil +} + +func unionRouteMerge(left, right builder, us *sqlparser.UnionSelect) error { lroute, ok := left.(*route) if !ok { return errors.New("unsupported: SELECT of UNION is non-trivial") @@ -92,5 +139,12 @@ func unionRouteMerge(left, right builder) error { return errors.New("unsupported: UNION cannot be executed as a single route") } + switch n := lroute.Select.(type) { + case *sqlparser.Union: + n.UnionSelects = append(n.UnionSelects, us) + default: + lroute.Select = &sqlparser.Union{FirstStatement: lroute.Select, UnionSelects: []*sqlparser.UnionSelect{us}} + } + return nil } diff --git a/go/vt/vtgate/planbuilder/vindex_func.go b/go/vt/vtgate/planbuilder/vindex_func.go index 3902f4a1030..f158acbee24 100644 --- a/go/vt/vtgate/planbuilder/vindex_func.go +++ b/go/vt/vtgate/planbuilder/vindex_func.go @@ -82,6 +82,11 @@ func (vf *vindexFunc) Primitive() engine.Primitive { return vf.eVindexFunc } +// PushLock satisfies the builder interface. +func (vf *vindexFunc) PushLock(lock string) error { + return nil +} + // First satisfies the builder interface. func (vf *vindexFunc) First() builder { return vf From 7add5328ada2a5bdf2509b02ccf3261f589b1038 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 26 Jun 2020 19:05:32 +0530 Subject: [PATCH 143/430] union-all: addressed review comments Signed-off-by: Harshit Gangal --- go/vt/vtgate/engine/concatenate.go | 97 +++++++++++++++++++------ go/vt/vtgate/engine/concatenate_test.go | 8 +- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index 45331c3cbe6..d11d7ded29a 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -19,6 +19,7 @@ package engine import ( "sort" "strings" + "sync" "vitess.io/vitess/go/mysql" @@ -67,15 +68,26 @@ func (c *Concatenate) GetTableName() string { // Execute performs a non-streaming exec. func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { result := &sqltypes.Result{} - for _, source := range c.Sources { - qr, err := source.Execute(vcursor, bindVars, wantfields) - if err != nil { - return nil, vterrors.Wrap(err, "Concatenate.Execute") + var wg sync.WaitGroup + qrs := make([]*sqltypes.Result, len(c.Sources)) + errs := make([]error, len(c.Sources)) + for i, source := range c.Sources { + wg.Add(1) + go func(i int, source Primitive) { + defer wg.Done() + qrs[i], errs[i] = source.Execute(vcursor, bindVars, wantfields) + }(i, source) + } + wg.Wait() + for i := 0; i < len(c.Sources); i++ { + if errs[i] != nil { + return nil, vterrors.Wrap(errs[i], "Concatenate.Execute") } + qr := qrs[i] if result.Fields == nil { result.Fields = qr.Fields } - err = compareFields(result.Fields, qr.Fields) + err := compareFields(result.Fields, qr.Fields) if err != nil { return nil, err } @@ -94,29 +106,68 @@ func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.Bind func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { var seenFields []*querypb.Field columnCount := 0 - for _, source := range c.Sources { - err := source.StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { - // if we have fields to compare, make sure all the fields are all the same - if seenFields == nil { - seenFields = resultChunk.Fields - } else if resultChunk.Fields != nil { - err := compareFields(seenFields, resultChunk.Fields) - if err != nil { - return err + + // To return deterministic field names. + err := c.Sources[0].StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { + // if we have fields to compare, make sure all the fields are all the same + if seenFields == nil { + seenFields = resultChunk.Fields + } else if resultChunk.Fields != nil { + err := compareFields(seenFields, resultChunk.Fields) + if err != nil { + return err + } + } + if len(resultChunk.Rows) > 0 { + if columnCount == 0 { + columnCount = len(resultChunk.Rows[0]) + } else { + if len(resultChunk.Rows[0]) != columnCount { + return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The usasdfasded SELECT statements have a different number of columns") } } - if len(resultChunk.Rows) > 0 { - if columnCount == 0 { - columnCount = len(resultChunk.Rows[0]) - } else { - if len(resultChunk.Rows[0]) != columnCount { - return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The usasdfasded SELECT statements have a different number of columns") + } + + return callback(resultChunk) + }) + if err != nil { + return err + } + + var errs []error + var wg sync.WaitGroup + for i := 1; i < len(c.Sources); i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + err := c.Sources[i].StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { + // if we have fields to compare, make sure all the fields are all the same + if seenFields == nil { + seenFields = resultChunk.Fields + } else if resultChunk.Fields != nil { + err := compareFields(seenFields, resultChunk.Fields) + if err != nil { + return err } } - } + if len(resultChunk.Rows) > 0 { + if columnCount == 0 { + columnCount = len(resultChunk.Rows[0]) + } else { + if len(resultChunk.Rows[0]) != columnCount { + return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The usasdfasded SELECT statements have a different number of columns") + } + } + } + + return callback(resultChunk) + }) + errs = append(errs, err) + }(i) + } + wg.Wait() - return callback(resultChunk) - }) + for _, err := range errs { if err != nil { return err } diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index 796eb3da73f..cfde9ff577b 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -34,10 +34,10 @@ func TestConcatenate_Execute(t *testing.T) { testCases := []*testCase{{ testName: "empty results", inputs: []*sqltypes.Result{ - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), - sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id1|col11|col12", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id2|col21|col22", "int64|varbinary|varbinary")), }, - expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary")), + expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id1|col11|col12", "int64|varbinary|varbinary")), }, { testName: "2 non empty result", inputs: []*sqltypes.Result{ @@ -72,7 +72,7 @@ func TestConcatenate_Execute(t *testing.T) { t.Run(tc.testName, func(t *testing.T) { var fps []Primitive for _, input := range tc.inputs { - fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input, input, input}}) + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input, input, input, input, input}}) } concatenate := &Concatenate{Sources: fps} From 6206c35ea8c6928fb1d60610d9fae1bc8d37f04f Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 26 Jun 2020 19:18:58 +0530 Subject: [PATCH 144/430] union-all: concatenate stream-execute parallelize Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/misc_test.go | 4 ++ go/vt/vtgate/engine/concatenate.go | 59 ++++++------------------- go/vt/vtgate/engine/concatenate_test.go | 1 + go/vt/vtgate/executor_select_test.go | 38 ++++++++++++++++ 4 files changed, 57 insertions(+), 45 deletions(-) diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index d3f379f0d78..da66cd5d8c2 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -575,6 +575,10 @@ func TestUnionAll(t *testing.T) { // union all between two different tables assertMatches(t, conn, "(select id1,id2 from t1 order by id1) union all (select id3,id4 from t2 order by id3)", "[[INT64(1) INT64(1)] [INT64(2) INT64(2)] [INT64(3) INT64(3)] [INT64(4) INT64(4)]]") + + // union all between two different tables + assertMatches(t, conn, "select tbl2.id1 FROM ((select id1 from t1 order by id1 limit 5) union all (select id1 from t1 order by id1 desc limit 5)) as tbl1 INNER JOIN t1 as tbl2 ON tbl1.id1 = tbl2.id1", + "[[INT64(1)] [INT64(2)] [INT64(2)] [INT64(1)]]") } func TestUnion(t *testing.T) { diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index d11d7ded29a..c7d78d1cffe 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -105,65 +105,34 @@ func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.Bind // StreamExecute performs a streaming exec. func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { var seenFields []*querypb.Field - columnCount := 0 - - // To return deterministic field names. - err := c.Sources[0].StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { - // if we have fields to compare, make sure all the fields are all the same - if seenFields == nil { - seenFields = resultChunk.Fields - } else if resultChunk.Fields != nil { - err := compareFields(seenFields, resultChunk.Fields) - if err != nil { - return err - } - } - if len(resultChunk.Rows) > 0 { - if columnCount == 0 { - columnCount = len(resultChunk.Rows[0]) - } else { - if len(resultChunk.Rows[0]) != columnCount { - return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The usasdfasded SELECT statements have a different number of columns") - } - } - } - - return callback(resultChunk) - }) - if err != nil { - return err - } + fieldsSent := false var errs []error - var wg sync.WaitGroup - for i := 1; i < len(c.Sources); i++ { + var wg, fieldset sync.WaitGroup + fieldset.Add(1) + for i, source := range c.Sources { wg.Add(1) - go func(i int) { + go func(i int, source Primitive) { defer wg.Done() - err := c.Sources[i].StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { + err := source.StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { // if we have fields to compare, make sure all the fields are all the same - if seenFields == nil { + if i == 0 && !fieldsSent { + defer fieldset.Done() seenFields = resultChunk.Fields - } else if resultChunk.Fields != nil { + fieldsSent = true + return callback(resultChunk) + } + fieldset.Wait() + if resultChunk.Fields != nil { err := compareFields(seenFields, resultChunk.Fields) if err != nil { return err } } - if len(resultChunk.Rows) > 0 { - if columnCount == 0 { - columnCount = len(resultChunk.Rows[0]) - } else { - if len(resultChunk.Rows[0]) != columnCount { - return mysql.NewSQLError(mysql.ERWrongNumberOfColumnsInSelect, "21000", "The usasdfasded SELECT statements have a different number of columns") - } - } - } - return callback(resultChunk) }) errs = append(errs, err) - }(i) + }(i, source) } wg.Wait() diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index cfde9ff577b..c09be81b123 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -36,6 +36,7 @@ func TestConcatenate_Execute(t *testing.T) { inputs: []*sqltypes.Result{ sqltypes.MakeTestResult(sqltypes.MakeTestFields("id1|col11|col12", "int64|varbinary|varbinary")), sqltypes.MakeTestResult(sqltypes.MakeTestFields("id2|col21|col22", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id3|col31|col32", "int64|varbinary|varbinary")), }, expectedResult: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id1|col11|col12", "int64|varbinary|varbinary")), }, { diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 53d82ca3ed0..9c27df58629 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -2157,3 +2157,41 @@ func TestSelectBindvarswithPrepare(t *testing.T) { t.Errorf("sbc2.Queries: %+v, want nil\n", sbc2.Queries) } } + +func TestSelectWithUnionAll(t *testing.T) { + executor, sbc1, sbc2, _ := createExecutorEnv() + executor.normalize = true + sql := "select id from user where id = 1 union select id from user where id = 1 union all select id from user where id in (1, 2, 3)" + _, err := executorExec(executor, sql, map[string]*querypb.BindVariable{}) + require.NoError(t, err) + bv, err := sqltypes.BuildBindVariable([]int64{1, 2, 3}) + require.NoError(t, err) + bv1, err := sqltypes.BuildBindVariable([]int64{1, 2}) + require.NoError(t, err) + bv2, err := sqltypes.BuildBindVariable([]int64{3}) + require.NoError(t, err) + sbc1WantQueries := []*querypb.BoundQuery{{ + Sql: "select id from user where id = :vtg1 union select id from user where id = :vtg1", + BindVariables: map[string]*querypb.BindVariable{ + "vtg1": sqltypes.Int64BindVariable(1), + "vtg2": bv, + }, + }, { + Sql: "select id from user where id in ::__vals", + BindVariables: map[string]*querypb.BindVariable{ + "__vals": bv1, + "vtg1": sqltypes.Int64BindVariable(1), + "vtg2": bv, + }, + }} + sbc2WantQueries := []*querypb.BoundQuery{{ + Sql: "select id from user where id in ::__vals", + BindVariables: map[string]*querypb.BindVariable{ + "__vals": bv2, + "vtg1": sqltypes.Int64BindVariable(1), + "vtg2": bv, + }, + }} + utils.MustMatch(t, sbc2WantQueries, sbc2.Queries, "sbc2") + utils.MustMatch(t, sbc1WantQueries, sbc1.Queries, "sbc1") +} From c78910dc8a2e7afd958d1d63cc7decad1302ab5f Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Sat, 27 Jun 2020 00:58:34 +0530 Subject: [PATCH 145/430] union-all: fix data race Signed-off-by: Harshit Gangal --- go/vt/vtgate/engine/concatenate.go | 8 +++- go/vt/vtgate/executor_select_test.go | 42 ++++++++++++------- .../planbuilder/testdata/union_cases.txt | 39 +++++++++++++++++ go/vt/vttablet/sandboxconn/sandboxconn.go | 8 ++++ 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index c7d78d1cffe..b6d8639b582 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -107,9 +107,10 @@ func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*queryp var seenFields []*querypb.Field fieldsSent := false - var errs []error + errs := make([]error, len(c.Sources)) var wg, fieldset sync.WaitGroup fieldset.Add(1) + var mu sync.Mutex for i, source := range c.Sources { wg.Add(1) go func(i int, source Primitive) { @@ -120,6 +121,7 @@ func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*queryp defer fieldset.Done() seenFields = resultChunk.Fields fieldsSent = true + // No other call can happen before this call. return callback(resultChunk) } fieldset.Wait() @@ -129,9 +131,11 @@ func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*queryp return err } } + mu.Lock() + defer mu.Unlock() return callback(resultChunk) }) - errs = append(errs, err) + errs[i] = err }(i, source) } wg.Wait() diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 9c27df58629..628b4796bff 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -2161,26 +2161,22 @@ func TestSelectBindvarswithPrepare(t *testing.T) { func TestSelectWithUnionAll(t *testing.T) { executor, sbc1, sbc2, _ := createExecutorEnv() executor.normalize = true - sql := "select id from user where id = 1 union select id from user where id = 1 union all select id from user where id in (1, 2, 3)" - _, err := executorExec(executor, sql, map[string]*querypb.BindVariable{}) - require.NoError(t, err) - bv, err := sqltypes.BuildBindVariable([]int64{1, 2, 3}) - require.NoError(t, err) - bv1, err := sqltypes.BuildBindVariable([]int64{1, 2}) - require.NoError(t, err) - bv2, err := sqltypes.BuildBindVariable([]int64{3}) - require.NoError(t, err) + sql := "select id from user where id in (1, 2, 3) union all select id from user where id in (1, 2, 3)" + bv, _ := sqltypes.BuildBindVariable([]int64{1, 2, 3}) + bv1, _ := sqltypes.BuildBindVariable([]int64{1, 2}) + bv2, _ := sqltypes.BuildBindVariable([]int64{3}) sbc1WantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id = :vtg1 union select id from user where id = :vtg1", + Sql: "select id from user where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ - "vtg1": sqltypes.Int64BindVariable(1), - "vtg2": bv, + "__vals": bv1, + "vtg1": bv, + "vtg2": bv, }, }, { Sql: "select id from user where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": bv1, - "vtg1": sqltypes.Int64BindVariable(1), + "vtg1": bv, "vtg2": bv, }, }} @@ -2188,10 +2184,28 @@ func TestSelectWithUnionAll(t *testing.T) { Sql: "select id from user where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": bv2, - "vtg1": sqltypes.Int64BindVariable(1), + "vtg1": bv, + "vtg2": bv, + }, + }, { + Sql: "select id from user where id in ::__vals", + BindVariables: map[string]*querypb.BindVariable{ + "__vals": bv2, + "vtg1": bv, "vtg2": bv, }, }} + _, err := executorExec(executor, sql, map[string]*querypb.BindVariable{}) + require.NoError(t, err) + utils.MustMatch(t, sbc1WantQueries, sbc1.Queries, "sbc1") utils.MustMatch(t, sbc2WantQueries, sbc2.Queries, "sbc2") + + // Reset + sbc1.Queries = nil + sbc2.Queries = nil + + _, err = executorStream(executor, sql) + require.NoError(t, err) utils.MustMatch(t, sbc1WantQueries, sbc1.Queries, "sbc1") + utils.MustMatch(t, sbc2WantQueries, sbc2.Queries, "sbc2") } diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.txt b/go/vt/vtgate/planbuilder/testdata/union_cases.txt index f975b7e4e06..8a88dc48f0c 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.txt @@ -241,3 +241,42 @@ ] } } + +# union all on scatter and single route +"select id from user where id = 1 union select id from user where id = 1 union all select id from user" +{ + "QueryType": "SELECT", + "Original": "select id from user where id = 1 union select id from user where id = 1 union all select id from user", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1 union select id from user where 1 != 1", + "Query": "select id from user where id = 1 union select id from user where id = 1", + "Table": "user", + "Values": [ + 1 + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from user where 1 != 1", + "Query": "select id from user", + "Table": "user" + } + ] + } +} + diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index 4a75deb5cc7..e9e16557870 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -20,6 +20,7 @@ package sandboxconn import ( "fmt" + "sync" "golang.org/x/net/context" "vitess.io/vitess/go/sqltypes" @@ -93,6 +94,9 @@ type SandboxConn struct { // transaction id generator TransactionID sync2.AtomicInt64 + + sExecMu sync.Mutex + execMu sync.Mutex } var _ queryservice.QueryService = (*SandboxConn)(nil) // compile-time interface check @@ -128,6 +132,8 @@ func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, que for k, v := range bindVars { bv[k] = v } + sbc.execMu.Lock() + defer sbc.execMu.Unlock() sbc.Queries = append(sbc.Queries, &querypb.BoundQuery{ Sql: query, BindVariables: bv, @@ -164,6 +170,8 @@ func (sbc *SandboxConn) StreamExecute(ctx context.Context, target *querypb.Targe for k, v := range bindVars { bv[k] = v } + sbc.sExecMu.Lock() + defer sbc.sExecMu.Unlock() sbc.Queries = append(sbc.Queries, &querypb.BoundQuery{ Sql: query, BindVariables: bv, From 8640d59f145a251d4f8ac1902ddb8e54fb63bd05 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 29 Jun 2020 08:55:55 +0530 Subject: [PATCH 146/430] union-all: data race fix on sandbox client and added additional test Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/misc_test.go | 19 +++ go/vt/vtgate/engine/concatenate.go | 5 + go/vt/vtgate/engine/concatenate_test.go | 145 +++++++++++++++++++++- go/vt/vttablet/sandboxconn/sandboxconn.go | 13 +- 4 files changed, 175 insertions(+), 7 deletions(-) diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index da66cd5d8c2..dba04c1cb01 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -19,6 +19,8 @@ package vtgate import ( "context" "fmt" + "sort" + "strings" "testing" "github.com/google/go-cmp/cmp" @@ -579,6 +581,23 @@ func TestUnionAll(t *testing.T) { // union all between two different tables assertMatches(t, conn, "select tbl2.id1 FROM ((select id1 from t1 order by id1 limit 5) union all (select id1 from t1 order by id1 desc limit 5)) as tbl1 INNER JOIN t1 as tbl2 ON tbl1.id1 = tbl2.id1", "[[INT64(1)] [INT64(2)] [INT64(2)] [INT64(1)]]") + + exec(t, conn, "insert into t1(id1, id2) values(3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8)") + + // union all between two selectuniquein tables + qr := exec(t, conn, "select id1 from t1 where id1 in (1, 2, 3, 4, 5, 6, 7, 8) union all select id1 from t1 where id1 in (1, 2, 3, 4, 5, 6, 7, 8)") + expected := sortString("[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)] [INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)]]") + assert.Equal(t, expected, sortString(fmt.Sprintf("%v", qr.Rows))) + + // clean up + exec(t, conn, "delete from t1") + exec(t, conn, "delete from t2") +} + +func sortString(w string) string { + s := strings.Split(w, "") + sort.Strings(s) + return strings.Join(s, "") } func TestUnion(t *testing.T) { diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index b6d8639b582..1f6e32b788b 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -131,10 +131,15 @@ func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*queryp return err } } + // This to ensure only one send happens back to the client. mu.Lock() defer mu.Unlock() return callback(resultChunk) }) + // This is to ensure other streams complete if the first stream failed to unlock the wait. + if i == 0 && !fieldsSent { + fieldset.Done() + } errs[i] = err }(i, source) } diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index c09be81b123..facd781743a 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -17,13 +17,14 @@ limitations under the License. package engine import ( + "errors" "testing" "github.com/stretchr/testify/require" "vitess.io/vitess/go/sqltypes" ) -func TestConcatenate_Execute(t *testing.T) { +func TestConcatenate_NoSourcesErr(t *testing.T) { type testCase struct { testName string inputs []*sqltypes.Result @@ -73,7 +74,7 @@ func TestConcatenate_Execute(t *testing.T) { t.Run(tc.testName, func(t *testing.T) { var fps []Primitive for _, input := range tc.inputs { - fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input, input, input, input, input}}) + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}, sendErr: errors.New("abc")}) } concatenate := &Concatenate{Sources: fps} @@ -99,3 +100,143 @@ func TestConcatenate_Execute(t *testing.T) { }) } } + +func TestConcatenate_WithSourcesErrFirst(t *testing.T) { + type testCase struct { + testName string + inputs []*sqltypes.Result + } + + executeErr := "Concatenate.Execute: failed" + streamExecuteErr := "failed" + + testCases := []*testCase{{ + testName: "empty results", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id1|col11|col12", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id2|col21|col22", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id3|col31|col32", "int64|varbinary|varbinary")), + }, + }, { + testName: "2 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + }, { + testName: "mismatch field type", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + }, { + testName: "input source has different column count", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varchar"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), + }, + }, { + testName: "1 empty result and 1 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + }} + + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + var fps []Primitive + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{nil, nil}, sendErr: errors.New("failed")}) + for _, input := range tc.inputs { + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}}) + } + concatenate := &Concatenate{Sources: fps} + + t.Run("Execute wantfields true", func(t *testing.T) { + _, err := concatenate.Execute(&noopVCursor{}, nil, true) + require.EqualError(t, err, executeErr) + + }) + + t.Run("StreamExecute wantfields true", func(t *testing.T) { + _, err := wrapStreamExecute(concatenate, &noopVCursor{}, nil, true) + require.EqualError(t, err, streamExecuteErr) + }) + }) + } +} + +func TestConcatenate_WithSourcesErrLast(t *testing.T) { + type testCase struct { + testName string + inputs []*sqltypes.Result + execErr, streamExecErr string + } + + executeErr := "Concatenate.Execute: failed" + streamExecuteErr := "failed" + + testCases := []*testCase{{ + testName: "empty results", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id1|col11|col12", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id2|col21|col22", "int64|varbinary|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id3|col31|col32", "int64|varbinary|varbinary")), + }, + execErr: executeErr, + streamExecErr: streamExecuteErr, + }, { + testName: "2 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary"), "11|m1|n1", "22|m2|n2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + execErr: executeErr, + streamExecErr: streamExecuteErr, + }, { + testName: "mismatch field type", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + execErr: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + streamExecErr: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + }, { + testName: "input source has different column count", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varchar"), "1|a1|b1", "2|a2|b2"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), + }, + execErr: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + streamExecErr: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + }, { + testName: "1 empty result and 1 non empty result", + inputs: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("myid|mycol1|mycol2", "int64|varchar|varbinary")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), + }, + execErr: executeErr, + streamExecErr: streamExecuteErr, + }} + + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + var fps []Primitive + for _, input := range tc.inputs { + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}}) + } + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{nil, nil}, sendErr: errors.New("failed")}) + concatenate := &Concatenate{Sources: fps} + + t.Run("Execute wantfields true", func(t *testing.T) { + _, err := concatenate.Execute(&noopVCursor{}, nil, true) + require.EqualError(t, err, tc.execErr) + }) + + t.Run("StreamExecute wantfields true", func(t *testing.T) { + _, err := wrapStreamExecute(concatenate, &noopVCursor{}, nil, true) + require.EqualError(t, err, tc.streamExecErr) + }) + }) + } +} diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index e9e16557870..229b2ddd8f0 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -127,13 +127,13 @@ func (sbc *SandboxConn) SetResults(r []*sqltypes.Result) { // Execute is part of the QueryService interface. func (sbc *SandboxConn) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { + sbc.execMu.Lock() + defer sbc.execMu.Unlock() sbc.ExecCount.Add(1) bv := make(map[string]*querypb.BindVariable) for k, v := range bindVars { bv[k] = v } - sbc.execMu.Lock() - defer sbc.execMu.Unlock() sbc.Queries = append(sbc.Queries, &querypb.BoundQuery{ Sql: query, BindVariables: bv, @@ -165,13 +165,12 @@ func (sbc *SandboxConn) ExecuteBatch(ctx context.Context, target *querypb.Target // StreamExecute is part of the QueryService interface. func (sbc *SandboxConn) StreamExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions, callback func(*sqltypes.Result) error) error { + sbc.sExecMu.Lock() sbc.ExecCount.Add(1) bv := make(map[string]*querypb.BindVariable) for k, v := range bindVars { bv[k] = v } - sbc.sExecMu.Lock() - defer sbc.sExecMu.Unlock() sbc.Queries = append(sbc.Queries, &querypb.BoundQuery{ Sql: query, BindVariables: bv, @@ -179,9 +178,13 @@ func (sbc *SandboxConn) StreamExecute(ctx context.Context, target *querypb.Targe sbc.Options = append(sbc.Options, options) err := sbc.getError() if err != nil { + sbc.sExecMu.Unlock() return err } - return callback(sbc.getNextResult()) + nextRs := sbc.getNextResult() + sbc.sExecMu.Unlock() + + return callback(nextRs) } // Begin is part of the QueryService interface. From 0b585ba91ee2a17d7fc4daf183944d6caf5b95de Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 29 Jun 2020 13:51:10 +0530 Subject: [PATCH 147/430] union-all: use errgroup context to cancel parallel streams Signed-off-by: Harshit Gangal --- go/vt/vtgate/engine/concatenate.go | 29 +++++++------- go/vt/vtgate/engine/concatenate_test.go | 48 +++++++++++++----------- go/vt/vtgate/engine/fake_vcursor_test.go | 22 +++++++++-- go/vt/vtgate/engine/primitive.go | 5 +++ go/vt/vtgate/vcursor_impl.go | 9 +++++ 5 files changed, 74 insertions(+), 39 deletions(-) diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index 1f6e32b788b..3e1539dcb7c 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -105,16 +105,15 @@ func (c *Concatenate) Execute(vcursor VCursor, bindVars map[string]*querypb.Bind // StreamExecute performs a streaming exec. func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { var seenFields []*querypb.Field + var fieldset sync.WaitGroup fieldsSent := false - errs := make([]error, len(c.Sources)) - var wg, fieldset sync.WaitGroup + g := vcursor.ErrorGroupCancellableContext() fieldset.Add(1) var mu sync.Mutex for i, source := range c.Sources { - wg.Add(1) - go func(i int, source Primitive) { - defer wg.Done() + i, source := i, source + g.Go(func() error { err := source.StreamExecute(vcursor, bindVars, wantfields, func(resultChunk *sqltypes.Result) error { // if we have fields to compare, make sure all the fields are all the same if i == 0 && !fieldsSent { @@ -134,21 +133,23 @@ func (c *Concatenate) StreamExecute(vcursor VCursor, bindVars map[string]*queryp // This to ensure only one send happens back to the client. mu.Lock() defer mu.Unlock() - return callback(resultChunk) + select { + case <-vcursor.Context().Done(): + return nil + default: + return callback(resultChunk) + } }) // This is to ensure other streams complete if the first stream failed to unlock the wait. if i == 0 && !fieldsSent { fieldset.Done() } - errs[i] = err - }(i, source) - } - wg.Wait() - - for _, err := range errs { - if err != nil { return err - } + }) + + } + if err := g.Wait(); err != nil { + return err } return nil } diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index facd781743a..7ad3207d4eb 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -17,6 +17,7 @@ limitations under the License. package engine import ( + "context" "errors" "testing" @@ -79,7 +80,7 @@ func TestConcatenate_NoSourcesErr(t *testing.T) { concatenate := &Concatenate{Sources: fps} t.Run("Execute wantfields true", func(t *testing.T) { - qr, err := concatenate.Execute(&noopVCursor{}, nil, true) + qr, err := concatenate.Execute(&noopVCursor{ctx: context.Background()}, nil, true) if tc.expectedError == "" { require.NoError(t, err) require.Equal(t, tc.expectedResult, qr) @@ -89,7 +90,7 @@ func TestConcatenate_NoSourcesErr(t *testing.T) { }) t.Run("StreamExecute wantfields true", func(t *testing.T) { - qr, err := wrapStreamExecute(concatenate, &noopVCursor{}, nil, true) + qr, err := wrapStreamExecute(concatenate, &noopVCursor{ctx: context.Background()}, nil, true) if tc.expectedError == "" { require.NoError(t, err) require.Equal(t, tc.expectedResult, qr) @@ -107,9 +108,8 @@ func TestConcatenate_WithSourcesErrFirst(t *testing.T) { inputs []*sqltypes.Result } - executeErr := "Concatenate.Execute: failed" - streamExecuteErr := "failed" - + strFailed := "failed" + executeErr := "Concatenate.Execute: " + strFailed testCases := []*testCase{{ testName: "empty results", inputs: []*sqltypes.Result{ @@ -146,21 +146,21 @@ func TestConcatenate_WithSourcesErrFirst(t *testing.T) { for _, tc := range testCases { t.Run(tc.testName, func(t *testing.T) { var fps []Primitive - fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{nil, nil}, sendErr: errors.New("failed")}) + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{nil, nil}, sendErr: errors.New(strFailed)}) for _, input := range tc.inputs { fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}}) } concatenate := &Concatenate{Sources: fps} t.Run("Execute wantfields true", func(t *testing.T) { - _, err := concatenate.Execute(&noopVCursor{}, nil, true) + _, err := concatenate.Execute(&noopVCursor{ctx: context.Background()}, nil, true) require.EqualError(t, err, executeErr) }) t.Run("StreamExecute wantfields true", func(t *testing.T) { - _, err := wrapStreamExecute(concatenate, &noopVCursor{}, nil, true) - require.EqualError(t, err, streamExecuteErr) + _, err := wrapStreamExecute(concatenate, &noopVCursor{ctx: context.Background()}, nil, true) + require.EqualError(t, err, strFailed) }) }) } @@ -171,11 +171,11 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { testName string inputs []*sqltypes.Result execErr, streamExecErr string + nonDeterministicErr bool } - executeErr := "Concatenate.Execute: failed" - streamExecuteErr := "failed" - + strFailed := "failed" + executeErr := "Concatenate.Execute: " + strFailed testCases := []*testCase{{ testName: "empty results", inputs: []*sqltypes.Result{ @@ -184,7 +184,7 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { sqltypes.MakeTestResult(sqltypes.MakeTestFields("id3|col31|col32", "int64|varbinary|varbinary")), }, execErr: executeErr, - streamExecErr: streamExecuteErr, + streamExecErr: strFailed, }, { testName: "2 non empty result", inputs: []*sqltypes.Result{ @@ -192,15 +192,16 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, execErr: executeErr, - streamExecErr: streamExecuteErr, + streamExecErr: strFailed, }, { testName: "mismatch field type", inputs: []*sqltypes.Result{ sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varbinary|varbinary"), "1|a1|b1", "2|a2|b2"), sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, - execErr: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", - streamExecErr: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + execErr: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + streamExecErr: "column field type does not match for name: (col1, col3) types: (VARBINARY, VARCHAR)", + nonDeterministicErr: true, }, { testName: "input source has different column count", inputs: []*sqltypes.Result{ @@ -208,7 +209,7 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), }, execErr: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", - streamExecErr: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + streamExecErr: strFailed, }, { testName: "1 empty result and 1 non empty result", inputs: []*sqltypes.Result{ @@ -216,7 +217,7 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varbinary"), "1|a1|b1", "2|a2|b2"), }, execErr: executeErr, - streamExecErr: streamExecuteErr, + streamExecErr: strFailed, }} for _, tc := range testCases { @@ -225,17 +226,20 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { for _, input := range tc.inputs { fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{input, input}}) } - fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{nil, nil}, sendErr: errors.New("failed")}) + fps = append(fps, &fakePrimitive{results: []*sqltypes.Result{nil, nil}, sendErr: errors.New(strFailed)}) concatenate := &Concatenate{Sources: fps} t.Run("Execute wantfields true", func(t *testing.T) { - _, err := concatenate.Execute(&noopVCursor{}, nil, true) + _, err := concatenate.Execute(&noopVCursor{ctx: context.Background()}, nil, true) require.EqualError(t, err, tc.execErr) }) t.Run("StreamExecute wantfields true", func(t *testing.T) { - _, err := wrapStreamExecute(concatenate, &noopVCursor{}, nil, true) - require.EqualError(t, err, tc.streamExecErr) + _, err := wrapStreamExecute(concatenate, &noopVCursor{ctx: context.Background()}, nil, true) + require.Error(t, err) + if !tc.nonDeterministicErr { + require.EqualError(t, err, tc.streamExecErr) + } }) }) } diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 7d93c779a72..f0452eef371 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -25,6 +25,8 @@ import ( "testing" "time" + "golang.org/x/sync/errgroup" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/sqlparser" @@ -48,6 +50,7 @@ var _ SessionActions = (*noopVCursor)(nil) // noopVCursor is used to build other vcursors. type noopVCursor struct { + ctx context.Context } func (t noopVCursor) SetUDV(key string, value interface{}) error { @@ -61,17 +64,20 @@ func (t noopVCursor) SetSysVar(name string, expr string) { func (t noopVCursor) ExecuteVSchema(keyspace string, vschemaDDL *sqlparser.DDL) error { panic("implement me") } + func (t noopVCursor) Session() SessionActions { return t } + func (t noopVCursor) SetTarget(target string) error { panic("implement me") } - func (t noopVCursor) Context() context.Context { - return context.Background() + if t.ctx == nil { + return context.Background() + } + return t.ctx } - func (t noopVCursor) MaxMemoryRows() int { return testMaxMemoryRows } @@ -80,6 +86,12 @@ func (t noopVCursor) SetContextTimeout(timeout time.Duration) context.CancelFunc return func() {} } +func (t noopVCursor) ErrorGroupCancellableContext() *errgroup.Group { + g, ctx := errgroup.WithContext(t.ctx) + t.ctx = ctx + return g +} + func (t noopVCursor) RecordWarning(warning *querypb.QueryWarning) { } @@ -169,6 +181,10 @@ func (f *loggingVCursor) SetContextTimeout(timeout time.Duration) context.Cancel return func() {} } +func (f *loggingVCursor) ErrorGroupCancellableContext() *errgroup.Group { + panic("implement me") +} + func (f *loggingVCursor) RecordWarning(warning *querypb.QueryWarning) { f.warnings = append(f.warnings, warning) } diff --git a/go/vt/vtgate/engine/primitive.go b/go/vt/vtgate/engine/primitive.go index 1fe163f2c84..8003a7ab58f 100644 --- a/go/vt/vtgate/engine/primitive.go +++ b/go/vt/vtgate/engine/primitive.go @@ -21,6 +21,8 @@ import ( "sync" "time" + "golang.org/x/sync/errgroup" + "vitess.io/vitess/go/vt/sqlparser" "golang.org/x/net/context" @@ -55,6 +57,9 @@ type ( // SetContextTimeout updates the context and sets a timeout. SetContextTimeout(timeout time.Duration) context.CancelFunc + // ErrorGroupCancellableContext updates context that can be cancelled. + ErrorGroupCancellableContext() *errgroup.Group + // V3 functions. Execute(method string, query string, bindvars map[string]*querypb.BindVariable, rollbackOnError bool, co vtgatepb.CommitOrder) (*sqltypes.Result, error) AutocommitApproval() bool diff --git a/go/vt/vtgate/vcursor_impl.go b/go/vt/vtgate/vcursor_impl.go index d6d8acf0483..2b739bd06d9 100644 --- a/go/vt/vtgate/vcursor_impl.go +++ b/go/vt/vtgate/vcursor_impl.go @@ -23,6 +23,8 @@ import ( "sync/atomic" "time" + "golang.org/x/sync/errgroup" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/callerid" @@ -174,6 +176,13 @@ func (vc *vcursorImpl) SetContextTimeout(timeout time.Duration) context.CancelFu return cancel } +// ErrorGroupCancellableContext updates context that can be cancelled. +func (vc *vcursorImpl) ErrorGroupCancellableContext() *errgroup.Group { + g, ctx := errgroup.WithContext(vc.ctx) + vc.ctx = ctx + return g +} + // RecordWarning stores the given warning in the current session func (vc *vcursorImpl) RecordWarning(warning *querypb.QueryWarning) { vc.safeSession.RecordWarning(warning) From ef0b8872f65144de2e82ba760e2eee1f254e349d Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 29 Jun 2020 10:55:18 +0200 Subject: [PATCH 148/430] union-all: Mark test as non-deterministic Signed-off-by: Andres Taylor --- go/vt/vtgate/engine/concatenate_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index 7ad3207d4eb..e5c88f667dd 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -208,8 +208,9 @@ func TestConcatenate_WithSourcesErrLast(t *testing.T) { sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col1|col2", "int64|varchar|varchar"), "1|a1|b1", "2|a2|b2"), sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|col3|col4|col5", "int64|varchar|varchar|int32"), "1|a1|b1|5", "2|a2|b2|6"), }, - execErr: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", - streamExecErr: strFailed, + execErr: "The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000)", + streamExecErr: strFailed, + nonDeterministicErr: true, }, { testName: "1 empty result and 1 non empty result", inputs: []*sqltypes.Result{ From bd59a4834c331a0b58d1318f76e542bead47e800 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 29 Jun 2020 10:58:18 +0200 Subject: [PATCH 149/430] union-all: use specific version of x/sync Signed-off-by: Andres Taylor --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 0fda1348b06..dd25c892b65 100644 --- a/go.mod +++ b/go.mod @@ -77,6 +77,7 @@ require ( golang.org/x/lint v0.0.0-20190409202823-959b441ac422 golang.org/x/net v0.0.0-20200202094626-16171245cfb2 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e golang.org/x/text v0.3.2 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 golang.org/x/tools v0.0.0-20191219041853-979b82bfef62 From a40e65dcd77851b3c02c0531f31a9ca85f44387b Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 29 Jun 2020 22:19:19 +0530 Subject: [PATCH 150/430] union-all: sort rows string for test comparison Signed-off-by: Harshit Gangal --- go/test/endtoend/vtgate/misc_test.go | 14 ++++---------- go/test/utils/sort.go | 13 +++++++++++++ go/vt/vtgate/engine/concatenate_test.go | 5 ++++- 3 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 go/test/utils/sort.go diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index dba04c1cb01..55cf98328ae 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -19,10 +19,10 @@ package vtgate import ( "context" "fmt" - "sort" - "strings" "testing" + "vitess.io/vitess/go/test/utils" + "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/assert" @@ -586,20 +586,14 @@ func TestUnionAll(t *testing.T) { // union all between two selectuniquein tables qr := exec(t, conn, "select id1 from t1 where id1 in (1, 2, 3, 4, 5, 6, 7, 8) union all select id1 from t1 where id1 in (1, 2, 3, 4, 5, 6, 7, 8)") - expected := sortString("[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)] [INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)]]") - assert.Equal(t, expected, sortString(fmt.Sprintf("%v", qr.Rows))) + expected := utils.SortString("[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)] [INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)]]") + assert.Equal(t, expected, utils.SortString(fmt.Sprintf("%v", qr.Rows))) // clean up exec(t, conn, "delete from t1") exec(t, conn, "delete from t2") } -func sortString(w string) string { - s := strings.Split(w, "") - sort.Strings(s) - return strings.Join(s, "") -} - func TestUnion(t *testing.T) { conn, err := mysql.Connect(context.Background(), &vtParams) require.NoError(t, err) diff --git a/go/test/utils/sort.go b/go/test/utils/sort.go new file mode 100644 index 00000000000..f3584ef70ac --- /dev/null +++ b/go/test/utils/sort.go @@ -0,0 +1,13 @@ +package utils + +import ( + "sort" + "strings" +) + +//SortString sorts the string. +func SortString(w string) string { + s := strings.Split(w, "") + sort.Strings(s) + return strings.Join(s, "") +} diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index e5c88f667dd..27cda59ce40 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -19,8 +19,11 @@ package engine import ( "context" "errors" + "fmt" "testing" + "vitess.io/vitess/go/test/utils" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/sqltypes" ) @@ -93,7 +96,7 @@ func TestConcatenate_NoSourcesErr(t *testing.T) { qr, err := wrapStreamExecute(concatenate, &noopVCursor{ctx: context.Background()}, nil, true) if tc.expectedError == "" { require.NoError(t, err) - require.Equal(t, tc.expectedResult, qr) + require.Equal(t, utils.SortString(fmt.Sprintf("%v", tc.expectedResult.Rows)), utils.SortString(fmt.Sprintf("%v", qr.Rows))) } else { require.EqualError(t, err, tc.expectedError) } From 790ac04201120d5f115ef518d0a7c9b9b5bc7c8b Mon Sep 17 00:00:00 2001 From: Li Zhijian Date: Wed, 1 Jul 2020 16:31:48 +0800 Subject: [PATCH 151/430] cleanup tempfile for filelogger_test Signed-off-by: Li Zhijian --- go/vt/vttablet/filelogger/filelogger_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go/vt/vttablet/filelogger/filelogger_test.go b/go/vt/vttablet/filelogger/filelogger_test.go index 25009700a5e..39c59d41164 100644 --- a/go/vt/vttablet/filelogger/filelogger_test.go +++ b/go/vt/vttablet/filelogger/filelogger_test.go @@ -19,6 +19,7 @@ package filelogger import ( "context" "io/ioutil" + "os" "path" "testing" "time" @@ -33,6 +34,7 @@ func TestFileLog(t *testing.T) { if err != nil { t.Fatalf("error getting tempdir: %v", err) } + defer os.RemoveAll(dir) logPath := path.Join(dir, "test.log") logger, err := Init(logPath) @@ -87,6 +89,7 @@ func TestFileLogRedacted(t *testing.T) { if err != nil { t.Fatalf("error getting tempdir: %v", err) } + defer os.RemoveAll(dir) logPath := path.Join(dir, "test.log") logger, err := Init(logPath) From 7eef87e8d51fd50b79fa0d8a1c653a30ad745d23 Mon Sep 17 00:00:00 2001 From: Li Zhijian Date: Wed, 1 Jul 2020 16:38:23 +0800 Subject: [PATCH 152/430] cleanup tempfile for plan_test Signed-off-by: Li Zhijian --- go/vt/vtgate/planbuilder/plan_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index f91aa539210..e8d6436c8c7 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -152,6 +152,7 @@ func TestPlan(t *testing.T) { testOutputTempDir, err := ioutil.TempDir("", "plan_test") require.NoError(t, err) + defer os.RemoveAll(testOutputTempDir) // You will notice that some tests expect user.Id instead of user.id. // This is because we now pre-create vindex columns in the symbol // table, which come from vschema. In the test vschema, @@ -186,6 +187,7 @@ func TestOne(t *testing.T) { func TestBypassPlanningFromFile(t *testing.T) { testOutputTempDir, err := ioutil.TempDir("", "plan_test") require.NoError(t, err) + defer os.RemoveAll(testOutputTempDir) vschema := &vschemaWrapper{ v: loadSchema(t, "schema_test.json"), keyspace: &vindexes.Keyspace{ @@ -203,6 +205,7 @@ func TestDDLPlanningFromFile(t *testing.T) { // We are testing this separately so we can set a default keyspace testOutputTempDir, err := ioutil.TempDir("", "plan_test") require.NoError(t, err) + defer os.RemoveAll(testOutputTempDir) vschema := &vschemaWrapper{ v: loadSchema(t, "schema_test.json"), keyspace: &vindexes.Keyspace{ @@ -218,6 +221,7 @@ func TestDDLPlanningFromFile(t *testing.T) { func TestOtherPlanningFromFile(t *testing.T) { // We are testing this separately so we can set a default keyspace testOutputTempDir, err := ioutil.TempDir("", "plan_test") + defer os.RemoveAll(testOutputTempDir) require.NoError(t, err) vschema := &vschemaWrapper{ v: loadSchema(t, "schema_test.json"), From c83201f5e31ea21c7f1944bb5b5524adeef5d77a Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Wed, 1 Jul 2020 13:43:05 +0200 Subject: [PATCH 153/430] Schema Version Table: alter table using withddl avoiding breaking change. Updated tests: extra events can occur if tests are run isolated due to the way withddl works Signed-off-by: Rohit Nayak --- go.mod | 1 + go.sum | 2 + go/vt/vttablet/endtoend/vstreamer_test.go | 47 +++++++++++++------ go/vt/vttablet/tabletserver/schema/tracker.go | 5 +- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 0fda1348b06..0fbf618f358 100644 --- a/go.mod +++ b/go.mod @@ -48,6 +48,7 @@ require ( github.com/magiconair/properties v1.8.1 github.com/mattn/go-runewidth v0.0.3 // indirect github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 + github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/go-testing-interface v1.14.0 // indirect github.com/mitchellh/mapstructure v1.2.3 // indirect github.com/olekukonko/tablewriter v0.0.0-20180130162743-b8a9be070da4 diff --git a/go.sum b/go.sum index 388c27fd24b..c41fd8aff02 100644 --- a/go.sum +++ b/go.sum @@ -420,6 +420,8 @@ github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.0 h1:/x0XQ6h+3U3nAyk1yx+bHPURrKa9sVVvYbuqZ7pIAtI= github.com/mitchellh/go-testing-interface v1.14.0/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= diff --git a/go/vt/vttablet/endtoend/vstreamer_test.go b/go/vt/vttablet/endtoend/vstreamer_test.go index 4041e246266..c7f5e30b5dc 100644 --- a/go/vt/vttablet/endtoend/vstreamer_test.go +++ b/go/vt/vttablet/endtoend/vstreamer_test.go @@ -38,6 +38,20 @@ type test struct { output []string } +// the schema version tests can get events related to the creation of the schema version table depending on +// whether the table already exists or not. To avoid different behaviour when tests are run together +// this function adds to events expected if table is not present +func getSchemaVersionTableCreationEvents() []string { + tableCreationEvents := []string{"gtid", "other", "gtid", "other"} + client := framework.NewClient() + _, err := client.Execute("describe _vt.schema_version", nil) + if err != nil { + log.Errorf("_vt.schema_version not found, will expect its table creation events") + return tableCreationEvents + } + return nil +} + func TestSchemaVersioning(t *testing.T) { // Let's disable the already running tracker to prevent it from // picking events from the previous test, and then re-enable it at the end. @@ -67,14 +81,15 @@ func TestSchemaVersioning(t *testing.T) { var cases = []test{ { query: "create table vitess_version (id1 int, id2 int)", - output: []string{ + output: append(append([]string{ `gtid`, //gtid+other => vstream current pos `other`, `gtid`, //gtid+ddl => actual query - `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `, + `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `}, + getSchemaVersionTableCreationEvents()...), `version`, `gtid`, - }, + ), }, { query: "insert into vitess_version values(1, 10)", @@ -168,6 +183,7 @@ func TestSchemaVersioning(t *testing.T) { } runCases(ctx, t, cases, eventCh) cancel() + log.Infof("\n\n\n=============================================== PAST EVENTS WITH TRACK VERSIONS START HERE ======================\n\n\n") ctx, cancel = context.WithCancel(context.Background()) defer cancel() @@ -197,9 +213,10 @@ func TestSchemaVersioning(t *testing.T) { }() // playing events from the past: same events as original since historian is providing the latest schema - output := []string{ + output := append(append([]string{ `gtid`, - `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `, + `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `}, + getSchemaVersionTableCreationEvents()...), `version`, `gtid`, `type:FIELD field_event: fields: > `, @@ -224,7 +241,7 @@ func TestSchemaVersioning(t *testing.T) { `type:FIELD field_event: fields: fields: fields: > `, `type:ROW row_event: > > `, `gtid`, - } + ) expectLogs(ctx, t, "Past stream", eventCh, output) @@ -260,9 +277,10 @@ func TestSchemaVersioning(t *testing.T) { }() // playing events from the past: same as earlier except one below, see comments - output = []string{ + output = append(append([]string{ `gtid`, - `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `, + `type:DDL ddl:"create table vitess_version (id1 int, id2 int)" `}, + getSchemaVersionTableCreationEvents()...), `version`, `gtid`, `type:FIELD field_event: fields: > `, @@ -290,7 +308,7 @@ func TestSchemaVersioning(t *testing.T) { `type:FIELD field_event: fields: fields: fields: > `, `type:ROW row_event: > > `, `gtid`, - } + ) expectLogs(ctx, t, "Past stream", eventCh, output) cancel() @@ -340,16 +358,15 @@ func TestSchemaVersioningLongDDL(t *testing.T) { var cases = []test{ { query: longDDL, - output: []string{ + output: append(append([]string{ `gtid`, //gtid+other => vstream current pos `other`, `gtid`, //gtid+ddl => actual query - fmt.Sprintf("type:DDL ddl:\"%s\" ", longDDL), - `gtid`, - `other`, //gtid+other => for ddl "insert into _vt.schema_version ...", ddl is not sent + fmt.Sprintf(`type:DDL ddl:"%s" `, longDDL)}, + getSchemaVersionTableCreationEvents()...), `version`, `gtid`, - }, + ), }, } eventCh := make(chan []*binlogdatapb.VEvent) @@ -405,6 +422,8 @@ func runCases(ctx context.Context, t *testing.T, tests []test, eventCh chan []*b if err != nil || !ok { t.Fatalf("Query %s never got inserted into the schema_version table", query) } + framework.Server.SchemaEngine().Reload(ctx) + } } } diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 1ad3416bbc2..12b89cc22e2 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -36,12 +36,13 @@ const createSchemaTrackingTable = `CREATE TABLE IF NOT EXISTS _vt.schema_version id INT AUTO_INCREMENT, pos VARBINARY(10000) NOT NULL, time_updated BIGINT(20) NOT NULL, - ddl BLOB NOT NULL, + ddl VARBINARY(1000) DEFAULT NULL, schemax BLOB NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB` +const alterSchemaTrackingTable = "alter table _vt.schema_version modify column ddl BLOB NOT NULL" -var withDDL = withddl.New([]string{createSchemaTrackingTable}) +var withDDL = withddl.New([]string{createSchemaTrackingTable, alterSchemaTrackingTable}) // VStreamer defines the functions of VStreamer // that the replicationWatcher needs. From 84169bf921b96e48f7cd6d3bf65cc49d607e1c5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2020 19:27:06 +0000 Subject: [PATCH 154/430] build(deps): bump log4j2.version from 2.13.0 to 2.13.3 in /java Bumps `log4j2.version` from 2.13.0 to 2.13.3. Updates `log4j-api` from 2.13.0 to 2.13.3 Updates `log4j-core` from 2.13.0 to 2.13.3 Signed-off-by: dependabot[bot] --- java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/pom.xml b/java/pom.xml index 9a870cc9f33..e762b9ee121 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -75,7 +75,7 @@ 3.6.1 3.6.1 3.0.0 - 2.13.0 + 2.13.3 From 8c1bd1f2bc52970a3fe0d5b08365a05c3b67a2cd Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 2 Jul 2020 22:04:10 +0530 Subject: [PATCH 155/430] savepoint: added savepoint construct support in tabletserver Signed-off-by: Harshit Gangal --- .../tabletserver/planbuilder/permission.go | 2 ++ .../vttablet/tabletserver/planbuilder/plan.go | 12 +++++++ go/vt/vttablet/tabletserver/query_executor.go | 4 +++ .../tabletserver/query_executor_test.go | 31 +++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/go/vt/vttablet/tabletserver/planbuilder/permission.go b/go/vt/vttablet/tabletserver/planbuilder/permission.go index 593281874ef..3bf2789650b 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/permission.go +++ b/go/vt/vttablet/tabletserver/planbuilder/permission.go @@ -57,6 +57,8 @@ func BuildPermissions(stmt sqlparser.Statement) []Permission { // no op case *sqlparser.Begin, *sqlparser.Commit, *sqlparser.Rollback: // no op + case *sqlparser.Savepoint, *sqlparser.Release, *sqlparser.SRollback: + // no op default: panic(fmt.Errorf("BUG: unexpected statement type: %T", node)) } diff --git a/go/vt/vttablet/tabletserver/planbuilder/plan.go b/go/vt/vttablet/tabletserver/planbuilder/plan.go index 05e66f7d290..7714e36ad64 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/plan.go +++ b/go/vt/vttablet/tabletserver/planbuilder/plan.go @@ -61,6 +61,9 @@ const ( PlanSelectStream // PlanMessageStream is for "stream" statements. PlanMessageStream + PlanSavepoint + PlanRelease + PlanSRollback NumPlans ) @@ -82,6 +85,9 @@ var planName = [NumPlans]string{ "OtherAdmin", "SelectStream", "MessageStream", + "Savepoint", + "Release", + "RollbackSavepoint", } func (pt PlanType) String() string { @@ -180,6 +186,12 @@ func Build(statement sqlparser.Statement, tables map[string]*schema.Table) (*Pla plan, err = &Plan{PlanID: PlanOtherRead}, nil case *sqlparser.OtherAdmin: plan, err = &Plan{PlanID: PlanOtherAdmin}, nil + case *sqlparser.Savepoint: + plan, err = &Plan{PlanID: PlanSavepoint}, nil + case *sqlparser.Release: + plan, err = &Plan{PlanID: PlanRelease}, nil + case *sqlparser.SRollback: + plan, err = &Plan{PlanID: PlanSRollback}, nil default: return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "invalid SQL") } diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index 1a15a330841..9d077d3f454 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -137,6 +137,8 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "%s disallowed outside transaction", qre.plan.PlanID.String()) case planbuilder.PlanSet, planbuilder.PlanOtherRead, planbuilder.PlanOtherAdmin: return qre.execOther() + case planbuilder.PlanSavepoint, planbuilder.PlanRelease, planbuilder.PlanSRollback: + return qre.execOther() case planbuilder.PlanInsert, planbuilder.PlanUpdate, planbuilder.PlanDelete, planbuilder.PlanInsertMessage, planbuilder.PlanDDL: return qre.execAutocommit(qre.txConnExec) case planbuilder.PlanUpdateLimit, planbuilder.PlanDeleteLimit: @@ -200,6 +202,8 @@ func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result return qre.execDMLLimit(conn) case planbuilder.PlanSet, planbuilder.PlanOtherRead, planbuilder.PlanOtherAdmin: return qre.execSQL(conn, qre.query, true) + case planbuilder.PlanSavepoint, planbuilder.PlanRelease, planbuilder.PlanSRollback: + return qre.execSQL(conn, qre.query, true) case planbuilder.PlanSelect, planbuilder.PlanSelectLock, planbuilder.PlanSelectImpossible: maxrows := qre.getSelectLimit() qre.bindVars["#maxLimit"] = sqltypes.Int64BindVariable(maxrows + 1) diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index aaab3f47dcd..5068eddfea2 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -62,6 +62,7 @@ func TestQueryExecutorPlans(t *testing.T) { fields := sqltypes.MakeTestFields("a|b", "int64|varchar") fieldResult := sqltypes.MakeTestResult(fields) selectResult := sqltypes.MakeTestResult(fields, "1|aaa") + emptyResult := &sqltypes.Result{} // The queries are run both in and outside a transaction. testcases := []struct { @@ -208,6 +209,36 @@ func TestQueryExecutorPlans(t *testing.T) { resultWant: dmlResult, planWant: "DDL", logWant: "alter table test_table add zipcode int", + }, { + input: "savepoint a", + dbResponses: []dbResponse{{ + query: "savepoint a", + result: emptyResult, + }}, + resultWant: emptyResult, + planWant: "Savepoint", + logWant: "savepoint a", + inTxWant: "savepoint a", + }, { + input: "ROLLBACK work to SAVEPOINT a", + dbResponses: []dbResponse{{ + query: "ROLLBACK work to SAVEPOINT a", + result: emptyResult, + }}, + resultWant: emptyResult, + planWant: "RollbackSavepoint", + logWant: "ROLLBACK work to SAVEPOINT a", + inTxWant: "ROLLBACK work to SAVEPOINT a", + }, { + input: "RELEASE savepoint a", + dbResponses: []dbResponse{{ + query: "RELEASE savepoint a", + result: emptyResult, + }}, + resultWant: emptyResult, + planWant: "Release", + logWant: "RELEASE savepoint a", + inTxWant: "RELEASE savepoint a", }} for _, tcase := range testcases { func() { From a8cb4366d2fbe337fc2db363da86a808a24676ba Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 2 Jul 2020 22:06:19 +0530 Subject: [PATCH 156/430] savepoint: added savepoint endtoend test Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/framework/client.go | 19 +++ go/vt/vttablet/endtoend/savepoint_test.go | 157 ++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 go/vt/vttablet/endtoend/savepoint_test.go diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index dcd0feda4da..028d1176b88 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -190,6 +190,25 @@ func (client *QueryClient) BeginExecute(query string, bindvars map[string]*query return qr, nil } +// BeginExecuteBatch performs a BeginExecuteBatch. +func (client *QueryClient) BeginExecuteBatch(queries []*querypb.BoundQuery, asTransaction bool) ([]sqltypes.Result, error) { + if client.transactionID != 0 { + return nil, errors.New("already in transaction") + } + qr, transactionID, _, err := client.server.BeginExecuteBatch( + client.ctx, + &client.target, + queries, + asTransaction, + &querypb.ExecuteOptions{IncludedFields: querypb.ExecuteOptions_ALL}, + ) + client.transactionID = transactionID + if err != nil { + return nil, err + } + return qr, nil +} + // ExecuteWithOptions executes a query using 'options'. func (client *QueryClient) ExecuteWithOptions(query string, bindvars map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (*sqltypes.Result, error) { return client.server.Execute( diff --git a/go/vt/vttablet/endtoend/savepoint_test.go b/go/vt/vttablet/endtoend/savepoint_test.go new file mode 100644 index 00000000000..a22a45533bc --- /dev/null +++ b/go/vt/vttablet/endtoend/savepoint_test.go @@ -0,0 +1,157 @@ +/* +Copyright 2020 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package endtoend + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vttablet/endtoend/framework" +) + +func TestSavepointInTransactionWithSRollback(t *testing.T) { + client := framework.NewClient() + defer client.Execute("delete from vitess_test where intval = 5", nil) + + queries := []*querypb.BoundQuery{ + { + Sql: "savepoint a", + BindVariables: nil, + }, + { + Sql: "insert into vitess_test (intval, floatval, charval, binval) values (5, null, null, null)", + BindVariables: nil, + }, + } + _, err := client.BeginExecuteBatch(queries, false) + require.NoError(t, err) + + qr, err := client.Execute("select intval from vitess_test where intval = 5", nil) + require.NoError(t, err) + require.Equal(t, "[[INT32(5)]]", fmt.Sprintf("%v", qr.Rows)) + + _, err = client.Execute("rollback to a", nil) + require.NoError(t, err) + + err = client.Commit() + require.NoError(t, err) + + qr, err = client.Execute("select intval from vitess_test where intval = 5", nil) + require.NoError(t, err) + require.Empty(t, qr.Rows) +} + +func TestSavepointInTransactionWithRelease(t *testing.T) { + client := framework.NewClient() + + vstart := framework.DebugVars() + + queries := []*querypb.BoundQuery{ + { + Sql: "savepoint a", + BindVariables: nil, + }, + { + Sql: "insert into vitess_test (intval, floatval, charval, binval) values (5, null, null, null)", + BindVariables: nil, + }, + } + _, err := client.BeginExecuteBatch(queries, false) + require.NoError(t, err) + + qr, err := client.Execute("select intval from vitess_test where intval in (5, 6)", nil) + require.NoError(t, err) + require.Equal(t, "[[INT32(5)]]", fmt.Sprintf("%v", qr.Rows)) + + _, err = client.Execute("savepoint b", nil) + require.NoError(t, err) + + _, err = client.Execute("insert into vitess_test (intval, floatval, charval, binval) values (6, null, null, null)", nil) + require.NoError(t, err) + + qr, err = client.Execute("select intval from vitess_test where intval in (5, 6)", nil) + require.NoError(t, err) + require.Equal(t, "[[INT32(5)] [INT32(6)]]", fmt.Sprintf("%v", qr.Rows)) + + _, err = client.Execute("release savepoint b", nil) + require.NoError(t, err) + + // After release savepoint does not exists + _, err = client.Execute("rollback to b", nil) + require.Error(t, err) + + qr, err = client.Execute("select intval from vitess_test where intval in (5, 6)", nil) + require.NoError(t, err) + require.Equal(t, "[[INT32(5)] [INT32(6)]]", fmt.Sprintf("%v", qr.Rows)) + + _, err = client.Execute("rollback to a", nil) + require.NoError(t, err) + + err = client.Commit() + require.NoError(t, err) + + qr, err = client.Execute("select intval from vitess_test where intval in (5, 6)", nil) + require.NoError(t, err) + require.Empty(t, qr.Rows) + + vend := framework.DebugVars() + + expectedDiffs := []struct { + tag string + diff int + }{{ + tag: "Queries/Histograms/Savepoint/Count", + diff: 2, + }, { + tag: "Queries/Histograms/Release/Count", + diff: 1, + }, { + tag: "Queries/Histograms/RollbackSavepoint/Count", + diff: 2, + }} + for _, expected := range expectedDiffs { + compareIntDiff(t, vend, expected.tag, vstart, expected.diff) + } +} + +func TestSavepointWithoutTransaction(t *testing.T) { + client := framework.NewClient() + defer client.Execute("delete from vitess_test where intval = 6", nil) + + _, err := client.Execute("savepoint a", nil) + require.NoError(t, err) + + _, err = client.Execute("insert into vitess_test (intval, floatval, charval, binval) values (6, null, null, null)", nil) + require.NoError(t, err) + + _, err = client.Execute("savepoint b", nil) + require.NoError(t, err) + + qr, err := client.Execute("select intval from vitess_test where intval = 6", nil) + require.NoError(t, err) + require.Equal(t, "[[INT32(6)]]", fmt.Sprintf("%v", qr.Rows)) + + // Without transaction there is no savepoint. + _, err = client.Execute("release savepoint a", nil) + require.Error(t, err) + + // Without transaction there is no savepoint. + _, err = client.Execute("rollback to a", nil) + require.Error(t, err) +} From 1acb6e0ad79522ffe7867b33524b5d190b92ead5 Mon Sep 17 00:00:00 2001 From: deepthi Date: Sun, 28 Jun 2020 18:55:34 -0700 Subject: [PATCH 157/430] rename and deprecate RPCs, rename vars and files Signed-off-by: deepthi --- config/mycnf/default.cnf | 1 - go/cmd/vtbackup/vtbackup.go | 20 +- go/mysql/binlog_event.go | 2 +- go/mysql/binlog_event_make.go | 2 +- go/mysql/endtoend/client_test.go | 8 +- go/mysql/flavor.go | 93 +- go/mysql/flavor_filepos.go | 34 +- go/mysql/flavor_filepos_test.go | 8 +- go/mysql/flavor_mariadb.go | 50 +- go/mysql/flavor_mariadb_test.go | 10 +- go/mysql/flavor_mysql.go | 42 +- go/mysql/flavor_mysql_test.go | 12 +- go/mysql/replication_constants.go | 2 +- ...{slave_status.go => replication_status.go} | 38 +- ...tus_test.go => replication_status_test.go} | 44 +- .../transform/backup_transform_utils.go | 4 +- .../backup/vtbackup/backup_only_test.go | 14 +- .../reparent/reparent_range_based_test.go | 2 +- go/test/endtoend/reparent/reparent_test.go | 30 +- .../tabletgateway/buffer/buffer_test.go | 4 +- .../tabletmanager/lock_unlock_test.go | 14 +- go/test/endtoend/tabletmanager/main_test.go | 12 +- .../tabletmanager/tablet_health_test.go | 8 +- go/test/endtoend/vtgate/buffer/buffer_test.go | 6 +- ...ave_connection.go => binlog_connection.go} | 66 +- go/vt/binlog/binlog_streamer.go | 6 +- .../legacy_tablet_stats_cache_test.go | 4 +- go/vt/health/health.go | 22 +- go/vt/health/health_test.go | 8 +- go/vt/mysqlctl/backup.go | 6 +- go/vt/mysqlctl/builtinbackupengine.go | 46 +- .../fakemysqldaemon/fakemysqldaemon.go | 112 +- go/vt/mysqlctl/mycnf.go | 5 - go/vt/mysqlctl/mycnf_gen.go | 1 - go/vt/mysqlctl/mysql_daemon.go | 20 +- go/vt/mysqlctl/reparent.go | 2 +- go/vt/mysqlctl/replication.go | 92 +- go/vt/mysqlctl/rice-box.go | 82 +- go/vt/mysqlctl/tmutils/permissions.go | 2 +- go/vt/mysqlctl/xtrabackupengine.go | 2 +- go/vt/proto/query/query.pb.go | 4 +- .../replicationdata/replicationdata.pb.go | 121 +- .../tabletmanagerdata/tabletmanagerdata.pb.go | 1759 ++++++++++++----- .../tabletmanagerservice.pb.go | 764 +++++-- go/vt/proto/throttlerdata/throttlerdata.pb.go | 6 +- go/vt/proto/topodata/topodata.pb.go | 2 +- go/vt/schemamanager/schemamanager.go | 2 +- go/vt/schemamanager/schemamanager_test.go | 10 +- go/vt/schemamanager/tablet_executor.go | 10 +- go/vt/schemamanager/tablet_executor_test.go | 8 +- go/vt/throttler/max_replication_lag_module.go | 44 +- .../max_replication_lag_module_config.go | 2 +- .../max_replication_lag_module_test.go | 4 +- go/vt/throttler/result.go | 14 +- go/vt/throttler/result_test.go | 126 +- go/vt/throttler/throttlerlogz.go | 8 +- go/vt/topo/helpers/copy_test.go | 11 +- go/vt/topo/tablet.go | 10 +- go/vt/topo/topoproto/tablet.go | 15 +- go/vt/topotools/utils.go | 10 +- go/vt/vtcombo/tablet_map.go | 56 +- go/vt/vtctl/reparent.go | 12 +- go/vt/vtctl/vtctl.go | 57 +- go/vt/vtctld/api.go | 10 +- go/vt/vtctld/rice-box.go | 54 +- go/vt/vttablet/faketmclient/fake_client.go | 113 +- go/vt/vttablet/grpctmclient/client.go | 184 +- go/vt/vttablet/grpctmserver/server.go | 158 +- go/vt/vttablet/heartbeat/heartbeat.go | 4 +- go/vt/vttablet/heartbeat/reader.go | 2 +- go/vt/vttablet/heartbeat/writer.go | 6 +- go/vt/vttablet/tabletmanager/healthcheck.go | 10 +- .../tabletmanager/healthcheck_test.go | 12 +- .../tabletmanager/heartbeat_reporter.go | 4 +- .../tabletmanager/replication_reporter.go | 36 +- .../replication_reporter_test.go | 22 +- go/vt/vttablet/tabletmanager/restore.go | 12 +- go/vt/vttablet/tabletmanager/rpc_agent.go | 37 +- .../vttablet/tabletmanager/rpc_replication.go | 181 +- go/vt/vttablet/tabletmanager/tm_init.go | 32 +- .../tabletserver/vstreamer/vstreamer.go | 2 +- go/vt/vttablet/tmclient/rpc_client_api.go | 67 +- go/vt/vttablet/tmrpctest/test_tm_rpc.go | 226 ++- go/vt/worker/legacy_split_clone.go | 6 +- go/vt/worker/multi_split_diff.go | 28 +- go/vt/worker/split_clone.go | 6 +- go/vt/worker/split_diff.go | 22 +- go/vt/worker/topo_utils.go | 4 +- go/vt/worker/vertical_split_diff.go | 22 +- .../mock_resharding_wrangler_test.go | 8 +- .../resharding/resharding_wrangler.go | 2 +- go/vt/workflow/resharding/tasks.go | 2 +- go/vt/workflow/resharding/workflow_test.go | 4 +- go/vt/wrangler/cleaner.go | 22 +- go/vt/wrangler/keyspace.go | 2 +- go/vt/wrangler/permissions.go | 4 +- go/vt/wrangler/reparent.go | 88 +- go/vt/wrangler/schema.go | 26 +- go/vt/wrangler/tablet.go | 8 +- go/vt/wrangler/testlib/backup_test.go | 4 +- .../testlib/external_reparent_test.go | 40 +- go/vt/wrangler/testlib/find_tablet_test.go | 16 +- .../testlib/init_shard_master_test.go | 86 +- .../testlib/planned_reparent_shard_test.go | 20 +- go/vt/wrangler/testlib/reparent_utils_test.go | 38 +- go/vt/wrangler/testlib/semi_sync_test.go | 2 +- go/vt/wrangler/testlib/shard_test.go | 10 +- go/vt/wrangler/testlib/version_test.go | 2 +- go/vt/wrangler/validator.go | 28 +- go/vt/wrangler/version.go | 8 +- proto/query.proto | 4 +- proto/replicationdata.proto | 16 +- proto/tabletmanagerdata.proto | 124 +- proto/tabletmanagerservice.proto | 65 +- proto/throttlerdata.proto | 6 +- proto/topodata.proto | 2 +- 116 files changed, 3805 insertions(+), 2083 deletions(-) rename go/mysql/{slave_status.go => replication_status.go} (77%) rename go/mysql/{slave_status_test.go => replication_status_test.go} (64%) rename go/vt/binlog/{slave_connection.go => binlog_connection.go} (78%) diff --git a/config/mycnf/default.cnf b/config/mycnf/default.cnf index 14d1feaa12f..8facbbe0343 100644 --- a/config/mycnf/default.cnf +++ b/config/mycnf/default.cnf @@ -19,7 +19,6 @@ server-id = {{.ServerID}} # additional configuration (like enabling semi-sync) before we connect to # the master. skip_slave_start -slave_load_tmpdir = {{.SlaveLoadTmpDir}} socket = {{.SocketFile}} tmpdir = {{.TmpDir}} diff --git a/go/cmd/vtbackup/vtbackup.go b/go/cmd/vtbackup/vtbackup.go index 08f71852cd6..5cb4d5be52c 100644 --- a/go/cmd/vtbackup/vtbackup.go +++ b/go/cmd/vtbackup/vtbackup.go @@ -322,7 +322,7 @@ func takeBackup(ctx context.Context, topoServer *topo.Server, backupStorage back // Get the current master replication position, and wait until we catch up // to that point. We do this instead of looking at Seconds_Behind_Master - // (replication lag reported by SHOW SLAVE STATUS) because that value can + // because that value can // sometimes lie and tell you there's 0 lag when actually replication is // stopped. Also, if replication is making progress but is too slow to ever // catch up to live changes, we'd rather take a backup of something rather @@ -360,7 +360,7 @@ func takeBackup(ctx context.Context, topoServer *topo.Server, backupStorage back case <-time.After(time.Second): } - status, statusErr := mysqld.SlaveStatus() + status, statusErr := mysqld.ReplicationStatus() if statusErr != nil { log.Warningf("Error getting replication status: %v", statusErr) continue @@ -371,7 +371,7 @@ func takeBackup(ctx context.Context, topoServer *topo.Server, backupStorage back log.Infof("Replication caught up to %v after %v", status.Position, time.Since(waitStartTime)) break } - if !status.SlaveRunning() { + if !status.ReplicationRunning() { log.Warning("Replication has stopped before backup could be taken. Trying to restart replication.") if err := startReplication(ctx, mysqld, topoServer); err != nil { log.Warningf("Failed to restart replication: %v", err) @@ -380,12 +380,12 @@ func takeBackup(ctx context.Context, topoServer *topo.Server, backupStorage back } // Stop replication and see where we are. - if err := mysqld.StopSlave(nil); err != nil { + if err := mysqld.StopReplication(nil); err != nil { return fmt.Errorf("can't stop replication: %v", err) } // Did we make any progress? - status, err := mysqld.SlaveStatus() + status, err := mysqld.ReplicationStatus() if err != nil { return fmt.Errorf("can't get replication status: %v", err) } @@ -414,14 +414,14 @@ func resetReplication(ctx context.Context, pos mysql.Position, mysqld mysqlctl.M "RESET SLAVE ALL", // "ALL" makes it forget master host:port. } if err := mysqld.ExecuteSuperQueryList(ctx, cmds); err != nil { - return vterrors.Wrap(err, "failed to reset slave") + return vterrors.Wrap(err, "failed to reset replication") } // Check if we have a position to resume from, if not reset to the beginning of time if !pos.IsZero() { // Set the position at which to resume from the master. - if err := mysqld.SetSlavePosition(ctx, pos); err != nil { - return vterrors.Wrap(err, "failed to set slave position") + if err := mysqld.SetReplicationPosition(ctx, pos); err != nil { + return vterrors.Wrap(err, "failed to set replica position") } } else { if err := mysqld.ResetReplication(ctx); err != nil { @@ -448,8 +448,8 @@ func startReplication(ctx context.Context, mysqld mysqlctl.MysqlDaemon, topoServ return vterrors.Wrapf(err, "Cannot read master tablet %v", si.MasterAlias) } - // Stop slave (in case we're restarting), set master, and start slave. - if err := mysqld.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), true /* slaveStopBefore */, true /* slaveStartAfter */); err != nil { + // Stop replication (in case we're restarting), set master, and start replication. + if err := mysqld.SetMaster(ctx, ti.Tablet.MysqlHostname, int(ti.Tablet.MysqlPort), true /* stopReplicationBefore */, true /* startReplicationAfter */); err != nil { return vterrors.Wrap(err, "MysqlDaemon.SetMaster failed") } return nil diff --git a/go/mysql/binlog_event.go b/go/mysql/binlog_event.go index 014fbc3a62e..7a6d489879d 100644 --- a/go/mysql/binlog_event.go +++ b/go/mysql/binlog_event.go @@ -25,7 +25,7 @@ import ( // BinlogEvent represents a single event from a raw MySQL binlog dump stream. // The implementation is provided by each supported flavor in go/vt/mysqlctl. // -// binlog.Streamer receives these events through a mysqlctl.SlaveConnection and +// binlog.Streamer receives these events through a mysqlctl.BinlogConnection and // processes them, grouping statements into BinlogTransactions as appropriate. // // Methods that only access header fields can't fail as long as IsValid() diff --git a/go/mysql/binlog_event_make.go b/go/mysql/binlog_event_make.go index 3df5f3fb59d..0b0af205d19 100644 --- a/go/mysql/binlog_event_make.go +++ b/go/mysql/binlog_event_make.go @@ -172,7 +172,7 @@ func NewQueryEvent(f BinlogFormat, s *FakeBinlogStream, q Query) BinlogEvent { if q.Charset != nil { statusVarLength += 1 + 2 + 2 + 2 } - length := 4 + // slave proxy id + length := 4 + // proxy id 4 + // execution time 1 + // schema length 2 + // error code diff --git a/go/mysql/endtoend/client_test.go b/go/mysql/endtoend/client_test.go index 9a734284b8c..00b79f51c1c 100644 --- a/go/mysql/endtoend/client_test.go +++ b/go/mysql/endtoend/client_test.go @@ -303,7 +303,7 @@ func TestTLS(t *testing.T) { } } -func TestSlaveStatus(t *testing.T) { +func TestReplicationStatus(t *testing.T) { params := connParams ctx := context.Background() conn, err := mysql.Connect(ctx, ¶ms) @@ -312,8 +312,8 @@ func TestSlaveStatus(t *testing.T) { } defer conn.Close() - status, err := conn.ShowSlaveStatus() - if err != mysql.ErrNotSlave { - t.Errorf("Got unexpected result for ShowSlaveStatus: %v %v", status, err) + status, err := conn.ShowReplicationStatus() + if err != mysql.ErrNotReplica { + t.Errorf("Got unexpected result for ShowReplicationStatus: %v %v", status, err) } } diff --git a/go/mysql/flavor.go b/go/mysql/flavor.go index ce691356ee2..c18ec95a97d 100644 --- a/go/mysql/flavor.go +++ b/go/mysql/flavor.go @@ -29,9 +29,9 @@ import ( ) var ( - // ErrNotSlave means there is no slave status. - // Returned by ShowSlaveStatus(). - ErrNotSlave = errors.New("no slave status") + // ErrNotReplica means there is no replication status. + // Returned by ShowReplicationStatus(). + ErrNotReplica = errors.New("no slave status") ) const ( @@ -52,22 +52,22 @@ type flavor interface { // masterGTIDSet returns the current GTIDSet of a server. masterGTIDSet(c *Conn) (GTIDSet, error) - // startSlave returns the command to start the slave. - startSlaveCommand() string + // startReplicationCommand returns the command to start the replication. + startReplicationCommand() string - // restartSlave returns the commands to stop, reset and start the slave. - restartSlaveCommands() []string + // restartReplicationCommands returns the commands to stop, reset and start the replication. + restartReplicationCommands() []string - // startSlaveUntilAfter will restart replication, but only allow it + // startReplicationUntilAfter will restart replication, but only allow it // to run until `pos` is reached. After reaching pos, replication will be stopped again - startSlaveUntilAfter(pos Position) string + startReplicationUntilAfter(pos Position) string - // stopSlave returns the command to stop the slave. - stopSlaveCommand() string + // stopReplicationCommand returns the command to stop the replication. + stopReplicationCommand() string // sendBinlogDumpCommand sends the packet required to start // dumping binlogs from the specified location. - sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Position) error + sendBinlogDumpCommand(c *Conn, serverID uint32, startPos Position) error // readBinlogEvent reads the next BinlogEvent from the connection. readBinlogEvent(c *Conn) (BinlogEvent, error) @@ -76,17 +76,17 @@ type flavor interface { // replication on the host. resetReplicationCommands(c *Conn) []string - // setSlavePositionCommands returns the commands to set the - // replication position at which the slave will resume. - setSlavePositionCommands(pos Position) []string + // setReplicationPositionCommands returns the commands to set the + // replication position at which the replica will resume. + setReplicationPositionCommands(pos Position) []string // changeMasterArg returns the specific parameter to add to // a change master command. changeMasterArg() string - // status returns the result of 'SHOW SLAVE STATUS', + // status returns the result of the appropriate status command, // with parsed replication position. - status(c *Conn) (SlaveStatus, error) + status(c *Conn) (ReplicationStatus, error) // waitUntilPositionCommand returns the SQL command to issue // to wait until the given position, until the context @@ -163,31 +163,31 @@ func (c *Conn) MasterPosition() (Position, error) { }, nil } -// StartSlaveCommand returns the command to start the slave. -func (c *Conn) StartSlaveCommand() string { - return c.flavor.startSlaveCommand() +// StartReplicationCommand returns the command to start the replication. +func (c *Conn) StartReplicationCommand() string { + return c.flavor.startReplicationCommand() } -// RestartSlaveCommands returns the commands to stop, reset and start the slave. -func (c *Conn) RestartSlaveCommands() []string { - return c.flavor.restartSlaveCommands() +// RestartReplicationCommands returns the commands to stop, reset and start the replication. +func (c *Conn) RestartReplicationCommands() []string { + return c.flavor.restartReplicationCommands() } -// StartSlaveUntilAfterCommand returns the command to start the slave. -func (c *Conn) StartSlaveUntilAfterCommand(pos Position) string { - return c.flavor.startSlaveUntilAfter(pos) +// StartReplicationUntilAfterCommand returns the command to start the replication. +func (c *Conn) StartReplicationUntilAfterCommand(pos Position) string { + return c.flavor.startReplicationUntilAfter(pos) } -// StopSlaveCommand returns the command to stop the slave. -func (c *Conn) StopSlaveCommand() string { - return c.flavor.stopSlaveCommand() +// StopReplicationCommand returns the command to stop the replication. +func (c *Conn) StopReplicationCommand() string { + return c.flavor.stopReplicationCommand() } // SendBinlogDumpCommand sends the flavor-specific version of // the COM_BINLOG_DUMP command to start dumping raw binlog -// events over a slave connection, starting at a given GTID. -func (c *Conn) SendBinlogDumpCommand(slaveID uint32, startPos Position) error { - return c.flavor.sendBinlogDumpCommand(c, slaveID, startPos) +// events over a server connection, starting at a given GTID. +func (c *Conn) SendBinlogDumpCommand(serverID uint32, startPos Position) error { + return c.flavor.sendBinlogDumpCommand(c, serverID, startPos) } // ReadBinlogEvent reads the next BinlogEvent. This must be used @@ -202,11 +202,11 @@ func (c *Conn) ResetReplicationCommands() []string { return c.flavor.resetReplicationCommands(c) } -// SetSlavePositionCommands returns the commands to set the -// replication position at which the slave will resume +// SetReplicationPositionCommands returns the commands to set the +// replication position at which the replica will resume // when it is later reparented with SetMasterCommands. -func (c *Conn) SetSlavePositionCommands(pos Position) []string { - return c.flavor.setSlavePositionCommands(pos) +func (c *Conn) SetReplicationPositionCommands(pos Position) []string { + return c.flavor.setReplicationPositionCommands(pos) } // SetMasterCommand returns the command to use the provided master @@ -240,7 +240,7 @@ func (c *Conn) SetMasterCommand(params *ConnParams, masterHost string, masterPor return "CHANGE MASTER TO\n " + strings.Join(args, ",\n ") } -// resultToMap is a helper function used by ShowSlaveStatus. +// resultToMap is a helper function used by ShowReplicationStatus. func resultToMap(qr *sqltypes.Result) (map[string]string, error) { if len(qr.Rows) == 0 { // The query succeeded, but there is no data. @@ -260,12 +260,13 @@ func resultToMap(qr *sqltypes.Result) (map[string]string, error) { return result, nil } -// parseSlaveStatus parses the common fields of SHOW SLAVE STATUS. -func parseSlaveStatus(fields map[string]string) SlaveStatus { - status := SlaveStatus{ - MasterHost: fields["Master_Host"], - SlaveIORunning: fields["Slave_IO_Running"] == "Yes", - SlaveSQLRunning: fields["Slave_SQL_Running"] == "Yes", +// parseReplicationStatus parses the common (non-flavor-specific) fields of ReplicationStatus +func parseReplicationStatus(fields map[string]string) ReplicationStatus { + status := ReplicationStatus{ + MasterHost: fields["Master_Host"], + // These fields are returned from the underlying DB and cannot be renamed + IOThreadRunning: fields["Slave_IO_Running"] == "Yes", + SQLThreadRunning: fields["Slave_SQL_Running"] == "Yes", } parseInt, _ := strconv.ParseInt(fields["Master_Port"], 10, 0) status.MasterPort = int(parseInt) @@ -302,9 +303,9 @@ func parseSlaveStatus(fields map[string]string) SlaveStatus { return status } -// ShowSlaveStatus executes the right SHOW SLAVE STATUS command, -// and returns a parse Position with other fields. -func (c *Conn) ShowSlaveStatus() (SlaveStatus, error) { +// ShowReplicationStatus executes the right command to fetch replication status, +// and returns a parsed Position with other fields. +func (c *Conn) ShowReplicationStatus() (ReplicationStatus, error) { return c.flavor.status(c) } diff --git a/go/mysql/flavor_filepos.go b/go/mysql/flavor_filepos.go index f697e81e459..9775d23d85c 100644 --- a/go/mysql/flavor_filepos.go +++ b/go/mysql/flavor_filepos.go @@ -63,27 +63,27 @@ func (flv *filePosFlavor) masterGTIDSet(c *Conn) (GTIDSet, error) { }, nil } -func (flv *filePosFlavor) startSlaveCommand() string { +func (flv *filePosFlavor) startReplicationCommand() string { return "unsupported" } -func (flv *filePosFlavor) restartSlaveCommands() []string { +func (flv *filePosFlavor) restartReplicationCommands() []string { return []string{"unsupported"} } -func (flv *filePosFlavor) stopSlaveCommand() string { +func (flv *filePosFlavor) stopReplicationCommand() string { return "unsupported" } // sendBinlogDumpCommand is part of the Flavor interface. -func (flv *filePosFlavor) sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Position) error { +func (flv *filePosFlavor) sendBinlogDumpCommand(c *Conn, serverID uint32, startPos Position) error { rpos, ok := startPos.GTIDSet.(filePosGTID) if !ok { return fmt.Errorf("startPos.GTIDSet is wrong type - expected filePosGTID, got: %#v", startPos.GTIDSet) } flv.file = rpos.file - return c.WriteComBinlogDump(slaveID, rpos.file, uint32(rpos.pos), 0) + return c.WriteComBinlogDump(serverID, rpos.file, uint32(rpos.pos), 0) } // readBinlogEvent is part of the Flavor interface. @@ -168,40 +168,40 @@ func (flv *filePosFlavor) resetReplicationCommands(c *Conn) []string { } } -// setSlavePositionCommands is part of the Flavor interface. -func (flv *filePosFlavor) setSlavePositionCommands(pos Position) []string { +// setReplicationPositionCommands is part of the Flavor interface. +func (flv *filePosFlavor) setReplicationPositionCommands(pos Position) []string { return []string{ "unsupported", } } -// setSlavePositionCommands is part of the Flavor interface. +// setReplicationPositionCommands is part of the Flavor interface. func (flv *filePosFlavor) changeMasterArg() string { return "unsupported" } // status is part of the Flavor interface. -func (flv *filePosFlavor) status(c *Conn) (SlaveStatus, error) { +func (flv *filePosFlavor) status(c *Conn) (ReplicationStatus, error) { qr, err := c.ExecuteFetch("SHOW SLAVE STATUS", 100, true /* wantfields */) if err != nil { - return SlaveStatus{}, err + return ReplicationStatus{}, err } if len(qr.Rows) == 0 { // The query returned no data, meaning the server - // is not configured as a slave. - return SlaveStatus{}, ErrNotSlave + // is not configured as a replica. + return ReplicationStatus{}, ErrNotReplica } resultMap, err := resultToMap(qr) if err != nil { - return SlaveStatus{}, err + return ReplicationStatus{}, err } - return parseFilePosSlaveStatus(resultMap) + return parseFilePosReplicationStatus(resultMap) } -func parseFilePosSlaveStatus(resultMap map[string]string) (SlaveStatus, error) { - status := parseSlaveStatus(resultMap) +func parseFilePosReplicationStatus(resultMap map[string]string) (ReplicationStatus, error) { + status := parseReplicationStatus(resultMap) status.Position = status.FilePosition status.RelayLogPosition = status.FileRelayLogPosition @@ -227,7 +227,7 @@ func (flv *filePosFlavor) waitUntilPositionCommand(ctx context.Context, pos Posi return fmt.Sprintf("SELECT MASTER_POS_WAIT('%s', %d)", filePosPos.file, filePosPos.pos), nil } -func (*filePosFlavor) startSlaveUntilAfter(pos Position) string { +func (*filePosFlavor) startReplicationUntilAfter(pos Position) string { return "unsupported" } diff --git a/go/mysql/flavor_filepos_test.go b/go/mysql/flavor_filepos_test.go index 5f79be357da..b943d21efb9 100644 --- a/go/mysql/flavor_filepos_test.go +++ b/go/mysql/flavor_filepos_test.go @@ -28,8 +28,8 @@ func TestFilePosRetrieveMasterServerId(t *testing.T) { "Master_Server_Id": "1", } - want := SlaveStatus{MasterServerID: 1} - got, err := parseFilePosSlaveStatus(resultMap) + want := ReplicationStatus{MasterServerID: 1} + got, err := parseFilePosReplicationStatus(resultMap) require.NoError(t, err) assert.Equalf(t, got.MasterServerID, want.MasterServerID, "got MasterServerID: %v; want MasterServerID: %v", got.MasterServerID, want.MasterServerID) } @@ -42,13 +42,13 @@ func TestFilePosRetrieveExecutedPosition(t *testing.T) { "Master_Log_File": "master-bin.000003", } - want := SlaveStatus{ + want := ReplicationStatus{ Position: Position{GTIDSet: filePosGTID{file: "master-bin.000002", pos: 1307}}, RelayLogPosition: Position{GTIDSet: filePosGTID{file: "master-bin.000003", pos: 1308}}, FilePosition: Position{GTIDSet: filePosGTID{file: "master-bin.000002", pos: 1307}}, FileRelayLogPosition: Position{GTIDSet: filePosGTID{file: "master-bin.000003", pos: 1308}}, } - got, err := parseFilePosSlaveStatus(resultMap) + got, err := parseFilePosReplicationStatus(resultMap) require.NoError(t, err) assert.Equalf(t, got.Position.GTIDSet, want.Position.GTIDSet, "got Position: %v; want Position: %v", got.Position.GTIDSet, want.Position.GTIDSet) assert.Equalf(t, got.RelayLogPosition.GTIDSet, want.RelayLogPosition.GTIDSet, "got RelayLogPosition: %v; want RelayLogPosition: %v", got.RelayLogPosition.GTIDSet, want.RelayLogPosition.GTIDSet) diff --git a/go/mysql/flavor_mariadb.go b/go/mysql/flavor_mariadb.go index b99c1d4031f..52f5f4df7ce 100644 --- a/go/mysql/flavor_mariadb.go +++ b/go/mysql/flavor_mariadb.go @@ -43,15 +43,15 @@ func (mariadbFlavor) masterGTIDSet(c *Conn) (GTIDSet, error) { return parseMariadbGTIDSet(qr.Rows[0][0].ToString()) } -func (mariadbFlavor) startSlaveUntilAfter(pos Position) string { +func (mariadbFlavor) startReplicationUntilAfter(pos Position) string { return fmt.Sprintf("START SLAVE UNTIL master_gtid_pos = \"%s\"", pos) } -func (mariadbFlavor) startSlaveCommand() string { +func (mariadbFlavor) startReplicationCommand() string { return "START SLAVE" } -func (mariadbFlavor) restartSlaveCommands() []string { +func (mariadbFlavor) restartReplicationCommands() []string { return []string{ "STOP SLAVE", "RESET SLAVE", @@ -59,14 +59,14 @@ func (mariadbFlavor) restartSlaveCommands() []string { } } -func (mariadbFlavor) stopSlaveCommand() string { +func (mariadbFlavor) stopReplicationCommand() string { return "STOP SLAVE" } // sendBinlogDumpCommand is part of the Flavor interface. -func (mariadbFlavor) sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Position) error { - // Tell the server that we understand GTIDs by setting our slave - // capability to MARIA_SLAVE_CAPABILITY_GTID = 4 (MariaDB >= 10.0.1). +func (mariadbFlavor) sendBinlogDumpCommand(c *Conn, serverID uint32, startPos Position) error { + // Tell the server that we understand GTIDs by setting + // mariadb_slave_capability to MARIA_SLAVE_CAPABILITY_GTID = 4 (MariaDB >= 10.0.1). if _, err := c.ExecuteFetch("SET @mariadb_slave_capability=4", 0, false); err != nil { return vterrors.Wrapf(err, "failed to set @mariadb_slave_capability=4") } @@ -78,7 +78,7 @@ func (mariadbFlavor) sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Pos return vterrors.Wrapf(err, "failed to set @slave_connect_state='%s'", startPos) } - // Real slaves set this upon connecting if their gtid_strict_mode option + // Real replicas set this upon connecting if their gtid_strict_mode option // was enabled. We always use gtid_strict_mode because we need it to // make our internal GTID comparisons safe. if _, err := c.ExecuteFetch("SET @slave_gtid_strict_mode=1", 0, false); err != nil { @@ -87,7 +87,7 @@ func (mariadbFlavor) sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Pos // Since we use @slave_connect_state, the file and position here are // ignored. - return c.WriteComBinlogDump(slaveID, "", 0, 0) + return c.WriteComBinlogDump(serverID, "", 0, 0) } // resetReplicationCommands is part of the Flavor interface. @@ -99,13 +99,13 @@ func (mariadbFlavor) resetReplicationCommands(c *Conn) []string { "SET GLOBAL gtid_slave_pos = ''", } if c.SemiSyncExtensionLoaded() { - resetCommands = append(resetCommands, "SET GLOBAL rpl_semi_sync_master_enabled = false, GLOBAL rpl_semi_sync_slave_enabled = false") // semi-sync will be enabled if needed when slave is started. + resetCommands = append(resetCommands, "SET GLOBAL rpl_semi_sync_master_enabled = false, GLOBAL rpl_semi_sync_slave_enabled = false") // semi-sync will be enabled if needed when replica is started. } return resetCommands } -// setSlavePositionCommands is part of the Flavor interface. -func (mariadbFlavor) setSlavePositionCommands(pos Position) []string { +// setReplicationPositionCommands is part of the Flavor interface. +func (mariadbFlavor) setReplicationPositionCommands(pos Position) []string { return []string{ // RESET MASTER will clear out gtid_binlog_pos, // which then guarantees that gtid_current_pos = gtid_slave_pos, @@ -113,12 +113,12 @@ func (mariadbFlavor) setSlavePositionCommands(pos Position) []string { // This also emptys the binlogs, which allows us to set // gtid_binlog_state. "RESET MASTER", - // Set gtid_slave_pos to tell the slave where to start + // Set gtid_slave_pos to tell the replica where to start // replicating. fmt.Sprintf("SET GLOBAL gtid_slave_pos = '%s'", pos), // Set gtid_binlog_state so that if this server later becomes a // master, it will know that it has seen everything up to and - // including 'pos'. Otherwise, if another slave asks this + // including 'pos'. Otherwise, if another replica asks this // server to replicate starting at exactly 'pos', this server // will throw an error when in gtid_strict_mode, since it // doesn't see 'pos' in its binlog - it only has everything @@ -127,38 +127,38 @@ func (mariadbFlavor) setSlavePositionCommands(pos Position) []string { } } -// setSlavePositionCommands is part of the Flavor interface. +// setReplicationPositionCommands is part of the Flavor interface. func (mariadbFlavor) changeMasterArg() string { return "MASTER_USE_GTID = current_pos" } // status is part of the Flavor interface. -func (mariadbFlavor) status(c *Conn) (SlaveStatus, error) { +func (mariadbFlavor) status(c *Conn) (ReplicationStatus, error) { qr, err := c.ExecuteFetch("SHOW ALL SLAVES STATUS", 100, true /* wantfields */) if err != nil { - return SlaveStatus{}, err + return ReplicationStatus{}, err } if len(qr.Rows) == 0 { // The query returned no data, meaning the server - // is not configured as a slave. - return SlaveStatus{}, ErrNotSlave + // is not configured as a replica. + return ReplicationStatus{}, ErrNotReplica } resultMap, err := resultToMap(qr) if err != nil { - return SlaveStatus{}, err + return ReplicationStatus{}, err } - return parseMariadbSlaveStatus(resultMap) + return parseMariadbReplicationStatus(resultMap) } -func parseMariadbSlaveStatus(resultMap map[string]string) (SlaveStatus, error) { - status := parseSlaveStatus(resultMap) +func parseMariadbReplicationStatus(resultMap map[string]string) (ReplicationStatus, error) { + status := parseReplicationStatus(resultMap) var err error status.Position.GTIDSet, err = parseMariadbGTIDSet(resultMap["Gtid_Slave_Pos"]) if err != nil { - return SlaveStatus{}, vterrors.Wrapf(err, "SlaveStatus can't parse MariaDB GTID (Gtid_Slave_Pos: %#v)", resultMap["Gtid_Slave_Pos"]) + return ReplicationStatus{}, vterrors.Wrapf(err, "ReplicationStatus can't parse MariaDB GTID (Gtid_Slave_Pos: %#v)", resultMap["Gtid_Slave_Pos"]) } return status, nil @@ -167,7 +167,7 @@ func parseMariadbSlaveStatus(resultMap map[string]string) (SlaveStatus, error) { // waitUntilPositionCommand is part of the Flavor interface. // // Note: Unlike MASTER_POS_WAIT(), MASTER_GTID_WAIT() will continue waiting even -// if the slave thread stops. If that is a problem, we'll have to change this. +// if the sql thread stops. If that is a problem, we'll have to change this. func (mariadbFlavor) waitUntilPositionCommand(ctx context.Context, pos Position) (string, error) { if deadline, ok := ctx.Deadline(); ok { timeout := time.Until(deadline) diff --git a/go/mysql/flavor_mariadb_test.go b/go/mysql/flavor_mariadb_test.go index a4fd10fd3ff..120cde37583 100644 --- a/go/mysql/flavor_mariadb_test.go +++ b/go/mysql/flavor_mariadb_test.go @@ -86,8 +86,8 @@ func TestMariadbRetrieveMasterServerId(t *testing.T) { "Gtid_Slave_Pos": "0-101-2320", } - want := SlaveStatus{MasterServerID: 1} - got, err := parseMariadbSlaveStatus(resultMap) + want := ReplicationStatus{MasterServerID: 1} + got, err := parseMariadbReplicationStatus(resultMap) require.NoError(t, err) assert.Equal(t, got.MasterServerID, want.MasterServerID, fmt.Sprintf("got MasterServerID: %v; want MasterServerID: %v", got.MasterServerID, want.MasterServerID)) } @@ -101,11 +101,11 @@ func TestMariadbRetrieveFileBasedPositions(t *testing.T) { "Gtid_Slave_Pos": "0-101-2320", } - want := SlaveStatus{ + want := ReplicationStatus{ FilePosition: Position{GTIDSet: filePosGTID{file: "master-bin.000002", pos: 1307}}, FileRelayLogPosition: Position{GTIDSet: filePosGTID{file: "master-bin.000003", pos: 1308}}, } - got, err := parseMariadbSlaveStatus(resultMap) + got, err := parseMariadbReplicationStatus(resultMap) require.NoError(t, err) assert.Equal(t, got.FilePosition.GTIDSet, want.FilePosition.GTIDSet, fmt.Sprintf("got FilePosition: %v; want FilePosition: %v", got.FilePosition.GTIDSet, want.FilePosition.GTIDSet)) assert.Equal(t, got.FileRelayLogPosition.GTIDSet, want.FileRelayLogPosition.GTIDSet, fmt.Sprintf("got FileRelayLogPosition: %v; want FileRelayLogPosition: %v", got.FileRelayLogPosition.GTIDSet, want.FileRelayLogPosition.GTIDSet)) @@ -119,7 +119,7 @@ func TestMariadbShouldGetNilRelayLogPosition(t *testing.T) { "Master_Log_File": "master-bin.000003", "Gtid_Slave_Pos": "0-101-2320", } - got, err := parseMariadbSlaveStatus(resultMap) + got, err := parseMariadbReplicationStatus(resultMap) require.NoError(t, err) assert.Truef(t, got.RelayLogPosition.IsZero(), "Got a filled in RelayLogPosition. For MariaDB we should get back nil, because MariaDB does not return the retrieved GTIDSet. got: %#v", got.RelayLogPosition) } diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index 0692f8da2d4..f169ded33ba 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -42,11 +42,11 @@ func (mysqlFlavor) masterGTIDSet(c *Conn) (GTIDSet, error) { return parseMysql56GTIDSet(qr.Rows[0][0].ToString()) } -func (mysqlFlavor) startSlaveCommand() string { +func (mysqlFlavor) startReplicationCommand() string { return "START SLAVE" } -func (mysqlFlavor) restartSlaveCommands() []string { +func (mysqlFlavor) restartReplicationCommands() []string { return []string{ "STOP SLAVE", "RESET SLAVE", @@ -54,16 +54,16 @@ func (mysqlFlavor) restartSlaveCommands() []string { } } -func (mysqlFlavor) startSlaveUntilAfter(pos Position) string { +func (mysqlFlavor) startReplicationUntilAfter(pos Position) string { return fmt.Sprintf("START SLAVE UNTIL SQL_AFTER_GTIDS = '%s'", pos) } -func (mysqlFlavor) stopSlaveCommand() string { +func (mysqlFlavor) stopReplicationCommand() string { return "STOP SLAVE" } // sendBinlogDumpCommand is part of the Flavor interface. -func (mysqlFlavor) sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Position) error { +func (mysqlFlavor) sendBinlogDumpCommand(c *Conn, serverID uint32, startPos Position) error { gtidSet, ok := startPos.GTIDSet.(Mysql56GTIDSet) if !ok { return vterrors.Errorf(vtrpc.Code_INTERNAL, "startPos.GTIDSet is wrong type - expected Mysql56GTIDSet, got: %#v", startPos.GTIDSet) @@ -71,7 +71,7 @@ func (mysqlFlavor) sendBinlogDumpCommand(c *Conn, slaveID uint32, startPos Posit // Build the command. sidBlock := gtidSet.SIDBlock() - return c.WriteComBinlogDumpGTID(slaveID, "", 4, 0, sidBlock) + return c.WriteComBinlogDumpGTID(serverID, "", 4, 0, sidBlock) } // resetReplicationCommands is part of the Flavor interface. @@ -82,51 +82,51 @@ func (mysqlFlavor) resetReplicationCommands(c *Conn) []string { "RESET MASTER", // This will also clear gtid_executed and gtid_purged. } if c.SemiSyncExtensionLoaded() { - resetCommands = append(resetCommands, "SET GLOBAL rpl_semi_sync_master_enabled = false, GLOBAL rpl_semi_sync_slave_enabled = false") // semi-sync will be enabled if needed when slave is started. + resetCommands = append(resetCommands, "SET GLOBAL rpl_semi_sync_master_enabled = false, GLOBAL rpl_semi_sync_slave_enabled = false") // semi-sync will be enabled if needed when replica is started. } return resetCommands } -// setSlavePositionCommands is part of the Flavor interface. -func (mysqlFlavor) setSlavePositionCommands(pos Position) []string { +// setReplicationPositionCommands is part of the Flavor interface. +func (mysqlFlavor) setReplicationPositionCommands(pos Position) []string { return []string{ "RESET MASTER", // We must clear gtid_executed before setting gtid_purged. fmt.Sprintf("SET GLOBAL gtid_purged = '%s'", pos), } } -// setSlavePositionCommands is part of the Flavor interface. +// setReplicationPositionCommands is part of the Flavor interface. func (mysqlFlavor) changeMasterArg() string { return "MASTER_AUTO_POSITION = 1" } // status is part of the Flavor interface. -func (mysqlFlavor) status(c *Conn) (SlaveStatus, error) { +func (mysqlFlavor) status(c *Conn) (ReplicationStatus, error) { qr, err := c.ExecuteFetch("SHOW SLAVE STATUS", 100, true /* wantfields */) if err != nil { - return SlaveStatus{}, err + return ReplicationStatus{}, err } if len(qr.Rows) == 0 { // The query returned no data, meaning the server - // is not configured as a slave. - return SlaveStatus{}, ErrNotSlave + // is not configured as a replica. + return ReplicationStatus{}, ErrNotReplica } resultMap, err := resultToMap(qr) if err != nil { - return SlaveStatus{}, err + return ReplicationStatus{}, err } - return parseMysqlSlaveStatus(resultMap) + return parseMysqlReplicationStatus(resultMap) } -func parseMysqlSlaveStatus(resultMap map[string]string) (SlaveStatus, error) { - status := parseSlaveStatus(resultMap) +func parseMysqlReplicationStatus(resultMap map[string]string) (ReplicationStatus, error) { + status := parseReplicationStatus(resultMap) uuidString := resultMap["Master_UUID"] if uuidString != "" { sid, err := ParseSID(uuidString) if err != nil { - return SlaveStatus{}, vterrors.Wrapf(err, "cannot decode MasterUUID") + return ReplicationStatus{}, vterrors.Wrapf(err, "cannot decode MasterUUID") } status.MasterUUID = sid } @@ -134,11 +134,11 @@ func parseMysqlSlaveStatus(resultMap map[string]string) (SlaveStatus, error) { var err error status.Position.GTIDSet, err = parseMysql56GTIDSet(resultMap["Executed_Gtid_Set"]) if err != nil { - return SlaveStatus{}, vterrors.Wrapf(err, "SlaveStatus can't parse MySQL 5.6 GTID (Executed_Gtid_Set: %#v)", resultMap["Executed_Gtid_Set"]) + return ReplicationStatus{}, vterrors.Wrapf(err, "ReplicationStatus can't parse MySQL 5.6 GTID (Executed_Gtid_Set: %#v)", resultMap["Executed_Gtid_Set"]) } relayLogGTIDSet, err := parseMysql56GTIDSet(resultMap["Retrieved_Gtid_Set"]) if err != nil { - return SlaveStatus{}, vterrors.Wrapf(err, "SlaveStatus can't parse MySQL 5.6 GTID (Retrieved_Gtid_Set: %#v)", resultMap["Retrieved_Gtid_Set"]) + return ReplicationStatus{}, vterrors.Wrapf(err, "ReplicationStatus can't parse MySQL 5.6 GTID (Retrieved_Gtid_Set: %#v)", resultMap["Retrieved_Gtid_Set"]) } // We take the union of the executed and retrieved gtidset, because the retrieved gtidset only represents GTIDs since // the relay log has been reset. To get the full Position, we need to take a union of executed GTIDSets, since these would diff --git a/go/mysql/flavor_mysql_test.go b/go/mysql/flavor_mysql_test.go index 00ff5e5ee0b..3cdbe94eb7f 100644 --- a/go/mysql/flavor_mysql_test.go +++ b/go/mysql/flavor_mysql_test.go @@ -84,8 +84,8 @@ func TestMysqlRetrieveMasterServerId(t *testing.T) { "Master_Server_Id": "1", } - want := SlaveStatus{MasterServerID: 1} - got, err := parseMysqlSlaveStatus(resultMap) + want := ReplicationStatus{MasterServerID: 1} + got, err := parseMysqlReplicationStatus(resultMap) require.NoError(t, err) assert.Equalf(t, got.MasterServerID, want.MasterServerID, "got MasterServerID: %v; want MasterServerID: %v", got.MasterServerID, want.MasterServerID) } @@ -98,11 +98,11 @@ func TestMysqlRetrieveFileBasedPositions(t *testing.T) { "Master_Log_File": "master-bin.000003", } - want := SlaveStatus{ + want := ReplicationStatus{ FilePosition: Position{GTIDSet: filePosGTID{file: "master-bin.000002", pos: 1307}}, FileRelayLogPosition: Position{GTIDSet: filePosGTID{file: "master-bin.000003", pos: 1308}}, } - got, err := parseMysqlSlaveStatus(resultMap) + got, err := parseMysqlReplicationStatus(resultMap) require.NoError(t, err) assert.Equalf(t, got.FilePosition.GTIDSet, want.FilePosition.GTIDSet, "got FilePosition: %v; want FilePosition: %v", got.FilePosition.GTIDSet, want.FilePosition.GTIDSet) assert.Equalf(t, got.FileRelayLogPosition.GTIDSet, want.FileRelayLogPosition.GTIDSet, "got FileRelayLogPosition: %v; want FileRelayLogPosition: %v", got.FileRelayLogPosition.GTIDSet, want.FileRelayLogPosition.GTIDSet) @@ -119,11 +119,11 @@ func TestMysqlShouldGetRelayLogPosition(t *testing.T) { } sid, _ := ParseSID("3e11fa47-71ca-11e1-9e33-c80aa9429562") - want := SlaveStatus{ + want := ReplicationStatus{ Position: Position{GTIDSet: Mysql56GTIDSet{sid: []interval{{start: 1, end: 5}}}}, RelayLogPosition: Position{GTIDSet: Mysql56GTIDSet{sid: []interval{{start: 1, end: 9}}}}, } - got, err := parseMysqlSlaveStatus(resultMap) + got, err := parseMysqlReplicationStatus(resultMap) require.NoError(t, err) assert.Equalf(t, got.RelayLogPosition.GTIDSet.String(), want.RelayLogPosition.GTIDSet.String(), "got RelayLogPosition: %v; want RelayLogPosition: %v", got.RelayLogPosition.GTIDSet, want.RelayLogPosition.GTIDSet) } diff --git a/go/mysql/replication_constants.go b/go/mysql/replication_constants.go index f6689313f94..53937a01ac4 100644 --- a/go/mysql/replication_constants.go +++ b/go/mysql/replication_constants.go @@ -208,7 +208,7 @@ const ( //eXAPrepareLogEvent = 38 // MariaDB specific values. They start at 160. - eMariaAnnotateRowsEvent = 160 //nolint + //eMariaAnnotateRowsEvent = 160 // Unused //eMariaBinlogCheckpointEvent = 161 eMariaGTIDEvent = 162 diff --git a/go/mysql/slave_status.go b/go/mysql/replication_status.go similarity index 77% rename from go/mysql/slave_status.go rename to go/mysql/replication_status.go index 9d48ad5ff76..58f17835b5f 100644 --- a/go/mysql/slave_status.go +++ b/go/mysql/replication_status.go @@ -23,8 +23,8 @@ import ( "vitess.io/vitess/go/vt/vterrors" ) -// SlaveStatus holds replication information from SHOW SLAVE STATUS. -type SlaveStatus struct { +// ReplicationStatus holds replication information from SHOW SLAVE STATUS. +type ReplicationStatus struct { Position Position // RelayLogPosition is the Position that the replica would be at if it // were to finish executing everything that's currently in its relay log. @@ -34,8 +34,8 @@ type SlaveStatus struct { FilePosition Position FileRelayLogPosition Position MasterServerID uint - SlaveIORunning bool - SlaveSQLRunning bool + IOThreadRunning bool + SQLThreadRunning bool SecondsBehindMaster uint MasterHost string MasterPort int @@ -43,22 +43,22 @@ type SlaveStatus struct { MasterUUID SID } -// SlaveRunning returns true iff both the Slave IO and Slave SQL threads are +// ReplicationRunning returns true iff both the IO and SQL threads are // running. -func (s *SlaveStatus) SlaveRunning() bool { - return s.SlaveIORunning && s.SlaveSQLRunning +func (s *ReplicationStatus) ReplicationRunning() bool { + return s.IOThreadRunning && s.SQLThreadRunning } -// SlaveStatusToProto translates a Status to proto3. -func SlaveStatusToProto(s SlaveStatus) *replicationdatapb.Status { +// ReplicationStatusToProto translates a Status to proto3. +func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { return &replicationdatapb.Status{ Position: EncodePosition(s.Position), RelayLogPosition: EncodePosition(s.RelayLogPosition), FilePosition: EncodePosition(s.FilePosition), FileRelayLogPosition: EncodePosition(s.FileRelayLogPosition), MasterServerId: uint32(s.MasterServerID), - SlaveIoRunning: s.SlaveIORunning, - SlaveSqlRunning: s.SlaveSQLRunning, + IoThreadRunning: s.IOThreadRunning, + SqlThreadRunning: s.SQLThreadRunning, SecondsBehindMaster: uint32(s.SecondsBehindMaster), MasterHost: s.MasterHost, MasterPort: int32(s.MasterPort), @@ -67,8 +67,8 @@ func SlaveStatusToProto(s SlaveStatus) *replicationdatapb.Status { } } -// ProtoToSlaveStatus translates a proto Status, or panics. -func ProtoToSlaveStatus(s *replicationdatapb.Status) SlaveStatus { +// ProtoToReplicationStatus translates a proto Status, or panics. +func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { pos, err := DecodePosition(s.Position) if err != nil { panic(vterrors.Wrapf(err, "cannot decode Position")) @@ -92,14 +92,14 @@ func ProtoToSlaveStatus(s *replicationdatapb.Status) SlaveStatus { panic(vterrors.Wrapf(err, "cannot decode MasterUUID")) } } - return SlaveStatus{ + return ReplicationStatus{ Position: pos, RelayLogPosition: relayPos, FilePosition: filePos, FileRelayLogPosition: fileRelayPos, MasterServerID: uint(s.MasterServerId), - SlaveIORunning: s.SlaveIoRunning, - SlaveSQLRunning: s.SlaveSqlRunning, + IOThreadRunning: s.IoThreadRunning, + SQLThreadRunning: s.SqlThreadRunning, SecondsBehindMaster: uint(s.SecondsBehindMaster), MasterHost: s.MasterHost, MasterPort: int(s.MasterPort), @@ -109,9 +109,9 @@ func ProtoToSlaveStatus(s *replicationdatapb.Status) SlaveStatus { } // FindErrantGTIDs can be used to find errant GTIDs in the receiver's relay log, by comparing it against all known replicas, -// provided as a list of SlaveStatus's. This method only works if the flavor for all retrieved SlaveStatus's is MySQL. +// provided as a list of ReplicationStatus's. This method only works if the flavor for all retrieved ReplicationStatus's is MySQL. // The result is returned as a Mysql56GTIDSet, each of whose elements is a found errant GTID. -func (s *SlaveStatus) FindErrantGTIDs(otherReplicaStatuses []*SlaveStatus) (Mysql56GTIDSet, error) { +func (s *ReplicationStatus) FindErrantGTIDs(otherReplicaStatuses []*ReplicationStatus) (Mysql56GTIDSet, error) { set, ok := s.RelayLogPosition.GTIDSet.(Mysql56GTIDSet) if !ok { return nil, fmt.Errorf("errant GTIDs can only be computed on the MySQL flavor") @@ -121,7 +121,7 @@ func (s *SlaveStatus) FindErrantGTIDs(otherReplicaStatuses []*SlaveStatus) (Mysq for _, status := range otherReplicaStatuses { otherSet, ok := status.RelayLogPosition.GTIDSet.(Mysql56GTIDSet) if !ok { - panic("The receiver SlaveStatus contained a Mysql56GTIDSet in its relay log, but a replica's SlaveStatus is of another flavor. This should never happen.") + panic("The receiver ReplicationStatus contained a Mysql56GTIDSet in its relay log, but a replica's ReplicationStatus is of another flavor. This should never happen.") } // Copy and throw out master SID from consideration, so we don't mutate input. otherSetNoMasterSID := make(Mysql56GTIDSet, len(otherSet)) diff --git a/go/mysql/slave_status_test.go b/go/mysql/replication_status_test.go similarity index 64% rename from go/mysql/slave_status_test.go rename to go/mysql/replication_status_test.go index 3ab177db922..d25e6e809b6 100644 --- a/go/mysql/slave_status_test.go +++ b/go/mysql/replication_status_test.go @@ -20,36 +20,36 @@ import ( "testing" ) -func TestStatusSlaveRunning(t *testing.T) { - input := &SlaveStatus{ - SlaveIORunning: true, - SlaveSQLRunning: true, +func TestStatusReplicationRunning(t *testing.T) { + input := &ReplicationStatus{ + IOThreadRunning: true, + SQLThreadRunning: true, } want := true - if got := input.SlaveRunning(); got != want { - t.Errorf("%#v.SlaveRunning() = %v, want %v", input, got, want) + if got := input.ReplicationRunning(); got != want { + t.Errorf("%#v.ReplicationRunning() = %v, want %v", input, got, want) } } -func TestStatusSlaveIONotRunning(t *testing.T) { - input := &SlaveStatus{ - SlaveIORunning: false, - SlaveSQLRunning: true, +func TestStatusIOThreadNotRunning(t *testing.T) { + input := &ReplicationStatus{ + IOThreadRunning: false, + SQLThreadRunning: true, } want := false - if got := input.SlaveRunning(); got != want { - t.Errorf("%#v.SlaveRunning() = %v, want %v", input, got, want) + if got := input.ReplicationRunning(); got != want { + t.Errorf("%#v.ReplicationRunning() = %v, want %v", input, got, want) } } -func TestStatusSlaveSQLNotRunning(t *testing.T) { - input := &SlaveStatus{ - SlaveIORunning: true, - SlaveSQLRunning: false, +func TestStatusSQLThreadNotRunning(t *testing.T) { + input := &ReplicationStatus{ + IOThreadRunning: true, + SQLThreadRunning: false, } want := false - if got := input.SlaveRunning(); got != want { - t.Errorf("%#v.SlaveRunning() = %v, want %v", input, got, want) + if got := input.ReplicationRunning(); got != want { + t.Errorf("%#v.ReplicationRunning() = %v, want %v", input, got, want) } } @@ -81,11 +81,11 @@ func TestFindErrantGTIDs(t *testing.T) { masterSID: []interval{{2, 6}, {15, 45}}, } - slaveStatus1 := SlaveStatus{MasterUUID: masterSID, RelayLogPosition: Position{GTIDSet: set1}} - slaveStatus2 := SlaveStatus{MasterUUID: masterSID, RelayLogPosition: Position{GTIDSet: set2}} - slaveStatus3 := SlaveStatus{MasterUUID: masterSID, RelayLogPosition: Position{GTIDSet: set3}} + status1 := ReplicationStatus{MasterUUID: masterSID, RelayLogPosition: Position{GTIDSet: set1}} + status2 := ReplicationStatus{MasterUUID: masterSID, RelayLogPosition: Position{GTIDSet: set2}} + status3 := ReplicationStatus{MasterUUID: masterSID, RelayLogPosition: Position{GTIDSet: set3}} - got, err := slaveStatus1.FindErrantGTIDs([]*SlaveStatus{&slaveStatus2, &slaveStatus3}) + got, err := status1.FindErrantGTIDs([]*ReplicationStatus{&status2, &status3}) if err != nil { t.Errorf("%v", err) } diff --git a/go/test/endtoend/backup/transform/backup_transform_utils.go b/go/test/endtoend/backup/transform/backup_transform_utils.go index 47719309b9b..e54fdf047b9 100644 --- a/go/test/endtoend/backup/transform/backup_transform_utils.go +++ b/go/test/endtoend/backup/transform/backup_transform_utils.go @@ -185,7 +185,7 @@ var vtInsertTest = `create table vt_insert_test ( // TestBackupTransformImpl tests backups with transform hooks func TestBackupTransformImpl(t *testing.T) { - // insert data in master, validate same in slave + // insert data in master, validate same in replica defer cluster.PanicHandler(t) verifyInitialReplication(t) @@ -260,7 +260,7 @@ func TestBackupTransformImpl(t *testing.T) { verifyReplicationStatus(t, replica2, "OFF") } - // validate that new slave has all the data + // validate that new replica has all the data cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) // Remove all backups diff --git a/go/test/endtoend/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index 1ac7a93a212..6f6c032f7e3 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -112,7 +112,7 @@ func firstBackupTest(t *testing.T, tabletType string) { backups, err := listBackups(shardKsName) require.Nil(t, err) - // insert data on master, wait for slave to get it + // insert data on master, wait for replica to get it _, err = master.VttabletProcess.QueryTablet(vtInsertTest, keyspaceName, true) require.Nil(t, err) // Add a single row with value 'test1' to the master tablet @@ -122,7 +122,7 @@ func firstBackupTest(t *testing.T, tabletType string) { // Check that the specified tablet has the expected number of rows cluster.VerifyRowsInTablet(t, replica1, keyspaceName, 1) - // backup the slave + // backup the replica log.Info("taking backup %s", time.Now()) vtBackup(t, false) log.Info("done taking backup %s", time.Now()) @@ -135,16 +135,16 @@ func firstBackupTest(t *testing.T, tabletType string) { require.Nil(t, err) cluster.VerifyRowsInTablet(t, replica1, keyspaceName, 2) - // now bring up the other slave, letting it restore from backup. + // now bring up the other replica, letting it restore from backup. err = localCluster.VtctlclientProcess.InitTablet(replica2, cell, keyspaceName, hostname, shardName) require.Nil(t, err) restore(t, replica2, "replica", "SERVING") // Replica2 takes time to serve. Sleeping for 5 sec. time.Sleep(5 * time.Second) - //check the new slave has the data + //check the new replica has the data cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) - // check that the restored slave has the right local_metadata + // check that the restored replica has the right local_metadata result, err := replica2.VttabletProcess.QueryTabletWithDB("select * from local_metadata", "_vt") require.Nil(t, err) assert.Equal(t, replica2.Alias, result.Rows[0][1].ToString(), "Alias") @@ -275,10 +275,10 @@ func resetTabletDirectory(t *testing.T, tablet cluster.Vttablet, initMysql bool) func tearDown(t *testing.T, initMysql bool) { // reset replication - promoteSlaveCommands := "STOP SLAVE; RESET SLAVE ALL; RESET MASTER;" + promoteCommands := "STOP SLAVE; RESET SLAVE ALL; RESET MASTER;" disableSemiSyncCommands := "SET GLOBAL rpl_semi_sync_master_enabled = false; SET GLOBAL rpl_semi_sync_slave_enabled = false" for _, tablet := range []cluster.Vttablet{*master, *replica1, *replica2} { - _, err := tablet.VttabletProcess.QueryTablet(promoteSlaveCommands, keyspaceName, true) + _, err := tablet.VttabletProcess.QueryTablet(promoteCommands, keyspaceName, true) require.Nil(t, err) _, err = tablet.VttabletProcess.QueryTablet(disableSemiSyncCommands, keyspaceName, true) require.Nil(t, err) diff --git a/go/test/endtoend/reparent/reparent_range_based_test.go b/go/test/endtoend/reparent/reparent_range_based_test.go index 4e7dfafbe75..b7f50f360d1 100644 --- a/go/test/endtoend/reparent/reparent_range_based_test.go +++ b/go/test/endtoend/reparent/reparent_range_based_test.go @@ -71,7 +71,7 @@ func TestReparentGracefulRangeBased(t *testing.T) { if strArray[len(strArray)-1] == "" { strArray = strArray[:len(strArray)-1] // Truncate slice, remove empty line } - assert.Equal(t, 2, len(strArray)) // one master, one slave + assert.Equal(t, 2, len(strArray)) // one master, one replica assert.Contains(t, strArray[0], "master") // master first // Perform a graceful reparent operation diff --git a/go/test/endtoend/reparent/reparent_test.go b/go/test/endtoend/reparent/reparent_test.go index cf46e929ba0..c1c9817753a 100644 --- a/go/test/endtoend/reparent/reparent_test.go +++ b/go/test/endtoend/reparent/reparent_test.go @@ -59,7 +59,7 @@ func TestMasterToSpareStateChangeImpossible(t *testing.T) { require.Nil(t, err) // We cannot change a master to spare - err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeSlaveType", tablet62344.Alias, "spare") + err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeReplicaType", tablet62344.Alias, "spare") require.Error(t, err) //kill Tablet @@ -285,7 +285,7 @@ func TestReparentGraceful(t *testing.T) { killTablets(t) } -func TestReparentSlaveOffline(t *testing.T) { +func TestReparentReplicaOffline(t *testing.T) { defer cluster.PanicHandler(t) for _, tablet := range []cluster.Vttablet{*tablet62344, *tablet62044, *tablet41983, *tablet31981} { @@ -483,13 +483,13 @@ func reparentFromOutside(t *testing.T, downMaster bool) { } // commands to convert a replica to a master - promoteSlaveCommands := "STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only = OFF;" - runSQL(ctx, t, promoteSlaveCommands, tablet62044) + promoteReplicaCommands := "STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only = OFF;" + runSQL(ctx, t, promoteReplicaCommands, tablet62044) // Get master position _, gtID := cluster.GetMasterPosition(t, *tablet62044, hostname) - // 62344 will now be a slave of 62044 + // 62344 will now be a replica of 62044 changeMasterCommands := fmt.Sprintf("RESET MASTER; RESET SLAVE; SET GLOBAL gtid_purged = '%s';"+ "CHANGE MASTER TO MASTER_HOST='%s', MASTER_PORT=%d, MASTER_USER='vt_repl', MASTER_AUTO_POSITION = 1;"+ "START SLAVE;", gtID, hostname, tablet62044.MySQLPort) @@ -498,7 +498,7 @@ func reparentFromOutside(t *testing.T, downMaster bool) { // Capture time when we made tablet62044 master baseTime := time.Now().UnixNano() / 1000000000 - // 41983 will be a slave of 62044 + // 41983 will be a replica of 62044 changeMasterCommands = fmt.Sprintf("STOP SLAVE; RESET MASTER; SET GLOBAL gtid_purged = '%s';"+ "CHANGE MASTER TO MASTER_HOST='%s', MASTER_PORT=%d, MASTER_USER='vt_repl', MASTER_AUTO_POSITION = 1;"+ "START SLAVE;", gtID, hostname, tablet62044.MySQLPort) @@ -528,7 +528,7 @@ func reparentFromOutside(t *testing.T, downMaster bool) { killTablets(t) } -func TestReparentWithDownSlave(t *testing.T) { +func TestReparentWithDownReplica(t *testing.T) { defer cluster.PanicHandler(t) ctx := context.Background() @@ -671,14 +671,14 @@ func TestChangeTypeSemiSync(t *testing.T) { require.Nil(t, err) checkDBvar(ctx, t, rdonly1, "rpl_semi_sync_slave_enabled", "ON") checkDBstatus(ctx, t, rdonly1, "Rpl_semi_sync_slave_status", "OFF") - checkSlaveStatus(ctx, t, rdonly1) + checkReplicaStatus(ctx, t, rdonly1) // Now change from replica back to rdonly, make sure replication is still not enabled. err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeSlaveType", rdonly1.Alias, "rdonly") require.Nil(t, err) checkDBvar(ctx, t, rdonly1, "rpl_semi_sync_slave_enabled", "OFF") checkDBstatus(ctx, t, rdonly1, "Rpl_semi_sync_slave_status", "OFF") - checkSlaveStatus(ctx, t, rdonly1) + checkReplicaStatus(ctx, t, rdonly1) // Change rdonly2 to replica, should turn on semi-sync, and restart replication. err = clusterInstance.VtctlclientProcess.ExecuteCommand("ChangeSlaveType", rdonly2.Alias, "replica") @@ -724,7 +724,7 @@ func TestReparentDoesntHangIfMasterFails(t *testing.T) { require.Nil(t, err) // Perform a planned reparent operation, the master will fail the - // insert. The slaves should then abort right away. + // insert. The replicas should then abort right away. out, err := clusterInstance.VtctlclientProcess.ExecuteCommandWithOutput( "PlannedReparentShard", "-keyspace_shard", keyspaceShard, @@ -824,12 +824,12 @@ func checkDBstatus(ctx context.Context, t *testing.T, tablet *cluster.Vttablet, assert.Equal(t, want, got) } -func checkSlaveStatus(ctx context.Context, t *testing.T, tablet *cluster.Vttablet) { +func checkReplicaStatus(ctx context.Context, t *testing.T, tablet *cluster.Vttablet) { qr := runSQL(ctx, t, "show slave status", tablet) - SlaveIORunning := fmt.Sprintf("%v", qr.Rows[0][10]) // Slave_IO_Running - SlaveSQLRunning := fmt.Sprintf("%v", qr.Rows[0][10]) // Slave_SQL_Running - assert.Equal(t, SlaveIORunning, "VARCHAR(\"No\")") - assert.Equal(t, SlaveSQLRunning, "VARCHAR(\"No\")") + IOThreadRunning := fmt.Sprintf("%v", qr.Rows[0][10]) // Slave_IO_Running + SQLThreadRunning := fmt.Sprintf("%v", qr.Rows[0][10]) // Slave_SQL_Running + assert.Equal(t, IOThreadRunning, "VARCHAR(\"No\")") + assert.Equal(t, SQLThreadRunning, "VARCHAR(\"No\")") } // Makes sure the tablet type is master, and its health check agrees. diff --git a/go/test/endtoend/tabletgateway/buffer/buffer_test.go b/go/test/endtoend/tabletgateway/buffer/buffer_test.go index 62d98ab641a..8018fdbffe8 100644 --- a/go/test/endtoend/tabletgateway/buffer/buffer_test.go +++ b/go/test/endtoend/tabletgateway/buffer/buffer_test.go @@ -73,7 +73,7 @@ const ( demoteMasterQuery = "SET GLOBAL read_only = ON;FLUSH TABLES WITH READ LOCK;UNLOCK TABLES;" disableSemiSyncMasterQuery = "SET GLOBAL rpl_semi_sync_master_enabled = 0" enableSemiSyncMasterQuery = "SET GLOBAL rpl_semi_sync_master_enabled = 1" - promoteSlaveQuery = "STOP SLAVE;RESET SLAVE ALL;SET GLOBAL read_only = OFF;" + promoteQuery = "STOP SLAVE;RESET SLAVE ALL;SET GLOBAL read_only = OFF;" ) //threadParams is set of params passed into read and write threads @@ -374,7 +374,7 @@ func externalReparenting(ctx context.Context, t *testing.T, clusterInstance *clu } // Promote replica to new master. - replica.VttabletProcess.QueryTablet(promoteSlaveQuery, keyspaceUnshardedName, true) + replica.VttabletProcess.QueryTablet(promoteQuery, keyspaceUnshardedName, true) if replica.VttabletProcess.EnableSemiSync { replica.VttabletProcess.QueryTablet(enableSemiSyncMasterQuery, keyspaceUnshardedName, true) diff --git a/go/test/endtoend/tabletmanager/lock_unlock_test.go b/go/test/endtoend/tabletmanager/lock_unlock_test.go index ac413dc6f9c..0f862d6ae53 100644 --- a/go/test/endtoend/tabletmanager/lock_unlock_test.go +++ b/go/test/endtoend/tabletmanager/lock_unlock_test.go @@ -71,8 +71,8 @@ func TestLockAndUnlock(t *testing.T) { exec(t, masterConn, "delete from t1") } -// TestStartSlaveUntilAfter tests by writing three rows, noting the gtid after each, and then replaying them one by one -func TestStartSlaveUntilAfter(t *testing.T) { +// TestStartReplicationUntilAfter tests by writing three rows, noting the gtid after each, and then replaying them one by one +func TestStartReplicationUntilAfter(t *testing.T) { defer cluster.PanicHandler(t) ctx := context.Background() @@ -85,7 +85,7 @@ func TestStartSlaveUntilAfter(t *testing.T) { defer replicaConn.Close() //first we stop replication to the replica, so we can move forward step by step. - err = tmcStopSlave(ctx, replicaTablet.GrpcPort) + err = tmcStopReplication(ctx, replicaTablet.GrpcPort) require.Nil(t, err) exec(t, masterConn, "insert into t1(id, value) values(1,'a')") @@ -105,21 +105,21 @@ func TestStartSlaveUntilAfter(t *testing.T) { // starts the mysql replication until timeout := 10 * time.Second - err = tmcStartSlaveUntilAfter(ctx, replicaTablet.GrpcPort, pos1, timeout) + err = tmcStartReplicationUntilAfter(ctx, replicaTablet.GrpcPort, pos1, timeout) require.Nil(t, err) // first row should be visible checkDataOnReplica(t, replicaConn, `[[VARCHAR("a")]]`) - err = tmcStartSlaveUntilAfter(ctx, replicaTablet.GrpcPort, pos2, timeout) + err = tmcStartReplicationUntilAfter(ctx, replicaTablet.GrpcPort, pos2, timeout) require.Nil(t, err) checkDataOnReplica(t, replicaConn, `[[VARCHAR("a")] [VARCHAR("b")]]`) - err = tmcStartSlaveUntilAfter(ctx, replicaTablet.GrpcPort, pos3, timeout) + err = tmcStartReplicationUntilAfter(ctx, replicaTablet.GrpcPort, pos3, timeout) require.Nil(t, err) checkDataOnReplica(t, replicaConn, `[[VARCHAR("a")] [VARCHAR("b")] [VARCHAR("c")]]`) // Strat replication to the replica - err = tmcStartSlave(ctx, replicaTablet.GrpcPort) + err = tmcStartReplication(ctx, replicaTablet.GrpcPort) require.Nil(t, err) // Clean the table for further testing exec(t, masterConn, "delete from t1") diff --git a/go/test/endtoend/tabletmanager/main_test.go b/go/test/endtoend/tabletmanager/main_test.go index 4cf93e30085..476331263d7 100644 --- a/go/test/endtoend/tabletmanager/main_test.go +++ b/go/test/endtoend/tabletmanager/main_test.go @@ -168,14 +168,14 @@ func tmcUnlockTables(ctx context.Context, tabletGrpcPort int) error { return tmClient.UnlockTables(ctx, vtablet) } -func tmcStopSlave(ctx context.Context, tabletGrpcPort int) error { +func tmcStopReplication(ctx context.Context, tabletGrpcPort int) error { vtablet := getTablet(tabletGrpcPort) - return tmClient.StopSlave(ctx, vtablet) + return tmClient.StopReplication(ctx, vtablet) } -func tmcStartSlave(ctx context.Context, tabletGrpcPort int) error { +func tmcStartReplication(ctx context.Context, tabletGrpcPort int) error { vtablet := getTablet(tabletGrpcPort) - return tmClient.StartSlave(ctx, vtablet) + return tmClient.StartReplication(ctx, vtablet) } func tmcMasterPosition(ctx context.Context, tabletGrpcPort int) (string, error) { @@ -183,9 +183,9 @@ func tmcMasterPosition(ctx context.Context, tabletGrpcPort int) (string, error) return tmClient.MasterPosition(ctx, vtablet) } -func tmcStartSlaveUntilAfter(ctx context.Context, tabletGrpcPort int, positon string, waittime time.Duration) error { +func tmcStartReplicationUntilAfter(ctx context.Context, tabletGrpcPort int, positon string, waittime time.Duration) error { vtablet := getTablet(tabletGrpcPort) - return tmClient.StartSlaveUntilAfter(ctx, vtablet, positon, waittime) + return tmClient.StartReplicationUntilAfter(ctx, vtablet, positon, waittime) } func getTablet(tabletGrpcPort int) *tabletpb.Tablet { diff --git a/go/test/endtoend/tabletmanager/tablet_health_test.go b/go/test/endtoend/tabletmanager/tablet_health_test.go index c4c1802cf17..29ef62fab91 100644 --- a/go/test/endtoend/tabletmanager/tablet_health_test.go +++ b/go/test/endtoend/tabletmanager/tablet_health_test.go @@ -198,7 +198,7 @@ func verifyStreamHealth(t *testing.T, result string) { assert.True(t, serving, "Tablet should be in serving state") assert.True(t, UID > 0, "Tablet should contain uid") // secondsBehindMaster varies till 7200 so setting safe limit - assert.True(t, secondsBehindMaster < 10000, "Slave should not be behind master") + assert.True(t, secondsBehindMaster < 10000, "replica should not be behind master") } func TestHealthCheckDrainedStateDoesNotShutdownQueryService(t *testing.T) { @@ -347,7 +347,7 @@ func TestNoMysqlHealthCheck(t *testing.T) { exec(t, masterConn, fmt.Sprintf("create database vt_%s", keyspaceName)) exec(t, replicaConn, fmt.Sprintf("create database vt_%s", keyspaceName)) - //Get the gtid to ensure we bring master and slave at same position + //Get the gtid to ensure we bring master and replica at same position qr := exec(t, masterConn, "SELECT @@GLOBAL.gtid_executed") gtid := string(qr.Rows[0][0].Raw()) @@ -381,7 +381,7 @@ func TestNoMysqlHealthCheck(t *testing.T) { checkHealth(t, mTablet.HTTPPort, true) checkHealth(t, rTablet.HTTPPort, true) - // Tell slave to not try to repair replication in healthcheck. + // Tell replica to not try to repair replication in healthcheck. // The StopSlave will ultimately fail because mysqld is not running, // But vttablet should remember that it's not supposed to fix replication. err = clusterInstance.VtctlclientProcess.ExecuteCommand("StopSlave", rTablet.Alias) @@ -406,7 +406,7 @@ func TestNoMysqlHealthCheck(t *testing.T) { require.NoError(t, err) checkHealth(t, mTablet.HTTPPort, false) - // the slave will now be healthy, but report a very high replication + // the replica will now be healthy, but report a very high replication // lag, because it can't figure out what it exactly is. err = clusterInstance.VtctlclientProcess.ExecuteCommand("RunHealthCheck", rTablet.Alias) require.NoError(t, err) diff --git a/go/test/endtoend/vtgate/buffer/buffer_test.go b/go/test/endtoend/vtgate/buffer/buffer_test.go index c632bdbec64..83a4b556af9 100644 --- a/go/test/endtoend/vtgate/buffer/buffer_test.go +++ b/go/test/endtoend/vtgate/buffer/buffer_test.go @@ -73,7 +73,7 @@ const ( demoteMasterQuery = "SET GLOBAL read_only = ON;FLUSH TABLES WITH READ LOCK;UNLOCK TABLES;" disableSemiSyncMasterQuery = "SET GLOBAL rpl_semi_sync_master_enabled = 0" enableSemiSyncMasterQuery = "SET GLOBAL rpl_semi_sync_master_enabled = 1" - promoteSlaveQuery = "STOP SLAVE;RESET SLAVE ALL;SET GLOBAL read_only = OFF;" + promoteQuery = "STOP SLAVE;RESET SLAVE ALL;SET GLOBAL read_only = OFF;" ) //threadParams is set of params passed into read and write threads @@ -379,8 +379,8 @@ func externalReparenting(ctx context.Context, t *testing.T, clusterInstance *clu } //Promote replica to new master and log error - if _, err := replica.VttabletProcess.QueryTablet(promoteSlaveQuery, keyspaceUnshardedName, true); err != nil { - log.Errorf("replica.VttabletProcess.QueryTablet(promoteSlaveQuery... caused an error : %v", err) + if _, err := replica.VttabletProcess.QueryTablet(promoteQuery, keyspaceUnshardedName, true); err != nil { + log.Errorf("replica.VttabletProcess.QueryTablet(promoteQuery... caused an error : %v", err) } if replica.VttabletProcess.EnableSemiSync { diff --git a/go/vt/binlog/slave_connection.go b/go/vt/binlog/binlog_connection.go similarity index 78% rename from go/vt/binlog/slave_connection.go rename to go/vt/binlog/binlog_connection.go index c83b70c3687..d079abaaee3 100644 --- a/go/vt/binlog/slave_connection.go +++ b/go/vt/binlog/binlog_connection.go @@ -36,40 +36,40 @@ var ( ErrBinlogUnavailable = fmt.Errorf("cannot find relevant binlogs on this server") ) -// SlaveConnection represents a connection to mysqld that pretends to be a slave +// BinlogConnection represents a connection to mysqld that pretends to be a replica // connecting for replication. Each such connection must identify itself to -// mysqld with a server ID that is unique both among other SlaveConnections and -// among actual slaves in the topology. -type SlaveConnection struct { +// mysqld with a server ID that is unique both among other BinlogConnections and +// among actual replicas in the topology. +type BinlogConnection struct { *mysql.Conn - cp dbconfigs.Connector - slaveID uint32 - cancel context.CancelFunc - wg sync.WaitGroup + cp dbconfigs.Connector + connID uint32 + cancel context.CancelFunc + wg sync.WaitGroup } -// We use a random slaveid deprecating IDPool which was causing problems with RDS +// We use a random connID deprecating IDPool which was causing problems with RDS // either because it was using ids in the same range that we generate or because // the pool reuses ids. -func getSlaveID() uint32 { +func getConnID() uint32 { max := big.NewInt(math.MaxInt32) id, _ := crand.Int(crand.Reader, max) return uint32(id.Int64()) } -// NewSlaveConnection creates a new slave connection to the mysqld instance. -func NewSlaveConnection(cp dbconfigs.Connector) (*SlaveConnection, error) { +// NewBinlogConnection creates a new binlog connection to the mysqld instance. +func NewBinlogConnection(cp dbconfigs.Connector) (*BinlogConnection, error) { conn, err := connectForReplication(cp) if err != nil { return nil, err } - sc := &SlaveConnection{ - Conn: conn, - cp: cp, - slaveID: getSlaveID(), + sc := &BinlogConnection{ + Conn: conn, + cp: cp, + connID: getConnID(), } - log.Infof("new slave connection: slaveID=%d", sc.slaveID) + log.Infof("new binlog connection: connID=%d", sc.connID) return sc, nil } @@ -91,7 +91,7 @@ func connectForReplication(cp dbconfigs.Connector) (*mysql.Conn, error) { // StartBinlogDumpFromCurrent requests a replication binlog dump from // the current position. -func (sc *SlaveConnection) StartBinlogDumpFromCurrent(ctx context.Context) (mysql.Position, <-chan mysql.BinlogEvent, error) { +func (sc *BinlogConnection) StartBinlogDumpFromCurrent(ctx context.Context) (mysql.Position, <-chan mysql.BinlogEvent, error) { ctx, sc.cancel = context.WithCancel(ctx) masterPosition, err := sc.Conn.MasterPosition() @@ -111,11 +111,11 @@ func (sc *SlaveConnection) StartBinlogDumpFromCurrent(ctx context.Context) (mysq // by canceling the context. // // Note the context is valid and used until eventChan is closed. -func (sc *SlaveConnection) StartBinlogDumpFromPosition(ctx context.Context, startPos mysql.Position) (<-chan mysql.BinlogEvent, error) { +func (sc *BinlogConnection) StartBinlogDumpFromPosition(ctx context.Context, startPos mysql.Position) (<-chan mysql.BinlogEvent, error) { ctx, sc.cancel = context.WithCancel(ctx) - log.Infof("sending binlog dump command: startPos=%v, slaveID=%v", startPos, sc.slaveID) - if err := sc.SendBinlogDumpCommand(sc.slaveID, startPos); err != nil { + log.Infof("sending binlog dump command: startPos=%v, connID=%v", startPos, sc.connID) + if err := sc.SendBinlogDumpCommand(sc.connID, startPos); err != nil { log.Errorf("couldn't send binlog dump command: %v", err) return nil, err } @@ -124,7 +124,7 @@ func (sc *SlaveConnection) StartBinlogDumpFromPosition(ctx context.Context, star } // streamEvents returns a channel on which events are streamed. -func (sc *SlaveConnection) streamEvents(ctx context.Context) chan mysql.BinlogEvent { +func (sc *BinlogConnection) streamEvents(ctx context.Context) chan mysql.BinlogEvent { // FIXME(alainjobart) I think we can use a buffered channel for better performance. eventChan := make(chan mysql.BinlogEvent) @@ -187,7 +187,7 @@ func (sc *SlaveConnection) streamEvents(ctx context.Context) chan mysql.BinlogEv // by canceling the context. // // Note the context is valid and used until eventChan is closed. -func (sc *SlaveConnection) StartBinlogDumpFromBinlogBeforeTimestamp(ctx context.Context, timestamp int64) (<-chan mysql.BinlogEvent, error) { +func (sc *BinlogConnection) StartBinlogDumpFromBinlogBeforeTimestamp(ctx context.Context, timestamp int64) (<-chan mysql.BinlogEvent, error) { ctx, sc.cancel = context.WithCancel(ctx) filename, err := sc.findFileBeforeTimestamp(ctx, timestamp) @@ -198,13 +198,13 @@ func (sc *SlaveConnection) StartBinlogDumpFromBinlogBeforeTimestamp(ctx context. // Start dumping the logs. The position is '4' to skip the // Binlog File Header. See this page for more info: // https://dev.mysql.com/doc/internals/en/binlog-file.html - if err := sc.Conn.WriteComBinlogDump(sc.slaveID, filename, 4, 0); err != nil { + if err := sc.Conn.WriteComBinlogDump(sc.connID, filename, 4, 0); err != nil { return nil, fmt.Errorf("failed to send the ComBinlogDump command: %v", err) } return sc.streamEvents(ctx), nil } -func (sc *SlaveConnection) findFileBeforeTimestamp(ctx context.Context, timestamp int64) (filename string, err error) { +func (sc *BinlogConnection) findFileBeforeTimestamp(ctx context.Context, timestamp int64) (filename string, err error) { // List the binlogs. binlogs, err := sc.Conn.ExecuteFetch("SHOW BINARY LOGS", 1000, false) if err != nil { @@ -235,14 +235,14 @@ func (sc *SlaveConnection) findFileBeforeTimestamp(ctx context.Context, timestam return "", ErrBinlogUnavailable } -func (sc *SlaveConnection) getBinlogTimeStamp(filename string) (blTimestamp int64, err error) { +func (sc *BinlogConnection) getBinlogTimeStamp(filename string) (blTimestamp int64, err error) { conn, err := connectForReplication(sc.cp) if err != nil { return 0, err } defer conn.Close() - if err := conn.WriteComBinlogDump(sc.slaveID, filename, 4, 0); err != nil { + if err := conn.WriteComBinlogDump(sc.connID, filename, 4, 0); err != nil { return 0, fmt.Errorf("failed to send the ComBinlogDump command: %v", err) } @@ -263,12 +263,12 @@ func (sc *SlaveConnection) getBinlogTimeStamp(filename string) (blTimestamp int6 } } -// Close closes the slave connection, which also signals an ongoing dump +// Close closes the binlog connection, which also signals an ongoing dump // started with StartBinlogDump() to stop and close its BinlogEvent channel. -// The ID for the slave connection is recycled back into the pool. -func (sc *SlaveConnection) Close() { +// The ID for the binlog connection is recycled back into the pool. +func (sc *BinlogConnection) Close() { if sc.Conn != nil { - log.Infof("closing slave socket to unblock reads") + log.Infof("closing binlog socket to unblock reads") sc.Conn.Close() // sc.cancel is set at the beginning of the StartBinlogDump* @@ -276,13 +276,13 @@ func (sc *SlaveConnection) Close() { // Note we also may error out before adding 1 to sc.wg, // but then the Wait() still works. if sc.cancel != nil { - log.Infof("waiting for slave dump thread to end") + log.Infof("waiting for binlog dump thread to end") sc.cancel() sc.wg.Wait() sc.cancel = nil } - log.Infof("closing slave MySQL client with slaveID %v", sc.slaveID) + log.Infof("closing binlog MySQL client with connID %v", sc.connID) sc.Conn = nil } } diff --git a/go/vt/binlog/binlog_streamer.go b/go/vt/binlog/binlog_streamer.go index 0610796d82a..dae07cbb0b0 100644 --- a/go/vt/binlog/binlog_streamer.go +++ b/go/vt/binlog/binlog_streamer.go @@ -129,7 +129,7 @@ type tableCacheEntry struct { pkIndexes []int } -// Streamer streams binlog events from MySQL by connecting as a slave. +// Streamer streams binlog events from MySQL. // A Streamer should only be used once. To start another stream, call // NewStreamer() again. type Streamer struct { @@ -145,7 +145,7 @@ type Streamer struct { sendTransaction sendTransactionFunc usePreviousGTIDs bool - conn *SlaveConnection + conn *BinlogConnection } // NewStreamer creates a binlog Streamer. @@ -182,7 +182,7 @@ func (bls *Streamer) Stream(ctx context.Context) (err error) { log.Infof("stream ended @ %v, err = %v", stopPos, err) }() - if bls.conn, err = NewSlaveConnection(bls.cp); err != nil { + if bls.conn, err = NewBinlogConnection(bls.cp); err != nil { return err } defer bls.conn.Close() diff --git a/go/vt/discovery/legacy_tablet_stats_cache_test.go b/go/vt/discovery/legacy_tablet_stats_cache_test.go index 60cc2a5a695..6b84a780f01 100644 --- a/go/vt/discovery/legacy_tablet_stats_cache_test.go +++ b/go/vt/discovery/legacy_tablet_stats_cache_test.go @@ -236,7 +236,7 @@ func TestLegacyTabletStatsCache(t *testing.T) { t.Errorf("unexpected result: %v", a) } - // add a third tablet as slave in diff cell, same region + // add a third tablet as replica in diff cell, same region tablet3 := topo.NewTablet(12, "cell1", "host3") ts3 := &LegacyTabletStats{ Key: "t3", @@ -257,7 +257,7 @@ func TestLegacyTabletStatsCache(t *testing.T) { t.Errorf("unexpected result: %v", a) } - // add a 4th slave tablet in a diff cell, diff region + // add a 4th replica tablet in a diff cell, diff region tablet4 := topo.NewTablet(13, "cell2", "host4") ts4 := &LegacyTabletStats{ Key: "t4", diff --git a/go/vt/health/health.go b/go/vt/health/health.go index 83f87883079..812fc810cc5 100644 --- a/go/vt/health/health.go +++ b/go/vt/health/health.go @@ -31,11 +31,11 @@ var ( // programs. Use a custom one for tests. DefaultAggregator *Aggregator - // ErrSlaveNotRunning is returned by health plugins when replication + // ErrReplicationNotRunning is returned by health plugins when replication // is not running and we can't figure out the replication delay. // Note everything else should be operational, and the underlying // MySQL instance should be capable of answering queries. - ErrSlaveNotRunning = errors.New("slave is not running") + ErrReplicationNotRunning = errors.New("replication is not running") ) func init() { @@ -46,11 +46,11 @@ func init() { type Reporter interface { // Report returns the replication delay gathered by this // module (or 0 if it thinks it's not behind), assuming that - // it is a slave type or not, and that its query service + // it is a Replication type or not, and that its query service // should be running or not. If Report returns an error it // implies that the tablet is in a bad shape and not able to // handle queries. - Report(isSlaveType, shouldQueryServiceBeRunning bool) (replicationDelay time.Duration, err error) + Report(isReplicaType, shouldQueryServiceBeRunning bool) (replicationDelay time.Duration, err error) // HTMLName returns a displayable name for the module. // Can be used to be displayed in the status page. @@ -61,8 +61,8 @@ type Reporter interface { type FunctionReporter func(bool, bool) (time.Duration, error) // Report implements Reporter.Report -func (fc FunctionReporter) Report(isSlaveType, shouldQueryServiceBeRunning bool) (time.Duration, error) { - return fc(isSlaveType, shouldQueryServiceBeRunning) +func (fc FunctionReporter) Report(isReplicaType, shouldQueryServiceBeRunning bool) (time.Duration, error) { + return fc(isReplicaType, shouldQueryServiceBeRunning) } // HTMLName implements Reporter.HTMLName @@ -97,7 +97,7 @@ type singleResult struct { // The returned replication delay will be the highest of all the replication // delays returned by the Reporter implementations (although typically // only one implementation will actually return a meaningful one). -func (ag *Aggregator) Report(isSlaveType, shouldQueryServiceBeRunning bool) (time.Duration, error) { +func (ag *Aggregator) Report(isReplicaType, shouldQueryServiceBeRunning bool) (time.Duration, error) { wg := sync.WaitGroup{} results := make([]singleResult, len(ag.reporters)) index := 0 @@ -107,7 +107,7 @@ func (ag *Aggregator) Report(isSlaveType, shouldQueryServiceBeRunning bool) (tim go func(index int, name string, rep Reporter) { defer wg.Done() results[index].name = name - results[index].delay, results[index].err = rep.Report(isSlaveType, shouldQueryServiceBeRunning) + results[index].delay, results[index].err = rep.Report(isReplicaType, shouldQueryServiceBeRunning) }(index, name, rep) index++ } @@ -119,10 +119,10 @@ func (ag *Aggregator) Report(isSlaveType, shouldQueryServiceBeRunning bool) (tim var err error for _, s := range results { switch s.err { - case ErrSlaveNotRunning: - // Return the ErrSlaveNotRunning sentinel + case ErrReplicationNotRunning: + // Return the ErrReplicationNotRunning sentinel // value, only if there are no other errors. - err = ErrSlaveNotRunning + err = ErrReplicationNotRunning case nil: if s.delay > result { result = s.delay diff --git a/go/vt/health/health_test.go b/go/vt/health/health_test.go index 309ca8aabe1..e6d6ef9a8a4 100644 --- a/go/vt/health/health_test.go +++ b/go/vt/health/health_test.go @@ -25,7 +25,7 @@ import ( func TestReporters(t *testing.T) { tests := []struct { - isSlaveType bool + isReplicaType bool shouldQueryServiceBeRunning bool delay1 time.Duration delay2 time.Duration @@ -35,7 +35,7 @@ func TestReporters(t *testing.T) { }{ {true, true, 10 * time.Second, 5 * time.Second, nil, 10 * time.Second, false}, {true, false, 10 * time.Second, 5 * time.Second, errors.New("oops"), 0, false}, - {true, false, 10 * time.Second, 5 * time.Second, ErrSlaveNotRunning, 10 * time.Second, true}, + {true, false, 10 * time.Second, 5 * time.Second, ErrReplicationNotRunning, 10 * time.Second, true}, } for _, test := range tests { ag := NewAggregator() @@ -46,10 +46,10 @@ func TestReporters(t *testing.T) { return test.delay2, nil })) ag.RegisterSimpleCheck("simplecheck", func() error { return test.err }) - delay, err := ag.Report(test.isSlaveType, test.shouldQueryServiceBeRunning) + delay, err := ag.Report(test.isReplicaType, test.shouldQueryServiceBeRunning) if delay != test.wantDelay || test.strict && err != test.err || (err == nil) != (test.err == nil) { t.Errorf("ag.Report(%v, %v) = (%v, %v), want (%v, %v)", - test.isSlaveType, test.shouldQueryServiceBeRunning, delay, err, test.wantDelay, test.err) + test.isReplicaType, test.shouldQueryServiceBeRunning, delay, err, test.wantDelay, test.err) } wantHTML := template.HTML("FunctionReporter  +  FunctionReporter  +  simplecheck") if got, want := ag.HTMLName(), wantHTML; got != want { diff --git a/go/vt/mysqlctl/backup.go b/go/vt/mysqlctl/backup.go index 8a7d1dc0577..0bd7f8b1578 100644 --- a/go/vt/mysqlctl/backup.go +++ b/go/vt/mysqlctl/backup.go @@ -52,8 +52,8 @@ const ( ) const ( - // slaveStartDeadline is the deadline for starting a slave - slaveStartDeadline = 30 + // replicationStartDeadline is the deadline for starting replication + replicationStartDeadline = 30 ) var ( @@ -272,7 +272,7 @@ func Restore(ctx context.Context, params RestoreParams) (*BackupManifest, error) } // Since this is an empty database make sure we start replication at the beginning if err := params.Mysqld.ResetReplication(ctx); err != nil { - params.Logger.Errorf("error resetting slave replication: %v. Continuing", err) + params.Logger.Errorf("error resetting replication: %v. Continuing", err) } if err := PopulateMetadataTables(params.Mysqld, params.LocalMetadata, params.DbName); err != nil { diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go index 96dfa0cead0..cc077bb6610 100644 --- a/go/vt/mysqlctl/builtinbackupengine.go +++ b/go/vt/mysqlctl/builtinbackupengine.go @@ -131,23 +131,23 @@ func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, params BackupP params.Logger.Infof("Hook: %v, Compress: %v", *backupStorageHook, *backupStorageCompress) // Save initial state so we can restore. - slaveStartRequired := false + replicaStartRequired := false sourceIsMaster := false readOnly := true //nolint var replicationPosition mysql.Position - semiSyncMaster, semiSyncSlave := params.Mysqld.SemiSyncEnabled() + semiSyncMaster, semiSyncReplica := params.Mysqld.SemiSyncEnabled() // See if we need to restart replication after backup. params.Logger.Infof("getting current replication status") - slaveStatus, err := params.Mysqld.SlaveStatus() + replicaStatus, err := params.Mysqld.ReplicationStatus() switch err { case nil: - slaveStartRequired = slaveStatus.SlaveRunning() - case mysql.ErrNotSlave: + replicaStartRequired = replicaStatus.ReplicationRunning() + case mysql.ErrNotReplica: // keep going if we're the master, might be a degenerate case sourceIsMaster = true default: - return false, vterrors.Wrap(err, "can't get slave status") + return false, vterrors.Wrap(err, "can't get replica status") } // get the read-only flag @@ -169,15 +169,15 @@ func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, params BackupP return false, vterrors.Wrap(err, "can't get master position") } } else { - if err = params.Mysqld.StopSlave(params.HookExtraEnv); err != nil { - return false, vterrors.Wrapf(err, "can't stop slave") + if err = params.Mysqld.StopReplication(params.HookExtraEnv); err != nil { + return false, vterrors.Wrapf(err, "can't stop replica") } - var slaveStatus mysql.SlaveStatus - slaveStatus, err = params.Mysqld.SlaveStatus() + var replicaStatus mysql.ReplicationStatus + replicaStatus, err = params.Mysqld.ReplicationStatus() if err != nil { - return false, vterrors.Wrap(err, "can't get slave status") + return false, vterrors.Wrap(err, "can't get replica status") } - replicationPosition = slaveStatus.Position + replicationPosition = replicaStatus.Position } params.Logger.Infof("using replication position: %v", replicationPosition) @@ -204,28 +204,28 @@ func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, params BackupP } // Restore original mysqld state that we saved above. - if semiSyncMaster || semiSyncSlave { + if semiSyncMaster || semiSyncReplica { // Only do this if one of them was on, since both being off could mean // the plugin isn't even loaded, and the server variables don't exist. - params.Logger.Infof("restoring semi-sync settings from before backup: master=%v, slave=%v", - semiSyncMaster, semiSyncSlave) - err := params.Mysqld.SetSemiSyncEnabled(semiSyncMaster, semiSyncSlave) + params.Logger.Infof("restoring semi-sync settings from before backup: master=%v, replica=%v", + semiSyncMaster, semiSyncReplica) + err := params.Mysqld.SetSemiSyncEnabled(semiSyncMaster, semiSyncReplica) if err != nil { return usable, err } } - if slaveStartRequired { + if replicaStartRequired { params.Logger.Infof("restarting mysql replication") - if err := params.Mysqld.StartSlave(params.HookExtraEnv); err != nil { - return usable, vterrors.Wrap(err, "cannot restart slave") + if err := params.Mysqld.StartReplication(params.HookExtraEnv); err != nil { + return usable, vterrors.Wrap(err, "cannot restart replica") } // this should be quick, but we might as well just wait - if err := WaitForSlaveStart(params.Mysqld, slaveStartDeadline); err != nil { - return usable, vterrors.Wrap(err, "slave is not restarting") + if err := WaitForReplicationStart(params.Mysqld, replicationStartDeadline); err != nil { + return usable, vterrors.Wrap(err, "replica is not restarting") } - // Wait for a reliable value for SecondsBehindMaster from SlaveStatus() + // Wait for a reliable value for SecondsBehindMaster from ReplicationStatus() // We know that we stopped at replicationPosition. // If MasterPosition is the same, that means no writes @@ -247,7 +247,7 @@ func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, params BackupP if err := ctx.Err(); err != nil { return usable, err } - status, err := params.Mysqld.SlaveStatus() + status, err := params.Mysqld.ReplicationStatus() if err != nil { return usable, err } diff --git a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go index 13698524f0d..d9bca3004c2 100644 --- a/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go +++ b/go/vt/mysqlctl/fakemysqldaemon/fakemysqldaemon.go @@ -52,32 +52,32 @@ type FakeMysqlDaemon struct { // return an error. MysqlPort sync2.AtomicInt32 - // Replicating is updated when calling StartSlave / StopSlave - // (it is not used at all when calling SlaveStatus, it is the + // Replicating is updated when calling StartReplication / StopReplication + // (it is not used at all when calling ReplicationStatus, it is the // test owner responsibility to have these two match) Replicating bool - // SlaveIORunning is always true except in one testcase + // IOThreadRunning is always true except in one testcase // where we want to test error handling during SetMaster - SlaveIORunning bool + IOThreadRunning bool // CurrentMasterPosition is returned by MasterPosition - // and SlaveStatus + // and ReplicationStatus CurrentMasterPosition mysql.Position - // SlaveStatusError is used by SlaveStatus - SlaveStatusError error + // ReplicationStatusError is used by ReplicationStatus + ReplicationStatusError error - // StartSlaveError is used by StartSlave - StartSlaveError error + // StartReplicationError is used by StartReplication + StartReplicationError error - // CurrentMasterHost is returned by SlaveStatus + // CurrentMasterHost is returned by ReplicationStatus CurrentMasterHost string - // CurrentMasterport is returned by SlaveStatus + // CurrentMasterport is returned by ReplicationStatus CurrentMasterPort int - // SecondsBehindMaster is returned by SlaveStatus + // SecondsBehindMaster is returned by ReplicationStatus SecondsBehindMaster uint // ReadOnly is the current value of the flag @@ -86,12 +86,12 @@ type FakeMysqlDaemon struct { // SuperReadOnly is the current value of the flag SuperReadOnly bool - // SetSlavePositionPos is matched against the input of SetSlavePosition. - // If it doesn't match, SetSlavePosition will return an error. - SetSlavePositionPos mysql.Position + // SetReplicationPositionPos is matched against the input of SetReplicationPosition. + // If it doesn't match, SetReplicationPosition will return an error. + SetReplicationPositionPos mysql.Position - // StartSlaveUntilAfterPos is matched against the input - StartSlaveUntilAfterPos mysql.Position + // StartReplicationUntilAfterPos is matched against the input + StartReplicationUntilAfterPos mysql.Position // SetMasterInput is matched against the input of SetMaster // (as "%v:%v"). If it doesn't match, SetMaster will return an error. @@ -146,8 +146,8 @@ type FakeMysqlDaemon struct { // SemiSyncMasterEnabled represents the state of rpl_semi_sync_master_enabled. SemiSyncMasterEnabled bool - // SemiSyncSlaveEnabled represents the state of rpl_semi_sync_slave_enabled. - SemiSyncSlaveEnabled bool + // SemiSyncReplicaEnabled represents the state of rpl_semi_sync_slave_enabled. + SemiSyncReplicaEnabled bool // TimeoutHook is a func that can be called at the beginning of any method to fake a timeout. // all a test needs to do is make it { return context.DeadlineExceeded } @@ -159,9 +159,9 @@ type FakeMysqlDaemon struct { // 'db' can be nil if the test doesn't use a database at all. func NewFakeMysqlDaemon(db *fakesqldb.DB) *FakeMysqlDaemon { result := &FakeMysqlDaemon{ - db: db, - Running: true, - SlaveIORunning: true, + db: db, + Running: true, + IOThreadRunning: true, } if db != nil { result.appPool = dbconnpool.NewConnectionPool("AppConnPool", 5, time.Minute, 0) @@ -216,20 +216,20 @@ func (fmd *FakeMysqlDaemon) GetMysqlPort() (int32, error) { return fmd.MysqlPort.Get(), nil } -// SlaveStatus is part of the MysqlDaemon interface -func (fmd *FakeMysqlDaemon) SlaveStatus() (mysql.SlaveStatus, error) { - if fmd.SlaveStatusError != nil { - return mysql.SlaveStatus{}, fmd.SlaveStatusError +// ReplicationStatus is part of the MysqlDaemon interface +func (fmd *FakeMysqlDaemon) ReplicationStatus() (mysql.ReplicationStatus, error) { + if fmd.ReplicationStatusError != nil { + return mysql.ReplicationStatus{}, fmd.ReplicationStatusError } - return mysql.SlaveStatus{ + return mysql.ReplicationStatus{ Position: fmd.CurrentMasterPosition, SecondsBehindMaster: fmd.SecondsBehindMaster, // implemented as AND to avoid changing all tests that were // previously using Replicating = false - SlaveIORunning: fmd.Replicating && fmd.SlaveIORunning, - SlaveSQLRunning: fmd.Replicating, - MasterHost: fmd.CurrentMasterHost, - MasterPort: fmd.CurrentMasterPort, + IOThreadRunning: fmd.Replicating && fmd.IOThreadRunning, + SQLThreadRunning: fmd.Replicating, + MasterHost: fmd.CurrentMasterHost, + MasterPort: fmd.CurrentMasterPort, }, nil } @@ -263,18 +263,18 @@ func (fmd *FakeMysqlDaemon) SetSuperReadOnly(on bool) error { return nil } -// StartSlave is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) StartSlave(hookExtraEnv map[string]string) error { - if fmd.StartSlaveError != nil { - return fmd.StartSlaveError +// StartReplication is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) StartReplication(hookExtraEnv map[string]string) error { + if fmd.StartReplicationError != nil { + return fmd.StartReplicationError } return fmd.ExecuteSuperQueryList(context.Background(), []string{ "START SLAVE", }) } -// RestartSlave is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) RestartSlave(hookExtraEnv map[string]string) error { +// RestartReplication is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) RestartReplication(hookExtraEnv map[string]string) error { return fmd.ExecuteSuperQueryList(context.Background(), []string{ "STOP SLAVE", "RESET SLAVE", @@ -282,10 +282,10 @@ func (fmd *FakeMysqlDaemon) RestartSlave(hookExtraEnv map[string]string) error { }) } -// StartSlaveUntilAfter is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) StartSlaveUntilAfter(ctx context.Context, pos mysql.Position) error { - if !reflect.DeepEqual(fmd.StartSlaveUntilAfterPos, pos) { - return fmt.Errorf("wrong pos for StartSlaveUntilAfter: expected %v got %v", fmd.SetSlavePositionPos, pos) +// StartReplicationUntilAfter is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) StartReplicationUntilAfter(ctx context.Context, pos mysql.Position) error { + if !reflect.DeepEqual(fmd.StartReplicationUntilAfterPos, pos) { + return fmt.Errorf("wrong pos for StartReplicationUntilAfter: expected %v got %v", fmd.SetReplicationPositionPos, pos) } return fmd.ExecuteSuperQueryList(context.Background(), []string{ @@ -293,17 +293,17 @@ func (fmd *FakeMysqlDaemon) StartSlaveUntilAfter(ctx context.Context, pos mysql. }) } -// StopSlave is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) StopSlave(hookExtraEnv map[string]string) error { +// StopReplication is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) StopReplication(hookExtraEnv map[string]string) error { return fmd.ExecuteSuperQueryList(context.Background(), []string{ "STOP SLAVE", }) } -// SetSlavePosition is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) SetSlavePosition(ctx context.Context, pos mysql.Position) error { - if !reflect.DeepEqual(fmd.SetSlavePositionPos, pos) { - return fmt.Errorf("wrong pos for SetSlavePosition: expected %v got %v", fmd.SetSlavePositionPos, pos) +// SetReplicationPosition is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) SetReplicationPosition(ctx context.Context, pos mysql.Position) error { + if !reflect.DeepEqual(fmd.SetReplicationPositionPos, pos) { + return fmt.Errorf("wrong pos for SetReplicationPosition: expected %v got %v", fmd.SetReplicationPositionPos, pos) } return fmd.ExecuteSuperQueryList(ctx, []string{ "FAKE SET SLAVE POSITION", @@ -311,7 +311,7 @@ func (fmd *FakeMysqlDaemon) SetSlavePosition(ctx context.Context, pos mysql.Posi } // SetMaster is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) SetMaster(ctx context.Context, masterHost string, masterPort int, slaveStopBefore bool, slaveStartAfter bool) error { +func (fmd *FakeMysqlDaemon) SetMaster(ctx context.Context, masterHost string, masterPort int, stopReplicationBefore bool, startReplicationAfter bool) error { input := fmt.Sprintf("%v:%v", masterHost, masterPort) if fmd.SetMasterInput != input { return fmt.Errorf("wrong input for SetMasterCommands: expected %v got %v", fmd.SetMasterInput, input) @@ -320,11 +320,11 @@ func (fmd *FakeMysqlDaemon) SetMaster(ctx context.Context, masterHost string, ma return fmd.SetMasterError } cmds := []string{} - if slaveStopBefore { + if stopReplicationBefore { cmds = append(cmds, "STOP SLAVE") } cmds = append(cmds, "FAKE SET MASTER") - if slaveStartAfter { + if startReplicationAfter { cmds = append(cmds, "START SLAVE") } return fmd.ExecuteSuperQueryList(ctx, cmds) @@ -489,17 +489,17 @@ func (fmd *FakeMysqlDaemon) GetAllPrivsConnection(ctx context.Context) (*dbconnp // SetSemiSyncEnabled is part of the MysqlDaemon interface. func (fmd *FakeMysqlDaemon) SetSemiSyncEnabled(master, replica bool) error { fmd.SemiSyncMasterEnabled = master - fmd.SemiSyncSlaveEnabled = replica + fmd.SemiSyncReplicaEnabled = replica return nil } // SemiSyncEnabled is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) SemiSyncEnabled() (master, slave bool) { - return fmd.SemiSyncMasterEnabled, fmd.SemiSyncSlaveEnabled +func (fmd *FakeMysqlDaemon) SemiSyncEnabled() (master, replica bool) { + return fmd.SemiSyncMasterEnabled, fmd.SemiSyncReplicaEnabled } -// SemiSyncSlaveStatus is part of the MysqlDaemon interface. -func (fmd *FakeMysqlDaemon) SemiSyncSlaveStatus() (bool, error) { +// SemiSyncReplicationStatus is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) SemiSyncReplicationStatus() (bool, error) { // The fake assumes the status worked. - return fmd.SemiSyncSlaveEnabled, nil + return fmd.SemiSyncReplicaEnabled, nil } diff --git a/go/vt/mysqlctl/mycnf.go b/go/vt/mysqlctl/mycnf.go index 234618e6d55..af2935a5ec5 100644 --- a/go/vt/mysqlctl/mycnf.go +++ b/go/vt/mysqlctl/mycnf.go @@ -100,10 +100,6 @@ type Mycnf struct { // (unused by vt software for now) TmpDir string - // SlaveLoadTmpDir is where to create tmp files for replication - // (unused by vt software for now) - SlaveLoadTmpDir string - mycnfMap map[string]string path string // the actual path that represents this mycnf } @@ -207,7 +203,6 @@ func ReadMycnf(mycnf *Mycnf) (*Mycnf, error) { "master-info-file": &mycnf.MasterInfoFile, "pid-file": &mycnf.PidFile, "tmpdir": &mycnf.TmpDir, - "slave_load_tmpdir": &mycnf.SlaveLoadTmpDir, } for key, member := range mapping { val, err := mycnf.lookupWithDefault(key, *member) diff --git a/go/vt/mysqlctl/mycnf_gen.go b/go/vt/mysqlctl/mycnf_gen.go index 5a89ebc614b..e2710b51366 100644 --- a/go/vt/mysqlctl/mycnf_gen.go +++ b/go/vt/mysqlctl/mycnf_gen.go @@ -84,7 +84,6 @@ func NewMycnf(tabletUID uint32, mysqlPort int32) *Mycnf { cnf.MasterInfoFile = path.Join(tabletDir, "master.info") cnf.PidFile = path.Join(tabletDir, "mysql.pid") cnf.TmpDir = path.Join(tabletDir, "tmp") - cnf.SlaveLoadTmpDir = cnf.TmpDir return cnf } diff --git a/go/vt/mysqlctl/mysql_daemon.go b/go/vt/mysqlctl/mysql_daemon.go index 6bc5c47cfb9..094f2c4d4c9 100644 --- a/go/vt/mysqlctl/mysql_daemon.go +++ b/go/vt/mysqlctl/mysql_daemon.go @@ -41,14 +41,14 @@ type MysqlDaemon interface { GetMysqlPort() (int32, error) // replication related methods - StartSlave(hookExtraEnv map[string]string) error - RestartSlave(hookExtraEnv map[string]string) error - StartSlaveUntilAfter(ctx context.Context, pos mysql.Position) error - StopSlave(hookExtraEnv map[string]string) error - SlaveStatus() (mysql.SlaveStatus, error) - SetSemiSyncEnabled(master, slave bool) error - SemiSyncEnabled() (master, slave bool) - SemiSyncSlaveStatus() (bool, error) + StartReplication(hookExtraEnv map[string]string) error + RestartReplication(hookExtraEnv map[string]string) error + StartReplicationUntilAfter(ctx context.Context, pos mysql.Position) error + StopReplication(hookExtraEnv map[string]string) error + ReplicationStatus() (mysql.ReplicationStatus, error) + SetSemiSyncEnabled(master, replica bool) error + SemiSyncEnabled() (master, replica bool) + SemiSyncReplicationStatus() (bool, error) // reparenting related methods ResetReplication(ctx context.Context) error @@ -56,8 +56,8 @@ type MysqlDaemon interface { IsReadOnly() (bool, error) SetReadOnly(on bool) error SetSuperReadOnly(on bool) error - SetSlavePosition(ctx context.Context, pos mysql.Position) error - SetMaster(ctx context.Context, masterHost string, masterPort int, slaveStopBefore bool, slaveStartAfter bool) error + SetReplicationPosition(ctx context.Context, pos mysql.Position) error + SetMaster(ctx context.Context, masterHost string, masterPort int, stopReplicationBefore bool, startReplicationAfter bool) error WaitForReparentJournal(ctx context.Context, timeCreatedNS int64) error WaitMasterPos(context.Context, mysql.Position) error diff --git a/go/vt/mysqlctl/reparent.go b/go/vt/mysqlctl/reparent.go index c253443e6bb..c794297b9aa 100644 --- a/go/vt/mysqlctl/reparent.go +++ b/go/vt/mysqlctl/reparent.go @@ -103,7 +103,7 @@ func (mysqld *Mysqld) Promote(hookExtraEnv map[string]string) (mysql.Position, e // Since we handle replication, just stop it. cmds := []string{ - conn.StopSlaveCommand(), + conn.StopReplicationCommand(), "RESET SLAVE ALL", // "ALL" makes it forget master host:port. // When using semi-sync and GTID, a replica first connects to the new master with a given GTID set, // it can take a long time to scan the current binlog file to find the corresponding position. diff --git a/go/vt/mysqlctl/replication.go b/go/vt/mysqlctl/replication.go index 44e8d857316..fc3e7e682e7 100644 --- a/go/vt/mysqlctl/replication.go +++ b/go/vt/mysqlctl/replication.go @@ -37,17 +37,17 @@ import ( "vitess.io/vitess/go/vt/log" ) -// WaitForSlaveStart waits until the deadline for replication to start. +// WaitForReplicationStart waits until the deadline for replication to start. // This validates the current master is correct and can be connected to. -func WaitForSlaveStart(mysqld MysqlDaemon, slaveStartDeadline int) error { +func WaitForReplicationStart(mysqld MysqlDaemon, replicaStartDeadline int) error { var rowMap map[string]string - for slaveWait := 0; slaveWait < slaveStartDeadline; slaveWait++ { - status, err := mysqld.SlaveStatus() + for replicaWait := 0; replicaWait < replicaStartDeadline; replicaWait++ { + status, err := mysqld.ReplicationStatus() if err != nil { return err } - if status.SlaveRunning() { + if status.ReplicationRunning() { return nil } time.Sleep(time.Second) @@ -66,8 +66,8 @@ func WaitForSlaveStart(mysqld MysqlDaemon, slaveStartDeadline int) error { return nil } -// StartSlave starts a slave. -func (mysqld *Mysqld) StartSlave(hookExtraEnv map[string]string) error { +// StartReplication starts replication. +func (mysqld *Mysqld) StartReplication(hookExtraEnv map[string]string) error { ctx := context.TODO() conn, err := getPoolReconnect(ctx, mysqld.dbaPool) if err != nil { @@ -75,7 +75,7 @@ func (mysqld *Mysqld) StartSlave(hookExtraEnv map[string]string) error { } defer conn.Recycle() - if err := mysqld.executeSuperQueryListConn(ctx, conn, []string{conn.StartSlaveCommand()}); err != nil { + if err := mysqld.executeSuperQueryListConn(ctx, conn, []string{conn.StartReplicationCommand()}); err != nil { return err } @@ -84,21 +84,21 @@ func (mysqld *Mysqld) StartSlave(hookExtraEnv map[string]string) error { return h.ExecuteOptional() } -// StartSlaveUntilAfter starts a slave until replication has come to `targetPos`, then it stops replication -func (mysqld *Mysqld) StartSlaveUntilAfter(ctx context.Context, targetPos mysql.Position) error { +// StartReplicationUntilAfter starts replication until replication has come to `targetPos`, then it stops replication +func (mysqld *Mysqld) StartReplicationUntilAfter(ctx context.Context, targetPos mysql.Position) error { conn, err := getPoolReconnect(ctx, mysqld.dbaPool) if err != nil { return err } defer conn.Recycle() - queries := []string{conn.StartSlaveUntilAfterCommand(targetPos)} + queries := []string{conn.StartReplicationUntilAfterCommand(targetPos)} return mysqld.executeSuperQueryListConn(ctx, conn, queries) } -// StopSlave stops a slave. -func (mysqld *Mysqld) StopSlave(hookExtraEnv map[string]string) error { +// StopReplication stops replication. +func (mysqld *Mysqld) StopReplication(hookExtraEnv map[string]string) error { h := hook.NewSimpleHook("preflight_stop_slave") h.ExtraEnv = hookExtraEnv if err := h.ExecuteOptional(); err != nil { @@ -111,11 +111,11 @@ func (mysqld *Mysqld) StopSlave(hookExtraEnv map[string]string) error { } defer conn.Recycle() - return mysqld.executeSuperQueryListConn(ctx, conn, []string{conn.StopSlaveCommand()}) + return mysqld.executeSuperQueryListConn(ctx, conn, []string{conn.StopReplicationCommand()}) } -// RestartSlave stops, resets and starts a slave. -func (mysqld *Mysqld) RestartSlave(hookExtraEnv map[string]string) error { +// RestartReplication stops, resets and starts replication. +func (mysqld *Mysqld) RestartReplication(hookExtraEnv map[string]string) error { h := hook.NewSimpleHook("preflight_stop_slave") h.ExtraEnv = hookExtraEnv if err := h.ExecuteOptional(); err != nil { @@ -128,7 +128,7 @@ func (mysqld *Mysqld) RestartSlave(hookExtraEnv map[string]string) error { } defer conn.Recycle() - if err := mysqld.executeSuperQueryListConn(ctx, conn, conn.RestartSlaveCommands()); err != nil { + if err := mysqld.executeSuperQueryListConn(ctx, conn, conn.RestartReplicationCommands()); err != nil { return err } @@ -195,7 +195,7 @@ func (mysqld *Mysqld) SetSuperReadOnly(on bool) error { return mysqld.ExecuteSuperQuery(context.TODO(), query) } -// WaitMasterPos lets slaves wait to given replication position +// WaitMasterPos lets replicas wait to given replication position func (mysqld *Mysqld) WaitMasterPos(ctx context.Context, targetPos mysql.Position) error { // Get a connection. conn, err := getPoolReconnect(ctx, mysqld.dbaPool) @@ -237,15 +237,15 @@ func (mysqld *Mysqld) WaitMasterPos(ctx context.Context, targetPos mysql.Positio return nil } -// SlaveStatus returns the slave replication statuses -func (mysqld *Mysqld) SlaveStatus() (mysql.SlaveStatus, error) { +// ReplicationStatus returns the server replication status +func (mysqld *Mysqld) ReplicationStatus() (mysql.ReplicationStatus, error) { conn, err := getPoolReconnect(context.TODO(), mysqld.dbaPool) if err != nil { - return mysql.SlaveStatus{}, err + return mysql.ReplicationStatus{}, err } defer conn.Recycle() - return conn.ShowSlaveStatus() + return conn.ShowReplicationStatus() } // MasterPosition returns the master replication position. @@ -259,23 +259,23 @@ func (mysqld *Mysqld) MasterPosition() (mysql.Position, error) { return conn.MasterPosition() } -// SetSlavePosition sets the replication position at which the slave will resume +// SetReplicationPosition sets the replication position at which the replica will resume // when its replication is started. -func (mysqld *Mysqld) SetSlavePosition(ctx context.Context, pos mysql.Position) error { +func (mysqld *Mysqld) SetReplicationPosition(ctx context.Context, pos mysql.Position) error { conn, err := getPoolReconnect(ctx, mysqld.dbaPool) if err != nil { return err } defer conn.Recycle() - cmds := conn.SetSlavePositionCommands(pos) - log.Infof("Executing commands to set slave position: %v", cmds) + cmds := conn.SetReplicationPositionCommands(pos) + log.Infof("Executing commands to set replication position: %v", cmds) return mysqld.executeSuperQueryListConn(ctx, conn, cmds) } // SetMaster makes the provided host / port the master. It optionally // stops replication before, and starts it after. -func (mysqld *Mysqld) SetMaster(ctx context.Context, masterHost string, masterPort int, slaveStopBefore bool, slaveStartAfter bool) error { +func (mysqld *Mysqld) SetMaster(ctx context.Context, masterHost string, masterPort int, replicationStopBefore bool, replicationStartAfter bool) error { params, err := mysqld.dbcfgs.ReplConnector().MysqlParams() if err != nil { return err @@ -287,13 +287,13 @@ func (mysqld *Mysqld) SetMaster(ctx context.Context, masterHost string, masterPo defer conn.Recycle() cmds := []string{} - if slaveStopBefore { - cmds = append(cmds, conn.StopSlaveCommand()) + if replicationStopBefore { + cmds = append(cmds, conn.StopReplicationCommand()) } smc := conn.SetMasterCommand(params, masterHost, masterPort, int(masterConnectRetry.Seconds())) cmds = append(cmds, smc) - if slaveStartAfter { - cmds = append(cmds, conn.StartSlaveCommand()) + if replicationStartAfter { + cmds = append(cmds, conn.StartReplicationCommand()) } return mysqld.executeSuperQueryListConn(ctx, conn, cmds) } @@ -327,12 +327,12 @@ const ( ) const ( - // this is the command used by mysql slaves + // this is the command used by mysql replicas binlogDumpCommand = "Binlog Dump" ) -// FindSlaves gets IP addresses for all currently connected slaves. -func FindSlaves(mysqld MysqlDaemon) ([]string, error) { +// FindReplicas gets IP addresses for all currently connected replicas. +func FindReplicas(mysqld MysqlDaemon) ([]string, error) { qr, err := mysqld.FetchSuperQuery(context.TODO(), "SHOW PROCESSLIST") if err != nil { return nil, err @@ -351,12 +351,12 @@ func FindSlaves(mysqld MysqlDaemon) ([]string, error) { } host, _, err = netutil.SplitHostPort(host) if err != nil { - return nil, fmt.Errorf("FindSlaves: malformed addr %v", err) + return nil, fmt.Errorf("FindReplicas: malformed addr %v", err) } var ips []string ips, err = net.LookupHost(host) if err != nil { - return nil, fmt.Errorf("FindSlaves: LookupHost failed %v", err) + return nil, fmt.Errorf("FindReplicas: LookupHost failed %v", err) } addrs = append(addrs, ips...) } @@ -414,16 +414,16 @@ func (mysqld *Mysqld) DisableBinlogPlayback() error { } // SetSemiSyncEnabled enables or disables semi-sync replication for -// master and/or slave mode. -func (mysqld *Mysqld) SetSemiSyncEnabled(master, slave bool) error { - log.Infof("Setting semi-sync mode: master=%v, slave=%v", master, slave) +// master and/or replica mode. +func (mysqld *Mysqld) SetSemiSyncEnabled(master, replica bool) error { + log.Infof("Setting semi-sync mode: master=%v, replica=%v", master, replica) // Convert bool to int. var m, s int if master { m = 1 } - if slave { + if replica { s = 1 } @@ -436,20 +436,20 @@ func (mysqld *Mysqld) SetSemiSyncEnabled(master, slave bool) error { return nil } -// SemiSyncEnabled returns whether semi-sync is enabled for master or slave. +// SemiSyncEnabled returns whether semi-sync is enabled for master or replica. // If the semi-sync plugin is not loaded, we assume semi-sync is disabled. -func (mysqld *Mysqld) SemiSyncEnabled() (master, slave bool) { +func (mysqld *Mysqld) SemiSyncEnabled() (master, replica bool) { vars, err := mysqld.fetchVariables(context.TODO(), "rpl_semi_sync_%_enabled") if err != nil { return false, false } master = (vars["rpl_semi_sync_master_enabled"] == "ON") - slave = (vars["rpl_semi_sync_slave_enabled"] == "ON") - return master, slave + replica = (vars["rpl_semi_sync_slave_enabled"] == "ON") + return master, replica } -// SemiSyncSlaveStatus returns whether semi-sync is currently used by replication. -func (mysqld *Mysqld) SemiSyncSlaveStatus() (bool, error) { +// SemiSyncReplicationStatus returns whether semi-sync is currently used by replication. +func (mysqld *Mysqld) SemiSyncReplicationStatus() (bool, error) { qr, err := mysqld.FetchSuperQuery(context.TODO(), "SHOW STATUS LIKE 'rpl_semi_sync_slave_status'") if err != nil { return false, err diff --git a/go/vt/mysqlctl/rice-box.go b/go/vt/mysqlctl/rice-box.go index a2d0378ebed..aa27d436eff 100644 --- a/go/vt/mysqlctl/rice-box.go +++ b/go/vt/mysqlctl/rice-box.go @@ -11,91 +11,97 @@ func init() { // define files file2 := &embedded.EmbeddedFile{ Filename: "gomysql.pc.tmpl", - FileModTime: time.Unix(1562782645, 0), + FileModTime: time.Unix(1539121419, 0), Content: string("Name: GoMysql\nDescription: Flags for using mysql C client in go\n"), } file3 := &embedded.EmbeddedFile{ Filename: "init_db.sql", - FileModTime: time.Unix(1578077737, 0), + FileModTime: time.Unix(1593186461, 0), Content: string("# This file is executed immediately after mysql_install_db,\n# to initialize a fresh data directory.\n\n###############################################################################\n# WARNING: This sql is *NOT* safe for production use,\n# as it contains default well-known users and passwords.\n# Care should be taken to change these users and passwords\n# for production.\n###############################################################################\n\n###############################################################################\n# Equivalent of mysql_secure_installation\n###############################################################################\n\n# Changes during the init db should not make it to the binlog.\n# They could potentially create errant transactions on replicas.\nSET sql_log_bin = 0;\n# Remove anonymous users.\nDELETE FROM mysql.user WHERE User = '';\n\n# Disable remote root access (only allow UNIX socket).\nDELETE FROM mysql.user WHERE User = 'root' AND Host != 'localhost';\n\n# Remove test database.\nDROP DATABASE IF EXISTS test;\n\n###############################################################################\n# Vitess defaults\n###############################################################################\n\n# Vitess-internal database.\nCREATE DATABASE IF NOT EXISTS _vt;\n# Note that definitions of local_metadata and shard_metadata should be the same\n# as in production which is defined in go/vt/mysqlctl/metadata_tables.go.\nCREATE TABLE IF NOT EXISTS _vt.local_metadata (\n name VARCHAR(255) NOT NULL,\n value VARCHAR(255) NOT NULL,\n db_name VARBINARY(255) NOT NULL,\n PRIMARY KEY (db_name, name)\n ) ENGINE=InnoDB;\nCREATE TABLE IF NOT EXISTS _vt.shard_metadata (\n name VARCHAR(255) NOT NULL,\n value MEDIUMBLOB NOT NULL,\n db_name VARBINARY(255) NOT NULL,\n PRIMARY KEY (db_name, name)\n ) ENGINE=InnoDB;\n\n# Admin user with all privileges.\nCREATE USER 'vt_dba'@'localhost';\nGRANT ALL ON *.* TO 'vt_dba'@'localhost';\nGRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost';\n\n# User for app traffic, with global read-write access.\nCREATE USER 'vt_app'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_app'@'localhost';\n\n# User for app debug traffic, with global read access.\nCREATE USER 'vt_appdebug'@'localhost';\nGRANT SELECT, SHOW DATABASES, PROCESS ON *.* TO 'vt_appdebug'@'localhost';\n\n# User for administrative operations that need to be executed as non-SUPER.\n# Same permissions as vt_app here.\nCREATE USER 'vt_allprivs'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_allprivs'@'localhost';\n\n# User for slave replication connections.\nCREATE USER 'vt_repl'@'%';\nGRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%';\n\n# User for Vitess filtered replication (binlog player).\n# Same permissions as vt_app.\nCREATE USER 'vt_filtered'@'localhost';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE,\n REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,\n LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,\n SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER\n ON *.* TO 'vt_filtered'@'localhost';\n\n# User for general MySQL monitoring.\nCREATE USER 'vt_monitoring'@'localhost';\nGRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD\n ON *.* TO 'vt_monitoring'@'localhost';\nGRANT SELECT, UPDATE, DELETE, DROP\n ON performance_schema.* TO 'vt_monitoring'@'localhost';\n\n# User for Orchestrator (https://github.com/openark/orchestrator).\nCREATE USER 'orc_client_user'@'%' IDENTIFIED BY 'orc_client_user_password';\nGRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD\n ON *.* TO 'orc_client_user'@'%';\nGRANT SELECT\n ON _vt.* TO 'orc_client_user'@'%';\n\nFLUSH PRIVILEGES;\n\nRESET SLAVE ALL;\nRESET MASTER;\n"), } file5 := &embedded.EmbeddedFile{ Filename: "mycnf/default-fast.cnf", - FileModTime: time.Unix(1579019392, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This sets some unsafe settings specifically for \n# the test-suite which is currently MySQL 5.7 based\n# In future it should be renamed testsuite.cnf\n\ninnodb_buffer_pool_size = 32M\ninnodb_flush_log_at_trx_commit = 0\ninnodb_log_buffer_size = 1M\ninnodb_log_file_size = 5M\n\n# Native AIO tends to run into aio-max-nr limit during test startup.\ninnodb_use_native_aio = 0\n\nkey_buffer_size = 2M\nsync_binlog=0\ninnodb_doublewrite=0\n\n# These two settings are required for the testsuite to pass, \n# but enabling them does not spark joy. They should be removed\n# in the future. See:\n# https://github.com/vitessio/vitess/issues/5396\n\nsql_mode = STRICT_TRANS_TABLES\n"), } file6 := &embedded.EmbeddedFile{ Filename: "mycnf/default.cnf", - FileModTime: time.Unix(1579632282, 0), + FileModTime: time.Unix(1593393697, 0), - Content: string("# Global configuration that is auto-included for all MySQL/MariaDB versions\n\ndatadir = {{.DataDir}}\ninnodb_data_home_dir = {{.InnodbDataHomeDir}}\ninnodb_log_group_home_dir = {{.InnodbLogGroupHomeDir}}\nlog-error = {{.ErrorLogPath}}\nlog-bin = {{.BinLogPath}}\nrelay-log = {{.RelayLogPath}}\nrelay-log-index = {{.RelayLogIndexPath}}\npid-file = {{.PidFile}}\nport = {{.MysqlPort}}\n\n# all db instances should start in read-only mode - once the db is started and\n# fully functional, we'll push it into read-write mode\nread-only\nserver-id = {{.ServerID}}\n\n# all db instances should skip the slave startup - that way we can do any\n# additional configuration (like enabling semi-sync) before we connect to\n# the master.\nskip_slave_start\nslave_load_tmpdir = {{.SlaveLoadTmpDir}}\nsocket = {{.SocketFile}}\ntmpdir = {{.TmpDir}}\n\nslow-query-log-file = {{.SlowLogPath}}\n\n# These are sensible defaults that apply to all MySQL/MariaDB versions\n\nlong_query_time = 2\nslow-query-log\nskip-name-resolve\nconnect_timeout = 30\ninnodb_lock_wait_timeout = 20\nmax_allowed_packet = 64M\nmax_connections = 500\n\n\n"), + Content: string("# Global configuration that is auto-included for all MySQL/MariaDB versions\n\ndatadir = {{.DataDir}}\ninnodb_data_home_dir = {{.InnodbDataHomeDir}}\ninnodb_log_group_home_dir = {{.InnodbLogGroupHomeDir}}\nlog-error = {{.ErrorLogPath}}\nlog-bin = {{.BinLogPath}}\nrelay-log = {{.RelayLogPath}}\nrelay-log-index = {{.RelayLogIndexPath}}\npid-file = {{.PidFile}}\nport = {{.MysqlPort}}\n\n# all db instances should start in read-only mode - once the db is started and\n# fully functional, we'll push it into read-write mode\nread-only\nserver-id = {{.ServerID}}\n\n# all db instances should skip the slave startup - that way we can do any\n# additional configuration (like enabling semi-sync) before we connect to\n# the master.\nskip_slave_start\nsocket = {{.SocketFile}}\ntmpdir = {{.TmpDir}}\n\nslow-query-log-file = {{.SlowLogPath}}\n\n# These are sensible defaults that apply to all MySQL/MariaDB versions\n\nlong_query_time = 2\nslow-query-log\nskip-name-resolve\nconnect_timeout = 30\ninnodb_lock_wait_timeout = 20\nmax_allowed_packet = 64M\nmax_connections = 500\n\n\n"), } file7 := &embedded.EmbeddedFile{ Filename: "mycnf/master_mariadb100.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MariaDB 10.0 is detected.\n\n# Semi-sync replication is required for automated unplanned failover\n# (when the master goes away). Here we just load the plugin so it's\n# available if desired, but it's disabled at startup.\n#\n# If the -enable_semi_sync flag is used, VTTablet will enable semi-sync\n# at the proper time when replication is set up, or when masters are\n# promoted or demoted.\nplugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so\n\nslave_net_timeout = 60\n\n# MariaDB 10.0 is unstrict by default\nsql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION\n\n# enable strict mode so it's safe to compare sequence numbers across different server IDs.\ngtid_strict_mode = 1\ninnodb_stats_persistent = 0\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\nexpire_logs_days = 3\n\nsync_binlog = 1\nbinlog_format = ROW\nlog_slave_updates\nexpire_logs_days = 3\n\n# In MariaDB the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\n"), } file8 := &embedded.EmbeddedFile{ Filename: "mycnf/master_mariadb101.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MariaDB 10.1 is detected.\n\n# Semi-sync replication is required for automated unplanned failover\n# (when the master goes away). Here we just load the plugin so it's\n# available if desired, but it's disabled at startup.\n#\n# If the -enable_semi_sync flag is used, VTTablet will enable semi-sync\n# at the proper time when replication is set up, or when masters are\n# promoted or demoted.\nplugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so\n\nslave_net_timeout = 60\n\n# MariaDB 10.1 default is only no-engine-substitution and no-auto-create-user\nsql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER\n\n# enable strict mode so it's safe to compare sequence numbers across different server IDs.\ngtid_strict_mode = 1\ninnodb_stats_persistent = 0\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\nexpire_logs_days = 3\n\nsync_binlog = 1\nbinlog_format = ROW\nlog_slave_updates\nexpire_logs_days = 3\n\n# In MariaDB the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n"), } file9 := &embedded.EmbeddedFile{ Filename: "mycnf/master_mariadb102.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MariaDB 10.2 is detected.\n\n# Semi-sync replication is required for automated unplanned failover\n# (when the master goes away). Here we just load the plugin so it's\n# available if desired, but it's disabled at startup.\n#\n# If the -enable_semi_sync flag is used, VTTablet will enable semi-sync\n# at the proper time when replication is set up, or when masters are\n# promoted or demoted.\nplugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so\n\n# enable strict mode so it's safe to compare sequence numbers across different server IDs.\ngtid_strict_mode = 1\ninnodb_stats_persistent = 0\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\nexpire_logs_days = 3\n\nsync_binlog = 1\nbinlog_format = ROW\nlog_slave_updates\nexpire_logs_days = 3\n\n# In MariaDB the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n"), } filea := &embedded.EmbeddedFile{ Filename: "mycnf/master_mariadb103.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MariaDB 10.3 is detected.\n\n# enable strict mode so it's safe to compare sequence numbers across different server IDs.\ngtid_strict_mode = 1\ninnodb_stats_persistent = 0\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\nexpire_logs_days = 3\n\nsync_binlog = 1\nbinlog_format = ROW\nlog_slave_updates\nexpire_logs_days = 3\n\n# In MariaDB the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\n\n"), } fileb := &embedded.EmbeddedFile{ Filename: "mycnf/master_mariadb104.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MariaDB 10.4 is detected.\n\n# enable strict mode so it's safe to compare sequence numbers across different server IDs.\ngtid_strict_mode = 1\ninnodb_stats_persistent = 0\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\nexpire_logs_days = 3\n\nsync_binlog = 1\nbinlog_format = ROW\nlog_slave_updates\nexpire_logs_days = 3\n\n# In MariaDB the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\n\n"), } filec := &embedded.EmbeddedFile{ Filename: "mycnf/master_mysql56.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MySQL 5.6 is detected.\n\n# MySQL 5.6 does not enable the binary log by default, and \n# the default for sync_binlog is unsafe. The format is TABLE, and\n# info repositories also default to file.\n\nsync_binlog = 1\ngtid_mode = ON\nbinlog_format = ROW\nlog_slave_updates\nenforce_gtid_consistency\nexpire_logs_days = 3\nmaster_info_repository = TABLE\nrelay_log_info_repository = TABLE\nrelay_log_purge = 1\nrelay_log_recovery = 1\nslave_net_timeout = 60\n\n# In MySQL 5.6 the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\n# MySQL 5.6 is unstrict by default\nsql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION\n\n# Semi-sync replication is required for automated unplanned failover\n# (when the master goes away). Here we just load the plugin so it's\n# available if desired, but it's disabled at startup.\n#\n# If the -enable_semi_sync flag is used, VTTablet will enable semi-sync\n# at the proper time when replication is set up, or when masters are\n# promoted or demoted.\nplugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n"), } filed := &embedded.EmbeddedFile{ Filename: "mycnf/master_mysql57.cnf", - FileModTime: time.Unix(1579019403, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MySQL 5.7 is detected.\n\n# MySQL 5.7 does not enable the binary log by default, and \n# info repositories default to file\n\ngtid_mode = ON\nlog_slave_updates\nenforce_gtid_consistency\nexpire_logs_days = 3\nmaster_info_repository = TABLE\nrelay_log_info_repository = TABLE\nrelay_log_purge = 1\nrelay_log_recovery = 1\n\n# In MySQL 5.7 the default charset is latin1\n\ncharacter_set_server = utf8\ncollation_server = utf8_general_ci\n\n# Semi-sync replication is required for automated unplanned failover\n# (when the master goes away). Here we just load the plugin so it's\n# available if desired, but it's disabled at startup.\n#\n# If the -enable_semi_sync flag is used, VTTablet will enable semi-sync\n# at the proper time when replication is set up, or when masters are\n# promoted or demoted.\nplugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so\n\n# When semi-sync is enabled, don't allow fallback to async\n# if you get no ack, or have no slaves. This is necessary to\n# prevent alternate futures when doing a failover in response to\n# a master that becomes unresponsive.\nrpl_semi_sync_master_timeout = 1000000000000000000\nrpl_semi_sync_master_wait_no_slave = 1\n\n"), } filee := &embedded.EmbeddedFile{ Filename: "mycnf/master_mysql80.cnf", - FileModTime: time.Unix(1578945496, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is auto-included when MySQL 8.0 is detected.\n\n# MySQL 8.0 enables binlog by default with sync_binlog and TABLE info repositories\n# It does not enable GTIDs or enforced GTID consistency\n\ngtid_mode = ON\nenforce_gtid_consistency\nrelay_log_recovery = 1\nbinlog_expire_logs_seconds = 259200\n\n# disable mysqlx\nmysqlx = 0\n\n# 8.0 changes the default auth-plugin to caching_sha2_password\ndefault_authentication_plugin = mysql_native_password\n\n# Semi-sync replication is required for automated unplanned failover\n# (when the master goes away). Here we just load the plugin so it's\n# available if desired, but it's disabled at startup.\n#\n# If the -enable_semi_sync flag is used, VTTablet will enable semi-sync\n# at the proper time when replication is set up, or when masters are\n# promoted or demoted.\nplugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so\n\n# MySQL 8.0 will not load plugins during --initialize\n# which makes these options unknown. Prefixing with --loose\n# tells the server it's fine if they are not understood.\nloose_rpl_semi_sync_master_timeout = 1000000000000000000\nloose_rpl_semi_sync_master_wait_no_slave = 1\n\n"), } filef := &embedded.EmbeddedFile{ Filename: "mycnf/sbr.cnf", - FileModTime: time.Unix(1579019392, 0), + FileModTime: time.Unix(1590017750, 0), Content: string("# This file is used to allow legacy tests to pass\n# In theory it should not be required\nbinlog_format=statement\n"), } - fileg := &embedded.EmbeddedFile{ + fileh := &embedded.EmbeddedFile{ + Filename: "tablet/default.yaml", + FileModTime: time.Unix(1590017750, 0), + + Content: string("tabletID: zone-1234\n\ninit:\n dbName: # init_db_name_override\n keyspace: # init_keyspace\n shard: # init_shard\n tabletType: # init_tablet_type\n timeoutSeconds: 60 # init_timeout\n\ndb:\n socket: # db_socket\n host: # db_host\n port: 0 # db_port\n charSet: # db_charset\n flags: 0 # db_flags\n flavor: # db_flavor\n sslCa: # db_ssl_ca\n sslCaPath: # db_ssl_ca_path\n sslCert: # db_ssl_cert\n sslKey: # db_ssl_key\n serverName: # db_server_name\n connectTimeoutMilliseconds: 0 # db_connect_timeout_ms\n app:\n user: vt_app # db_app_user\n password: # db_app_password\n useSsl: true # db_app_use_ssl\n preferTcp: false\n dba:\n user: vt_dba # db_dba_user\n password: # db_dba_password\n useSsl: true # db_dba_use_ssl\n preferTcp: false\n filtered:\n user: vt_filtered # db_filtered_user\n password: # db_filtered_password\n useSsl: true # db_filtered_use_ssl\n preferTcp: false\n repl:\n user: vt_repl # db_repl_user\n password: # db_repl_password\n useSsl: true # db_repl_use_ssl\n preferTcp: false\n appdebug:\n user: vt_appdebug # db_appdebug_user\n password: # db_appdebug_password\n useSsl: true # db_appdebug_use_ssl\n preferTcp: false\n allprivs:\n user: vt_allprivs # db_allprivs_user\n password: # db_allprivs_password\n useSsl: true # db_allprivs_use_ssl\n preferTcp: false\n\noltpReadPool:\n size: 16 # queryserver-config-pool-size\n timeoutSeconds: 0 # queryserver-config-query-pool-timeout\n idleTimeoutSeconds: 1800 # queryserver-config-idle-timeout\n prefillParallelism: 0 # queryserver-config-pool-prefill-parallelism\n maxWaiters: 50000 # queryserver-config-query-pool-waiter-cap\n\nolapReadPool:\n size: 200 # queryserver-config-stream-pool-size\n timeoutSeconds: 0 # queryserver-config-query-pool-timeout\n idleTimeoutSeconds: 1800 # queryserver-config-idle-timeout\n prefillParallelism: 0 # queryserver-config-stream-pool-prefill-parallelism\n maxWaiters: 0\n\ntxPool:\n size: 20 # queryserver-config-transaction-cap\n timeoutSeconds: 1 # queryserver-config-txpool-timeout\n idleTimeoutSeconds: 1800 # queryserver-config-idle-timeout\n prefillParallelism: 0 # queryserver-config-transaction-prefill-parallelism\n maxWaiters: 50000 # queryserver-config-txpool-waiter-cap\n\noltp:\n queryTimeoutSeconds: 30 # queryserver-config-query-timeout\n txTimeoutSeconds: 30 # queryserver-config-transaction-timeout\n maxRows: 10000 # queryserver-config-max-result-size\n warnRows: 0 # queryserver-config-warn-result-size\n\nhotRowProtection:\n mode: disable|dryRun|enable # enable_hot_row_protection, enable_hot_row_protection_dry_run\n # Default value is same as txPool.size.\n maxQueueSize: 20 # hot_row_protection_max_queue_size\n maxGlobalQueueSize: 1000 # hot_row_protection_max_global_queue_size\n maxConcurrency: 5 # hot_row_protection_concurrent_transactions\n\nconsolidator: enable|disable|notOnMaster # enable-consolidator, enable-consolidator-replicas\nheartbeatIntervalMilliseconds: 0 # heartbeat_enable, heartbeat_interval\nshutdownGracePeriodSeconds: 0 # transaction_shutdown_grace_period\npassthroughDML: false # queryserver-config-passthrough-dmls\nstreamBufferSize: 32768 # queryserver-config-stream-buffer-size\nqueryCacheSize: 5000 # queryserver-config-query-cache-size\nschemaReloadIntervalSeconds: 1800 # queryserver-config-schema-reload-time\nwatchReplication: false # watch_replication_stream\nterseErrors: false # queryserver-config-terse-errors\nmessagePostponeParallelism: 4 # queryserver-config-message-postpone-cap\ncacheResultFields: true # enable-query-plan-field-caching\n\n\n# The following flags are currently not supported.\n# enforce_strict_trans_tables\n# queryserver-config-strict-table-acl\n# queryserver-config-enable-table-acl-dry-run\n# queryserver-config-acl-exempt-acl\n# enable-tx-throttler\n# tx-throttler-config\n# tx-throttler-healthcheck-cells\n# enable_transaction_limit\n# enable_transaction_limit_dry_run\n# transaction_limit_per_user\n# transaction_limit_by_username\n# transaction_limit_by_principal\n# transaction_limit_by_component\n# transaction_limit_by_subcomponent\n"), + } + filei := &embedded.EmbeddedFile{ Filename: "zk-client-dev.json", - FileModTime: time.Unix(1562782645, 0), + FileModTime: time.Unix(1539121419, 0), Content: string("{\n \"local\": \"localhost:3863\",\n \"global\": \"localhost:3963\"\n}\n"), } - filei := &embedded.EmbeddedFile{ + filek := &embedded.EmbeddedFile{ Filename: "zkcfg/zoo.cfg", - FileModTime: time.Unix(1562782645, 0), + FileModTime: time.Unix(1539121419, 0), Content: string("tickTime=2000\ndataDir={{.DataDir}}\nclientPort={{.ClientPort}}\ninitLimit=5\nsyncLimit=2\nmaxClientCnxns=0\n{{range .Servers}}\nserver.{{.ServerId}}={{.Hostname}}:{{.LeaderPort}}:{{.ElectionPort}}\n{{end}}\n"), } @@ -103,17 +109,17 @@ func init() { // define dirs dir1 := &embedded.EmbeddedDir{ Filename: "", - DirModTime: time.Unix(1578267519, 0), + DirModTime: time.Unix(1593186461, 0), ChildFiles: []*embedded.EmbeddedFile{ file2, // "gomysql.pc.tmpl" file3, // "init_db.sql" - fileg, // "zk-client-dev.json" + filei, // "zk-client-dev.json" }, } dir4 := &embedded.EmbeddedDir{ Filename: "mycnf", - DirModTime: time.Unix(1579632282, 0), + DirModTime: time.Unix(1593393697, 0), ChildFiles: []*embedded.EmbeddedFile{ file5, // "mycnf/default-fast.cnf" file6, // "mycnf/default.cnf" @@ -129,11 +135,19 @@ func init() { }, } - dirh := &embedded.EmbeddedDir{ + dirg := &embedded.EmbeddedDir{ + Filename: "tablet", + DirModTime: time.Unix(1590017750, 0), + ChildFiles: []*embedded.EmbeddedFile{ + fileh, // "tablet/default.yaml" + + }, + } + dirj := &embedded.EmbeddedDir{ Filename: "zkcfg", - DirModTime: time.Unix(1578087479, 0), + DirModTime: time.Unix(1539121419, 0), ChildFiles: []*embedded.EmbeddedFile{ - filei, // "zkcfg/zoo.cfg" + filek, // "zkcfg/zoo.cfg" }, } @@ -141,20 +155,23 @@ func init() { // link ChildDirs dir1.ChildDirs = []*embedded.EmbeddedDir{ dir4, // "mycnf" - dirh, // "zkcfg" + dirg, // "tablet" + dirj, // "zkcfg" } dir4.ChildDirs = []*embedded.EmbeddedDir{} - dirh.ChildDirs = []*embedded.EmbeddedDir{} + dirg.ChildDirs = []*embedded.EmbeddedDir{} + dirj.ChildDirs = []*embedded.EmbeddedDir{} // register embeddedBox embedded.RegisterEmbeddedBox(`../../../config`, &embedded.EmbeddedBox{ Name: `../../../config`, - Time: time.Unix(1578267519, 0), + Time: time.Unix(1593186461, 0), Dirs: map[string]*embedded.EmbeddedDir{ - "": dir1, - "mycnf": dir4, - "zkcfg": dirh, + "": dir1, + "mycnf": dir4, + "tablet": dirg, + "zkcfg": dirj, }, Files: map[string]*embedded.EmbeddedFile{ "gomysql.pc.tmpl": file2, @@ -170,8 +187,9 @@ func init() { "mycnf/master_mysql57.cnf": filed, "mycnf/master_mysql80.cnf": filee, "mycnf/sbr.cnf": filef, - "zk-client-dev.json": fileg, - "zkcfg/zoo.cfg": filei, + "tablet/default.yaml": fileh, + "zk-client-dev.json": filei, + "zkcfg/zoo.cfg": filek, }, }) } diff --git a/go/vt/mysqlctl/tmutils/permissions.go b/go/vt/mysqlctl/tmutils/permissions.go index 8042e6d7a7a..0f340a0d6af 100644 --- a/go/vt/mysqlctl/tmutils/permissions.go +++ b/go/vt/mysqlctl/tmutils/permissions.go @@ -71,7 +71,7 @@ func NewUserPermission(fields []*querypb.Field, values []sqltypes.Value) *tablet up.PasswordChecksum = crc64.Checksum(values[i].ToBytes(), hashTable) case "password_last_changed": // we skip this one, as the value may be - // different on master and slaves. + // different on master and replicas. default: up.Privileges[field.Name] = values[i].ToString() } diff --git a/go/vt/mysqlctl/xtrabackupengine.go b/go/vt/mysqlctl/xtrabackupengine.go index bfe6448fe42..9da4d74369c 100644 --- a/go/vt/mysqlctl/xtrabackupengine.go +++ b/go/vt/mysqlctl/xtrabackupengine.go @@ -394,7 +394,7 @@ func (be *XtrabackupEngine) ExecuteRestore(ctx context.Context, params RestorePa // don't delete the file here because that is how we detect an interrupted restore return nil, err } - // now find the slave position and return that + // now find the replication position and return that params.Logger.Infof("Restore: returning replication position %v", bm.Position) return &bm.BackupManifest, nil } diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index bcebfe710cf..ceee1925057 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -3885,8 +3885,8 @@ type RealtimeStats struct { // or empty is the server is healthy. This is used for subset selection, // we do not send queries to servers that are not healthy. HealthError string `protobuf:"bytes,1,opt,name=health_error,json=healthError,proto3" json:"health_error,omitempty"` - // seconds_behind_master is populated for slaves only. It indicates - // how far behind on (MySQL) replication a slave currently is. It is used + // seconds_behind_master is populated for replicas only. It indicates + // how far behind on (MySQL) replication a replica currently is. It is used // by clients for subset selection (so we don't try to send traffic // to tablets that are too far behind). // NOTE: This field must not be evaluated if "health_error" is not empty. diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index 457086d8f36..dfe2c9433f0 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -21,21 +21,21 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package -// Status is the replication status for MySQL (returned by 'show slave status' -// and parsed into a Position and fields). +// Status is the replication status for MySQL/MariaDB/File-based. Returned by a +// flavor-specific command and parsed into a Position and fields. type Status struct { - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + IoThreadRunning bool `protobuf:"varint,2,opt,name=io_thread_running,json=ioThreadRunning,proto3" json:"io_thread_running,omitempty"` + SqlThreadRunning bool `protobuf:"varint,3,opt,name=sql_thread_running,json=sqlThreadRunning,proto3" json:"sql_thread_running,omitempty"` + SecondsBehindMaster uint32 `protobuf:"varint,4,opt,name=seconds_behind_master,json=secondsBehindMaster,proto3" json:"seconds_behind_master,omitempty"` + MasterHost string `protobuf:"bytes,5,opt,name=master_host,json=masterHost,proto3" json:"master_host,omitempty"` + MasterPort int32 `protobuf:"varint,6,opt,name=master_port,json=masterPort,proto3" json:"master_port,omitempty"` + MasterConnectRetry int32 `protobuf:"varint,7,opt,name=master_connect_retry,json=masterConnectRetry,proto3" json:"master_connect_retry,omitempty"` // RelayLogPosition will be empty for flavors that do not support returning the full GTIDSet from the relay log, such as MariaDB. RelayLogPosition string `protobuf:"bytes,8,opt,name=relay_log_position,json=relayLogPosition,proto3" json:"relay_log_position,omitempty"` FilePosition string `protobuf:"bytes,9,opt,name=file_position,json=filePosition,proto3" json:"file_position,omitempty"` FileRelayLogPosition string `protobuf:"bytes,10,opt,name=file_relay_log_position,json=fileRelayLogPosition,proto3" json:"file_relay_log_position,omitempty"` MasterServerId uint32 `protobuf:"varint,11,opt,name=master_server_id,json=masterServerId,proto3" json:"master_server_id,omitempty"` - SlaveIoRunning bool `protobuf:"varint,2,opt,name=slave_io_running,json=slaveIoRunning,proto3" json:"slave_io_running,omitempty"` - SlaveSqlRunning bool `protobuf:"varint,3,opt,name=slave_sql_running,json=slaveSqlRunning,proto3" json:"slave_sql_running,omitempty"` - SecondsBehindMaster uint32 `protobuf:"varint,4,opt,name=seconds_behind_master,json=secondsBehindMaster,proto3" json:"seconds_behind_master,omitempty"` - MasterHost string `protobuf:"bytes,5,opt,name=master_host,json=masterHost,proto3" json:"master_host,omitempty"` - MasterPort int32 `protobuf:"varint,6,opt,name=master_port,json=masterPort,proto3" json:"master_port,omitempty"` - MasterConnectRetry int32 `protobuf:"varint,7,opt,name=master_connect_retry,json=masterConnectRetry,proto3" json:"master_connect_retry,omitempty"` MasterUuid string `protobuf:"bytes,12,opt,name=master_uuid,json=masterUuid,proto3" json:"master_uuid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -74,72 +74,72 @@ func (m *Status) GetPosition() string { return "" } -func (m *Status) GetRelayLogPosition() string { +func (m *Status) GetIoThreadRunning() bool { if m != nil { - return m.RelayLogPosition + return m.IoThreadRunning } - return "" + return false } -func (m *Status) GetFilePosition() string { +func (m *Status) GetSqlThreadRunning() bool { if m != nil { - return m.FilePosition + return m.SqlThreadRunning } - return "" + return false } -func (m *Status) GetFileRelayLogPosition() string { +func (m *Status) GetSecondsBehindMaster() uint32 { if m != nil { - return m.FileRelayLogPosition + return m.SecondsBehindMaster } - return "" + return 0 } -func (m *Status) GetMasterServerId() uint32 { +func (m *Status) GetMasterHost() string { if m != nil { - return m.MasterServerId + return m.MasterHost } - return 0 + return "" } -func (m *Status) GetSlaveIoRunning() bool { +func (m *Status) GetMasterPort() int32 { if m != nil { - return m.SlaveIoRunning + return m.MasterPort } - return false + return 0 } -func (m *Status) GetSlaveSqlRunning() bool { +func (m *Status) GetMasterConnectRetry() int32 { if m != nil { - return m.SlaveSqlRunning + return m.MasterConnectRetry } - return false + return 0 } -func (m *Status) GetSecondsBehindMaster() uint32 { +func (m *Status) GetRelayLogPosition() string { if m != nil { - return m.SecondsBehindMaster + return m.RelayLogPosition } - return 0 + return "" } -func (m *Status) GetMasterHost() string { +func (m *Status) GetFilePosition() string { if m != nil { - return m.MasterHost + return m.FilePosition } return "" } -func (m *Status) GetMasterPort() int32 { +func (m *Status) GetFileRelayLogPosition() string { if m != nil { - return m.MasterPort + return m.FileRelayLogPosition } - return 0 + return "" } -func (m *Status) GetMasterConnectRetry() int32 { +func (m *Status) GetMasterServerId() uint32 { if m != nil { - return m.MasterConnectRetry + return m.MasterServerId } return 0 } @@ -158,27 +158,28 @@ func init() { func init() { proto.RegisterFile("replicationdata.proto", fileDescriptor_ee8ee22b8c4b9d06) } var fileDescriptor_ee8ee22b8c4b9d06 = []byte{ - // 350 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xcf, 0x6b, 0xdb, 0x30, - 0x14, 0x80, 0xf1, 0xb2, 0x64, 0x89, 0xf2, 0x73, 0x5a, 0xc2, 0xc4, 0x2e, 0x33, 0xdb, 0xc5, 0x94, - 0x10, 0x97, 0x96, 0xfe, 0x03, 0xe9, 0xa5, 0x81, 0x16, 0x82, 0x43, 0x2f, 0xbd, 0x08, 0xc7, 0x56, - 0x1d, 0x81, 0xab, 0xe7, 0x48, 0xb2, 0x21, 0x7f, 0x79, 0xaf, 0xc5, 0x4f, 0x89, 0x1b, 0x42, 0x6f, - 0xf6, 0xf7, 0x7d, 0x3c, 0x49, 0xf0, 0xc8, 0x4c, 0x8b, 0x22, 0x97, 0x49, 0x6c, 0x25, 0xa8, 0x34, - 0xb6, 0xf1, 0xa2, 0xd0, 0x60, 0x81, 0x8e, 0x2f, 0xf0, 0xbf, 0xf7, 0x16, 0xe9, 0x6c, 0x6c, 0x6c, - 0x4b, 0x43, 0xff, 0x90, 0x6e, 0x01, 0x46, 0xd6, 0x8a, 0x79, 0xbe, 0x17, 0xf4, 0xa2, 0xe6, 0x9f, - 0xce, 0x09, 0xd5, 0x22, 0x8f, 0x0f, 0x3c, 0x87, 0x8c, 0x37, 0x55, 0x17, 0xab, 0x09, 0x9a, 0x47, - 0xc8, 0xd6, 0xa7, 0xfa, 0x3f, 0x19, 0xbe, 0xca, 0x5c, 0x7c, 0x86, 0x3d, 0x0c, 0x07, 0x35, 0x6c, - 0xa2, 0x3b, 0xf2, 0x1b, 0xa3, 0x2f, 0xe6, 0x12, 0xcc, 0xa7, 0xb5, 0x8e, 0x2e, 0x67, 0x07, 0x64, - 0xf2, 0x16, 0x1b, 0x2b, 0x34, 0x37, 0x42, 0x57, 0x42, 0x73, 0x99, 0xb2, 0xbe, 0xef, 0x05, 0xc3, - 0x68, 0xe4, 0xf8, 0x06, 0xf1, 0x2a, 0xad, 0x4b, 0x93, 0xc7, 0x95, 0xe0, 0x12, 0xb8, 0x2e, 0x95, - 0x92, 0x2a, 0x63, 0xdf, 0x7c, 0x2f, 0xe8, 0x46, 0x23, 0xe4, 0x2b, 0x88, 0x1c, 0xa5, 0x57, 0xe4, - 0xa7, 0x2b, 0xcd, 0x3e, 0x6f, 0xd2, 0x16, 0xa6, 0x63, 0x14, 0x9b, 0x7d, 0x7e, 0x6a, 0x6f, 0xc8, - 0xcc, 0x88, 0x04, 0x54, 0x6a, 0xf8, 0x56, 0xec, 0xa4, 0x4a, 0xb9, 0x3b, 0x96, 0x7d, 0xc7, 0x4b, - 0xfc, 0x3a, 0xca, 0x25, 0xba, 0x27, 0x54, 0xf4, 0x2f, 0xe9, 0x1f, 0xef, 0xbc, 0x03, 0x63, 0x59, - 0x1b, 0x9f, 0x47, 0x1c, 0x7a, 0x00, 0x63, 0xcf, 0x82, 0x02, 0xb4, 0x65, 0x1d, 0xdf, 0x0b, 0xda, - 0xa7, 0x60, 0x0d, 0xda, 0xd2, 0x6b, 0x32, 0x3d, 0x06, 0x09, 0x28, 0x25, 0x12, 0xcb, 0xb5, 0xb0, - 0xfa, 0xc0, 0x7e, 0x60, 0x49, 0x9d, 0xbb, 0x77, 0x2a, 0xaa, 0xcd, 0xd9, 0xc8, 0xb2, 0x94, 0x29, - 0x1b, 0x9c, 0x9f, 0xf9, 0x5c, 0xca, 0x74, 0xb9, 0x78, 0x99, 0x57, 0xd2, 0x0a, 0x63, 0x16, 0x12, - 0x42, 0xf7, 0x15, 0x66, 0x10, 0x56, 0x36, 0xc4, 0x55, 0x09, 0x2f, 0x36, 0x65, 0xdb, 0x41, 0x7c, - 0xfb, 0x11, 0x00, 0x00, 0xff, 0xff, 0x42, 0xb5, 0xb6, 0xf7, 0x5a, 0x02, 0x00, 0x00, + // 353 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0x41, 0x4f, 0xe2, 0x40, + 0x14, 0xc7, 0xd3, 0x65, 0x61, 0x61, 0x80, 0x85, 0x9d, 0x85, 0x38, 0xf1, 0x62, 0xa3, 0x97, 0xc6, + 0x10, 0x6a, 0x34, 0x7e, 0x01, 0xbc, 0x68, 0xa2, 0x09, 0x29, 0x7a, 0xf1, 0x32, 0x29, 0x9d, 0xb1, + 0x4c, 0x52, 0xe7, 0x95, 0x99, 0x29, 0x09, 0x9f, 0xdd, 0x8b, 0xe9, 0x2b, 0x20, 0x36, 0xde, 0xda, + 0xff, 0xef, 0x97, 0xd7, 0xd7, 0x7f, 0x1e, 0x19, 0x1b, 0x99, 0x67, 0x2a, 0x89, 0x9d, 0x02, 0x2d, + 0x62, 0x17, 0x4f, 0x73, 0x03, 0x0e, 0xe8, 0xa0, 0x16, 0x9f, 0x7f, 0x34, 0x48, 0x6b, 0xe1, 0x62, + 0x57, 0x58, 0x7a, 0x4a, 0xda, 0x39, 0x58, 0x55, 0x22, 0xe6, 0xf9, 0x5e, 0xd0, 0x89, 0x0e, 0xef, + 0xf4, 0x92, 0xfc, 0x53, 0xc0, 0xdd, 0xca, 0xc8, 0x58, 0x70, 0x53, 0x68, 0xad, 0x74, 0xca, 0x7e, + 0xf9, 0x5e, 0xd0, 0x8e, 0x06, 0x0a, 0x9e, 0x31, 0x8f, 0xaa, 0x98, 0x4e, 0x08, 0xb5, 0xeb, 0xac, + 0x2e, 0x37, 0x50, 0x1e, 0xda, 0x75, 0xf6, 0xdd, 0xbe, 0x26, 0x63, 0x2b, 0x13, 0xd0, 0xc2, 0xf2, + 0xa5, 0x5c, 0x29, 0x2d, 0xf8, 0x7b, 0x6c, 0x9d, 0x34, 0xec, 0xb7, 0xef, 0x05, 0xfd, 0xe8, 0xff, + 0x0e, 0xce, 0x90, 0x3d, 0x21, 0xa2, 0x67, 0xa4, 0x5b, 0x49, 0x7c, 0x05, 0xd6, 0xb1, 0x26, 0x2e, + 0x4b, 0xaa, 0xe8, 0x1e, 0xac, 0x3b, 0x12, 0x72, 0x30, 0x8e, 0xb5, 0x7c, 0x2f, 0x68, 0xee, 0x85, + 0x39, 0x18, 0x47, 0xaf, 0xc8, 0x68, 0x27, 0x24, 0xa0, 0xb5, 0x4c, 0x1c, 0x37, 0xd2, 0x99, 0x2d, + 0xfb, 0x83, 0x26, 0xad, 0xd8, 0x5d, 0x85, 0xa2, 0x92, 0x94, 0x7f, 0x65, 0x64, 0x16, 0x6f, 0x79, + 0x06, 0x29, 0x3f, 0xf4, 0xd4, 0xc6, 0x4f, 0x0f, 0x91, 0x3c, 0x42, 0x3a, 0xdf, 0xf7, 0x75, 0x41, + 0xfa, 0x6f, 0x2a, 0x93, 0x5f, 0x62, 0x07, 0xc5, 0x5e, 0x19, 0x1e, 0xa4, 0x5b, 0x72, 0x82, 0xd2, + 0x0f, 0x73, 0x09, 0xea, 0xa3, 0x12, 0x47, 0xf5, 0xd9, 0x01, 0x19, 0xee, 0x76, 0xb7, 0xd2, 0x6c, + 0xa4, 0xe1, 0x4a, 0xb0, 0x2e, 0x96, 0xf5, 0xb7, 0xca, 0x17, 0x18, 0x3f, 0x88, 0xa3, 0x1a, 0x8a, + 0x42, 0x09, 0xd6, 0x3b, 0xee, 0xe9, 0xa5, 0x50, 0x62, 0x36, 0x7d, 0x9d, 0x6c, 0x94, 0x93, 0xd6, + 0x4e, 0x15, 0x84, 0xd5, 0x53, 0x98, 0x42, 0xb8, 0x71, 0x21, 0x9e, 0x4b, 0x58, 0xbb, 0x96, 0x65, + 0x0b, 0xe3, 0x9b, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x10, 0xaa, 0xaa, 0x5e, 0x02, 0x00, + 0x00, } diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 62ef272de21..ad30fdb0c81 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -1226,7 +1226,7 @@ var xxx_messageInfo_IgnoreHealthErrorResponse proto.InternalMessageInfo type ReloadSchemaRequest struct { // wait_position allows scheduling a schema reload to occur after a - // given DDL has replicated to this slave, by specifying a replication + // given DDL has replicated to this server, by specifying a replication // position to wait for. Leave empty to trigger the reload immediately. WaitPosition string `protobuf:"bytes,1,opt,name=wait_position,json=waitPosition,proto3" json:"wait_position,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1917,70 +1917,70 @@ func (m *ExecuteFetchAsAppResponse) GetResult() *query.QueryResult { return nil } -type SlaveStatusRequest struct { +type ReplicationStatusRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SlaveStatusRequest) Reset() { *m = SlaveStatusRequest{} } -func (m *SlaveStatusRequest) String() string { return proto.CompactTextString(m) } -func (*SlaveStatusRequest) ProtoMessage() {} -func (*SlaveStatusRequest) Descriptor() ([]byte, []int) { +func (m *ReplicationStatusRequest) Reset() { *m = ReplicationStatusRequest{} } +func (m *ReplicationStatusRequest) String() string { return proto.CompactTextString(m) } +func (*ReplicationStatusRequest) ProtoMessage() {} +func (*ReplicationStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{44} } -func (m *SlaveStatusRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SlaveStatusRequest.Unmarshal(m, b) +func (m *ReplicationStatusRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplicationStatusRequest.Unmarshal(m, b) } -func (m *SlaveStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SlaveStatusRequest.Marshal(b, m, deterministic) +func (m *ReplicationStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplicationStatusRequest.Marshal(b, m, deterministic) } -func (m *SlaveStatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlaveStatusRequest.Merge(m, src) +func (m *ReplicationStatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplicationStatusRequest.Merge(m, src) } -func (m *SlaveStatusRequest) XXX_Size() int { - return xxx_messageInfo_SlaveStatusRequest.Size(m) +func (m *ReplicationStatusRequest) XXX_Size() int { + return xxx_messageInfo_ReplicationStatusRequest.Size(m) } -func (m *SlaveStatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SlaveStatusRequest.DiscardUnknown(m) +func (m *ReplicationStatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ReplicationStatusRequest.DiscardUnknown(m) } -var xxx_messageInfo_SlaveStatusRequest proto.InternalMessageInfo +var xxx_messageInfo_ReplicationStatusRequest proto.InternalMessageInfo -type SlaveStatusResponse struct { +type ReplicationStatusResponse struct { Status *replicationdata.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SlaveStatusResponse) Reset() { *m = SlaveStatusResponse{} } -func (m *SlaveStatusResponse) String() string { return proto.CompactTextString(m) } -func (*SlaveStatusResponse) ProtoMessage() {} -func (*SlaveStatusResponse) Descriptor() ([]byte, []int) { +func (m *ReplicationStatusResponse) Reset() { *m = ReplicationStatusResponse{} } +func (m *ReplicationStatusResponse) String() string { return proto.CompactTextString(m) } +func (*ReplicationStatusResponse) ProtoMessage() {} +func (*ReplicationStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{45} } -func (m *SlaveStatusResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SlaveStatusResponse.Unmarshal(m, b) +func (m *ReplicationStatusResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplicationStatusResponse.Unmarshal(m, b) } -func (m *SlaveStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SlaveStatusResponse.Marshal(b, m, deterministic) +func (m *ReplicationStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplicationStatusResponse.Marshal(b, m, deterministic) } -func (m *SlaveStatusResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlaveStatusResponse.Merge(m, src) +func (m *ReplicationStatusResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplicationStatusResponse.Merge(m, src) } -func (m *SlaveStatusResponse) XXX_Size() int { - return xxx_messageInfo_SlaveStatusResponse.Size(m) +func (m *ReplicationStatusResponse) XXX_Size() int { + return xxx_messageInfo_ReplicationStatusResponse.Size(m) } -func (m *SlaveStatusResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SlaveStatusResponse.DiscardUnknown(m) +func (m *ReplicationStatusResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ReplicationStatusResponse.DiscardUnknown(m) } -var xxx_messageInfo_SlaveStatusResponse proto.InternalMessageInfo +var xxx_messageInfo_ReplicationStatusResponse proto.InternalMessageInfo -func (m *SlaveStatusResponse) GetStatus() *replicationdata.Status { +func (m *ReplicationStatusResponse) GetStatus() *replicationdata.Status { if m != nil { return m.Status } @@ -2127,69 +2127,69 @@ func (m *WaitForPositionResponse) XXX_DiscardUnknown() { var xxx_messageInfo_WaitForPositionResponse proto.InternalMessageInfo -type StopSlaveRequest struct { +type StopReplicationRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StopSlaveRequest) Reset() { *m = StopSlaveRequest{} } -func (m *StopSlaveRequest) String() string { return proto.CompactTextString(m) } -func (*StopSlaveRequest) ProtoMessage() {} -func (*StopSlaveRequest) Descriptor() ([]byte, []int) { +func (m *StopReplicationRequest) Reset() { *m = StopReplicationRequest{} } +func (m *StopReplicationRequest) String() string { return proto.CompactTextString(m) } +func (*StopReplicationRequest) ProtoMessage() {} +func (*StopReplicationRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{50} } -func (m *StopSlaveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StopSlaveRequest.Unmarshal(m, b) +func (m *StopReplicationRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopReplicationRequest.Unmarshal(m, b) } -func (m *StopSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StopSlaveRequest.Marshal(b, m, deterministic) +func (m *StopReplicationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopReplicationRequest.Marshal(b, m, deterministic) } -func (m *StopSlaveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopSlaveRequest.Merge(m, src) +func (m *StopReplicationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopReplicationRequest.Merge(m, src) } -func (m *StopSlaveRequest) XXX_Size() int { - return xxx_messageInfo_StopSlaveRequest.Size(m) +func (m *StopReplicationRequest) XXX_Size() int { + return xxx_messageInfo_StopReplicationRequest.Size(m) } -func (m *StopSlaveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StopSlaveRequest.DiscardUnknown(m) +func (m *StopReplicationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StopReplicationRequest.DiscardUnknown(m) } -var xxx_messageInfo_StopSlaveRequest proto.InternalMessageInfo +var xxx_messageInfo_StopReplicationRequest proto.InternalMessageInfo -type StopSlaveResponse struct { +type StopReplicationResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StopSlaveResponse) Reset() { *m = StopSlaveResponse{} } -func (m *StopSlaveResponse) String() string { return proto.CompactTextString(m) } -func (*StopSlaveResponse) ProtoMessage() {} -func (*StopSlaveResponse) Descriptor() ([]byte, []int) { +func (m *StopReplicationResponse) Reset() { *m = StopReplicationResponse{} } +func (m *StopReplicationResponse) String() string { return proto.CompactTextString(m) } +func (*StopReplicationResponse) ProtoMessage() {} +func (*StopReplicationResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{51} } -func (m *StopSlaveResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StopSlaveResponse.Unmarshal(m, b) +func (m *StopReplicationResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopReplicationResponse.Unmarshal(m, b) } -func (m *StopSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StopSlaveResponse.Marshal(b, m, deterministic) +func (m *StopReplicationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopReplicationResponse.Marshal(b, m, deterministic) } -func (m *StopSlaveResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopSlaveResponse.Merge(m, src) +func (m *StopReplicationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopReplicationResponse.Merge(m, src) } -func (m *StopSlaveResponse) XXX_Size() int { - return xxx_messageInfo_StopSlaveResponse.Size(m) +func (m *StopReplicationResponse) XXX_Size() int { + return xxx_messageInfo_StopReplicationResponse.Size(m) } -func (m *StopSlaveResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StopSlaveResponse.DiscardUnknown(m) +func (m *StopReplicationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StopReplicationResponse.DiscardUnknown(m) } -var xxx_messageInfo_StopSlaveResponse proto.InternalMessageInfo +var xxx_messageInfo_StopReplicationResponse proto.InternalMessageInfo -type StopSlaveMinimumRequest struct { +type StopReplicationMinimumRequest struct { Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` WaitTimeout int64 `protobuf:"varint,2,opt,name=wait_timeout,json=waitTimeout,proto3" json:"wait_timeout,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2197,147 +2197,147 @@ type StopSlaveMinimumRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *StopSlaveMinimumRequest) Reset() { *m = StopSlaveMinimumRequest{} } -func (m *StopSlaveMinimumRequest) String() string { return proto.CompactTextString(m) } -func (*StopSlaveMinimumRequest) ProtoMessage() {} -func (*StopSlaveMinimumRequest) Descriptor() ([]byte, []int) { +func (m *StopReplicationMinimumRequest) Reset() { *m = StopReplicationMinimumRequest{} } +func (m *StopReplicationMinimumRequest) String() string { return proto.CompactTextString(m) } +func (*StopReplicationMinimumRequest) ProtoMessage() {} +func (*StopReplicationMinimumRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{52} } -func (m *StopSlaveMinimumRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StopSlaveMinimumRequest.Unmarshal(m, b) +func (m *StopReplicationMinimumRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopReplicationMinimumRequest.Unmarshal(m, b) } -func (m *StopSlaveMinimumRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StopSlaveMinimumRequest.Marshal(b, m, deterministic) +func (m *StopReplicationMinimumRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopReplicationMinimumRequest.Marshal(b, m, deterministic) } -func (m *StopSlaveMinimumRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopSlaveMinimumRequest.Merge(m, src) +func (m *StopReplicationMinimumRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopReplicationMinimumRequest.Merge(m, src) } -func (m *StopSlaveMinimumRequest) XXX_Size() int { - return xxx_messageInfo_StopSlaveMinimumRequest.Size(m) +func (m *StopReplicationMinimumRequest) XXX_Size() int { + return xxx_messageInfo_StopReplicationMinimumRequest.Size(m) } -func (m *StopSlaveMinimumRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StopSlaveMinimumRequest.DiscardUnknown(m) +func (m *StopReplicationMinimumRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StopReplicationMinimumRequest.DiscardUnknown(m) } -var xxx_messageInfo_StopSlaveMinimumRequest proto.InternalMessageInfo +var xxx_messageInfo_StopReplicationMinimumRequest proto.InternalMessageInfo -func (m *StopSlaveMinimumRequest) GetPosition() string { +func (m *StopReplicationMinimumRequest) GetPosition() string { if m != nil { return m.Position } return "" } -func (m *StopSlaveMinimumRequest) GetWaitTimeout() int64 { +func (m *StopReplicationMinimumRequest) GetWaitTimeout() int64 { if m != nil { return m.WaitTimeout } return 0 } -type StopSlaveMinimumResponse struct { +type StopReplicationMinimumResponse struct { Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StopSlaveMinimumResponse) Reset() { *m = StopSlaveMinimumResponse{} } -func (m *StopSlaveMinimumResponse) String() string { return proto.CompactTextString(m) } -func (*StopSlaveMinimumResponse) ProtoMessage() {} -func (*StopSlaveMinimumResponse) Descriptor() ([]byte, []int) { +func (m *StopReplicationMinimumResponse) Reset() { *m = StopReplicationMinimumResponse{} } +func (m *StopReplicationMinimumResponse) String() string { return proto.CompactTextString(m) } +func (*StopReplicationMinimumResponse) ProtoMessage() {} +func (*StopReplicationMinimumResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{53} } -func (m *StopSlaveMinimumResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StopSlaveMinimumResponse.Unmarshal(m, b) +func (m *StopReplicationMinimumResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopReplicationMinimumResponse.Unmarshal(m, b) } -func (m *StopSlaveMinimumResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StopSlaveMinimumResponse.Marshal(b, m, deterministic) +func (m *StopReplicationMinimumResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopReplicationMinimumResponse.Marshal(b, m, deterministic) } -func (m *StopSlaveMinimumResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopSlaveMinimumResponse.Merge(m, src) +func (m *StopReplicationMinimumResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopReplicationMinimumResponse.Merge(m, src) } -func (m *StopSlaveMinimumResponse) XXX_Size() int { - return xxx_messageInfo_StopSlaveMinimumResponse.Size(m) +func (m *StopReplicationMinimumResponse) XXX_Size() int { + return xxx_messageInfo_StopReplicationMinimumResponse.Size(m) } -func (m *StopSlaveMinimumResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StopSlaveMinimumResponse.DiscardUnknown(m) +func (m *StopReplicationMinimumResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StopReplicationMinimumResponse.DiscardUnknown(m) } -var xxx_messageInfo_StopSlaveMinimumResponse proto.InternalMessageInfo +var xxx_messageInfo_StopReplicationMinimumResponse proto.InternalMessageInfo -func (m *StopSlaveMinimumResponse) GetPosition() string { +func (m *StopReplicationMinimumResponse) GetPosition() string { if m != nil { return m.Position } return "" } -type StartSlaveRequest struct { +type StartReplicationRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StartSlaveRequest) Reset() { *m = StartSlaveRequest{} } -func (m *StartSlaveRequest) String() string { return proto.CompactTextString(m) } -func (*StartSlaveRequest) ProtoMessage() {} -func (*StartSlaveRequest) Descriptor() ([]byte, []int) { +func (m *StartReplicationRequest) Reset() { *m = StartReplicationRequest{} } +func (m *StartReplicationRequest) String() string { return proto.CompactTextString(m) } +func (*StartReplicationRequest) ProtoMessage() {} +func (*StartReplicationRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{54} } -func (m *StartSlaveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartSlaveRequest.Unmarshal(m, b) +func (m *StartReplicationRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartReplicationRequest.Unmarshal(m, b) } -func (m *StartSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartSlaveRequest.Marshal(b, m, deterministic) +func (m *StartReplicationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartReplicationRequest.Marshal(b, m, deterministic) } -func (m *StartSlaveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartSlaveRequest.Merge(m, src) +func (m *StartReplicationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartReplicationRequest.Merge(m, src) } -func (m *StartSlaveRequest) XXX_Size() int { - return xxx_messageInfo_StartSlaveRequest.Size(m) +func (m *StartReplicationRequest) XXX_Size() int { + return xxx_messageInfo_StartReplicationRequest.Size(m) } -func (m *StartSlaveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StartSlaveRequest.DiscardUnknown(m) +func (m *StartReplicationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StartReplicationRequest.DiscardUnknown(m) } -var xxx_messageInfo_StartSlaveRequest proto.InternalMessageInfo +var xxx_messageInfo_StartReplicationRequest proto.InternalMessageInfo -type StartSlaveResponse struct { +type StartReplicationResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StartSlaveResponse) Reset() { *m = StartSlaveResponse{} } -func (m *StartSlaveResponse) String() string { return proto.CompactTextString(m) } -func (*StartSlaveResponse) ProtoMessage() {} -func (*StartSlaveResponse) Descriptor() ([]byte, []int) { +func (m *StartReplicationResponse) Reset() { *m = StartReplicationResponse{} } +func (m *StartReplicationResponse) String() string { return proto.CompactTextString(m) } +func (*StartReplicationResponse) ProtoMessage() {} +func (*StartReplicationResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{55} } -func (m *StartSlaveResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartSlaveResponse.Unmarshal(m, b) +func (m *StartReplicationResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartReplicationResponse.Unmarshal(m, b) } -func (m *StartSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartSlaveResponse.Marshal(b, m, deterministic) +func (m *StartReplicationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartReplicationResponse.Marshal(b, m, deterministic) } -func (m *StartSlaveResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartSlaveResponse.Merge(m, src) +func (m *StartReplicationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartReplicationResponse.Merge(m, src) } -func (m *StartSlaveResponse) XXX_Size() int { - return xxx_messageInfo_StartSlaveResponse.Size(m) +func (m *StartReplicationResponse) XXX_Size() int { + return xxx_messageInfo_StartReplicationResponse.Size(m) } -func (m *StartSlaveResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StartSlaveResponse.DiscardUnknown(m) +func (m *StartReplicationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StartReplicationResponse.DiscardUnknown(m) } -var xxx_messageInfo_StartSlaveResponse proto.InternalMessageInfo +var xxx_messageInfo_StartReplicationResponse proto.InternalMessageInfo -type StartSlaveUntilAfterRequest struct { +type StartReplicationUntilAfterRequest struct { Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` WaitTimeout int64 `protobuf:"varint,2,opt,name=wait_timeout,json=waitTimeout,proto3" json:"wait_timeout,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2345,140 +2345,140 @@ type StartSlaveUntilAfterRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *StartSlaveUntilAfterRequest) Reset() { *m = StartSlaveUntilAfterRequest{} } -func (m *StartSlaveUntilAfterRequest) String() string { return proto.CompactTextString(m) } -func (*StartSlaveUntilAfterRequest) ProtoMessage() {} -func (*StartSlaveUntilAfterRequest) Descriptor() ([]byte, []int) { +func (m *StartReplicationUntilAfterRequest) Reset() { *m = StartReplicationUntilAfterRequest{} } +func (m *StartReplicationUntilAfterRequest) String() string { return proto.CompactTextString(m) } +func (*StartReplicationUntilAfterRequest) ProtoMessage() {} +func (*StartReplicationUntilAfterRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{56} } -func (m *StartSlaveUntilAfterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartSlaveUntilAfterRequest.Unmarshal(m, b) +func (m *StartReplicationUntilAfterRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartReplicationUntilAfterRequest.Unmarshal(m, b) } -func (m *StartSlaveUntilAfterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartSlaveUntilAfterRequest.Marshal(b, m, deterministic) +func (m *StartReplicationUntilAfterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartReplicationUntilAfterRequest.Marshal(b, m, deterministic) } -func (m *StartSlaveUntilAfterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartSlaveUntilAfterRequest.Merge(m, src) +func (m *StartReplicationUntilAfterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartReplicationUntilAfterRequest.Merge(m, src) } -func (m *StartSlaveUntilAfterRequest) XXX_Size() int { - return xxx_messageInfo_StartSlaveUntilAfterRequest.Size(m) +func (m *StartReplicationUntilAfterRequest) XXX_Size() int { + return xxx_messageInfo_StartReplicationUntilAfterRequest.Size(m) } -func (m *StartSlaveUntilAfterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StartSlaveUntilAfterRequest.DiscardUnknown(m) +func (m *StartReplicationUntilAfterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StartReplicationUntilAfterRequest.DiscardUnknown(m) } -var xxx_messageInfo_StartSlaveUntilAfterRequest proto.InternalMessageInfo +var xxx_messageInfo_StartReplicationUntilAfterRequest proto.InternalMessageInfo -func (m *StartSlaveUntilAfterRequest) GetPosition() string { +func (m *StartReplicationUntilAfterRequest) GetPosition() string { if m != nil { return m.Position } return "" } -func (m *StartSlaveUntilAfterRequest) GetWaitTimeout() int64 { +func (m *StartReplicationUntilAfterRequest) GetWaitTimeout() int64 { if m != nil { return m.WaitTimeout } return 0 } -type StartSlaveUntilAfterResponse struct { +type StartReplicationUntilAfterResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StartSlaveUntilAfterResponse) Reset() { *m = StartSlaveUntilAfterResponse{} } -func (m *StartSlaveUntilAfterResponse) String() string { return proto.CompactTextString(m) } -func (*StartSlaveUntilAfterResponse) ProtoMessage() {} -func (*StartSlaveUntilAfterResponse) Descriptor() ([]byte, []int) { +func (m *StartReplicationUntilAfterResponse) Reset() { *m = StartReplicationUntilAfterResponse{} } +func (m *StartReplicationUntilAfterResponse) String() string { return proto.CompactTextString(m) } +func (*StartReplicationUntilAfterResponse) ProtoMessage() {} +func (*StartReplicationUntilAfterResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{57} } -func (m *StartSlaveUntilAfterResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartSlaveUntilAfterResponse.Unmarshal(m, b) +func (m *StartReplicationUntilAfterResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartReplicationUntilAfterResponse.Unmarshal(m, b) } -func (m *StartSlaveUntilAfterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartSlaveUntilAfterResponse.Marshal(b, m, deterministic) +func (m *StartReplicationUntilAfterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartReplicationUntilAfterResponse.Marshal(b, m, deterministic) } -func (m *StartSlaveUntilAfterResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartSlaveUntilAfterResponse.Merge(m, src) +func (m *StartReplicationUntilAfterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartReplicationUntilAfterResponse.Merge(m, src) } -func (m *StartSlaveUntilAfterResponse) XXX_Size() int { - return xxx_messageInfo_StartSlaveUntilAfterResponse.Size(m) +func (m *StartReplicationUntilAfterResponse) XXX_Size() int { + return xxx_messageInfo_StartReplicationUntilAfterResponse.Size(m) } -func (m *StartSlaveUntilAfterResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StartSlaveUntilAfterResponse.DiscardUnknown(m) +func (m *StartReplicationUntilAfterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StartReplicationUntilAfterResponse.DiscardUnknown(m) } -var xxx_messageInfo_StartSlaveUntilAfterResponse proto.InternalMessageInfo +var xxx_messageInfo_StartReplicationUntilAfterResponse proto.InternalMessageInfo -type GetSlavesRequest struct { +type GetReplicasRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetSlavesRequest) Reset() { *m = GetSlavesRequest{} } -func (m *GetSlavesRequest) String() string { return proto.CompactTextString(m) } -func (*GetSlavesRequest) ProtoMessage() {} -func (*GetSlavesRequest) Descriptor() ([]byte, []int) { +func (m *GetReplicasRequest) Reset() { *m = GetReplicasRequest{} } +func (m *GetReplicasRequest) String() string { return proto.CompactTextString(m) } +func (*GetReplicasRequest) ProtoMessage() {} +func (*GetReplicasRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{58} } -func (m *GetSlavesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetSlavesRequest.Unmarshal(m, b) +func (m *GetReplicasRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetReplicasRequest.Unmarshal(m, b) } -func (m *GetSlavesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetSlavesRequest.Marshal(b, m, deterministic) +func (m *GetReplicasRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetReplicasRequest.Marshal(b, m, deterministic) } -func (m *GetSlavesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetSlavesRequest.Merge(m, src) +func (m *GetReplicasRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetReplicasRequest.Merge(m, src) } -func (m *GetSlavesRequest) XXX_Size() int { - return xxx_messageInfo_GetSlavesRequest.Size(m) +func (m *GetReplicasRequest) XXX_Size() int { + return xxx_messageInfo_GetReplicasRequest.Size(m) } -func (m *GetSlavesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetSlavesRequest.DiscardUnknown(m) +func (m *GetReplicasRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetReplicasRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetSlavesRequest proto.InternalMessageInfo +var xxx_messageInfo_GetReplicasRequest proto.InternalMessageInfo -type GetSlavesResponse struct { +type GetReplicasResponse struct { Addrs []string `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetSlavesResponse) Reset() { *m = GetSlavesResponse{} } -func (m *GetSlavesResponse) String() string { return proto.CompactTextString(m) } -func (*GetSlavesResponse) ProtoMessage() {} -func (*GetSlavesResponse) Descriptor() ([]byte, []int) { +func (m *GetReplicasResponse) Reset() { *m = GetReplicasResponse{} } +func (m *GetReplicasResponse) String() string { return proto.CompactTextString(m) } +func (*GetReplicasResponse) ProtoMessage() {} +func (*GetReplicasResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{59} } -func (m *GetSlavesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetSlavesResponse.Unmarshal(m, b) +func (m *GetReplicasResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetReplicasResponse.Unmarshal(m, b) } -func (m *GetSlavesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetSlavesResponse.Marshal(b, m, deterministic) +func (m *GetReplicasResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetReplicasResponse.Marshal(b, m, deterministic) } -func (m *GetSlavesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetSlavesResponse.Merge(m, src) +func (m *GetReplicasResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetReplicasResponse.Merge(m, src) } -func (m *GetSlavesResponse) XXX_Size() int { - return xxx_messageInfo_GetSlavesResponse.Size(m) +func (m *GetReplicasResponse) XXX_Size() int { + return xxx_messageInfo_GetReplicasResponse.Size(m) } -func (m *GetSlavesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetSlavesResponse.DiscardUnknown(m) +func (m *GetReplicasResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetReplicasResponse.DiscardUnknown(m) } -var xxx_messageInfo_GetSlavesResponse proto.InternalMessageInfo +var xxx_messageInfo_GetReplicasResponse proto.InternalMessageInfo -func (m *GetSlavesResponse) GetAddrs() []string { +func (m *GetReplicasResponse) GetAddrs() []string { if m != nil { return m.Addrs } @@ -2867,7 +2867,7 @@ func (m *PopulateReparentJournalResponse) XXX_DiscardUnknown() { var xxx_messageInfo_PopulateReparentJournalResponse proto.InternalMessageInfo -type InitSlaveRequest struct { +type InitReplicaRequest struct { Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` ReplicationPosition string `protobuf:"bytes,2,opt,name=replication_position,json=replicationPosition,proto3" json:"replication_position,omitempty"` TimeCreatedNs int64 `protobuf:"varint,3,opt,name=time_created_ns,json=timeCreatedNs,proto3" json:"time_created_ns,omitempty"` @@ -2876,82 +2876,82 @@ type InitSlaveRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *InitSlaveRequest) Reset() { *m = InitSlaveRequest{} } -func (m *InitSlaveRequest) String() string { return proto.CompactTextString(m) } -func (*InitSlaveRequest) ProtoMessage() {} -func (*InitSlaveRequest) Descriptor() ([]byte, []int) { +func (m *InitReplicaRequest) Reset() { *m = InitReplicaRequest{} } +func (m *InitReplicaRequest) String() string { return proto.CompactTextString(m) } +func (*InitReplicaRequest) ProtoMessage() {} +func (*InitReplicaRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{70} } -func (m *InitSlaveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InitSlaveRequest.Unmarshal(m, b) +func (m *InitReplicaRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InitReplicaRequest.Unmarshal(m, b) } -func (m *InitSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InitSlaveRequest.Marshal(b, m, deterministic) +func (m *InitReplicaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InitReplicaRequest.Marshal(b, m, deterministic) } -func (m *InitSlaveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_InitSlaveRequest.Merge(m, src) +func (m *InitReplicaRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_InitReplicaRequest.Merge(m, src) } -func (m *InitSlaveRequest) XXX_Size() int { - return xxx_messageInfo_InitSlaveRequest.Size(m) +func (m *InitReplicaRequest) XXX_Size() int { + return xxx_messageInfo_InitReplicaRequest.Size(m) } -func (m *InitSlaveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_InitSlaveRequest.DiscardUnknown(m) +func (m *InitReplicaRequest) XXX_DiscardUnknown() { + xxx_messageInfo_InitReplicaRequest.DiscardUnknown(m) } -var xxx_messageInfo_InitSlaveRequest proto.InternalMessageInfo +var xxx_messageInfo_InitReplicaRequest proto.InternalMessageInfo -func (m *InitSlaveRequest) GetParent() *topodata.TabletAlias { +func (m *InitReplicaRequest) GetParent() *topodata.TabletAlias { if m != nil { return m.Parent } return nil } -func (m *InitSlaveRequest) GetReplicationPosition() string { +func (m *InitReplicaRequest) GetReplicationPosition() string { if m != nil { return m.ReplicationPosition } return "" } -func (m *InitSlaveRequest) GetTimeCreatedNs() int64 { +func (m *InitReplicaRequest) GetTimeCreatedNs() int64 { if m != nil { return m.TimeCreatedNs } return 0 } -type InitSlaveResponse struct { +type InitReplicaResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *InitSlaveResponse) Reset() { *m = InitSlaveResponse{} } -func (m *InitSlaveResponse) String() string { return proto.CompactTextString(m) } -func (*InitSlaveResponse) ProtoMessage() {} -func (*InitSlaveResponse) Descriptor() ([]byte, []int) { +func (m *InitReplicaResponse) Reset() { *m = InitReplicaResponse{} } +func (m *InitReplicaResponse) String() string { return proto.CompactTextString(m) } +func (*InitReplicaResponse) ProtoMessage() {} +func (*InitReplicaResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{71} } -func (m *InitSlaveResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InitSlaveResponse.Unmarshal(m, b) +func (m *InitReplicaResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InitReplicaResponse.Unmarshal(m, b) } -func (m *InitSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InitSlaveResponse.Marshal(b, m, deterministic) +func (m *InitReplicaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InitReplicaResponse.Marshal(b, m, deterministic) } -func (m *InitSlaveResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_InitSlaveResponse.Merge(m, src) +func (m *InitReplicaResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_InitReplicaResponse.Merge(m, src) } -func (m *InitSlaveResponse) XXX_Size() int { - return xxx_messageInfo_InitSlaveResponse.Size(m) +func (m *InitReplicaResponse) XXX_Size() int { + return xxx_messageInfo_InitReplicaResponse.Size(m) } -func (m *InitSlaveResponse) XXX_DiscardUnknown() { - xxx_messageInfo_InitSlaveResponse.DiscardUnknown(m) +func (m *InitReplicaResponse) XXX_DiscardUnknown() { + xxx_messageInfo_InitReplicaResponse.DiscardUnknown(m) } -var xxx_messageInfo_InitSlaveResponse proto.InternalMessageInfo +var xxx_messageInfo_InitReplicaResponse proto.InternalMessageInfo type DemoteMasterRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3085,76 +3085,76 @@ func (m *UndoDemoteMasterResponse) XXX_DiscardUnknown() { var xxx_messageInfo_UndoDemoteMasterResponse proto.InternalMessageInfo -type SlaveWasPromotedRequest struct { +type ReplicaWasPromotedRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SlaveWasPromotedRequest) Reset() { *m = SlaveWasPromotedRequest{} } -func (m *SlaveWasPromotedRequest) String() string { return proto.CompactTextString(m) } -func (*SlaveWasPromotedRequest) ProtoMessage() {} -func (*SlaveWasPromotedRequest) Descriptor() ([]byte, []int) { +func (m *ReplicaWasPromotedRequest) Reset() { *m = ReplicaWasPromotedRequest{} } +func (m *ReplicaWasPromotedRequest) String() string { return proto.CompactTextString(m) } +func (*ReplicaWasPromotedRequest) ProtoMessage() {} +func (*ReplicaWasPromotedRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{76} } -func (m *SlaveWasPromotedRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SlaveWasPromotedRequest.Unmarshal(m, b) +func (m *ReplicaWasPromotedRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplicaWasPromotedRequest.Unmarshal(m, b) } -func (m *SlaveWasPromotedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SlaveWasPromotedRequest.Marshal(b, m, deterministic) +func (m *ReplicaWasPromotedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplicaWasPromotedRequest.Marshal(b, m, deterministic) } -func (m *SlaveWasPromotedRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlaveWasPromotedRequest.Merge(m, src) +func (m *ReplicaWasPromotedRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplicaWasPromotedRequest.Merge(m, src) } -func (m *SlaveWasPromotedRequest) XXX_Size() int { - return xxx_messageInfo_SlaveWasPromotedRequest.Size(m) +func (m *ReplicaWasPromotedRequest) XXX_Size() int { + return xxx_messageInfo_ReplicaWasPromotedRequest.Size(m) } -func (m *SlaveWasPromotedRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SlaveWasPromotedRequest.DiscardUnknown(m) +func (m *ReplicaWasPromotedRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ReplicaWasPromotedRequest.DiscardUnknown(m) } -var xxx_messageInfo_SlaveWasPromotedRequest proto.InternalMessageInfo +var xxx_messageInfo_ReplicaWasPromotedRequest proto.InternalMessageInfo -type SlaveWasPromotedResponse struct { +type ReplicaWasPromotedResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SlaveWasPromotedResponse) Reset() { *m = SlaveWasPromotedResponse{} } -func (m *SlaveWasPromotedResponse) String() string { return proto.CompactTextString(m) } -func (*SlaveWasPromotedResponse) ProtoMessage() {} -func (*SlaveWasPromotedResponse) Descriptor() ([]byte, []int) { +func (m *ReplicaWasPromotedResponse) Reset() { *m = ReplicaWasPromotedResponse{} } +func (m *ReplicaWasPromotedResponse) String() string { return proto.CompactTextString(m) } +func (*ReplicaWasPromotedResponse) ProtoMessage() {} +func (*ReplicaWasPromotedResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{77} } -func (m *SlaveWasPromotedResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SlaveWasPromotedResponse.Unmarshal(m, b) +func (m *ReplicaWasPromotedResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplicaWasPromotedResponse.Unmarshal(m, b) } -func (m *SlaveWasPromotedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SlaveWasPromotedResponse.Marshal(b, m, deterministic) +func (m *ReplicaWasPromotedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplicaWasPromotedResponse.Marshal(b, m, deterministic) } -func (m *SlaveWasPromotedResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlaveWasPromotedResponse.Merge(m, src) +func (m *ReplicaWasPromotedResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplicaWasPromotedResponse.Merge(m, src) } -func (m *SlaveWasPromotedResponse) XXX_Size() int { - return xxx_messageInfo_SlaveWasPromotedResponse.Size(m) +func (m *ReplicaWasPromotedResponse) XXX_Size() int { + return xxx_messageInfo_ReplicaWasPromotedResponse.Size(m) } -func (m *SlaveWasPromotedResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SlaveWasPromotedResponse.DiscardUnknown(m) +func (m *ReplicaWasPromotedResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ReplicaWasPromotedResponse.DiscardUnknown(m) } -var xxx_messageInfo_SlaveWasPromotedResponse proto.InternalMessageInfo +var xxx_messageInfo_ReplicaWasPromotedResponse proto.InternalMessageInfo type SetMasterRequest struct { - Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - TimeCreatedNs int64 `protobuf:"varint,2,opt,name=time_created_ns,json=timeCreatedNs,proto3" json:"time_created_ns,omitempty"` - WaitPosition string `protobuf:"bytes,4,opt,name=wait_position,json=waitPosition,proto3" json:"wait_position,omitempty"` - ForceStartSlave bool `protobuf:"varint,3,opt,name=force_start_slave,json=forceStartSlave,proto3" json:"force_start_slave,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + TimeCreatedNs int64 `protobuf:"varint,2,opt,name=time_created_ns,json=timeCreatedNs,proto3" json:"time_created_ns,omitempty"` + ForceStartReplication bool `protobuf:"varint,3,opt,name=force_start_replication,json=forceStartReplication,proto3" json:"force_start_replication,omitempty"` + WaitPosition string `protobuf:"bytes,4,opt,name=wait_position,json=waitPosition,proto3" json:"wait_position,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SetMasterRequest) Reset() { *m = SetMasterRequest{} } @@ -3196,18 +3196,18 @@ func (m *SetMasterRequest) GetTimeCreatedNs() int64 { return 0 } -func (m *SetMasterRequest) GetWaitPosition() string { +func (m *SetMasterRequest) GetForceStartReplication() bool { if m != nil { - return m.WaitPosition + return m.ForceStartReplication } - return "" + return false } -func (m *SetMasterRequest) GetForceStartSlave() bool { +func (m *SetMasterRequest) GetWaitPosition() string { if m != nil { - return m.ForceStartSlave + return m.WaitPosition } - return false + return "" } type SetMasterResponse struct { @@ -3241,7 +3241,7 @@ func (m *SetMasterResponse) XXX_DiscardUnknown() { var xxx_messageInfo_SetMasterResponse proto.InternalMessageInfo -type SlaveWasRestartedRequest struct { +type ReplicaWasRestartedRequest struct { // the parent alias the tablet should have Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3249,68 +3249,68 @@ type SlaveWasRestartedRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *SlaveWasRestartedRequest) Reset() { *m = SlaveWasRestartedRequest{} } -func (m *SlaveWasRestartedRequest) String() string { return proto.CompactTextString(m) } -func (*SlaveWasRestartedRequest) ProtoMessage() {} -func (*SlaveWasRestartedRequest) Descriptor() ([]byte, []int) { +func (m *ReplicaWasRestartedRequest) Reset() { *m = ReplicaWasRestartedRequest{} } +func (m *ReplicaWasRestartedRequest) String() string { return proto.CompactTextString(m) } +func (*ReplicaWasRestartedRequest) ProtoMessage() {} +func (*ReplicaWasRestartedRequest) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{80} } -func (m *SlaveWasRestartedRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SlaveWasRestartedRequest.Unmarshal(m, b) +func (m *ReplicaWasRestartedRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplicaWasRestartedRequest.Unmarshal(m, b) } -func (m *SlaveWasRestartedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SlaveWasRestartedRequest.Marshal(b, m, deterministic) +func (m *ReplicaWasRestartedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplicaWasRestartedRequest.Marshal(b, m, deterministic) } -func (m *SlaveWasRestartedRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlaveWasRestartedRequest.Merge(m, src) +func (m *ReplicaWasRestartedRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplicaWasRestartedRequest.Merge(m, src) } -func (m *SlaveWasRestartedRequest) XXX_Size() int { - return xxx_messageInfo_SlaveWasRestartedRequest.Size(m) +func (m *ReplicaWasRestartedRequest) XXX_Size() int { + return xxx_messageInfo_ReplicaWasRestartedRequest.Size(m) } -func (m *SlaveWasRestartedRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SlaveWasRestartedRequest.DiscardUnknown(m) +func (m *ReplicaWasRestartedRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ReplicaWasRestartedRequest.DiscardUnknown(m) } -var xxx_messageInfo_SlaveWasRestartedRequest proto.InternalMessageInfo +var xxx_messageInfo_ReplicaWasRestartedRequest proto.InternalMessageInfo -func (m *SlaveWasRestartedRequest) GetParent() *topodata.TabletAlias { +func (m *ReplicaWasRestartedRequest) GetParent() *topodata.TabletAlias { if m != nil { return m.Parent } return nil } -type SlaveWasRestartedResponse struct { +type ReplicaWasRestartedResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SlaveWasRestartedResponse) Reset() { *m = SlaveWasRestartedResponse{} } -func (m *SlaveWasRestartedResponse) String() string { return proto.CompactTextString(m) } -func (*SlaveWasRestartedResponse) ProtoMessage() {} -func (*SlaveWasRestartedResponse) Descriptor() ([]byte, []int) { +func (m *ReplicaWasRestartedResponse) Reset() { *m = ReplicaWasRestartedResponse{} } +func (m *ReplicaWasRestartedResponse) String() string { return proto.CompactTextString(m) } +func (*ReplicaWasRestartedResponse) ProtoMessage() {} +func (*ReplicaWasRestartedResponse) Descriptor() ([]byte, []int) { return fileDescriptor_ff9ac4f89e61ffa4, []int{81} } -func (m *SlaveWasRestartedResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SlaveWasRestartedResponse.Unmarshal(m, b) +func (m *ReplicaWasRestartedResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReplicaWasRestartedResponse.Unmarshal(m, b) } -func (m *SlaveWasRestartedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SlaveWasRestartedResponse.Marshal(b, m, deterministic) +func (m *ReplicaWasRestartedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReplicaWasRestartedResponse.Marshal(b, m, deterministic) } -func (m *SlaveWasRestartedResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlaveWasRestartedResponse.Merge(m, src) +func (m *ReplicaWasRestartedResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReplicaWasRestartedResponse.Merge(m, src) } -func (m *SlaveWasRestartedResponse) XXX_Size() int { - return xxx_messageInfo_SlaveWasRestartedResponse.Size(m) +func (m *ReplicaWasRestartedResponse) XXX_Size() int { + return xxx_messageInfo_ReplicaWasRestartedResponse.Size(m) } -func (m *SlaveWasRestartedResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SlaveWasRestartedResponse.DiscardUnknown(m) +func (m *ReplicaWasRestartedResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ReplicaWasRestartedResponse.DiscardUnknown(m) } -var xxx_messageInfo_SlaveWasRestartedResponse proto.InternalMessageInfo +var xxx_messageInfo_ReplicaWasRestartedResponse proto.InternalMessageInfo type StopReplicationAndGetStatusRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3608,231 +3608,922 @@ func (m *RestoreFromBackupResponse) GetEvent() *logutil.Event { return nil } -func init() { - proto.RegisterType((*TableDefinition)(nil), "tabletmanagerdata.TableDefinition") - proto.RegisterType((*SchemaDefinition)(nil), "tabletmanagerdata.SchemaDefinition") - proto.RegisterType((*SchemaChangeResult)(nil), "tabletmanagerdata.SchemaChangeResult") - proto.RegisterType((*UserPermission)(nil), "tabletmanagerdata.UserPermission") - proto.RegisterMapType((map[string]string)(nil), "tabletmanagerdata.UserPermission.PrivilegesEntry") - proto.RegisterType((*DbPermission)(nil), "tabletmanagerdata.DbPermission") - proto.RegisterMapType((map[string]string)(nil), "tabletmanagerdata.DbPermission.PrivilegesEntry") - proto.RegisterType((*Permissions)(nil), "tabletmanagerdata.Permissions") - proto.RegisterType((*PingRequest)(nil), "tabletmanagerdata.PingRequest") - proto.RegisterType((*PingResponse)(nil), "tabletmanagerdata.PingResponse") - proto.RegisterType((*SleepRequest)(nil), "tabletmanagerdata.SleepRequest") - proto.RegisterType((*SleepResponse)(nil), "tabletmanagerdata.SleepResponse") - proto.RegisterType((*ExecuteHookRequest)(nil), "tabletmanagerdata.ExecuteHookRequest") - proto.RegisterMapType((map[string]string)(nil), "tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry") - proto.RegisterType((*ExecuteHookResponse)(nil), "tabletmanagerdata.ExecuteHookResponse") - proto.RegisterType((*GetSchemaRequest)(nil), "tabletmanagerdata.GetSchemaRequest") - proto.RegisterType((*GetSchemaResponse)(nil), "tabletmanagerdata.GetSchemaResponse") - proto.RegisterType((*GetPermissionsRequest)(nil), "tabletmanagerdata.GetPermissionsRequest") - proto.RegisterType((*GetPermissionsResponse)(nil), "tabletmanagerdata.GetPermissionsResponse") - proto.RegisterType((*SetReadOnlyRequest)(nil), "tabletmanagerdata.SetReadOnlyRequest") - proto.RegisterType((*SetReadOnlyResponse)(nil), "tabletmanagerdata.SetReadOnlyResponse") - proto.RegisterType((*SetReadWriteRequest)(nil), "tabletmanagerdata.SetReadWriteRequest") - proto.RegisterType((*SetReadWriteResponse)(nil), "tabletmanagerdata.SetReadWriteResponse") - proto.RegisterType((*ChangeTypeRequest)(nil), "tabletmanagerdata.ChangeTypeRequest") - proto.RegisterType((*ChangeTypeResponse)(nil), "tabletmanagerdata.ChangeTypeResponse") - proto.RegisterType((*RefreshStateRequest)(nil), "tabletmanagerdata.RefreshStateRequest") - proto.RegisterType((*RefreshStateResponse)(nil), "tabletmanagerdata.RefreshStateResponse") - proto.RegisterType((*RunHealthCheckRequest)(nil), "tabletmanagerdata.RunHealthCheckRequest") - proto.RegisterType((*RunHealthCheckResponse)(nil), "tabletmanagerdata.RunHealthCheckResponse") - proto.RegisterType((*IgnoreHealthErrorRequest)(nil), "tabletmanagerdata.IgnoreHealthErrorRequest") - proto.RegisterType((*IgnoreHealthErrorResponse)(nil), "tabletmanagerdata.IgnoreHealthErrorResponse") - proto.RegisterType((*ReloadSchemaRequest)(nil), "tabletmanagerdata.ReloadSchemaRequest") - proto.RegisterType((*ReloadSchemaResponse)(nil), "tabletmanagerdata.ReloadSchemaResponse") - proto.RegisterType((*PreflightSchemaRequest)(nil), "tabletmanagerdata.PreflightSchemaRequest") - proto.RegisterType((*PreflightSchemaResponse)(nil), "tabletmanagerdata.PreflightSchemaResponse") - proto.RegisterType((*ApplySchemaRequest)(nil), "tabletmanagerdata.ApplySchemaRequest") - proto.RegisterType((*ApplySchemaResponse)(nil), "tabletmanagerdata.ApplySchemaResponse") - proto.RegisterType((*LockTablesRequest)(nil), "tabletmanagerdata.LockTablesRequest") - proto.RegisterType((*LockTablesResponse)(nil), "tabletmanagerdata.LockTablesResponse") - proto.RegisterType((*UnlockTablesRequest)(nil), "tabletmanagerdata.UnlockTablesRequest") - proto.RegisterType((*UnlockTablesResponse)(nil), "tabletmanagerdata.UnlockTablesResponse") - proto.RegisterType((*ExecuteFetchAsDbaRequest)(nil), "tabletmanagerdata.ExecuteFetchAsDbaRequest") - proto.RegisterType((*ExecuteFetchAsDbaResponse)(nil), "tabletmanagerdata.ExecuteFetchAsDbaResponse") - proto.RegisterType((*ExecuteFetchAsAllPrivsRequest)(nil), "tabletmanagerdata.ExecuteFetchAsAllPrivsRequest") - proto.RegisterType((*ExecuteFetchAsAllPrivsResponse)(nil), "tabletmanagerdata.ExecuteFetchAsAllPrivsResponse") - proto.RegisterType((*ExecuteFetchAsAppRequest)(nil), "tabletmanagerdata.ExecuteFetchAsAppRequest") - proto.RegisterType((*ExecuteFetchAsAppResponse)(nil), "tabletmanagerdata.ExecuteFetchAsAppResponse") - proto.RegisterType((*SlaveStatusRequest)(nil), "tabletmanagerdata.SlaveStatusRequest") - proto.RegisterType((*SlaveStatusResponse)(nil), "tabletmanagerdata.SlaveStatusResponse") - proto.RegisterType((*MasterPositionRequest)(nil), "tabletmanagerdata.MasterPositionRequest") - proto.RegisterType((*MasterPositionResponse)(nil), "tabletmanagerdata.MasterPositionResponse") - proto.RegisterType((*WaitForPositionRequest)(nil), "tabletmanagerdata.WaitForPositionRequest") - proto.RegisterType((*WaitForPositionResponse)(nil), "tabletmanagerdata.WaitForPositionResponse") - proto.RegisterType((*StopSlaveRequest)(nil), "tabletmanagerdata.StopSlaveRequest") - proto.RegisterType((*StopSlaveResponse)(nil), "tabletmanagerdata.StopSlaveResponse") - proto.RegisterType((*StopSlaveMinimumRequest)(nil), "tabletmanagerdata.StopSlaveMinimumRequest") - proto.RegisterType((*StopSlaveMinimumResponse)(nil), "tabletmanagerdata.StopSlaveMinimumResponse") - proto.RegisterType((*StartSlaveRequest)(nil), "tabletmanagerdata.StartSlaveRequest") - proto.RegisterType((*StartSlaveResponse)(nil), "tabletmanagerdata.StartSlaveResponse") - proto.RegisterType((*StartSlaveUntilAfterRequest)(nil), "tabletmanagerdata.StartSlaveUntilAfterRequest") - proto.RegisterType((*StartSlaveUntilAfterResponse)(nil), "tabletmanagerdata.StartSlaveUntilAfterResponse") - proto.RegisterType((*GetSlavesRequest)(nil), "tabletmanagerdata.GetSlavesRequest") - proto.RegisterType((*GetSlavesResponse)(nil), "tabletmanagerdata.GetSlavesResponse") - proto.RegisterType((*ResetReplicationRequest)(nil), "tabletmanagerdata.ResetReplicationRequest") - proto.RegisterType((*ResetReplicationResponse)(nil), "tabletmanagerdata.ResetReplicationResponse") - proto.RegisterType((*VReplicationExecRequest)(nil), "tabletmanagerdata.VReplicationExecRequest") - proto.RegisterType((*VReplicationExecResponse)(nil), "tabletmanagerdata.VReplicationExecResponse") - proto.RegisterType((*VReplicationWaitForPosRequest)(nil), "tabletmanagerdata.VReplicationWaitForPosRequest") - proto.RegisterType((*VReplicationWaitForPosResponse)(nil), "tabletmanagerdata.VReplicationWaitForPosResponse") - proto.RegisterType((*InitMasterRequest)(nil), "tabletmanagerdata.InitMasterRequest") - proto.RegisterType((*InitMasterResponse)(nil), "tabletmanagerdata.InitMasterResponse") - proto.RegisterType((*PopulateReparentJournalRequest)(nil), "tabletmanagerdata.PopulateReparentJournalRequest") - proto.RegisterType((*PopulateReparentJournalResponse)(nil), "tabletmanagerdata.PopulateReparentJournalResponse") - proto.RegisterType((*InitSlaveRequest)(nil), "tabletmanagerdata.InitSlaveRequest") - proto.RegisterType((*InitSlaveResponse)(nil), "tabletmanagerdata.InitSlaveResponse") - proto.RegisterType((*DemoteMasterRequest)(nil), "tabletmanagerdata.DemoteMasterRequest") - proto.RegisterType((*DemoteMasterResponse)(nil), "tabletmanagerdata.DemoteMasterResponse") - proto.RegisterType((*UndoDemoteMasterRequest)(nil), "tabletmanagerdata.UndoDemoteMasterRequest") - proto.RegisterType((*UndoDemoteMasterResponse)(nil), "tabletmanagerdata.UndoDemoteMasterResponse") - proto.RegisterType((*SlaveWasPromotedRequest)(nil), "tabletmanagerdata.SlaveWasPromotedRequest") - proto.RegisterType((*SlaveWasPromotedResponse)(nil), "tabletmanagerdata.SlaveWasPromotedResponse") - proto.RegisterType((*SetMasterRequest)(nil), "tabletmanagerdata.SetMasterRequest") - proto.RegisterType((*SetMasterResponse)(nil), "tabletmanagerdata.SetMasterResponse") - proto.RegisterType((*SlaveWasRestartedRequest)(nil), "tabletmanagerdata.SlaveWasRestartedRequest") - proto.RegisterType((*SlaveWasRestartedResponse)(nil), "tabletmanagerdata.SlaveWasRestartedResponse") - proto.RegisterType((*StopReplicationAndGetStatusRequest)(nil), "tabletmanagerdata.StopReplicationAndGetStatusRequest") - proto.RegisterType((*StopReplicationAndGetStatusResponse)(nil), "tabletmanagerdata.StopReplicationAndGetStatusResponse") - proto.RegisterType((*PromoteReplicaRequest)(nil), "tabletmanagerdata.PromoteReplicaRequest") - proto.RegisterType((*PromoteReplicaResponse)(nil), "tabletmanagerdata.PromoteReplicaResponse") - proto.RegisterType((*BackupRequest)(nil), "tabletmanagerdata.BackupRequest") - proto.RegisterType((*BackupResponse)(nil), "tabletmanagerdata.BackupResponse") - proto.RegisterType((*RestoreFromBackupRequest)(nil), "tabletmanagerdata.RestoreFromBackupRequest") - proto.RegisterType((*RestoreFromBackupResponse)(nil), "tabletmanagerdata.RestoreFromBackupResponse") +// Deprecated +type SlaveStatusRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SlaveStatusRequest) Reset() { *m = SlaveStatusRequest{} } +func (m *SlaveStatusRequest) String() string { return proto.CompactTextString(m) } +func (*SlaveStatusRequest) ProtoMessage() {} +func (*SlaveStatusRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{90} +} + +func (m *SlaveStatusRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SlaveStatusRequest.Unmarshal(m, b) +} +func (m *SlaveStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SlaveStatusRequest.Marshal(b, m, deterministic) +} +func (m *SlaveStatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlaveStatusRequest.Merge(m, src) +} +func (m *SlaveStatusRequest) XXX_Size() int { + return xxx_messageInfo_SlaveStatusRequest.Size(m) +} +func (m *SlaveStatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SlaveStatusRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SlaveStatusRequest proto.InternalMessageInfo + +// Deprecated +type SlaveStatusResponse struct { + Status *replicationdata.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SlaveStatusResponse) Reset() { *m = SlaveStatusResponse{} } +func (m *SlaveStatusResponse) String() string { return proto.CompactTextString(m) } +func (*SlaveStatusResponse) ProtoMessage() {} +func (*SlaveStatusResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{91} +} + +func (m *SlaveStatusResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SlaveStatusResponse.Unmarshal(m, b) +} +func (m *SlaveStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SlaveStatusResponse.Marshal(b, m, deterministic) +} +func (m *SlaveStatusResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlaveStatusResponse.Merge(m, src) +} +func (m *SlaveStatusResponse) XXX_Size() int { + return xxx_messageInfo_SlaveStatusResponse.Size(m) +} +func (m *SlaveStatusResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SlaveStatusResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SlaveStatusResponse proto.InternalMessageInfo + +func (m *SlaveStatusResponse) GetStatus() *replicationdata.Status { + if m != nil { + return m.Status + } + return nil +} + +// Deprecated +type StopSlaveRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StopSlaveRequest) Reset() { *m = StopSlaveRequest{} } +func (m *StopSlaveRequest) String() string { return proto.CompactTextString(m) } +func (*StopSlaveRequest) ProtoMessage() {} +func (*StopSlaveRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{92} +} + +func (m *StopSlaveRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopSlaveRequest.Unmarshal(m, b) +} +func (m *StopSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopSlaveRequest.Marshal(b, m, deterministic) +} +func (m *StopSlaveRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopSlaveRequest.Merge(m, src) +} +func (m *StopSlaveRequest) XXX_Size() int { + return xxx_messageInfo_StopSlaveRequest.Size(m) +} +func (m *StopSlaveRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StopSlaveRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StopSlaveRequest proto.InternalMessageInfo + +// Deprecated +type StopSlaveResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StopSlaveResponse) Reset() { *m = StopSlaveResponse{} } +func (m *StopSlaveResponse) String() string { return proto.CompactTextString(m) } +func (*StopSlaveResponse) ProtoMessage() {} +func (*StopSlaveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{93} +} + +func (m *StopSlaveResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopSlaveResponse.Unmarshal(m, b) +} +func (m *StopSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopSlaveResponse.Marshal(b, m, deterministic) +} +func (m *StopSlaveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopSlaveResponse.Merge(m, src) +} +func (m *StopSlaveResponse) XXX_Size() int { + return xxx_messageInfo_StopSlaveResponse.Size(m) +} +func (m *StopSlaveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StopSlaveResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_StopSlaveResponse proto.InternalMessageInfo + +// Deprecated +type StopSlaveMinimumRequest struct { + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + WaitTimeout int64 `protobuf:"varint,2,opt,name=wait_timeout,json=waitTimeout,proto3" json:"wait_timeout,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StopSlaveMinimumRequest) Reset() { *m = StopSlaveMinimumRequest{} } +func (m *StopSlaveMinimumRequest) String() string { return proto.CompactTextString(m) } +func (*StopSlaveMinimumRequest) ProtoMessage() {} +func (*StopSlaveMinimumRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{94} +} + +func (m *StopSlaveMinimumRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopSlaveMinimumRequest.Unmarshal(m, b) +} +func (m *StopSlaveMinimumRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopSlaveMinimumRequest.Marshal(b, m, deterministic) +} +func (m *StopSlaveMinimumRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopSlaveMinimumRequest.Merge(m, src) +} +func (m *StopSlaveMinimumRequest) XXX_Size() int { + return xxx_messageInfo_StopSlaveMinimumRequest.Size(m) +} +func (m *StopSlaveMinimumRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StopSlaveMinimumRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StopSlaveMinimumRequest proto.InternalMessageInfo + +func (m *StopSlaveMinimumRequest) GetPosition() string { + if m != nil { + return m.Position + } + return "" +} + +func (m *StopSlaveMinimumRequest) GetWaitTimeout() int64 { + if m != nil { + return m.WaitTimeout + } + return 0 +} + +// Deprecated +type StopSlaveMinimumResponse struct { + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StopSlaveMinimumResponse) Reset() { *m = StopSlaveMinimumResponse{} } +func (m *StopSlaveMinimumResponse) String() string { return proto.CompactTextString(m) } +func (*StopSlaveMinimumResponse) ProtoMessage() {} +func (*StopSlaveMinimumResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{95} +} + +func (m *StopSlaveMinimumResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StopSlaveMinimumResponse.Unmarshal(m, b) +} +func (m *StopSlaveMinimumResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StopSlaveMinimumResponse.Marshal(b, m, deterministic) +} +func (m *StopSlaveMinimumResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopSlaveMinimumResponse.Merge(m, src) +} +func (m *StopSlaveMinimumResponse) XXX_Size() int { + return xxx_messageInfo_StopSlaveMinimumResponse.Size(m) +} +func (m *StopSlaveMinimumResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StopSlaveMinimumResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_StopSlaveMinimumResponse proto.InternalMessageInfo + +func (m *StopSlaveMinimumResponse) GetPosition() string { + if m != nil { + return m.Position + } + return "" +} + +// Deprecated +type StartSlaveRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StartSlaveRequest) Reset() { *m = StartSlaveRequest{} } +func (m *StartSlaveRequest) String() string { return proto.CompactTextString(m) } +func (*StartSlaveRequest) ProtoMessage() {} +func (*StartSlaveRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{96} +} + +func (m *StartSlaveRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartSlaveRequest.Unmarshal(m, b) +} +func (m *StartSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartSlaveRequest.Marshal(b, m, deterministic) +} +func (m *StartSlaveRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartSlaveRequest.Merge(m, src) +} +func (m *StartSlaveRequest) XXX_Size() int { + return xxx_messageInfo_StartSlaveRequest.Size(m) +} +func (m *StartSlaveRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StartSlaveRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StartSlaveRequest proto.InternalMessageInfo + +// Deprecated +type StartSlaveResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StartSlaveResponse) Reset() { *m = StartSlaveResponse{} } +func (m *StartSlaveResponse) String() string { return proto.CompactTextString(m) } +func (*StartSlaveResponse) ProtoMessage() {} +func (*StartSlaveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{97} +} + +func (m *StartSlaveResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartSlaveResponse.Unmarshal(m, b) +} +func (m *StartSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartSlaveResponse.Marshal(b, m, deterministic) +} +func (m *StartSlaveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartSlaveResponse.Merge(m, src) +} +func (m *StartSlaveResponse) XXX_Size() int { + return xxx_messageInfo_StartSlaveResponse.Size(m) +} +func (m *StartSlaveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StartSlaveResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_StartSlaveResponse proto.InternalMessageInfo + +// Deprecated +type StartSlaveUntilAfterRequest struct { + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + WaitTimeout int64 `protobuf:"varint,2,opt,name=wait_timeout,json=waitTimeout,proto3" json:"wait_timeout,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StartSlaveUntilAfterRequest) Reset() { *m = StartSlaveUntilAfterRequest{} } +func (m *StartSlaveUntilAfterRequest) String() string { return proto.CompactTextString(m) } +func (*StartSlaveUntilAfterRequest) ProtoMessage() {} +func (*StartSlaveUntilAfterRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{98} +} + +func (m *StartSlaveUntilAfterRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartSlaveUntilAfterRequest.Unmarshal(m, b) +} +func (m *StartSlaveUntilAfterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartSlaveUntilAfterRequest.Marshal(b, m, deterministic) +} +func (m *StartSlaveUntilAfterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartSlaveUntilAfterRequest.Merge(m, src) +} +func (m *StartSlaveUntilAfterRequest) XXX_Size() int { + return xxx_messageInfo_StartSlaveUntilAfterRequest.Size(m) +} +func (m *StartSlaveUntilAfterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StartSlaveUntilAfterRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StartSlaveUntilAfterRequest proto.InternalMessageInfo + +func (m *StartSlaveUntilAfterRequest) GetPosition() string { + if m != nil { + return m.Position + } + return "" +} + +func (m *StartSlaveUntilAfterRequest) GetWaitTimeout() int64 { + if m != nil { + return m.WaitTimeout + } + return 0 +} + +// Deprecated +type StartSlaveUntilAfterResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StartSlaveUntilAfterResponse) Reset() { *m = StartSlaveUntilAfterResponse{} } +func (m *StartSlaveUntilAfterResponse) String() string { return proto.CompactTextString(m) } +func (*StartSlaveUntilAfterResponse) ProtoMessage() {} +func (*StartSlaveUntilAfterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{99} +} + +func (m *StartSlaveUntilAfterResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StartSlaveUntilAfterResponse.Unmarshal(m, b) +} +func (m *StartSlaveUntilAfterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StartSlaveUntilAfterResponse.Marshal(b, m, deterministic) +} +func (m *StartSlaveUntilAfterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartSlaveUntilAfterResponse.Merge(m, src) +} +func (m *StartSlaveUntilAfterResponse) XXX_Size() int { + return xxx_messageInfo_StartSlaveUntilAfterResponse.Size(m) +} +func (m *StartSlaveUntilAfterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_StartSlaveUntilAfterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_StartSlaveUntilAfterResponse proto.InternalMessageInfo + +// Deprecated +type GetSlavesRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetSlavesRequest) Reset() { *m = GetSlavesRequest{} } +func (m *GetSlavesRequest) String() string { return proto.CompactTextString(m) } +func (*GetSlavesRequest) ProtoMessage() {} +func (*GetSlavesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{100} +} + +func (m *GetSlavesRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetSlavesRequest.Unmarshal(m, b) +} +func (m *GetSlavesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetSlavesRequest.Marshal(b, m, deterministic) +} +func (m *GetSlavesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetSlavesRequest.Merge(m, src) +} +func (m *GetSlavesRequest) XXX_Size() int { + return xxx_messageInfo_GetSlavesRequest.Size(m) +} +func (m *GetSlavesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetSlavesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetSlavesRequest proto.InternalMessageInfo + +// Deprecated +type GetSlavesResponse struct { + Addrs []string `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetSlavesResponse) Reset() { *m = GetSlavesResponse{} } +func (m *GetSlavesResponse) String() string { return proto.CompactTextString(m) } +func (*GetSlavesResponse) ProtoMessage() {} +func (*GetSlavesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{101} +} + +func (m *GetSlavesResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetSlavesResponse.Unmarshal(m, b) +} +func (m *GetSlavesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetSlavesResponse.Marshal(b, m, deterministic) +} +func (m *GetSlavesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetSlavesResponse.Merge(m, src) +} +func (m *GetSlavesResponse) XXX_Size() int { + return xxx_messageInfo_GetSlavesResponse.Size(m) +} +func (m *GetSlavesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetSlavesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetSlavesResponse proto.InternalMessageInfo + +func (m *GetSlavesResponse) GetAddrs() []string { + if m != nil { + return m.Addrs + } + return nil +} + +// Deprecated +type InitSlaveRequest struct { + Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + ReplicationPosition string `protobuf:"bytes,2,opt,name=replication_position,json=replicationPosition,proto3" json:"replication_position,omitempty"` + TimeCreatedNs int64 `protobuf:"varint,3,opt,name=time_created_ns,json=timeCreatedNs,proto3" json:"time_created_ns,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *InitSlaveRequest) Reset() { *m = InitSlaveRequest{} } +func (m *InitSlaveRequest) String() string { return proto.CompactTextString(m) } +func (*InitSlaveRequest) ProtoMessage() {} +func (*InitSlaveRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{102} +} + +func (m *InitSlaveRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InitSlaveRequest.Unmarshal(m, b) +} +func (m *InitSlaveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InitSlaveRequest.Marshal(b, m, deterministic) +} +func (m *InitSlaveRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_InitSlaveRequest.Merge(m, src) +} +func (m *InitSlaveRequest) XXX_Size() int { + return xxx_messageInfo_InitSlaveRequest.Size(m) +} +func (m *InitSlaveRequest) XXX_DiscardUnknown() { + xxx_messageInfo_InitSlaveRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_InitSlaveRequest proto.InternalMessageInfo + +func (m *InitSlaveRequest) GetParent() *topodata.TabletAlias { + if m != nil { + return m.Parent + } + return nil +} + +func (m *InitSlaveRequest) GetReplicationPosition() string { + if m != nil { + return m.ReplicationPosition + } + return "" +} + +func (m *InitSlaveRequest) GetTimeCreatedNs() int64 { + if m != nil { + return m.TimeCreatedNs + } + return 0 +} + +// Deprecated +type InitSlaveResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *InitSlaveResponse) Reset() { *m = InitSlaveResponse{} } +func (m *InitSlaveResponse) String() string { return proto.CompactTextString(m) } +func (*InitSlaveResponse) ProtoMessage() {} +func (*InitSlaveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{103} +} + +func (m *InitSlaveResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InitSlaveResponse.Unmarshal(m, b) +} +func (m *InitSlaveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InitSlaveResponse.Marshal(b, m, deterministic) +} +func (m *InitSlaveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_InitSlaveResponse.Merge(m, src) +} +func (m *InitSlaveResponse) XXX_Size() int { + return xxx_messageInfo_InitSlaveResponse.Size(m) +} +func (m *InitSlaveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_InitSlaveResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_InitSlaveResponse proto.InternalMessageInfo + +// Deprecated +type SlaveWasPromotedRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SlaveWasPromotedRequest) Reset() { *m = SlaveWasPromotedRequest{} } +func (m *SlaveWasPromotedRequest) String() string { return proto.CompactTextString(m) } +func (*SlaveWasPromotedRequest) ProtoMessage() {} +func (*SlaveWasPromotedRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{104} +} + +func (m *SlaveWasPromotedRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SlaveWasPromotedRequest.Unmarshal(m, b) +} +func (m *SlaveWasPromotedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SlaveWasPromotedRequest.Marshal(b, m, deterministic) +} +func (m *SlaveWasPromotedRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlaveWasPromotedRequest.Merge(m, src) +} +func (m *SlaveWasPromotedRequest) XXX_Size() int { + return xxx_messageInfo_SlaveWasPromotedRequest.Size(m) +} +func (m *SlaveWasPromotedRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SlaveWasPromotedRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SlaveWasPromotedRequest proto.InternalMessageInfo + +// Deprecated +type SlaveWasPromotedResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SlaveWasPromotedResponse) Reset() { *m = SlaveWasPromotedResponse{} } +func (m *SlaveWasPromotedResponse) String() string { return proto.CompactTextString(m) } +func (*SlaveWasPromotedResponse) ProtoMessage() {} +func (*SlaveWasPromotedResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{105} +} + +func (m *SlaveWasPromotedResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SlaveWasPromotedResponse.Unmarshal(m, b) +} +func (m *SlaveWasPromotedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SlaveWasPromotedResponse.Marshal(b, m, deterministic) +} +func (m *SlaveWasPromotedResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlaveWasPromotedResponse.Merge(m, src) +} +func (m *SlaveWasPromotedResponse) XXX_Size() int { + return xxx_messageInfo_SlaveWasPromotedResponse.Size(m) +} +func (m *SlaveWasPromotedResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SlaveWasPromotedResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SlaveWasPromotedResponse proto.InternalMessageInfo + +// Deprecated +type SlaveWasRestartedRequest struct { + // the parent alias the tablet should have + Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SlaveWasRestartedRequest) Reset() { *m = SlaveWasRestartedRequest{} } +func (m *SlaveWasRestartedRequest) String() string { return proto.CompactTextString(m) } +func (*SlaveWasRestartedRequest) ProtoMessage() {} +func (*SlaveWasRestartedRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{106} +} + +func (m *SlaveWasRestartedRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SlaveWasRestartedRequest.Unmarshal(m, b) +} +func (m *SlaveWasRestartedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SlaveWasRestartedRequest.Marshal(b, m, deterministic) +} +func (m *SlaveWasRestartedRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlaveWasRestartedRequest.Merge(m, src) +} +func (m *SlaveWasRestartedRequest) XXX_Size() int { + return xxx_messageInfo_SlaveWasRestartedRequest.Size(m) +} +func (m *SlaveWasRestartedRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SlaveWasRestartedRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SlaveWasRestartedRequest proto.InternalMessageInfo + +func (m *SlaveWasRestartedRequest) GetParent() *topodata.TabletAlias { + if m != nil { + return m.Parent + } + return nil +} + +// Deprecated +type SlaveWasRestartedResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SlaveWasRestartedResponse) Reset() { *m = SlaveWasRestartedResponse{} } +func (m *SlaveWasRestartedResponse) String() string { return proto.CompactTextString(m) } +func (*SlaveWasRestartedResponse) ProtoMessage() {} +func (*SlaveWasRestartedResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9ac4f89e61ffa4, []int{107} +} + +func (m *SlaveWasRestartedResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SlaveWasRestartedResponse.Unmarshal(m, b) +} +func (m *SlaveWasRestartedResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SlaveWasRestartedResponse.Marshal(b, m, deterministic) +} +func (m *SlaveWasRestartedResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlaveWasRestartedResponse.Merge(m, src) +} +func (m *SlaveWasRestartedResponse) XXX_Size() int { + return xxx_messageInfo_SlaveWasRestartedResponse.Size(m) +} +func (m *SlaveWasRestartedResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SlaveWasRestartedResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SlaveWasRestartedResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*TableDefinition)(nil), "tabletmanagerdata.TableDefinition") + proto.RegisterType((*SchemaDefinition)(nil), "tabletmanagerdata.SchemaDefinition") + proto.RegisterType((*SchemaChangeResult)(nil), "tabletmanagerdata.SchemaChangeResult") + proto.RegisterType((*UserPermission)(nil), "tabletmanagerdata.UserPermission") + proto.RegisterMapType((map[string]string)(nil), "tabletmanagerdata.UserPermission.PrivilegesEntry") + proto.RegisterType((*DbPermission)(nil), "tabletmanagerdata.DbPermission") + proto.RegisterMapType((map[string]string)(nil), "tabletmanagerdata.DbPermission.PrivilegesEntry") + proto.RegisterType((*Permissions)(nil), "tabletmanagerdata.Permissions") + proto.RegisterType((*PingRequest)(nil), "tabletmanagerdata.PingRequest") + proto.RegisterType((*PingResponse)(nil), "tabletmanagerdata.PingResponse") + proto.RegisterType((*SleepRequest)(nil), "tabletmanagerdata.SleepRequest") + proto.RegisterType((*SleepResponse)(nil), "tabletmanagerdata.SleepResponse") + proto.RegisterType((*ExecuteHookRequest)(nil), "tabletmanagerdata.ExecuteHookRequest") + proto.RegisterMapType((map[string]string)(nil), "tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry") + proto.RegisterType((*ExecuteHookResponse)(nil), "tabletmanagerdata.ExecuteHookResponse") + proto.RegisterType((*GetSchemaRequest)(nil), "tabletmanagerdata.GetSchemaRequest") + proto.RegisterType((*GetSchemaResponse)(nil), "tabletmanagerdata.GetSchemaResponse") + proto.RegisterType((*GetPermissionsRequest)(nil), "tabletmanagerdata.GetPermissionsRequest") + proto.RegisterType((*GetPermissionsResponse)(nil), "tabletmanagerdata.GetPermissionsResponse") + proto.RegisterType((*SetReadOnlyRequest)(nil), "tabletmanagerdata.SetReadOnlyRequest") + proto.RegisterType((*SetReadOnlyResponse)(nil), "tabletmanagerdata.SetReadOnlyResponse") + proto.RegisterType((*SetReadWriteRequest)(nil), "tabletmanagerdata.SetReadWriteRequest") + proto.RegisterType((*SetReadWriteResponse)(nil), "tabletmanagerdata.SetReadWriteResponse") + proto.RegisterType((*ChangeTypeRequest)(nil), "tabletmanagerdata.ChangeTypeRequest") + proto.RegisterType((*ChangeTypeResponse)(nil), "tabletmanagerdata.ChangeTypeResponse") + proto.RegisterType((*RefreshStateRequest)(nil), "tabletmanagerdata.RefreshStateRequest") + proto.RegisterType((*RefreshStateResponse)(nil), "tabletmanagerdata.RefreshStateResponse") + proto.RegisterType((*RunHealthCheckRequest)(nil), "tabletmanagerdata.RunHealthCheckRequest") + proto.RegisterType((*RunHealthCheckResponse)(nil), "tabletmanagerdata.RunHealthCheckResponse") + proto.RegisterType((*IgnoreHealthErrorRequest)(nil), "tabletmanagerdata.IgnoreHealthErrorRequest") + proto.RegisterType((*IgnoreHealthErrorResponse)(nil), "tabletmanagerdata.IgnoreHealthErrorResponse") + proto.RegisterType((*ReloadSchemaRequest)(nil), "tabletmanagerdata.ReloadSchemaRequest") + proto.RegisterType((*ReloadSchemaResponse)(nil), "tabletmanagerdata.ReloadSchemaResponse") + proto.RegisterType((*PreflightSchemaRequest)(nil), "tabletmanagerdata.PreflightSchemaRequest") + proto.RegisterType((*PreflightSchemaResponse)(nil), "tabletmanagerdata.PreflightSchemaResponse") + proto.RegisterType((*ApplySchemaRequest)(nil), "tabletmanagerdata.ApplySchemaRequest") + proto.RegisterType((*ApplySchemaResponse)(nil), "tabletmanagerdata.ApplySchemaResponse") + proto.RegisterType((*LockTablesRequest)(nil), "tabletmanagerdata.LockTablesRequest") + proto.RegisterType((*LockTablesResponse)(nil), "tabletmanagerdata.LockTablesResponse") + proto.RegisterType((*UnlockTablesRequest)(nil), "tabletmanagerdata.UnlockTablesRequest") + proto.RegisterType((*UnlockTablesResponse)(nil), "tabletmanagerdata.UnlockTablesResponse") + proto.RegisterType((*ExecuteFetchAsDbaRequest)(nil), "tabletmanagerdata.ExecuteFetchAsDbaRequest") + proto.RegisterType((*ExecuteFetchAsDbaResponse)(nil), "tabletmanagerdata.ExecuteFetchAsDbaResponse") + proto.RegisterType((*ExecuteFetchAsAllPrivsRequest)(nil), "tabletmanagerdata.ExecuteFetchAsAllPrivsRequest") + proto.RegisterType((*ExecuteFetchAsAllPrivsResponse)(nil), "tabletmanagerdata.ExecuteFetchAsAllPrivsResponse") + proto.RegisterType((*ExecuteFetchAsAppRequest)(nil), "tabletmanagerdata.ExecuteFetchAsAppRequest") + proto.RegisterType((*ExecuteFetchAsAppResponse)(nil), "tabletmanagerdata.ExecuteFetchAsAppResponse") + proto.RegisterType((*ReplicationStatusRequest)(nil), "tabletmanagerdata.ReplicationStatusRequest") + proto.RegisterType((*ReplicationStatusResponse)(nil), "tabletmanagerdata.ReplicationStatusResponse") + proto.RegisterType((*MasterPositionRequest)(nil), "tabletmanagerdata.MasterPositionRequest") + proto.RegisterType((*MasterPositionResponse)(nil), "tabletmanagerdata.MasterPositionResponse") + proto.RegisterType((*WaitForPositionRequest)(nil), "tabletmanagerdata.WaitForPositionRequest") + proto.RegisterType((*WaitForPositionResponse)(nil), "tabletmanagerdata.WaitForPositionResponse") + proto.RegisterType((*StopReplicationRequest)(nil), "tabletmanagerdata.StopReplicationRequest") + proto.RegisterType((*StopReplicationResponse)(nil), "tabletmanagerdata.StopReplicationResponse") + proto.RegisterType((*StopReplicationMinimumRequest)(nil), "tabletmanagerdata.StopReplicationMinimumRequest") + proto.RegisterType((*StopReplicationMinimumResponse)(nil), "tabletmanagerdata.StopReplicationMinimumResponse") + proto.RegisterType((*StartReplicationRequest)(nil), "tabletmanagerdata.StartReplicationRequest") + proto.RegisterType((*StartReplicationResponse)(nil), "tabletmanagerdata.StartReplicationResponse") + proto.RegisterType((*StartReplicationUntilAfterRequest)(nil), "tabletmanagerdata.StartReplicationUntilAfterRequest") + proto.RegisterType((*StartReplicationUntilAfterResponse)(nil), "tabletmanagerdata.StartReplicationUntilAfterResponse") + proto.RegisterType((*GetReplicasRequest)(nil), "tabletmanagerdata.GetReplicasRequest") + proto.RegisterType((*GetReplicasResponse)(nil), "tabletmanagerdata.GetReplicasResponse") + proto.RegisterType((*ResetReplicationRequest)(nil), "tabletmanagerdata.ResetReplicationRequest") + proto.RegisterType((*ResetReplicationResponse)(nil), "tabletmanagerdata.ResetReplicationResponse") + proto.RegisterType((*VReplicationExecRequest)(nil), "tabletmanagerdata.VReplicationExecRequest") + proto.RegisterType((*VReplicationExecResponse)(nil), "tabletmanagerdata.VReplicationExecResponse") + proto.RegisterType((*VReplicationWaitForPosRequest)(nil), "tabletmanagerdata.VReplicationWaitForPosRequest") + proto.RegisterType((*VReplicationWaitForPosResponse)(nil), "tabletmanagerdata.VReplicationWaitForPosResponse") + proto.RegisterType((*InitMasterRequest)(nil), "tabletmanagerdata.InitMasterRequest") + proto.RegisterType((*InitMasterResponse)(nil), "tabletmanagerdata.InitMasterResponse") + proto.RegisterType((*PopulateReparentJournalRequest)(nil), "tabletmanagerdata.PopulateReparentJournalRequest") + proto.RegisterType((*PopulateReparentJournalResponse)(nil), "tabletmanagerdata.PopulateReparentJournalResponse") + proto.RegisterType((*InitReplicaRequest)(nil), "tabletmanagerdata.InitReplicaRequest") + proto.RegisterType((*InitReplicaResponse)(nil), "tabletmanagerdata.InitReplicaResponse") + proto.RegisterType((*DemoteMasterRequest)(nil), "tabletmanagerdata.DemoteMasterRequest") + proto.RegisterType((*DemoteMasterResponse)(nil), "tabletmanagerdata.DemoteMasterResponse") + proto.RegisterType((*UndoDemoteMasterRequest)(nil), "tabletmanagerdata.UndoDemoteMasterRequest") + proto.RegisterType((*UndoDemoteMasterResponse)(nil), "tabletmanagerdata.UndoDemoteMasterResponse") + proto.RegisterType((*ReplicaWasPromotedRequest)(nil), "tabletmanagerdata.ReplicaWasPromotedRequest") + proto.RegisterType((*ReplicaWasPromotedResponse)(nil), "tabletmanagerdata.ReplicaWasPromotedResponse") + proto.RegisterType((*SetMasterRequest)(nil), "tabletmanagerdata.SetMasterRequest") + proto.RegisterType((*SetMasterResponse)(nil), "tabletmanagerdata.SetMasterResponse") + proto.RegisterType((*ReplicaWasRestartedRequest)(nil), "tabletmanagerdata.ReplicaWasRestartedRequest") + proto.RegisterType((*ReplicaWasRestartedResponse)(nil), "tabletmanagerdata.ReplicaWasRestartedResponse") + proto.RegisterType((*StopReplicationAndGetStatusRequest)(nil), "tabletmanagerdata.StopReplicationAndGetStatusRequest") + proto.RegisterType((*StopReplicationAndGetStatusResponse)(nil), "tabletmanagerdata.StopReplicationAndGetStatusResponse") + proto.RegisterType((*PromoteReplicaRequest)(nil), "tabletmanagerdata.PromoteReplicaRequest") + proto.RegisterType((*PromoteReplicaResponse)(nil), "tabletmanagerdata.PromoteReplicaResponse") + proto.RegisterType((*BackupRequest)(nil), "tabletmanagerdata.BackupRequest") + proto.RegisterType((*BackupResponse)(nil), "tabletmanagerdata.BackupResponse") + proto.RegisterType((*RestoreFromBackupRequest)(nil), "tabletmanagerdata.RestoreFromBackupRequest") + proto.RegisterType((*RestoreFromBackupResponse)(nil), "tabletmanagerdata.RestoreFromBackupResponse") + proto.RegisterType((*SlaveStatusRequest)(nil), "tabletmanagerdata.SlaveStatusRequest") + proto.RegisterType((*SlaveStatusResponse)(nil), "tabletmanagerdata.SlaveStatusResponse") + proto.RegisterType((*StopSlaveRequest)(nil), "tabletmanagerdata.StopSlaveRequest") + proto.RegisterType((*StopSlaveResponse)(nil), "tabletmanagerdata.StopSlaveResponse") + proto.RegisterType((*StopSlaveMinimumRequest)(nil), "tabletmanagerdata.StopSlaveMinimumRequest") + proto.RegisterType((*StopSlaveMinimumResponse)(nil), "tabletmanagerdata.StopSlaveMinimumResponse") + proto.RegisterType((*StartSlaveRequest)(nil), "tabletmanagerdata.StartSlaveRequest") + proto.RegisterType((*StartSlaveResponse)(nil), "tabletmanagerdata.StartSlaveResponse") + proto.RegisterType((*StartSlaveUntilAfterRequest)(nil), "tabletmanagerdata.StartSlaveUntilAfterRequest") + proto.RegisterType((*StartSlaveUntilAfterResponse)(nil), "tabletmanagerdata.StartSlaveUntilAfterResponse") + proto.RegisterType((*GetSlavesRequest)(nil), "tabletmanagerdata.GetSlavesRequest") + proto.RegisterType((*GetSlavesResponse)(nil), "tabletmanagerdata.GetSlavesResponse") + proto.RegisterType((*InitSlaveRequest)(nil), "tabletmanagerdata.InitSlaveRequest") + proto.RegisterType((*InitSlaveResponse)(nil), "tabletmanagerdata.InitSlaveResponse") + proto.RegisterType((*SlaveWasPromotedRequest)(nil), "tabletmanagerdata.SlaveWasPromotedRequest") + proto.RegisterType((*SlaveWasPromotedResponse)(nil), "tabletmanagerdata.SlaveWasPromotedResponse") + proto.RegisterType((*SlaveWasRestartedRequest)(nil), "tabletmanagerdata.SlaveWasRestartedRequest") + proto.RegisterType((*SlaveWasRestartedResponse)(nil), "tabletmanagerdata.SlaveWasRestartedResponse") } func init() { proto.RegisterFile("tabletmanagerdata.proto", fileDescriptor_ff9ac4f89e61ffa4) } var fileDescriptor_ff9ac4f89e61ffa4 = []byte{ - // 2029 bytes of a gzipped FileDescriptorProto + // 2154 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xdd, 0x6e, 0x1b, 0xc7, - 0x15, 0x06, 0x49, 0x49, 0xa6, 0x0e, 0x7f, 0x44, 0x2e, 0x29, 0x91, 0x92, 0x1b, 0x59, 0x5e, 0x3b, - 0x8d, 0xeb, 0xa2, 0x54, 0xa2, 0xa4, 0x41, 0x90, 0xa2, 0x40, 0x65, 0x59, 0xb2, 0x9d, 0x28, 0xb1, - 0xb2, 0xf2, 0x4f, 0x11, 0x14, 0x58, 0x0c, 0x77, 0x47, 0xe4, 0x42, 0xcb, 0x9d, 0xf5, 0xcc, 0x2c, - 0x25, 0xbe, 0x44, 0x9f, 0xa0, 0x77, 0x05, 0xda, 0xfb, 0x5e, 0xf6, 0x41, 0xd2, 0x47, 0xe9, 0x45, - 0x2f, 0x5a, 0xcc, 0xcf, 0x92, 0xb3, 0xe4, 0xca, 0x96, 0x5c, 0x17, 0xe8, 0x8d, 0xc1, 0xf9, 0xce, - 0xff, 0x99, 0x73, 0xce, 0x9c, 0xb5, 0xa0, 0xc3, 0x51, 0x3f, 0xc4, 0x7c, 0x84, 0x22, 0x34, 0xc0, - 0xd4, 0x47, 0x1c, 0xf5, 0x62, 0x4a, 0x38, 0xb1, 0x9a, 0x0b, 0x84, 0xad, 0xca, 0x9b, 0x04, 0xd3, - 0x89, 0xa2, 0x6f, 0xd5, 0x39, 0x89, 0xc9, 0x8c, 0x7f, 0x6b, 0x9d, 0xe2, 0x38, 0x0c, 0x3c, 0xc4, - 0x03, 0x12, 0x19, 0x70, 0x2d, 0x24, 0x83, 0x84, 0x07, 0xa1, 0x3a, 0xda, 0xff, 0x2e, 0xc0, 0xda, - 0x0b, 0xa1, 0xf8, 0x31, 0x3e, 0x0b, 0xa2, 0x40, 0x30, 0x5b, 0x16, 0x2c, 0x45, 0x68, 0x84, 0xbb, - 0x85, 0x9d, 0xc2, 0x83, 0x55, 0x47, 0xfe, 0xb6, 0x36, 0x60, 0x85, 0x79, 0x43, 0x3c, 0x42, 0xdd, - 0xa2, 0x44, 0xf5, 0xc9, 0xea, 0xc2, 0x2d, 0x8f, 0x84, 0xc9, 0x28, 0x62, 0xdd, 0xd2, 0x4e, 0xe9, - 0xc1, 0xaa, 0x93, 0x1e, 0xad, 0x1e, 0xb4, 0x62, 0x1a, 0x8c, 0x10, 0x9d, 0xb8, 0xe7, 0x78, 0xe2, - 0xa6, 0x5c, 0x4b, 0x92, 0xab, 0xa9, 0x49, 0xdf, 0xe2, 0xc9, 0x81, 0xe6, 0xb7, 0x60, 0x89, 0x4f, - 0x62, 0xdc, 0x5d, 0x56, 0x56, 0xc5, 0x6f, 0xeb, 0x0e, 0x54, 0x84, 0xeb, 0x6e, 0x88, 0xa3, 0x01, - 0x1f, 0x76, 0x57, 0x76, 0x0a, 0x0f, 0x96, 0x1c, 0x10, 0xd0, 0xb1, 0x44, 0xac, 0xdb, 0xb0, 0x4a, - 0xc9, 0x85, 0xeb, 0x91, 0x24, 0xe2, 0xdd, 0x5b, 0x92, 0x5c, 0xa6, 0xe4, 0xe2, 0x40, 0x9c, 0xad, - 0xfb, 0xb0, 0x72, 0x16, 0xe0, 0xd0, 0x67, 0xdd, 0xf2, 0x4e, 0xe9, 0x41, 0x65, 0xaf, 0xda, 0x53, - 0xf9, 0x3a, 0x12, 0xa0, 0xa3, 0x69, 0xf6, 0x5f, 0x0a, 0xd0, 0x38, 0x95, 0xc1, 0x18, 0x29, 0xf8, - 0x04, 0xd6, 0x84, 0x95, 0x3e, 0x62, 0xd8, 0xd5, 0x71, 0xab, 0x6c, 0xd4, 0x53, 0x58, 0x89, 0x58, - 0xcf, 0x41, 0xdd, 0x8b, 0xeb, 0x4f, 0x85, 0x59, 0xb7, 0x28, 0xcd, 0xd9, 0xbd, 0xc5, 0xab, 0x9c, - 0x4b, 0xb5, 0xd3, 0xe0, 0x59, 0x80, 0x89, 0x84, 0x8e, 0x31, 0x65, 0x01, 0x89, 0xba, 0x25, 0x69, - 0x31, 0x3d, 0x0a, 0x47, 0x2d, 0x65, 0xf5, 0x60, 0x88, 0xa2, 0x01, 0x76, 0x30, 0x4b, 0x42, 0x6e, - 0x3d, 0x85, 0x5a, 0x1f, 0x9f, 0x11, 0x9a, 0x71, 0xb4, 0xb2, 0x77, 0x2f, 0xc7, 0xfa, 0x7c, 0x98, - 0x4e, 0x55, 0x49, 0xea, 0x58, 0x8e, 0xa0, 0x8a, 0xce, 0x38, 0xa6, 0xae, 0x71, 0xd3, 0xd7, 0x54, - 0x54, 0x91, 0x82, 0x0a, 0xb6, 0xff, 0x59, 0x80, 0xfa, 0x4b, 0x86, 0xe9, 0x09, 0xa6, 0xa3, 0x80, - 0x31, 0x5d, 0x52, 0x43, 0xc2, 0x78, 0x5a, 0x52, 0xe2, 0xb7, 0xc0, 0x12, 0x86, 0xa9, 0x2e, 0x28, - 0xf9, 0xdb, 0xfa, 0x25, 0x34, 0x63, 0xc4, 0xd8, 0x05, 0xa1, 0xbe, 0xeb, 0x0d, 0xb1, 0x77, 0xce, - 0x92, 0x91, 0xcc, 0xc3, 0x92, 0xd3, 0x48, 0x09, 0x07, 0x1a, 0xb7, 0x7e, 0x00, 0x88, 0x69, 0x30, - 0x0e, 0x42, 0x3c, 0xc0, 0xaa, 0xb0, 0x2a, 0x7b, 0x9f, 0xe5, 0x78, 0x9b, 0xf5, 0xa5, 0x77, 0x32, - 0x95, 0x39, 0x8c, 0x38, 0x9d, 0x38, 0x86, 0x92, 0xad, 0xdf, 0xc2, 0xda, 0x1c, 0xd9, 0x6a, 0x40, - 0xe9, 0x1c, 0x4f, 0xb4, 0xe7, 0xe2, 0xa7, 0xd5, 0x86, 0xe5, 0x31, 0x0a, 0x13, 0xac, 0x3d, 0x57, - 0x87, 0xaf, 0x8b, 0x5f, 0x15, 0xec, 0x9f, 0x0a, 0x50, 0x7d, 0xdc, 0x7f, 0x47, 0xdc, 0x75, 0x28, - 0xfa, 0x7d, 0x2d, 0x5b, 0xf4, 0xfb, 0xd3, 0x3c, 0x94, 0x8c, 0x3c, 0x3c, 0xcf, 0x09, 0x6d, 0x37, - 0x27, 0x34, 0xd3, 0xd8, 0xff, 0x32, 0xb0, 0x3f, 0x17, 0xa0, 0x32, 0xb3, 0xc4, 0xac, 0x63, 0x68, - 0x08, 0x3f, 0xdd, 0x78, 0x86, 0x75, 0x0b, 0xd2, 0xcb, 0xbb, 0xef, 0xbc, 0x00, 0x67, 0x2d, 0xc9, - 0x9c, 0x99, 0x75, 0x04, 0x75, 0xbf, 0x9f, 0xd1, 0xa5, 0x3a, 0xe8, 0xce, 0x3b, 0x22, 0x76, 0x6a, - 0xbe, 0x71, 0x62, 0xf6, 0x27, 0x50, 0x39, 0x09, 0xa2, 0x81, 0x83, 0xdf, 0x24, 0x98, 0x71, 0xd1, - 0x4a, 0x31, 0x9a, 0x84, 0x04, 0xf9, 0x3a, 0xc8, 0xf4, 0x68, 0x3f, 0x80, 0xaa, 0x62, 0x64, 0x31, - 0x89, 0x18, 0x7e, 0x0b, 0xe7, 0x43, 0xa8, 0x9e, 0x86, 0x18, 0xc7, 0xa9, 0xce, 0x2d, 0x28, 0xfb, - 0x09, 0x95, 0x43, 0x55, 0xb2, 0x96, 0x9c, 0xe9, 0xd9, 0x5e, 0x83, 0x9a, 0xe6, 0x55, 0x6a, 0xed, - 0x7f, 0x14, 0xc0, 0x3a, 0xbc, 0xc4, 0x5e, 0xc2, 0xf1, 0x53, 0x42, 0xce, 0x53, 0x1d, 0x79, 0xf3, - 0x75, 0x1b, 0x20, 0x46, 0x14, 0x8d, 0x30, 0xc7, 0x54, 0x85, 0xbf, 0xea, 0x18, 0x88, 0x75, 0x02, - 0xab, 0xf8, 0x92, 0x53, 0xe4, 0xe2, 0x68, 0x2c, 0x27, 0x6d, 0x65, 0xef, 0xf3, 0x9c, 0xec, 0x2c, - 0x5a, 0xeb, 0x1d, 0x0a, 0xb1, 0xc3, 0x68, 0xac, 0x6a, 0xa2, 0x8c, 0xf5, 0x71, 0xeb, 0x37, 0x50, - 0xcb, 0x90, 0x6e, 0x54, 0x0f, 0x67, 0xd0, 0xca, 0x98, 0xd2, 0x79, 0xbc, 0x03, 0x15, 0x7c, 0x19, - 0x70, 0x97, 0x71, 0xc4, 0x13, 0xa6, 0x13, 0x04, 0x02, 0x3a, 0x95, 0x88, 0x7c, 0x46, 0xb8, 0x4f, - 0x12, 0x3e, 0x7d, 0x46, 0xe4, 0x49, 0xe3, 0x98, 0xa6, 0x5d, 0xa0, 0x4f, 0xf6, 0x18, 0x1a, 0x4f, - 0x30, 0x57, 0x73, 0x25, 0x4d, 0xdf, 0x06, 0xac, 0xc8, 0xc0, 0x55, 0xc5, 0xad, 0x3a, 0xfa, 0x64, - 0xdd, 0x83, 0x5a, 0x10, 0x79, 0x61, 0xe2, 0x63, 0x77, 0x1c, 0xe0, 0x0b, 0x26, 0x4d, 0x94, 0x9d, - 0xaa, 0x06, 0x5f, 0x09, 0xcc, 0xfa, 0x18, 0xea, 0xf8, 0x52, 0x31, 0x69, 0x25, 0xea, 0xd9, 0xaa, - 0x69, 0x54, 0x0e, 0x68, 0x66, 0x63, 0x68, 0x1a, 0x76, 0x75, 0x74, 0x27, 0xd0, 0x54, 0x93, 0xd1, - 0x18, 0xf6, 0x37, 0x99, 0xb6, 0x0d, 0x36, 0x87, 0xd8, 0x1d, 0x58, 0x7f, 0x82, 0xb9, 0x51, 0xc2, - 0x3a, 0x46, 0xfb, 0x47, 0xd8, 0x98, 0x27, 0x68, 0x27, 0x7e, 0x07, 0x95, 0x6c, 0xd3, 0x09, 0xf3, - 0xdb, 0x39, 0xe6, 0x4d, 0x61, 0x53, 0xc4, 0x6e, 0x83, 0x75, 0x8a, 0xb9, 0x83, 0x91, 0xff, 0x3c, - 0x0a, 0x27, 0xa9, 0xc5, 0x75, 0x68, 0x65, 0x50, 0x5d, 0xc2, 0x33, 0xf8, 0x35, 0x0d, 0x38, 0x4e, - 0xb9, 0x37, 0xa0, 0x9d, 0x85, 0x35, 0xfb, 0x37, 0xd0, 0x54, 0x8f, 0xd3, 0x8b, 0x49, 0x9c, 0x32, - 0x5b, 0xbf, 0x86, 0x8a, 0x72, 0xcf, 0x95, 0x0f, 0xbc, 0x70, 0xb9, 0xbe, 0xd7, 0xee, 0x4d, 0xf7, - 0x15, 0x99, 0x73, 0x2e, 0x25, 0x80, 0x4f, 0x7f, 0x0b, 0x3f, 0x4d, 0x5d, 0x33, 0x87, 0x1c, 0x7c, - 0x46, 0x31, 0x1b, 0x8a, 0x92, 0x32, 0x1d, 0xca, 0xc2, 0x9a, 0xbd, 0x03, 0xeb, 0x4e, 0x12, 0x3d, - 0xc5, 0x28, 0xe4, 0x43, 0xf9, 0x70, 0xa4, 0x02, 0x5d, 0xd8, 0x98, 0x27, 0x68, 0x91, 0x2f, 0xa0, - 0xfb, 0x6c, 0x10, 0x11, 0x8a, 0x15, 0xf1, 0x90, 0x52, 0x42, 0x33, 0x23, 0x85, 0x73, 0x4c, 0xa3, - 0xd9, 0xa0, 0x90, 0x47, 0xfb, 0x36, 0x6c, 0xe6, 0x48, 0x69, 0x95, 0x5f, 0x0b, 0xa7, 0xc5, 0x3c, - 0xc9, 0x56, 0xf2, 0x3d, 0xa8, 0x5d, 0xa0, 0x80, 0xbb, 0x31, 0x61, 0xb3, 0x62, 0x5a, 0x75, 0xaa, - 0x02, 0x3c, 0xd1, 0x98, 0x8a, 0xcc, 0x94, 0xd5, 0x3a, 0xf7, 0x60, 0xe3, 0x84, 0xe2, 0xb3, 0x30, - 0x18, 0x0c, 0xe7, 0x1a, 0x44, 0xec, 0x64, 0x32, 0x71, 0x69, 0x87, 0xa4, 0x47, 0x7b, 0x00, 0x9d, - 0x05, 0x19, 0x5d, 0x57, 0xc7, 0x50, 0x57, 0x5c, 0x2e, 0x95, 0x7b, 0x45, 0x3a, 0xcf, 0x3f, 0xbe, - 0xb2, 0xb2, 0xcd, 0x2d, 0xc4, 0xa9, 0x79, 0xc6, 0x89, 0xd9, 0xff, 0x2a, 0x80, 0xb5, 0x1f, 0xc7, - 0xe1, 0x24, 0xeb, 0x59, 0x03, 0x4a, 0xec, 0x4d, 0x98, 0x8e, 0x18, 0xf6, 0x26, 0x14, 0x23, 0xe6, - 0x8c, 0x50, 0x0f, 0xeb, 0x66, 0x55, 0x07, 0xb1, 0x06, 0xa0, 0x30, 0x24, 0x17, 0xae, 0xb1, 0xc3, - 0xca, 0xc9, 0x50, 0x76, 0x1a, 0x92, 0xe0, 0xcc, 0xf0, 0xc5, 0x05, 0x68, 0xe9, 0x43, 0x2d, 0x40, - 0xcb, 0xef, 0xb9, 0x00, 0xfd, 0xb5, 0x00, 0xad, 0x4c, 0xf4, 0x3a, 0xc7, 0xff, 0x7f, 0xab, 0x5a, - 0x0b, 0x9a, 0xc7, 0xc4, 0x3b, 0x57, 0x53, 0x2f, 0x6d, 0x8d, 0x36, 0x58, 0x26, 0x38, 0x6b, 0xbc, - 0x97, 0x51, 0xb8, 0xc0, 0xbc, 0x01, 0xed, 0x2c, 0xac, 0xd9, 0xff, 0x56, 0x80, 0xae, 0x7e, 0x22, - 0x8e, 0x30, 0xf7, 0x86, 0xfb, 0xec, 0x71, 0x7f, 0x5a, 0x07, 0x6d, 0x58, 0x96, 0xab, 0xb8, 0x4c, - 0x40, 0xd5, 0x51, 0x07, 0xab, 0x03, 0xb7, 0xfc, 0xbe, 0x2b, 0x9f, 0x46, 0xfd, 0x3a, 0xf8, 0xfd, - 0xef, 0xc5, 0xe3, 0xb8, 0x09, 0xe5, 0x11, 0xba, 0x74, 0x29, 0xb9, 0x60, 0x7a, 0x19, 0xbc, 0x35, - 0x42, 0x97, 0x0e, 0xb9, 0x60, 0x72, 0x51, 0x0f, 0x98, 0xdc, 0xc0, 0xfb, 0x41, 0x14, 0x92, 0x01, - 0x93, 0xd7, 0x5f, 0x76, 0xea, 0x1a, 0x7e, 0xa4, 0x50, 0xd1, 0x6b, 0x54, 0xb6, 0x91, 0x79, 0xb9, - 0x65, 0xa7, 0x4a, 0x8d, 0xde, 0xb2, 0x9f, 0xc0, 0x66, 0x8e, 0xcf, 0xfa, 0xf6, 0x1e, 0xc2, 0x8a, - 0x6a, 0x0d, 0x7d, 0x6d, 0x96, 0xfe, 0x9c, 0xf8, 0x41, 0xfc, 0xab, 0xdb, 0x40, 0x73, 0xd8, 0x7f, - 0x2c, 0xc0, 0x47, 0x59, 0x4d, 0xfb, 0x61, 0x28, 0x16, 0x30, 0xf6, 0xe1, 0x53, 0xb0, 0x10, 0xd9, - 0x52, 0x4e, 0x64, 0xc7, 0xb0, 0x7d, 0x95, 0x3f, 0xef, 0x11, 0xde, 0xb7, 0xf3, 0x77, 0xbb, 0x1f, - 0xc7, 0x6f, 0x0f, 0xcc, 0xf4, 0xbf, 0x98, 0xf1, 0x7f, 0x31, 0xe9, 0x52, 0xd9, 0x7b, 0x78, 0x25, - 0x1e, 0xb6, 0x10, 0x8d, 0xb1, 0xda, 0x35, 0xd2, 0x02, 0x3d, 0x82, 0x56, 0x06, 0xd5, 0x8a, 0x77, - 0xc5, 0xc6, 0x31, 0xdd, 0x52, 0x2a, 0x7b, 0x9d, 0xde, 0xfc, 0xf7, 0xb2, 0x16, 0xd0, 0x6c, 0xe2, - 0x25, 0xf9, 0x0e, 0x31, 0x8e, 0x69, 0x3a, 0x99, 0x53, 0x03, 0x5f, 0xc0, 0xc6, 0x3c, 0x41, 0xdb, - 0xd8, 0x82, 0xf2, 0xdc, 0x68, 0x9f, 0x9e, 0x85, 0xd4, 0x6b, 0x14, 0xf0, 0x23, 0x32, 0xaf, 0xef, - 0xad, 0x52, 0x9b, 0xd0, 0x59, 0x90, 0xd2, 0x0d, 0x67, 0x41, 0xe3, 0x94, 0x93, 0x58, 0xc6, 0x9a, - 0xba, 0xd6, 0x82, 0xa6, 0x81, 0x69, 0xc6, 0xdf, 0x43, 0x67, 0x0a, 0x7e, 0x17, 0x44, 0xc1, 0x28, - 0x19, 0x5d, 0xc3, 0xb4, 0x75, 0x17, 0xe4, 0xbb, 0xe4, 0xf2, 0x60, 0x84, 0xd3, 0x05, 0xae, 0xe4, - 0x54, 0x04, 0xf6, 0x42, 0x41, 0xf6, 0x97, 0xd0, 0x5d, 0xd4, 0x7c, 0x8d, 0x5c, 0x48, 0x37, 0x11, - 0xe5, 0x19, 0xdf, 0xc5, 0x6d, 0x1a, 0xa0, 0x76, 0xfe, 0x0f, 0x70, 0x7b, 0x86, 0xbe, 0x8c, 0x78, - 0x10, 0xee, 0x8b, 0x71, 0xf6, 0x81, 0x02, 0xd8, 0x86, 0x9f, 0xe5, 0x6b, 0x9f, 0xe5, 0x58, 0xac, - 0x85, 0x82, 0x3a, 0xad, 0xaf, 0x5f, 0xa8, 0x55, 0x51, 0x63, 0x3a, 0xda, 0x36, 0x2c, 0x23, 0xdf, - 0xa7, 0xe9, 0x03, 0xac, 0x0e, 0xe2, 0xf6, 0x1c, 0xcc, 0xc4, 0xde, 0x34, 0xad, 0xb4, 0x54, 0xcb, - 0x16, 0x74, 0x17, 0x49, 0xda, 0xea, 0x2e, 0x74, 0x5e, 0x19, 0xb8, 0x68, 0x96, 0xdc, 0x66, 0x5b, - 0xd5, 0xcd, 0x66, 0x1f, 0x41, 0x77, 0x51, 0xe0, 0xbd, 0xda, 0xfc, 0x23, 0x53, 0xcf, 0xac, 0xf2, - 0x52, 0xf3, 0x75, 0x28, 0x06, 0xbe, 0x5e, 0xf3, 0x8b, 0x81, 0x9f, 0x49, 0x7f, 0x71, 0xee, 0x92, - 0x77, 0x60, 0xfb, 0x2a, 0x65, 0x3a, 0xce, 0x16, 0x34, 0x9f, 0x45, 0x01, 0x57, 0xcd, 0x94, 0x26, - 0xe6, 0x53, 0xb0, 0x4c, 0xf0, 0x1a, 0xd5, 0xf4, 0x53, 0x01, 0xb6, 0x4f, 0x48, 0x9c, 0x84, 0x72, - 0x0f, 0x8c, 0x11, 0xc5, 0x11, 0xff, 0x86, 0x24, 0x34, 0x42, 0x61, 0xea, 0xf7, 0xcf, 0x61, 0x4d, - 0x54, 0x81, 0xeb, 0x51, 0x8c, 0x38, 0xf6, 0xdd, 0x28, 0xfd, 0x56, 0xa9, 0x09, 0xf8, 0x40, 0xa1, - 0xdf, 0x33, 0xf1, 0x3d, 0x83, 0x3c, 0xa1, 0xd4, 0x1c, 0xc9, 0xa0, 0x20, 0x39, 0x96, 0xbf, 0x82, - 0xea, 0x48, 0x7a, 0xe6, 0xa2, 0x30, 0x40, 0x6a, 0x34, 0x57, 0xf6, 0xd6, 0xe7, 0x77, 0xdb, 0x7d, - 0x41, 0x74, 0x2a, 0x8a, 0x55, 0x1e, 0xac, 0xcf, 0xa0, 0x6d, 0x0c, 0x9c, 0xd9, 0x0a, 0xb8, 0x24, - 0x6d, 0xb4, 0x0c, 0xda, 0x74, 0x13, 0xbc, 0x0b, 0x77, 0xae, 0x8c, 0x4b, 0xa7, 0xf0, 0x4f, 0x05, - 0x68, 0x88, 0x74, 0x99, 0x9d, 0x64, 0xfd, 0x0a, 0x56, 0x14, 0xb7, 0xbe, 0xf2, 0x2b, 0xdc, 0xd3, - 0x4c, 0x57, 0x7a, 0x56, 0xbc, 0xd2, 0xb3, 0xbc, 0x7c, 0x96, 0x72, 0xf2, 0x99, 0xde, 0x70, 0xb6, - 0xa5, 0xd7, 0xa1, 0xf5, 0x18, 0x8f, 0x08, 0xc7, 0xd9, 0x8b, 0xdf, 0x83, 0x76, 0x16, 0xbe, 0xc6, - 0xd5, 0x6f, 0x42, 0xe7, 0x65, 0xe4, 0x93, 0x3c, 0x75, 0x5b, 0xd0, 0x5d, 0x24, 0x69, 0x0f, 0x36, - 0xa1, 0x23, 0x5d, 0x7a, 0x8d, 0xd8, 0x09, 0x25, 0x82, 0xc1, 0x37, 0xc4, 0x16, 0x49, 0x5a, 0xec, - 0xef, 0x05, 0x68, 0x9c, 0xe2, 0x6c, 0xbd, 0xde, 0x34, 0xd9, 0x39, 0x99, 0x2b, 0xe6, 0x55, 0xe2, - 0xc2, 0xa7, 0xc2, 0xd2, 0xe2, 0xa7, 0x82, 0xf5, 0x10, 0x9a, 0x72, 0x7f, 0x16, 0xdf, 0xdf, 0x94, - 0xbb, 0x4c, 0x38, 0xae, 0xd7, 0xe6, 0x35, 0x49, 0x98, 0x0d, 0x37, 0x39, 0x73, 0xf1, 0x5c, 0x5b, - 0xd9, 0xcf, 0x66, 0xd1, 0x3a, 0x58, 0x2a, 0x99, 0x66, 0xe2, 0x86, 0x81, 0x89, 0xef, 0xa1, 0x1c, - 0x55, 0xda, 0xce, 0x7d, 0xb0, 0xc5, 0x43, 0x61, 0x8c, 0x83, 0xfd, 0xc8, 0x17, 0x53, 0x34, 0xf3, - 0x72, 0xbf, 0x82, 0x7b, 0x6f, 0xe5, 0xfa, 0x2f, 0x5e, 0x72, 0x7d, 0x97, 0x5a, 0xb5, 0xf1, 0x92, - 0xcf, 0x13, 0xae, 0x51, 0x74, 0xa7, 0x50, 0x7b, 0x84, 0xbc, 0xf3, 0x64, 0xba, 0x01, 0xed, 0x40, - 0xc5, 0x23, 0x91, 0x97, 0x50, 0x8a, 0x23, 0x6f, 0xa2, 0x27, 0x8b, 0x09, 0x09, 0x0e, 0xf9, 0x19, - 0xa3, 0xd2, 0xaf, 0xbf, 0x7d, 0x4c, 0xc8, 0xfe, 0x12, 0xea, 0xa9, 0x52, 0xed, 0xc2, 0x7d, 0x58, - 0xc6, 0xe3, 0x59, 0xfa, 0xeb, 0xbd, 0xf4, 0x3f, 0xf2, 0x0f, 0x05, 0xea, 0x28, 0xa2, 0x7e, 0x47, - 0x38, 0xa1, 0xf8, 0x88, 0x92, 0x51, 0xc6, 0x2f, 0x7b, 0x1f, 0x36, 0x73, 0x68, 0x37, 0x51, 0xff, - 0xe8, 0xd3, 0x1f, 0x7b, 0xe3, 0x80, 0x63, 0xc6, 0x7a, 0x01, 0xd9, 0x55, 0xbf, 0x76, 0x07, 0x64, - 0x77, 0xcc, 0x77, 0xe5, 0x9f, 0x13, 0x76, 0x17, 0xbe, 0x3f, 0xfa, 0x2b, 0x92, 0xf0, 0xf9, 0x7f, - 0x02, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xf1, 0x1f, 0x3a, 0xd8, 0x18, 0x00, 0x00, + 0x15, 0x06, 0xa9, 0x1f, 0x4b, 0x87, 0x3f, 0xa2, 0x56, 0x94, 0x48, 0x51, 0xb1, 0x2c, 0xaf, 0x9d, + 0xc6, 0x4d, 0x50, 0x2a, 0x51, 0x52, 0x23, 0x48, 0x5b, 0xa0, 0xb2, 0x2d, 0xd9, 0x8e, 0x95, 0x58, + 0x59, 0xf9, 0xa7, 0x08, 0x8a, 0x2e, 0x86, 0xdc, 0x11, 0xb5, 0xd0, 0x72, 0x67, 0x3d, 0x33, 0x4b, + 0x89, 0x2f, 0xd1, 0x27, 0x28, 0x7a, 0x53, 0xa0, 0xbd, 0xef, 0x43, 0xf4, 0x11, 0xd2, 0x47, 0xe9, + 0x45, 0x2f, 0x5a, 0xcc, 0xcc, 0x59, 0x72, 0x97, 0x5c, 0xc9, 0xb2, 0xa3, 0x00, 0xb9, 0x11, 0x76, + 0xbe, 0xf3, 0x7f, 0xe6, 0xcc, 0x99, 0x33, 0x14, 0x34, 0x24, 0xe9, 0x04, 0x54, 0xf6, 0x49, 0x48, + 0x7a, 0x94, 0x7b, 0x44, 0x92, 0x76, 0xc4, 0x99, 0x64, 0xd6, 0xf2, 0x14, 0xa1, 0x55, 0x7a, 0x13, + 0x53, 0x3e, 0x34, 0xf4, 0x56, 0x55, 0xb2, 0x88, 0x8d, 0xf9, 0x5b, 0xab, 0x9c, 0x46, 0x81, 0xdf, + 0x25, 0xd2, 0x67, 0x61, 0x0a, 0xae, 0x04, 0xac, 0x17, 0x4b, 0x3f, 0x30, 0x4b, 0xfb, 0x7f, 0x05, + 0x58, 0x7a, 0xa1, 0x14, 0x3f, 0xa2, 0xc7, 0x7e, 0xe8, 0x2b, 0x66, 0xcb, 0x82, 0xd9, 0x90, 0xf4, + 0x69, 0xb3, 0xb0, 0x55, 0xb8, 0xb7, 0xe8, 0xe8, 0x6f, 0x6b, 0x0d, 0xe6, 0x45, 0xf7, 0x84, 0xf6, + 0x49, 0xb3, 0xa8, 0x51, 0x5c, 0x59, 0x4d, 0xb8, 0xd1, 0x65, 0x41, 0xdc, 0x0f, 0x45, 0x73, 0x66, + 0x6b, 0xe6, 0xde, 0xa2, 0x93, 0x2c, 0xad, 0x36, 0xac, 0x44, 0xdc, 0xef, 0x13, 0x3e, 0x74, 0x4f, + 0xe9, 0xd0, 0x4d, 0xb8, 0x66, 0x35, 0xd7, 0x32, 0x92, 0x9e, 0xd1, 0xe1, 0x43, 0xe4, 0xb7, 0x60, + 0x56, 0x0e, 0x23, 0xda, 0x9c, 0x33, 0x56, 0xd5, 0xb7, 0x75, 0x0b, 0x4a, 0xca, 0x75, 0x37, 0xa0, + 0x61, 0x4f, 0x9e, 0x34, 0xe7, 0xb7, 0x0a, 0xf7, 0x66, 0x1d, 0x50, 0xd0, 0x81, 0x46, 0xac, 0x0d, + 0x58, 0xe4, 0xec, 0xcc, 0xed, 0xb2, 0x38, 0x94, 0xcd, 0x1b, 0x9a, 0xbc, 0xc0, 0xd9, 0xd9, 0x43, + 0xb5, 0xb6, 0xee, 0xc2, 0xfc, 0xb1, 0x4f, 0x03, 0x4f, 0x34, 0x17, 0xb6, 0x66, 0xee, 0x95, 0x76, + 0xca, 0x6d, 0x93, 0xaf, 0x7d, 0x05, 0x3a, 0x48, 0xb3, 0xff, 0x5e, 0x80, 0xda, 0x91, 0x0e, 0x26, + 0x95, 0x82, 0x8f, 0x60, 0x49, 0x59, 0xe9, 0x10, 0x41, 0x5d, 0x8c, 0xdb, 0x64, 0xa3, 0x9a, 0xc0, + 0x46, 0xc4, 0x7a, 0x0e, 0x66, 0x5f, 0x5c, 0x6f, 0x24, 0x2c, 0x9a, 0x45, 0x6d, 0xce, 0x6e, 0x4f, + 0x6f, 0xe5, 0x44, 0xaa, 0x9d, 0x9a, 0xcc, 0x02, 0x42, 0x25, 0x74, 0x40, 0xb9, 0xf0, 0x59, 0xd8, + 0x9c, 0xd1, 0x16, 0x93, 0xa5, 0x72, 0xd4, 0x32, 0x56, 0x1f, 0x9e, 0x90, 0xb0, 0x47, 0x1d, 0x2a, + 0xe2, 0x40, 0x5a, 0x4f, 0xa0, 0xd2, 0xa1, 0xc7, 0x8c, 0x67, 0x1c, 0x2d, 0xed, 0xdc, 0xc9, 0xb1, + 0x3e, 0x19, 0xa6, 0x53, 0x36, 0x92, 0x18, 0xcb, 0x3e, 0x94, 0xc9, 0xb1, 0xa4, 0xdc, 0x4d, 0xed, + 0xf4, 0x15, 0x15, 0x95, 0xb4, 0xa0, 0x81, 0xed, 0xff, 0x14, 0xa0, 0xfa, 0x52, 0x50, 0x7e, 0x48, + 0x79, 0xdf, 0x17, 0x02, 0x4b, 0xea, 0x84, 0x09, 0x99, 0x94, 0x94, 0xfa, 0x56, 0x58, 0x2c, 0x28, + 0xc7, 0x82, 0xd2, 0xdf, 0xd6, 0x27, 0xb0, 0x1c, 0x11, 0x21, 0xce, 0x18, 0xf7, 0xdc, 0xee, 0x09, + 0xed, 0x9e, 0x8a, 0xb8, 0xaf, 0xf3, 0x30, 0xeb, 0xd4, 0x12, 0xc2, 0x43, 0xc4, 0xad, 0xef, 0x00, + 0x22, 0xee, 0x0f, 0xfc, 0x80, 0xf6, 0xa8, 0x29, 0xac, 0xd2, 0xce, 0x67, 0x39, 0xde, 0x66, 0x7d, + 0x69, 0x1f, 0x8e, 0x64, 0xf6, 0x42, 0xc9, 0x87, 0x4e, 0x4a, 0x49, 0xeb, 0x77, 0xb0, 0x34, 0x41, + 0xb6, 0x6a, 0x30, 0x73, 0x4a, 0x87, 0xe8, 0xb9, 0xfa, 0xb4, 0xea, 0x30, 0x37, 0x20, 0x41, 0x4c, + 0xd1, 0x73, 0xb3, 0xf8, 0xaa, 0xf8, 0x65, 0xc1, 0xfe, 0xa1, 0x00, 0xe5, 0x47, 0x9d, 0xb7, 0xc4, + 0x5d, 0x85, 0xa2, 0xd7, 0x41, 0xd9, 0xa2, 0xd7, 0x19, 0xe5, 0x61, 0x26, 0x95, 0x87, 0xe7, 0x39, + 0xa1, 0x6d, 0xe7, 0x84, 0x96, 0x36, 0xf6, 0x53, 0x06, 0xf6, 0xb7, 0x02, 0x94, 0xc6, 0x96, 0x84, + 0x75, 0x00, 0x35, 0xe5, 0xa7, 0x1b, 0x8d, 0xb1, 0x66, 0x41, 0x7b, 0x79, 0xfb, 0xad, 0x1b, 0xe0, + 0x2c, 0xc5, 0x99, 0xb5, 0xb0, 0xf6, 0xa1, 0xea, 0x75, 0x32, 0xba, 0xcc, 0x09, 0xba, 0xf5, 0x96, + 0x88, 0x9d, 0x8a, 0x97, 0x5a, 0x09, 0xfb, 0x23, 0x28, 0x1d, 0xfa, 0x61, 0xcf, 0xa1, 0x6f, 0x62, + 0x2a, 0xa4, 0x3a, 0x4a, 0x11, 0x19, 0x06, 0x8c, 0x78, 0x18, 0x64, 0xb2, 0xb4, 0xef, 0x41, 0xd9, + 0x30, 0x8a, 0x88, 0x85, 0x82, 0x5e, 0xc2, 0xf9, 0x31, 0x94, 0x8f, 0x02, 0x4a, 0xa3, 0x44, 0x67, + 0x0b, 0x16, 0xbc, 0x98, 0xeb, 0xa6, 0xaa, 0x59, 0x67, 0x9c, 0xd1, 0xda, 0x5e, 0x82, 0x0a, 0xf2, + 0x1a, 0xb5, 0xf6, 0xbf, 0x0b, 0x60, 0xed, 0x9d, 0xd3, 0x6e, 0x2c, 0xe9, 0x13, 0xc6, 0x4e, 0x13, + 0x1d, 0x79, 0xfd, 0x75, 0x13, 0x20, 0x22, 0x9c, 0xf4, 0xa9, 0xa4, 0xdc, 0x84, 0xbf, 0xe8, 0xa4, + 0x10, 0xeb, 0x10, 0x16, 0xe9, 0xb9, 0xe4, 0xc4, 0xa5, 0xe1, 0x40, 0x77, 0xda, 0xd2, 0xce, 0xe7, + 0x39, 0xd9, 0x99, 0xb6, 0xd6, 0xde, 0x53, 0x62, 0x7b, 0xe1, 0xc0, 0xd4, 0xc4, 0x02, 0xc5, 0x65, + 0xeb, 0x37, 0x50, 0xc9, 0x90, 0xde, 0xa9, 0x1e, 0x8e, 0x61, 0x25, 0x63, 0x0a, 0xf3, 0x78, 0x0b, + 0x4a, 0xf4, 0xdc, 0x97, 0xae, 0x90, 0x44, 0xc6, 0x02, 0x13, 0x04, 0x0a, 0x3a, 0xd2, 0x88, 0xbe, + 0x46, 0xa4, 0xc7, 0x62, 0x39, 0xba, 0x46, 0xf4, 0x0a, 0x71, 0xca, 0x93, 0x53, 0x80, 0x2b, 0x7b, + 0x00, 0xb5, 0xc7, 0x54, 0x9a, 0xbe, 0x92, 0xa4, 0x6f, 0x0d, 0xe6, 0x75, 0xe0, 0xa6, 0xe2, 0x16, + 0x1d, 0x5c, 0x59, 0x77, 0xa0, 0xe2, 0x87, 0xdd, 0x20, 0xf6, 0xa8, 0x3b, 0xf0, 0xe9, 0x99, 0xd0, + 0x26, 0x16, 0x9c, 0x32, 0x82, 0xaf, 0x14, 0x66, 0x7d, 0x08, 0x55, 0x7a, 0x6e, 0x98, 0x50, 0x89, + 0xb9, 0xb6, 0x2a, 0x88, 0xea, 0x06, 0x2d, 0x6c, 0x0a, 0xcb, 0x29, 0xbb, 0x18, 0xdd, 0x21, 0x2c, + 0x9b, 0xce, 0x98, 0x6a, 0xf6, 0xef, 0xd2, 0x6d, 0x6b, 0x62, 0x02, 0xb1, 0x1b, 0xb0, 0xfa, 0x98, + 0xca, 0x54, 0x09, 0x63, 0x8c, 0xf6, 0xf7, 0xb0, 0x36, 0x49, 0x40, 0x27, 0x7e, 0x0f, 0xa5, 0xec, + 0xa1, 0x53, 0xe6, 0x37, 0x73, 0xcc, 0xa7, 0x85, 0xd3, 0x22, 0x76, 0x1d, 0xac, 0x23, 0x2a, 0x1d, + 0x4a, 0xbc, 0xe7, 0x61, 0x30, 0x4c, 0x2c, 0xae, 0xc2, 0x4a, 0x06, 0xc5, 0x12, 0x1e, 0xc3, 0xaf, + 0xb9, 0x2f, 0x69, 0xc2, 0xbd, 0x06, 0xf5, 0x2c, 0x8c, 0xec, 0x5f, 0xc3, 0xb2, 0xb9, 0x9c, 0x5e, + 0x0c, 0xa3, 0x84, 0xd9, 0xfa, 0x35, 0x94, 0x8c, 0x7b, 0xae, 0xbe, 0xe0, 0x95, 0xcb, 0xd5, 0x9d, + 0x7a, 0x7b, 0x34, 0xaf, 0xe8, 0x9c, 0x4b, 0x2d, 0x01, 0x72, 0xf4, 0xad, 0xfc, 0x4c, 0xeb, 0x1a, + 0x3b, 0xe4, 0xd0, 0x63, 0x4e, 0xc5, 0x89, 0x2a, 0xa9, 0xb4, 0x43, 0x59, 0x18, 0xd9, 0x1b, 0xb0, + 0xea, 0xc4, 0xe1, 0x13, 0x4a, 0x02, 0x79, 0xa2, 0x2f, 0x8e, 0x44, 0xa0, 0x09, 0x6b, 0x93, 0x04, + 0x14, 0xf9, 0x02, 0x9a, 0x4f, 0x7b, 0x21, 0xe3, 0xd4, 0x10, 0xf7, 0x38, 0x67, 0x3c, 0xd3, 0x52, + 0xa4, 0xa4, 0x3c, 0x1c, 0x37, 0x0a, 0xbd, 0xb4, 0x37, 0x60, 0x3d, 0x47, 0x0a, 0x55, 0x7e, 0xa5, + 0x9c, 0x56, 0xfd, 0x24, 0x5b, 0xc9, 0x77, 0xa0, 0x72, 0x46, 0x7c, 0xe9, 0x46, 0x4c, 0x8c, 0x8b, + 0x69, 0xd1, 0x29, 0x2b, 0xf0, 0x10, 0x31, 0x13, 0x59, 0x5a, 0x16, 0x75, 0xee, 0xc0, 0xda, 0x21, + 0xa7, 0xc7, 0x81, 0xdf, 0x3b, 0x99, 0x38, 0x20, 0x6a, 0x26, 0xd3, 0x89, 0x4b, 0x4e, 0x48, 0xb2, + 0xb4, 0x7b, 0xd0, 0x98, 0x92, 0xc1, 0xba, 0x3a, 0x80, 0xaa, 0xe1, 0x72, 0xb9, 0x9e, 0x2b, 0x92, + 0x7e, 0xfe, 0xe1, 0x85, 0x95, 0x9d, 0x9e, 0x42, 0x9c, 0x4a, 0x37, 0xb5, 0x12, 0xf6, 0x7f, 0x0b, + 0x60, 0xed, 0x46, 0x51, 0x30, 0xcc, 0x7a, 0x56, 0x83, 0x19, 0xf1, 0x26, 0x48, 0x5a, 0x8c, 0x78, + 0x13, 0xa8, 0x16, 0x73, 0xcc, 0x78, 0x97, 0xe2, 0x61, 0x35, 0x0b, 0x35, 0x06, 0x90, 0x20, 0x60, + 0x67, 0x6e, 0x6a, 0x86, 0xd5, 0x9d, 0x61, 0xc1, 0xa9, 0x69, 0x82, 0x33, 0xc6, 0xa7, 0x07, 0xa0, + 0xd9, 0xeb, 0x1a, 0x80, 0xe6, 0xde, 0x73, 0x00, 0xfa, 0x47, 0x01, 0x56, 0x32, 0xd1, 0x63, 0x8e, + 0x7f, 0x7e, 0xa3, 0xda, 0x0a, 0x2c, 0x1f, 0xb0, 0xee, 0xa9, 0xe9, 0x7a, 0xc9, 0xd1, 0xa8, 0x83, + 0x95, 0x06, 0xc7, 0x07, 0xef, 0x65, 0x18, 0x4c, 0x31, 0xaf, 0x41, 0x3d, 0x0b, 0x23, 0xfb, 0x3f, + 0x0b, 0xd0, 0xc4, 0x2b, 0x62, 0x9f, 0xca, 0xee, 0xc9, 0xae, 0x78, 0xd4, 0x19, 0xd5, 0x41, 0x1d, + 0xe6, 0xf4, 0x28, 0xae, 0x13, 0x50, 0x76, 0xcc, 0xc2, 0x6a, 0xc0, 0x0d, 0xaf, 0xe3, 0xea, 0xab, + 0x11, 0x6f, 0x07, 0xaf, 0xf3, 0xad, 0xba, 0x1c, 0xd7, 0x61, 0xa1, 0x4f, 0xce, 0x5d, 0xce, 0xce, + 0x04, 0x0e, 0x83, 0x37, 0xfa, 0xe4, 0xdc, 0x61, 0x67, 0x42, 0x0f, 0xea, 0xbe, 0xd0, 0x13, 0x78, + 0xc7, 0x0f, 0x03, 0xd6, 0x13, 0x7a, 0xfb, 0x17, 0x9c, 0x2a, 0xc2, 0x0f, 0x0c, 0xaa, 0xce, 0x1a, + 0xd7, 0xc7, 0x28, 0xbd, 0xb9, 0x0b, 0x4e, 0x99, 0xa7, 0xce, 0x96, 0xfd, 0x18, 0xd6, 0x73, 0x7c, + 0xc6, 0xdd, 0xfb, 0x18, 0xe6, 0xcd, 0xd1, 0xc0, 0x6d, 0xb3, 0xf0, 0x39, 0xf1, 0x9d, 0xfa, 0x8b, + 0xc7, 0x00, 0x39, 0xec, 0x3f, 0x17, 0xe0, 0x66, 0x56, 0xd3, 0x6e, 0x10, 0xa8, 0x01, 0x4c, 0x5c, + 0x7f, 0x0a, 0xa6, 0x22, 0x9b, 0xcd, 0x89, 0xec, 0x00, 0x36, 0x2f, 0xf2, 0xe7, 0x3d, 0xc2, 0x7b, + 0x36, 0xb9, 0xb7, 0xbb, 0x51, 0x74, 0x79, 0x60, 0x69, 0xff, 0x8b, 0x19, 0xff, 0xa7, 0x93, 0xae, + 0x95, 0xbd, 0x87, 0x57, 0x2d, 0x68, 0xa6, 0xfa, 0x82, 0x99, 0x38, 0x92, 0x32, 0x3d, 0x80, 0xf5, + 0x1c, 0x1a, 0x1a, 0xd9, 0x56, 0xd3, 0xc7, 0x68, 0x62, 0x29, 0xed, 0x34, 0xda, 0x93, 0x6f, 0x67, + 0x14, 0x40, 0x36, 0x75, 0xab, 0x7c, 0x43, 0x84, 0xa4, 0x3c, 0xe9, 0xd2, 0x89, 0x99, 0x2f, 0x60, + 0x6d, 0x92, 0x80, 0x36, 0x5a, 0xb0, 0x30, 0xd1, 0xe6, 0x47, 0x6b, 0x25, 0xf5, 0x9a, 0xf8, 0x72, + 0x9f, 0x4d, 0xea, 0xbb, 0x54, 0x6a, 0x1d, 0x1a, 0x53, 0x52, 0x78, 0xf8, 0x9a, 0xb0, 0x76, 0x24, + 0x59, 0x94, 0x8a, 0x38, 0x71, 0x70, 0x1d, 0x1a, 0x53, 0x14, 0x14, 0xfa, 0x13, 0xdc, 0x9c, 0x20, + 0x7d, 0xe3, 0x87, 0x7e, 0x3f, 0xee, 0x5f, 0xc1, 0x19, 0xeb, 0x36, 0xe8, 0x5b, 0xcb, 0x95, 0x7e, + 0x9f, 0x26, 0xe3, 0xdd, 0x8c, 0x53, 0x52, 0xd8, 0x0b, 0x03, 0xd9, 0xbf, 0x85, 0xcd, 0x8b, 0xf4, + 0x5f, 0x21, 0x47, 0xda, 0x71, 0xc2, 0x65, 0x4e, 0x4c, 0x2d, 0x68, 0x4e, 0x93, 0x30, 0xa8, 0x0e, + 0xdc, 0x9e, 0xa4, 0xbd, 0x0c, 0xa5, 0x1f, 0xec, 0xaa, 0x26, 0x78, 0x4d, 0x81, 0xdd, 0x05, 0xfb, + 0x32, 0x1b, 0xe8, 0x49, 0x1d, 0xac, 0xc7, 0x34, 0xe1, 0x19, 0xd5, 0xe5, 0x27, 0xb0, 0x92, 0x41, + 0x31, 0x13, 0x75, 0x98, 0x23, 0x9e, 0xc7, 0x93, 0x0b, 0xdc, 0x2c, 0x54, 0x0e, 0x1c, 0x2a, 0xe8, + 0x05, 0x39, 0x98, 0x26, 0xa1, 0xe5, 0x6d, 0x68, 0xbc, 0x4a, 0xe1, 0xea, 0xb0, 0xe5, 0x1e, 0xd6, + 0x45, 0x3c, 0xac, 0xf6, 0x3e, 0x34, 0xa7, 0x05, 0xde, 0xab, 0x4d, 0xdc, 0x4c, 0xeb, 0x19, 0x57, + 0x6b, 0x62, 0xbe, 0x0a, 0x45, 0xdf, 0xc3, 0x67, 0x42, 0xd1, 0xf7, 0x32, 0x1b, 0x51, 0x9c, 0x28, + 0x80, 0x2d, 0xd8, 0xbc, 0x48, 0x19, 0xc6, 0xb9, 0x02, 0xcb, 0x4f, 0x43, 0x5f, 0x9a, 0x03, 0x98, + 0x24, 0xe6, 0x53, 0xb0, 0xd2, 0xe0, 0x15, 0x2a, 0xed, 0x87, 0x02, 0x6c, 0x1e, 0xb2, 0x28, 0x0e, + 0xf4, 0x1c, 0x19, 0x11, 0x4e, 0x43, 0xf9, 0x35, 0x8b, 0x79, 0x48, 0x82, 0xc4, 0xef, 0x5f, 0xc0, + 0x92, 0xaa, 0x07, 0xb7, 0xcb, 0x29, 0x91, 0xd4, 0x73, 0xc3, 0xe4, 0xad, 0x53, 0x51, 0xf0, 0x43, + 0x83, 0x7e, 0x2b, 0xd4, 0x7b, 0x88, 0x74, 0x95, 0xd2, 0x74, 0x4b, 0x07, 0x03, 0xe9, 0xb6, 0xfe, + 0x25, 0x94, 0xfb, 0xda, 0x33, 0x97, 0x04, 0x3e, 0x31, 0xad, 0xbd, 0xb4, 0xb3, 0x3a, 0x39, 0x1b, + 0xef, 0x2a, 0xa2, 0x53, 0x32, 0xac, 0x7a, 0x61, 0x7d, 0x06, 0xf5, 0x54, 0x93, 0x1a, 0x8f, 0x90, + 0xb3, 0xda, 0xc6, 0x4a, 0x8a, 0x36, 0x9a, 0x24, 0x6f, 0xc3, 0xad, 0x0b, 0xe3, 0xc2, 0x14, 0xfe, + 0xb5, 0x60, 0xd2, 0x85, 0x89, 0x4e, 0xe2, 0xfd, 0x15, 0xcc, 0x1b, 0x7e, 0xdc, 0xf4, 0x0b, 0x1c, + 0x44, 0xa6, 0x0b, 0x7d, 0x2b, 0x5e, 0xe8, 0x5b, 0x5e, 0x46, 0x67, 0x72, 0x32, 0xaa, 0xa6, 0x90, + 0x8c, 0x7f, 0xe3, 0xe1, 0xe4, 0x11, 0xed, 0x33, 0x49, 0xb3, 0x9b, 0xbf, 0x03, 0xf5, 0x2c, 0x7c, + 0xb5, 0x46, 0xf3, 0x32, 0xf4, 0x58, 0x9e, 0xba, 0x16, 0x34, 0xa7, 0x49, 0xe8, 0xc1, 0xc6, 0xe8, + 0x82, 0x79, 0x4d, 0xc4, 0x21, 0x67, 0x8a, 0xc5, 0x4b, 0x04, 0x3f, 0x80, 0x56, 0x1e, 0x11, 0x45, + 0xff, 0x55, 0x80, 0xda, 0x11, 0xcd, 0xd6, 0xed, 0xbb, 0xa6, 0x3c, 0x27, 0x7f, 0xc5, 0xbc, 0x8a, + 0xbc, 0x0f, 0x0d, 0x3d, 0x62, 0xab, 0x27, 0x3a, 0x97, 0x39, 0xf3, 0xf5, 0xaa, 0x26, 0x4f, 0xf6, + 0xb3, 0xe9, 0xa7, 0xca, 0x6c, 0xce, 0x53, 0x65, 0x05, 0x96, 0x53, 0x71, 0x60, 0x74, 0xcf, 0xd2, + 0xb1, 0x3b, 0x54, 0xdb, 0x1d, 0x65, 0xe6, 0x1d, 0xc3, 0xb4, 0x6f, 0xc2, 0x46, 0xae, 0x32, 0xb4, + 0xa5, 0x3b, 0x71, 0xe6, 0x8a, 0xd9, 0x0d, 0x3d, 0xf5, 0x90, 0xcf, 0xcc, 0x02, 0xaf, 0xe0, 0xce, + 0xa5, 0x5c, 0x3f, 0x62, 0x2a, 0xc0, 0xbd, 0xcd, 0x1e, 0x1f, 0x75, 0xbf, 0x4f, 0x12, 0xae, 0x50, + 0x88, 0x47, 0x50, 0x79, 0x40, 0xba, 0xa7, 0xf1, 0x68, 0xb2, 0xda, 0x82, 0x52, 0x97, 0x85, 0xdd, + 0x98, 0x73, 0x1a, 0x76, 0x87, 0xd8, 0x71, 0xd2, 0x90, 0xe2, 0xd0, 0xcf, 0x23, 0xb3, 0x05, 0xf8, + 0xa6, 0x4a, 0x43, 0xf6, 0x7d, 0xa8, 0x26, 0x4a, 0xd1, 0x85, 0xbb, 0x30, 0x47, 0x07, 0xe3, 0x0d, + 0xa8, 0xb6, 0x93, 0x7f, 0x10, 0xec, 0x29, 0xd4, 0x31, 0x44, 0xbc, 0x5f, 0x24, 0xe3, 0x74, 0x9f, + 0xb3, 0x7e, 0xc6, 0x2f, 0x7b, 0x57, 0x95, 0xfe, 0x14, 0xed, 0x9d, 0xd4, 0xd7, 0xc1, 0x3a, 0x0a, + 0xc8, 0x80, 0x66, 0x37, 0x6a, 0x1f, 0x56, 0x32, 0xe8, 0xfb, 0x6e, 0x8c, 0x05, 0x35, 0xb5, 0xe1, + 0x5a, 0x57, 0xa2, 0x5b, 0xd5, 0xea, 0x18, 0xc3, 0xfa, 0xf9, 0x83, 0x99, 0x8e, 0x34, 0x78, 0xbd, + 0xc3, 0xcf, 0x7d, 0x35, 0xa3, 0x4c, 0x6a, 0xbe, 0x42, 0x11, 0x68, 0x37, 0x09, 0x97, 0x19, 0xdf, + 0x55, 0xb6, 0x52, 0x20, 0x3a, 0xff, 0x47, 0xd8, 0x18, 0xa3, 0xd7, 0x3e, 0xe4, 0x6c, 0xc2, 0x07, + 0xf9, 0xda, 0xd1, 0xba, 0x65, 0x7e, 0xa9, 0x53, 0xd4, 0xd1, 0xfe, 0xfd, 0xd2, 0xfc, 0x8a, 0x86, + 0xd8, 0xa5, 0xa3, 0xcd, 0x5f, 0x0a, 0x50, 0x53, 0x8d, 0x3d, 0x1d, 0xe7, 0xcf, 0xe8, 0xda, 0xc1, + 0xd1, 0x22, 0x9b, 0x70, 0x35, 0x92, 0x2a, 0x20, 0xa7, 0xe1, 0xab, 0x91, 0x74, 0x8a, 0x84, 0x62, + 0x4f, 0xc7, 0xb4, 0x1f, 0xdb, 0x0e, 0x37, 0x60, 0x3d, 0x47, 0x95, 0xb1, 0xf3, 0xe0, 0xd3, 0xef, + 0xdb, 0x03, 0x5f, 0x52, 0x21, 0xda, 0x3e, 0xdb, 0x36, 0x5f, 0xdb, 0x3d, 0xb6, 0x3d, 0x90, 0xdb, + 0xfa, 0x5f, 0x7f, 0xdb, 0x53, 0xbf, 0x15, 0x74, 0xe6, 0x35, 0xe1, 0xf3, 0xff, 0x07, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xaf, 0x7c, 0xe6, 0x84, 0x1c, 0x00, 0x00, } diff --git a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go index 83864faddba..9625b57e688 100644 --- a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go +++ b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go @@ -29,68 +29,76 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("tabletmanagerservice.proto", fileDescriptor_9ee75fe63cfd9360) } var fileDescriptor_9ee75fe63cfd9360 = []byte{ - // 962 bytes of a gzipped FileDescriptorProto + // 1102 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x98, 0x5b, 0x6f, 0x23, 0x35, - 0x14, 0xc7, 0xa9, 0x04, 0x2b, 0x61, 0xae, 0x6b, 0xad, 0x58, 0xa9, 0x48, 0x5c, 0xf6, 0xc2, 0xa5, - 0x8b, 0x9a, 0xbd, 0x08, 0xde, 0xb3, 0x97, 0xee, 0x16, 0x6d, 0x45, 0x48, 0x5a, 0x8a, 0x40, 0x42, - 0x72, 0x93, 0xd3, 0xc4, 0x74, 0x62, 0x1b, 0xdb, 0x89, 0xc8, 0x13, 0x12, 0x1f, 0x80, 0x47, 0x3e, - 0xef, 0x6a, 0x26, 0x63, 0xcf, 0xf1, 0xe4, 0x8c, 0x93, 0xbe, 0x55, 0xf3, 0xff, 0xf9, 0x1c, 0xfb, - 0xf8, 0xf8, 0x6f, 0x37, 0x6c, 0xdf, 0x8b, 0x8b, 0x02, 0xfc, 0x5c, 0x28, 0x31, 0x05, 0xeb, 0xc0, - 0x2e, 0xe5, 0x18, 0x0e, 0x8d, 0xd5, 0x5e, 0xf3, 0x5b, 0x94, 0xb6, 0x7f, 0x3b, 0xf9, 0x3a, 0x11, - 0x5e, 0xac, 0xf1, 0xc7, 0xff, 0xdf, 0x61, 0x1f, 0x9c, 0x56, 0xda, 0xc9, 0x5a, 0xe3, 0xc7, 0xec, - 0xed, 0x81, 0x54, 0x53, 0xfe, 0xd9, 0xe1, 0xe6, 0x98, 0x52, 0x18, 0xc2, 0x5f, 0x0b, 0x70, 0x7e, - 0xff, 0xf3, 0x4e, 0xdd, 0x19, 0xad, 0x1c, 0xdc, 0x79, 0x8b, 0xbf, 0x66, 0xef, 0x8c, 0x0a, 0x00, - 0xc3, 0x29, 0xb6, 0x52, 0x42, 0xb0, 0x2f, 0xba, 0x81, 0x18, 0xed, 0x0f, 0xf6, 0xde, 0x8b, 0xbf, - 0x61, 0xbc, 0xf0, 0xf0, 0x4a, 0xeb, 0x2b, 0x7e, 0x9f, 0x18, 0x82, 0xf4, 0x10, 0xf9, 0xab, 0x6d, - 0x58, 0x8c, 0xff, 0x2b, 0x7b, 0xf7, 0x25, 0xf8, 0xd1, 0x78, 0x06, 0x73, 0xc1, 0xef, 0x12, 0xc3, - 0xa2, 0x1a, 0x62, 0xdf, 0xcb, 0x43, 0x31, 0xf2, 0x94, 0x7d, 0xf8, 0x12, 0xfc, 0x00, 0xec, 0x5c, - 0x3a, 0x27, 0xb5, 0x72, 0xfc, 0x1b, 0x7a, 0x24, 0x42, 0x42, 0x8e, 0x6f, 0x77, 0x20, 0x71, 0x89, - 0x46, 0xe0, 0x87, 0x20, 0x26, 0x3f, 0xa9, 0x62, 0x45, 0x96, 0x08, 0xe9, 0xb9, 0x12, 0x25, 0x58, - 0x8c, 0x2f, 0xd8, 0xfb, 0xb5, 0x70, 0x6e, 0xa5, 0x07, 0x9e, 0x19, 0x59, 0x01, 0x21, 0xc3, 0xd7, - 0x5b, 0xb9, 0x98, 0xe2, 0x77, 0xc6, 0x9e, 0xcd, 0x84, 0x9a, 0xc2, 0xe9, 0xca, 0x00, 0xa7, 0x2a, - 0xdc, 0xc8, 0x21, 0xfc, 0xfd, 0x2d, 0x14, 0x9e, 0xff, 0x10, 0x2e, 0x2d, 0xb8, 0xd9, 0xc8, 0x8b, - 0x8e, 0xf9, 0x63, 0x20, 0x37, 0xff, 0x94, 0xc3, 0x7b, 0x3d, 0x5c, 0xa8, 0x57, 0x20, 0x0a, 0x3f, - 0x7b, 0x36, 0x83, 0xf1, 0x15, 0xb9, 0xd7, 0x29, 0x92, 0xdb, 0xeb, 0x36, 0x19, 0x13, 0x19, 0x76, - 0xf3, 0x78, 0xaa, 0xb4, 0x85, 0xb5, 0xfc, 0xc2, 0x5a, 0x6d, 0xf9, 0x03, 0x22, 0xc2, 0x06, 0x15, - 0xd2, 0x7d, 0xb7, 0x1b, 0x9c, 0x56, 0xaf, 0xd0, 0x62, 0x52, 0x9f, 0x11, 0xba, 0x7a, 0x0d, 0x90, - 0xaf, 0x1e, 0xe6, 0x62, 0x8a, 0x3f, 0xd9, 0x47, 0x03, 0x0b, 0x97, 0x85, 0x9c, 0xce, 0xc2, 0x49, - 0xa4, 0x8a, 0xd2, 0x62, 0x42, 0xa2, 0x83, 0x5d, 0x50, 0x7c, 0x58, 0xfa, 0xc6, 0x14, 0xab, 0x3a, - 0x0f, 0xd5, 0x44, 0x48, 0xcf, 0x1d, 0x96, 0x04, 0xc3, 0x9d, 0xfc, 0x5a, 0x8f, 0xaf, 0x2a, 0x77, - 0x75, 0x64, 0x27, 0x37, 0x72, 0xae, 0x93, 0x31, 0x85, 0xf7, 0xe2, 0x4c, 0x15, 0x4d, 0x78, 0x6a, - 0x5a, 0x18, 0xc8, 0xed, 0x45, 0xca, 0xe1, 0x06, 0xab, 0x8d, 0xf2, 0x08, 0xfc, 0x78, 0xd6, 0x77, - 0xcf, 0x2f, 0x04, 0xd9, 0x60, 0x1b, 0x54, 0xae, 0xc1, 0x08, 0x38, 0x66, 0xfc, 0x87, 0x7d, 0x92, - 0xca, 0xfd, 0xa2, 0x18, 0x58, 0xb9, 0x74, 0xfc, 0xe1, 0xd6, 0x48, 0x01, 0x0d, 0xb9, 0x1f, 0x5d, - 0x63, 0x44, 0xf7, 0x92, 0xfb, 0xc6, 0xec, 0xb0, 0xe4, 0xbe, 0x31, 0xbb, 0x2f, 0xb9, 0x82, 0x13, - 0xc7, 0x2e, 0xc4, 0x12, 0x4a, 0x1b, 0x59, 0x38, 0xda, 0xb1, 0x1b, 0x3d, 0xeb, 0xd8, 0x18, 0xc3, - 0x76, 0x74, 0x22, 0x9c, 0x07, 0x3b, 0xd0, 0x4e, 0x7a, 0xa9, 0x15, 0x69, 0x47, 0x29, 0x92, 0xb3, - 0xa3, 0x36, 0x89, 0x4f, 0xee, 0xb9, 0x90, 0xfe, 0x48, 0x37, 0x99, 0xa8, 0xf1, 0x2d, 0x26, 0x77, - 0x72, 0x37, 0x50, 0x7c, 0x53, 0x8f, 0xbc, 0x36, 0xd5, 0x8a, 0xc9, 0x9b, 0x3a, 0xaa, 0xb9, 0x9b, - 0x1a, 0x41, 0x31, 0xf2, 0x9c, 0x7d, 0x1c, 0x3f, 0x9f, 0x48, 0x25, 0xe7, 0x8b, 0x39, 0x3f, 0xc8, - 0x8d, 0xad, 0xa1, 0x90, 0xe7, 0xc1, 0x4e, 0x2c, 0xb6, 0x88, 0x91, 0x17, 0xd6, 0xaf, 0x57, 0x42, - 0x4f, 0x32, 0xc8, 0x39, 0x8b, 0xc0, 0x54, 0x0c, 0xbe, 0x62, 0xb7, 0x9a, 0xef, 0x67, 0xca, 0xcb, - 0xa2, 0x7f, 0xe9, 0xc1, 0xf2, 0xc3, 0x6c, 0x80, 0x06, 0x0c, 0x09, 0x7b, 0x3b, 0xf3, 0xed, 0xa7, - 0x54, 0xa9, 0xbb, 0xce, 0xa7, 0x54, 0xa5, 0x6e, 0x7b, 0x4a, 0xd5, 0x10, 0xde, 0xa0, 0x5f, 0x86, - 0x60, 0x0a, 0x39, 0x16, 0x65, 0x53, 0x94, 0x47, 0x8b, 0xdc, 0xa0, 0x36, 0x94, 0xdb, 0xa0, 0x4d, - 0x16, 0x3b, 0x12, 0x56, 0x9b, 0x96, 0x24, 0x1d, 0x89, 0x46, 0x73, 0x8e, 0xd4, 0x35, 0x02, 0xaf, - 0x77, 0x08, 0xae, 0x7c, 0x2a, 0x45, 0x8e, 0x5c, 0x6f, 0x1b, 0xca, 0xad, 0x77, 0x93, 0xc5, 0x0d, - 0x79, 0xac, 0xa4, 0x5f, 0x9f, 0x72, 0xb2, 0x21, 0x1b, 0x39, 0xd7, 0x90, 0x98, 0x8a, 0xc1, 0xff, - 0xdd, 0x63, 0xb7, 0x07, 0xda, 0x2c, 0x8a, 0xea, 0xc5, 0x64, 0x84, 0x05, 0xe5, 0x7f, 0xd4, 0x0b, - 0xab, 0x44, 0xc1, 0xa9, 0xe2, 0x74, 0xb0, 0x21, 0xef, 0xe3, 0xeb, 0x0c, 0xc1, 0xad, 0x59, 0x4e, - 0xae, 0xdb, 0x3b, 0xa2, 0x9a, 0x6b, 0x4d, 0x04, 0xe1, 0x2b, 0xf9, 0x39, 0xcc, 0xb5, 0x87, 0xba, - 0x7a, 0x94, 0x49, 0x63, 0x20, 0x77, 0x25, 0xa7, 0x1c, 0xee, 0x86, 0x33, 0x35, 0xd1, 0x49, 0x9a, - 0x03, 0xf2, 0x46, 0x4f, 0xa1, 0x5c, 0x37, 0x6c, 0xb2, 0x89, 0x1b, 0x96, 0x8b, 0x3c, 0x17, 0x6e, - 0x60, 0x75, 0x89, 0x4c, 0x68, 0x37, 0x6c, 0x41, 0x59, 0x37, 0xdc, 0x60, 0x13, 0x5b, 0x87, 0xd0, - 0x7b, 0x77, 0xe9, 0x7f, 0x19, 0xd2, 0xf5, 0xdc, 0xcb, 0x43, 0xf8, 0x5e, 0x0f, 0x79, 0x87, 0xe0, - 0x4a, 0xef, 0x82, 0x09, 0xcf, 0xcd, 0x2e, 0x52, 0xb9, 0x7b, 0x9d, 0x80, 0x63, 0xc6, 0xff, 0xf6, - 0xd8, 0xa7, 0xa5, 0xf1, 0xa3, 0x63, 0xd6, 0x57, 0x93, 0xd2, 0xd1, 0xd6, 0x17, 0xfd, 0xf7, 0x1d, - 0x17, 0x45, 0x07, 0x1f, 0xa6, 0xf1, 0xc3, 0x75, 0x87, 0xe1, 0x87, 0x40, 0x5d, 0xf2, 0x9a, 0x25, - 0x1f, 0x02, 0x29, 0x92, 0x7b, 0x08, 0xb4, 0xc9, 0x98, 0xe8, 0x67, 0x76, 0xe3, 0xa9, 0x18, 0x5f, - 0x2d, 0x0c, 0xa7, 0xfe, 0xa9, 0x5f, 0x4b, 0x21, 0xf0, 0x97, 0x19, 0x22, 0x04, 0x7c, 0xb8, 0xc7, - 0x2d, 0xbb, 0x59, 0xd6, 0x58, 0x5b, 0x38, 0xb2, 0x7a, 0x5e, 0x47, 0xef, 0x70, 0xb6, 0x94, 0xca, - 0x6d, 0x1f, 0x01, 0x37, 0x39, 0x9f, 0x3e, 0xf9, 0xed, 0xd1, 0x52, 0x7a, 0x70, 0xee, 0x50, 0xea, - 0xde, 0xfa, 0xaf, 0xde, 0x54, 0xf7, 0x96, 0xbe, 0x57, 0xfd, 0x70, 0xd2, 0xa3, 0x7e, 0x66, 0xb9, - 0xb8, 0x51, 0x69, 0x4f, 0xde, 0x04, 0x00, 0x00, 0xff, 0xff, 0x46, 0xfb, 0x8e, 0xa1, 0xa1, 0x11, - 0x00, 0x00, + 0x14, 0xc7, 0xa9, 0x04, 0x2b, 0x61, 0xee, 0x66, 0xc5, 0x4a, 0x45, 0xe2, 0xb6, 0x2d, 0x2c, 0xe9, + 0x92, 0xec, 0x85, 0xe5, 0x3d, 0x7b, 0x69, 0xb7, 0x68, 0x2b, 0x42, 0xd2, 0x52, 0x04, 0x12, 0x92, + 0x9b, 0x9c, 0x26, 0x43, 0x27, 0x63, 0x63, 0x3b, 0x11, 0x7d, 0x42, 0xe2, 0x15, 0x89, 0xaf, 0xc0, + 0x57, 0x45, 0x33, 0x19, 0x7b, 0x8e, 0x67, 0xce, 0x38, 0xd3, 0xb7, 0x28, 0xff, 0x9f, 0xcf, 0xdf, + 0xf6, 0x1c, 0x1f, 0x9f, 0x19, 0xb6, 0x6b, 0xc5, 0x45, 0x0a, 0x76, 0x29, 0x32, 0x31, 0x07, 0x6d, + 0x40, 0xaf, 0x93, 0x29, 0xf4, 0x95, 0x96, 0x56, 0xf2, 0xdb, 0x94, 0xb6, 0x7b, 0x27, 0xf8, 0x77, + 0x26, 0xac, 0xd8, 0xe0, 0x8f, 0xfe, 0xeb, 0xb1, 0x77, 0x4e, 0x0b, 0xed, 0x64, 0xa3, 0xf1, 0x63, + 0xf6, 0xfa, 0x28, 0xc9, 0xe6, 0xfc, 0x93, 0x7e, 0x73, 0x4c, 0x2e, 0x8c, 0xe1, 0x8f, 0x15, 0x18, + 0xbb, 0xfb, 0x69, 0xab, 0x6e, 0x94, 0xcc, 0x0c, 0x7c, 0xf1, 0x1a, 0x7f, 0xc5, 0xde, 0x98, 0xa4, + 0x00, 0x8a, 0x53, 0x6c, 0xa1, 0xb8, 0x60, 0x9f, 0xb5, 0x03, 0x3e, 0xda, 0x6f, 0xec, 0xad, 0x17, + 0x7f, 0xc2, 0x74, 0x65, 0xe1, 0xa5, 0x94, 0x57, 0x7c, 0x9f, 0x18, 0x82, 0x74, 0x17, 0xf9, 0xcb, + 0x6d, 0x98, 0x8f, 0xff, 0x33, 0x7b, 0xf3, 0x08, 0xec, 0x64, 0xba, 0x80, 0xa5, 0xe0, 0x77, 0x89, + 0x61, 0x5e, 0x75, 0xb1, 0xf7, 0xe2, 0x90, 0x8f, 0x3c, 0x67, 0xef, 0x1e, 0x81, 0x1d, 0x81, 0x5e, + 0x26, 0xc6, 0x24, 0x32, 0x33, 0xfc, 0x1e, 0x3d, 0x12, 0x21, 0xce, 0xe3, 0xeb, 0x0e, 0x24, 0xde, + 0xa2, 0x09, 0xd8, 0x31, 0x88, 0xd9, 0x0f, 0x59, 0x7a, 0x4d, 0x6e, 0x11, 0xd2, 0x63, 0x5b, 0x14, + 0x60, 0x3e, 0xbe, 0x60, 0x6f, 0x97, 0xc2, 0xb9, 0x4e, 0x2c, 0xf0, 0xc8, 0xc8, 0x02, 0x70, 0x0e, + 0x5f, 0x6d, 0xe5, 0xbc, 0xc5, 0xaf, 0x8c, 0x3d, 0x5b, 0x88, 0x6c, 0x0e, 0xa7, 0xd7, 0x0a, 0x38, + 0xb5, 0xc3, 0x95, 0xec, 0xc2, 0xef, 0x6f, 0xa1, 0xf0, 0xfc, 0xc7, 0x70, 0xa9, 0xc1, 0x2c, 0x26, + 0x56, 0xb4, 0xcc, 0x1f, 0x03, 0xb1, 0xf9, 0x87, 0x1c, 0x7e, 0xd6, 0xe3, 0x55, 0xf6, 0x12, 0x44, + 0x6a, 0x17, 0xcf, 0x16, 0x30, 0xbd, 0x22, 0x9f, 0x75, 0x88, 0xc4, 0x9e, 0x75, 0x9d, 0xf4, 0x46, + 0x8a, 0x7d, 0x70, 0x3c, 0xcf, 0xa4, 0x86, 0x8d, 0xfc, 0x42, 0x6b, 0xa9, 0xf9, 0x01, 0x11, 0xa1, + 0x41, 0x39, 0xbb, 0xfb, 0xdd, 0xe0, 0x70, 0xf7, 0x52, 0x29, 0x66, 0xe5, 0x19, 0xa1, 0x77, 0xaf, + 0x02, 0xe2, 0xbb, 0x87, 0x39, 0x6f, 0xf1, 0x3b, 0x7b, 0x6f, 0xa4, 0xe1, 0x32, 0x4d, 0xe6, 0x0b, + 0x77, 0x12, 0xa9, 0x4d, 0xa9, 0x31, 0xce, 0xa8, 0xd7, 0x05, 0xc5, 0x87, 0x65, 0xa8, 0x54, 0x7a, + 0x5d, 0xfa, 0x50, 0x49, 0x84, 0xf4, 0xd8, 0x61, 0x09, 0x30, 0x9c, 0xc9, 0xaf, 0xe4, 0xf4, 0xaa, + 0xa8, 0xae, 0x86, 0xcc, 0xe4, 0x4a, 0x8e, 0x65, 0x32, 0xa6, 0xf0, 0xb3, 0x38, 0xcb, 0xd2, 0x2a, + 0x3c, 0x35, 0x2d, 0x0c, 0xc4, 0x9e, 0x45, 0xc8, 0xe1, 0x04, 0x2b, 0x0b, 0xe5, 0x21, 0xd8, 0xe9, + 0x62, 0x68, 0x9e, 0x5f, 0x08, 0x32, 0xc1, 0x1a, 0x54, 0x2c, 0xc1, 0x08, 0xd8, 0x3b, 0xfe, 0xc5, + 0x3e, 0x0a, 0xe5, 0x61, 0x9a, 0x8e, 0x74, 0xb2, 0x36, 0xfc, 0xc1, 0xd6, 0x48, 0x0e, 0x75, 0xde, + 0x0f, 0x6f, 0x30, 0xa2, 0x7d, 0xc9, 0x43, 0xa5, 0x3a, 0x2c, 0x79, 0xa8, 0x54, 0xf7, 0x25, 0x17, + 0x30, 0x76, 0x1c, 0x83, 0x4a, 0x93, 0xa9, 0xb0, 0x89, 0xcc, 0xf2, 0x62, 0xb2, 0x32, 0xa4, 0x63, + 0x83, 0x8a, 0x39, 0x12, 0x30, 0x2e, 0x50, 0x27, 0xc2, 0x58, 0xd0, 0x23, 0x69, 0x92, 0x9c, 0x20, + 0x0b, 0x54, 0x88, 0xc4, 0x0a, 0x54, 0x9d, 0xc4, 0x67, 0xf9, 0x5c, 0x24, 0xf6, 0x50, 0x56, 0x4e, + 0xd4, 0xf8, 0x1a, 0x13, 0x3b, 0xcb, 0x0d, 0x14, 0x7b, 0x4d, 0xac, 0x54, 0x68, 0xdd, 0xa4, 0x57, + 0x8d, 0x89, 0x79, 0x35, 0x50, 0x9c, 0xa5, 0x35, 0xf1, 0x24, 0xc9, 0x92, 0xe5, 0x6a, 0x49, 0x66, + 0x29, 0x8d, 0xc6, 0xb2, 0xb4, 0x6d, 0x84, 0x9f, 0xc0, 0x92, 0xbd, 0x3f, 0xb1, 0x42, 0x5b, 0xbc, + 0x5a, 0x7a, 0x09, 0x21, 0xe4, 0x4c, 0x0f, 0x3a, 0xb1, 0xde, 0xee, 0x9f, 0x1d, 0xb6, 0x5b, 0x97, + 0xcf, 0x32, 0x9b, 0xa4, 0xc3, 0x4b, 0x0b, 0x9a, 0x7f, 0xdb, 0x21, 0x5a, 0x85, 0xbb, 0x39, 0x3c, + 0xb9, 0xe1, 0x28, 0x5c, 0xb5, 0x8f, 0xc0, 0x51, 0x86, 0xac, 0xda, 0x48, 0x8f, 0x55, 0xed, 0x00, + 0xc3, 0x9b, 0xfb, 0x13, 0x9a, 0x43, 0x7e, 0x76, 0xc9, 0xcd, 0xad, 0x43, 0xb1, 0xcd, 0x6d, 0xb2, + 0x38, 0x99, 0xb0, 0x5a, 0x65, 0x38, 0x99, 0x4c, 0x34, 0x1a, 0x4b, 0xa6, 0xb6, 0x11, 0x78, 0xbd, + 0x63, 0x30, 0xb0, 0x35, 0x99, 0xea, 0x50, 0x6c, 0xbd, 0x4d, 0x16, 0x5f, 0x8a, 0xc7, 0x59, 0x62, + 0x37, 0x45, 0x83, 0xbc, 0x14, 0x2b, 0x39, 0x76, 0x29, 0x62, 0xca, 0x07, 0xff, 0x7b, 0x87, 0xdd, + 0x19, 0x49, 0xb5, 0x4a, 0x8b, 0x96, 0x4c, 0x09, 0x0d, 0x99, 0xfd, 0x5e, 0xae, 0x74, 0x26, 0x52, + 0x4e, 0x6d, 0x4e, 0x0b, 0xeb, 0x7c, 0x1f, 0xdd, 0x64, 0x08, 0x4e, 0xd0, 0x7c, 0x72, 0xe5, 0xf2, + 0x79, 0xdb, 0xe4, 0x4b, 0x3d, 0x96, 0xa0, 0x01, 0x86, 0x6f, 0xfe, 0xe7, 0xb0, 0x94, 0x16, 0xca, + 0x3d, 0xa4, 0x46, 0x62, 0x20, 0x76, 0xf3, 0x87, 0x1c, 0xce, 0x89, 0xb3, 0x6c, 0x26, 0x03, 0x9b, + 0x1e, 0xd9, 0x38, 0x84, 0x50, 0x2c, 0x27, 0x9a, 0xac, 0xb7, 0x33, 0x8c, 0x97, 0xcb, 0x3c, 0x17, + 0x66, 0xa4, 0x65, 0x0e, 0xcd, 0x78, 0xe4, 0x5e, 0x43, 0x98, 0xb3, 0xfc, 0xa6, 0x23, 0x8d, 0xdf, + 0xf6, 0x26, 0xe0, 0xf2, 0xf0, 0x2e, 0xfd, 0x7e, 0x12, 0xae, 0x6a, 0x2f, 0x0e, 0xf9, 0xc8, 0x6b, + 0xf6, 0x61, 0xe5, 0x3c, 0x06, 0x93, 0x57, 0x35, 0x98, 0xf1, 0xf8, 0x0c, 0x3d, 0xe7, 0xdc, 0xfa, + 0x5d, 0x71, 0xef, 0xfb, 0xef, 0x0e, 0xfb, 0xb8, 0x76, 0x77, 0x0c, 0xb3, 0x59, 0xfe, 0x3e, 0xba, + 0xe9, 0x2a, 0x9e, 0x6c, 0xbf, 0x6b, 0x30, 0xef, 0x26, 0xf2, 0xdd, 0x4d, 0x87, 0xe1, 0x4e, 0xa3, + 0xdc, 0x78, 0x77, 0x18, 0xee, 0x91, 0x0d, 0x3a, 0x46, 0x62, 0x9d, 0x46, 0x9d, 0xf4, 0x46, 0x3f, + 0xb2, 0x5b, 0x4f, 0xc5, 0xf4, 0x6a, 0xa5, 0x38, 0xf5, 0x1d, 0x61, 0x23, 0xb9, 0xc0, 0x9f, 0x47, + 0x08, 0x17, 0xf0, 0xc1, 0x0e, 0xd7, 0x79, 0x5f, 0x66, 0xac, 0xd4, 0x70, 0xa8, 0xe5, 0xb2, 0x8c, + 0xde, 0x52, 0xeb, 0x42, 0x2a, 0xde, 0x97, 0x35, 0x60, 0xe4, 0x99, 0xbf, 0xbd, 0xa7, 0x62, 0x0d, + 0xe5, 0xf3, 0x22, 0xdf, 0xde, 0x2b, 0x3d, 0xfa, 0xf6, 0x8e, 0xb1, 0x20, 0xe5, 0xad, 0x54, 0x85, + 0x48, 0xa7, 0xbc, 0x53, 0xa3, 0x29, 0x5f, 0x41, 0x61, 0x47, 0x52, 0xfe, 0xed, 0x9a, 0xa1, 0x5e, + 0x6c, 0x6c, 0xad, 0x0d, 0x3a, 0xe8, 0xc4, 0xe2, 0x4b, 0xa4, 0xe8, 0x15, 0x36, 0x2b, 0xd9, 0x6b, + 0x6b, 0x25, 0x82, 0xa5, 0xec, 0x6f, 0xa1, 0x7c, 0xf0, 0x6b, 0x76, 0xbb, 0xfa, 0x1f, 0xf5, 0x39, + 0xfd, 0x68, 0x80, 0x66, 0x87, 0x33, 0xe8, 0xcc, 0xd7, 0xbf, 0x40, 0xe5, 0xba, 0x69, 0xfd, 0x02, + 0x55, 0xa8, 0xdb, 0xbe, 0x40, 0x95, 0x10, 0x8e, 0x9c, 0xdf, 0x26, 0xed, 0x8f, 0xde, 0xab, 0xb1, + 0xc8, 0x08, 0x0a, 0x1e, 0x7d, 0xfe, 0x17, 0x2e, 0xdd, 0xbd, 0xb6, 0x94, 0x24, 0x0a, 0xf7, 0x41, + 0x27, 0x16, 0xbf, 0x2f, 0x39, 0xb5, 0x2a, 0xad, 0xb1, 0x18, 0x8d, 0xc2, 0x7a, 0xbf, 0x1b, 0xec, + 0x1c, 0x9f, 0x3e, 0xfe, 0xe5, 0xe1, 0x3a, 0xb1, 0x60, 0x4c, 0x3f, 0x91, 0x83, 0xcd, 0xaf, 0xc1, + 0x5c, 0x0e, 0xd6, 0x76, 0x50, 0x7c, 0x41, 0x1d, 0x50, 0xdf, 0x5b, 0x2f, 0x6e, 0x15, 0xda, 0xe3, + 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x54, 0x21, 0xd6, 0xe8, 0xaa, 0x15, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -130,24 +138,24 @@ type TabletManagerClient interface { ExecuteFetchAsDba(ctx context.Context, in *tabletmanagerdata.ExecuteFetchAsDbaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ExecuteFetchAsDbaResponse, error) ExecuteFetchAsAllPrivs(ctx context.Context, in *tabletmanagerdata.ExecuteFetchAsAllPrivsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ExecuteFetchAsAllPrivsResponse, error) ExecuteFetchAsApp(ctx context.Context, in *tabletmanagerdata.ExecuteFetchAsAppRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ExecuteFetchAsAppResponse, error) - // SlaveStatus returns the current slave status. - SlaveStatus(ctx context.Context, in *tabletmanagerdata.SlaveStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveStatusResponse, error) + // ReplicationStatus returns the current replication status. + ReplicationStatus(ctx context.Context, in *tabletmanagerdata.ReplicationStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicationStatusResponse, error) // MasterPosition returns the current master position MasterPosition(ctx context.Context, in *tabletmanagerdata.MasterPositionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.MasterPositionResponse, error) // WaitForPosition waits for the position to be reached WaitForPosition(ctx context.Context, in *tabletmanagerdata.WaitForPositionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.WaitForPositionResponse, error) - // StopSlave makes mysql stop its replication - StopSlave(ctx context.Context, in *tabletmanagerdata.StopSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveResponse, error) - // StopSlaveMinimum stops the mysql replication after it reaches + // StopReplication makes mysql stop its replication + StopReplication(ctx context.Context, in *tabletmanagerdata.StopReplicationRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopReplicationResponse, error) + // StopReplicationMinimum stops the mysql replication after it reaches // the provided minimum point - StopSlaveMinimum(ctx context.Context, in *tabletmanagerdata.StopSlaveMinimumRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveMinimumResponse, error) - // StartSlave starts the mysql replication - StartSlave(ctx context.Context, in *tabletmanagerdata.StartSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveResponse, error) - // StartSlave starts the mysql replication until and including + StopReplicationMinimum(ctx context.Context, in *tabletmanagerdata.StopReplicationMinimumRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopReplicationMinimumResponse, error) + // StartReplication starts the mysql replication + StartReplication(ctx context.Context, in *tabletmanagerdata.StartReplicationRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartReplicationResponse, error) + // StartReplicationUnitAfter starts the mysql replication until and including // the provided position - StartSlaveUntilAfter(ctx context.Context, in *tabletmanagerdata.StartSlaveUntilAfterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) - // GetSlaves asks for the list of mysql slaves - GetSlaves(ctx context.Context, in *tabletmanagerdata.GetSlavesRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetSlavesResponse, error) + StartReplicationUntilAfter(ctx context.Context, in *tabletmanagerdata.StartReplicationUntilAfterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartReplicationUntilAfterResponse, error) + // GetReplicas asks for the list of mysql replicas + GetReplicas(ctx context.Context, in *tabletmanagerdata.GetReplicasRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetReplicasResponse, error) // VReplication API VReplicationExec(ctx context.Context, in *tabletmanagerdata.VReplicationExecRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationExecResponse, error) VReplicationWaitForPos(ctx context.Context, in *tabletmanagerdata.VReplicationWaitForPosRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) @@ -158,18 +166,18 @@ type TabletManagerClient interface { // PopulateReparentJournal tells the tablet to add an entry to its // reparent journal PopulateReparentJournal(ctx context.Context, in *tabletmanagerdata.PopulateReparentJournalRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PopulateReparentJournalResponse, error) - // InitSlave tells the tablet to reparent to the master unconditionally - InitSlave(ctx context.Context, in *tabletmanagerdata.InitSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitSlaveResponse, error) + // InitReplica tells the tablet to reparent to the master unconditionally + InitReplica(ctx context.Context, in *tabletmanagerdata.InitReplicaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitReplicaResponse, error) // DemoteMaster tells the soon-to-be-former master it's gonna change DemoteMaster(ctx context.Context, in *tabletmanagerdata.DemoteMasterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.DemoteMasterResponse, error) // UndoDemoteMaster reverts all changes made by DemoteMaster UndoDemoteMaster(ctx context.Context, in *tabletmanagerdata.UndoDemoteMasterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UndoDemoteMasterResponse, error) - // SlaveWasPromoted tells the remote tablet it is now the master - SlaveWasPromoted(ctx context.Context, in *tabletmanagerdata.SlaveWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasPromotedResponse, error) - // SetMaster tells the slave to reparent + // ReplicaWasPromoted tells the remote tablet it is now the master + ReplicaWasPromoted(ctx context.Context, in *tabletmanagerdata.ReplicaWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicaWasPromotedResponse, error) + // SetMaster tells the replica to reparent SetMaster(ctx context.Context, in *tabletmanagerdata.SetMasterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SetMasterResponse, error) - // SlaveWasRestarted tells the remote tablet its master has changed - SlaveWasRestarted(ctx context.Context, in *tabletmanagerdata.SlaveWasRestartedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasRestartedResponse, error) + // ReplicaWasRestarted tells the remote tablet its master has changed + ReplicaWasRestarted(ctx context.Context, in *tabletmanagerdata.ReplicaWasRestartedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicaWasRestartedResponse, error) // StopReplicationAndGetStatus stops MySQL replication, and returns the // replication status StopReplicationAndGetStatus(ctx context.Context, in *tabletmanagerdata.StopReplicationAndGetStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopReplicationAndGetStatusResponse, error) @@ -178,6 +186,24 @@ type TabletManagerClient interface { Backup(ctx context.Context, in *tabletmanagerdata.BackupRequest, opts ...grpc.CallOption) (TabletManager_BackupClient, error) // RestoreFromBackup deletes all local data and restores it from the latest backup. RestoreFromBackup(ctx context.Context, in *tabletmanagerdata.RestoreFromBackupRequest, opts ...grpc.CallOption) (TabletManager_RestoreFromBackupClient, error) + // Deprecated - remove after 7.0 + SlaveStatus(ctx context.Context, in *tabletmanagerdata.SlaveStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveStatusResponse, error) + // Deprecated + StopSlave(ctx context.Context, in *tabletmanagerdata.StopSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveResponse, error) + // Deprecated + StopSlaveMinimum(ctx context.Context, in *tabletmanagerdata.StopSlaveMinimumRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveMinimumResponse, error) + // Deprecated + StartSlave(ctx context.Context, in *tabletmanagerdata.StartSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveResponse, error) + // Deprecated + StartSlaveUntilAfter(ctx context.Context, in *tabletmanagerdata.StartSlaveUntilAfterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) + // Deprecated + GetSlaves(ctx context.Context, in *tabletmanagerdata.GetSlavesRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetSlavesResponse, error) + // Deprecated + InitSlave(ctx context.Context, in *tabletmanagerdata.InitSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitSlaveResponse, error) + // Deprecated + SlaveWasPromoted(ctx context.Context, in *tabletmanagerdata.SlaveWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasPromotedResponse, error) + // Deprecated + SlaveWasRestarted(ctx context.Context, in *tabletmanagerdata.SlaveWasRestartedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasRestartedResponse, error) } type tabletManagerClient struct { @@ -359,9 +385,9 @@ func (c *tabletManagerClient) ExecuteFetchAsApp(ctx context.Context, in *tabletm return out, nil } -func (c *tabletManagerClient) SlaveStatus(ctx context.Context, in *tabletmanagerdata.SlaveStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveStatusResponse, error) { - out := new(tabletmanagerdata.SlaveStatusResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveStatus", in, out, opts...) +func (c *tabletManagerClient) ReplicationStatus(ctx context.Context, in *tabletmanagerdata.ReplicationStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicationStatusResponse, error) { + out := new(tabletmanagerdata.ReplicationStatusResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ReplicationStatus", in, out, opts...) if err != nil { return nil, err } @@ -386,45 +412,45 @@ func (c *tabletManagerClient) WaitForPosition(ctx context.Context, in *tabletman return out, nil } -func (c *tabletManagerClient) StopSlave(ctx context.Context, in *tabletmanagerdata.StopSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveResponse, error) { - out := new(tabletmanagerdata.StopSlaveResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopSlave", in, out, opts...) +func (c *tabletManagerClient) StopReplication(ctx context.Context, in *tabletmanagerdata.StopReplicationRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopReplicationResponse, error) { + out := new(tabletmanagerdata.StopReplicationResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopReplication", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) StopSlaveMinimum(ctx context.Context, in *tabletmanagerdata.StopSlaveMinimumRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveMinimumResponse, error) { - out := new(tabletmanagerdata.StopSlaveMinimumResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopSlaveMinimum", in, out, opts...) +func (c *tabletManagerClient) StopReplicationMinimum(ctx context.Context, in *tabletmanagerdata.StopReplicationMinimumRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopReplicationMinimumResponse, error) { + out := new(tabletmanagerdata.StopReplicationMinimumResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopReplicationMinimum", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) StartSlave(ctx context.Context, in *tabletmanagerdata.StartSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveResponse, error) { - out := new(tabletmanagerdata.StartSlaveResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StartSlave", in, out, opts...) +func (c *tabletManagerClient) StartReplication(ctx context.Context, in *tabletmanagerdata.StartReplicationRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartReplicationResponse, error) { + out := new(tabletmanagerdata.StartReplicationResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StartReplication", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) StartSlaveUntilAfter(ctx context.Context, in *tabletmanagerdata.StartSlaveUntilAfterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) { - out := new(tabletmanagerdata.StartSlaveUntilAfterResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StartSlaveUntilAfter", in, out, opts...) +func (c *tabletManagerClient) StartReplicationUntilAfter(ctx context.Context, in *tabletmanagerdata.StartReplicationUntilAfterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartReplicationUntilAfterResponse, error) { + out := new(tabletmanagerdata.StartReplicationUntilAfterResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StartReplicationUntilAfter", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) GetSlaves(ctx context.Context, in *tabletmanagerdata.GetSlavesRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetSlavesResponse, error) { - out := new(tabletmanagerdata.GetSlavesResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/GetSlaves", in, out, opts...) +func (c *tabletManagerClient) GetReplicas(ctx context.Context, in *tabletmanagerdata.GetReplicasRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetReplicasResponse, error) { + out := new(tabletmanagerdata.GetReplicasResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/GetReplicas", in, out, opts...) if err != nil { return nil, err } @@ -476,9 +502,9 @@ func (c *tabletManagerClient) PopulateReparentJournal(ctx context.Context, in *t return out, nil } -func (c *tabletManagerClient) InitSlave(ctx context.Context, in *tabletmanagerdata.InitSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitSlaveResponse, error) { - out := new(tabletmanagerdata.InitSlaveResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/InitSlave", in, out, opts...) +func (c *tabletManagerClient) InitReplica(ctx context.Context, in *tabletmanagerdata.InitReplicaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitReplicaResponse, error) { + out := new(tabletmanagerdata.InitReplicaResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/InitReplica", in, out, opts...) if err != nil { return nil, err } @@ -503,9 +529,9 @@ func (c *tabletManagerClient) UndoDemoteMaster(ctx context.Context, in *tabletma return out, nil } -func (c *tabletManagerClient) SlaveWasPromoted(ctx context.Context, in *tabletmanagerdata.SlaveWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasPromotedResponse, error) { - out := new(tabletmanagerdata.SlaveWasPromotedResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveWasPromoted", in, out, opts...) +func (c *tabletManagerClient) ReplicaWasPromoted(ctx context.Context, in *tabletmanagerdata.ReplicaWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicaWasPromotedResponse, error) { + out := new(tabletmanagerdata.ReplicaWasPromotedResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ReplicaWasPromoted", in, out, opts...) if err != nil { return nil, err } @@ -521,9 +547,9 @@ func (c *tabletManagerClient) SetMaster(ctx context.Context, in *tabletmanagerda return out, nil } -func (c *tabletManagerClient) SlaveWasRestarted(ctx context.Context, in *tabletmanagerdata.SlaveWasRestartedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasRestartedResponse, error) { - out := new(tabletmanagerdata.SlaveWasRestartedResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveWasRestarted", in, out, opts...) +func (c *tabletManagerClient) ReplicaWasRestarted(ctx context.Context, in *tabletmanagerdata.ReplicaWasRestartedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicaWasRestartedResponse, error) { + out := new(tabletmanagerdata.ReplicaWasRestartedResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ReplicaWasRestarted", in, out, opts...) if err != nil { return nil, err } @@ -612,6 +638,87 @@ func (x *tabletManagerRestoreFromBackupClient) Recv() (*tabletmanagerdata.Restor return m, nil } +func (c *tabletManagerClient) SlaveStatus(ctx context.Context, in *tabletmanagerdata.SlaveStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveStatusResponse, error) { + out := new(tabletmanagerdata.SlaveStatusResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) StopSlave(ctx context.Context, in *tabletmanagerdata.StopSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveResponse, error) { + out := new(tabletmanagerdata.StopSlaveResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopSlave", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) StopSlaveMinimum(ctx context.Context, in *tabletmanagerdata.StopSlaveMinimumRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveMinimumResponse, error) { + out := new(tabletmanagerdata.StopSlaveMinimumResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopSlaveMinimum", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) StartSlave(ctx context.Context, in *tabletmanagerdata.StartSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveResponse, error) { + out := new(tabletmanagerdata.StartSlaveResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StartSlave", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) StartSlaveUntilAfter(ctx context.Context, in *tabletmanagerdata.StartSlaveUntilAfterRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) { + out := new(tabletmanagerdata.StartSlaveUntilAfterResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StartSlaveUntilAfter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) GetSlaves(ctx context.Context, in *tabletmanagerdata.GetSlavesRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetSlavesResponse, error) { + out := new(tabletmanagerdata.GetSlavesResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/GetSlaves", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) InitSlave(ctx context.Context, in *tabletmanagerdata.InitSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitSlaveResponse, error) { + out := new(tabletmanagerdata.InitSlaveResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/InitSlave", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) SlaveWasPromoted(ctx context.Context, in *tabletmanagerdata.SlaveWasPromotedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasPromotedResponse, error) { + out := new(tabletmanagerdata.SlaveWasPromotedResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveWasPromoted", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) SlaveWasRestarted(ctx context.Context, in *tabletmanagerdata.SlaveWasRestartedRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveWasRestartedResponse, error) { + out := new(tabletmanagerdata.SlaveWasRestartedResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/SlaveWasRestarted", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // TabletManagerServer is the server API for TabletManager service. type TabletManagerServer interface { // Ping returns the input payload @@ -639,24 +746,24 @@ type TabletManagerServer interface { ExecuteFetchAsDba(context.Context, *tabletmanagerdata.ExecuteFetchAsDbaRequest) (*tabletmanagerdata.ExecuteFetchAsDbaResponse, error) ExecuteFetchAsAllPrivs(context.Context, *tabletmanagerdata.ExecuteFetchAsAllPrivsRequest) (*tabletmanagerdata.ExecuteFetchAsAllPrivsResponse, error) ExecuteFetchAsApp(context.Context, *tabletmanagerdata.ExecuteFetchAsAppRequest) (*tabletmanagerdata.ExecuteFetchAsAppResponse, error) - // SlaveStatus returns the current slave status. - SlaveStatus(context.Context, *tabletmanagerdata.SlaveStatusRequest) (*tabletmanagerdata.SlaveStatusResponse, error) + // ReplicationStatus returns the current replication status. + ReplicationStatus(context.Context, *tabletmanagerdata.ReplicationStatusRequest) (*tabletmanagerdata.ReplicationStatusResponse, error) // MasterPosition returns the current master position MasterPosition(context.Context, *tabletmanagerdata.MasterPositionRequest) (*tabletmanagerdata.MasterPositionResponse, error) // WaitForPosition waits for the position to be reached WaitForPosition(context.Context, *tabletmanagerdata.WaitForPositionRequest) (*tabletmanagerdata.WaitForPositionResponse, error) - // StopSlave makes mysql stop its replication - StopSlave(context.Context, *tabletmanagerdata.StopSlaveRequest) (*tabletmanagerdata.StopSlaveResponse, error) - // StopSlaveMinimum stops the mysql replication after it reaches + // StopReplication makes mysql stop its replication + StopReplication(context.Context, *tabletmanagerdata.StopReplicationRequest) (*tabletmanagerdata.StopReplicationResponse, error) + // StopReplicationMinimum stops the mysql replication after it reaches // the provided minimum point - StopSlaveMinimum(context.Context, *tabletmanagerdata.StopSlaveMinimumRequest) (*tabletmanagerdata.StopSlaveMinimumResponse, error) - // StartSlave starts the mysql replication - StartSlave(context.Context, *tabletmanagerdata.StartSlaveRequest) (*tabletmanagerdata.StartSlaveResponse, error) - // StartSlave starts the mysql replication until and including + StopReplicationMinimum(context.Context, *tabletmanagerdata.StopReplicationMinimumRequest) (*tabletmanagerdata.StopReplicationMinimumResponse, error) + // StartReplication starts the mysql replication + StartReplication(context.Context, *tabletmanagerdata.StartReplicationRequest) (*tabletmanagerdata.StartReplicationResponse, error) + // StartReplicationUnitAfter starts the mysql replication until and including // the provided position - StartSlaveUntilAfter(context.Context, *tabletmanagerdata.StartSlaveUntilAfterRequest) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) - // GetSlaves asks for the list of mysql slaves - GetSlaves(context.Context, *tabletmanagerdata.GetSlavesRequest) (*tabletmanagerdata.GetSlavesResponse, error) + StartReplicationUntilAfter(context.Context, *tabletmanagerdata.StartReplicationUntilAfterRequest) (*tabletmanagerdata.StartReplicationUntilAfterResponse, error) + // GetReplicas asks for the list of mysql replicas + GetReplicas(context.Context, *tabletmanagerdata.GetReplicasRequest) (*tabletmanagerdata.GetReplicasResponse, error) // VReplication API VReplicationExec(context.Context, *tabletmanagerdata.VReplicationExecRequest) (*tabletmanagerdata.VReplicationExecResponse, error) VReplicationWaitForPos(context.Context, *tabletmanagerdata.VReplicationWaitForPosRequest) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) @@ -667,18 +774,18 @@ type TabletManagerServer interface { // PopulateReparentJournal tells the tablet to add an entry to its // reparent journal PopulateReparentJournal(context.Context, *tabletmanagerdata.PopulateReparentJournalRequest) (*tabletmanagerdata.PopulateReparentJournalResponse, error) - // InitSlave tells the tablet to reparent to the master unconditionally - InitSlave(context.Context, *tabletmanagerdata.InitSlaveRequest) (*tabletmanagerdata.InitSlaveResponse, error) + // InitReplica tells the tablet to reparent to the master unconditionally + InitReplica(context.Context, *tabletmanagerdata.InitReplicaRequest) (*tabletmanagerdata.InitReplicaResponse, error) // DemoteMaster tells the soon-to-be-former master it's gonna change DemoteMaster(context.Context, *tabletmanagerdata.DemoteMasterRequest) (*tabletmanagerdata.DemoteMasterResponse, error) // UndoDemoteMaster reverts all changes made by DemoteMaster UndoDemoteMaster(context.Context, *tabletmanagerdata.UndoDemoteMasterRequest) (*tabletmanagerdata.UndoDemoteMasterResponse, error) - // SlaveWasPromoted tells the remote tablet it is now the master - SlaveWasPromoted(context.Context, *tabletmanagerdata.SlaveWasPromotedRequest) (*tabletmanagerdata.SlaveWasPromotedResponse, error) - // SetMaster tells the slave to reparent + // ReplicaWasPromoted tells the remote tablet it is now the master + ReplicaWasPromoted(context.Context, *tabletmanagerdata.ReplicaWasPromotedRequest) (*tabletmanagerdata.ReplicaWasPromotedResponse, error) + // SetMaster tells the replica to reparent SetMaster(context.Context, *tabletmanagerdata.SetMasterRequest) (*tabletmanagerdata.SetMasterResponse, error) - // SlaveWasRestarted tells the remote tablet its master has changed - SlaveWasRestarted(context.Context, *tabletmanagerdata.SlaveWasRestartedRequest) (*tabletmanagerdata.SlaveWasRestartedResponse, error) + // ReplicaWasRestarted tells the remote tablet its master has changed + ReplicaWasRestarted(context.Context, *tabletmanagerdata.ReplicaWasRestartedRequest) (*tabletmanagerdata.ReplicaWasRestartedResponse, error) // StopReplicationAndGetStatus stops MySQL replication, and returns the // replication status StopReplicationAndGetStatus(context.Context, *tabletmanagerdata.StopReplicationAndGetStatusRequest) (*tabletmanagerdata.StopReplicationAndGetStatusResponse, error) @@ -687,6 +794,24 @@ type TabletManagerServer interface { Backup(*tabletmanagerdata.BackupRequest, TabletManager_BackupServer) error // RestoreFromBackup deletes all local data and restores it from the latest backup. RestoreFromBackup(*tabletmanagerdata.RestoreFromBackupRequest, TabletManager_RestoreFromBackupServer) error + // Deprecated - remove after 7.0 + SlaveStatus(context.Context, *tabletmanagerdata.SlaveStatusRequest) (*tabletmanagerdata.SlaveStatusResponse, error) + // Deprecated + StopSlave(context.Context, *tabletmanagerdata.StopSlaveRequest) (*tabletmanagerdata.StopSlaveResponse, error) + // Deprecated + StopSlaveMinimum(context.Context, *tabletmanagerdata.StopSlaveMinimumRequest) (*tabletmanagerdata.StopSlaveMinimumResponse, error) + // Deprecated + StartSlave(context.Context, *tabletmanagerdata.StartSlaveRequest) (*tabletmanagerdata.StartSlaveResponse, error) + // Deprecated + StartSlaveUntilAfter(context.Context, *tabletmanagerdata.StartSlaveUntilAfterRequest) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) + // Deprecated + GetSlaves(context.Context, *tabletmanagerdata.GetSlavesRequest) (*tabletmanagerdata.GetSlavesResponse, error) + // Deprecated + InitSlave(context.Context, *tabletmanagerdata.InitSlaveRequest) (*tabletmanagerdata.InitSlaveResponse, error) + // Deprecated + SlaveWasPromoted(context.Context, *tabletmanagerdata.SlaveWasPromotedRequest) (*tabletmanagerdata.SlaveWasPromotedResponse, error) + // Deprecated + SlaveWasRestarted(context.Context, *tabletmanagerdata.SlaveWasRestartedRequest) (*tabletmanagerdata.SlaveWasRestartedResponse, error) } // UnimplementedTabletManagerServer can be embedded to have forward compatible implementations. @@ -750,8 +875,8 @@ func (*UnimplementedTabletManagerServer) ExecuteFetchAsAllPrivs(ctx context.Cont func (*UnimplementedTabletManagerServer) ExecuteFetchAsApp(ctx context.Context, req *tabletmanagerdata.ExecuteFetchAsAppRequest) (*tabletmanagerdata.ExecuteFetchAsAppResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ExecuteFetchAsApp not implemented") } -func (*UnimplementedTabletManagerServer) SlaveStatus(ctx context.Context, req *tabletmanagerdata.SlaveStatusRequest) (*tabletmanagerdata.SlaveStatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SlaveStatus not implemented") +func (*UnimplementedTabletManagerServer) ReplicationStatus(ctx context.Context, req *tabletmanagerdata.ReplicationStatusRequest) (*tabletmanagerdata.ReplicationStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReplicationStatus not implemented") } func (*UnimplementedTabletManagerServer) MasterPosition(ctx context.Context, req *tabletmanagerdata.MasterPositionRequest) (*tabletmanagerdata.MasterPositionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MasterPosition not implemented") @@ -759,20 +884,20 @@ func (*UnimplementedTabletManagerServer) MasterPosition(ctx context.Context, req func (*UnimplementedTabletManagerServer) WaitForPosition(ctx context.Context, req *tabletmanagerdata.WaitForPositionRequest) (*tabletmanagerdata.WaitForPositionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method WaitForPosition not implemented") } -func (*UnimplementedTabletManagerServer) StopSlave(ctx context.Context, req *tabletmanagerdata.StopSlaveRequest) (*tabletmanagerdata.StopSlaveResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopSlave not implemented") +func (*UnimplementedTabletManagerServer) StopReplication(ctx context.Context, req *tabletmanagerdata.StopReplicationRequest) (*tabletmanagerdata.StopReplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopReplication not implemented") } -func (*UnimplementedTabletManagerServer) StopSlaveMinimum(ctx context.Context, req *tabletmanagerdata.StopSlaveMinimumRequest) (*tabletmanagerdata.StopSlaveMinimumResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StopSlaveMinimum not implemented") +func (*UnimplementedTabletManagerServer) StopReplicationMinimum(ctx context.Context, req *tabletmanagerdata.StopReplicationMinimumRequest) (*tabletmanagerdata.StopReplicationMinimumResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopReplicationMinimum not implemented") } -func (*UnimplementedTabletManagerServer) StartSlave(ctx context.Context, req *tabletmanagerdata.StartSlaveRequest) (*tabletmanagerdata.StartSlaveResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartSlave not implemented") +func (*UnimplementedTabletManagerServer) StartReplication(ctx context.Context, req *tabletmanagerdata.StartReplicationRequest) (*tabletmanagerdata.StartReplicationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartReplication not implemented") } -func (*UnimplementedTabletManagerServer) StartSlaveUntilAfter(ctx context.Context, req *tabletmanagerdata.StartSlaveUntilAfterRequest) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartSlaveUntilAfter not implemented") +func (*UnimplementedTabletManagerServer) StartReplicationUntilAfter(ctx context.Context, req *tabletmanagerdata.StartReplicationUntilAfterRequest) (*tabletmanagerdata.StartReplicationUntilAfterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartReplicationUntilAfter not implemented") } -func (*UnimplementedTabletManagerServer) GetSlaves(ctx context.Context, req *tabletmanagerdata.GetSlavesRequest) (*tabletmanagerdata.GetSlavesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetSlaves not implemented") +func (*UnimplementedTabletManagerServer) GetReplicas(ctx context.Context, req *tabletmanagerdata.GetReplicasRequest) (*tabletmanagerdata.GetReplicasResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetReplicas not implemented") } func (*UnimplementedTabletManagerServer) VReplicationExec(ctx context.Context, req *tabletmanagerdata.VReplicationExecRequest) (*tabletmanagerdata.VReplicationExecResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VReplicationExec not implemented") @@ -789,8 +914,8 @@ func (*UnimplementedTabletManagerServer) InitMaster(ctx context.Context, req *ta func (*UnimplementedTabletManagerServer) PopulateReparentJournal(ctx context.Context, req *tabletmanagerdata.PopulateReparentJournalRequest) (*tabletmanagerdata.PopulateReparentJournalResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PopulateReparentJournal not implemented") } -func (*UnimplementedTabletManagerServer) InitSlave(ctx context.Context, req *tabletmanagerdata.InitSlaveRequest) (*tabletmanagerdata.InitSlaveResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method InitSlave not implemented") +func (*UnimplementedTabletManagerServer) InitReplica(ctx context.Context, req *tabletmanagerdata.InitReplicaRequest) (*tabletmanagerdata.InitReplicaResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitReplica not implemented") } func (*UnimplementedTabletManagerServer) DemoteMaster(ctx context.Context, req *tabletmanagerdata.DemoteMasterRequest) (*tabletmanagerdata.DemoteMasterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DemoteMaster not implemented") @@ -798,14 +923,14 @@ func (*UnimplementedTabletManagerServer) DemoteMaster(ctx context.Context, req * func (*UnimplementedTabletManagerServer) UndoDemoteMaster(ctx context.Context, req *tabletmanagerdata.UndoDemoteMasterRequest) (*tabletmanagerdata.UndoDemoteMasterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UndoDemoteMaster not implemented") } -func (*UnimplementedTabletManagerServer) SlaveWasPromoted(ctx context.Context, req *tabletmanagerdata.SlaveWasPromotedRequest) (*tabletmanagerdata.SlaveWasPromotedResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SlaveWasPromoted not implemented") +func (*UnimplementedTabletManagerServer) ReplicaWasPromoted(ctx context.Context, req *tabletmanagerdata.ReplicaWasPromotedRequest) (*tabletmanagerdata.ReplicaWasPromotedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReplicaWasPromoted not implemented") } func (*UnimplementedTabletManagerServer) SetMaster(ctx context.Context, req *tabletmanagerdata.SetMasterRequest) (*tabletmanagerdata.SetMasterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetMaster not implemented") } -func (*UnimplementedTabletManagerServer) SlaveWasRestarted(ctx context.Context, req *tabletmanagerdata.SlaveWasRestartedRequest) (*tabletmanagerdata.SlaveWasRestartedResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SlaveWasRestarted not implemented") +func (*UnimplementedTabletManagerServer) ReplicaWasRestarted(ctx context.Context, req *tabletmanagerdata.ReplicaWasRestartedRequest) (*tabletmanagerdata.ReplicaWasRestartedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReplicaWasRestarted not implemented") } func (*UnimplementedTabletManagerServer) StopReplicationAndGetStatus(ctx context.Context, req *tabletmanagerdata.StopReplicationAndGetStatusRequest) (*tabletmanagerdata.StopReplicationAndGetStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method StopReplicationAndGetStatus not implemented") @@ -819,6 +944,33 @@ func (*UnimplementedTabletManagerServer) Backup(req *tabletmanagerdata.BackupReq func (*UnimplementedTabletManagerServer) RestoreFromBackup(req *tabletmanagerdata.RestoreFromBackupRequest, srv TabletManager_RestoreFromBackupServer) error { return status.Errorf(codes.Unimplemented, "method RestoreFromBackup not implemented") } +func (*UnimplementedTabletManagerServer) SlaveStatus(ctx context.Context, req *tabletmanagerdata.SlaveStatusRequest) (*tabletmanagerdata.SlaveStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SlaveStatus not implemented") +} +func (*UnimplementedTabletManagerServer) StopSlave(ctx context.Context, req *tabletmanagerdata.StopSlaveRequest) (*tabletmanagerdata.StopSlaveResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopSlave not implemented") +} +func (*UnimplementedTabletManagerServer) StopSlaveMinimum(ctx context.Context, req *tabletmanagerdata.StopSlaveMinimumRequest) (*tabletmanagerdata.StopSlaveMinimumResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopSlaveMinimum not implemented") +} +func (*UnimplementedTabletManagerServer) StartSlave(ctx context.Context, req *tabletmanagerdata.StartSlaveRequest) (*tabletmanagerdata.StartSlaveResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartSlave not implemented") +} +func (*UnimplementedTabletManagerServer) StartSlaveUntilAfter(ctx context.Context, req *tabletmanagerdata.StartSlaveUntilAfterRequest) (*tabletmanagerdata.StartSlaveUntilAfterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartSlaveUntilAfter not implemented") +} +func (*UnimplementedTabletManagerServer) GetSlaves(ctx context.Context, req *tabletmanagerdata.GetSlavesRequest) (*tabletmanagerdata.GetSlavesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSlaves not implemented") +} +func (*UnimplementedTabletManagerServer) InitSlave(ctx context.Context, req *tabletmanagerdata.InitSlaveRequest) (*tabletmanagerdata.InitSlaveResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitSlave not implemented") +} +func (*UnimplementedTabletManagerServer) SlaveWasPromoted(ctx context.Context, req *tabletmanagerdata.SlaveWasPromotedRequest) (*tabletmanagerdata.SlaveWasPromotedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SlaveWasPromoted not implemented") +} +func (*UnimplementedTabletManagerServer) SlaveWasRestarted(ctx context.Context, req *tabletmanagerdata.SlaveWasRestartedRequest) (*tabletmanagerdata.SlaveWasRestartedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SlaveWasRestarted not implemented") +} func RegisterTabletManagerServer(s *grpc.Server, srv TabletManagerServer) { s.RegisterService(&_TabletManager_serviceDesc, srv) @@ -1166,20 +1318,20 @@ func _TabletManager_ExecuteFetchAsApp_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } -func _TabletManager_SlaveStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.SlaveStatusRequest) +func _TabletManager_ReplicationStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ReplicationStatusRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).SlaveStatus(ctx, in) + return srv.(TabletManagerServer).ReplicationStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/SlaveStatus", + FullMethod: "/tabletmanagerservice.TabletManager/ReplicationStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).SlaveStatus(ctx, req.(*tabletmanagerdata.SlaveStatusRequest)) + return srv.(TabletManagerServer).ReplicationStatus(ctx, req.(*tabletmanagerdata.ReplicationStatusRequest)) } return interceptor(ctx, in, info, handler) } @@ -1220,92 +1372,92 @@ func _TabletManager_WaitForPosition_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -func _TabletManager_StopSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.StopSlaveRequest) +func _TabletManager_StopReplication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StopReplicationRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).StopSlave(ctx, in) + return srv.(TabletManagerServer).StopReplication(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/StopSlave", + FullMethod: "/tabletmanagerservice.TabletManager/StopReplication", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).StopSlave(ctx, req.(*tabletmanagerdata.StopSlaveRequest)) + return srv.(TabletManagerServer).StopReplication(ctx, req.(*tabletmanagerdata.StopReplicationRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_StopSlaveMinimum_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.StopSlaveMinimumRequest) +func _TabletManager_StopReplicationMinimum_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StopReplicationMinimumRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).StopSlaveMinimum(ctx, in) + return srv.(TabletManagerServer).StopReplicationMinimum(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/StopSlaveMinimum", + FullMethod: "/tabletmanagerservice.TabletManager/StopReplicationMinimum", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).StopSlaveMinimum(ctx, req.(*tabletmanagerdata.StopSlaveMinimumRequest)) + return srv.(TabletManagerServer).StopReplicationMinimum(ctx, req.(*tabletmanagerdata.StopReplicationMinimumRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_StartSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.StartSlaveRequest) +func _TabletManager_StartReplication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StartReplicationRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).StartSlave(ctx, in) + return srv.(TabletManagerServer).StartReplication(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/StartSlave", + FullMethod: "/tabletmanagerservice.TabletManager/StartReplication", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).StartSlave(ctx, req.(*tabletmanagerdata.StartSlaveRequest)) + return srv.(TabletManagerServer).StartReplication(ctx, req.(*tabletmanagerdata.StartReplicationRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_StartSlaveUntilAfter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.StartSlaveUntilAfterRequest) +func _TabletManager_StartReplicationUntilAfter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StartReplicationUntilAfterRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).StartSlaveUntilAfter(ctx, in) + return srv.(TabletManagerServer).StartReplicationUntilAfter(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/StartSlaveUntilAfter", + FullMethod: "/tabletmanagerservice.TabletManager/StartReplicationUntilAfter", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).StartSlaveUntilAfter(ctx, req.(*tabletmanagerdata.StartSlaveUntilAfterRequest)) + return srv.(TabletManagerServer).StartReplicationUntilAfter(ctx, req.(*tabletmanagerdata.StartReplicationUntilAfterRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_GetSlaves_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.GetSlavesRequest) +func _TabletManager_GetReplicas_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.GetReplicasRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).GetSlaves(ctx, in) + return srv.(TabletManagerServer).GetReplicas(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/GetSlaves", + FullMethod: "/tabletmanagerservice.TabletManager/GetReplicas", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).GetSlaves(ctx, req.(*tabletmanagerdata.GetSlavesRequest)) + return srv.(TabletManagerServer).GetReplicas(ctx, req.(*tabletmanagerdata.GetReplicasRequest)) } return interceptor(ctx, in, info, handler) } @@ -1400,20 +1552,20 @@ func _TabletManager_PopulateReparentJournal_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } -func _TabletManager_InitSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.InitSlaveRequest) +func _TabletManager_InitReplica_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.InitReplicaRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).InitSlave(ctx, in) + return srv.(TabletManagerServer).InitReplica(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/InitSlave", + FullMethod: "/tabletmanagerservice.TabletManager/InitReplica", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).InitSlave(ctx, req.(*tabletmanagerdata.InitSlaveRequest)) + return srv.(TabletManagerServer).InitReplica(ctx, req.(*tabletmanagerdata.InitReplicaRequest)) } return interceptor(ctx, in, info, handler) } @@ -1454,20 +1606,20 @@ func _TabletManager_UndoDemoteMaster_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } -func _TabletManager_SlaveWasPromoted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.SlaveWasPromotedRequest) +func _TabletManager_ReplicaWasPromoted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ReplicaWasPromotedRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).SlaveWasPromoted(ctx, in) + return srv.(TabletManagerServer).ReplicaWasPromoted(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/SlaveWasPromoted", + FullMethod: "/tabletmanagerservice.TabletManager/ReplicaWasPromoted", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).SlaveWasPromoted(ctx, req.(*tabletmanagerdata.SlaveWasPromotedRequest)) + return srv.(TabletManagerServer).ReplicaWasPromoted(ctx, req.(*tabletmanagerdata.ReplicaWasPromotedRequest)) } return interceptor(ctx, in, info, handler) } @@ -1490,20 +1642,20 @@ func _TabletManager_SetMaster_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _TabletManager_SlaveWasRestarted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.SlaveWasRestartedRequest) +func _TabletManager_ReplicaWasRestarted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ReplicaWasRestartedRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).SlaveWasRestarted(ctx, in) + return srv.(TabletManagerServer).ReplicaWasRestarted(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/SlaveWasRestarted", + FullMethod: "/tabletmanagerservice.TabletManager/ReplicaWasRestarted", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).SlaveWasRestarted(ctx, req.(*tabletmanagerdata.SlaveWasRestartedRequest)) + return srv.(TabletManagerServer).ReplicaWasRestarted(ctx, req.(*tabletmanagerdata.ReplicaWasRestartedRequest)) } return interceptor(ctx, in, info, handler) } @@ -1586,6 +1738,168 @@ func (x *tabletManagerRestoreFromBackupServer) Send(m *tabletmanagerdata.Restore return x.ServerStream.SendMsg(m) } +func _TabletManager_SlaveStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.SlaveStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).SlaveStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/SlaveStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).SlaveStatus(ctx, req.(*tabletmanagerdata.SlaveStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_StopSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StopSlaveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).StopSlave(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/StopSlave", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).StopSlave(ctx, req.(*tabletmanagerdata.StopSlaveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_StopSlaveMinimum_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StopSlaveMinimumRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).StopSlaveMinimum(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/StopSlaveMinimum", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).StopSlaveMinimum(ctx, req.(*tabletmanagerdata.StopSlaveMinimumRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_StartSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StartSlaveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).StartSlave(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/StartSlave", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).StartSlave(ctx, req.(*tabletmanagerdata.StartSlaveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_StartSlaveUntilAfter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.StartSlaveUntilAfterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).StartSlaveUntilAfter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/StartSlaveUntilAfter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).StartSlaveUntilAfter(ctx, req.(*tabletmanagerdata.StartSlaveUntilAfterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_GetSlaves_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.GetSlavesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).GetSlaves(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/GetSlaves", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).GetSlaves(ctx, req.(*tabletmanagerdata.GetSlavesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_InitSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.InitSlaveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).InitSlave(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/InitSlave", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).InitSlave(ctx, req.(*tabletmanagerdata.InitSlaveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_SlaveWasPromoted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.SlaveWasPromotedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).SlaveWasPromoted(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/SlaveWasPromoted", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).SlaveWasPromoted(ctx, req.(*tabletmanagerdata.SlaveWasPromotedRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_SlaveWasRestarted_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.SlaveWasRestartedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).SlaveWasRestarted(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/SlaveWasRestarted", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).SlaveWasRestarted(ctx, req.(*tabletmanagerdata.SlaveWasRestartedRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _TabletManager_serviceDesc = grpc.ServiceDesc{ ServiceName: "tabletmanagerservice.TabletManager", HandlerType: (*TabletManagerServer)(nil), @@ -1667,8 +1981,8 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ Handler: _TabletManager_ExecuteFetchAsApp_Handler, }, { - MethodName: "SlaveStatus", - Handler: _TabletManager_SlaveStatus_Handler, + MethodName: "ReplicationStatus", + Handler: _TabletManager_ReplicationStatus_Handler, }, { MethodName: "MasterPosition", @@ -1679,24 +1993,24 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ Handler: _TabletManager_WaitForPosition_Handler, }, { - MethodName: "StopSlave", - Handler: _TabletManager_StopSlave_Handler, + MethodName: "StopReplication", + Handler: _TabletManager_StopReplication_Handler, }, { - MethodName: "StopSlaveMinimum", - Handler: _TabletManager_StopSlaveMinimum_Handler, + MethodName: "StopReplicationMinimum", + Handler: _TabletManager_StopReplicationMinimum_Handler, }, { - MethodName: "StartSlave", - Handler: _TabletManager_StartSlave_Handler, + MethodName: "StartReplication", + Handler: _TabletManager_StartReplication_Handler, }, { - MethodName: "StartSlaveUntilAfter", - Handler: _TabletManager_StartSlaveUntilAfter_Handler, + MethodName: "StartReplicationUntilAfter", + Handler: _TabletManager_StartReplicationUntilAfter_Handler, }, { - MethodName: "GetSlaves", - Handler: _TabletManager_GetSlaves_Handler, + MethodName: "GetReplicas", + Handler: _TabletManager_GetReplicas_Handler, }, { MethodName: "VReplicationExec", @@ -1719,8 +2033,8 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ Handler: _TabletManager_PopulateReparentJournal_Handler, }, { - MethodName: "InitSlave", - Handler: _TabletManager_InitSlave_Handler, + MethodName: "InitReplica", + Handler: _TabletManager_InitReplica_Handler, }, { MethodName: "DemoteMaster", @@ -1731,16 +2045,16 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ Handler: _TabletManager_UndoDemoteMaster_Handler, }, { - MethodName: "SlaveWasPromoted", - Handler: _TabletManager_SlaveWasPromoted_Handler, + MethodName: "ReplicaWasPromoted", + Handler: _TabletManager_ReplicaWasPromoted_Handler, }, { MethodName: "SetMaster", Handler: _TabletManager_SetMaster_Handler, }, { - MethodName: "SlaveWasRestarted", - Handler: _TabletManager_SlaveWasRestarted_Handler, + MethodName: "ReplicaWasRestarted", + Handler: _TabletManager_ReplicaWasRestarted_Handler, }, { MethodName: "StopReplicationAndGetStatus", @@ -1750,6 +2064,42 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{ MethodName: "PromoteReplica", Handler: _TabletManager_PromoteReplica_Handler, }, + { + MethodName: "SlaveStatus", + Handler: _TabletManager_SlaveStatus_Handler, + }, + { + MethodName: "StopSlave", + Handler: _TabletManager_StopSlave_Handler, + }, + { + MethodName: "StopSlaveMinimum", + Handler: _TabletManager_StopSlaveMinimum_Handler, + }, + { + MethodName: "StartSlave", + Handler: _TabletManager_StartSlave_Handler, + }, + { + MethodName: "StartSlaveUntilAfter", + Handler: _TabletManager_StartSlaveUntilAfter_Handler, + }, + { + MethodName: "GetSlaves", + Handler: _TabletManager_GetSlaves_Handler, + }, + { + MethodName: "InitSlave", + Handler: _TabletManager_InitSlave_Handler, + }, + { + MethodName: "SlaveWasPromoted", + Handler: _TabletManager_SlaveWasPromoted_Handler, + }, + { + MethodName: "SlaveWasRestarted", + Handler: _TabletManager_SlaveWasRestarted_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/go/vt/proto/throttlerdata/throttlerdata.pb.go b/go/vt/proto/throttlerdata/throttlerdata.pb.go index fad03c327e7..aab974ebf86 100644 --- a/go/vt/proto/throttlerdata/throttlerdata.pb.go +++ b/go/vt/proto/throttlerdata/throttlerdata.pb.go @@ -184,7 +184,7 @@ type Configuration struct { // MaxReplicationLagModule tries to aim for. // If it is within the target, it tries to increase the throttler // rate, otherwise it will lower it based on an educated guess of the - // slave throughput. + // replica's throughput. TargetReplicationLagSec int64 `protobuf:"varint,1,opt,name=target_replication_lag_sec,json=targetReplicationLagSec,proto3" json:"target_replication_lag_sec,omitempty"` // max_replication_lag_sec is meant as a last resort. // By default, the module tries to find out the system maximum capacity while @@ -220,11 +220,11 @@ type Configuration struct { // for the last rate decrease to have an effect on the system. MinDurationBetweenDecreasesSec int64 `protobuf:"varint,8,opt,name=min_duration_between_decreases_sec,json=minDurationBetweenDecreasesSec,proto3" json:"min_duration_between_decreases_sec,omitempty"` // spread_backlog_across_sec is used when we set the throttler rate after - // we guessed the rate of a slave and determined its backlog. + // we guessed the rate of a replica and determined its backlog. // For example, at a guessed rate of 100 QPS and a lag of 10s, the replica has // a backlog of 1000 queries. // When we set the new, decreased throttler rate, we factor in how long it - // will take the slave to go through the backlog (in addition to new + // will take the replica to go through the backlog (in addition to new // requests). This field specifies over which timespan we plan to spread this. // For example, for a backlog of 1000 queries spread over 5s means that we // have to further reduce the rate by 200 QPS or the backlog will not be diff --git a/go/vt/proto/topodata/topodata.pb.go b/go/vt/proto/topodata/topodata.pb.go index d2cdc91a79b..4af0f18b960 100644 --- a/go/vt/proto/topodata/topodata.pb.go +++ b/go/vt/proto/topodata/topodata.pb.go @@ -93,7 +93,7 @@ const ( TabletType_UNKNOWN TabletType = 0 // MASTER is the master server for the shard. Only MASTER allows DMLs. TabletType_MASTER TabletType = 1 - // REPLICA is a slave type. It is used to serve live traffic. + // REPLICA replicates from master. It is used to serve live traffic. // A REPLICA can be promoted to MASTER. A demoted MASTER will go to REPLICA. TabletType_REPLICA TabletType = 2 // RDONLY (old name) / BATCH (new name) is used to serve traffic for diff --git a/go/vt/schemamanager/schemamanager.go b/go/vt/schemamanager/schemamanager.go index 6a43f3ffc13..d3edcf844c3 100644 --- a/go/vt/schemamanager/schemamanager.go +++ b/go/vt/schemamanager/schemamanager.go @@ -87,7 +87,7 @@ type ShardResult struct { Shard string Result *querypb.QueryResult // Position is a replication position that is guaranteed to be after the - // schema change was applied. It can be used to wait for slaves to receive + // schema change was applied. It can be used to wait for replicas to receive // the schema change via replication. Position string } diff --git a/go/vt/schemamanager/schemamanager_test.go b/go/vt/schemamanager/schemamanager_test.go index 852b47e6e87..fa83dd3598a 100644 --- a/go/vt/schemamanager/schemamanager_test.go +++ b/go/vt/schemamanager/schemamanager_test.go @@ -94,7 +94,7 @@ func TestSchemaManagerExecutorOpenFail(t *testing.T) { []string{"create table test_table (pk int);"}, false, false, false) controller.SetKeyspace("unknown_keyspace") wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), newFakeTabletManagerClient()) - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) ctx := context.Background() err := Run(ctx, controller, executor) @@ -107,7 +107,7 @@ func TestSchemaManagerExecutorExecuteFail(t *testing.T) { controller := newFakeController( []string{"create table test_table (pk int);"}, false, false, false) wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), newFakeTabletManagerClient()) - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) ctx := context.Background() err := Run(ctx, controller, executor) @@ -138,7 +138,7 @@ func TestSchemaManagerRun(t *testing.T) { fakeTmc.AddSchemaDefinition("vt_test_keyspace", &tabletmanagerdatapb.SchemaDefinition{}) wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), fakeTmc) - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) ctx := context.Background() err := Run(ctx, controller, executor) @@ -184,7 +184,7 @@ func TestSchemaManagerExecutorFail(t *testing.T) { fakeTmc.AddSchemaDefinition("vt_test_keyspace", &tabletmanagerdatapb.SchemaDefinition{}) fakeTmc.EnableExecuteFetchAsDbaError = true wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), fakeTmc) - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) ctx := context.Background() err := Run(ctx, controller, executor) @@ -229,7 +229,7 @@ func TestSchemaManagerRegisterControllerFactory(t *testing.T) { func newFakeExecutor(t *testing.T) *TabletExecutor { wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), newFakeTabletManagerClient()) - return NewTabletExecutor(wr, testWaitSlaveTimeout) + return NewTabletExecutor(wr, testWaitReplicasTimeout) } func newFakeTabletManagerClient() *fakeTabletManagerClient { diff --git a/go/vt/schemamanager/tablet_executor.go b/go/vt/schemamanager/tablet_executor.go index 652686398a1..670b5c51b45 100644 --- a/go/vt/schemamanager/tablet_executor.go +++ b/go/vt/schemamanager/tablet_executor.go @@ -37,16 +37,16 @@ type TabletExecutor struct { isClosed bool allowBigSchemaChange bool keyspace string - waitSlaveTimeout time.Duration + waitReplicasTimeout time.Duration } // NewTabletExecutor creates a new TabletExecutor instance -func NewTabletExecutor(wr *wrangler.Wrangler, waitSlaveTimeout time.Duration) *TabletExecutor { +func NewTabletExecutor(wr *wrangler.Wrangler, waitReplicasTimeout time.Duration) *TabletExecutor { return &TabletExecutor{ wr: wr, isClosed: true, allowBigSchemaChange: false, - waitSlaveTimeout: waitSlaveTimeout, + waitReplicasTimeout: waitReplicasTimeout, } } @@ -253,11 +253,11 @@ func (exec *TabletExecutor) executeOnAllTablets(ctx context.Context, execResult return } - // If all shards succeeded, wait (up to waitSlaveTimeout) for slaves to + // If all shards succeeded, wait (up to waitReplicasTimeout) for replicas to // execute the schema change via replication. This is best-effort, meaning // we still return overall success if the timeout expires. concurrency := sync2.NewSemaphore(10, 0) - reloadCtx, cancel := context.WithTimeout(ctx, exec.waitSlaveTimeout) + reloadCtx, cancel := context.WithTimeout(ctx, exec.waitReplicasTimeout) defer cancel() for _, result := range execResult.SuccessShards { wg.Add(1) diff --git a/go/vt/schemamanager/tablet_executor_test.go b/go/vt/schemamanager/tablet_executor_test.go index 890a4c5bfb9..6928dbf30c1 100644 --- a/go/vt/schemamanager/tablet_executor_test.go +++ b/go/vt/schemamanager/tablet_executor_test.go @@ -32,7 +32,7 @@ import ( ) var ( - testWaitSlaveTimeout = 10 * time.Second + testWaitReplicasTimeout = 10 * time.Second ) func TestTabletExecutorOpen(t *testing.T) { @@ -68,7 +68,7 @@ func TestTabletExecutorOpenWithEmptyMasterAlias(t *testing.T) { if err := wr.InitTablet(ctx, tablet, false /*allowMasterOverride*/, true /*createShardAndKeyspace*/, false /*allowUpdate*/); err != nil { t.Fatalf("InitTablet failed: %v", err) } - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) if err := executor.Open(ctx, "test_keyspace"); err == nil || !strings.Contains(err.Error(), "does not have a master") { t.Fatalf("executor.Open() = '%v', want error", err) } @@ -102,7 +102,7 @@ func TestTabletExecutorValidate(t *testing.T) { }) wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), fakeTmc) - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) ctx := context.Background() sqls := []string{ @@ -192,7 +192,7 @@ func TestTabletExecutorDML(t *testing.T) { }) wr := wrangler.New(logutil.NewConsoleLogger(), newFakeTopo(t), fakeTmc) - executor := NewTabletExecutor(wr, testWaitSlaveTimeout) + executor := NewTabletExecutor(wr, testWaitReplicasTimeout) ctx := context.Background() executor.Open(ctx, "unsharded_keyspace") diff --git a/go/vt/throttler/max_replication_lag_module.go b/go/vt/throttler/max_replication_lag_module.go index 68b7be2bce3..25c2b0fd10b 100644 --- a/go/vt/throttler/max_replication_lag_module.go +++ b/go/vt/throttler/max_replication_lag_module.go @@ -557,7 +557,7 @@ func (m *MaxReplicationLagModule) minTestDurationUntilNextIncrease(increase floa } func (m *MaxReplicationLagModule) decreaseAndGuessRate(r *result, now time.Time, lagRecordNow replicationLagRecord) { - // Guess slave rate based on the difference in the replication lag of this + // Guess replication rate based on the difference in the replication lag of this // particular replica. lagRecordBefore := m.lagCache(lagRecordNow).atOrAfter(lagRecordNow.Key, m.lastRateChange) if lagRecordBefore.isZero() { @@ -570,7 +570,7 @@ func (m *MaxReplicationLagModule) decreaseAndGuessRate(r *result, now time.Time, if lagRecordBefore.time == lagRecordNow.time { // No lag record for this replica in the time span // [last rate change, current lag record). - // Without it we won't be able to guess the slave rate. + // Without it we won't be able to guess the replication rate. // We err on the side of caution and reduce the rate by half the emergency // decrease percentage. decreaseReason := fmt.Sprintf("no previous lag record for this replica available since the last rate change (%.1f seconds ago)", now.Sub(m.lastRateChange).Seconds()) @@ -618,43 +618,43 @@ func (m *MaxReplicationLagModule) decreaseAndGuessRate(r *result, now time.Time, d = lagDifference } - // Guess the slave capacity based on the replication lag change. - rate, reason := m.guessSlaveRate(r, avgMasterRate, lagBefore, lagNow, lagDifference, d) + // Guess the replica capacity based on the replication lag change. + rate, reason := m.guessReplicationRate(r, avgMasterRate, lagBefore, lagNow, lagDifference, d) m.updateRate(r, stateDecreaseAndGuessRate, rate, reason, now, lagRecordNow, m.config.MinDurationBetweenDecreases()) } -// guessSlaveRate guesses the actual slave rate based on the new bac +// guessReplicationRate guesses the actual replication rate based on the new bac // Note that "lagDifference" can be positive (lag increased) or negative (lag // decreased). -func (m *MaxReplicationLagModule) guessSlaveRate(r *result, avgMasterRate float64, lagBefore, lagNow int64, lagDifference, d time.Duration) (int64, string) { - // avgSlaveRate is the average rate (per second) at which the slave +func (m *MaxReplicationLagModule) guessReplicationRate(r *result, avgMasterRate float64, lagBefore, lagNow int64, lagDifference, d time.Duration) (int64, string) { + // avgReplicationRate is the average rate (per second) at which the replica // applied transactions from the replication stream. We infer the value // from the relative change in the replication lag. - avgSlaveRate := avgMasterRate * (d - lagDifference).Seconds() / d.Seconds() - if avgSlaveRate <= 0 { - log.Warningf("guessed slave rate was <= 0 (%v). master rate: %v d: %.1f lag difference: %.1f", avgSlaveRate, avgMasterRate, d.Seconds(), lagDifference.Seconds()) - avgSlaveRate = 1 + avgReplicationRate := avgMasterRate * (d - lagDifference).Seconds() / d.Seconds() + if avgReplicationRate <= 0 { + log.Warningf("guessed Replication rate was <= 0 (%v). master rate: %v d: %.1f lag difference: %.1f", avgReplicationRate, avgMasterRate, d.Seconds(), lagDifference.Seconds()) + avgReplicationRate = 1 } r.MasterRate = int64(avgMasterRate) - r.GuessedSlaveRate = int64(avgSlaveRate) + r.GuessedReplicationRate = int64(avgReplicationRate) oldRequestsBehind := 0.0 - // If the old lag was > 0s, the slave needs to catch up on that as well. + // If the old lag was > 0s, the replica needs to catch up on that as well. if lagNow > lagBefore { - oldRequestsBehind = avgSlaveRate * float64(lagBefore) + oldRequestsBehind = avgReplicationRate * float64(lagBefore) } newRequestsBehind := 0.0 - // If the lag increased (i.e. slave rate was slower), the slave must make up + // If the lag increased (i.e. replication rate was slower), the replica must make up // for the difference in the future. - if avgSlaveRate < avgMasterRate { - newRequestsBehind = (avgMasterRate - avgSlaveRate) * d.Seconds() + if avgReplicationRate < avgMasterRate { + newRequestsBehind = (avgMasterRate - avgReplicationRate) * d.Seconds() } requestsBehind := oldRequestsBehind + newRequestsBehind - r.GuessedSlaveBacklogOld = int(oldRequestsBehind) - r.GuessedSlaveBacklogNew = int(newRequestsBehind) + r.GuessedReplicationBacklogOld = int(oldRequestsBehind) + r.GuessedReplicationBacklogNew = int(newRequestsBehind) - newRate := avgSlaveRate + newRate := avgReplicationRate // Reduce the new rate such that it has time to catch up the requests it's // behind within the next interval. futureRequests := newRate * m.config.SpreadBacklogAcross().Seconds() @@ -664,9 +664,9 @@ func (m *MaxReplicationLagModule) guessSlaveRate(r *result, avgMasterRate float6 // Backlog is too high. Reduce rate to 1 request/second. // TODO(mberlin): Make this a constant. newRate = 1 - reason = fmt.Sprintf("based on the guessed slave rate of: %v the slave won't be able to process the guessed backlog of %d requests within the next %.f seconds", int64(avgSlaveRate), int64(requestsBehind), m.config.SpreadBacklogAcross().Seconds()) + reason = fmt.Sprintf("based on the guessed replication rate of: %v the replica won't be able to process the guessed backlog of %d requests within the next %.f seconds", int64(avgReplicationRate), int64(requestsBehind), m.config.SpreadBacklogAcross().Seconds()) } else { - reason = fmt.Sprintf("new rate is %d lower than the guessed slave rate to account for a guessed backlog of %d requests over %.f seconds", int64(avgSlaveRate-newRate), int64(requestsBehind), m.config.SpreadBacklogAcross().Seconds()) + reason = fmt.Sprintf("new rate is %d lower than the guessed replication rate to account for a guessed backlog of %d requests over %.f seconds", int64(avgReplicationRate-newRate), int64(requestsBehind), m.config.SpreadBacklogAcross().Seconds()) } return int64(newRate), reason diff --git a/go/vt/throttler/max_replication_lag_module_config.go b/go/vt/throttler/max_replication_lag_module_config.go index d86ed773147..36dcea7be82 100644 --- a/go/vt/throttler/max_replication_lag_module_config.go +++ b/go/vt/throttler/max_replication_lag_module_config.go @@ -45,7 +45,7 @@ var defaultMaxReplicationLagModuleConfig = MaxReplicationLagModuleConfig{ EmergencyDecrease: 0.5, // Wait for two health broadcast rounds. Otherwise, the "decrease" mode - // has less than 2 lag records available to calculate the actual slave rate. + // has less than 2 lag records available to calculate the actual replication rate. MinDurationBetweenIncreasesSec: 2 * healthCheckInterval, // MaxDurationBetweenIncreasesSec defaults to 60+2 seconds because this // corresponds to 3 broadcasts. diff --git a/go/vt/throttler/max_replication_lag_module_test.go b/go/vt/throttler/max_replication_lag_module_test.go index e1514722542..aa83ff33dd4 100644 --- a/go/vt/throttler/max_replication_lag_module_test.go +++ b/go/vt/throttler/max_replication_lag_module_test.go @@ -504,7 +504,7 @@ func TestMaxReplicationLagModule_Increase_MinimumProgress(t *testing.T) { } // TestMaxReplicationLagModule_Decrease verifies that we correctly calculate the -// replica (slave) rate in the decreaseAndGuessRate state. +// replication rate in the decreaseAndGuessRate state. func TestMaxReplicationLagModule_Decrease(t *testing.T) { tf, err := newTestFixtureWithMaxReplicationLag(5) if err != nil { @@ -523,7 +523,7 @@ func TestMaxReplicationLagModule_Decrease(t *testing.T) { tf.ratesHistory.add(sinceZero(70*time.Second), 100) tf.ratesHistory.add(sinceZero(89*time.Second), 200) tf.process(lagRecord(sinceZero(90*time.Second), r2, 3)) - // The guessed replica (slave) rate is 140 because of the 3s lag increase + // The guessed replication rate is 140 because of the 3s lag increase // within the elapsed 20s. // The replica processed only 17s worth of work (20s duration - 3s lag increase) // 17s / 20s * 200 QPS actual rate => 170 QPS replica rate diff --git a/go/vt/throttler/result.go b/go/vt/throttler/result.go index 31824574a05..8a1a2683ecc 100644 --- a/go/vt/throttler/result.go +++ b/go/vt/throttler/result.go @@ -47,7 +47,7 @@ var resultStringTemplate = template.Must(template.New("result.String()").Parse( alias: {{.Alias}} lag: {{.LagRecordNow.Stats.SecondsBehindMaster}}s last change: {{.TimeSinceLastRateChange}} rate: {{.CurrentRate}} good/bad? {{.GoodOrBad}} skipped b/c: {{.MemorySkipReason}} good/bad: {{.HighestGood}}/{{.LowestBad}} state (old/tested/new): {{.OldState}}/{{.TestedState}}/{{.NewState}} -lag before: {{.LagBefore}} ({{.AgeOfBeforeLag}} ago) rates (master/slave): {{.MasterRate}}/{{.GuessedSlaveRate}} backlog (old/new): {{.GuessedSlaveBacklogOld}}/{{.GuessedSlaveBacklogNew}} +lag before: {{.LagBefore}} ({{.AgeOfBeforeLag}} ago) rates (master/replica): {{.MasterRate}}/{{.GuessedReplicationRate}} backlog (old/new): {{.GuessedReplicationBacklogOld}}/{{.GuessedReplicationBacklogNew}} reason: {{.Reason}}`)) // result is generated by the MaxReplicationLag module for each processed @@ -72,12 +72,12 @@ type result struct { HighestGood int64 LowestBad int64 - LagRecordNow replicationLagRecord - LagRecordBefore replicationLagRecord - MasterRate int64 - GuessedSlaveRate int64 - GuessedSlaveBacklogOld int - GuessedSlaveBacklogNew int + LagRecordNow replicationLagRecord + LagRecordBefore replicationLagRecord + MasterRate int64 + GuessedReplicationRate int64 + GuessedReplicationBacklogOld int + GuessedReplicationBacklogNew int } func (r result) String() string { diff --git a/go/vt/throttler/result_test.go b/go/vt/throttler/result_test.go index b4377ff48ae..0349f5fdebb 100644 --- a/go/vt/throttler/result_test.go +++ b/go/vt/throttler/result_test.go @@ -24,70 +24,70 @@ import ( var ( resultIncreased = result{ - Now: sinceZero(1234 * time.Millisecond), - RateChange: increasedRate, - lastRateChange: sinceZero(1 * time.Millisecond), - OldState: stateIncreaseRate, - TestedState: stateIncreaseRate, - NewState: stateIncreaseRate, - OldRate: 100, - NewRate: 100, - Reason: "increased the rate", - CurrentRate: 99, - GoodOrBad: goodRate, - MemorySkipReason: "", - HighestGood: 95, - LowestBad: 0, - LagRecordNow: lagRecord(sinceZero(1234*time.Millisecond), 101, 1), - LagRecordBefore: replicationLagRecord{}, - MasterRate: 99, - GuessedSlaveRate: 0, - GuessedSlaveBacklogOld: 0, - GuessedSlaveBacklogNew: 0, + Now: sinceZero(1234 * time.Millisecond), + RateChange: increasedRate, + lastRateChange: sinceZero(1 * time.Millisecond), + OldState: stateIncreaseRate, + TestedState: stateIncreaseRate, + NewState: stateIncreaseRate, + OldRate: 100, + NewRate: 100, + Reason: "increased the rate", + CurrentRate: 99, + GoodOrBad: goodRate, + MemorySkipReason: "", + HighestGood: 95, + LowestBad: 0, + LagRecordNow: lagRecord(sinceZero(1234*time.Millisecond), 101, 1), + LagRecordBefore: replicationLagRecord{}, + MasterRate: 99, + GuessedReplicationRate: 0, + GuessedReplicationBacklogOld: 0, + GuessedReplicationBacklogNew: 0, } resultDecreased = result{ - Now: sinceZero(5000 * time.Millisecond), - RateChange: decreasedRate, - lastRateChange: sinceZero(1234 * time.Millisecond), - OldState: stateIncreaseRate, - TestedState: stateDecreaseAndGuessRate, - NewState: stateDecreaseAndGuessRate, - OldRate: 200, - NewRate: 100, - Reason: "decreased the rate", - CurrentRate: 200, - GoodOrBad: badRate, - MemorySkipReason: "", - HighestGood: 95, - LowestBad: 200, - LagRecordNow: lagRecord(sinceZero(5000*time.Millisecond), 101, 2), - LagRecordBefore: lagRecord(sinceZero(1234*time.Millisecond), 101, 1), - MasterRate: 200, - GuessedSlaveRate: 150, - GuessedSlaveBacklogOld: 10, - GuessedSlaveBacklogNew: 20, + Now: sinceZero(5000 * time.Millisecond), + RateChange: decreasedRate, + lastRateChange: sinceZero(1234 * time.Millisecond), + OldState: stateIncreaseRate, + TestedState: stateDecreaseAndGuessRate, + NewState: stateDecreaseAndGuessRate, + OldRate: 200, + NewRate: 100, + Reason: "decreased the rate", + CurrentRate: 200, + GoodOrBad: badRate, + MemorySkipReason: "", + HighestGood: 95, + LowestBad: 200, + LagRecordNow: lagRecord(sinceZero(5000*time.Millisecond), 101, 2), + LagRecordBefore: lagRecord(sinceZero(1234*time.Millisecond), 101, 1), + MasterRate: 200, + GuessedReplicationRate: 150, + GuessedReplicationBacklogOld: 10, + GuessedReplicationBacklogNew: 20, } resultEmergency = result{ - Now: sinceZero(10123 * time.Millisecond), - RateChange: decreasedRate, - lastRateChange: sinceZero(5000 * time.Millisecond), - OldState: stateDecreaseAndGuessRate, - TestedState: stateEmergency, - NewState: stateEmergency, - OldRate: 100, - NewRate: 50, - Reason: "emergency state decreased the rate", - CurrentRate: 100, - GoodOrBad: badRate, - MemorySkipReason: "", - HighestGood: 95, - LowestBad: 100, - LagRecordNow: lagRecord(sinceZero(10123*time.Millisecond), 101, 23), - LagRecordBefore: lagRecord(sinceZero(5000*time.Millisecond), 101, 2), - MasterRate: 0, - GuessedSlaveRate: 0, - GuessedSlaveBacklogOld: 0, - GuessedSlaveBacklogNew: 0, + Now: sinceZero(10123 * time.Millisecond), + RateChange: decreasedRate, + lastRateChange: sinceZero(5000 * time.Millisecond), + OldState: stateDecreaseAndGuessRate, + TestedState: stateEmergency, + NewState: stateEmergency, + OldRate: 100, + NewRate: 50, + Reason: "emergency state decreased the rate", + CurrentRate: 100, + GoodOrBad: badRate, + MemorySkipReason: "", + HighestGood: 95, + LowestBad: 100, + LagRecordNow: lagRecord(sinceZero(10123*time.Millisecond), 101, 23), + LagRecordBefore: lagRecord(sinceZero(5000*time.Millisecond), 101, 2), + MasterRate: 0, + GuessedReplicationRate: 0, + GuessedReplicationBacklogOld: 0, + GuessedReplicationBacklogNew: 0, } ) @@ -102,7 +102,7 @@ func TestResultString(t *testing.T) { alias: cell1-0000000101 lag: 1s last change: 1.2s rate: 99 good/bad? good skipped b/c: good/bad: 95/0 state (old/tested/new): I/I/I -lag before: n/a (n/a ago) rates (master/slave): 99/0 backlog (old/new): 0/0 +lag before: n/a (n/a ago) rates (master/replica): 99/0 backlog (old/new): 0/0 reason: increased the rate`, }, { @@ -111,7 +111,7 @@ reason: increased the rate`, alias: cell1-0000000101 lag: 2s last change: 3.8s rate: 200 good/bad? bad skipped b/c: good/bad: 95/200 state (old/tested/new): I/D/D -lag before: 1s (3.8s ago) rates (master/slave): 200/150 backlog (old/new): 10/20 +lag before: 1s (3.8s ago) rates (master/replica): 200/150 backlog (old/new): 10/20 reason: decreased the rate`, }, { @@ -120,7 +120,7 @@ reason: decreased the rate`, alias: cell1-0000000101 lag: 23s last change: 5.1s rate: 100 good/bad? bad skipped b/c: good/bad: 95/100 state (old/tested/new): D/E/E -lag before: 2s (5.1s ago) rates (master/slave): 0/0 backlog (old/new): 0/0 +lag before: 2s (5.1s ago) rates (master/replica): 0/0 backlog (old/new): 0/0 reason: emergency state decreased the rate`, }, } diff --git a/go/vt/throttler/throttlerlogz.go b/go/vt/throttler/throttlerlogz.go index 71d5f211931..53273b7f8a3 100644 --- a/go/vt/throttler/throttlerlogz.go +++ b/go/vt/throttler/throttlerlogz.go @@ -54,7 +54,7 @@ const logHeaderHTML = ` Lag Before Recorded Ago Master Rate - Slave Rate + Replica Rate Old Backlog New Backlog Reason @@ -82,9 +82,9 @@ const logEntryHTML = ` {{.LagBefore}} {{.AgeOfBeforeLag}} {{.MasterRate}} - {{.GuessedSlaveRate}} - {{.GuessedSlaveBacklogOld}} - {{.GuessedSlaveBacklogNew}} + {{.GuessedReplicationRate}} + {{.GuessedReplicationBacklogOld}} + {{.GuessedReplicationBacklogNew}} {{.Reason}} ` diff --git a/go/vt/topo/helpers/copy_test.go b/go/vt/topo/helpers/copy_test.go index 86b5f10ae8d..ac784075492 100644 --- a/go/vt/topo/helpers/copy_test.go +++ b/go/vt/topo/helpers/copy_test.go @@ -19,6 +19,8 @@ package helpers import ( "testing" + "github.com/stretchr/testify/require" + "golang.org/x/net/context" "vitess.io/vitess/go/vt/topo" @@ -72,8 +74,8 @@ func createSetup(ctx context.Context, t *testing.T) (*topo.Server, *topo.Server) "vt": 8101, "grpc": 8102, }, - Hostname: "slavehost", - MysqlHostname: "slavehost", + Hostname: "replicahost", + MysqlHostname: "replicahost", Keyspace: "test_keyspace", Shard: "0", @@ -82,9 +84,8 @@ func createSetup(ctx context.Context, t *testing.T) (*topo.Server, *topo.Server) KeyRange: nil, } tablet2.MysqlPort = 3306 - if err := fromTS.CreateTablet(ctx, tablet2); err != nil { - t.Fatalf("cannot create slave tablet: %v", err) - } + err := fromTS.CreateTablet(ctx, tablet2) + require.NoError(t, err, "cannot create tablet: %v", tablet2) rr := &vschemapb.RoutingRules{ Rules: []*vschemapb.RoutingRule{{ diff --git a/go/vt/topo/tablet.go b/go/vt/topo/tablet.go index 8e96a6b1418..991795d98df 100644 --- a/go/vt/topo/tablet.go +++ b/go/vt/topo/tablet.go @@ -107,11 +107,11 @@ func IsRunningUpdateStream(tt topodatapb.TabletType) bool { return false } -// IsSlaveType returns if this type should be connected to a master db +// IsReplicaType returns if this type should be connected to a master db // and actively replicating? // MASTER is not obviously (only support one level replication graph) // BACKUP, RESTORE, DRAINED may or may not be, but we don't know for sure -func IsSlaveType(tt topodatapb.TabletType) bool { +func IsReplicaType(tt topodatapb.TabletType) bool { switch tt { case topodatapb.TabletType_MASTER, topodatapb.TabletType_BACKUP, topodatapb.TabletType_RESTORE, topodatapb.TabletType_DRAINED: return false @@ -204,9 +204,9 @@ func (ti *TabletInfo) IsInServingGraph() bool { return IsInServingGraph(ti.Type) } -// IsSlaveType returns if this tablet's type is a slave -func (ti *TabletInfo) IsSlaveType() bool { - return IsSlaveType(ti.Type) +// IsReplicaType returns if this tablet's type is a slave +func (ti *TabletInfo) IsReplicaType() bool { + return IsReplicaType(ti.Type) } // GetMasterTermStartTime returns the tablet's master term start time as a Time value. diff --git a/go/vt/topo/topoproto/tablet.go b/go/vt/topo/topoproto/tablet.go index 6a35377b8b6..7c5dd30a437 100644 --- a/go/vt/topo/topoproto/tablet.go +++ b/go/vt/topo/topoproto/tablet.go @@ -134,19 +134,6 @@ var AllTabletTypes = []topodatapb.TabletType{ topodatapb.TabletType_DRAINED, } -// SlaveTabletTypes contains all the tablet type that can have replication -// enabled. -var SlaveTabletTypes = []topodatapb.TabletType{ - topodatapb.TabletType_REPLICA, - topodatapb.TabletType_RDONLY, - topodatapb.TabletType_BATCH, - topodatapb.TabletType_SPARE, - topodatapb.TabletType_EXPERIMENTAL, - topodatapb.TabletType_BACKUP, - topodatapb.TabletType_RESTORE, - topodatapb.TabletType_DRAINED, -} - // ParseTabletType parses the tablet type into the enum. func ParseTabletType(param string) (topodatapb.TabletType, error) { value, ok := topodatapb.TabletType_value[strings.ToUpper(param)] @@ -180,7 +167,7 @@ func TabletTypeLString(tabletType topodatapb.TabletType) string { } // IsTypeInList returns true if the given type is in the list. -// Use it with AllTabletType and SlaveTabletType for instance. +// Use it with AllTabletTypes for instance. func IsTypeInList(tabletType topodatapb.TabletType, types []topodatapb.TabletType) bool { for _, t := range types { if tabletType == t { diff --git a/go/vt/topotools/utils.go b/go/vt/topotools/utils.go index d7fae67d929..e2d27b160ab 100644 --- a/go/vt/topotools/utils.go +++ b/go/vt/topotools/utils.go @@ -101,22 +101,22 @@ func GetAllTabletsAcrossCells(ctx context.Context, ts *topo.Server) ([]*topo.Tab } // SortedTabletMap returns two maps: -// - The slaveMap contains all the non-master non-scrapped hosts. -// This can be used as a list of slaves to fix up for reparenting +// - The replicaMap contains all the non-master non-scrapped hosts. +// This can be used as a list of replicas to fix up for reparenting // - The masterMap contains all the tablets without parents // (scrapped or not). This can be used to special case // the old master, and any tablet in a weird state, left over, ... func SortedTabletMap(tabletMap map[string]*topo.TabletInfo) (map[string]*topo.TabletInfo, map[string]*topo.TabletInfo) { - slaveMap := make(map[string]*topo.TabletInfo) + replicaMap := make(map[string]*topo.TabletInfo) masterMap := make(map[string]*topo.TabletInfo) for alias, ti := range tabletMap { if ti.Type == topodatapb.TabletType_MASTER { masterMap[alias] = ti } else { - slaveMap[alias] = ti + replicaMap[alias] = ti } } - return slaveMap, masterMap + return replicaMap, masterMap } // CopyMapKeys copies keys from map m into a new slice with the diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index d0f824660c5..40bb48f2a72 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -244,7 +244,7 @@ func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlct } for i := 0; i < replicas; i++ { - // create a replica slave + // create a replica tablet if err := CreateTablet(ctx, ts, cell, uid, keyspace, shard, dbname, topodatapb.TabletType_REPLICA, mysqld, dbcfgs.Clone()); err != nil { return err } @@ -252,7 +252,7 @@ func InitTabletMap(ts *topo.Server, tpb *vttestpb.VTTestTopology, mysqld mysqlct } for i := 0; i < rdonlys; i++ { - // create a rdonly slave + // create a rdonly tablet if err := CreateTablet(ctx, ts, cell, uid, keyspace, shard, dbname, topodatapb.TabletType_RDONLY, mysqld, dbcfgs.Clone()); err != nil { return err } @@ -657,6 +657,7 @@ func (itmc *internalTabletManagerClient) ExecuteFetchAsApp(ctx context.Context, return nil, fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) SlaveStatus(ctx context.Context, tablet *topodatapb.Tablet) (*replicationdatapb.Status, error) { return nil, fmt.Errorf("not implemented in vtcombo") } @@ -669,22 +670,27 @@ func (itmc *internalTabletManagerClient) WaitForPosition(ctx context.Context, ta return fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) StopSlave(ctx context.Context, tablet *topodatapb.Tablet) error { return fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) StopSlaveMinimum(ctx context.Context, tablet *topodatapb.Tablet, stopPos string, waitTime time.Duration) (string, error) { return "", fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) StartSlave(ctx context.Context, tablet *topodatapb.Tablet) error { return fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) StartSlaveUntilAfter(ctx context.Context, tablet *topodatapb.Tablet, position string, duration time.Duration) error { return fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) GetSlaves(ctx context.Context, tablet *topodatapb.Tablet) ([]string, error) { return nil, fmt.Errorf("not implemented in vtcombo") } @@ -709,6 +715,7 @@ func (itmc *internalTabletManagerClient) PopulateReparentJournal(ctx context.Con return fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) InitSlave(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias, replicationPosition string, timeCreatedNS int64) error { return fmt.Errorf("not implemented in vtcombo") } @@ -721,10 +728,7 @@ func (itmc *internalTabletManagerClient) UndoDemoteMaster(ctx context.Context, t return fmt.Errorf("not implemented in vtcombo") } -func (itmc *internalTabletManagerClient) PromoteSlaveWhenCaughtUp(ctx context.Context, tablet *topodatapb.Tablet, pos string) (string, error) { - return "", fmt.Errorf("not implemented in vtcombo") -} - +// Deprecated func (itmc *internalTabletManagerClient) SlaveWasPromoted(ctx context.Context, tablet *topodatapb.Tablet) error { return fmt.Errorf("not implemented in vtcombo") } @@ -733,6 +737,7 @@ func (itmc *internalTabletManagerClient) SetMaster(ctx context.Context, tablet * return fmt.Errorf("not implemented in vtcombo") } +// Deprecated func (itmc *internalTabletManagerClient) SlaveWasRestarted(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias) error { return fmt.Errorf("not implemented in vtcombo") } @@ -744,9 +749,6 @@ func (itmc *internalTabletManagerClient) StopReplicationAndGetStatus(ctx context func (itmc *internalTabletManagerClient) PromoteReplica(ctx context.Context, tablet *topodatapb.Tablet) (string, error) { return "", fmt.Errorf("not implemented in vtcombo") } -func (itmc *internalTabletManagerClient) PromoteSlave(ctx context.Context, tablet *topodatapb.Tablet) (string, error) { - return "", fmt.Errorf("not implemented in vtcombo") -} func (itmc *internalTabletManagerClient) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int, allowMaster bool) (logutil.EventStream, error) { return nil, fmt.Errorf("not implemented in vtcombo") @@ -758,3 +760,39 @@ func (itmc *internalTabletManagerClient) RestoreFromBackup(ctx context.Context, func (itmc *internalTabletManagerClient) Close() { } + +func (itmc *internalTabletManagerClient) ReplicationStatus(ctx context.Context, tablet *topodatapb.Tablet) (*replicationdatapb.Status, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) StopReplication(ctx context.Context, tablet *topodatapb.Tablet) error { + return fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) StopReplicationMinimum(ctx context.Context, tablet *topodatapb.Tablet, stopPos string, waitTime time.Duration) (string, error) { + return "", fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) StartReplication(ctx context.Context, tablet *topodatapb.Tablet) error { + return fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) StartReplicationUntilAfter(ctx context.Context, tablet *topodatapb.Tablet, position string, duration time.Duration) error { + return fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) GetReplicas(ctx context.Context, tablet *topodatapb.Tablet) ([]string, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) InitReplica(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias, replicationPosition string, timeCreatedNS int64) error { + return fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) ReplicaWasPromoted(ctx context.Context, tablet *topodatapb.Tablet) error { + return fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) ReplicaWasRestarted(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias) error { + return fmt.Errorf("not implemented in vtcombo") +} diff --git a/go/vt/vtctl/reparent.go b/go/vt/vtctl/reparent.go index 4d8905e5ecc..af8a79e984c 100644 --- a/go/vt/vtctl/reparent.go +++ b/go/vt/vtctl/reparent.go @@ -84,7 +84,7 @@ func commandInitShardMaster(ctx context.Context, wr *wrangler.Wrangler, subFlags } force := subFlags.Bool("force", false, "will force the reparent even if the provided tablet is not a master or the shard master") - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for replicas to catch up in reparenting") + waitReplicasTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for replicas to catch up in reparenting") if err := subFlags.Parse(args); err != nil { return err } @@ -99,7 +99,7 @@ func commandInitShardMaster(ctx context.Context, wr *wrangler.Wrangler, subFlags if err != nil { return err } - return wr.InitShardMaster(ctx, keyspace, shard, tabletAlias, *force, *waitSlaveTimeout) + return wr.InitShardMaster(ctx, keyspace, shard, tabletAlias, *force, *waitReplicasTimeout) } func commandPlannedReparentShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { @@ -107,7 +107,7 @@ func commandPlannedReparentShard(ctx context.Context, wr *wrangler.Wrangler, sub return fmt.Errorf("active reparent commands disabled (unset the -disable_active_reparents flag to enable)") } - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", *topo.RemoteOperationTimeout, "time to wait for replicas to catch up on replication before and after reparenting") + waitReplicasTimeout := subFlags.Duration("wait_slave_timeout", *topo.RemoteOperationTimeout, "time to wait for replicas to catch up on replication before and after reparenting") keyspaceShard := subFlags.String("keyspace_shard", "", "keyspace/shard of the shard that needs to be reparented") newMaster := subFlags.String("new_master", "", "alias of a tablet that should be the new master") avoidMaster := subFlags.String("avoid_master", "", "alias of a tablet that should not be the master, i.e. reparent to any other tablet if this one is the master") @@ -142,7 +142,7 @@ func commandPlannedReparentShard(ctx context.Context, wr *wrangler.Wrangler, sub return err } } - return wr.PlannedReparentShard(ctx, keyspace, shard, newMasterAlias, avoidMasterAlias, *waitSlaveTimeout) + return wr.PlannedReparentShard(ctx, keyspace, shard, newMasterAlias, avoidMasterAlias, *waitReplicasTimeout) } func commandEmergencyReparentShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { @@ -150,7 +150,7 @@ func commandEmergencyReparentShard(ctx context.Context, wr *wrangler.Wrangler, s return fmt.Errorf("active reparent commands disabled (unset the -disable_active_reparents flag to enable)") } - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for replicas to catch up in reparenting") + waitReplicasTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for replicas to catch up in reparenting") keyspaceShard := subFlags.String("keyspace_shard", "", "keyspace/shard of the shard that needs to be reparented") newMaster := subFlags.String("new_master", "", "alias of a tablet that should be the new master") if err := subFlags.Parse(args); err != nil { @@ -175,7 +175,7 @@ func commandEmergencyReparentShard(ctx context.Context, wr *wrangler.Wrangler, s if err != nil { return err } - return wr.EmergencyReparentShard(ctx, keyspace, shard, tabletAlias, *waitSlaveTimeout) + return wr.EmergencyReparentShard(ctx, keyspace, shard, tabletAlias, *waitReplicasTimeout) } func commandTabletExternallyReparented(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index c0c6ebb5632..eb103f4db9d 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -62,7 +62,7 @@ COMMAND ARGUMENT DEFINITIONS - db type, tablet type: The vttablet's role. Valid values are: -- backup: A replica copy of data that is offline to queries other than for backup purposes - -- batch: A slaved copy of data for OLAP load patterns (typically for + -- batch: A replicated copy of data for OLAP load patterns (typically for MapReduce jobs) -- drained: A tablet that is reserved for a background process. For example, a tablet used by a vtworker process, where the tablet is likely @@ -77,15 +77,6 @@ COMMAND ARGUMENT DEFINITIONS -- replica: A replica copy of data ready to be promoted to master -- restore: A tablet that is restoring from a snapshot. Typically, this happens at tablet startup, then it goes to its right state. - -- schema_apply: A replica copy of data that had been serving query traffic - but that is now applying a schema change. Following the - change, the tablet will revert to its serving type. - -- snapshot_source: A replica copy of data where mysqld is not - running and where Vitess is serving data files to - clone slaves. Use this command to enter this mode: -
vtctl Snapshot -server-mode ...
- Use this command to exit this mode: -
vtctl SnapshotSourceEnd ...
-- spare: A replica copy of data that is ready but not serving query traffic. The data could be a potential master tablet. */ @@ -181,13 +172,13 @@ var commands = []commandGroup{ {"SetReadWrite", commandSetReadWrite, "", "Sets the tablet as read-write."}, - {"StartSlave", commandStartSlave, + {"StartSlave", commandStartReplication, "", - "Starts replication on the specified slave."}, - {"StopSlave", commandStopSlave, + "Starts replication on the specified tablet."}, + {"StopSlave", commandStopReplication, "", - "Stops replication on the specified slave."}, - {"ChangeSlaveType", commandChangeSlaveType, + "Stops replication on the specified tablet."}, + {"ChangeSlaveType", commandChangeTabletType, "[-dry-run] ", "Changes the db type for the specified tablet, if possible. This command is used primarily to arrange replicas, and it will not convert a master.\n" + "NOTE: This command automatically updates the serving graph.\n"}, @@ -237,7 +228,7 @@ var commands = []commandGroup{ "Validates that all nodes that are reachable from this shard are consistent."}, {"ShardReplicationPositions", commandShardReplicationPositions, "", - "Shows the replication status of each slave machine in the shard graph. In this case, the status refers to the replication lag between the master vttablet and the slave vttablet. In Vitess, data is always written to the master vttablet first and then replicated to all slave vttablets. Output is sorted by tablet type, then replication position. Use ctrl-C to interrupt command and see partial result if needed."}, + "Shows the replication status of each replica machine in the shard graph. In this case, the status refers to the replication lag between the master vttablet and the replica vttablet. In Vitess, data is always written to the master vttablet first and then replicated to all replica vttablets. Output is sorted by tablet type, then replication position. Use ctrl-C to interrupt command and see partial result if needed."}, {"ListShardTablets", commandListShardTablets, "", "Lists all tablets in the specified shard."}, @@ -395,20 +386,20 @@ var commands = []commandGroup{ "Reloads the schema on all the tablets in a keyspace."}, {"ValidateSchemaShard", commandValidateSchemaShard, "[-exclude_tables=''] [-include-views] ", - "Validates that the master schema matches all of the slaves."}, + "Validates that the master schema matches all of the replicas."}, {"ValidateSchemaKeyspace", commandValidateSchemaKeyspace, "[-exclude_tables=''] [-include-views] [-skip-no-master] ", "Validates that the master schema from shard 0 matches the schema on all of the other tablets in the keyspace."}, {"ApplySchema", commandApplySchema, "[-allow_long_unavailability] [-wait_slave_timeout=10s] {-sql= || -sql-file=} ", - "Applies the schema change to the specified keyspace on every master, running in parallel on all shards. The changes are then propagated to slaves via replication. If -allow_long_unavailability is set, schema changes affecting a large number of rows (and possibly incurring a longer period of unavailability) will not be rejected."}, + "Applies the schema change to the specified keyspace on every master, running in parallel on all shards. The changes are then propagated to replicas via replication. If -allow_long_unavailability is set, schema changes affecting a large number of rows (and possibly incurring a longer period of unavailability) will not be rejected."}, {"CopySchemaShard", commandCopySchemaShard, "[-tables=,,...] [-exclude_tables=,,...] [-include-views] [-skip-verify] [-wait_slave_timeout=10s] { || } ", "Copies the schema from a source shard's master (or a specific tablet) to a destination shard. The schema is applied directly on the master of the destination shard, and it is propagated to the replicas through binlogs."}, {"ValidateVersionShard", commandValidateVersionShard, "", - "Validates that the master version matches all of the slaves."}, + "Validates that the master version matches all of the replicas."}, {"ValidateVersionKeyspace", commandValidateVersionKeyspace, "", "Validates that the master version from shard 0 matches all of the other tablets in the keyspace."}, @@ -418,7 +409,7 @@ var commands = []commandGroup{ "Displays the permissions for a tablet."}, {"ValidatePermissionsShard", commandValidatePermissionsShard, "", - "Validates that the master permissions match all the slaves."}, + "Validates that the master permissions match all the replicas."}, {"ValidatePermissionsKeyspace", commandValidatePermissionsKeyspace, "", "Validates that the master permissions from shard 0 match those of all of the other tablets in the keyspace."}, @@ -891,7 +882,7 @@ func commandSetReadWrite(ctx context.Context, wr *wrangler.Wrangler, subFlags *f return wr.TabletManagerClient().SetReadWrite(ctx, ti.Tablet) } -func commandStartSlave(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { +func commandStartReplication(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { if err := subFlags.Parse(args); err != nil { return err } @@ -907,10 +898,10 @@ func commandStartSlave(ctx context.Context, wr *wrangler.Wrangler, subFlags *fla if err != nil { return fmt.Errorf("failed reading tablet %v: %v", tabletAlias, err) } - return wr.TabletManagerClient().StartSlave(ctx, ti.Tablet) + return wr.TabletManagerClient().StartReplication(ctx, ti.Tablet) } -func commandStopSlave(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { +func commandStopReplication(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { if err := subFlags.Parse(args); err != nil { return err } @@ -926,17 +917,17 @@ func commandStopSlave(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag if err != nil { return fmt.Errorf("failed reading tablet %v: %v", tabletAlias, err) } - return wr.TabletManagerClient().StopSlave(ctx, ti.Tablet) + return wr.TabletManagerClient().StopReplication(ctx, ti.Tablet) } -func commandChangeSlaveType(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { +func commandChangeTabletType(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { dryRun := subFlags.Bool("dry-run", false, "Lists the proposed change without actually executing it") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 2 { - return fmt.Errorf("the and arguments are required for the ChangeSlaveType command") + return fmt.Errorf("the and arguments are required for the ChangeTabletType command") } tabletAlias, err := topoproto.ParseTabletAlias(subFlags.Arg(0)) @@ -960,7 +951,7 @@ func commandChangeSlaveType(ctx context.Context, wr *wrangler.Wrangler, subFlags wr.Logger().Printf("+ %v\n", fmtTabletAwkable(ti)) return nil } - return wr.ChangeSlaveType(ctx, tabletAlias, newType) + return wr.ChangeTabletType(ctx, tabletAlias, newType) } func commandPing(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { @@ -2373,7 +2364,7 @@ func commandApplySchema(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl allowLongUnavailability := subFlags.Bool("allow_long_unavailability", false, "Allow large schema changes which incur a longer unavailability of the database.") sql := subFlags.String("sql", "", "A list of semicolon-delimited SQL commands") sqlFile := subFlags.String("sql-file", "", "Identifies the file that contains the SQL commands") - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", wrangler.DefaultWaitSlaveTimeout, "The amount of time to wait for slaves to receive the schema change via replication.") + waitReplicasTimeout := subFlags.Duration("wait_slave_timeout", wrangler.DefaultWaitReplicasTimeout, "The amount of time to wait for replicas to receive the schema change via replication.") if err := subFlags.Parse(args); err != nil { return err } @@ -2387,7 +2378,7 @@ func commandApplySchema(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl return err } - executor := schemamanager.NewTabletExecutor(wr, *waitSlaveTimeout) + executor := schemamanager.NewTabletExecutor(wr, *waitReplicasTimeout) if *allowLongUnavailability { executor.AllowBigSchemaChange() } @@ -2403,7 +2394,7 @@ func commandCopySchemaShard(ctx context.Context, wr *wrangler.Wrangler, subFlags excludeTables := subFlags.String("exclude_tables", "", "Specifies a comma-separated list of tables to exclude. Each is either an exact match, or a regular expression of the form /regexp/") includeViews := subFlags.Bool("include-views", true, "Includes views in the output") skipVerify := subFlags.Bool("skip-verify", false, "Skip verification of source and target schema after copy") - waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 10*time.Second, "The amount of time to wait for slaves to receive the schema change via replication.") + waitReplicasTimeout := subFlags.Duration("wait_slave_timeout", 10*time.Second, "The amount of time to wait for replicas to receive the schema change via replication.") if err := subFlags.Parse(args); err != nil { return err } @@ -2426,11 +2417,11 @@ func commandCopySchemaShard(ctx context.Context, wr *wrangler.Wrangler, subFlags sourceKeyspace, sourceShard, err := topoproto.ParseKeyspaceShard(subFlags.Arg(0)) if err == nil { - return wr.CopySchemaShardFromShard(ctx, tableArray, excludeTableArray, *includeViews, sourceKeyspace, sourceShard, destKeyspace, destShard, *waitSlaveTimeout, *skipVerify) + return wr.CopySchemaShardFromShard(ctx, tableArray, excludeTableArray, *includeViews, sourceKeyspace, sourceShard, destKeyspace, destShard, *waitReplicasTimeout, *skipVerify) } sourceTabletAlias, err := topoproto.ParseTabletAlias(subFlags.Arg(0)) if err == nil { - return wr.CopySchemaShard(ctx, sourceTabletAlias, tableArray, excludeTableArray, *includeViews, destKeyspace, destShard, *waitSlaveTimeout, *skipVerify) + return wr.CopySchemaShard(ctx, sourceTabletAlias, tableArray, excludeTableArray, *includeViews, destKeyspace, destShard, *waitReplicasTimeout, *skipVerify) } return err } @@ -2842,7 +2833,7 @@ func (rts rTablets) Less(i, j int) bool { return false } // the type proto has MASTER first, so sort by that. Will show - // the MASTER first, then each slave type sorted by + // the MASTER first, then each replica type sorted by // replication position. if l.Type < r.Type { return true diff --git a/go/vt/vtctld/api.go b/go/vt/vtctld/api.go index 8c44b373cf3..ea0c31015dd 100644 --- a/go/vt/vtctld/api.go +++ b/go/vt/vtctld/api.go @@ -569,14 +569,14 @@ func initAPI(ctx context.Context, ts *topo.Server, actions *ActionRepository, re return nil } req := struct { - Keyspace, SQL string - SlaveTimeoutSeconds int + Keyspace, SQL string + ReplicaTimeoutSeconds int }{} if err := unmarshalRequest(r, &req); err != nil { return fmt.Errorf("can't unmarshal request: %v", err) } - if req.SlaveTimeoutSeconds <= 0 { - req.SlaveTimeoutSeconds = 10 + if req.ReplicaTimeoutSeconds <= 0 { + req.ReplicaTimeoutSeconds = 10 } logger := logutil.NewCallbackLogger(func(ev *logutilpb.Event) { @@ -585,7 +585,7 @@ func initAPI(ctx context.Context, ts *topo.Server, actions *ActionRepository, re wr := wrangler.New(logger, ts, tmClient) executor := schemamanager.NewTabletExecutor( - wr, time.Duration(req.SlaveTimeoutSeconds)*time.Second) + wr, time.Duration(req.ReplicaTimeoutSeconds)*time.Second) return schemamanager.Run(ctx, schemamanager.NewUIController(req.SQL, req.Keyspace, w), executor) diff --git a/go/vt/vtctld/rice-box.go b/go/vt/vtctld/rice-box.go index a2a295e881a..1b24210fdf7 100644 --- a/go/vt/vtctld/rice-box.go +++ b/go/vt/vtctld/rice-box.go @@ -11,127 +11,127 @@ func init() { // define files file2 := &embedded.EmbeddedFile{ Filename: "16e1d930cf13fb7a956372044b6d02d0.woff", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969053, 0), Content: string("wOFF\x00\x01\x00\x00\x00\x00HX\x00\x12\x00\x00\x00\x00\u007f\x8c\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GDEF\x00\x00\x01\x94\x00\x00\x00@\x00\x00\x00L\x050\x04\xf2GPOS\x00\x00\x01\xd4\x00\x00\x05\xcb\x00\x00\r\x0e\xce\xf6\xe4IGSUB\x00\x00\a\xa0\x00\x00\x00\\\x00\x00\x00\x88\x94&\x9eROS/2\x00\x00\a\xfc\x00\x00\x00V\x00\x00\x00`\xa0\xa7\xb1\xa6cmap\x00\x00\bT\x00\x00\x01\xa5\x00\x00\x038\xe2\x83!Zcvt \x00\x00\t\xfc\x00\x00\x00L\x00\x00\x00L$A\x06\xe5fpgm\x00\x00\nH\x00\x00\x01;\x00\x00\x01\xbcg\xf4\\\xabgasp\x00\x00\v\x84\x00\x00\x00\f\x00\x00\x00\f\x00\b\x00\x13glyf\x00\x00\v\x90\x00\x006r\x00\x00b&\b\x18.\xfahdmx\x00\x00B\x04\x00\x00\x00d\x00\x00\x00\xe8\x04\x02\xf8\xe2head\x00\x00Bh\x00\x00\x006\x00\x00\x006\xf8F\xab\x0ehhea\x00\x00B\xa0\x00\x00\x00\x1f\x00\x00\x00$\n\xba\x06}hmtx\x00\x00B\xc0\x00\x00\x02E\x00\x00\x03v\x81ZQ\x9floca\x00\x00E\b\x00\x00\x01\xbe\x00\x00\x01\xbe:\xfc!\xa8maxp\x00\x00F\xc8\x00\x00\x00 \x00\x00\x00 \x03\x0e\x02\xf9name\x00\x00F\xe8\x00\x00\x00\x99\x00\x00\x01\x10\x10o,\xa9post\x00\x00G\x84\x00\x00\x00\x13\x00\x00\x00 \xffm\x00dprep\x00\x00G\x98\x00\x00\x00\xbd\x00\x00\x00\xdbt\xa0\x8f\xecx\x01\r\xc1\xb1\x01\xc1P\x18\x06\xc0\xfb\x9e\nְ\x86\xce\x1a\xf6\xd0\x01@\xb2C\xd2e\xa9\xec\x92\xffN\xb0\x034\x1b{\aqt\x12\xe7\xbar\xadq\xaf\xf1\xaa\xf1\xad\xf1\u05cb\xc1\xa8\x99̲\x00\x0f\x01\n#x\x01\x94\xd2\x03p#L\x18\xc6\xf1\xff\xe6Ҟsi\xda϶m\xdb:۶m۶m\xdb6˳m\xb3\xef\xf7\xcc\\\xa6\x97\xe3\xf4v\xe7\xb7xVm\x12\x1c\x90\x86\xacT\xc5\xfb\xf3\xaf\u007fg\xe5\xc9\"\xb5*\x97\xe5\xd5\x12\x95\x8b\x95\xe1ò\x85\xaa\x96\xe7[\xbc\x00f8\b\x19\xbb\x90\xb1'd\x9c\x02o\x99b\x95\xcb\xf3\xe4\xdd-\xe0\x10\xbcx@\xad\xcf\xe3K\xd1ٛ\x19Gc\xcd\xe0k\xd7ҵ$ѵw}\xddT7\xday]\x1a\xe7\xd7\xe8Q\xf7\xbc\xfb\xd1eu\xb3]qwޕ\x95\x9b\xb5\xb6\xbb\xaa\xda2X\xa7\xea\\R\xd5\r\xa3\x83ujR\x9d\xad3wW݁\xe3k\xc2IK$\xaf\xf0\x1a\xaf\xf3\x06o\xf2\x1e\xef\xf3\x11\x1f\xf39_\xf2\x15\xdf\xf0-\u007f\xf0'\u007f\x93\x89\xccd!;\xb9\xc9G\x17\xbaҝ\x1e\x8cd\x14\xa3\x19\xc3X\xc61\x9e\tLd\x12\x93\x99\xc2,f3\x87\xb9\xccc1\xabY\xc3Zֱ\x99-D\x13C,qlg\a\x8eH{^mv;\xa86\x8f-B\xad\r\xc5CN|4\xb2\x01\xa4\xc2k\xf1Z\x9f\xa6|\x05\xe5\x12gR\xd7^\xd7\xca?4\xb7\xf6\xb4\xb2AxIO\x14?\x10\xa1]{)D$JȠ$\x9d\x92cJ|\xe8V;@\x8a\xe0\xce\x00ڥٟڕ\x93\x0fɣ\xb3\xdaAZe/\xd9\x12r\xda)\xed߅\xf6\xdbA~\xb0\xf3\x14R\xe2\xe1O;\xa9\xfc(\x8eFZ\xf5\x91F\xef\xe9F|\xb6\x01ݪ\xf5\xa3z1\x9e\x9c\xea\xf5\x02\xe5l\xb0\xf8;VC\xf7?8\r\xfe\xdd\xc9O\xc1\xba\xd9\x12B\xe7-\x83\xfd2\x82\xaf\xd8z\x9b\x18\xb2\x9e\x9d\xe4\x15\x0f\x91\x84\xabBZU\x87_\xd5C\x80\xc0\xffM\xd6\x03\xce]{\x00E\xf1ut\xed{\xcfy\xaf\xb6m\u007fQm\xbb\x9dL\xa3\xda\x18Am۶9\x99\xee\xec\xa8\xf9\xc5\xf8cE\x9b\x88A\f#f$\x13)2\x95.Z\xcca\x1e\xddX =Y,\xbdX\xc1jz\xb3V\xfa\xb3Q\x06\xb0\x99\xad\fd\x87\f\xe1 \xc7\x18\xcaI\xde1\x9a\xcf\xfc`\xb5\x97\xd0FB&\xf9\xd6\uefb5;\r\xe9AKz0X\x02\x86H\xccP\x89\x18&\t#\x19E\xc8h)1F\xf2\x8c\x95\x02\xe3\x18O\xc8\x04\x89\x98\x88\xdf*9\xa6I\x89\xe9Rf\x86Ԙ)\x15fI\x95.\xa93G\x1a̕\x16\xf3\xa4\u9ff5\xfd\xb7\x8e\x17`\x87U\x92\xb2ZZ\xfe\xe7\u007f\xfeg\xc6f\xf9\x9f-\x92\xb1U\xba\xf9\xcf-o\xc5\xee\x1c\x96\x1eތ\xdd9&=8)\x11\x17$\xe6\"WH\xb8\xcaMBnq\x8f\x88\xfb<\xa2\xc4c\xa9\xf2\x84\x974x%M^\xab]\x9b\xcf\xd2\xe1\x8b\n\xa6.\x98\x112\xd1\x05c\x17\x8c]\xb0FSZVc\x90T\xdc1d\x84\xb8\x1d\xff\xb9\x94\xfaK\xc8\x14\xe9\xb8W\u07bd\"\xf7*\xb9Wν\xaa\xeeU\xfe\xa7W\xca<5j\xb0H\x1an\xd4v\xa3čڬ\x91\x06\xeb$c\x83\x14\xdc+p\xaf\xa6{\x05\xeeUd\x9b\x84쒐\xdd\xd2`?\apAb\x17\xac\xb9`\xec\x825NH\x8bS\x9c\xa7\xe2\x8enG\xe8v\x91ە\xdd.U\xb9w4\\\xad\xedj\t?\xf9C\xc1킿H\xf9&\xa9\x00x\x01M\x89\xc5\x01BA\x10C_\x06w\xe7\xbc\x05l\x1f\xb8C\x01{\xc1\xe1DA\xd0(n\u007f4\xc9C@\x16O\x1b\xed\xc3\xe9H\x9a,\x9a/\xa6\x8e*\xdcn\b>_\xd8~\xb3\n\x14_\xb7\t\x18\xbc\xf8\x8b\x91\xc4\x11\aD\x1a\xe1??\xce\x19c\x10!\xd5\x1f\xb9`\x8c\x11\xa2{\a\x98Q\r\xa0x\x015\xc57\x01\xc2P\x00\x06\xe1/\xbd\x88H\xd1\xc0\xc6Ė1\xa8x6\x98\xd8Y\xe9\x16\xb0\x82\x03\x84\xd0\xdb_\xee$\xe92Z\xc9\xc86ل\xa8\xfd:9\v1b\xff\\ԏ\xb9~\x81\x1e\x86q\x1c\xccx\xdcrwB\xb1\x89u\xa2#\xa4\xd3\xec\xa4Ӊ\x9f\x9aF\x0e\x93\x00\x00x\x01}\xcb\x03\x8cnW\x00\x85\xd1\xf5\xa3\xb6ݞ\xba\rk\xc5\xc9Ĭ\xed\x18\xb5m۶;\xb6\xcd`l{&\xaa\xadۛ\x9c\"|;Y\xd9ч\\\xe4@9\x19\xf1\xb7's\x85|\xa6\x00\xa7\b\xf2\xf6\xc6N\xee\xf1\x9eBEZt\x1b\xb0\xeekI\xe6\xf8\xcc\xd9\xd9\xee\xectv6\xec\x19\xf6\x0f\a\x87\xc3\xc2\x19\xa1 \xdc\x14\n\x0f\xdb=I\xc0N\x82\xf7\xbc\xafH\xb1V=\x06m\xf8&\xedΊ]\xd8#\xec\x1b\x0eL\xbb\xd3\xff\xefd\x92\x9f\x92U['\xed\xc9oI\x1b\xc9fj9uQrƟ\xbd\u007fV\xfdY\xb9x\xcf❋w,\u07bax\xe5\xe2\x05\x8b\xc7.|7\xff\xb4\f\x00\xe0\x18\x9c\x80Kly\x9f\xfb\u0097\n\x15)v\xbf\xcfԪS\xafA\xa3&\x0fxP\xb3\x16\xadڴ{\xc8\xc3:t\xeaҭG\xafGE1Zp-Zх\xcf\xd1\x1d\xb9\x1f=\x18@\t\x06#\x9fa\b\xe3\xa8\xc5\x04&\xf1\x00\xa60\x87f\xccc\x01\x0fa\x11k\xe8\xc0z\xe4\x11l\xe0k\xf4\xe1\x1bѣ\xf8\x16?a\x18?\xe3\x17<\x86_\xf1'&\xf1\x97\xe8\t$\xa292\xc7G\x9e$sV\xeal1\xe2i\x8e\x01x@\x0e\x1e\x00\x18\xb6T\xfe\x89\xb2x\x0f\xbc!\xee9\xc4y\xd1\x13/F\x9c,y\xd6\xed\x13}3\xf4\x8f\xbe\n\x921%\xa0a#d\x15\x12\x84\xc4\xe4\xf8@\u007f9&\x16\xf5\xdf\xe9\xf3\xf1ٔэ\x1b\x8fNA\x1bĀ\xc7\xef\xd6o֬\xdfK/\x01\x86\x1cф\xad2\x80\bz\b\x06\xbb\x10\xa7`O\x81w!ή+\xb7\v\x06\xbbG9}\x9b`5'Hl\x83\x02\"ơ%ȗm\xa5id=\xfa%\x87m\x00\xc3T\x00\xf1\x1a\xa56\x14\"!_\xa5֛\x12\xe8]M\xad\x81\x9e\x18艳\x1f\x86\xaa\x93\x10z\x12\xc2\xfa\x11\xee͈\x9fa\x0f\x8f\vR@\xa8\xee\x93],\xb7\x87\xb3\xb1b[\xafr\xdam\xc5\xc3\xf9\xa3\x97\xc1\xee[ζ\xa6r\xbb\x87\xc1\xee\xcf\xef\n,\xb7\x83\xc1\x1eįD0\xfa\xa3)\xed֤hs4\xfdK\x10\xd8_B\x80\x95\xffY\x05z\x15;ȣ.\xf9]\x1e\"}[BPx\xb7\xfcnȣ\xdb\xf2n\x17\xbek{\xffI\x97\xe5Eȣ-y\x84֓4\xb4>\x17\r\xc9C[\xc8 \xf6\x97G\x8arI\x1a\xb6\xa2!\x00\b\xc6V6\x14\x8d\xf2F\xa8\vij\xef\xf5\xb4[\xfa\xea\x0e\xc7Г\x18\xd6G\x1c\xa3g\xec\xd5\x1b\xec\xde\xe5lk`[Ō\x9ev\b\x1b\x94`\xe7Y\x8c\xc1\x1eYζ\xb1l\xab\xd4~\xfa\v\xedTb\xac-66)19%)! 00\xc0\x9a\x18k\x8d\x91\x03\xfc\x03Ez\xe2/\xeb\x02\xacI\xf4\xe7\x04\xff\xc0\x84\xf8d\xa1\xcf\xdcu\x9f~rl\xe7\x9a]G\x0egO\x98:k!j\xb4\xa7\xeb\xf9\x0fV\x97^+Y\x99=\xbf\x00M}sVB\xab+[߹\xea\xff\xf9\x1d˃\x8bKwd\x8dM\xcb\x1c:\xb5h\xe4\xeeK\xe6cnjߝ\xca+\x98\x05\x12\xa4W\xfe$͗N\x82\x0f\x84@,$Bc\x98\xa6\xf6U\xa0\xdd\x13\xaa\xfbj\xa5'V\xdaW&=\x9e\xe5v\xcf8\xc5(V\x91ͮ)A\xce3\xab\xc1\x1e^NǛ\x1e(u\x9c\x97\xc3\rJ\xa3\xa7gJ\x92\x95KdR\x9c\x92\"X\xd9QJ\\\xc3F\xe6\xc4\xe4\x84\xf8\xc0\x00\xdaQkLl\x92\x85\xf72))1\x96r\x00%&G\xf1_\xa2\\\u007f`\xbc\x91lȒ\xbes\xfe\xc2\xed;\xe7\xce+^ܧS\xfb\u07bdV\xf7\xc2/\xedD\U000ae764\x82]\xe9Ыw\xc7\xf6}\x89.\x1d\x9fN\x17\xd7\xce/ޓ\xd3~\xc1Νy\xbaׇ\x0f\xe9\xd9\xf1\xf5\xb4\xb4n\x15W\xe6\xefޕ\xd7~\xfe\xee\x9dy\xf2\x1bÇ\xf6\xec\xf4ư\xa1=~o-Nh\r\x02\f\xaf| \xfe.\x9d\x80\b\xb0A\x02,|\x8e\x1c\x84ѓ\xb0j\xc1\x0f\xa2'AL(b\u0098P(u\xf4al'\xc4\xd4a;C\x9d\x18\xb63\xaa\x17\xcd\xea-\xc1\xea.\xd0\x18\xcc\x18\x11fP\"\xd1S>EG\x1aU\xd1R\x1a=\xbd\xc8\x19\x95\xc2Ą\xb1\x8b\x89\x85\x0e%S\xa1\xd0Y\xac6\x99\xb2\xae\x86\x14\x9f\x82tLj\x04\u007fKJr\xb2ʨᓷ\x0fn}bW\xc1\x89\xbe\xe3F\xa16mvf\x95\xdf\x1d\xdc\xe9\xf4[\x9f\x12\x82>[5\x9dl\x8a\u07b9.fʔ6\xf1\xc3^\xed6\b-J\xb7O\x9e\xb2\xbc\xfd\x8e\x0f\xf7-쳦\xdb\x1bd\xe6\xbc͕\xbb\xfe\x99غ\xedW\x9dǣ\xddAY\xf3\xa6,\x13\xbe\x1d\xb4\xbc{\xc3\xde\xcd_\xe9;\x0e\x10\xbc%F\x83\x83\xdb\x1c\x83jq\xa4*\x8bC\x89e6\xc6\x110\x17\xad\x91V\x90\xe5\xe8K@\xb0\x90\xd4\xc1k\xe4Q`\x04=\xd8}\xe3\xec\"\x1f|\x93)\xc5\"cAg0\aZt\xb16\xbc0\xf3\xbfscW\x1eѣ\xa5='\xc7.\xcc|\x80\xdf\xf8\nmA=\xdaM\x1fO\x12\xc9\xd7=\xc9,\xf2M\xf1\xa0\x8cN\xef\xa1\x1eLWc\xe9;S\xdcމ\xfc1\xd6ْM\xe6\xa4D\x8cm)\x81&\x13N\x99\xfc\xeb\x02\xdb\xfa#\xb8Ϧ!\xb6\x05\x0f\xa7\xe2\xb6_\x92\xb7Ȏ\x8e\x19SЯ(.\xea*JG\x11]2:\x92b2\f\x10\x84\xe1\xc1BO\xc9\x0e\xbe\x10\xa5\x8e\xbbHGW\xe4\xe3^\x1eL\x1dI\x90]O\xf7\xfa\xb8 \xdaT\xcd\x14\x89\x9a\xe7\x9a\x16ɬ\x13\x04\x1b\xeaD\xae6@\r\xf4\xeb\xf8\x10\b`\x04:r\nr5L\xb4a\xecC\x82\xd0\xf78\xb2\x10\x10,\xa7~l\n\\\x01=\x84\xaa\x9c\xd1Q\xce\xe8\xb81\x94\x9cO\xa50o\x15\xc0\xdc\xd5\xf2&\x13^ziB\x93\xc1\r[\xb6lؠys@`\xaa\x9c/\x18\xb8'4\x03%\xcd\xd5\x15\xd2'-V\x94\xb0\u007f3\x1eT4S\xae\x0f\x80a\"\xd5BO\xaa\x85>\xb4\xbd&j\x8b\x9e\xf4fOz\xb3\xd3X1\x1d\xf44(F\xa4\xb1L\xae\xbd0`k\f\x16\x92\f\xa6\x84x\x93\xd9\xc6\xf5Bg\xe4\xe6$E\xf4\xbc\xfb\xe0\x87{\xe2ݟ\u007f\xba+\x94,\xc8_6\x0f\xe7\xe6\xe5.\x14\xf0\x18r\x84\x9c@I(\xe1o\xd4\n5&\xd7\xc8)\x9f\x9f>\xbbq\x97\xdc|p\xff\xfa7\x80\xa0\x18\x00ߒ>\x00\xb9\x9a.\x89\x92\"=\x1bl\x80\xc4\x14B\x8cS\x04\xa7vc\x81]\xa41\x85\xd5(%\xd5L\xc0\xb7JI\x1e6\x85\x8bWrw\x9df#\x92\n &\xd0^[\xe05\xd0:\\ͻ-.\x9e\xa6\\\x11\f\x16֒\xc1\xa0\xe8\x9d\xd7\r\xcc7)\x01\x16\x83\xda^t\x12\xaa\xb6\v\xd4\xc7\xd4\xe0f\x04\xa1h1\xa1\xa2\x1dz4\xbe\xe7≋ו \xe1\xd6\xf9\a4\xac\x99\x8e?_\x88\x1b\xce\xde\xdcs\xc2\xcaMK\xce>\xfat\xffg\xe43\xd2\x17\x10\f\xa8| \xfcC\xa9\x8b\xad\xf6\x18>\x94 \x9fj\xea\x82\xe9I0\xa3\x0e|\xb8]\x838\xe52\xa0Te3\xa0\f%\x8e\x1d\r\x044\xc1\ue8d1t\x1f\x1e\xb9\x81A\x89u2\xc9\x1c\v\xec\xf9`\x83=\xac\x9cn\x95H\xd7\x01M\xa0\xdd0\xf0^<5\x86\xccS\x8aQ5T/\xc9:i\xb3\xa2\xec\xbc\xf9\x05\x95\xd3\xf2K\x1c\x9f\\\xfa1k\xe4\xb4\xf9\x95@\xd2Hei\xc1\xac\xece\x1bW\xe5\t\xf18{\x02\x82܌w\xbf\xbd\xfd\xf1@\xa5^\xac}\xf6\x89\xff\xdc=4q\xf1\x92\xf9\xb3s0`H\x02\x10\xbbPY\xf5\x04_\xe8\xa8\xf5\x00N\xb3\xc0\xfa\x8a\xf4\"\xa3\x15Q\x03\xe8\xec\x14\x8dr\x10\x8br\x14\x0fً\a\x94\xfc&F|\x80\x95\xab4J@\xd1F\x9d\x90}\xee\\\xa9#\x1d/9阋N\x06\xa2\x1f\n\xc9{\xa8\xdb\x18\xe1\u05ca&\xf8\\-@\xb0\x9e\xea@}JE8\fVi@\xb4YDip2\x9fi\x002(\xa2\x93{:\x1f\xc4(\xd2\xc5)!\u038b\x92.\x84]\xa4\xdc6\x96\xb3\x11\xf0w\x12\xabcޛ\xda\t3\xb57\x02e\xa9)\xc0\x1fSolK\b\xe4\xdcd\"\xa3\xd3]\xea\x84\u007ft\xbc_oT\xce\xe9\x1f\u007f\xbf}\xfc\x0f\xe3>\xe3\xf2)sWm^\x90ٶ\x11\xbe\x8do\xec!\x13[\x90\u007f\xee\xdd'\x8e\x1b\x1f͜m߰r\u007fR-\xc0\xb0\x80\xd2\x1f&\xed\a\u007f\x88\xa66\xcf)\xc2\xee=`\xe3\x8f\\{\x00U=\bp\x15\x14%\xccU\x0e\x02\xac\xb2\xa8{J.$%\x19\xa0\xa6@\x95;\xa0Z\b\x847bnV\x82\xff\xc4\xd3G\xbf\xfe\xf3\xd2\x15R\x81z\xa3\xeeW\an\x89ܖ93\u007f\x85\xb4\u007f\x93\xf8\xe8\xfe\x02\xf2\xc7\xf5\xfb\xe47\xd4\xca\xd1\x1e\xadD\xbb%\xc7\xf8\t\xbd\xda\x1c\xb8sxMA\t \xaa\x81 ֤ܗ!^\xab\xe7Ρ`\xb4K\x06W\x05\x87*\x05G\xc8\xca,\xa8Xӱ\xfdcܷ\xe2\x81pS\xea\xf0\xf8\xb0\x14\xb4\x16@\x80\xf1\x94/\xbe\\ˣ\xa1n\xf5\xd8\x06\xd0\x17\x06з;\x85\x8dɗM\x1f\xc0xa\xa3\xbadC\xa9\xaeC*\x84ؘl\xf9\xd9\xf8\xc8\xea]\xd5\xc4\x1e`Pb\\\x99\xa5*\x89\x1ae\xb9D\x12\x02\x8b\xb48\xbf\x10\x8f9\xe3\x93)\xdb\x1eL\x1c2aae\xf9U\xc7\xdc\t\x83\xc7?8^\xf6s\xe1\x86Dž\xab\xe6\xcf[M~\x1c\xb3h\xe1݅\x8b\xc5\xc41\xc5\r\x1b}8\xf5\xa3{\xf7?\x9cr\xb4Q\xc3\xe2чoެ\xd8:}\xfd\xdaG\xcb\xf2ŐE\x93\xc6\xe5\xe6\xde]\xc2l\xf8\xb0\xcaJ\xe1\x11\xefg\r\xe8\x03\xcet\xa7\xba\x97fzbf\xbd\x14\xccLOX\x18\x01\x02?2kDTc\xd4\xed^n\x16\x81E@\xbcGL\x1a\x8c\x01\x06\x90\xacI\xd4JԤ&>\xa9:\x9a\x16\x9a7\xdd:h֑\xb4q\x17rn\xfeC\xec\xe4\xdd\x1a\xb6o\xff\"\xbf\xa4n\xaaQ\x949}u>\x9eӶnj\xfb9+\u007f\x9cA>\"?$\x93\xde$S\xda(~\xf7xB\x8fN\x87\xbe9\xb2n\xcdq\xa8\xac\x84l\xea\x01Ljm \x16L\u007f\x01\xd2Q\u007f\xf6\xb70\x11\f.\x960\x8892zgm\xea\x95{\xd2;m\xf4\x9e/\x85\x89H\x06\x837\x80\xc1%\xca\xe6w\x02\x82\x0e\xf0\x890]\xec\x042\x04\xba\xc8\x18\xfd\x95\xdau\x1eK!)\x00%\xa1\x00\xe4\x81'T\\\xa2fk\x81\xe3\x04\xcaZ\x89\xa6\x9f`\xfc]\x8b\xf2\x85\xdb\xc2e\x10@\a5\x81*\f\r\x1c8\x13]\xb5[\x11ݼ:\v)\x84\xdb\x15G\x85\xd6\xecOh\xb0\xd5Q\xb6\x05\x00A6\x9c\x10\ue21d\x9d\xb4p\xe7\xcch\x91\xca\xed\x12\xa3\x85S\x92$\x84:F\t\xbd*\x8a\xf1b$\x1c%\xd9+\xc9\xc22\xc0й\xf2Oa\n\x1d\xeb \x88\x86\xae\xcf\xf1]Q\xf4$\x8a\x8du\xa83υP\x03\x13a\xd1\x00/\xf4_\xa0\xfa/\xea\xbcRR\x9e\xfa\xafd\xd5\xf2\xebh\xc8\xebL\x8f\x87\xe3\xf8\xd7\xe6\xf7\x18\x9b\x9e6\xa3\x04\u007f}\xe8\xa3k\xdb\xc6t<^\x95-\xaf\x9f\xba\xb8Ǣ\x81cҧ\x8e\xee\xbf\xed\xf4\xf9\xfd\xfb\x8aGw]K>\xa9J\x9f\x01\xc3H\xf2\x92|C*\x84$h\r#\xc0\x1e\xaf\xc6&\x1e\x94b\x0f\x9e\x01\x95+~\xf1\x1e\x8cD\xbf8E\xf2\xf0cG\x1e\x06\xa5\tv\xea[\xb9=ޠ\x84:/Д\xb5N\xb9\xbdN\x9cbu^\xf33(-\xb1\xab\xdcR\xbbe\xe3\u009b\x92lb=\xb2\b2\x8bKL\x10\x1d#b\x9dl\x12ٙ\x85\a\xf8\xd8l2Q\xa7-\x9a\x90\xccc\x97\x143\xe3\x84|\xce\xfb\xe6\xc1#I\xc9y\x9d\x96\xad4\xfbe\x1eK\xef:\xa7K\xa2yU\xc6\x12\xd9LJ\x88r\x96\x9c9\xe0\xe5\xbd\x1cٮ\xf4;\xf8r\xcd\xe6\x17\xd3\x1f\x93\xb5\xef{{\xdfE3\x1e\xfe\x83\x86\xbd\xf7\xe47߮}^\x1eW\x035h\xdcr\xf2:\xf4\xd7o\xe4\xfb]=\xbb\u007f\u007fq;\x12V\xd7m\xe1\xb8\xf1ݽ\x03h!Z{\x9a\xe4\xfc\xf5\x88\xac:^\xcf:\xd1\x16\u007f\x1f\xedD\xa1Ȍ>xx\x8f\xf4#˗\xadM\x1b\xa8G\u007f\x87\xff¸\x18\x06 \x85KvЁ'\xb4s\x8f\x9e\xdd\xe1\x02\x99\x9e\xc8L\x1c\xf4\"\xe6\xf6\xcbUj\x15O~QM\xf9Q\x023\xa5\x82p\xd1Q\x94{\n\xd7ۅ\xeb\x9ft\xbc\x86\x1e>B3\xc8\x02\n\xbat\xc1!x7\b\xb0\x1b@\xcc\xe1\x91{ DBOw\u007f\xa9\x89\x9e\x80{HK\x9c\xe2\xe7l\xd2Ï\x05Q\xcc\x13\x19\x9cB\x88\xb4\xa6&\xc1\x18\xed\x8c8d+\xa2\xa74\x18\x89\xae\x19\xad\xfa\xc9\xe8\xdd\xe8\xce\xcf\x0f'\r\x9b\x92K\xbe'\xa7Q\xb3\xec\r\xe4+R\x86bf\x15.\xc9'\xdfH\xf6\x13ei\x9b\xeaF\x97\xcc9q\x0f\xefv\xfc\x917\x1d\xe9\xd6\xcf\x1a=m\fӽ\xa9\xd4#ܤ\xda\x13\x06m\xb5vR\x13\xeb2\x84į\x9c\x19@\x93\xc68\x06\xbb\x9c\xb1\xa0\x89\t\x97h\x8d\x02cR\"\x93\x1a\xb0Xc\xa9\xb8`\x9aM\x9bx\xe0{3\x94\xdc\xff\x85\x10rv\x05\xf2\xdc\xf7=\n\xb2\x1c\x0f\xdeYp\xf8\xca)e˞0t\xe9\xbb'h\x02J^r\x1e%n'\x8eo\xdf\xdbH\xfe\xfbd\xe9\xcf\xe4\xfb\x15\a\x00s.\x9f\xa2\\\xf6\x82\x00h\xf2/Bf\f\x808%\xed8%\xaf\x83S\xa2\x9e\x89ϼD\x99\r\xab\x97\xc6(\x8a\x06M\xb4fP<4&\xd2\x18\x1dP\xf5'\xdcs\xe4\xe2/*\x86\n\xab\x1c\xf5\xf1T\xbc\xd5Q\xb1I\xb2\x17\x91zU\xed\xc7\xd1\xf6\xf5\xd0\xf2_d]\xd1c\x91\x8b\xb7{\xfb\xb2\xb6EkU{\x17\x1c\x9bʄlGS<\x14\xcfw\xccdm\xf9\x02\x82\xe9T:\xeeP鈄!\xff\a\xd2\xf1\xe2|H\x89P\xbdkD\xdc\x01\xbf\x88\xc8\b\x9cz\xa0E\xc4\x1bt\xa7\x84\xbbPSS\x16\x99\xc1\xb1р\x8a\x8e\x92Ŋ\xa3c\xb0P%9\xccu\x88w:\x91\xbf\xed\nyP\x88Q\x02\n\xfc\x06\x05F\x96%\x93\xbb\xc7O\xa3{\xc7FoK\"\xfb\xb0\xe1\xd8\xc8\xf4\x9d(\xf1\xfcl\xd4\x11\x8d\xfc\xe1\x06\x8a&\xbf\x92ʩ\u007f\x92/\x1b6A\xed7\xaa\xbc\x93<\xf8\xd8\xf5Ԏ\x9d&\xcd\xd3\b\x94fT\xed\xc0\xb2\x06\xc6\xd4\xcdz4A\x89ӣT\x97\x01\xe5\xd9\x15ci\x02\xdd&H\x1e\xc7\x1d1ee\xf8\xeeq:|\x03%\xbbc\x19\x9e\xc0\xe4\xe7\x03\xba\x99ʳ\xd1\xf0\u007f\x81\x8c\xf9\xbb\x12\xd0Բ2\xc9ΞJ\xa2\x19\xd0\x05z\xe8\a\r\xb4\xf1\xac\xd3y3\xfa(q\x12U\x00M\xdebTï\x045\xf9\x14\xbc\x8e?\xb9r뷲\xdcySW!\xc9\xfe\xe4\x9f+\x0f\ue799\xb9\xa4`\x11T\xf1G\xe2\xfc\x99\xa4\x8d<\x9d\x89\xb7V\xd0ܱd\xc0,\nmi\xec\x04\xfd`$L\x87Ű\x1e\x8a\xa1\x14\x90\xf4T\xeb\x8d\x10\tM\xb4\xf9\xb6\x96\x11>\x06\xd7DItK\x94\xfcq\x95>'\xaa\x11D\x80\x8dc\":\xaeҦ\x14I\xbf\x9c<\xb2\xef%\u007f\xad\xc2+\x91\xd7\xde}\xc8k\xf9\xb1\xf2#\x87\xae\b\xd7JJ/\bx\xf7\rr|\xd7n\xd4\xe4R\xfaU\xd4z\xcfnr\xecS\x8c\x04\x14@~\xfak\xd4\x13r\x1f\xf99\xa0\xca+\x94\xf1l\xd9\f\xaf)\x9e\xfeF\x8a\x8f\xa3\xaf\xfeB\xfaU\xf3Q\xafK\x8e\xb1Ȗ\xbf{\xebZr\x1b\xbf\xe6x_\xb2\u07fb\x91s.\xdeQ\xe0\x8d\u007f\\=c\xd1r\xc44\xa7\v\xf5[\x13\x18^D\xa9\x06[-ږ\xc6\xdck'\x8e\xec2\x83L\x987\xf6uR\x18\x1b\xc2\xddw\xac&\x1d\f\xe1\xd3)!n9.K\x01\x19\xae\xe5>\x87¤\xbf\xda\xec&\xc6\xe2^\u007f\xdfG\xe6;\x05?\xcd=\xbekݲͅh\xd4š\xe4\xc1w\x05\x84\x1a\xa3O\xde^\xbb\xad\x00綿\xbcv\xef\xfdI\x172\x17\x14\xce\x1c\xd77+-\xeb\x9dq\xfb?\x9dxf\xf6\x82u3nLf\xbdj\x04 \x16\xf28\xb7\x81\xb6;Z\xf6\xcb\x06\x8d\xcb/W\x19\xcb=h!\xa9w\x8c\xd4\x17\xd3$\xd3\xe3_$S\x11 XB9UL\xdfi\x82\x97\x15\xc9\xecO\xfb\xac5\x83\x1a\x04J\xe3k\x14_\x8d\xbaȠ\xd3ŀ\x8d\x9ao\x15\a1\x8aňT\xdeIxH\xbe\xc1G\xdf\xdb\xfa\xf6\xbb\x92\xbd\"\xe6\x12yl\xc0\b\u007f%ܫ\x88-\xda\xf7^\x91\xf09\x00b\xf1\xbb\xe8\xe0xGc\x05t,\xdf\xd1\x06xZ\xa3\xa71m\x80\x04n\xd3j\xf2`=\x01\xd3ٵ\xab\x8eo\x8a\x1d\xdf^\xa9\x14\xf7?\xee\xa2\xda\xd1f\x00\xf2ϼ\x8f}\xb5fAc@\x9d\xaa\xa9\x89\a\xaa\x05ڏ\x9e\xf8q\x1b/x2k*\xab;\x1f\xbe\xa3\f\xb0\xa4\xa0\x04\xba13:l:F\f\xfa:\xac6\x8aچ\x82kE~u\x9cl\xdeG\xae[,\xe4\xec>\xb2\xa5\f\x9d/{WxT\xe1a?!|\xf3\xb8\x8bXsܸ'\x9fS\xfa\x104\x01\x10/q\xff;J\xcb\x02'=\xeeFX\v\x89\x03\x12\x99\u007f\xd5gC\x01\xec\x80C R\x97[u)W^'\xef\x96KdzI\x00\x99Ѯ\x97A\xa5\x9d;\\\xfe/\x01/@\xa9_\x91D\xf4\xd97d=Y\xfb5\xbaI\x12\xee\v\xf3p\x03G\x03G\fn\xec8\x83\xef⫌\xa7~\x00\xe2\x11J\xa9\a4\xd2R\xea\xa4GC\xa9\x938\xb5=\xe6\b\x13\xf0p4\xe36\xf1,#\x9ew\xf0\xa7\xf8\xf3\x8aq\x8e\xfb8RX\xc1\xde\xdf\v@\x9c\xce}_\x1bxq\xf0\xe1jSD`\x86\x86\xe1\x0e\x92\xf3\xa2^\xd2ы\xaa\xefOb\x18D\x00j\"\xb4zrG\x88\xa8x(\xfc\xbdi\xd3rq^\xd1R\xd6\xdeJr\x06{\xc9s@\a1@)\xb6\xeb\xdc\xe3f\xc1Uک\xfbdQ3\xf6:v\x8c,B\x99\xd2\xf7\xffL[\xab;\xcc\xdeS\x8b\xce54\xae\x9ek\xc0q\xae\xbaD\x1fd\xd2Qˎ\a\xd9%\xfb?,\x8aѓ3h>o\xb5&\xbf\x1b\xc5ٱ+\xfdv\xa4\r\xd8\xcd\fC\xa1\xc1\x84\x1eM'\xd9Ǐ\xcbs\x1euX+\xe7\xb0v[\xe2[\x82?\xd7!\x9bS\x874\xa2^\xae \x1dS\x16ֈČBU\x86[|t/\xaa;\x1b\xd5\xd9#\x1e!\x11\xf83Gm@ V\xa6\vk\x01@\x80P\x97\u05f8\aT\x12\xc3s\xd6V\x8c\x16V\x17\x16\x02\x93^\xf1&\xba-\x11\x10\xc0\nvĒ\\\x94\xfat\xfa\n\x19Td\xe9\x80\x1f\x8eĘ\x05{\xac\xf9ۛ\t\xf9\x92>\x16\v\xdco>\x10~\x14_\x87\b\xa8\x05\x99\x8a\xa5v\x1d\x9e,\x1b\xecQU\xde\xc6B\x89\xb0\x04\xb9˿&\xc3\xc6\x16\x1eyy\xb1\x1d\xf3\xf0\xf4q\xd7\\\xdb\xe4e\xa9\xf2;\x91\x1aX\xcf\xea\x1a\xc3\xc7\xdaX\xbc\xcclz\xc2\xd3y\v\x0e\xfcX\x8c\xfe\x96\x00\x8e\xeeY\xa3\x18\xb4W\xcb\xe09\xf7\xfd-\x17\x11\xfa\xe1\xc0\xa4\x8c\xa1٥\x13ON9r]\x8c%^\xbd7ZW\x90\xbd\x93\xa2\xbae\x1f\xcc\xdb}\xa4\xe7\xe0\x89\xc3\xdaw-\xecs\xe4\x1d⻦\x8fai\xbf\x0ewO\xf7\x1e\x02\x98\xdb\xde(\x19\xc0\x17\x82a\x98b\n\te\xb4\x99\f\x14\xf6\x01j\x95\x9c\x91e\x90\x9b\xd5\xd3\xe2\x18\x92\x87\xc0\x83Mo>\xb8\xde\xee)\xbaE\x13>0\xe4G\xc7b\xec\xe4(\x93\xd1\xc6!v#3\xd7b\xd47e\x17\xc7\xeb\x8bKƣ\xc5\xf7KV\xe6~Х灅\xab\xb1\xf1\x11\xb9\xb6b\xa6\f\x8eO\xf2\xc8\r\xe2\x90>\xbaTL\xea\x15_\x02\x04oұz@\xc7*\x1c:*\x86\x88Hڴ\v\xf4\x16\xe4\x1eۀKD\xc3\xfa\xc7@6\u007f\xb6Ր\xc7X\x9b\xe0KId\xf8\x81\xcaqk,\x1f\x00\xcam\xdc|\xe8j\x8f}Ҕ\x93c\xbf O&\xddZ}\xe8W\x8f}\x1e\xf9\xe9K7\xac\x9f?\xad_\xea\xaeaȆ \xb2诜\xdb\xef\xa5/:_f=r\x8eI\xd4@J\xe5\u007fe\x00?\b\xa1\x1c\x0e\n\rc,\nR9,\xc7iPQM \xaf\xa5^\x12\xbc9\x87َs\xd8\xfc\xc2i?s\"\x8dm-\x94\xbfV&DX- H1\xb2N\f|p\xec踒b\xfd\xb8S\x1f\xfe\\\xb26\xdb\u07b5\xfbޜ\xb58\xf6\x1f\x147\x0f'>\x86I9(\xf1\x91\xeepy\x11\xfau\xddUF{*\xa5\xfdw\xca\xe1\x00\xca\xe3tŃ\xf3\xd8\xeeጽ8yA\xee\n\x10\xe2\x01쾐\xb8\x03\xc7B.\x87\xe0T70\xc4\xe02٥\xde額\xc1$6\xa3Q\x8dhG\a\x06\xaaH \xa2\xf3\x1bѴ\x1e\x04\xbfv\x87<\xc8\xfab\xee\xb5\x1f\x1dV\xf1\xfd\xc5Cr\x122rȭ\xf1kM8\xc2#\xc7\x1fE\xff\x16\xb3ՑO~$\x8e\u05f6\x9c\xecҺ\xcf\x15\xe1\xdc۫|\x97n\x00\x04/\x03\xe0sr\x00\xed\xcdP\xc5/\x90i\xa1K/\"\\\x05<\xc8\xd5\x15\xbb\xf7\x8f\xf1\x1bi\xc2c\x1fWci7\x97S\xb9b8\x0fE\xe2\xf9T\x83E\xa7\n\x10\x9b\x00\xfbnϞ\xd2\xe2\x96-<\xe3\x92\xfa\r\xf9\xee;aO\xfe\xb8\xf7\x8e\x1a\v\xf4\xe9C&\xe4W\xf4\x04\f\x83H/\xe17\xca\xf1`\xa8\x01\U000d561a\xb1\x8c?1,8\x04\ryN\xfd\vr\xcd\u007fM\xea\x89j\xa6T\xb9\xb1\xf0\x89\x12\vKݴ\xf0\x88\x12\xc0\u007fc\xe6)\\#L1\xcf\bSJU\x02oKQkQ\x98\\\xa58\xc5jЏ\xc7O\x8d\xd3\xef\xfe\xe7\xea\xe4{/\r\x9a\xbawQḲ\xa3?\x95\x16,\xda\u05edg\xf1\"*_\x0eTwɴ'\xf7\xae\xfe6\xac\xf7\xb8Uk\x17\xa7\xceA\xf1\xbf\u007fpe3\xfae\x03\xf7\xe3K\x00\x84/e\x00#\xd5cO\x93\x99\x8f\x8b!N\x83\xc2k\xa2>~\xe2KO|\x9d\xe9>\xf3Y\x9e\xaef&9!\x8ae\xba\\wyJ\x8f\xdaf\x9dD\xbd\x85\x12\x94>\xae_NlI\x89\xf0A!\x99\xe9H\xc2\x17&\x8f\x1f\xf4z\x05\xab\xe6\xc0\xc0\xdc\xf0\b\xe9\x04\xafWk\xae\xc8>\xbe\xec\xcd44G\xae\x95u\xcf\xc8\x03\xae.\x12\x92%\r\f\xe3R\xbeֳ\xa4䌊NjMQd\xfd\xe6\xcd\xfb\xbd\xfc2\xe0\xcac\xa43\xeaK\xdb\xf3\x86@f\xc3,A\xeaT\x00uX\xf0\x02\xd3K\a\xd8\x05\xb0\xa3\x86\x80\xc1\xef\x01q\x8aAr\r\x84\r\xd11\xb6$5\x04\x16\x98\x04\xaaDt&\xdf6K\x8cJl\xdeʜ\x92\x94LiI\x16\x9b>\xe9HΘV{\xbc\xd2]<\x82\"\xeb\xb5\xe0d\x01b|\x10\xbde\xa0tMvI\xb2\x98\x8ah\xb5\xfe\xc5\x18\x8c\a\xc7X\x02\x9a\x82;\ns\x0e\xe6\x01\xc8Ӹ\xf7\x98\xaa\x88ܲi5\xec\x05\x06N\xa3n\xd5\xfd\xf6\xa7'\xfe\xd5'\xa1\xf4$\x94G\xe9\x1e|\x02\\\xe2;\xbb\x87\x06\\\x0fbя\x85\x19\x87\xe4*IU\xcb3\u06015\x86\xedPSi깯\xbb%\xbf;\x05\r\x93KF\xce|+ǫ\xf4\xbbC\xaf\x94\x88M\xa7-y\xef\xf5Ad\x91\xa3.>7ib\xd6\bG<>\xf9`Cŏb\xd3j]\xa2\xbd2Bw\xc5\xcbd\xd6\xf6J\xdb\x117'\xee\x9ea\xb0\xf0\x9cY\x03/W\xad\xb2\xb8\xab\x15zI\x9eqƩV\x94\xba\x9c\x8d\xaejE\x89\x02\f\xfdi\x94\x91H\xa9\xf2\x83PxE\xf1\x0e\v\xaf\xaaa5\xbb\xe6\xf0\xee\x0eP1k\x82\xdf`\x8dUb\xde\x01\xa8Of\x13DP]#\xc7Y\xd8\u007f\xe6\x97\xf9_ c\xe6\xfd\x95w\xc8\xc3ҝK\x96\xeeؽ$w\x17\xb6m&\x8b\xc9%\xe2S\xf4d\t\x8a\xaf\xd0\x1f\xb8\xfd\xc5i\xe5\x8b\xdb,\x02\"\x83\xc4\bN[\b\x8cU̪\u007f63\xfcF\xab\x83\xce,T\xc39\x93{:(ykb\xa1\xe7zjM,\xc4D\x9dI\x826\x18\x8a\xf8\xea\xf8Ɍ\x92\xdd\xfa\x8c\xb3\x9f|]\xb21gW\x8f\xee{\x16n\xc2ƿ\xc9ՙ\x8e\xbf\xa5\xdbӖ\x90\xdb\xe4\xb1\xf8\xc1\xf55\x8e'\xab\xaf\xf18\x83\f\x12\x1eV\xf5c\x946\xce\xf8wϡ\n\xb9ɝ\xfb\x9a\x88\xe3\xf9\x9d\xd0z\b\xab\xf1\x99p\xe3Ǔe\xe3\x92\x01A\x0e\xe5\xfb\x1dj\"\f\xd4ZQ\fC\x8b\x91i\xc8rw7\xce@_-\xba\xc2ω\x01j2b8\x1aD)c\xf1\xb0Pk\xf4\x95w\x0f\xa2\x923\xd7ە\xd8G\xcd>{\x12\x979\xda\xfeU$\x98\x9f\x9c\x02@\x10\r \x94Rj\x9e\x8b\x01iD\xce=\x1bR@\xd2`@\xe8W\xe4\xfd\x11\x99\xb1\x94L\xfb\xe8\x89\xd0\xe2\xc9)f\x05\x11\xd4\x05\x90\xae\xd1Co\x18\xa4H>\xbe\xee\xef\xd7ʷV\xf2_\x9cz\x81\x97\xc0\x9d\x8c\xba\xf3\xf4\xaa\xa2\x83c@\x8c\x14\xb39A\xecT^BN\x16\x90\u007f*\xa1\x80\x9c:\xfciŚJ\xe1\xa5'\xa7\x84Ċ\vbӊ\x1bB\x1d@P\x1b@8Gi\xf3\x82\xeeZ\xa2\x9c\xa8Oп\xa3>\x9e<\xeb\x95՝;\xbacf\x8e\\\x10\x18\xba\x83\xfe\xfe\xefMR\x84\xc6\xdcx\xfc\xf834\x86\x14\xdd\xc0\xfbP\x9e\xe3\a\xc7\x17h\r\x19\x85\xad\xd8\x02\b\x02Ig\xc1N\xa9\xf1\xa3Q\x11\x18\x8c\xee\x9cr\x89\x005\xc3bbt\xf8J\xbce\x97\x94\x83\xe9\xa9J\x03\xb6\xdalI\x16VB@\xe9\xf8\xa5\xe2\x14ym\xf8\x1dk\xdb\xf8\x01\xe91\xb5ɬs\xc8O\xa8\xfb$\x92\xfc&\xf8\x14\x88\xaf\x0e\x1f+6\x00\x04}\x00\x84\xf7)%Z\f(\xe8\u007f\x00\x03j\x8a3+\xb6㞎\x03Bbaa\x8e\x10\xbcn>\xc7P\xc8J\\$7\x83 h\xa4\x98\x83Cx\xcf}\xe2\xa8.\xba\x14\x86E\xea\xd8,\x96\xe0̢d\xfer\x8e\x02'%Z\x93ⓒ\x92Y\xc6d\xa4U\"\xb4\x8a\xdcd\xc1\xd3\xf6\xbf\u007f\xfd:\xde\xf7~앝;\x85Kde\xfc\xb7\x1f\x9e\xfe}\xc5o\xe5\x1f\xdcO\x98\xf8\n\xf9Ϲ\xaf\xfb\xf6\xfb\xf6\x12\xf9\xb95\xa3`\x1f\xf9\r\xb5ya\xa5*b1T\x9b5k\xc8o\xf2Qv\xb7\x99\xd2;\xa1\x8a^I\xa5\x97A\x1eA\xb4bދG\xb3FJ\xaf\x91\xd2kr\xd2+\x99\x8c\x9c^K2\xadTN\xa14\x1bh^\x11Hg\xc4\x13\x02b\x98Kי\xcf\xeb\x0e\x1e\xbc\x12\xbb_Aׯ\x1f\xdc\xf7\xa4\x15\xf2\xbc\xf3]\x8fn?\x9cG!\xafL\x8c\xbf_r\xf5\xe1\x8a\xdf\xcf}\xf8UZ)>\x14b\xc0\x02\xad\x15#\x9f\x1b\x00g \x13\xc81'\xbb\x1fO\xf4\xfd\xe3\\m\x99\x9f\xbb-\xf3b\"\xc2,p\x03\xcc,\xb2\x8e\xd9gJ\x14\x15\x96$\xf1\xe1\x91\xdc\x0esvw\xaa\xf3z\x8f\xad\x87\xf3^]bo\x19\xfe\xea@A_t+iu\x8dQ\x03\xf0\x96K-\xb7z\xe2I\x03\x01C\x1eY\x8b\xd2\xc4\xd7x\xfe\x10\xef\xcc\x1fx<\x8f\xe34*\xadY\U000826760h\xcel5\xb3P\x9d\xe5\rŻ\x9e\xaex\xc1{\x9f<\x90^\xad\xca\x1a\x10\xa4Wz\xd1J\xd4X\x88\x86n\n\xc4XY\x9f\x9dQh\x90;p\xac+w\x85><9\xf4\xe1\xcfl7\xdb\x06\xb1\xad\x12\xea\x0e\x80\xc8\xea\xda\vL\xc5\xc9\xc4\xd7fhP\x90N\xc3(\n\"\x9fZ^\xf2\xfe\x99s\xfbK\n\xcad\x15\x04\xd90?\xb3דּ!?\xfc\x18\x83\xc2\xeeX\xaf\xa3\xf0课\xb4\\/\xa8\x86B\x10\xf4\a\x10Yv\x15\r3\x940w\xba\x9f\x81\xf6#\xfdy^\x17\x19\xa7\f\x8cD\x13\x94\xfcH\x94\xa1\x1c\x8bD\xa9\xce\xdeh\xcb\x0fYO\xe9R\x1fU\xdd푬\x1c\xe0\xf9=D\x16\u007f]\xb4.\x9a\x95ɥ$٨\xab\x124\xbe\xd8Lu\xf3\xb8Gs\xfc\x05z\xf2\xe8\xb5Z\xf1\xd8c\xfb\x16\xfd\x9fg\x8e\xde=6{\\\xfa<=j\x81\xc7\xdeY\xdf\u007f\xd3&\xfd\xfcA\x1e_lB\xe2\xe9_\xae\xef\x1f5c\xfdLR\xb1\t\x00ӱ\xf9V\xea/\xfe\n\xa1P\aZ(\xb8n=\xd5/\xd9m\xe5\xa0\xf5_\x86r\x96\xe3b\r\nH\xb1(\x9b\x9b\xff\xb2\xe9l)\xb1TKl)<\x86I\xb1\xe8X\xed\x97E\x87\xfc\x03\x03\xe3yQ3#Z\x16\xdf\xd8|\xe5\xf2\xe6\xecyy#Ư\x9a\xb7\xaa\xe8\x93\x13\x9b\xd7,(\x1c\x9b\x96\xbf\xa0b\xd0\xc4\x13_\x9d\xc8\xc889>\xe3\xc4\xc4\xf1\v\xe6\xe5,Z\xba\xf1ܥ\xb7\vs\n\xa6e\xae\xcd]\xff\xf6\xf9\x13\x9b\x97\xe7ବ\xebӳ\xaeeM\xbf\x969\xed:ӪH\x00\x91N\x96@`\xf5\x1c@ %;P3\x89\x19\xe6\x1e/\xfa\x99\x85\xba\nx\a\xd2\x0e\x1f\xf03G\x9aq\xaa\xdd̄\x8dn\x15\x13v\x16\x9cp}Ա\xad\xe2\xeb\xbc\xecY\xaeb\xf2\xd4>\x06<\xad\xfdg\xff\xa3\x04\x9c\x86F\u007fN\x06\xa0\xc6d\x0e\x9aC\xe6\x1c'\xd9\fyFMȀ;\x82/\xde\xe6h8s\xfb\fr\x14\xb5\x9e\xb1}&.gc\xb0\x8aZ\xb0\u05f8\x05\xd3A\x10\xb3a\x9a\x89*EBB]\xaak4 `\xa1\xe1\xaa\xd2\xd2Rj\xf2-\x15?\bg\xf0_\x80\xa1\x1f1\x8a\x99TJ\x13\xa9ş\xa3X۶\xa3\x1db\xab|\x928\"\xea\\\x1e\xc4^\x15\xe8ae\xbf\x06\x1a\x94\x16.e\xee\x81-\xaa`2_*\x90\x1aĥ\xa1\x95W\xd254()\u038b\xe1)\ry\x13LH\xf8*\"M\x86\xa0\x16x\xb3@&6)\xe5i\x8dw\x03\xcc,\xa7:\xe9':\xa3\xc8@1\x02פرzl\xe1\xf2!f\x96\xb6\xed@*\xbe\x19\u007f\xb6]^遍9;\x96]9T\x96z\xa8u{\xe4u\xf7{$\x96\xec\xca[\xb6\xb5\xf1\"\x14\xb9;\xa3\xa9\xe3~\xbf\xce]:'/Da\xf5^\uf447\xf6}ԳQΰ]\xa7\x1b7ɸ\x88\xe7\x15N\x1e\xd47\xbdy\xc3q\x1bƕ\xf6\xa1\x97w\x9c\xf9\xea\xe2\xcc\r\x13\x87\xb4\xedҪK\x87\xc1s\xf7\x04\x85\x9a\x87\xb7mץu7\xa3\xff\xf0\xb6}ưqH\x13\xff\x8b\x1fJ'\xc1\x03\x8c\x10\xce*4]VK\xb0\xd9N\x9dA\xd5\x02:\x18\xd5@I\xcdꃴ\xaa\xea\xc5\xf7Խԟ\x16,R\xebW\xb7\xca\b\x82\x00\xfd\xe9J\xae\xffH'\xb8\xa65\x815\x8a\xad\xe9K\xbcX\x98\xc9\x1c\xdb&Wi\\\x03:X\r\xaa\xa55\x99\x9e$\xf3\x18>\xb9\x81Zt{\xc0O\x88\x14(F\xe9\xd9 \x99O\xdc\xc7\x1d\x00O\x83'\xbd\xe0\xeb\xc9#*#\xd6$>OϔP>\xebfO\xa6\xb3\xe3\xcee_\r\xa8\x06\x8b\xae\xc3\xc7\xe3am\xb0_U\xa4]\xd3\xdfD\xeb\xf6M\xb4\xf8\xab\x86\x95\x95<ҙ\xf4(:\x91^U\xb1 \x0e|\xb7h\xd3G\xc76lٻr`\xff\x01\xa3G\x0fx3Ձ\xb6 3j\x89L[\x8a\xc8\xcf[\xb7\x90\a\x9b'\x1eA\x9d\xd1\x1c\xd4\xe9\xc8\x01r\xf0\xd4Ir\xf0\x10\xee\xb9n\xeb\xb5Cc\xed\xd7\xdeY3\xb4\xe7⬌i\x8b{\f_\xb0\x97|\xbec\a\xaa\xb9\xb7\x18\xc5\xec\xdcN\xee\x14\x9fC\xfdN\x9f&;Ν$\xbb\xae\\F}\xb8\xc6\xe0\xf7\x05?\xce˚0Z\U0004dd71\x9e\xf9\xb2\xdaxmy\xb6\"\xc6\x06\xa8\xeb:\xd8\\\x0e\x16ى\xe2\xc5w\xcc\xeb\aP\x95v\xbay\xa3\x17\xbf\xceJ2\x04\u05c9\x8e(W\x06UOt$\xb3\x89\x0e\xc6\x1d\x9b\xca+:͡\xcer0Y\xc6#\xbd\xe5W\xe7L\x9d\xb7s\xef\xe8\x19m\xdfغ7w\xe1\xfa\x10\xf2N\xdd>a\xe3\xbb\xf7\xc5\xc7cb{\xcdxkܴ\xc4E\xc9\t\xdeo\xcd\xcb\xcf&'\x06wͪ\x15\xba\f\xb5H\x18PY\tiP(\f\x13އXX\xff\x98\x80\x0e֣6\x95\x04\x10\xccFS\x85\xa3B\x14H\x10\x02\xacC\xa8\x9c\x1a6Mu\x1c\xa3\x8f\xdb!\xe1h\xa9#Kh\x81\xa6\"\x8f\xad B?*y\xdfRn\xf9B\x04$B3ح$7\xe7*\x9f\xcc\xc2\b\xb65\xf3\xadUS\x01\xe2\x0e\x91\x995+\nC\x9f\x9e)Q<\x86\xa75\xc3J\x8cZ\xb1\x16Ce2\xc6\x10Ce2)*\xa6j\x1d\xe1\xb1$\x94z\x00\x92\fI\xf4j\xa4S(kE&\xf1g\r\xf6\xb8r{\\\x1c[p\xd9\f\xbb\xe6\xea\x1a!K\xf1ge\xb6N\x19\x94\x98\xd9\xe5\xc5\xc5,\x1a\xb3\x04Xc\x13m\xb16[\x82\xbax\xc6\xda\xcf]\xdc&R\x81ܲ\x15\xf9o\xdaD\x1ep\x81DeK\x91\xff\xba\xdds\xa6#\xe3\n_\xc10Ѿ\xb1C\x9fׇ-Ʒ\xdcd\xee4\x93\xc9\xdd(f\xef\x1e\x14\xcdd\xf2O\xf2\x9e\xd0u\xfe̬V\xf1\xeb\x9b\xf5\x8a5\xd4(1\x0e\x12\xe7\xe0\xd6\xc9\x1d\x9b\x01 \x98&E\v\xad\xb9=7\xf29=,hk\xba\x85֎d|N\x8a\xce\a\f\xf3\x842<\x83\x8e\x8d\x17\x04B\x9c\x1b\xfb\xbd˩\xb7R\xf4\x1a\x856i\xb8\xc3E\x8f묥\x1aN\xf2\x0f\x9c\xb7f\xe4\x88U\xabF\xa4\x17T&wꔜҹ\xb3X6b\xe3\x86\xf4\x91\x05\x05\x81\xed\x9b4\xed\xfc\xc6\xe8N\x80a0\x80\xf0\xa7\xf8;m\xd7\x0fڱ\xd5hڌZox\xde:7\xbb\x8f\xa6\xdeC\xf2\x95\x99\xf3\xf4\x92B%\x9c\xaa]\x03Ǻ\x89s\xd1h\xb2z'\x99\x8d\xe6\xeeD\xad*>\x12^\x11z\x15\x92!\xa8\xa8\x10mzⳖq\xaa5ހ\xf7HGh\xdf{(\x1e\x1cM\x06g\xaa\xa4)\xd0\xf2g\xde\vk\x16R\xf9\x06\xaaZ\xafx8\xaf\xfb\xf2\x95<\xfe\x81,\x90\xe5\xccF\xceuTl\x89\xaa\xbf\x1f\x8e\xc6{\x1c\xbbQ\xbd1-_\xee\xdc~\xd3N\xe4\xb1~T\x0f;\xca\xc7\x1bF\xa3\x90\xb4\xb6\x8d\x9a\xbd\xdad\xc2\xea\xd9cG\x8czc\x05 h\x8e\xf3\xf1z\xa9\x14b!W\x89\xb2\xd5\xd2ҧYJ\xc5\xe8\x83`\xd6,\xa5\xf7\xd08\x98\r\xf9 \xa4*-\x00e\x1c\xf2\x83H\x88\x03A]R\xc5\b\xd69\x15\xc0\xd37\xb8\xaa\x929֩Q\xfe|M\x95\x12\xae\xbe/\x98\x9a \xd7RtեjWUUI\xc1\xd3UU6+\xd2\xf7\xe8ԡE\xbb&\x9d7\xbd=#wc\xbb\xd6k\x8as\x16\xec(z\xe3\x95v\x1d7\xf6\x11\x877kX\xbfiB\xed!Y\x99#R\xfa\a\xd7\xce\x1f9s֨\xfa/\xbf\x9c\x90\xc1\xabu\xb3ě8\xaczN\x1a\xd39i\x8cRU\x80\xe5\x00\xeb\n\r\x940sZ\xc1v\x81/\xadd\x99\xfb\xcb\xf7\xc8\x1fk$Bn\xb3\xe7\xd7Sd\xef\x17\x9a\x83\x9a\xa0\x8b\xe2㬏\xd1¸\x9a\xbc\x94\x03#&\xf72(ѥ\xf8I磎\xa81\x90\xa3u|\xb2P\xc5\"Qw\xf4֤\xd3\xcdKw\xeaS\x8bWu\xa5\x80\xaec\xd1\xdb\x1b\xd7\nQONM\\ԑԕn\x03\x82W\x00\x84\x96\xbc歮\x82\xbd\xbc\x19E/.\x04T\x10x\xa8E\u007fFjtX\xc8\x12m\xc4\xd9=\xfeC\xfeF\x9e\xffA>\u0603\xdc\xf8\xb4\xf2q\x17\xd6\xd3Ux\x14\xca\x14:\x82\x1e\x02\x15\xa1\xaa\xda\x10\xc7\xed\xf7\xa0t\xdf\f\xbd\xc3T\xf4\xe9\x12\xcbU\xea\x12K|\x8b\xad\xb1\x8ckA\x05\x03&\x91\xd7P1\xb0\xb9\xecV\x8a\xe4g\xd0\xf2\xc9\xe0\x06\xda\x1e0\xcbV\x99\x1aO\xc4!\x8a\xfd\xba\xaa&\xecHE\v\xa2U\x11\xb0\xa9\xe1V\n\n\xf7^\xb7%_\xf7F\xef\x96C\xa2\x12CW\x0e\xce\x18\x95\x18W\xaf\x8e>\x9b\xd5'\xe3m\xe8!_\x11\xd9RA\f5z\xe1\xc2H\u007f\xed\xc2H\xec\xbe0\x92y\x1b\x1d]\x18\x89\x1en\xba\x89\x86\x9a\xf06ܷɜ\xc9\x00\x98\xb6\xa1\b6>O\x14B[\x11TlW`\xe1\x93\xd6\xc4)\x9e\xa1\x82\x1a\xc5(\x06A3\x03/\xb8\x9b\xb9\xe7\xad.\xd7M\xffp\xfd\x86\x0f\x8f\x90\vG\xdf\x1eܣ\xfb\xc0\xc1ݻ\x0e\xc2\xe2ТO\x8e\xef\xe8\xb4\xf9㏷\xcb\xc3&L\x1c\xfe\xfa\xd0\tc\a\x03\xf7\xabk\x85i\xc2A\x88\x85\r>\x00:\u0600F\x02\xbb\xde\x13@Z!\xbd\v6\xd8V\xf99^K\xf7\x1bQ\x10x \x1dl\xc77\x00\xc0\xa0e\x0f_3D\a_:˟\xd9\b\x0f\xc0\x83?{\x03\xaf\xa5ϼ-D\xf0g45`\xfc\x99q\x00\xd2\xcf\xd2\x11\xfe\xfeB\xfe\xccv\x81A\x02:x\a\x1a\xe1\r\xd5\xcfD\xd3g\xa2\xf93\x80\xa1\r\x99-L\xa3\xf9y\x10\xc4@oE\xafVE\xea٪\x016\xe3輟\xe5\xe7`\x88\xe6H\xd6\xffn}\x8e=\x9azo\xd7\xd97_A\xa7S\xb9\x9a \xab\xc1\r[\xbd\xc3\xf3\xfa$&\xbe\xf8UT{\xd0a/\xebHKo\xbc/{\xd3\xc8¢\xad\xb7\xf1f?+!\xea\xcdM\xf9\xceޔ\xde\xdc\xf4rS\xea\v\xa35\x9a_\x139\xd3\n\xf5κ\xe5l>3Nc\a\x93\xa9.JQ6\xd9%\x8d\x8bu\xe6q\x16^\xc5\x13\xa0V\xf1\xa4PLڙ\xd4\x05\xf2\x82\x1e\x06P\xfcB\x9e\xe4\xb4\xfaj\xe9\xce\x0f\xbf\xfe\xe2˱#җ\x1c\xfe\xed\xc8D{|\x8b\xf7ү~逸{o\xcd\xea̸\x96E\x15\xfa\x0eE\xf1\xdfL^2R\xe82q\x8d\x11\x87d\xfb\x1f\xe85\xe0\xdd\xc2M\xef\xf5\x1c\x955\xb6\xab9\xff`\xf7\xeeo\xf4&\x95?L\xb4\x1f{52'\xb3\xa0S\xf2\xcfxl\xf7\xd7R\x85\xc4=y\x91\vV1/:\x8b\xad(\x97\xebA8ԥ\xf1\xb1\xae^}\x15\xa7\xb7\xd7*\ag\xe0\x19\xe1>\xb1\xe1\x17\xac\xabZ\xfdh\xe4GJ\x8c\v\xe2\xa8\x15$d\xa2\x90\xbb\xeb\x8a\\K,\xc3\xef\x98,Q\xe4N\xb0\xa9\x10\xaa\xea\x1b\x84\xc4\u007f&\xdf\xcc^t's\xfc\xe5\xb9og6\\z\xbbcق\x0f\x9a<\xdc\xf7Q\xc7\x118:\xef\xcd\x15\xdbvΙ\xb9N\n \x8f\xc8[\xa9E\x8e\xe5s\xefe\xaf\xfaaބO\x96\xae\x1e:\xbf\u007f\xa3\xcd\xc9ys\x87U\xfc\u07b8Y\xc7c;\x97\x9c\xf8\xea0\xb3k\xeda\xafX_,\xa5G>`\x81\xd7\x15]PpU\xff\xa0\x9cm\x8d\xe5n\x9f\xb9`\xdfx\xf2\xae\n{\xf6\xcb\xce\xf8g\xbf\xa1\xfab`Ձ\x9af\xa1\xa7\xb1\x97\xf1\xe9\x91X\xbf\"D\xf8\x8fc\x8b\x1a\x8c\xa9[\xdc\xe70jʣ\xb2\xe6\xcd+\b;h@\xc33\x8e\xd8L\x17\x13\xc5ü\x9a,\x16\x86*\"\xcf\x00\xec\"3\xa2lku\xaf\x06\xd0T$X\x9d\xe2\x18m\x15\xb9\xe3\xe5\xe8\xae\xe8\x8a\xee*\xc1\xa1~<\xc6g\x15\x9b\xd5u\x02\xdc\xd4\x1a\xf9\xc0p\vlV\x8d\xae\xccm.\x1b\x8b\xfeY\xf7\xf3\xc7\x0e\xe88#\xed\x93\x19\xf7\x96\x8f\xe8\xd5iư\x8b%\x83Q\xef\xe6\x1d\x16\xef\xc2i\xbd\xc9ޔ\xd6y;i\x01\x81#\xaf\xce\xea\x8b\xebIY\x11ɵ\xae9\xbf\x06\xa5|<\x0e\x1f\x8a\xba}\xf0\xd08G\x97\xe0\xcfK\x00\xc3\x1a2H\xb4=\xa7\xd6\xcf۽\x9a\xf2\u007f\xbe\x82\xc0\xf8L\x05\x81\x8dW\x10\x94d|\xfc\x9c\x02\x02\xdd\x16ǹ\x05\xda\n\x02\x04\x1b覧\xd8ԭ\x8e&\xe8\x05u4\xa5\xa5jmLjʟtz\xbe\xce\xdd\n+\x14T\xa3&\xf7\x18\x06{H\xb9\xf6\x13Z\x9aD\xef\xc5+\x85\xec\xbeZ\x8b\x05\xbeܚ\xc7)\xfe\x1a\xe3\x14\xf8\x02\x960v\x85\xbb\xda\xf6h\xa6\x8e\xd8fL41Ix\xba\xb8Q\xa2IO\xf5\xf7Pt\xfa\n\xbb2a\x1bY\x82\xf2ȶ\x19\xc5B;\xb6ޑ\xad}|\xb2$#m\xcc\xe8w?Ɵ\x04\x14 \xbf=(i/2\x16\xfa\xd3%\x90\x9b\x1c\x15\xa1\xbe\xe22\xbfo/\x93\xd3\xd7~b\xb2=\xb8\xf2\x81\x0e\xa8]\x8f\x82z\x90\b\x05\x8a\x9c\xc4\xe1D\x99\xc5\x13l\xdbP+\xdb\xdaiUMɞ\xd3\xe23Y\xd0yr\x8b݈\xef\xec\x8d\xe2\\\x1c.\xb3\xed&\xe4Lr\xd5;C\xf8\xae*\x04\xa9㼹\xbe\xaa\x0eO\x8dr`\xb5Q\xb6po\xf7l\x1dM\xcd*\xf3<8\xf3\xf3e\xb9g\x9b\xb5:1\xfe\xf2\x8f\x8ex\xdd;\xd9\x1fN\xeb\x94\xfb碋-\x9a\x9fξC\x1e\x95l\xc9\xcbݲu\xf1\xa2mb\xfd\xa1\x05\x81\xd87\x17۶\x90\xdc\xc9\xc3\xd2&\x92\x9f&\x15\x9f\x1c=k\xc1\xf8aC3PC\xa2\xff\xe0\xe6g\x97\x0eݺq\xe3\xed\xc5!3\v\xf8\xda2\xf1\x1bA\x96\x01< Q\xadw\xa7v\x8a\xa6ĺH\x1d\xf5E\x92Ȍm\xb0]bu\xdb47Ft/\x1a8P\xc1\u007f\xe1_\xc1\xa0\xea\x9cdN\x10\xe4u\x05k\xd6\xfd5^\xfcų\xb8\xd8\x1b\x19\x98Tf\x8a\a\xb0M\xee\x02z\xf0\x87:\x8a\x10\xc0\xb1\rA\xfdF\x9ePՔ\xd2B\x87R\xf9En M\xd53\x80|\xfaM\xe2\xac\xe0\x9c\xc0\xb6\x19\xfd\xdf\xcc\xca:\x9cE\x0e\xbeҨa\x9bW\x1aŷ\x96\xe6\xf4\x9e\xc0O\x93\x99\xf9;\xcf輈E;\vɝh\x04\xe6\xfe\xa2y֛\xb5_\x1e\\7\xacv\xd3\x19\x99\xa9\xd6ƃ\x12\"\xeb6\x91\xee\x8c\xce\xf6o\xeeӢ\x91n\xd4\x12\xff\xa6\xa66\xf5i^\xb4\r\xe7\x89K\x85\x18h\a\x9bo\xc1\xab\x17[\x02\xbd\xb6\x1c\xe7Ig\xd5k\v -\xad%\xa3w\x90\xd8\bM\x93͔\xfbъ\x87\xdeS\x9b-G03\xa4\xe7N\x9f\u007f\xfc\xc0\xc2'\x04\x13\x93\x91\xef\xc8T\xe1\xf0`\xd9\xdca\xf6\xaa\x9cIig\x00AC1\x10\xb5\x97\xc1\xf5=\x9a\x92A\x05\xf8\a`\\\xbf\xc7$\xcb\xeb\xd2S\x85\x0f\xd0`1\xb0ü\xe5\xcb\xe7\r;\r\bj\x90o\xd1Kp\x90\xbe'\xe2\xe9{\xfe\xfd\xa3NK\xd3\xfb\v%Cɷ\x1dg\xaf\x9c2l\xf89\xda\xcf\x11b#|\x84\xf6)\x16Vy\xb0\x9ct\x15z\x05X\xff_\x16\x03q\xb6\f\xf4\xfajov}5j\x01\x00\x98\xb6y\r\x0f\x83\xbf\xf8\fEê\xdaS6E*Q)1=۶\xba\xee\xd6.2\x89q\xa1â%\xe8\v\xba-\x1dL\xaeu\xc8]W\xf2\xce\xe8k-\xf9~\xd4\x15\xc6\xf3\xc5\u0602c\x84\xf3,\nW<\xab*\x9c\x84\xb8\xfd\x9eN|C\xf3M\xb8\xc5\xe3\xde\xec?a\xec\x80\xd4q\x82\xd8{\xfc\x98Ԛ\xbdǎ\xeb\x03\bF\xc3:\x1c%\x1c\x04\x19\f@\x87G\xc1:\xa9\xfa\xebc\xac\xe4\x83}`'\x02\xe1\xa5\xe4\x16\xb2-űd\"Z`F\vyֵ\x16\xfbV?\a\x14\x81\xd0\x01\xd7\n\xc6S\x14@\x9fD\xdf!\x1b\xb9\xb5\faB\x84\x83$\xcbL\xb2\xd02\x94\x0f\b^\x82\xb1\xc2H)\x06\x04г'yS)6dy{\x04>=b,\xfbt\x1c\xe3r2^\x8e\x8fH\xdb\x05\x9a\xe9\x03\xe0\xe5`\xd6f\xed\x9ci\xa0V[\x89a\xd4cXa\x91\x12\xc0\xfd\x85v\x92Q\xfb\x11\x18\xab\x9e\xeb\xae5N\x01'.\xa9w\xfd\xb2\x87\x1d\x98\x87eɘ\x1f\xdfF\x96\xd3Y\xe3C~\x91\x91\x91q\x91B\xaa\x13\xec㓮\x91\x1c\x9d\x0ft\x9b\x12v\x9aB\x10X\xd96\xfd3Au嶎OI\n]\xc9\x1c\xf1\xc0\xf6Ii\xfeӦ=\"_\xcb\n\xfd\xcf\x13\x85\xff>r\x91\xff\x98\xb1\xef\xec\x97\xd1l6?\x89\xc3?\xb9\x1a\xb3%\x02\xd5D\xde3rg\"\x19EFn\xb3\x9e\xffpf. \u0605\xf3\x84\x9f\x04\xc6\xc5P\x17\xff\x1a\xc8\xf2,\xe4\x86h\xff\xc4\xe0]\x9cW\b\x98\xcd\xc5\n\x17y\xd5z0\xccW<\xd4\x15\x1a\x1e\xccT\xfc\x9fV\xaf;\xbf\xd4\xe7\xee˝l\xff\xff\xadkg1\xc1\xb9={.\u007f4~O\xe4̌\xa9\xe9_|\x81;\x96\x96\xd2\xfa\xf67\x0f\x9ek\xb61~Ԩ\x01\xf9\x15,\xb6\xe0U\xf8\xc2\x0f\xb4?\x81\xf0\xa6\xda\x01\x13m\xdf\x14\xa1-L\xd4ʀ\x96L\x93\xfb\a\ft\xc8uVQf\xf3\xaej\xed\x9fJ\x9a\x95\x13\xcc|\x1e\x9d\xdf\x10\x1a\xcex\xf5\xccwߕ\xecك\xca\xf6\x0fGuK\xa4\xa1\xfeWGQ\xda(\xa9S\xde=\xdc\xecq-`\x98\x1e\xdd<\x14\x02@\x86$\x97\xf43\xd0}\x11\xaf(\xa1g\xc0<;f\xe8\xa1\x16\xc8\xe30\x1e\x82\xd6\x00x\x8f\x10\xf5|t>\xd0=\x9d\rР\xf3\xfe\x01\xbe\x1c\x8d\xf2\xf5\u007f>H\xcf\x1a\xfd?G矋\xcdW\xfe\x89\xd7S\xeab!CK\x96\xf6\xfbf*(?\x83\xad\xa7:4\a\x96\xc3\x16\x10R\xdd1x\xd0Uc\xf0X\x83\xc1\xbb\x83\xefJxl\x14\xbd\xf8?\x82\xc1\xa3\xf3\xff\x82\xc1cH\xa6\x9b#B\xc03\xdf4\v\xfc\x97o\x9a\xe1\xe7|\xd3\xccKv\xff\xa6\x19\xf5\x8b\xd16\x94\x80\x12\x8c:\xdceԨM$WF\x99[ɂ/\x8d\xa8\xee\xbcݻӰL\x02QtXee\xf5\x17\a\xb1\fF\xee}j\x02\x88\xdfp,/\x1c\xd2\xfeϾ\xa6wYD\xa9J\x1c\xdbl\x16Q\x86\x8b\xba\xb2z\x1eЬ\xbb\x92\\M\x1c\xf3YaU\xca\xeb\xfa\x01\x12\xba\x98\x8f\x81N\xec\v$T\x87Oo\xdb\xe6\xf2\x19\x92\xf6\xe4?g\xef\xfe\x8d~\xb8q\x0f\x85\xe0\xf5\x85x\xb6\xf3{$x=\x11\x90\xe9\x9fT\xf6=\x12\x12\xc9l?\xff\xfe\x8d.\x11Dz^!\x1d\xb4A\rQ2\xf8k\x97h\xef\xf7\xf6\xa0\x9f\x14~\xceݓ\xd11v\xb7\x96\a\xfb}4w'?\xbd{\x19\x9c}λ\xfdd\u05fbc\x9e\u07bd\x1cN\xa2\xa6ϼ\xdbWt\xb9[~\xf2\xf4\xee\x91\xf0\x0f}\xb7\xc5\xed\xddF\xf1\x0f{(e\x9f\xb3\xa7+\x9e>\x91\x8f\xba\xa0V\xcf<\xe1+\xffa\x0f\xaazb*iþoC\x9f\xb0\x01\x8b>2\xd1\xd5\xff\xd5\xc6]CK\rDa\x00\xbe\xf3\xde\xee\xe0\xee\xee\xee\xee\xee\x1d\xee\xee\xee\xe9\x0f\x15\x1e\x16\xa7\xa2\xa5})\x91\xeeYI\x0554x\x87\xeb0\x99{ϟ\xc9f\xda=_\xee\xf9\xf7\x8e\xacN\xccwc\xf8..-\x16\xda\xc7Gq\xcf\xe8\xb7Z\xccIe#D\x17\x02:RW\x02\xba}N/\x86\x8e\xe9N@wԾn\x01}\x94\x1a\xac\xeeQ\xa5;g]0\xaf\xac\xbb\xe0Ҍ\xe3\xec\xe6\x11\xea\xe3\xef\x82IY\xd2\xd4\xd9\xe9\xbe\xc6\xd3\x11M\x83Ə\x17\x89fm\xde[\xcd\xd9Y\xc7fa\xa0vK\xcd\xfa\xa5ջ\\v\xd6G\xcd\xe9,;tk\x9b\xbd+g\xe7{Z\xb8\x192Yf\xc8o5\xbb\xd8w\x9e!|'\n7\xfb\xa6\xc8\xcc^\xabf\x8a\xc6=)\x92A-\xc3:R\xaf\x03zpNτ\x8e\xe9cHk_\x0f\x85\xae\xd0[5\xb7\xa0\x87\xf8\xb9\xf5_裪\x8f\xadݣJ\x8f\xb0}\x99\xc8}\xe1s\xf8nUΒg:\x06\xeb\f\a\xbf\x93\xae\x9c\xbd\xa0#\xf5\x04\x9a_\xd3S\xdd-\xa7\xa7C\xc7\xd4\x10\xa8\xddC{Z\xff\x86>J_\xb0*3\xdd\xcbf\x1f\xc2\xd9\xf9,\xb8K3O\xd2\\B}\xfca-i\xc3i\xf8\x94o\xf9\x9f\xd5\xcbd\xe5\xbd \x12\x8d\xaf^\x93ѭ\xc2:R\xfb\x03z\x8c\xaf5\x89\xd6\x14\x9f\fX\xe5W\xfe\x04[9Z*ر9ۈ\x14G\xe9!\x11\xf5\xa8\xd2\x13\u0557\xbaY\xd2\x13N\xb2\rWܠ\xafԦp\xc5X\xdb\xc5\xe9r\xc5\xf6\u007fK\xd3\x13\xb5\xf6\x8a\x15\xb2S-Hw*>\a\xea:\xb0J\xfaՈ\x0e\xe0\x1f\xeb\xc9\x00\xee@AGj}@\x0f\xf4\xb5&њ\xe2\x9d\x01\xab\xfcʍ\xa8|\x94\xe2\xac\a\xd0\xc3l\x0f\xc6\xcb>\xd5dݡr\xba\n\xae\xba\xeaK\xaf\x9b\xdcN\x92\xfa\xb2$\xb9GT3óQ\x1f\x93ۣR\xabٚ\xe7֎-\x1bgy\x8f\x1an\x8a\x95[*\xd6Ϭ^Vn\x80>j6ZݣJ\xb7Qأ\xf8\x1c\x97\x9b\x19kyf\xec)\x15\xb2t\xe3\xea|\xba\xca\xf5{\x9d\x8c\x8eM\x97{}Lu\xbfVa\x1d\xa9\x9d\x01\xdd\xdfךDk\x8a\x0f\al.\xc7'\xd8\xca\xfeR\xc1\x0e\xc8\xd9F\xa48J\x0f\xb2\x91\x84\x1eb;2\x96;\xc2gE\\\xee-\xf2,\x9b\x91\x1b\xff~H:s\ue08e\xd4Fh\x9c(I\xba\xf8Z\x93hM\xf1\xeeBe\xee6*7\xa2\xf2Q\xaadɡ{\xda\xe4\x8389\x9ffpYvH\x96>D\xb9\xbd\tɡ\x1bEk:\xba\x01\xd5\xddw\xe1\xa9\xeda\xab\x0fL\xab\xff\a\"\x880\x93\x00\x00x\x01MLJ\x81\x031\x10BQ\xdd\aF\xda\xfe\x1b\xbcR\x8c\xb3\xdfD\xd6Z\u007f\x9d\xff\xeb\xf2Z\x80&{\x90\x1c\xc0\xf9\x80.\x9f\xa9d\x86L\x1a^\xe9tcl%\xd5\r\xe1\xa4\xd4\xf2\xb6-4$\x13\xc6\xcd\xd9V$\xc5 {\xef\xed\x93IN\x8a\xebX\x9e\r\xe8\xc1J\xa9`^R\xd4|\xe4\a\x95\x0f\xfb\x06\x85\xcc\x04\xdf\x00\x01\x00\x00\x00\x02\x00\x000\x1bQ\xae_\x0f<\xf5\x00\x1b\b\x00\x00\x00\x00\x00\xc4\xf0\x11.\x00\x00\x00\x00\xd0\xdbN\x9a\xfa\x1b\xfd\xd5\t0\bs\x00\x00\x00\t\x00\x02\x00\x00\x00\x00\x00\x00x\x01c`d``\xcf\xf9\xc7\xc3\xc0\xc0\xe9\xf9K\xfa\x9f\x17\xa7\x01P\x04\x15\xdc\x05\x00p[\x05E\x00x\x01m\x92\x03\f&M\x10D\xdf\xce\xf4\xee\xf7۶m\xf3l۶m۶m۶m\x87g\xdbWg&y\x99v:\xd3\xe5[Q\b\x00 \xb8,\x84{\x91~\xae-\xcd\xec(U\xad\x0ee\xc2]\x14\xb7\x8b\x14\x0e\nS\xd4͢\xb1[\xc6\x17\xbe\x02\xefYs\xd2\x04\x1dx\xdf\xfd\xce\xe7\xee]\xda\xf9T\xbc\xa2\xfa\x8ab\x84\xc8-\xf2\x88\xdfE\x0f\xd1H\xa4\x16\xe5D\xa1\xe0\x04M\x82\xf1|m/\x93\xcc\n\xd1\xcd~\xa0\x89_J\xca؏\x94\b\xff\xd2\xec\xcb\f\x0f\u007f\xa7j\x18\x97\xe1\xd6J\x94\x92_\x91\x1a\xe1$\x86\xbb\xef\x99j%\xf8=4\xc5\xd30<\xba\xa2\xdc$Q\x8f*\xe1s\xb7\xde\xd2\xda}\x98\xcd%\x9d-\xe1\xe7\xf0'Z\x85o\xf2^\xecm\xfe\x0f\x8d\xbfm\r/\xda\n\xb2\xb8\x0f\xe9\xe0\x93\xf1\x95ާ}6\xe2\xf9^\x98\xab\xae|\x0e\xf5צ\x95\xfdD.kH^\xfb\x9f\xdcn)\xff)\x96ϊ\xd1*8I\xeb\xe0\xe0\xf5\xb9\xf6\x82ޓ\xf4\x8ayZZ\tշ#签V\xe4u\x93\xf5~\xa4\xb77O[q\x9a\xf9}|\x1cy\xbe\xf5\xe7\xf9\xda/\xe7\r\xbd\xd9T\x13/8\xcdX\xbd\xaf\x86\xe5i(\xbb\xa5壸\r!g8I\xef6>\f\x0e\xd3\xd1\x0e\x90C\xfb\x15\x89\x92\x93\xd3w\xa4\xa3\x9fO\x11+C\xdd(\x85\xe2#\xa8\xe6\xae\xd2\xc0\x92\x90\xdf\x1d'\x81\x88\xe3\x1aPӚ\xd1\xc3\x1f$\xa1{\x83\x8e\xbai%\xc5k\xf8\x81b\x1eEt\xcf\xcc\xd1喇\xfe\xa6\xacvI\x14\xabq\xfd\x94%\"\xfb\xcd\xff\xb3\x19\f\xb1\x05\xb4\x8c\xe6\x93\xc6\xc6Q\xc7ړT\xb3rZ/:\a\x97\xe8\x19\xebO\xb1X\"\xf2\xfbE\fw\xa3\xa9\xee\x97P3\x8cǀ(.\xed\x82\xee\xe4\x13?\x05]\xf9\xccm\xa2\x98\xdb\xc9\u007fn\xbe\xec\t\xb4pE(%\xb2k\x87\u007f\xb5\xcb\x1f\xd2@^\xeb\xa0\x1b\x95\xe1Ck\xa9:\xedwo\u007f\xe5o\xe9P\xba\ns\v\xe9\xe1\x89H\x1f&m<\x88\xfb\xfe\xfa>\xe9c\x9cރb\xcb=]<\x8a4\xf1 \xb74\xa1\xbb?\x11\xe9\xc0\xa4\x81\a\t.]_\x12\\\xa2\x8b\u07b5bֽ\xfb?\x8an\xff 7o\xcf\x1b7\x00\x1c\x98\xd7\xf8\x00\x00\x00\x00\x00\x00a\x00a\x00a\x00a\x00a\x00\x93\x00\xb8\x018\x01\xaa\x02:\x02\xcd\x02\xe4\x03\x0e\x038\x03k\x03\x90\x03\xaf\x03\xc5\x03\xe6\x03\xfd\x04J\x04x\x04\xc7\x05<\x05\u007f\x05\xdf\x06>\x06k\x06\xdf\aF\a[\ap\a\x8f\a\xb6\a\xd5\b3\b\xd6\t\x15\tt\t\xc8\n\r\nM\n\x83\n\xeb\v-\vH\v{\v\xd0\v\xf4\fB\f~\f\xd3\r\x1e\r\x83\r\xdf\x0eJ\x0et\x0e\xb6\x0e\xe6\x0f;\x0f\x90\x0f\xc0\x0f\xf8\x10\x1c\x103\x10X\x10\u007f\x10\x9a\x10\xba\x112\x11\x90\x11\xe3\x12A\x12\xa8\x12\xfa\x13t\x13\xb9\x13\xf1\x14=\x14\x94\x14\xaf\x15\x1a\x15e\x15\xb3\x16\x17\x16x\x16\xb5\x17\x1f\x17q\x17\xb8\x17\xe8\x186\x18}\x18\xc2\x18\xfa\x19;\x19R\x19\x92\x19\xd9\x1a\f\x1ah\x1a\xda\x1b=\x1b\x9c\x1b\xbb\x1c`\x1c\x8f\x1d5\x1d\xa3\x1d\xaf\x1d\xcc\x1e\x84\x1e\x9a\x1e\xd6\x1f\x19\x1fi\x1f\xe4 \x04 M y \x98 \xd3!\x05!O![!u!\x8f!\xa9\"\n\"m\"\xab#&#z#\xea$\xa8%\x17%h%\xd9&8&S&\xd6'p'\x9e'\xd7(\x1b(%(/(S(w(\x99(\xa5(\xb1(\xe9)\f)()E)X)l)\xe8*\x03*k*\xbd*\xe8+7+\xa6+\xe8+\xe8+\xf0,V,m,\x84,\x9b,\xb2,\xcb,\xe4,\xf0-\a-\x1e-5-N-e-|-\x93-\xac-\xc3-\xda-\xf1.\b.\x1f.8.O.f.}.\x96.\xad.\xc4.\xdb.\xf1/\a/ /9/E/\\/s/\x89/\xa2/\xb8/\xce/\xe5/\xfe0\x140+0B0X0n0\x870\x9e0\xb50\xcb0\xe40\xfb1\x13\x00\x00\x00\x01\x00\x00\x00\xde\x00\x8f\x00\x16\x00T\x00\x05\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x00\x02\x00\x02\x14\x00\x06\x00\x01x\x01]\x8e3{\x03\x00\x18\x84\xdf\xda\xdd\xeb\xeee0%[l{\x8am\xfe\xfd\\\x8c\xe73\xef\x80+r\x9cqr~\xc3\t\xf7\xb0\xceOyT\xb5\xca\xcf\xf6\xfa\xe7{\xf9\x05\xdf<\xaf\xf3K^q\xad\xf3G\x12\x14\x89ѓ\xef1\x96ŨPcB\x9b\x02CRT\xe4G44\xe9\xf2\x89\x91_\xfe%\x06\x89Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x04\x02\x00\x11\x129\xb2\x05\x02\x00\x11\x129\xb2\a\x02\x00\x11\x129\xb2\b\x02\x00\x11\x129\xb1\n\f\xf4\xb2\f\x02\x00\x11\x129\xb2\r\x02\x00\x11\x129\xb0\x02\x10\xb1\x0e\f\xf401!!\x11!\x03\x11\x01\x01\x11\x01\x03!\x015\x01!\x03(\xfd<\x02\xc46\xfe\xee\xfe\xba\x01\f\xe4\x02\x03\xfe\xfe\x01\x02\xfd\xfd\x05\xb0\xfa\xa4\x05\a\xfd}\x02w\xfb\x11\x02x\xfd^\x02^\x88\x02^\x00\x02\x00\xa0\xff\xf5\x01{\x05\xb0\x00\x03\x00\f\x00/\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x10>Y\xb2\x06\x05\n+X!\xd8\x1b\xf4Y\xb2\x01\x06\x02\x11\x12901\x01#\x033\x03462\x16\x14\x06\"&\x01[\xa7\r\xc2\xc97l88l7\x01\x9b\x04\x15\xfa\xad-==Z;;\x00\x02\x00\x88\x04\x12\x02#\x06\x00\x00\x04\x00\t\x00\x19\x00\xb0\x03/\xb2\x02\n\x03\x11\x129\xb0\x02/\xb0\aа\x03\x10\xb0\b\xd001\x01\x03#\x133\x05\x03#\x133\x01\x15\x1eo\x01\x8c\x01\x0e\x1eo\x01\x8c\x05x\xfe\x9a\x01\xee\x88\xfe\x9a\x01\xee\x00\x02\x00w\x00\x00\x04\xd3\x05\xb0\x00\x1b\x00\x1f\x00\x8f\x00\xb0\x00EX\xb0\f/\x1b\xb1\f\x1c>Y\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x00EX\xb0\x1a/\x1b\xb1\x1a\x10>Y\xb2\x1d\f\x02\x11\x129|\xb0\x1d/\x18\xb2\x00\x03\n+X!\xd8\x1b\xf4Y\xb0\x04а\x1d\x10\xb0\x06а\x1d\x10\xb0\vа\v/\xb2\b\x03\n+X!\xd8\x1b\xf4Y\xb0\v\x10\xb0\x0eа\v\x10\xb0\x12а\b\x10\xb0\x14а\x1d\x10\xb0\x16а\x00\x10\xb0\x18а\b\x10\xb0\x1e\xd001\x01!\x03#\x13#5!\x13!5!\x133\x03!\x133\x033\x15#\x033\x15#\x03#\x03!\x13!\x02\xfd\xfe\xf8P\x8fP\xef\x01\tE\xfe\xfe\x01\x1dR\x8fR\x01\bR\x90R\xcc\xe7E\xe1\xfbP\x90\x9e\x01\bE\xfe\xf8\x01\x9a\xfef\x01\x9a\x89\x01b\x8b\x01\xa0\xfe`\x01\xa0\xfe`\x8b\xfe\x9e\x89\xfef\x02#\x01b\x00\x00\x01\x00n\xff0\x04\x11\x06\x9c\x00+\x00f\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x1c>Y\xb0\x00EX\xb0\"/\x1b\xb1\"\x10>Y\xb2\x02\"\t\x11\x129\xb0\t\x10\xb0\fа\t\x10\xb0\x10а\t\x10\xb2\x13\x01\n+X!\xd8\x1b\xf4Y\xb0\x02\x10\xb2\x19\x01\n+X!\xd8\x1b\xf4Y\xb0\"\x10\xb0\x1fа\"\x10\xb0&а\"\x10\xb2)\x01\n+X!\xd8\x1b\xf4Y01\x014&'&&546753\x15\x16\x16\x15#4&#\"\x06\x15\x14\x16\x04\x16\x16\x15\x14\x06\a\x15#5&&53\x14\x16326\x03X\x81\x99\xd5ÿ\xa7\x95\xa8\xbb\xb8\x86rw~\x85\x011\xabQ˷\x94\xbaӹ\x92\x86\x83\x96\x01w\\~3Aѡ\xa4\xd2\x14\xdb\xdc\x17\xec͍\xa6{nfycw\x9ej\xa9\xce\x13\xbf\xbf\x11\xe7Ƌ\x96~\x00\x05\x00i\xff\xeb\x05\x83\x05\xc5\x00\r\x00\x1a\x00&\x004\x008\x00x\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb0\x00EX\xb0#/\x1b\xb1#\x10>Y\xb0\x03\x10\xb0\nа\n/\xb2\x11\x04\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x04\n+X!\xd8\x1b\xf4Y\xb0#\x10\xb0\x1dа\x1d/\xb0#\x10\xb2*\x04\n+X!\xd8\x1b\xf4Y\xb0\x1d\x10\xb21\x04\n+X!\xd8\x1b\xf4Y\xb25#\x03\x11\x129\xb05/\xb27\x03#\x11\x129\xb07/01\x134632\x16\x15\x15\x14\x06#\"&5\x17\x14\x16326554&\"\x06\x15\x0146 \x16\x15\x15\x14\x06 &5\x17\x14\x16326554&#\"\x06\x15\x05'\x01\x17i\xa7\x83\x85\xa5\xa7\x81\x82\xaa\x8aXJGWV\x94V\x02;\xa7\x01\x06\xa8\xa7\xfe\xfc\xaa\x8aXJHVWIGY\xfe\ai\x02\xc7i\x04\x98\x83\xaa\xab\x88G\x84\xa7\xa7\x8b\aNebUINffR\xfcу\xa9\xa8\x8bG\x83\xa9\xa7\x8b\x06OecUJOdcT\xf3B\x04rB\x00\x03\x00e\xff\xec\x04\xf3\x05\xc4\x00\x1e\x00'\x003\x00\x85\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x1c>Y\xb0\x00EX\xb0\x1c/\x1b\xb1\x1c\x10>Y\xb0\x00EX\xb0\x18/\x1b\xb1\x18\x10>Y\xb2\"\x1c\t\x11\x129\xb2*\t\x1c\x11\x129\xb2\x03\"*\x11\x129\xb2\x10*\"\x11\x129\xb2\x11\t\x1c\x11\x129\xb2\x13\x1c\t\x11\x129\xb2\x19\x1c\t\x11\x129\xb2\x16\x11\x19\x11\x129\xb0\x1c\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y\xb2!\x1f\x11\x11\x129\xb0\t\x10\xb21\x01\n+X!\xd8\x1b\xf4Y01\x13467&&54632\x16\x15\x14\x06\a\a\x01653\x14\a\x17#'\x06\x06#\"$\x0527\x01\a\x06\x15\x14\x16\x03\x14\x1776654&#\"\x06eu\xa5aBĨ\x96\xc4Yok\x01DD\xa7{\xd0\xdeaJ\xc7g\xd5\xfe\xfe\x01דz\xfe\x9d!\xa7\x99\"vvD2dLR`\x01\x87i\xb0uv\x90G\xa6\xbc\xaf\x85X\x95RO\xfe}\x82\x9f\xff\xa8\xf9sBE\xe2Kp\x01\xa9\x18{\x82v\x8e\x03\xe5`\x90S0W>CYo\x00\x01\x00g\x04!\x00\xfd\x06\x00\x00\x04\x00\x10\x00\xb0\x03/\xb2\x02\x05\x03\x11\x129\xb0\x02/01\x13\x03#\x133\xfd\x15\x81\x01\x95\x05\x91\xfe\x90\x01\xdf\x00\x01\x00\x85\xfe*\x02\x95\x06k\x00\x11\x00\t\x00\xb0\x0e/\xb0\x04/01\x134\x12\x127\x17\x06\x02\x03\a\x10\x13\x16\x17\a&'\x02\x85y\xf0\x81&\x92\xbb\t\x01\x8dUu&\x85y\xec\x02O\xe2\x01\xa0\x01TFzp\xfe4\xfe\xe3U\xfe~\xfe\xe4\xaa`qJ\xae\x01T\x00\x00\x01\x00&\xfe*\x027\x06k\x00\x11\x00\t\x00\xb0\x0e/\xb0\x04/01\x01\x14\x02\x02\a'6\x12\x1354\x02\x02'7\x16\x12\x12\x027u\xf1\x84'\x9a\xbb\x02X\x9db'\x84\xefw\x02E\xdf\xfeg\xfe\xa6Iqv\x01\xf1\x01/ \xd2\x01i\x01\x1ePqI\xfe\xaa\xfed\x00\x01\x00\x1c\x02a\x03U\x05\xb0\x00\x0e\x00 \x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb0\x00\xd0\x19\xb0\x00/\x18\xb0\t\xd0\x19\xb0\t/\x1801\x01%7\x05\x033\x03%\x17\x05\x13\a\x03\x03'\x01J\xfe\xd2.\x01.\t\x99\n\x01).\xfe\xcd\xc6|\xba\xb4}\x03\xd7Z\x97p\x01X\xfe\xa3n\x98[\xfe\xf1^\x01 \xfe\xe7[\x00\x00\x01\x00N\x00\x92\x044\x04\xb6\x00\v\x00\x1a\x00\xb0\t/\xb0\x00а\t\x10\xb2\x06\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\xd001\x01!\x15!\x11#\x11!5!\x113\x02\x9e\x01\x96\xfej\xba\xfej\x01\x96\xba\x03\r\xaf\xfe4\x01̯\x01\xa9\x00\x01\x00\x1d\xfe\xde\x014\x00\xdb\x00\b\x00\x17\x00\xb0\t/\xb2\x04\x05\n+X!\xd8\x1b\xf4Y\xb0\x00а\x00/01\x13'6753\x15\x14\x06\x86i^\x04\xb5c\xfe\xdeH\x83\x8b\xa7\x91e\xca\x00\x00\x01\x00%\x02\x1f\x02\r\x02\xb6\x00\x03\x00\x11\x00\xb0\x02/\xb2\x01\x01\n+X!\xd8\x1b\xf4Y01\x01!5!\x02\r\xfe\x18\x01\xe8\x02\x1f\x97\x00\x01\x00\x90\xff\xf5\x01v\x00\xd1\x00\t\x00\x1b\x00\xb0\x00EX\xb0\a/\x1b\xb1\a\x10>Y\xb2\x02\x05\n+X!\xd8\x1b\xf4Y017462\x16\x15\x14\x06\"&\x909r;;r9a0@@0.>>\x00\x01\x00\x12\xff\x83\x03\x10\x05\xb0\x00\x03\x00\x13\x00\xb0\x00/\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y01\x17#\x013\xb1\x9f\x02`\x9e}\x06-\x00\x00\x02\x00s\xff\xec\x04\n\x05\xc4\x00\r\x00\x1b\x009\x00\xb0\x00EX\xb0\n/\x1b\xb1\n\x1c>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb0\n\x10\xb2\x11\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y01\x01\x10\x02#\"\x02\x035\x10\x1232\x12\x13'4&#\"\x06\a\x11\x14\x163267\x04\n\xde\xec\xe9\xe0\x04\xde\xed\xeb\xde\x03\xb9\x84\x8f\x8e\x82\x02\x89\x8b\x89\x85\x03\x02m\xfe\xbb\xfe\xc4\x015\x013\xf7\x01A\x018\xfe\xd3\xfe\xc6\r\xeb\xd7\xd6\xde\xfe\xd8\xec\xe1\xd4\xe4\x00\x01\x00\xaa\x00\x00\x02\xd9\x05\xb7\x00\x06\x009\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x04\x00\x05\x11\x129\xb0\x04/\xb2\x03\x01\n+X!\xd8\x1b\xf4Y\xb2\x02\x03\x05\x11\x12901!#\x11\x055%3\x02ٺ\xfe\x8b\x02\x12\x1d\x04щ\xa8\xc7\x00\x00\x01\x00]\x00\x00\x043\x05\xc4\x00\x17\x00M\x00\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x17\x01\n+X!\xd8\x1b\xf4Y\xb0\x02в\x03\x10\x17\x11\x129\xb0\x10\x10\xb2\t\x01\n+X!\xd8\x1b\xf4Y\xb0\x10\x10\xb0\fв\x15\x17\x10\x11\x12901!!5\x016654&#\"\x06\x15#4$32\x16\x15\x14\x01\x01!\x043\xfcF\x01\xf8pU\x8as\x8a\x99\xb9\x01\x03\xd9\xcb\xec\xfe\xee\xfez\x02ۅ\x020\u007f\x9fUr\x92\x9d\x8c\xc9\xf8ձ\xd7\xfe\xd7\xfeY\x00\x01\x00^\xff\xec\x03\xf9\x05\xc4\x00&\x00x\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb0\x00EX\xb0\x19/\x1b\xb1\x19\x10>Y\xb2\x00\r\x19\x11\x129\xb0\x00/\xb2\xcf\x00\x01]\xb2\x9f\x00\x01q\xb2/\x00\x01]\xb2_\x00\x01r\xb0\r\x10\xb2\x06\x01\n+X!\xd8\x1b\xf4Y\xb0\r\x10\xb0\tа\x00\x10\xb2&\x01\n+X!\xd8\x1b\xf4Y\xb2\x13&\x00\x11\x129\xb0\x19\x10\xb0\x1cа\x19\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y01\x013665\x10#\"\x06\x15#4632\x16\x15\x14\x06\a\x16\x16\x15\x14\x04 $53\x14\x1632654&'#\x01\x86\x8b\x83\x96\xffx\x8f\xb9\xfd\xc3\xce\xea{jx\x83\xff\x00\xfef\xfe\xff\xba\x96~\x86\x8e\x9c\x93\x8b\x032\x02\x86r\x01\x00\x89q\xad\xe5\xda\xc2_\xb2,&\xb0\u007f\xc4\xe6\u07b6s\x8a\x8c\x83\u007f\x88\x02\x00\x02\x005\x00\x00\x04P\x05\xb0\x00\n\x00\x0e\x00I\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb2\x01\t\x04\x11\x129\xb0\x01/\xb2\x02\x01\n+X!\xd8\x1b\xf4Y\xb0\x06а\x01\x10\xb0\vв\b\x06\v\x11\x129\xb2\r\t\x04\x11\x12901\x013\x15#\x11#\x11!5\x013\x01!\x11\a\x03\x86\xcaʺ\xfdi\x02\x8c\xc5\xfd\x81\x01\xc5\x16\x01\xe9\x97\xfe\xae\x01Rm\x03\xf1\xfc9\x02\xca(\x00\x01\x00\x9a\xff\xec\x04-\x05\xb0\x00\x1d\x00a\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\r/\x1b\xb1\r\x10>Y\xb0\x01\x10\xb2\x04\x01\n+X!\xd8\x1b\xf4Y\xb2\a\r\x01\x11\x129\xb0\a/\xb2\x1a\x01\n+X!\xd8\x1b\xf4Y\xb2\x05\a\x1a\x11\x129\xb0\r\x10\xb0\x11а\r\x10\xb2\x14\x01\n+X!\xd8\x1b\xf4Y\xb0\a\x10\xb0\x1d\xd001\x13\x13!\x15!\x03632\x12\x15\x14\x02#\"&'3\x16\x1632654&#\"\a\a\xceJ\x02\xea\xfd\xb3,k\x88\xc7\xea\xf3\xda\xc1\xf4\x11\xaf\x11\x90v\x81\x93\x9f\x84yE1\x02\xda\x02֫\xfes?\xfe\xf9\xe0\xe1\xfe\xfdֽ}\u007f\xb0\x9b\x92\xb15(\x00\x02\x00\x84\xff\xec\x04\x1c\x05\xb1\x00\x14\x00!\x00N\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1c>Y\xb0\x00EX\xb0\r/\x1b\xb1\r\x10>Y\xb0\x00\x10\xb2\x01\x01\n+X!\xd8\x1b\xf4Y\xb2\a\r\x00\x11\x129\xb0\a/\xb2\x15\x01\n+X!\xd8\x1b\xf4Y\xb0\r\x10\xb2\x1c\x01\n+X!\xd8\x1b\xf4Y01\x01\x15#\x06\x04\a632\x12\x15\x14\x02#\"\x0055\x10\x00%\x03\"\x06\a\x15\x14\x1632654&\x03O\"\xd8\xff\x00\x14sǾ\xe3\xf5\xce\xd1\xfe\xfc\x01W\x01S\xd2_\xa0\x1f\xa2y}\x8f\x91\x05\xb1\x9d\x04\xf8\xe1\x84\xfe\xf4\xd4\xe1\xfe\xf2\x01A\xfdG\x01\x92\x01\xa9\x05\xfdprVD\xb4ܸ\x95\x96\xb9\x00\x01\x00M\x00\x00\x04%\x05\xb0\x00\x06\x002\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x10>Y\xb0\x05\x10\xb2\x03\x01\n+X!\xd8\x1b\xf4Y\xb2\x00\x03\x05\x11\x12901\x01\x01#\x01!5!\x04%\xfd\xa5\xc2\x02Y\xfc\xec\x03\xd8\x05H\xfa\xb8\x05\x18\x98\x00\x00\x03\x00p\xff\xec\x04\x0e\x05\xc4\x00\x17\x00!\x00+\x00a\x00\xb0\x00EX\xb0\x15/\x1b\xb1\x15\x1c>Y\xb0\x00EX\xb0\t/\x1b\xb1\t\x10>Y\xb2'\t\x15\x11\x129\xb0'/\xb2\xcf'\x01]\xb2\x1a\x01\n+X!\xd8\x1b\xf4Y\xb2\x03\x1a'\x11\x129\xb2\x0f'\x1a\x11\x129\xb0\t\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y\xb0\x15\x10\xb2\"\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x06\a\x16\x16\x15\x14\x06#\"&5467&&54632\x16\x034&\"\x06\x14\x16326\x01\"\x06\x15\x14\x16264&\x03\xecsbr\x85\xff\xd0\xd2\xfd\x81rap\xec\xc1\xc0헛\xfa\x97\x93\x83\x82\x94\xfe\xeam\x87\x85ޅ\x8a\x044m\xaa01\xbcw\xbd\xe0\xe1\xbcv\xbe10\xaal\xb8\xd8\xd8\xfc\xa1z\x9a\x98\xf8\x8e\x8f\x04\x1a\x87to\x89\x89ތ\x00\x00\x02\x00d\xff\xff\x03\xf8\x05\xc4\x00\x17\x00$\x00X\x00\xb0\x00EX\xb0\v/\x1b\xb1\v\x1c>Y\xb0\x00EX\xb0\x13/\x1b\xb1\x13\x10>Y\xb2\x03\x13\v\x11\x129\xb0\x03/\xb2\x00\x03\v\x11\x129\xb0\x13\x10\xb2\x14\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y\xb0\v\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y01\x01\x06\x06#\"&&546632\x12\x11\x15\x10\x00\x05#5366%26754&#\"\x06\x15\x14\x16\x03>:\xa1`~\xbbfö\xd8\xf9\xfe\xb0\xfe\xad$'\xe5\xf6\xfe\xee]\x9d$\x9eyz\x94\x8f\x02\x80ET|ሒ\xea|\xfe\xbd\xfe\xe96\xfeW\xfey\x05\x9c\x04\xe7\xfarTJ\xb6仙\x95\xc1\x00\xff\xff\x00\x86\xff\xf5\x01m\x04D\x00&\x00\x12\xf6\x00\x01\a\x00\x12\xff\xf7\x03s\x00\x10\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x18>Y01\xff\xff\x00)\xfe\xde\x01U\x04D\x00'\x00\x12\xff\xdf\x03s\x01\x06\x00\x10\f\x00\x00\x10\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y01\x00\x01\x00H\x00\xc3\x03z\x04J\x00\x06\x00\x16\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x18>Y\xb0\x02а\x02/01\x01\x05\x15\x015\x01\x15\x01\b\x02r\xfc\xce\x032\x02\x84\xfd\xc4\x01{\x92\x01z\xc4\x00\x00\x02\x00\x98\x01\x8f\x03\xda\x03\xcf\x00\x03\x00\a\x00%\x00\xb0\a/\xb0\x03а\x03/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\a\x10\xb2\x04\x01\n+X!\xd8\x1b\xf4Y01\x01!5!\x11!5!\x03\xda\xfc\xbe\x03B\xfc\xbe\x03B\x03.\xa1\xfd\xc0\xa0\x00\x00\x01\x00\x86\x00\xc4\x03\xdc\x04K\x00\x06\x00\x16\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb0\x05а\x05/01\x01\x015\x01\x15\x015\x03\x1b\xfdk\x03V\xfc\xaa\x02\x8a\x01\x03\xbe\xfe\x86\x92\xfe\x85\xc0\x00\x02\x00K\xff\xf5\x03v\x05\xc4\x00\x18\x00!\x00Q\x00\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x1c>Y\xb0\x00EX\xb0 /\x1b\xb1 \x10>Y\xb2\x1b\x05\n+X!\xd8\x1b\xf4Y\xb2\x00\x1b\x10\x11\x129\xb2\x04\x10\x00\x11\x129\xb0\x10\x10\xb2\t\x01\n+X!\xd8\x1b\xf4Y\xb0\x10\x10\xb0\fв\x15\x00\x10\x11\x12901\x016677654&#\"\x06\x15#6632\x16\x15\x14\a\a\x06\x15\x03462\x16\x14\x06\"&\x01e\x022M\x83Tnif|\xb9\x02㶽ӢmI\xc17l88l7\x01\x9aw\x8aT\x87_miwl[\xa2\xc7˱\xaf\xaalQ\x98\xfe\xc3-==Z;;\x00\x00\x02\x00j\xfe;\x06\xd6\x05\x97\x005\x00B\x00h\x00\xb02/\xb0\x00EX\xb0\b/\x1b\xb1\b\x10>Y\xb0\x03в\x0f2\b\x11\x129\xb0\x0f/\xb2\x05\b\x0f\x11\x129\xb0\b\x10\xb29\x02\n+X!\xd8\x1b\xf4Y\xb0\x15а2\x10\xb2\x1b\x02\n+X!\xd8\x1b\xf4Y\xb0\b\x10\xb0*а*/\xb2#\x02\n+X!\xd8\x1b\xf4Y\xb0\x0f\x10\xb2@\x02\n+X!\xd8\x1b\xf4Y01\x01\x06\x02#\"'\x06\x06#\"&76\x12632\x16\x17\x03\x063267\x12\x00!\"\x04\x02\a\x06\x12\x043267\x17\x06\x06#\"$\x02\x13\x12\x12$32\x04\x12\x01\x06\x1632677\x13&#\"\x06\x06\xca\fص\xbb56\x8bJ\x8e\x92\x13\x0fy\xbfiQ\x80P4\x13\x93q\x8c\x06\x13\xfe\xb9\xfe\xb2\xc9\xfeȴ\v\f\x90\x01'\xd1Z\xb5<%>\xcdi\xfa\xfe\x98\xb3\f\f\xde\x01|\xef\xf9\x01d\xae\xfb\xf2\x0eQXY\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x10>Y\xb2\t\x04\x02\x11\x129\xb0\t/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb2\n\x04\x02\x11\x12901\x01!\x03#\x013\x01#\x01!\x03\x03\xcd\xfd\x9e\x89\xc6\x02,\xa8\x02-\xc5\xfdM\x01\xef\xf8\x01|\xfe\x84\x05\xb0\xfaP\x02\x1a\x02\xa9\x00\x03\x00\xa9\x00\x00\x04\x88\x05\xb0\x00\x0e\x00\x16\x00\x1f\x00U\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x17\x00\x01\x11\x129\xb0\x17/\xb2\x0f\x01\n+X!\xd8\x1b\xf4Y\xb2\b\x0f\x17\x11\x129\xb0\x00\x10\xb2\x10\x01\n+X!\xd8\x1b\xf4Y\xb0\x01\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y013\x11!2\x16\x15\x14\x06\a\x16\x16\x15\x14\x06#\x01\x11!265\x10!%!2654&#!\xa9\x01\xdc\xed\xeftdv\x89\xfe\xe8\xfe\xc7\x01=\x86\x9b\xfe\xe2\xfe\xc0\x01\"~\x97\x8c\x8f\xfe\xe4\x05\xb0\xc4\xc0f\x9d+!\xb9\x80\xc4\xe0\x02\xa9\xfd\xf4\x8bz\x01\a\x9a~lxm\x00\x00\x01\x00w\xff\xec\x04\xd8\x05\xc4\x00\x1c\x00E\x00\xb0\x00EX\xb0\v/\x1b\xb1\v\x1c>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb0\v\x10\xb0\x0fа\v\x10\xb2\x12\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x19\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb0\x1c\xd001\x01\x06\x04# \x00\x1154\x12$32\x00\x17#&&#\"\x02\x15\x15\x14\x123267\x04\xd8\x1b\xfe\xe1\xee\xfe\xfe\xfeɑ\x01\n\xaf\xe8\x01\x18\x17\xc1\x19\xa7\x96\xb8\xd1Ʋ\xa0\xab\x1c\x01\xce\xe7\xfb\x01r\x016\x8c\xcb\x014\xa5\xfe\xfd宜\xfe\xf0\xfb\x8d\xed\xfe葴\x00\x02\x00\xa9\x00\x00\x04\xc6\x05\xb0\x00\v\x00\x15\x009\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x01\x10\xb2\f\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb2\r\x01\n+X!\xd8\x1b\xf4Y013\x11!2\x04\x12\x17\x15\x14\x02\x04\a\x03\x1132\x12554\x02'\xa9\x01\x9b\xbe\x01$\x9f\x01\x9f\xfe\xd9\xc4\xd3\xca\xde\xf7\xe9\xd6\x05\xb0\xa8\xfe\xca\xc9]\xce\xfeʦ\x02\x05\x12\xfb\x8b\x01\x14\xffU\xf8\x01\x13\x02\x00\x00\x01\x00\xa9\x00\x00\x04F\x05\xb0\x00\v\x00N\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb2\v\x04\x06\x11\x129\xb0\v/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\x10\xb2\x02\x01\n+X!\xd8\x1b\xf4Y\xb0\x06\x10\xb2\b\x01\n+X!\xd8\x1b\xf4Y01\x01!\x11!\x15!\x11!\x15!\x11!\x03\xe0\xfd\x89\x02\xdd\xfcc\x03\x93\xfd-\x02w\x02\xa1\xfd\xfc\x9d\x05\xb0\x9e\xfe,\x00\x01\x00\xa9\x00\x00\x04/\x05\xb0\x00\t\x00@\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb2\t\x02\x04\x11\x129\xb0\t/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\x10\xb2\x06\x01\n+X!\xd8\x1b\xf4Y01\x01!\x11#\x11!\x15!\x11!\x03\xcc\xfd\x9d\xc0\x03\x86\xfd:\x02c\x02\x83\xfd}\x05\xb0\x9e\xfe\x0e\x00\x01\x00z\xff\xec\x04\xdc\x05\xc4\x00\x1f\x00b\x00\xb0\x00EX\xb0\v/\x1b\xb1\v\x1c>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb0\v\x10\xb0\x0fа\v\x10\xb2\x11\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y\xb2\x1e\x03\v\x11\x129\xb0\x1e/\xb4\x0f\x1e\x1f\x1e\x02]\xb4?\x1eO\x1e\x02]\xb2\x1d\x01\n+X!\xd8\x1b\xf4Y01%\x06\x04#\"$\x02'5\x10\x00!2\x04\x17#\x02!\"\x02\x03\x15\x14\x123267\x11!5!\x04\xdcJ\xfe\xf7\xb0\xb2\xfe\xec\x97\x02\x013\x01\x16\xe4\x01\x16\x1f\xc06\xfe\xde\xc1\xc7\x01\xe0\xbfl\xa25\xfe\xaf\x02\x10\xbfji\xa7\x014\xcb\u007f\x01I\x01j\xe9\xd6\x01!\xfe\xf1\xfe\xffw\xf5\xfe\xdf09\x01G\x9c\x00\x01\x00\xa9\x00\x00\x05\b\x05\xb0\x00\v\x00U\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb0\x00EX\xb0\n/\x1b\xb1\n\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb0\x00\x10\xb0\tа\t/\xb2\x9f\t\x01r\xb2/\t\x01]\xb2\x02\x01\n+X!\xd8\x1b\xf4Y01!#\x11!\x11#\x113\x11!\x113\x05\b\xc1\xfd\"\xc0\xc0\x02\xde\xc1\x02\xa1\xfd_\x05\xb0\xfd\x8e\x02r\x00\x00\x01\x00\xb7\x00\x00\x01w\x05\xb0\x00\x03\x00\x1d\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y01!#\x113\x01w\xc0\xc0\x05\xb0\x00\x00\x01\x005\xff\xec\x03\xcc\x05\xb0\x00\x0f\x00.\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1c>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x10>Y\xb0\tа\x05\x10\xb2\f\x01\n+X!\xd8\x1b\xf4Y01\x013\x11\x14\x06#\"&53\x14\x163267\x03\v\xc1\xfb\xd1\xd9\xf2\xc0\x89\x82w\x93\x01\x05\xb0\xfb\xf9\xd1\xec\xde\xc8}\x8c\x96\x87\x00\x00\x01\x00\xa9\x00\x00\x05\x05\x05\xb0\x00\v\x00t\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\a/\x1b\xb1\a\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x10>Y\xb2\x00\x02\x05\x11\x129@\x11J\x00Z\x00j\x00z\x00\x8a\x00\x9a\x00\xaa\x00\xba\x00\b]\xb29\x00\x01]\xb2\x06\x05\x02\x11\x129@\x136\x06F\x06V\x06f\x06v\x06\x86\x06\x96\x06\xa6\x06\xb6\x06\t]01\x01\a\x11#\x113\x11\x013\x01\x01#\x02\x1b\xb2\xc0\xc0\x02\x87\xe8\xfd\xc3\x02j\xe6\x02\xa5\xb9\xfe\x14\x05\xb0\xfd0\x02\xd0\xfd}\xfc\xd3\x00\x01\x00\xa9\x00\x00\x04\x1c\x05\xb0\x00\x05\x00(\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb2\x00\x01\n+X!\xd8\x1b\xf4Y01%!\x15!\x113\x01j\x02\xb2\xfc\x8d\xc1\x9d\x9d\x05\xb0\x00\x00\x01\x00\xa9\x00\x00\x06R\x05\xb0\x00\x0e\x00Y\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x10>Y\xb0\x00EX\xb0\f/\x1b\xb1\f\x10>Y\xb2\x01\x00\x04\x11\x129\xb2\a\x00\x04\x11\x129\xb2\n\x00\x04\x11\x12901\t\x023\x11#\x11\x13\x01#\x01\x13\x11#\x11\x01\xa1\x01\xdc\x01\xdc\xf9\xc0\x12\xfe\"\x93\xfe#\x13\xc0\x05\xb0\xfb\\\x04\xa4\xfaP\x027\x02d\xfbe\x04\x98\xfd\x9f\xfd\xc9\x05\xb0\x00\x00\x01\x00\xa9\x00\x00\x05\b\x05\xb0\x00\t\x00L\xb2\x01\n\v\x11\x129\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb2\x02\x05\x00\x11\x129\xb2\a\x05\x00\x11\x12901!#\x01\x11#\x113\x01\x113\x05\b\xc1\xfd#\xc1\xc1\x02߿\x04b\xfb\x9e\x05\xb0\xfb\x99\x04g\x00\x02\x00v\xff\xec\x05\t\x05\xc4\x00\x11\x00\x1f\x009\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb0\r\x10\xb2\x15\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\x10\xb2\x1c\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x02\x04#\"$\x02'54\x12$32\x04\x12\x15'\x10\x02#\"\x02\a\x15\x14\x1232\x127\x05\t\x90\xfe\xf8\xb0\xac\xfe\xf6\x93\x02\x92\x01\v\xac\xaf\x01\v\x90\xbfл\xb6\xd1\x03ӹ\xba\xcc\x03\x02\xa9\xd6\xfe\xc1\xa8\xa9\x019\xcei\xd2\x01B\xab\xa9\xfe\xbf\xd5\x02\x01\x03\x01\x15\xfe\xeb\xf6k\xfb\xfe\xe1\x01\x0f\xfd\x00\x00\x02\x00\xa9\x00\x00\x04\xc0\x05\xb0\x00\n\x00\x13\x00M\xb2\n\x14\x15\x11\x129\xb0\n\x10\xb0\f\xd0\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x10>Y\xb2\v\x03\x01\x11\x129\xb0\v/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x12\x01\n+X!\xd8\x1b\xf4Y01\x01\x11#\x11!2\x04\x15\x14\x04#%!2654&'!\x01i\xc0\x02\x19\xef\x01\x0f\xfe\xf7\xf7\xfe\xa9\x01Y\x9a\xa4\xa4\x8f\xfe\x9c\x02:\xfd\xc6\x05\xb0\xf4\xc9\xd4坑\x89\x82\x9c\x03\x00\x02\x00m\xff\n\x05\x06\x05\xc4\x00\x15\x00\"\x00M\xb2\b#$\x11\x129\xb0\b\x10\xb0\x19\xd0\x00\xb0\x00EX\xb0\x11/\x1b\xb1\x11\x1c>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x10>Y\xb2\x03\b\x11\x11\x129\xb0\x11\x10\xb2\x19\x01\n+X!\xd8\x1b\xf4Y\xb0\b\x10\xb2 \x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x02\a\x05\a%\x06#\"$\x02'54\x12$32\x04\x12\x15'\x10\x02#\"\x02\a\x15\x14\x12 \x127\x05\x01\x86y\x01\x04\x83\xfe\xcdHP\xac\xfe\xf6\x93\x02\x92\x01\v\xac\xb0\x01\v\x90\xc0;\xb5\xd1\x03\xd1\x01t\xcc\x03\x02\xa9\xd3\xfe\xcfV\xccy\xf4\x12\xa9\x019\xcei\xd2\x01B\xab\xaa\xfe\xc1\xd5\x01\x01\x01\x01\x17\xfe\xeb\xf6k\xfa\xfe\xe0\x01\x0f\xfd\x00\x00\x02\x00\xa8\x00\x00\x04\xc9\x05\xb0\x00\x0e\x00\x17\x00a\xb2\x05\x18\x19\x11\x129\xb0\x05\x10\xb0\x16\xd0\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x00EX\xb0\r/\x1b\xb1\r\x10>Y\xb2\x10\x04\x02\x11\x129\xb0\x10/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb2\v\x00\x04\x11\x129\xb0\x04\x10\xb2\x16\x01\n+X!\xd8\x1b\xf4Y01\x01!\x11#\x11!2\x04\x15\x14\x06\a\x01\x15#\x01!2654&'!\x02\xbf\xfe\xaa\xc1\x01\xe2\xf6\x01\t\x93\x83\x01V\xce\xfdn\x01'\x8f\xa9\xa1\x98\xfe\xda\x02M\xfd\xb3\x05\xb0\xe0ֈ\xca2\xfd\x96\f\x02\xea\x94|\x87\x90\x01\x00\x00\x01\x00P\xff\xec\x04r\x05\xc4\x00&\x00a\xb2\x00'(\x11\x129\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb0\x00EX\xb0\x1a/\x1b\xb1\x1a\x10>Y\xb0\x06\x10\xb0\vа\x06\x10\xb2\x0e\x01\n+X!\xd8\x1b\xf4Y\xb2&\x1a\x06\x11\x129\xb0&\x10\xb2\x14\x01\n+X!\xd8\x1b\xf4Y\xb0\x1a\x10\xb0\x1fа\x1a\x10\xb2\"\x01\n+X!\xd8\x1b\xf4Y01\x01&&54$32\x16\x16\x15#4&#\"\x06\x15\x14\x16\x04\x16\x16\x15\x14\x04#\"$&53\x14\x163264&\x02V\xf7\xe1\x01\x13ܖ\xeb\x81\xc1\xa8\x99\x8e\x9f\x97\x01k\xcdc\xfe\xec\xe7\x96\xfe\xfc\x8d\xc1ã\x98\xa2\x96\x02\x89GϘ\xac\xe1t\xccy\x84\x97}oY{f{\xa4o\xb1\xd5s\xc8\u007f\x84\x99|\xd6u\x00\x00\x01\x001\x00\x00\x04\x97\x05\xb0\x00\a\x00.\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x06\x10\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\xd001\x01!\x11#\x11!5!\x04\x97\xfe,\xbf\xfe-\x04f\x05\x12\xfa\xee\x05\x12\x9e\x00\x01\x00\x8c\xff\xec\x04\xaa\x05\xb0\x00\x12\x00<\xb2\x05\x13\x14\x11\x129\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1c>Y\xb0\x00EX\xb0\t/\x1b\xb1\t\x1c>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x10>Y\xb2\x0e\x01\n+X!\xd8\x1b\xf4Y01\x01\x11\x06\x00\a\a\"\x00'\x113\x11\x14\x163265\x11\x04\xaa\x01\xfe\xff\xdc3\xef\xfe\xe4\x02\xbe\xae\xa1\xa3\xad\x05\xb0\xfc\"\xce\xfe\xfa\x10\x02\x01\x02\xe2\x03\xe0\xfc&\x9e\xaf\xae\x9e\x03\xdb\x00\x00\x01\x00\x1c\x00\x00\x04\xfd\x05\xb0\x00\x06\x008\xb2\x00\a\b\x11\x129\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb2\x00\x01\x03\x11\x12901%\x013\x01#\x013\x02\x8b\x01\xa0\xd2\xfd\xe4\xaa\xfd\xe5\xd1\xff\x04\xb1\xfaP\x05\xb0\x00\x00\x01\x00=\x00\x00\x06\xed\x05\xb0\x00\x12\x00Y\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x1c>Y\xb0\x00EX\xb0\x11/\x1b\xb1\x11\x1c>Y\xb0\x00EX\xb0\n/\x1b\xb1\n\x10>Y\xb0\x00EX\xb0\x0f/\x1b\xb1\x0f\x10>Y\xb2\x01\x03\n\x11\x129\xb2\x06\x03\n\x11\x129\xb2\r\x03\n\x11\x12901\x01\x177\x013\x01\x177\x133\x01#\x01'\a\x01#\x013\x01\xe3\x1c)\x01 \xa2\x01\x19(\x1f\xe2\xc1\xfe\x9f\xaf\xfe\xd4\x17\x17\xfeɯ\xfe\xa0\xc0\x01\xcb\xc0\xad\x03\xf8\xfc\b\xb0\xc4\x03\xe4\xfaP\x04%oo\xfb\xdb\x05\xb0\x00\x01\x009\x00\x00\x04\xce\x05\xb0\x00\v\x00k\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\n/\x1b\xb1\n\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb0\x00EX\xb0\a/\x1b\xb1\a\x10>Y\xb2\x00\x01\x04\x11\x129@\t\x86\x00\x96\x00\xa6\x00\xb6\x00\x04]\xb2\x06\x01\x04\x11\x129@\t\x89\x06\x99\x06\xa9\x06\xb9\x06\x04]\xb2\x03\x00\x06\x11\x129\xb2\t\x06\x00\x11\x12901\x01\x013\x01\x01#\x01\x01#\x01\x013\x02\x84\x01]\xe2\xfe4\x01\xd7\xe4\xfe\x9a\xfe\x98\xe3\x01\xd8\xfe3\xe1\x03\x82\x02.\xfd.\xfd\"\x028\xfd\xc8\x02\xde\x02\xd2\x00\x00\x01\x00\x0f\x00\x00\x04\xbb\x05\xb0\x00\b\x001\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\a/\x1b\xb1\a\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb2\x00\x01\x04\x11\x12901\x01\x013\x01\x11#\x11\x013\x02e\x01|\xda\xfe\n\xc0\xfe\n\xdc\x02\xd5\x02\xdb\xfco\xfd\xe1\x02\x1f\x03\x91\x00\x00\x01\x00V\x00\x00\x04z\x05\xb0\x00\t\x00D\x00\xb0\x00EX\xb0\a/\x1b\xb1\a\x1c>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb2\x04\x00\x02\x11\x129\xb0\a\x10\xb2\x05\x01\n+X!\xd8\x1b\xf4Y\xb2\t\x05\a\x11\x12901%!\x15!5\x01!5!\x15\x019\x03A\xfb\xdc\x03\x1e\xfc\xef\x03\xf7\x9d\x9d\x90\x04\x82\x9e\x8d\x00\x00\x01\x00\x92\xfe\xc8\x02\v\x06\x80\x00\a\x00\"\x00\xb0\x04/\xb0\a/\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\x10\xb2\x03\x01\n+X!\xd8\x1b\xf4Y01\x01#\x113\x15!\x11!\x02\v\xbf\xbf\xfe\x87\x01y\x05\xe8\xf9x\x98\a\xb8\x00\x00\x01\x00(\xff\x83\x038\x05\xb0\x00\x03\x00\x13\x00\xb0\x02/\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1c>Y01\x133\x01#(\xb0\x02`\xb0\x05\xb0\xf9\xd3\x00\x01\x00\t\xfe\xc8\x01\x83\x06\x80\x00\a\x00%\x00\xb0\x02/\xb0\x01/\xb0\x02\x10\xb2\x05\x01\n+X!\xd8\x1b\xf4Y\xb0\x01\x10\xb2\x06\x01\n+X!\xd8\x1b\xf4Y01\x13!\x11!53\x11#\t\x01z\xfe\x86\xc1\xc1\x06\x80\xf8H\x98\x06\x88\x00\x00\x01\x00@\x02\xd9\x03\x14\x05\xb0\x00\x06\x00'\xb2\x00\a\b\x11\x129\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb0\x00в\x01\a\x03\x11\x129\xb0\x01/\xb0\x05\xd001\x01\x03#\x013\x01#\x01\xaa\xbe\xac\x01+\u007f\x01*\xab\x04\xbb\xfe\x1e\x02\xd7\xfd)\x00\x01\x00\x04\xffi\x03\x98\x00\x00\x00\x03\x00\x1b\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb2\x00\x01\n+X!\xd8\x1b\xf4Y01\x05!5!\x03\x98\xfcl\x03\x94\x97\x97\x00\x00\x01\x009\x04\xd8\x01\xda\x05\xfe\x00\x03\x00#\x00\xb0\x01/\xb2\x0f\x01\x01]\xb0\x00\xd0\x19\xb0\x00/\x18\xb0\x01\x10\xb0\x02а\x02/\xb4\x0f\x02\x1f\x02\x02]01\x01#\x013\x01ڟ\xfe\xfe\xdf\x04\xd8\x01&\x00\x00\x02\x00m\xff\xec\x03\xea\x04N\x00\x1e\x00(\x00y\xb2\x17)*\x11\x129\xb0\x17\x10\xb0 \xd0\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x02\x17\x04\x11\x129\xb2\v\x17\x04\x11\x129\xb0\v/\xb0\x17\x10\xb2\x0f\x01\n+X!\xd8\x1b\xf4Y\xb2\x12\v\x17\x11\x129\xb0\x04\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y\xb0\v\x10\xb2#\x01\n+X!\xd8\x1b\xf4Y01!&'\x06#\"&54$3354&#\"\x06\x15#46632\x16\x17\x11\x14\x17\x15%2675# \x15\x14\x16\x03(\x10\n\x81\xb3\xa0\xcd\x01\x01\xe9\xb4tqc\x86\xbas\xc5v\xbb\xd4\x04&\xfe\vW\x9c#\x91\xfe\xact R\x86\xb5\x8b\xa9\xbbUasdGQ\x97X\xbb\xa4\xfe\x0e\x95X\x10\x8dZH\xde\xc7Wb\x00\x02\x00\x8c\xff\xec\x04 \x06\x00\x00\x0e\x00\x19\x00d\xb2\x12\x1a\x1b\x11\x129\xb0\x12\x10\xb0\x03\xd0\x00\xb0\b/\xb0\x00EX\xb0\f/\x1b\xb1\f\x18>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x10>Y\xb2\x05\b\x03\x11\x129\xb2\n\f\x03\x11\x129\xb0\f\x10\xb2\x12\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x17\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x02#\"'\a#\x113\x116 \x12\x11'4&#\"\a\x11\x16326\x04 \xe4\xc0\xcdp\t\xaa\xb9p\x01\x8aṒ\x89\xb7PU\xb4\x85\x94\x02\x11\xf8\xfeӑ}\x06\x00\xfdË\xfe\xd6\xfe\xfd\x05\xbdΪ\xfe,\xaa\xce\x00\x01\x00\\\xff\xec\x03\xec\x04N\x00\x1d\x00I\xb2\x10\x1e\x1f\x11\x129\x00\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x18>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x10>Y\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\b\x10\xb0\x03а\x10\x10\xb0\x14а\x10\x10\xb2\x17\x01\n+X!\xd8\x1b\xf4Y01%2673\x0e\x02#\"\x00\x11546632\x16\x17#&&#\"\x06\x15\x15\x14\x16\x02>c\x94\b\xaf\x05v\xc5n\xdd\xfe\xfbtٔ\xb6\xf1\b\xaf\b\x8fi\x8d\x9b\x9a\x83xZ]\xa8d\x01'\x01\x00\x1f\x9e\xf6\x88ڮi\x87\xcb\xc0#\xbb\xca\x00\x00\x02\x00_\xff\xec\x03\xf0\x06\x00\x00\x0f\x00\x1a\x00d\xb2\x18\x1b\x1c\x11\x129\xb0\x18\x10\xb0\x03\xd0\x00\xb0\x06/\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\f/\x1b\xb1\f\x10>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x10>Y\xb2\x05\x03\f\x11\x129\xb2\n\x03\f\x11\x129\xb0\f\x10\xb2\x13\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y01\x134\x1232\x17\x113\x11#'\x06#\"\x025\x17\x14\x16327\x11&#\"\x06_쿾o\xb9\xaa\toƼ\xed\xb9\x98\x86\xb0QS\xac\x88\x98\x02&\xf9\x01/\x82\x024\xfa\x00t\x88\x014\xf8\a\xb8О\x01\xf1\x99\xd2\x00\x00\x02\x00]\xff\xec\x03\xf3\x04N\x00\x15\x00\x1d\x00i\xb2\b\x1e\x1f\x11\x129\xb0\b\x10\xb0\x16\xd0\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x1a\b\x00\x11\x129\xb0\x1a/\xb4\xbf\x1a\xcf\x1a\x02]\xb2\f\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb2\x10\x01\n+X!\xd8\x1b\xf4Y\xb2\x13\b\x00\x11\x129\xb0\b\x10\xb2\x16\x01\n+X!\xd8\x1b\xf4Y01\x05\"\x005546632\x12\x11\x15!\x16\x163267\x17\x06\x01\"\x06\a!5&&\x02M\xdc\xfe\xec{݁\xd3\xea\xfd#\x04\xb3\x8ab\x883q\x88\xfe\xd9p\x98\x12\x02\x1e\b\x88\x14\x01!\xf2\"\xa1\xfd\x8f\xfe\xea\xfe\xfdM\xa0\xc5PBX\xd1\x03ʣ\x93\x0e\x8d\x9b\x00\x01\x00<\x00\x00\x02\xca\x06\x15\x00\x15\x00c\xb2\x0f\x16\x17\x11\x129\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x1e>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\x11/\x1b\xb1\x11\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x03\x10\xb2\x01\x01\n+X!\xd8\x1b\xf4Y\xb0\b\x10\xb2\r\x01\n+X!\xd8\x1b\xf4Y\xb0\x01\x10\xb0\x13а\x14\xd0013\x11#5354632\x17\a&#\"\x06\x15\x153\x15#\x11竫\xba\xaa@?\n/5Zb\xe7\xe7\x03\xab\x8fo\xae\xbe\x11\x96\tibr\x8f\xfcU\x00\x02\x00`\xfeV\x03\xf2\x04N\x00\x19\x00$\x00\x83\xb2\"%&\x11\x129\xb0\"\x10\xb0\v\xd0\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x18>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x12>Y\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x10>Y\xb2\x05\x03\x17\x11\x129\xb2\x0f\x17\v\x11\x129\xb0\v\x10\xb2\x11\x01\n+X!\xd8\x1b\xf4Y\xb2\x15\x03\x17\x11\x129\xb0\x17\x10\xb2\x1d\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\"\x01\n+X!\xd8\x1b\xf4Y01\x134\x1232\x1773\x11\x14\x06#\"&'7\x1632655\x06#\"\x027\x14\x16327\x11&#\"\x06`\xea\xc1\xc6o\t\xa9\xf9\xd2u\xe0;`w\xac\x87\x97o\xc0\xbe뺖\x87\xafRU\xaa\x87\x98\x02&\xfd\x01+\x8cx\xfb\xe0\xd2\xf2dWo\x93\x98\x8a]\x80\x012\xf3\xb7џ\x01\xee\x9b\xd2\x00\x00\x01\x00\x8c\x00\x00\x03\xdf\x06\x00\x00\x11\x00I\xb2\n\x12\x13\x11\x129\x00\xb0\x10/\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x10>Y\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x10>Y\xb2\x00\x02\x05\x11\x129\xb0\x02\x10\xb2\n\x01\n+X!\xd8\x1b\xf4Y01\x0163 \x13\x11#\x11&&#\"\x06\a\x11#\x113\x01E{\xc5\x01W\x03\xb9\x01ioZ\x88&\xb9\xb9\x03\xb7\x97\xfe}\xfd5\x02\xccup`N\xfc\xfd\x06\x00\x00\x02\x00\x8d\x00\x00\x01h\x05\xc4\x00\x03\x00\f\x00>\xb2\x06\r\x0e\x11\x129\xb0\x06\x10\xb0\x01\xd0\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x02\x10\xb0\nа\n/\xb2\x06\x05\n+X!\xd8\x1b\xf4Y01!#\x113\x03462\x16\x14\x06\"&\x01U\xb9\xb9\xc87l88l7\x04:\x01\x1f->>Z<<\x00\x02\xff\xbf\xfeK\x01Y\x05\xc4\x00\f\x00\x16\x00I\xb2\x10\x17\x18\x11\x129\xb0\x10\x10\xb0\x00\xd0\x00\xb0\x00EX\xb0\f/\x1b\xb1\f\x18>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x12>Y\xb2\b\x01\n+X!\xd8\x1b\xf4Y\xb0\f\x10\xb0\x15а\x15/\xb2\x10\x05\n+X!\xd8\x1b\xf4Y01\x01\x11\x10!\"'5\x163265\x11\x034632\x16\x14\x06\"&\x01K\xfe\xe5=4 4>A\x1375688l6\x04:\xfbI\xfe\xc8\x12\x94\bCS\x04\xbb\x01\x1f,?>Z<<\x00\x00\x01\x00\x8d\x00\x00\x04\f\x06\x00\x00\f\x00u\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1e>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x10>Y\xb2\x00\b\x02\x11\x129@\x15:\x00J\x00Z\x00j\x00z\x00\x8a\x00\x9a\x00\xaa\x00\xba\x00\xca\x00\n]\xb2\x06\b\x02\x11\x129@\x156\x06F\x06V\x06f\x06v\x06\x86\x06\x96\x06\xa6\x06\xb6\x06\xc6\x06\n]01\x01\a\x11#\x113\x117\x013\x01\x01#\x01\xbat\xb9\xb9c\x01Q\xe1\xfe[\x01\xd6\xd9\x01\xf5y\xfe\x84\x06\x00\xfc_w\x01d\xfe<\xfd\x8a\x00\x01\x00\x9c\x00\x00\x01U\x06\x00\x00\x03\x00\x1d\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1e>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y01!#\x113\x01U\xb9\xb9\x06\x00\x00\x00\x01\x00\x8b\x00\x00\x06x\x04N\x00\x1d\x00w\xb2\x04\x1e\x1f\x11\x129\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x18>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x10>Y\xb0\x00EX\xb0\x14/\x1b\xb1\x14\x10>Y\xb0\x00EX\xb0\x1b/\x1b\xb1\x1b\x10>Y\xb2\x01\b\v\x11\x129\xb2\x05\b\v\x11\x129\xb0\b\x10\xb2\x10\x01\n+X!\xd8\x1b\xf4Y\xb0\x18\xd001\x01\x17632\x17663 \x13\x11#\x114&#\"\x06\a\x11#\x114#\"\a\x11#\x11\x01:\x05w\xca\xe3R6\xadv\x01d\x06\xb9j}g\x88\v\xba\xe7\xb6C\xb9\x04:x\x8c\xaeN`\xfe\x87\xfd+\x02\xcats{h\xfd2\x02\xc5\xec\x9b\xfc\xea\x04:\x00\x01\x00\x8c\x00\x00\x03\xdf\x04N\x00\x11\x00S\xb2\v\x12\x13\x11\x129\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x18>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x10>Y\xb0\x00EX\xb0\x0f/\x1b\xb1\x0f\x10>Y\xb2\x01\x03\x06\x11\x129\xb0\x03\x10\xb2\v\x01\n+X!\xd8\x1b\xf4Y01\x01\x1763 \x13\x11#\x11&&#\"\x06\a\x11#\x11\x01;\x06|\xc8\x01W\x03\xb9\x01ioZ\x88&\xb9\x04:\x88\x9c\xfe}\xfd5\x02\xccup`N\xfc\xfd\x04:\x00\x00\x02\x00[\xff\xec\x044\x04N\x00\x0f\x00\x1b\x00C\xb2\f\x1c\x1d\x11\x129\xb0\f\x10\xb0\x13\xd0\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb0\x00EX\xb0\f/\x1b\xb1\f\x10>Y\xb2\x13\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\x10\xb2\x19\x01\n+X!\xd8\x1b\xf4Y01\x1346632\x00\x15\x15\x14\x06\x06#\"\x005\x17\x14\x1632654&#\"\x06[}ߏ\xdd\x01\x11y\xe1\x92\xdc\xfeﺧ\x8c\x8d\xa6\xa9\x8c\x89\xa8\x02'\x9f\xfe\x8a\xfe\xce\xfe\r\x9e\xfb\x8c\x012\xfc\t\xb4\xda\xddDz\xdd\xda\x00\x02\x00\x8c\xfe`\x04\x1e\x04N\x00\x0f\x00\x1a\x00n\xb2\x13\x1b\x1c\x11\x129\xb0\x13\x10\xb0\f\xd0\x00\xb0\x00EX\xb0\f/\x1b\xb1\f\x18>Y\xb0\x00EX\xb0\t/\x1b\xb1\t\x18>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x12>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb2\x05\f\x03\x11\x129\xb2\n\f\x03\x11\x129\xb0\f\x10\xb2\x13\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x02#\"'\x11#\x113\x17632\x12\x11'4&#\"\a\x11\x16326\x04\x1e\xe2\xc1\xc5q\xb9\xa9\tq\xc9\xc3㹜\x88\xa8TS\xab\x85\x9d\x02\x11\xf7\xfe\xd2}\xfd\xf7\x05\xdax\x8c\xfe\xda\xfe\xfa\x04\xb7ԕ\xfd\xfb\x94\xd3\x00\x00\x02\x00_\xfe`\x03\xef\x04N\x00\x0f\x00\x1a\x00k\xb2\x18\x1b\x1c\x11\x129\xb0\x18\x10\xb0\x03\xd0\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x18>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x12>Y\xb0\x00EX\xb0\f/\x1b\xb1\f\x10>Y\xb2\x05\x03\f\x11\x129\xb2\n\x03\f\x11\x129\xb2\x13\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y01\x134\x1232\x1773\x11#\x11\x06#\"\x025\x17\x14\x16327\x11&#\"\x06_\xea\xc5\xc0o\b\xaa\xb9p\xba\xc4鹝\x85\xa5WX\xa2\x86\x9e\x02&\xff\x01)\x81m\xfa&\x02\x04x\x011\xfc\b\xbaԒ\x02\x12\x8f\xd5\x00\x01\x00\x8c\x00\x00\x02\x97\x04N\x00\r\x00F\xb2\x04\x0e\x0f\x11\x129\x00\xb0\x00EX\xb0\v/\x1b\xb1\v\x18>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x10>Y\xb0\v\x10\xb2\x02\x01\n+X!\xd8\x1b\xf4Y\xb2\t\v\x05\x11\x12901\x01&#\"\a\x11#\x113\x17632\x17\x02\x97*1\xb6A\xb9\xb4\x03[\xa76\x1c\x03\x94\a\x9b\xfd\x00\x04:}\x91\x0e\x00\x01\x00_\xff\xec\x03\xbb\x04N\x00&\x00a\xb2\t'(\x11\x129\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x18>Y\xb0\x00EX\xb0\x1c/\x1b\xb1\x1c\x10>Y\xb2\x03\x1c\t\x11\x129\xb0\t\x10\xb0\rа\t\x10\xb2\x10\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x15\x01\n+X!\xd8\x1b\xf4Y\xb0\x1c\x10\xb0!а\x1c\x10\xb2$\x01\n+X!\xd8\x1b\xf4Y01\x014&$&&54632\x16\x15#4&#\"\x06\x15\x14\x16\x04\x16\x16\x15\x14\x06#\"&&53\x16\x16326\x03\x02q\xfe\xe7\xa5O\u1bf8庁berj\x01\x15\xacS蹂\xc8q\xb9\x05\x8bri\u007f\x01\x1fKSVyW\x91\xaf\\\xa5`]mU\x00\x01\x00\t\xff\xec\x02V\x05@\x00\x15\x00_\xb2\x0e\x16\x17\x11\x129\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x18>Y\xb0\x00EX\xb0\x13/\x1b\xb1\x13\x18>Y\xb0\x00EX\xb0\r/\x1b\xb1\r\x10>Y\xb0\x01\x10\xb0\x00а\x00/\xb0\x01\x10\xb2\x03\x01\n+X!\xd8\x1b\xf4Y\xb0\r\x10\xb2\b\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb0\x11а\x12\xd001\x01\x113\x15#\x11\x14\x16327\x15\x06#\"&5\x11#53\x11\x01\x87\xca\xca6A 8IE|~\xc5\xc5\x05@\xfe\xfa\x8f\xfdaAA\f\x96\x14\x96\x8a\x02\x9f\x8f\x01\x06\x00\x01\x00\x88\xff\xec\x03\xdc\x04:\x00\x10\x00S\xb2\n\x11\x12\x11\x129\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x18>Y\xb0\x00EX\xb0\r/\x1b\xb1\r\x18>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x10>Y\xb2\x00\r\x02\x11\x129\xb0\x02\x10\xb2\n\x01\n+X!\xd8\x1b\xf4Y01%\x06#\"&'\x113\x11\x14327\x113\x11#\x03(lѭ\xb5\x01\xb9\xc8\xd4F\xb9\xb0k\u007f\xc9\xc5\x02\xc0\xfdE\xf6\x9e\x03\x13\xfb\xc6\x00\x00\x01\x00!\x00\x00\x03\xba\x04:\x00\x06\x008\xb2\x00\a\b\x11\x129\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x18>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x18>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb2\x00\x05\x03\x11\x12901%\x013\x01#\x013\x01\xf1\x01\f\xbd\xfe|\x8d\xfex\xbd\xfb\x03?\xfb\xc6\x04:\x00\x00\x01\x00+\x00\x00\x05\xd3\x04:\x00\f\x00`\xb2\x05\r\x0e\x11\x129\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x18>Y\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x18>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x10>Y\xb2\x00\v\x03\x11\x129\xb2\x05\v\x03\x11\x129\xb2\n\v\x03\x11\x12901%\x133\x01#\x01\x01#\x013\x13\x133\x04Jй\xfeŖ\xfe\xf9\xff\x00\x96\xfeƸ\xd5\xfc\x95\xff\x03;\xfb\xc6\x034\xfc\xcc\x04:\xfc\xd6\x03*\x00\x01\x00)\x00\x00\x03\xca\x04:\x00\v\x00S\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x18>Y\xb0\x00EX\xb0\n/\x1b\xb1\n\x18>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb0\x00EX\xb0\a/\x1b\xb1\a\x10>Y\xb2\x00\n\x04\x11\x129\xb2\x06\n\x04\x11\x129\xb2\x03\x00\x06\x11\x129\xb2\t\x06\x00\x11\x12901\x01\x133\x01\x01#\x03\x03#\x01\x013\x01\xf7\xf0\xd8\xfe\x9e\x01m\xd6\xfa\xfa\xd7\x01m\xfe\x9e\xd6\x02\xaf\x01\x8b\xfd\xe9\xfd\xdd\x01\x95\xfek\x02#\x02\x17\x00\x01\x00\x16\xfeK\x03\xb0\x04:\x00\x0f\x00I\xb2\x00\x10\x11\x11\x129\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x18>Y\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x18>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x12>Y\xb2\x00\x0e\x05\x11\x129\xb2\t\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb0\r\xd001\x01\x133\x01\x02#''5\x172677\x013\x01\xee\xfc\xc6\xfeMe\xdc#E2^i\")\xfe~\xca\x01\x0f\x03+\xfb\x1f\xfe\xf2\x03\r\x96\x04Len\x04.\x00\x01\x00X\x00\x00\x03\xb3\x04:\x00\t\x00D\x00\xb0\x00EX\xb0\a/\x1b\xb1\a\x18>Y\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb2\x04\x00\x02\x11\x129\xb0\a\x10\xb2\x05\x01\n+X!\xd8\x1b\xf4Y\xb2\t\x05\a\x11\x12901%!\x15!5\x01!5!\x15\x01:\x02y\xfc\xa5\x02U\xfd\xb4\x034\x97\x97\x88\x03\x19\x99\x83\x00\x00\x01\x00@\xfe\x92\x02\x9e\x06=\x00\x18\x001\xb2\x13\x19\x1a\x11\x129\x00\xb0\r/\xb0\x00/\xb2\a\r\x00\x11\x129\xb0\a/\xb2\x1f\a\x01]\xb2\x06\x03\n+X!\xd8\x1b\xf4Y\xb2\x13\x06\a\x11\x12901\x01&&554#5255667\x17\x06\x11\x15\x14\a\x16\x15\x15\x12\x17\x02x\xb1\xb3\xd4\xd4\x02\xaf\xb3&ѧ\xa7\x03\xce\xfe\x922\xe5\xbc\xc7\xf3\x91\xf2з\xe13sC\xfe\xe6\xca\xe3YZ\xe5\xce\xfe\xedB\x00\x00\x01\x00\xaf\xfe\xf2\x01D\x05\xb0\x00\x03\x00\x13\x00\xb0\x00/\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y01\x01#\x113\x01D\x95\x95\xfe\xf2\x06\xbe\x00\x00\x01\x00\x13\xfe\x92\x02r\x06=\x00\x18\x001\xb2\x05\x19\x1a\x11\x129\x00\xb0\v/\xb0\x18/\xb2\x11\v\x18\x11\x129\xb0\x11/\xb2\x1f\x11\x01]\xb2\x12\x03\n+X!\xd8\x1b\xf4Y\xb2\x05\x12\x11\x11\x12901\x176\x13547&55\x10'7\x16\x16\x17\x15\x143\x15\"\x15\x15\x14\x06\a\x13\xcb\a\xb5\xb5\xd1&\xb1\xb2\x01\xd4Ե\xaf\xfbA\x01\n\xdc\xe7TR\xe9\xcb\x01\x1aCs2\xe1\xb9\xd2\xef\x91\xf3ʼ\xe22\x00\x00\x01\x00\x83\x01\x92\x04\xef\x03\"\x00\x17\x00B\xb2\x11\x18\x19\x11\x129\x00\xb0\x00EX\xb0\x0f/\x1b\xb1\x0f\x16>Y\xb0\x00а\x0f\x10\xb0\x14а\x14/\xb2\x03\x01\n+X!\xd8\x1b\xf4Y\xb0\x0f\x10\xb2\b\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb0\v\xd001\x01\x14\x06#\".\x02#\"\x06\x15\a4632\x16\x16\x17\x17265\x04ﻉH\x80\xa9J*NT\xa1\xb8\x8bL\x8c\xb0@\x1dL_\x03\t\x9e\xd95\x94$k^\x02\xa0\xce@\xa1\n\x02t_\x00\x02\x00\x8b\xfe\x98\x01f\x04M\x00\x03\x00\f\x002\xb2\x06\r\x0e\x11\x129\xb0\x06\x10\xb0\x00\xd0\x00\xb0\x02/\xb0\x00EX\xb0\v/\x1b\xb1\v\x18>Y\xb2\x06\x05\n+X!\xd8\x1b\xf4Y\xb2\x01\x02\x06\x11\x12901\x133\x13#\x13\x14\x06\"&462\x16\xaa\xa8\r\xc2\xc97l88l7\x02\xac\xfb\xec\x05L->>Z<<\x00\x01\x00i\xff\v\x03\xf9\x05&\x00!\x00R\xb2\x00\"#\x11\x129\x00\xb0\x00EX\xb0\x14/\x1b\xb1\x14\x18>Y\xb0\x00EX\xb0\n/\x1b\xb1\n\x10>Y\xb0\aв\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\n\x10\xb0\x03а\x14\x10\xb0\x11а\x14\x10\xb0\x18а\x14\x10\xb2\x1b\x01\n+X!\xd8\x1b\xf4Y01%2673\x06\x06\a\x15#5&\x02554\x12753\x15\x16\x16\x17#&&#\"\x06\x15\x15\x14\x16\x02Jd\x94\b\xaf\x06Ɛ\xb9\xb3\xc8ʱ\xb9\x96\xc0\x06\xaf\b\x8fi\x8d\x9b\x9b\x83yY~\xc9\x1a\xe9\xea\"\x01\x1c\xdc#\xd4\x01\x1d!\xe2\xdf\x17Ԗi\x87\xcb\xc0#\xbb\xca\x00\x01\x00[\x00\x00\x04h\x05\xc4\x00!\x00|\xb2\x1c\"#\x11\x129\x00\xb0\x00EX\xb0\x14/\x1b\xb1\x14\x1c>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x10>Y\xb2\x1f\x14\x05\x11\x129\xb0\x1f/\xb2_\x1f\x01r\xb2\x8f\x1f\x01q\xb2\xbf\x1f\x01]\xb2\x00\x01\n+X!\xd8\x1b\xf4Y\xb0\x05\x10\xb2\x03\x01\n+X!\xd8\x1b\xf4Y\xb0\aа\bа\x00\x10\xb0\rа\x1f\x10\xb0\x0fа\x14\x10\xb0\x18а\x14\x10\xb2\x1b\x01\n+X!\xd8\x1b\xf4Y01\x01\x17\x14\a!\a!536675'#53\x034632\x16\x15#4&#\"\x06\x15\x13!\x15\x01\xc1\b>\x02\xdd\x01\xfb\xf8M(2\x02\b\xa5\xa0\t\xf5Ⱦ\u07bf\u007foi\x82\t\x01?\x02nܚ[\x9d\x9d\t\x83`\bݝ\x01\x04\xc7\xeeԱk|\x9a}\xfe\xfc\x9d\x00\x00\x02\x00i\xff\xe5\x05[\x04\xf1\x00\x1b\x00*\x00?\xb2\x02+,\x11\x129\xb0\x02\x10\xb0'\xd0\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x10>Y\xb0\x10а\x10/\xb0\x02\x10\xb2\x1f\x01\n+X!\xd8\x1b\xf4Y\xb0\x10\x10\xb2'\x01\n+X!\xd8\x1b\xf4Y01%\x06#\"'\a'7&547'7\x17632\x177\x17\a\x16\x15\x14\a\x17\a\x01\x14\x16\x1626654&&#\"\x06\x06\x04O\x9f\xd1ϟ\x86\x82\x8bhp\x93\x82\x93\x9e\xc3ğ\x95\x84\x97nf\x8f\x84\xfc`s\xc4\xe2\xc4qq\xc5pq\xc4sp\x84\x82\x88\x87\x8d\x9c\xcaΣ\x97\x88\x96xy\x98\x89\x9a\xa3\xcbğ\x90\x88\x02{{\xd4z{\xd3{z\xd3yx\xd4\x00\x00\x01\x00\x1f\x00\x00\x04\xad\x05\xb0\x00\x16\x00k\x00\xb0\x00EX\xb0\x16/\x1b\xb1\x16\x1c>Y\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb0\x00EX\xb0\f/\x1b\xb1\f\x10>Y\xb2\x0f\x13\x03+\xb2\x00\f\x16\x11\x129\xb4\x0f\x13\x1f\x13\x02]\xb0\x13\x10\xb0\x03а\x13\x10\xb2\x12\x02\n+X!\xd8\x1b\xf4Y\xb0\x06а\x0f\x10\xb0\aа\x0f\x10\xb2\x0e\x02\n+X!\xd8\x1b\xf4Y\xb0\n\xd001\x01\x013\x01!\x15!\x15!\x15!\x11#\x11!5!5!5!\x013\x02f\x01l\xdb\xfe^\x018\xfe\x80\x01\x80\xfe\x80\xc1\xfe\x86\x01z\xfe\x86\x019\xfe^\xdc\x03\x0e\x02\xa2\xfd0}\xa5|\xfe\xbe\x01B|\xa5}\x02\xd0\x00\x00\x02\x00\x93\xfe\xf2\x01M\x05\xb0\x00\x03\x00\a\x00\x18\x00\xb0\x00/\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb2\x05\x01\x03+01\x13\x113\x11\x11#\x113\x93\xba\xba\xba\xfe\xf2\x03\x17\xfc\xe9\x03\xc8\x02\xf6\x00\x02\x00Z\xfe\x11\x04y\x05\xc4\x004\x00D\x00\x80\xb2#EF\x11\x129\xb0#\x10\xb05\xd0\x00\xb0\b/\xb0\x00EX\xb0#/\x1b\xb1#\x1c>Y\xb2\x16\b#\x11\x129\xb0\x16\x10\xb2?\x01\n+X!\xd8\x1b\xf4Y\xb2\x02\x16?\x11\x129\xb0\b\x10\xb0\x0eа\b\x10\xb2\x11\x01\n+X!\xd8\x1b\xf4Y\xb20#\b\x11\x129\xb00\x10\xb27\x01\n+X!\xd8\x1b\xf4Y\xb2\x1d70\x11\x129\xb0#\x10\xb0'а#\x10\xb2*\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\a\x16\x16\x15\x14\x04#\"&'&57\x14\x1632654&'.\x02547&&54$32\x04\x15#4&#\"\x06\x15\x14\x16\x16\x04\x1e\x02%&'\x06\x06\x15\x14\x16\x16\x04\x176654&\x04y\xbaEH\xfe\xfc\xe4p\xc9F\x8b\xba\xb4\x9c\x88\xa6\x8eѶ\xc0]\xb6BG\x01\v\xde\xe8\x01\x04\xb9\xa8\x8b\x8e\xa18\x87\x01\x1f\xa9q:\xfd\xe1ZKPK6\x85\x01\x1c,NT\x8b\x01\xaf\xbdU1\x88d\xa8\xc789q\xcd\x02\x82\x97u`Yi>0o\x9bo\xbaX1\x88d\xa6\xc8\xe2\xcd}\x9bsbEPAPHa\x81\xab\x18\x1b\x13eEFPBR\x11\x14eEXm\x00\x00\x02\x00f\x04\xf0\x02\xef\x05\xc5\x00\b\x00\x11\x00\x1d\x00\xb0\a/\xb2\x02\x05\n+X!\xd8\x1b\xf4Y\xb0\vа\a\x10\xb0\x10а\x10/01\x13462\x16\x14\x06\"&%462\x16\x14\x06\"&f7l88l7\x01\xae7l88l7\x05[-==Z<<+->>Z<<\x00\x00\x03\x00[\xff\xeb\x05\xe6\x05\xc4\x00\x1b\x00*\x009\x00\x95\xb2':;\x11\x129\xb0'\x10\xb0\x03а'\x10\xb06\xd0\x00\xb0\x00EX\xb0./\x1b\xb1.\x1c>Y\xb0\x00EX\xb06/\x1b\xb16\x10>Y\xb2\x036.\x11\x129\xb0\x03/\xb4\x0f\x03\x1f\x03\x02]\xb2\n.6\x11\x129\xb0\n/\xb4\x00\n\x10\n\x02]\xb2\x0e\n\x03\x11\x129\xb2\x11\x02\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x02\n+X!\xd8\x1b\xf4Y\xb2\x1b\x03\n\x11\x129\xb06\x10\xb2 \x04\n+X!\xd8\x1b\xf4Y\xb0.\x10\xb2'\x04\n+X!\xd8\x1b\xf4Y01\x01\x14\x06#\"&554632\x16\x15#4&#\"\x06\x15\x15\x14\x163265%\x14\x12\x04 $\x1254\x02$#\"\x04\x02\a4\x12$ \x04\x12\x15\x14\x02\x04#\"$\x02\x04_\xad\x9e\x9d\xbd\xbf\x9b\xa0\xac\x92_[^ll^\\]\xfd\x01\xa0\x01\x13\x01@\x01\x12\xa0\x9e\xfe\xed\xa1\xa0\xfe\xec\x9fs\xbb\x01K\x01\x80\x01J\xbb\xb4\xfe\xb5\xc6\xc5\xfe\xb5\xb6\x02U\x99\xa1Ӷn\xb0Ӥ\x95cU\x8a{qx\x8aTe\x84\xac\xfeۦ\xa6\x01%\xac\xaa\x01\"\xa7\xa5\xfeܪ\xca\x01Z\xc7\xc7\xfe\xa6\xca\xc5\xfe\xa8\xd1\xcf\x01X\x00\x00\x02\x00\x93\x02\xb3\x03\x0f\x05\xc4\x00\x1b\x00%\x00l\xb2\x0e&'\x11\x129\xb0\x0e\x10\xb0\x1d\xd0\x00\xb0\x00EX\xb0\x15/\x1b\xb1\x15\x1c>Y\xb2\x04&\x15\x11\x129\xb0\x04/\xb0\x00в\x02\x04\x15\x11\x129\xb2\v\x04\x15\x11\x129\xb0\v/\xb0\x15\x10\xb2\x0e\x03\n+X!\xd8\x1b\xf4Y\xb2\x11\v\x15\x11\x129\xb0\x04\x10\xb2\x1c\x03\n+X!\xd8\x1b\xf4Y\xb0\v\x10\xb2 \x04\n+X!\xd8\x1b\xf4Y01\x01&'\x06#\"&5463354#\"\x06\x15'4632\x16\x15\x11\x14\x17%2675#\x06\x06\x15\x14\x02j\f\x06L\x80w\x82\xa7\xacl|EO\xa1\xac\x89\x85\x9a\x1a\xfe\xa4+X\x1cpSY\x02\xc1\"&V|gox4\x8763\fg\x82\x8f\x86\xfe\xc4aQ{(\x1b\x8e\x01?3^\xff\xff\x00f\x00\x97\x03d\x03\xb3\x00&\x00\x9a\xfa\xfe\x00\a\x00\x9a\x01D\xff\xfe\x00\x01\x00\u007f\x01w\x03\xbe\x03 \x00\x05\x00\x1a\x00\xb0\x04/\xb0\x01а\x01/\xb0\x04\x10\xb2\x02\x01\n+X!\xd8\x1b\xf4Y01\x01#\x11!5!\x03\xbe\xba\xfd{\x03?\x01w\x01\b\xa1\x00\x04\x00Z\xff\xeb\x05\xe5\x05\xc4\x00\x0e\x00\x1e\x004\x00=\x00\xa9\xb26>?\x11\x129\xb06\x10\xb0\vа6\x10\xb0\x13а6\x10\xb0#\xd0\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x10>Y\xb2\x13\x04\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x1b\x04\n+X!\xd8\x1b\xf4Y\xb2 \v\x03\x11\x129\xb0 /\xb2\"\x03\v\x11\x129\xb0\"/\xb4\x00\"\x10\"\x02]\xb25 \"\x11\x129\xb05/\xb2\xbf5\x01]\xb4\x005\x105\x02]\xb2\x1f\x02\n+X!\xd8\x1b\xf4Y\xb2(\x1f5\x11\x129\xb0 \x10\xb0/а//\xb0\"\x10\xb2=\x02\n+X!\xd8\x1b\xf4Y01\x134\x12$ \x04\x12\x15\x14\x02\x04#\"$\x027\x14\x12\x0432$\x1254\x02$#\"\x04\x02\x05\x11#\x11!2\x16\x15\x14\a\x16\x17\x15\x14\x17\x15#&4'&''36654&##Z\xbb\x01K\x01\x80\x01J\xbb\xb4\xfe\xb5\xc6\xc5\xfe\xb5\xb6s\xa0\x01\x13\xa0\xa1\x01\x14\x9d\x9d\xfe졠\xfe\xec\x9f\x01\xc0\x8d\x01\x14\x99\xa9\x80z\x01\x11\x91\x0e\x03\x10s\xb0\x9cHXNd\x8a\x02\xd9\xca\x01Z\xc7\xc7\xfe\xa6\xca\xc5\xfe\xa8\xd1\xcf\x01XǬ\xfeۦ\xa9\x01\"\xac\xab\x01!\xa7\xa5\xfe\xdc\xf5\xfe\xae\x03Q\x83}{A2\x9a=V&\x10$\xb9\x11`\x04\x80\x02B6I=\x00\x00\x01\x00x\x05!\x03B\x05\xb0\x00\x03\x00\x11\x00\xb0\x01/\xb2\x02\x03\n+X!\xd8\x1b\xf4Y01\x01!5!\x03B\xfd6\x02\xca\x05!\x8f\x00\x02\x00\x82\x03\xc0\x02|\x05\xc4\x00\v\x00\x16\x00/\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb0\fа\f/\xb2\t\x02\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x12\x02\n+X!\xd8\x1b\xf4Y01\x134632\x16\x15\x14\x06#\"&\x172654&#\"\x06\x14\x16\x82\x95jh\x93\x93hi\x96\xff6JJ67KK\x04\xc0h\x9c\x9bij\x96\x96\x16G9:KOlJ\x00\x02\x00a\x00\x00\x03\xf5\x04\xf3\x00\v\x00\x0f\x00F\x00\xb0\t/\xb0\x00EX\xb0\r/\x1b\xb1\r\x10>Y\xb0\t\x10\xb0\x00а\t\x10\xb2\x06\x01\n+X!\xd8\x1b\xf4Y\xb0\x03а\r\x10\xb2\x0e\x01\n+X!\xd8\x1b\xf4Y\xb2\x05\x0e\x06\x11\x129\xb4\v\x05\x1b\x05\x02]01\x01!\x15!\x11#\x11!5!\x113\x01!5!\x02\x89\x01l\xfe\x94\xa7\xfe\u007f\x01\x81\xa7\x01A\xfc\xbd\x03C\x03V\x97\xfeb\x01\x9e\x97\x01\x9d\xfb\r\x98\x00\x00\x01\x00B\x02\x9b\x02\xab\x05\xbb\x00\x16\x00T\xb2\b\x17\x18\x11\x129\x00\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x14>Y\xb2\x16\x02\n+X!\xd8\x1b\xf4Y\xb0\x02в\x03\x0e\x16\x11\x129\xb0\x0e\x10\xb2\b\x02\n+X!\xd8\x1b\xf4Y\xb0\x0e\x10\xb0\vв\x14\x16\x0e\x11\x12901\x01!5\x01654&#\"\x06\x15#46 \x16\x15\x14\x0f\x02!\x02\xab\xfd\xa9\x01,m@\x02\x8f\x02\x9a\x05\xba\x00&\x00\x89\xb2 '(\x11\x129\x00\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x1c>Y\xb0\x00EX\xb0\x19/\x1b\xb1\x19\x14>Y\xb2\x00\x19\x0e\x11\x129\xb0\x00/\xb6o\x00\u007f\x00\x8f\x00\x03]\xb2?\x00\x01q\xb6\x0f\x00\x1f\x00/\x00\x03]\xb2_\x00\x01r\xb0\x0e\x10\xb2\a\x02\n+X!\xd8\x1b\xf4Y\xb2\n\x0e\x19\x11\x129\xb0\x00\x10\xb2&\x04\n+X!\xd8\x1b\xf4Y\xb2\x14&\x00\x11\x129\xb2\x1d\x19\x0e\x11\x129\xb0\x19\x10\xb2 \x02\n+X!\xd8\x1b\xf4Y01\x0132654&#\"\x06\x15#4632\x16\x15\x14\x06\a\x16\x15\x14\x06#\"&53\x14\x1632654'#\x01\tTJH?F9K\x9d\xa3|\x89\x9cFB\x95\xaa\x88\x84\xa6\x9eOCFI\x9cX\x04e=0-:3)b{yh7[\x19)\x8fj}~k-<<3q\x02\x00\x00\x01\x00{\x04\xd8\x02\x1c\x05\xfe\x00\x03\x00#\x00\xb0\x02/\xb2\x0f\x02\x01]\xb0\x00а\x00/\xb4\x0f\x00\x1f\x00\x02]\xb0\x02\x10\xb0\x03\xd0\x19\xb0\x03/\x1801\x013\x01#\x01<\xe0\xfe\xf4\x95\x05\xfe\xfe\xda\x00\x00\x01\x00\x9a\xfe`\x03\xee\x04:\x00\x12\x00P\xb2\r\x13\x14\x11\x129\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x18>Y\xb0\x00EX\xb0\a/\x1b\xb1\a\x18>Y\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x12>Y\xb0\x00EX\xb0\r/\x1b\xb1\r\x10>Y\xb2\x04\x01\n+X!\xd8\x1b\xf4Y\xb2\v\a\r\x11\x12901\x01\x11\x16\x16327\x113\x11#'\x06#\"'\x11#\x11\x01S\x01gt\xc7>\xba\xa7\t]\xaa\x93Q\xb9\x04:\xfd\x87\xa3\x9c\x98\x03 \xfb\xc6s\x87I\xfe+\x05\xda\x00\x01\x00C\x00\x00\x03@\x05\xb0\x00\n\x00+\xb2\x02\v\f\x11\x129\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x01\x00\b\x11\x12901!\x11#\"$54$3!\x11\x02\x86T\xe6\xfe\xf7\x01\n\xe6\x01\r\x02\b\xfe\xd6\xd5\xff\xfaP\x00\x00\x01\x00\x93\x02k\x01y\x03I\x00\t\x00\x16\xb2\x03\n\v\x11\x129\x00\xb0\x02/\xb1\b\n+X\xd8\x1b\xdcY01\x13462\x16\x15\x14\x06\"&\x939r;;r9\x02\xd90@@0/??\x00\x01\x00t\xfeM\x01\xaa\x00\x00\x00\x0e\x00A\xb2\x05\x0f\x10\x11\x129\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x12>Y\xb4\x13\x06#\x06\x02]\xb2\x01\x06\x00\x11\x129\xb1\a\n+X\xd8\x1b\xdcY\xb0\x01\x10\xb0\r\xd001!\a\x16\x15\x14\x06#'2654&'7\x01\x1d\f\x99\xa0\x8f\aOW@b 4\x1b\x92aqk4/,*\t\x86\x00\x01\x00z\x02\xa2\x01\xef\x05\xb7\x00\x06\x00@\xb2\x01\a\b\x11\x129\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x14>Y\xb2\x04\x00\x05\x11\x129\xb0\x04/\xb2\x03\x02\n+X!\xd8\x1b\xf4Y\xb2\x02\x03\x05\x11\x12901\x01#\x11\a5%3\x01\xef\x9d\xd8\x01c\x12\x02\xa2\x02Y9\x80u\x00\x00\x02\x00z\x02\xb2\x03'\x05\xc4\x00\f\x00\x1a\x00@\xb2\x03\x1b\x1c\x11\x129\xb0\x03\x10\xb0\x10\xd0\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb2\n\x1b\x03\x11\x129\xb0\n/\xb2\x10\x03\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x17\x03\n+X!\xd8\x1b\xf4Y01\x134632\x16\x15\x15\x14\x06 &5\x17\x14\x16326554&#\"\x06\az\xbc\x9a\x9b\xbc\xbb\xfe̾\xa3aTS_aSQ`\x02\x04c\x9e\xc3\xc1\xa6J\x9f\xc2¥\x06drseNcrna\x00\xff\xff\x00f\x00\x98\x03x\x03\xb5\x00&\x00\x9b\r\x00\x00\a\x00\x9b\x01j\x00\x00\xff\xff\x00U\x00\x00\x05\x91\x05\xad\x00'\x00\xa2\xff\xdb\x02\x98\x00'\x00\x9c\x01\x18\x00\b\x01\a\x00\xa5\x02\xd6\x00\x00\x00\x10\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y01\xff\xff\x00P\x00\x00\x05\xc9\x05\xad\x00'\x00\x9c\x00\xec\x00\b\x00'\x00\xa2\xff\xd6\x02\x98\x01\a\x00\xa3\x03\x1e\x00\x00\x00\x10\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x1c>Y01\xff\xff\x00o\x00\x00\x05\xed\x05\xbb\x00'\x00\x9c\x01\x97\x00\b\x00'\x00\xa5\x032\x00\x00\x01\a\x00\xa4\x001\x02\x9b\x00\x10\x00\xb0\x00EX\xb0!/\x1b\xb1!\x1c>Y01\x00\x02\x00D\xfe\u007f\x03x\x04M\x00\x18\x00\"\x00W\xb2\t#$\x11\x129\xb0\t\x10\xb0\x1c\xd0\x00\xb0\x10/\xb0\x00EX\xb0!/\x1b\xb1!\x18>Y\xb2\x00\x10!\x11\x129\xb2\x03\x10\x00\x11\x129\xb0\x10\x10\xb2\t\x01\n+X!\xd8\x1b\xf4Y\xb0\x10\x10\xb0\fв\x15\x00\x10\x11\x129\xb0!\x10\xb2\x1b\x05\n+X!\xd8\x1b\xf4Y01\x01\x0e\x03\a\a\x14\x1632653\x06\x06#\"&547765\x13\x14\x06\"&5462\x16\x02L\x01)`\xb8\v\x02tmd}\xb9\x02\xe1\xb7\xc4֠mB\xc17l88l7\x02\xa8j\u007fv\xc1c%msq[\xa1\xccɳ\xad\xafqN\x92\x01=->>-,<<\x00\x02\xff\xf2\x00\x00\aW\x05\xb0\x00\x0f\x00\x12\x00w\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb2\x11\x06\x00\x11\x129\xb0\x11/\xb2\x02\x01\n+X!\xd8\x1b\xf4Y\xb0\x06\x10\xb2\b\x01\n+X!\xd8\x1b\xf4Y\xb2\v\x00\x06\x11\x129\xb0\v/\xb2\f\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb2\x0e\x01\n+X!\xd8\x1b\xf4Y\xb2\x12\x06\x00\x11\x12901!!\x03!\x03#\x01!\x15!\x13!\x15!\x13!\x01!\x03\aW\xfc\x8d\x0f\xfd\xcc\xcd\xe2\x03p\x03\xb7\xfdM\x14\x02N\xfd\xb8\x16\x02\xc1\xfa\xaf\x01\xc8\x1f\x01a\xfe\x9f\x05\xb0\x98\xfe)\x97\xfd\xed\x01x\x02\xdd\x00\x01\x00Y\x00\xce\x03\xdd\x04c\x00\v\x008\x00\xb0\x03/\xb2\t\f\x03\x11\x129\xb0\t/\xb2\n\t\x03\x11\x129\xb2\x04\x03\t\x11\x129\xb2\x01\n\x04\x11\x129\xb0\x03\x10\xb0\x05в\a\x04\n\x11\x129\xb0\t\x10\xb0\v\xd001\x13\x01\x017\x01\x01\x17\x01\x01\a\x01\x01Y\x01J\xfe\xb8w\x01I\x01Iw\xfe\xb8\x01Jw\xfe\xb5\xfe\xb5\x01I\x01P\x01O{\xfe\xb1\x01O{\xfe\xb1\xfe\xb0{\x01Q\xfe\xaf\x00\x00\x03\x00v\xff\xa3\x05\x1d\x05\xec\x00\x17\x00 \x00)\x00f\xb2\x04*+\x11\x129\xb0\x04\x10\xb0\x1dа\x04\x10\xb0&\xd0\x00\xb0\x00EX\xb0\x10/\x1b\xb1\x10\x1c>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb2\x1a\x10\x04\x11\x129\xb2#\x10\x04\x11\x129\xb0#\x10\xb0\x1bа\x10\x10\xb2\x1d\x01\n+X!\xd8\x1b\xf4Y\xb0\x1a\x10\xb0$а\x04\x10\xb2&\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x02\x04#\"'\a#7&\x1154\x12$32\x1773\a\x16\x13\x05\x14\x17\x01&#\"\x02\a\x054'\x01\x1632\x127\x05\t\x90\xfe\xf8\xb0\xab\x83a\x8e\x90\xbe\x92\x01\v\xac֔g\x8d\x9f\x89\x02\xfc,b\x024f\xa6\xb6\xd1\x03\x03\x158\xfd\xdb[y\xba\xcc\x03\x02\xa9\xd6\xfe\xc1\xa8R\x9b\xe7\xc0\x01hS\xd2\x01B\xab}\xa5\xff\xbb\xfe\xdac\xf4\x8d\x03\x88o\xfe\xeb\xf6\r\xb6\x83\xfc\x8f@\x01\x0f\xfd\x00\x02\x00\xa6\x00\x00\x04]\x05\xb0\x00\r\x00\x16\x00W\xb2\t\x17\x18\x11\x129\xb0\t\x10\xb0\x10\xd0\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1c>Y\xb0\x00EX\xb0\v/\x1b\xb1\v\x10>Y\xb2\x01\x00\v\x11\x129\xb0\x01/\xb2\x10\x00\v\x11\x129\xb0\x10/\xb2\t\x01\n+X!\xd8\x1b\xf4Y\xb0\x01\x10\xb2\x0e\x01\n+X!\xd8\x1b\xf4Y01\x01\x11!2\x16\x16\x15\x14\x04#!\x11#\x11\x13\x11!2654&'\x01`\x01\x17\x93\xdcw\xfe\xf8\xe3\xfe\ueeba\x01\x15\x8e\xa0\xa0\x88\x05\xb0\xfe\xdbi\xc2~\xc2\xe7\xfe\xc7\x05\xb0\xfeC\xfdޗx{\x97\x01\x00\x01\x00\x8b\xff\xec\x04j\x06\x12\x00*\x00i\xb2!+,\x11\x129\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1e>Y\xb0\x00EX\xb0\x13/\x1b\xb1\x13\x10>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\n\x13\x05\x11\x129\xb2\x0e\x05\x13\x11\x129\xb0\x13\x10\xb2\x1a\x01\n+X!\xd8\x1b\xf4Y\xb2 \x13\x05\x11\x129\xb2#\x05\x13\x11\x129\xb0\x05\x10\xb2(\x01\n+X!\xd8\x1b\xf4Y01!#\x114632\x16\x15\x14\x06\x15\x14\x1e\x02\x15\x14\x06#\"&'7\x16\x1632654.\x0254654&#\"\x11\x01D\xb9Ϻ\xb4ŀK\xbcV˶Q\xb5&+1\x875kqJ\xbdW\x8bhX\xda\x04W\xd0볟}\xcbE3_\x90\x88L\x9f\xb2,\x1c\x9b ,^R4`\x93\x8aQY\xcfT^k\xfe\xdb\x00\x03\x00N\xff\xec\x06|\x04N\x00*\x005\x00=\x00Ʋ\x02>?\x11\x129\xb0\x02\x10\xb0.а\x02\x10\xb09\xd0\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb0\x00EX\xb0\x1d/\x1b\xb1\x1d\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x10>Y\xb2\x02\x1d\x00\x11\x129\xb2\f\x05\x17\x11\x129\xb0\f/\xb4\xbf\f\xcf\f\x02]\xb0\x17\x10\xb2\x10\x01\n+X!\xd8\x1b\xf4Y\xb2\x13\f\x17\x11\x129\xb2\x1a\x1d\x00\x11\x129\xb2:\x1d\x00\x11\x129\xb0:/\xb4\xbf:\xcf:\x02]\xb2!\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb2%\x01\n+X!\xd8\x1b\xf4Y\xb2(\x1d\x00\x11\x129\xb0+а\f\x10\xb2/\x01\n+X!\xd8\x1b\xf4Y\xb0\x10\x10\xb06\xd001\x05 '\x06\x06#\"&5463354&#\"\x06\x15'4632\x16\x176632\x12\x15\x15!\x16\x163277\x17\x06%2675#\x06\x06\x15\x14\x16\x01\"\x06\a!54&\x04\xee\xfe\xfb\x88A⍧\xbc\xe3\xdd\xdfnhi\x8c\xb8\xf2\xbbs\xb02?\xaei\xd2\xe8\xfd(\a\xae\x95\x94y/@\x9e\xfc\tH\x9e2\xe4u\x8cj\x03Ps\x95\x11\x02\x1a\x86\x14\xb4V^\xad\x97\x9d\xaeUk{nQ\x13\x8f\xb5SSOW\xfe\xff\xe9s\xb0\xbfL\x1f\x88y\x96J6\xed\x02nSM]\x034\xab\x8b\x1f\x84\x93\x00\x00\x02\x00~\xff\xec\x04-\x06,\x00\x1d\x00+\x00T\xb2\a,-\x11\x129\xb0\a\x10\xb0(\xd0\x00\xb0\x00EX\xb0\x19/\x1b\xb1\x19\x1e>Y\xb0\x00EX\xb0\a/\x1b\xb1\a\x10>Y\xb2\x0f\x19\a\x11\x129\xb0\x0f/\xb2\x11\x19\a\x11\x129\xb2\"\x01\n+X!\xd8\x1b\xf4Y\xb0\a\x10\xb2(\x01\n+X!\xd8\x1b\xf4Y01\x01\x12\x11\x15\x14\x06\x06#\"&&546632\x17&'\a'7&'7\x16\x177\x17\x03'&&#\"\x06\x15\x14\x163265\x034\xf9u؆\x87\xdcypρ\xa3y0\x8d\xdaI\xc0\x84\xb79ﯽIh\x02!\x8b\\\x91\xa2\xa7\x80}\x99\x05\x15\xfe\xf8\xfeg]\x9e\xfd\x90\x81\xe0\x86\x93\xe9\x82rÍ\x94c\x83[1\x9f6\x8b\x81d\xfc\xf38=I\xbf\xa7\x8c\xc4\xe2\xb8\x00\x00\x03\x00G\x00\xac\x04-\x04\xba\x00\x03\x00\r\x00\x17\x00N\xb2\a\x18\x19\x11\x129\xb0\a\x10\xb0\x00а\a\x10\xb0\x11\xd0\x00\xb0\x02/\xb2\x01\x01\n+X!\xd8\x1b\xf4Y\xb0\x02\x10\xb1\f\n+X\xd8\x1b\xdcY\xb1\x06\n+X\xd8\x1b\xdcY\xb0\x01\x10\xb1\x10\n+X\xd8\x1b\xdcY\xb1\x16\n+X\xd8\x1b\xdcY01\x01!5!\x01462\x16\x15\x14\x06\"&\x11462\x16\x15\x14\x06\"&\x04-\xfc\x1a\x03\xe6\xfd\xa09r;;r99r;;r9\x02X\xb8\x01:0@@0/>>\xfc\xfe0@@0.??\x00\x00\x03\x00[\xffz\x044\x04\xb8\x00\x15\x00\x1d\x00&\x00c\xb2\x04'(\x11\x129\xb0\x04\x10\xb0\x1bа\x04\x10\xb0#\xd0\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb0\x00EX\xb0\x0f/\x1b\xb1\x0f\x10>Y\xb2#\x01\n+X!\xd8\x1b\xf4Y\xb2!#\x04\x11\x129\xb0!\x10\xb0\x18а\x04\x10\xb2\x1b\x01\n+X!\xd8\x1b\xf4Y\xb2\x19\x1b\x0f\x11\x129\xb0\x19\x10\xb0 \xd001\x1346632\x1773\a\x16\x11\x14\x06\x06#\"'\a#7&\x13\x14\x17\x01&#\"\x06\x054'\x01\x163265[{\xe1\x8fn^I|f\xc3|\xe0\x90hVJ|d\u0379a\x01W>H\x8a\xa8\x02fW\xfe\xac7B\x8b\xa7\x02'\x9f\xfd\x8b*\x94͚\xfe\xc0\x9e\xfe\x89#\x95˕\x017\xc2o\x02\xb6 ڵ\xb6o\xfdP\x19۹\x00\x02\x00\x95\xfe`\x04'\x06\x00\x00\x0f\x00\x1a\x00d\xb2\x18\x1b\x1c\x11\x129\xb0\x18\x10\xb0\f\xd0\x00\xb0\b/\xb0\x00EX\xb0\f/\x1b\xb1\f\x18>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x12>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb2\x05\f\x03\x11\x129\xb2\n\f\x03\x11\x129\xb0\f\x10\xb2\x13\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y01\x01\x14\x02#\"'\x11#\x113\x11632\x12\x11'4&#\"\a\x11\x16326\x04'\xe2\xc1\xc5q\xb9\xb9q\xc2\xc3㹜\x88\xa8TS\xab\x85\x9d\x02\x11\xf7\xfe\xd2}\xfd\xf7\a\xa0\xfdʄ\xfe\xda\xfe\xfa\x04\xb7ԕ\xfd\xfb\x94\xd3\x00\x00\x01\x00\x9b\x00\x00\x01U\x04:\x00\x03\x00\x1d\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y01!#\x113\x01U\xba\xba\x04:\x00\x00\x02\x00h\xff\xeb\a\t\x05\xc4\x00\x17\x00#\x00\x91\xb2\x01$%\x11\x129\xb0\x01\x10\xb0\x1a\xd0\x00\xb0\x00EX\xb0\f/\x1b\xb1\f\x1c>Y\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x10>Y\xb0\x0e\x10\xb2\x10\x01\n+X!\xd8\x1b\xf4Y\xb2\x13\x00\x0e\x11\x129\xb0\x13/\xb2\x14\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb2\x16\x01\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x18\x01\n+X!\xd8\x1b\xf4Y\xb0\f\x10\xb2\x1d\x01\n+X!\xd8\x1b\xf4Y01!!\x06#\"&\x02'\x114\x12632\x17!\x15!\x11!\x15!\x11!\x0527\x11&#\"\x06\a\x11\x14\x16\a\t\xfc\xb0\xb2r\xa2\xfe\x8c\x01\x8b\xfe\xa2|\xaa\x03F\xfd-\x02w\xfd\x89\x02\xdd\xfb\x8cqfml\xad\xc2\x02\xc3\x15\x96\x01\x0f\xab\x015\xac\x01\x11\x97\x14\x9e\xfe,\x9d\xfd\xfc\x1b\x0e\x04\x8e\x0f\xe5\xcf\xfe\xc7\xd3\xeb\x00\x00\x03\x00a\xff\xec\a\x00\x04N\x00 \x00,\x004\x00\x96\xb2\x0656\x11\x129\xb0\x06\x10\xb0&а\x06\x10\xb00\xd0\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb0\x00EX\xb0\n/\x1b\xb1\n\x18>Y\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x10>Y\xb0\x00EX\xb0\x1d/\x1b\xb1\x1d\x10>Y\xb2\a\n\x17\x11\x129\xb21\n\x17\x11\x129\xb01/\xb2\x0e\x01\n+X!\xd8\x1b\xf4Y\xb0\x17\x10\xb2\x12\x01\n+X!\xd8\x1b\xf4Y\xb2\x14\n\x17\x11\x129\xb2\x1a\n\x17\x11\x129\xb0$а\x04\x10\xb2*\x01\n+X!\xd8\x1b\xf4Y\xb0-\xd001\x1346632\x16\x176632\x16\x15\x15!\x16\x16327\x17\x06#\"&'\x06\x06#\"\x005\x17\x14\x1632654&#\"\x06%\"\x06\a!54&ayێ\x89\xc9=A\xc4p\xcf\xea\xfd2\a\xa4\x86\xbcxJ\x89\xf5\x87\xcd?>dž\xdc\xfe\xf8\xb9\xa0\x8b\x89\xa0\xa1\x8a\x87\xa2\x04-c\x96\x16\x02\x0e\x89\x02'\xa0\xfe\x89udfs\xfe\xebt\xaa\xc5l~\x84pdcq\x010\xfe\t\xb7\xd8\xd7ζ\xd9\xd6֣\x8a\x1a}\x96\x00\x00\x01\x00\xa9\x04\xe4\x03\x06\x06\x00\x00\b\x004\x00\xb0\x04/\xb0\aа\a/\xb4\x0f\a\x1f\a\x02]\xb2\x05\x04\a\x11\x129\x19\xb0\x05/\x18\xb0\x01\xd0\x19\xb0\x01/\x18\xb0\x04\x10\xb0\x02в\x03\x04\a\x11\x12901\x01\x15#'\a#5\x133\x03\x06\x99\x96\x95\x99\xf6p\x04\xee\n\xaa\xaa\f\x01\x10\x00\x00\x02\x00y\x04\xb4\x02'\x06P\x00\t\x00\x14\x00*\xb2\x03\x15\x16\x11\x129\xb0\x03\x10\xb0\r\xd0\x00\xb0\x03/\xb0\aа\a/\xb2?\a\x01]\xb0\x03\x10\xb0\rа\a\x10\xb0\x12\xd001\x01\x14\x06#\"&462\x16\x05\x14\x163264&#\"\x06\x02'|[\\{{\xb8{\xfe\xb5C10DC12B\x05\x80Wuv\xaczzV/DBbEF\x00\x00\x01\x00{\x04\xd9\x03>\x05\xe8\x00\x17\x00>\x00\xb0\x03/\xb0\bа\b/\xb4\x0f\b\x1f\b\x02]\xb0\x03\x10\xb0\vа\v/\xb0\b\x10\xb2\x0f\x03\n+X!\xd8\x1b\xf4Y\xb0\x03\x10\xb2\x14\x03\n+X!\xd8\x1b\xf4Y\xb0\x0f\x10\xb0\x17\xd001\x01\x14\x06#\".\x02#\"\x06\x15'4632\x1e\x023265\x03>{\\)\r?1\ak\x8c\x14:\x12D-\xff\xff\x00\xa2\x02\x8b\x04\x8d\x03\"\x00F\x00\x9f\xd9\x00L\xcd@\x00\xff\xff\x00\x90\x02\x8b\x05\xc9\x03\"\x00F\x00\x9f\x84\x00ff@\x00\x00\x01\x00`\x041\x01x\x06\x13\x00\b\x00!\xb2\b\t\n\x11\x129\x00\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x1e>Y\xb2\x05\t\x00\x11\x129\xb0\x05/01\x01\x17\x06\a\x15#546\x01\x0ej]\x03\xb8a\x06\x13H\u007f\x93\x88tf\xc8\x00\x01\x000\x04\x16\x01G\x06\x00\x00\b\x00!\xb2\b\t\n\x11\x129\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1e>Y\xb2\x00\t\x04\x11\x129\xb0\x00/01\x13'6753\x15\x06\x06\x99i]\x03\xb7\x01a\x04\x16H\x82\x90\x90\x82d\xc7\x00\x01\x00$\xfe\xe5\x01;\x00\xb5\x00\b\x00\x1e\xb2\b\t\n\x11\x129\x00\xb0\t/\xb2\x04\x05\n+X!\xd8\x1b\xf4Y\xb0\x00а\x00/01\x13'6753\x15\x14\x06\x8di[\x03\xb9c\xfe\xe5I\u007f\x92vde\xca\xff\xff\x00h\x041\x02\xbb\x06\x13\x00&\x00\x93\b\x00\x00\a\x00\x93\x01C\x00\x00\xff\xff\x00<\x04\x16\x02\x86\x06\x00\x00&\x00\x94\f\x00\x00\a\x00\x94\x01?\x00\x00\x00\x02\x00$\xfe\xd3\x02d\x00\xf6\x00\b\x00\x11\x000\xb2\n\x12\x13\x11\x129\xb0\n\x10\xb0\x05\xd0\x00\xb0\x12/\xb2\x04\x05\n+X!\xd8\x1b\xf4Y\xb0\x00а\x00/\xb0\tа\t/\xb0\x04\x10\xb0\r\xd001\x13'6753\x15\x14\x06\x17'6753\x15\x14\x06\x8di[\x03\xb9c\xddi[\x03\xbaa\xfe\xd3H\x89\x99\xb9\xa4l\xd3@H\x89\x99\xb9\xa4k\xd1\x00\x00\x01\x00\x8a\x02\x17\x02\"\x03\xcb\x00\r\x00\x16\xb2\n\x0e\x0f\x11\x129\x00\xb0\x03/\xb1\n\n+X\xd8\x1b\xdcY01\x134632\x16\x15\x15\x14\x06#\"&5\x8ao\\[rn^]o\x03\x04Wpm]%WnoX\x00\x01\x00l\x00\x99\x02 \x03\xb5\x00\x06\x00\x10\x00\xb0\x05/\xb2\x02\a\x05\x11\x129\xb0\x02/01\x01\x01#\x015\x013\x01\x1e\x01\x02\x8d\xfe\xd9\x01'\x8d\x02&\xfes\x01\x84\x13\x01\x85\x00\x01\x00Y\x00\x98\x02\x0e\x03\xb5\x00\x06\x00\x10\x00\xb0\x00/\xb2\x03\a\x00\x11\x129\xb0\x03/01\x13\x01\x15\x01#\x01\x01\xe7\x01'\xfeَ\x01\x02\xfe\xfe\x03\xb5\xfe{\x13\xfe{\x01\x8e\x01\x8f\x00\x01\x00;\x00n\x03j\x05\"\x00\x03\x00\t\x00\xb0\x00/\xb0\x02/017'\x01\x17\xa3h\x02\xc7hnB\x04rB\x00\xff\xff\x006\x02\x90\x02\xbb\x05\xa5\x03\a\x00\xa5\x00\x00\x02\x90\x00\x13\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x1c>Y\xb0\r\xd001\x00\x00\x01\x00_\xff\xec\x04\x1c\x05\xc4\x00#\x00\x87\xb2\x15$%\x11\x129\x00\xb0\x00EX\xb0\x16/\x1b\xb1\x16\x1c>Y\xb0\x00EX\xb0\t/\x1b\xb1\t\x10>Y\xb2#\t\x16\x11\x129\xb0#/\xb2\x00\x02\n+X!\xd8\x1b\xf4Y\xb0\t\x10\xb2\x04\x01\n+X!\xd8\x1b\xf4Y\xb0\x00\x10\xb0\fа#\x10\xb0\x0fа#\x10\xb0\x1fа\x1f/\xb6\x0f\x1f\x1f\x1f/\x1f\x03]\xb2 \x02\n+X!\xd8\x1b\xf4Y\xb0\x10а\x1f\x10\xb0\x13а\x16\x10\xb2\x1b\x01\n+X!\xd8\x1b\xf4Y01\x01!\x16\x16327\x17\x06#\"\x00\x03#535#53\x12\x0032\x17\a&#\"\x06\a!\x15!\x15!\x03Q\xfe\x80\x04\xb4\xa5tf\x14xx\xf8\xfe\xe3\x06\xb2\xb2\xb2\xb2\n\x01\x1d\xf3j\x87\x14mn\xa4\xb1\x06\x01\u007f\xfe\x80\x01\x80\x02\x1d\xc3\xd2\"\xa0\x1e\x01%\x01\f|\x89}\x01\x06\x01\x1f\x1f\xa2#˼}\x89\x00\x01\x00\xa8\x02\x8b\x03\xeb\x03\"\x00\x03\x00\x1b\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x16>Y\xb2\x01\x01\n+X!\xd8\x1b\xf4Y01\x01!5!\x03\xeb\xfc\xbd\x03C\x02\x8b\x97\x00\x02\x00\x1f\x00\x00\x03\xcd\x06\x15\x00\x15\x00\x19\x00\x83\xb2\b\x1a\x1b\x11\x129\xb0\b\x10\xb0\x17\xd0\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x1e>Y\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb0\x00EX\xb0\x11/\x1b\xb1\x11\x18>Y\xb0\x00EX\xb0\x18/\x1b\xb1\x18\x18>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb0\x00EX\xb0\x16/\x1b\xb1\x16\x10>Y\xb0\x03\x10\xb2\x01\x01\n+X!\xd8\x1b\xf4Y\xb0\b\x10\xb2\r\x01\n+X!\xd8\x1b\xf4Y\xb0\x01\x10\xb0\x13а\x14\xd0013\x11#5354632\x17\a&#\"\x06\x15\x153\x15#\x11!#\x113ʫ\xabϽp\xab\x1f}qwi\xdd\xdd\x02I\xba\xba\x03\xab\x8f\\\xb5\xca=\x9c2kk^\x8f\xfcU\x04:\x00\x01\x00<\x00\x00\x03\xe9\x06\x15\x00\x16\x00\\\x00\xb0\x00EX\xb0\x12/\x1b\xb1\x12\x1e>Y\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x18>Y\xb0\x00EX\xb0\t/\x1b\xb1\t\x10>Y\xb0\x00EX\xb0\x16/\x1b\xb1\x16\x10>Y\xb0\x12\x10\xb2\x02\x01\n+X!\xd8\x1b\xf4Y\xb0\x06\x10\xb2\a\x01\n+X!\xd8\x1b\xf4Y\xb0\vа\x06\x10\xb0\x0e\xd001\x01&#\"\x15\x153\x15#\x11#\x11#5356632\x05\x11#\x030|L\xc8\xe7繫\xab\x01\xc0\xb1e\x01+\xb9\x05c\x14\xd2k\x8f\xfcU\x03\xab\x8fv\xad\xb8=\xfa(\x00\x00\x01\x00z\x00\x00\x01\xef\x03\x15\x00\x06\x005\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x16>Y\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x10>Y\xb2\x04\x05\x01\x11\x129\xb0\x04/\xb2\x03\x02\n+X!\xd8\x1b\xf4Y\xb0\x02\xd001!#\x11\a5%3\x01\xef\x9d\xd8\x01c\x12\x02Y9\x80u\x00\x01\x00B\x00\x00\x02\xab\x03 \x00\x16\x00T\xb2\b\x17\x18\x11\x129\x00\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x16>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x15\x02\n+X!\xd8\x1b\xf4Y\xb0\x02в\x14\x15\x0e\x11\x129\xb2\x03\x0e\x14\x11\x129\xb0\x0e\x10\xb2\b\x02\n+X!\xd8\x1b\xf4Y\xb0\x0e\x10\xb0\v\xd001!!5\x01654&#\"\x06\x15#46 \x16\x15\x14\x0f\x02!\x02\xab\xfd\xa9\x01,m@\xff\xf5\x02\x9a\x03 \x00&\x00q\x00\xb0\x00EX\xb0\x0e/\x1b\xb1\x0e\x16>Y\xb0\x00EX\xb0\x19/\x1b\xb1\x19\x10>Y\xb2\x00\x19\x0e\x11\x129|\xb0\x00/\x18\xb6\x80\x00\x90\x00\xa0\x00\x03]\xb0\x0e\x10\xb2\a\x02\n+X!\xd8\x1b\xf4Y\xb2\n\x00\a\x11\x129\xb0\x00\x10\xb2&\x02\n+X!\xd8\x1b\xf4Y\xb2\x14&\x00\x11\x129\xb0\x19\x10\xb2 \x02\n+X!\xd8\x1b\xf4Y\xb2\x1d& \x11\x12901\x0132654&#\"\x06\x15#4632\x16\x15\x14\x06\a\x16\x15\x14\x06#\"&53\x14\x1632654'#\x01\tTJH?F9K\x9d\xa3|\x89\x9cFB\x95\xaa\x88\x84\xa6\x9eOCFI\x9cX\x01\xcb=0-:3)b{yh7[\x19)\x8fj}~k-<<3q\x02\x00\x00\x02\x006\x00\x00\x02\xbb\x03\x15\x00\n\x00\x0e\x00I\x00\xb0\x00EX\xb0\t/\x1b\xb1\t\x16>Y\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x10>Y\xb2\x01\t\x04\x11\x129\xb0\x01/\xb2\x02\x02\n+X!\xd8\x1b\xf4Y\xb0\x06а\x01\x10\xb0\vв\b\v\x06\x11\x129\xb2\r\t\x04\x11\x12901\x013\x15#\x15#5!'\x013\x013\x11\a\x02Pkk\x9d\xfe\x89\x06\x01y\xa1\xfe\x84\xdf\x11\x01+\x82\xa9\xa9f\x02\x06\xfe\x16\x01!\x1c\xff\xff\x00%\x02\x1f\x02\r\x02\xb6\x02\x06\x00\x11\x00\x00\x00\x02\x00%\x00\x00\x04\xe4\x05\xb0\x00\x0f\x00\x1d\x00f\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb0\x00EX\xb0\x00/\x1b\xb1\x00\x10>Y\xb2\x04\x00\x05\x11\x129\xb0\x04/\xb2\xcf\x04\x01]\xb2/\x04\x01]\xb2\x9f\x04\x01q\xb2\x01\x01\n+X!\xd8\x1b\xf4Y\xb0\x11а\x00\x10\xb2\x12\x01\n+X!\xd8\x1b\xf4Y\xb0\x05\x10\xb2\x1b\x01\n+X!\xd8\x1b\xf4Y\xb0\x04\x10\xb0\x1c\xd0013\x11#53\x11!2\x04\x12\x17\x15\x14\x02\x04\a\x13!\x1132\x12754\x02'#\x11!Ǣ\xa2\x01\x9b\xbe\x01$\x9f\x01\x9f\xfe\xd9\xc4G\xfe\xe6\xc9\xde\xf7\x01\xe9\xd6\xe0\x01\x1a\x02\x9a\x97\x02\u007f\xa8\xfe\xca\xc9]\xce\xfeʦ\x02\x02\x9a\xfe\x03\x01\x12\xf9]\xf8\x01\x13\x02\xfe\x1f\x00\xff\xff\x00\x1c\x00\x00\x05\x1d\a4\x02&\x00%\x00\x00\x01\a\x00D\x010\x016\x00\x14\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb1\f\b\xf401\xff\xff\x00\x1c\x00\x00\x05\x1d\a4\x02&\x00%\x00\x00\x01\a\x00u\x01\xbf\x016\x00\x14\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb1\r\b\xf401\xff\xff\x00\x1c\x00\x00\x05\x1d\a6\x02&\x00%\x00\x00\x01\a\x00\x8e\x00\xc9\x016\x00\x14\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb1\x0f\x06\xf401\xff\xff\x00\x1c\x00\x00\x05\x1d\a\"\x02&\x00%\x00\x00\x01\a\x00\x90\x00\xc5\x01:\x00\x14\x00\xb0\x00EX\xb0\x05/\x1b\xb1\x05\x1c>Y\xb1\x0e\x04\xf401\xff\xff\x00\x1c\x00\x00\x05\x1d\x06\xfb\x02&\x00%\x00\x00\x01\a\x00j\x00\xf9\x016\x00\x17\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb1\x11\x04\xf4\xb0\x1b\xd001\x00\xff\xff\x00\x1c\x00\x00\x05\x1d\a\x91\x02&\x00%\x00\x00\x01\a\x00\x8f\x01P\x01A\x00\x17\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x1c>Y\xb1\x0e\x06\xf4\xb0\x18\xd001\x00\xff\xff\x00w\xfeD\x04\xd8\x05\xc4\x02&\x00'\x00\x00\x00\a\x00y\x01\xd2\xff\xf7\xff\xff\x00\xa9\x00\x00\x04F\a@\x02&\x00)\x00\x00\x01\a\x00D\x00\xfb\x01B\x00\x14\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb1\r\b\xf401\xff\xff\x00\xa9\x00\x00\x04F\a@\x02&\x00)\x00\x00\x01\a\x00u\x01\x8a\x01B\x00\x14\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb1\x0e\b\xf401\xff\xff\x00\xa9\x00\x00\x04F\aB\x02&\x00)\x00\x00\x01\a\x00\x8e\x00\x94\x01B\x00\x14\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb1\x10\x06\xf401\xff\xff\x00\xa9\x00\x00\x04F\a\a\x02&\x00)\x00\x00\x01\a\x00j\x00\xc4\x01B\x00\x17\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb1\x12\x04\xf4\xb0\x1b\xd001\x00\xff\xff\xff\xe0\x00\x00\x01\x81\a@\x02&\x00-\x00\x00\x01\a\x00D\xff\xa7\x01B\x00\x14\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y\xb1\x05\b\xf401\xff\xff\x00\xb0\x00\x00\x02Q\a@\x02&\x00-\x00\x00\x01\a\x00u\x005\x01B\x00\x14\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x1c>Y\xb1\x06\b\xf401\xff\xff\xff\xe9\x00\x00\x02F\aB\x02&\x00-\x00\x00\x01\a\x00\x8e\xff@\x01B\x00\x14\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y\xb1\b\x06\xf401\xff\xff\xff\xd6\x00\x00\x02_\a\a\x02&\x00-\x00\x00\x01\a\x00j\xffp\x01B\x00\x17\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x1c>Y\xb1\n\x04\xf4\xb0\x14\xd001\x00\xff\xff\x00\xa9\x00\x00\x05\b\a\"\x02&\x002\x00\x00\x01\a\x00\x90\x00\xfb\x01:\x00\x14\x00\xb0\x00EX\xb0\x06/\x1b\xb1\x06\x1c>Y\xb1\r\x04\xf401\xff\xff\x00v\xff\xec\x05\t\a6\x02&\x003\x00\x00\x01\a\x00D\x01R\x018\x00\x14\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb1!\b\xf401\xff\xff\x00v\xff\xec\x05\t\a6\x02&\x003\x00\x00\x01\a\x00u\x01\xe1\x018\x00\x14\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb1\"\b\xf401\xff\xff\x00v\xff\xec\x05\t\a8\x02&\x003\x00\x00\x01\a\x00\x8e\x00\xeb\x018\x00\x14\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb1\"\x06\xf401\xff\xff\x00v\xff\xec\x05\t\a$\x02&\x003\x00\x00\x01\a\x00\x90\x00\xe7\x01<\x00\x14\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb1#\x04\xf401\xff\xff\x00v\xff\xec\x05\t\x06\xfd\x02&\x003\x00\x00\x01\a\x00j\x01\x1b\x018\x00\x17\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x1c>Y\xb1'\x04\xf4\xb00\xd001\x00\xff\xff\x00\x8c\xff\xec\x04\xaa\a4\x02&\x009\x00\x00\x01\a\x00D\x01+\x016\x00\x14\x00\xb0\x00EX\xb0\n/\x1b\xb1\n\x1c>Y\xb1\x14\b\xf401\xff\xff\x00\x8c\xff\xec\x04\xaa\a4\x02&\x009\x00\x00\x01\a\x00u\x01\xba\x016\x00\x14\x00\xb0\x00EX\xb0\x12/\x1b\xb1\x12\x1c>Y\xb1\x15\b\xf401\xff\xff\x00\x8c\xff\xec\x04\xaa\a6\x02&\x009\x00\x00\x01\a\x00\x8e\x00\xc4\x016\x00\x14\x00\xb0\x00EX\xb0\n/\x1b\xb1\n\x1c>Y\xb1\x17\x06\xf401\xff\xff\x00\x8c\xff\xec\x04\xaa\x06\xfb\x02&\x009\x00\x00\x01\a\x00j\x00\xf4\x016\x00\x17\x00\xb0\x00EX\xb0\n/\x1b\xb1\n\x1c>Y\xb1\x19\x04\xf4\xb0#\xd001\x00\xff\xff\x00\x0f\x00\x00\x04\xbb\a4\x02&\x00=\x00\x00\x01\a\x00u\x01\x88\x016\x00\x14\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x1c>Y\xb1\v\b\xf401\xff\xff\x00m\xff\xec\x03\xea\x05\xfe\x02&\x00E\x00\x00\x01\a\x00D\x00\xd5\x00\x00\x00\x14\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb1*\t\xf401\xff\xff\x00m\xff\xec\x03\xea\x05\xfe\x02&\x00E\x00\x00\x01\a\x00u\x01d\x00\x00\x00\x14\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb1+\t\xf401\xff\xff\x00m\xff\xec\x03\xea\x06\x00\x02&\x00E\x00\x00\x01\x06\x00\x8en\x00\x00\x14\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb1+\x01\xf401\xff\xff\x00m\xff\xec\x03\xea\x05\xec\x02&\x00E\x00\x00\x01\x06\x00\x90j\x04\x00\x14\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb1,\x01\xf401\xff\xff\x00m\xff\xec\x03\xea\x05\xc5\x02&\x00E\x00\x00\x01\a\x00j\x00\x9e\x00\x00\x00\x17\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb10\x01\xf4\xb09\xd001\x00\xff\xff\x00m\xff\xec\x03\xea\x06[\x02&\x00E\x00\x00\x01\a\x00\x8f\x00\xf5\x00\v\x00\x17\x00\xb0\x00EX\xb0\x17/\x1b\xb1\x17\x18>Y\xb1,\x04\xf4\xb06\xd001\x00\xff\xff\x00\\\xfeD\x03\xec\x04N\x02&\x00G\x00\x00\x00\a\x00y\x01?\xff\xf7\xff\xff\x00]\xff\xec\x03\xf3\x05\xfe\x02&\x00I\x00\x00\x01\a\x00D\x00\xc5\x00\x00\x00\x14\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb1\x1f\t\xf401\xff\xff\x00]\xff\xec\x03\xf3\x05\xfe\x02&\x00I\x00\x00\x01\a\x00u\x01T\x00\x00\x00\x14\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb1 \t\xf401\xff\xff\x00]\xff\xec\x03\xf3\x06\x00\x02&\x00I\x00\x00\x01\x06\x00\x8e^\x00\x00\x14\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb1 \x01\xf401\xff\xff\x00]\xff\xec\x03\xf3\x05\xc5\x02&\x00I\x00\x00\x01\a\x00j\x00\x8e\x00\x00\x00\x17\x00\xb0\x00EX\xb0\b/\x1b\xb1\b\x18>Y\xb1%\x01\xf4\xb0.\xd001\x00\xff\xff\xff\xc6\x00\x00\x01g\x05\xfd\x02&\x00\x8b\x00\x00\x01\x06\x00D\x8d\xff\x00\x14\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb1\x05\t\xf401\xff\xff\x00\x96\x00\x00\x027\x05\xfd\x02&\x00\x8b\x00\x00\x01\x06\x00u\x1b\xff\x00\x14\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb1\x06\t\xf401\xff\xff\xff\xcf\x00\x00\x02,\x05\xff\x02&\x00\x8b\x00\x00\x01\a\x00\x8e\xff&\xff\xff\x00\x14\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb1\b\x01\xf401\xff\xff\xff\xbc\x00\x00\x02E\x05\xc4\x02&\x00\x8b\x00\x00\x01\a\x00j\xffV\xff\xff\x00\x17\x00\xb0\x00EX\xb0\x02/\x1b\xb1\x02\x18>Y\xb1\v\x01\xf4\xb0\x14\xd001\x00\xff\xff\x00\x8c\x00\x00\x03\xdf\x05\xec\x02&\x00R\x00\x00\x01\x06\x00\x90a\x04\x00\x14\x00\xb0\x00EX\xb0\x03/\x1b\xb1\x03\x18>Y\xb1\x15\x01\xf401\xff\xff\x00[\xff\xec\x044\x05\xfe\x02&\x00S\x00\x00\x01\a\x00D\x00\xcf\x00\x00\x00\x14\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb1\x1d\t\xf401\xff\xff\x00[\xff\xec\x044\x05\xfe\x02&\x00S\x00\x00\x01\a\x00u\x01^\x00\x00\x00\x14\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb1\x1e\t\xf401\xff\xff\x00[\xff\xec\x044\x06\x00\x02&\x00S\x00\x00\x01\x06\x00\x8eh\x00\x00\x14\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb1\x1e\x01\xf401\xff\xff\x00[\xff\xec\x044\x05\xec\x02&\x00S\x00\x00\x01\x06\x00\x90d\x04\x00\x14\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb1\x1f\x01\xf401\xff\xff\x00[\xff\xec\x044\x05\xc5\x02&\x00S\x00\x00\x01\a\x00j\x00\x98\x00\x00\x00\x17\x00\xb0\x00EX\xb0\x04/\x1b\xb1\x04\x18>Y\xb1#\x01\xf4\xb0,\xd001\x00\xff\xff\x00\x88\xff\xec\x03\xdc\x05\xfe\x02&\x00Y\x00\x00\x01\a\x00D\x00\xc7\x00\x00\x00\x14\x00\xb0\x00EX\xb0\a/\x1b\xb1\a\x18>Y\xb1\x12\t\xf401\xff\xff\x00\x88\xff\xec\x03\xdc\x05\xfe\x02&\x00Y\x00\x00\x01\a\x00u\x01V\x00\x00\x00\x14\x00\xb0\x00EX\xb0\r/\x1b\xb1\r\x18>Y\xb1\x13\t\xf401\xff\xff\x00\x88\xff\xec\x03\xdc\x06\x00\x02&\x00Y\x00\x00\x01\x06\x00\x8e`\x00\x00\x14\x00\xb0\x00EX\xb0\a/\x1b\xb1\a\x18>Y\xb1\x15\x01\xf401\xff\xff\x00\x88\xff\xec\x03\xdc\x05\xc5\x02&\x00Y\x00\x00\x01\a\x00j\x00\x90\x00\x00\x00\x17\x00\xb0\x00EX\xb0\a/\x1b\xb1\a\x18>Y\xb1\x18\x01\xf4\xb0!\xd001\x00\xff\xff\x00\x16\xfeK\x03\xb0\x05\xfe\x02&\x00]\x00\x00\x01\a\x00u\x01\x1b\x00\x00\x00\x14\x00\xb0\x00EX\xb0\x01/\x1b\xb1\x01\x18>Y\xb1\x12\t\xf401\xff\xff\x00\x16\xfeK\x03\xb0\x05\xc5\x02&\x00]\x00\x00\x01\x06\x00jU\x00\x00\x17\x00\xb0\x00EX\xb0\x0f/\x1b\xb1\x0f\x18>Y\xb1\x17\x01\xf4\xb0 \xd001\x00\x00\x00\x00\x01\x00\x00\x00\xde\x00\x8f\x00\x16\x00T\x00\x05\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x00\x02\x00\x02\x14\x00\x06\x00\x01\x00\x00\x00a\x00a\x00a\x00a\x00a\x00\x93\x00\xb8\x018\x01\xaa\x02:\x02\xcd\x02\xe4\x03\x0e\x038\x03k\x03\x90\x03\xaf\x03\xc5\x03\xe6\x03\xfd\x04J\x04x\x04\xc7\x05<\x05\u007f\x05\xdf\x06>\x06k\x06\xdf\aF\a[\ap\a\x8f\a\xb6\a\xd5\b3\b\xd6\t\x15\tt\t\xc8\n\r\nM\n\x83\n\xeb\v-\vH\v{\v\xd0\v\xf4\fB\f~\f\xd3\r\x1e\r\x83\r\xdf\x0eJ\x0et\x0e\xb6\x0e\xe6\x0f;\x0f\x90\x0f\xc0\x0f\xf8\x10\x1c\x103\x10X\x10\u007f\x10\x9a\x10\xba\x112\x11\x90\x11\xe3\x12A\x12\xa8\x12\xfa\x13t\x13\xb9\x13\xf1\x14=\x14\x94\x14\xaf\x15\x1a\x15e\x15\xb3\x16\x17\x16x\x16\xb5\x17\x1f\x17q\x17\xb8\x17\xe8\x186\x18}\x18\xc2\x18\xfa\x19;\x19R\x19\x92\x19\xd9\x1a\f\x1ah\x1a\xda\x1b=\x1b\x9c\x1b\xbb\x1c`\x1c\x8f\x1d5\x1d\xa3\x1d\xaf\x1d\xcc\x1e\x84\x1e\x9a\x1e\xd6\x1f\x19\x1fi\x1f\xe4 \x04 M y \x98 \xd3!\x05!O![!u!\x8f!\xa9\"\n\"m\"\xab#&#z#\xea$\xa8%\x17%h%\xd9&8&S&\xd6'p'\x9e'\xd7(\x1b(%(/(S(w(\x99(\xa5(\xb1(\xe9)\f)()E)X)l)\xe8*\x03*k*\xbd*\xe8+7+\xa6+\xe8+\xe8+\xf0,V,m,\x84,\x9b,\xb2,\xcb,\xe4,\xf0-\a-\x1e-5-N-e-|-\x93-\xac-\xc3-\xda-\xf1.\b.\x1f.8.O.f.}.\x96.\xad.\xc4.\xdb.\xf1/\a/ /9/E/\\/s/\x89/\xa2/\xb8/\xce/\xe5/\xfe0\x140+0B0X0n0\x870\x9e0\xb50\xcb0\xe40\xfb1\x13\x00\x00\x00\x01\x00\x00\x00\x02\x00\x000\x1bQ\xae_\x0f<\xf5\x00\x1b\b\x00\x00\x00\x00\x00\xc4\xf0\x11.\x00\x00\x00\x00\xd0\xdbN\x9a\xfa\x1b\xfd\xd5\t0\bs\x00\x00\x00\t\x00\x02\x00\x00\x00\x00\x00\x00\x03\x8c\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfb\x00\x00\x01\xfb\x00\x00\x02\x0f\x00\xa0\x02\x8f\x00\x88\x04\xed\x00w\x04~\x00n\x05\xdc\x00i\x04\xf9\x00e\x01e\x00g\x02\xbc\x00\x85\x02\xc8\x00&\x03r\x00\x1c\x04\x89\x00N\x01\x92\x00\x1d\x025\x00%\x02\x1b\x00\x90\x03L\x00\x12\x04~\x00s\x04~\x00\xaa\x04~\x00]\x04~\x00^\x04~\x005\x04~\x00\x9a\x04~\x00\x84\x04~\x00M\x04~\x00p\x04~\x00d\x01\xf0\x00\x86\x01\xb1\x00)\x04\x11\x00H\x04d\x00\x98\x04.\x00\x86\x03\xc7\x00K\a/\x00j\x058\x00\x1c\x04\xfb\x00\xa9\x055\x00w\x05?\x00\xa9\x04\x8c\x00\xa9\x04l\x00\xa9\x05s\x00z\x05\xb4\x00\xa9\x02-\x00\xb7\x04j\x005\x05\x04\x00\xa9\x04N\x00\xa9\x06\xfc\x00\xa9\x05\xb4\x00\xa9\x05\x80\x00v\x05\f\x00\xa9\x05\x80\x00m\x04\xed\x00\xa8\x04\xbf\x00P\x04\xc6\x001\x050\x00\x8c\x05\x17\x00\x1c\a\x19\x00=\x05\x04\x009\x04\xce\x00\x0f\x04\xca\x00V\x02\x1f\x00\x92\x03H\x00(\x02\x1f\x00\t\x03X\x00@\x03\x9c\x00\x04\x02y\x009\x04Z\x00m\x04}\x00\x8c\x040\x00\\\x04\x83\x00_\x04=\x00]\x02\xc7\x00<\x04}\x00`\x04h\x00\x8c\x01\xf1\x00\x8d\x01\xe9\xff\xbf\x04\x0e\x00\x8d\x01\xf1\x00\x9c\a\x03\x00\x8b\x04j\x00\x8c\x04\x90\x00[\x04}\x00\x8c\x04\x8c\x00_\x02\xb5\x00\x8c\x04 \x00_\x02\x9d\x00\t\x04i\x00\x88\x03\xe0\x00!\x06\x03\x00+\x03\xf7\x00)\x03\xc9\x00\x16\x03\xf7\x00X\x02\xb5\x00@\x01\xf3\x00\xaf\x02\xb5\x00\x13\x05q\x00\x83\x01\xf3\x00\x8b\x04`\x00i\x04\xa6\x00[\x05\xb4\x00i\x04\xd8\x00\x1f\x01\xeb\x00\x93\x04\xe8\x00Z\x03X\x00f\x06I\x00[\x03\x93\x00\x93\x03\xc1\x00f\x04n\x00\u007f\x06J\x00Z\x03\xaa\x00x\x02\xfd\x00\x82\x04F\x00a\x02\xef\x00B\x02\xef\x00>\x02\x82\x00{\x04\x88\x00\x9a\x03\xe9\x00C\x02\x16\x00\x93\x01\xfb\x00t\x02\xef\x00z\x03\xa3\x00z\x03\xc0\x00f\x05\xdc\x00U\x065\x00P\x069\x00o\x03\xc9\x00D\az\xff\xf2\x04D\x00Y\x05\x80\x00v\x04\xba\x00\xa6\x04\xc2\x00\x8b\x06\xc1\x00N\x04\xb0\x00~\x04\x91\x00G\x04\x88\x00[\x04\x9c\x00\x95\x01\xfa\x00\x9b\a\xa1\x00h\aD\x00a\x03\xc4\x00\xa9\x02\xad\x00y\x03\xc6\x00{\x05@\x00\xa2\x06?\x00\x90\x01\x99\x00`\x01\x99\x000\x01\x97\x00$\x02\xd4\x00h\x02\xdb\x00<\x02\xc1\x00$\x02\xb2\x00\x8a\x02f\x00l\x02f\x00Y\x03\xa3\x00;\x02\xef\x006\x04~\x00_\x04\x92\x00\xa8\x04n\x00\x1f\x04\x8b\x00<\x02\xef\x00z\x02\xef\x00B\x02\xef\x00>\x02\xef\x006\x01\xfb\x00\x00\x025\x00%\x05]\x00%\x058\x00\x1c\x058\x00\x1c\x058\x00\x1c\x058\x00\x1c\x058\x00\x1c\x058\x00\x1c\x055\x00w\x04\x8c\x00\xa9\x04\x8c\x00\xa9\x04\x8c\x00\xa9\x04\x8c\x00\xa9\x02-\xff\xe0\x02-\x00\xb0\x02-\xff\xe9\x02-\xff\xd6\x05\xb4\x00\xa9\x05\x80\x00v\x05\x80\x00v\x05\x80\x00v\x05\x80\x00v\x05\x80\x00v\x050\x00\x8c\x050\x00\x8c\x050\x00\x8c\x050\x00\x8c\x04\xce\x00\x0f\x04Z\x00m\x04Z\x00m\x04Z\x00m\x04Z\x00m\x04Z\x00m\x04Z\x00m\x040\x00\\\x04=\x00]\x04=\x00]\x04=\x00]\x04=\x00]\x01\xfa\xff\xc6\x01\xfa\x00\x96\x01\xfa\xff\xcf\x01\xfa\xff\xbc\x04j\x00\x8c\x04\x90\x00[\x04\x90\x00[\x04\x90\x00[\x04\x90\x00[\x04\x90\x00[\x04i\x00\x88\x04i\x00\x88\x04i\x00\x88\x04i\x00\x88\x03\xc9\x00\x16\x00\x16\x00\x00\x00\x01\x00\x00\al\xfe\f\x00\x00\tI\xfa\x1b\xfeJ\t0\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x03\x04\x85\x01\x90\x00\x05\x00\x00\x05\x9a\x053\x00\x00\x01\x1f\x05\x9a\x053\x00\x00\x03\xd1\x00f\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\n\xffP\x00!\u007f\x00\x00\x00!\x00\x00\x00\x00GOOG\x00@\x00\x00\xff\xfd\x06\x00\xfe\x00\x00f\a\x9a\x02\x00 \x00\x01\x9f\x00\x00\x00\x00\x04:\x05\xb0\x00 \x00 \x00\x02\x00\x00\x00\x01\x00\x00\x00\xe0\t\t\x04\x00\x00\x02\x02\x02\x03\x06\x05\a\x06\x02\x03\x03\x04\x05\x02\x02\x02\x04\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x02\x02\x05\x05\x05\x04\b\x06\x06\x06\x06\x05\x05\x06\x06\x02\x05\x06\x05\b\x06\x06\x06\x06\x06\x05\x05\x06\x06\b\x06\x05\x05\x02\x04\x02\x04\x04\x03\x05\x05\x05\x05\x05\x03\x05\x05\x02\x02\x05\x02\b\x05\x05\x05\x05\x03\x05\x03\x05\x04\a\x04\x04\x04\x03\x02\x03\x06\x02\x05\x05\x06\x05\x02\x06\x04\a\x04\x04\x05\a\x04\x03\x05\x03\x03\x03\x05\x04\x02\x02\x03\x04\x04\a\a\a\x04\b\x05\x06\x05\x05\b\x05\x05\x05\x05\x02\t\b\x04\x03\x04\x06\a\x02\x02\x02\x03\x03\x03\x03\x03\x03\x04\x03\x05\x05\x05\x05\x03\x03\x03\x03\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x05\x05\x05\x05\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x02\x02\x02\x02\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x04\x04\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x03\x00\x01\x00\x00\x00\x1c\x00\x03\x00\n\x00\x00\x01`\x00\x04\x01D\x00\x00\x006\x00 \x00\x04\x00\x16\x00\x00\x00\r\x00~\x00\xa0\x00\xac\x00\xad\x00\xbf\x00\xc6\x00\xcf\x00\xe6\x00\xef\x00\xff\x011\x01S\x02\xc6\x02\xda\x02\xdc \x14 \x1a \x1e \" : D t \xac\"\x12\xff\xff\x00\x00\x00\x00\x00\r\x00 \x00\xa0\x00\xa1\x00\xad\x00\xae\x00\xc0\x00\xc7\x00\xd0\x00\xe7\x00\xf0\x011\x01R\x02\xc6\x02\xda\x02\xdc \x13 \x18 \x1c \" 9 D t \xac\"\x12\xff\xff\x00\x01\xff\xf6\xff\xe4\x00\x06\xff\xc2\xff\xfa\xff\xc1\x00\x00\xff\xe8\x00\x00\xff\xe2\x00\x00\xffZ\xff:\xfd\xc8\xfd\xb5\xfd\xb4\xe0~\xe0{\xe0z\xe0w\xe0a\xe0X\xe0)\xdf\xf2ލ\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x002\x00\x00\x00\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\x81\x00\xa8\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\x82\x00\x83\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\x84\x00\x85\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\x86\x00\x87\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\x88\x00\x89\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\x8a\x00\xdd\x00\f\x00\x00\x00\x00\x01\xd8\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x00\x00\r\x00\x00\x00\x03\x00\x00\x00 \x00\x00\x00~\x00\x00\x00\x04\x00\x00\x00\xa0\x00\x00\x00\xa0\x00\x00\x00\xa6\x00\x00\x00\xa1\x00\x00\x00\xac\x00\x00\x00c\x00\x00\x00\xad\x00\x00\x00\xad\x00\x00\x00\xa7\x00\x00\x00\xae\x00\x00\x00\xbf\x00\x00\x00o\x00\x00\x00\xc0\x00\x00\x00\xc5\x00\x00\x00\xa9\x00\x00\x00\xc6\x00\x00\x00\xc6\x00\x00\x00\x81\x00\x00\x00\xc7\x00\x00\x00\xcf\x00\x00\x00\xaf\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xa8\x00\x00\x00\xd1\x00\x00\x00\xd6\x00\x00\x00\xb8\x00\x00\x00\xd7\x00\x00\x00\xd8\x00\x00\x00\x82\x00\x00\x00\xd9\x00\x00\x00\xdd\x00\x00\x00\xbe\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x00\x00\x84\x00\x00\x00\xe0\x00\x00\x00\xe5\x00\x00\x00\xc3\x00\x00\x00\xe6\x00\x00\x00\xe6\x00\x00\x00\x86\x00\x00\x00\xe7\x00\x00\x00\xef\x00\x00\x00\xc9\x00\x00\x00\xf0\x00\x00\x00\xf0\x00\x00\x00\x87\x00\x00\x00\xf1\x00\x00\x00\xf6\x00\x00\x00\xd2\x00\x00\x00\xf7\x00\x00\x00\xf8\x00\x00\x00\x88\x00\x00\x00\xf9\x00\x00\x00\xfd\x00\x00\x00\xd8\x00\x00\x00\xfe\x00\x00\x00\xfe\x00\x00\x00\x8a\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xdd\x00\x00\x011\x00\x00\x011\x00\x00\x00\x8b\x00\x00\x01R\x00\x00\x01S\x00\x00\x00\x8c\x00\x00\x02\xc6\x00\x00\x02\xc6\x00\x00\x00\x8e\x00\x00\x02\xda\x00\x00\x02\xda\x00\x00\x00\x8f\x00\x00\x02\xdc\x00\x00\x02\xdc\x00\x00\x00\x90\x00\x00 \x13\x00\x00 \x14\x00\x00\x00\x91\x00\x00 \x18\x00\x00 \x1a\x00\x00\x00\x93\x00\x00 \x1c\x00\x00 \x1e\x00\x00\x00\x96\x00\x00 \"\x00\x00 \"\x00\x00\x00\x99\x00\x00 9\x00\x00 :\x00\x00\x00\x9a\x00\x00 D\x00\x00 D\x00\x00\x00\x9c\x00\x00 t\x00\x00 t\x00\x00\x00\x9d\x00\x00 \xac\x00\x00 \xac\x00\x00\x00\x9e\x00\x00\"\x12\x00\x00\"\x12\x00\x00\x00\x9f\xb0\x00,K\xb0\tPX\xb1\x01\x01\x8eY\xb8\x01\xff\x85\xb0\x84\x1d\xb1\t\x03_^-\xb0\x01, EiD\xb0\x01`-\xb0\x02,\xb0\x01*!-\xb0\x03, F\xb0\x03%FRX#Y \x8a \x8aId\x8a F had\xb0\x04%F hadRX#e\x8aY/ \xb0\x00SXi \xb0\x00TX!\xb0@Y\x1bi \xb0\x00TX!\xb0@eYY:-\xb0\x04, F\xb0\x04%FRX#\x8aY F jad\xb0\x04%F jadRX#\x8aY/\xfd-\xb0\x05,K \xb0\x03&PXQX\xb0\x80D\x1b\xb0@DY\x1b!! E\xb0\xc0PX\xb0\xc0D\x1b!YY-\xb0\x06, EiD\xb0\x01` E}i\x18D\xb0\x01`-\xb0\a,\xb0\x06*-\xb0\b,K \xb0\x03&SX\xb0@\x1b\xb0\x00Y\x8a\x8a \xb0\x03&SX#!\xb0\x80\x8a\x8a\x1b\x8a#Y \xb0\x03&SX#!\xb0\xc0\x8a\x8a\x1b\x8a#Y \xb0\x03&SX#!\xb8\x01\x00\x8a\x8a\x1b\x8a#Y \xb0\x03&SX#!\xb8\x01@\x8a\x8a\x1b\x8a#Y \xb0\x03&SX\xb0\x03%E\xb8\x01\x80PX#!\xb8\x01\x80#!\x1b\xb0\x03%E#!#!Y\x1b!YD-\xb0\t,KSXED\x1b!!Y-\xb0\n,\xb0$E-\xb0\v,\xb0%E-\xb0\f,\xb1'\x01\x88 \x8aSX\xb9@\x00\x04\x00c\xb8\b\x00\x88TX\xb9\x00$\x03\xe8pY\x1b\xb0#SX\xb0 \x88\xb8\x10\x00TX\xb9\x00$\x03\xe8pYYY-\xb0\r,\xb0@\x88\xb8 \x00ZX\xb1%\x00D\x1b\xb9\x00%\x03\xe8DY-\xb0\f+\xb0\x00+\x00\xb2\x01\x0e\x02+\x01\xb2\x0f\x01\x02+\x01\xb7\x0f:0%\x1b\x10\x00\b+\x00\xb7\x01H;.!\x14\x00\b+\xb7\x02XH8(\x14\x00\b+\xb7\x03RC4%\x16\x00\b+\xb7\x04^M<+\x19\x00\b+\xb7\x056,\"\x19\x0f\x00\b+\xb7\x06q]F2\x1b\x00\b+\xb7\a\x91w\\:#\x00\b+\xb7\b~gP9\x1a\x00\b+\xb7\tTE6&\x17\x00\b+\xb7\nv`K6\x1d\x00\b+\xb7\v\x83dN:#\x00\b+\xb7\fٲ\x8ac<\x00\b+\xb7\r\x14\x11\r\t\x06\x00\b+\xb7\x0e<2'\x1c\x11\x00\b+\x00\xb2\x10\n\a+\xb0\x00 E}i\x18D\xb20\x12\x01s\xb2\xb0\x14\x01s\xb2P\x14\x01t\xb2\x80\x14\x01t\xb2p\x14\x01u\xb2\x0f\x1c\x01s\xb2o\x1c\x01u\x00\x00*\x00\x9d\x00\x80\x00\x8a\x00x\x00\xd4\x00d\x00N\x00Z\x00\x87\x00`\x00V\x004\x02<\x00\xbc\x00\xc4\x00\x00\x00\x14\xfe`\x00\x14\x02\x9b\x00 \x03!\x00\v\x04:\x00\x14\x04\x8d\x00\x10\x05\xb0\x00\x14\x06\x18\x00\x15\x01\xa6\x00\x11\x06\xc0\x00\x0e\x00\x00\x00\x00\x00\x00\x00\a\x00Z\x00\x03\x00\x01\x04\t\x00\x01\x00\f\x00\x00\x00\x03\x00\x01\x04\t\x00\x02\x00\x0e\x00\f\x00\x03\x00\x01\x04\t\x00\x03\x00\f\x00\x00\x00\x03\x00\x01\x04\t\x00\x04\x00\f\x00\x00\x00\x03\x00\x01\x04\t\x00\x05\x00,\x00\x1a\x00\x03\x00\x01\x04\t\x00\x06\x00\x1c\x00F\x00\x03\x00\x01\x04\t\x00\x0e\x00T\x00b\x00R\x00o\x00b\x00o\x00t\x00o\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x002\x00.\x000\x000\x001\x001\x000\x001\x00;\x00 \x002\x000\x001\x004\x00R\x00o\x00b\x00o\x00t\x00o\x00-\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00a\x00p\x00a\x00c\x00h\x00e\x00.\x00o\x00r\x00g\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00s\x00/\x00L\x00I\x00C\x00E\x00N\x00S\x00E\x00-\x002\x00.\x000\x00\x03\x00\x00\x00\x00\x00\x00\xffj\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\b\x00\x02\xff\xff\x00\x0f\x00\x01\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x02\x00\n\x00%\x00>\x00\x01\x00E\x00^\x00\x01\x00y\x00y\x00\x03\x00\x81\x00\x81\x00\x01\x00\x83\x00\x83\x00\x01\x00\x86\x00\x86\x00\x01\x00\x89\x00\x89\x00\x01\x00\x8b\x00\x8d\x00\x01\x00\xa0\x00\xa1\x00\x02\x00\xa8\x00\xdd\x00\x01\x00\x01\x00\x00\x00\n\x00T\x00t\x00\x04DFLT\x00\x1acyrl\x00&grek\x002latn\x00>\x00\x04\x00\x00\x00\x00\xff\xff\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\xff\xff\x00\x01\x00\x01\x00\x04\x00\x00\x00\x00\xff\xff\x00\x01\x00\x02\x00\x04\x00\x00\x00\x00\xff\xff\x00\x01\x00\x03\x00\x04kern\x00\x1akern\x00\x1akern\x00\x1akern\x00\x1a\x00\x00\x00\x01\x00\x00\x00\x01\x00\x04\x00\x02\x00\x00\x00\x04\x00\x0e\x02\x0e\x03\x92\x04R\x00\x01\x00\x82\x00\x04\x00\x00\x00<\x01\x88\x01\x88\x00\xfe\x01\x8e\x01\x9c\x01\xb4\x01\xaa\x01\x04\x01\n\x01\x10\x01\xb4\x01\x16\x01 \x01B\x01T\x01\xba\x01f\x01\xf4\x01l\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01z\x01\xfa\x01\xfa\x01\x88\x01\x88\x01\x88\x01\x88\x01\xb4\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x9c\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xb4\x01\xb4\x01\xb4\x01\xb4\x01\xb4\x01\xba\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xf4\x01\xfa\x01\xfa\x00\x01\x00<\x00\x06\x00\v\x00\x13\x00%\x00'\x00(\x00)\x00*\x00/\x000\x003\x004\x008\x00:\x00;\x00=\x00>\x00I\x00J\x00L\x00Q\x00R\x00S\x00V\x00Z\x00]\x00\x93\x00\x94\x00\x96\x00\x97\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xc2\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xdc\x00\xdd\x00\x01\x00\x13\xff \x00\x01\x00V\xff\xe6\x00\x01\x00[\xff\xc1\x00\x01\x00[\xff\xa4\x00\x02\x00X\x00\x0e\x00\x81\xff\x9f\x00\b\x00\x04\xff\xd8\x00V\xff\xb5\x00[\xff\xc7\x00m\xfe\xb8\x00|\xff(\x00\x81\xffM\x00\x86\xff\x8e\x00\x89\xff\xa1\x00\x04\x00\r\x00\x14\x00A\x00\x11\x00V\xff\xe2\x00a\x00\x13\x00\x04\x00\r\x00\x0f\x00A\x00\f\x00V\xff\xeb\x00a\x00\x0e\x00\x01\x00[\xff\xe5\x00\x03\x00\r\x00\x14\x00A\x00\x12\x00a\x00\x13\x00\x03\x00J\x00\x0f\x00X\x002\x00[\x00\x11\x00\x01\x00[\x00\v\x00\x03\x00#\xff\xc3\x00X\xff\xef\x00[\xff\xdf\x00\x03\x00\r\xff\xe6\x00A\xff\xf4\x00a\xff\xef\x00\x02\x00J\xff\xee\x00[\xff\xea\x00\x01\x00\x81\xff\xdf\x00\x0e\x00\n\xff\xe2\x00\r\x00\x14\x00\x0e\xff\xcf\x00A\x00\x12\x00J\xff\xea\x00V\xff\xd8\x00X\xff\xea\x00a\x00\x13\x00m\xff\xae\x00|\xff\xcd\x00\x81\xff\xa0\x00\x86\xff\xc1\x00\x89\xff\xc0\x00\x99\xff\xd3\x00\x01\x00\x94\xff\xb0\x00\x01\x00J\x00\r\x00\x01\x00\x18\x00\x04\x00\x00\x00\a\x00*\x000\x00B\x00\xfc\x01\x12\x01$\x01>\x00\x01\x00\a\x00\x04\x00\f\x00*\x005\x006\x00?\x00J\x00\x01\x008\xff\xd8\x00\x04\x00:\x00\x14\x00;\x00\x12\x00=\x00\x16\x00\xc2\x00\x16\x00.\x00\x10\xff\x16\x00\x12\xff\x16\x00%\xffV\x00.\xfe\xf8\x008\x00\x14\x00E\xff\xde\x00G\xff\xeb\x00H\xff\xeb\x00I\xff\xeb\x00K\xff\xeb\x00S\xff\xeb\x00U\xff\xeb\x00Y\xff\xea\x00Z\xff\xe8\x00]\xff\xe8\x00\x8d\xff\xeb\x00\x95\xff\x16\x00\x98\xff\x16\x00\xa9\xffV\x00\xaa\xffV\x00\xab\xffV\x00\xac\xffV\x00\xad\xffV\x00\xae\xffV\x00\xc3\xff\xde\x00\xc4\xff\xde\x00\xc5\xff\xde\x00\xc6\xff\xde\x00\xc7\xff\xde\x00\xc8\xff\xde\x00\xc9\xff\xeb\x00\xca\xff\xeb\x00\xcb\xff\xeb\x00\xcc\xff\xeb\x00\xcd\xff\xeb\x00\xd3\xff\xeb\x00\xd4\xff\xeb\x00\xd5\xff\xeb\x00\xd6\xff\xeb\x00\xd7\xff\xeb\x00\xd8\xff\xea\x00\xd9\xff\xea\x00\xda\xff\xea\x00\xdb\xff\xea\x00\xdc\xff\xe8\x00\xdd\xff\xe8\x00\x05\x008\xff\xd5\x00:\xff\xe4\x00;\xff\xec\x00=\xff\xdd\x00\xc2\xff\xdd\x00\x04\x008\xff\xb0\x00:\xff\xed\x00=\xff\xd0\x00\xc2\xff\xd0\x00\x06\x00.\xff\xee\x009\xff\xee\x00\xbe\xff\xee\x00\xbf\xff\xee\x00\xc0\xff\xee\x00\xc1\xff\xee\x00\x11\x00\x06\x00\x10\x00\v\x00\x10\x00G\xff\xe8\x00H\xff\xe8\x00I\xff\xe8\x00K\xff\xe8\x00U\xff\xe8\x00\x8d\xff\xe8\x00\x93\x00\x10\x00\x94\x00\x10\x00\x96\x00\x10\x00\x97\x00\x10\x00\xc9\xff\xe8\x00\xca\xff\xe8\x00\xcb\xff\xe8\x00\xcc\xff\xe8\x00\xcd\xff\xe8\x00\x01\x00\x14\x00\x04\x00\x00\x00\x05\x00\"\x00P\x00j\x00|\x00\x96\x00\x01\x00\x05\x00O\x00X\x00[\x00_\x00\x94\x00\v\x00G\xff\xec\x00H\xff\xec\x00I\xff\xec\x00K\xff\xec\x00U\xff\xec\x00\x8d\xff\xec\x00\xc9\xff\xec\x00\xca\xff\xec\x00\xcb\xff\xec\x00\xcc\xff\xec\x00\xcd\xff\xec\x00\x06\x00S\xff\xec\x00\xd3\xff\xec\x00\xd4\xff\xec\x00\xd5\xff\xec\x00\xd6\xff\xec\x00\xd7\xff\xec\x00\x04\x00\x10\xff\x84\x00\x12\xff\x84\x00\x95\xff\x84\x00\x98\xff\x84\x00\x06\x00.\xff\xec\x009\xff\xec\x00\xbe\xff\xec\x00\xbf\xff\xec\x00\xc0\xff\xec\x00\xc1\xff\xec\x00\n\x00L\x00 \x00O\x00 \x00P\x00 \x00S\xff\x80\x00W\xff\x90\x00\xd3\xff\x80\x00\xd4\xff\x80\x00\xd5\xff\x80\x00\xd6\xff\x80\x00\xd7\xff\x80\x00\x02\x05P\x00\x04\x00\x00\x05\xc6\a\b\x00\x1c\x00\x18\x00\x00\xff\xce\xff\xf5\xff\xef\xff\x88\xff\xf4\xff\xbb\xff\u007f\xff\xf5\x00\f\xff\xa9\xff\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe5\x00\x00\x00\x00\xff\xe8\xff\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe3\x00\x00\x00\x00\x00\x00\xff\xe4\x00\x12\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe5\x00\x00\x00\x00\xff\xea\xff\xd5\xff\xeb\xff\xea\xff\x9a\xff\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe6\x00\x00\x00\x00\x00\x00\xff\xed\x00\x00\x00\x14\xff\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xb8\xff\xe4\x00\x00\x00\x00\xff\x9d\x00\x0f\x00\x10\xff\xa1\xff\xc4\x00\x10\x00\x10\xff\xb1\x00\x00\xff&\x00\x00\xff\x9d\xff\xb3\xff\x18\xff\x93\xff\xf0\xff\x8f\xff\x8c\xff\x10\x00\x00\xff\xd8\xff\xe1\x00\x00\x00\x00\xff\xe5\x00\x00\x00\x00\xff\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe6\x00\x00\xff\xc0\xff\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff{\xff\xbf\xff\xca\xfe\xb0\x00\x00\xffq\xfe\xed\xff\xd4\x00\x00\xffQ\xff\x11\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\xff\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xffv\xff\xe1\xfe\xbc\xff\xe6\xff\xf3\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf5\x00\x00\xff8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf5\xff\xf3\x00\x00\x00\x00\xff\xd2\x00\x00\x00\x00\xff\xe4\x00\x00\x00\x00\x00\x00\xff\xb5\x00\x00\xff\x1f\x00\x00\xff\xd4\x00\x00\xff\xdb\x00\x00\x00\x00\xff\xd2\x00\x00\x00\x00\x00\x00\xff\xe1\xff\xe7\x00\x00\x00\x00\xff\xeb\x00\x00\x00\x00\xff\xeb\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe6\x00\x00\xff\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\xff\xe3\xff\xa0\x00\x00\xff\xbf\x00\x11\x00\x11\xff\xd9\xff\xe2\x00\x12\x00\x12\xff\xa2\x00\r\xff-\x00\x00\xff\xbf\xff\xe9\xff\xcc\xff\xd8\xff\xf0\xff\xb7\xff\xc6\xff\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe1\x00\x00\x00\x0e\xff\xed\x00\x00\x00\x00\x00\x00\xff\xd5\x00\x00\xff\x85\x00\x00\xff\xe1\x00\x00\xff\xc4\x00\x00\x00\x00\xff\xdf\x00\x00\x00\x00\x00\x00\xff\xe5\xff\xe6\x00\x00\x00\x00\xff\xeb\x00\x00\x00\x00\xff\xed\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\xff\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf1\x00\x00\x00\x00\xff\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf5\x00\x00\x00\x00\xff\xe3\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf3\x00\x00\x00\x00\xff\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf1\x00\x00\x00\x00\xffx\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x95\x00\x00\xff\xf3\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf1\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x10\xff\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x85\x00\x00\xff\xed\x00\x00\x00\x00\x00\x00\x00\x00\xff\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x95\xff\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x88\x00\x00\x00\x00\x00\x00\xff\xc5\x00\x00\x00\x00\xff\xec\x00\x00\xff\xce\xff\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xffV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x13\x00\x06\x00\x06\x00\x00\x00\v\x00\v\x00\x01\x00\x10\x00\x10\x00\x02\x00\x12\x00\x12\x00\x03\x00%\x00)\x00\x04\x00,\x004\x00\t\x008\x00>\x00\x12\x00E\x00G\x00\x19\x00I\x00I\x00\x1c\x00L\x00L\x00\x1d\x00Q\x00T\x00\x1e\x00V\x00V\x00\"\x00Z\x00Z\x00#\x00\\\x00^\x00$\x00\x8a\x00\x8a\x00'\x00\x93\x00\x98\x00(\x00\xa8\x00\xcd\x00.\x00\xd2\x00\xd7\x00T\x00\xdc\x00\xdd\x00Z\x00\x02\x005\x00\x06\x00\x06\x00\x1a\x00\v\x00\v\x00\x1a\x00\x10\x00\x10\x00\x1b\x00\x12\x00\x12\x00\x1b\x00&\x00&\x00\x01\x00'\x00'\x00\x04\x00(\x00(\x00\x03\x00)\x00)\x00\x05\x00,\x00-\x00\x02\x00.\x00.\x00\n\x00/\x00/\x00\a\x000\x000\x00\b\x001\x002\x00\x02\x003\x003\x00\x03\x004\x004\x00\t\x008\x008\x00\x06\x009\x009\x00\n\x00:\x00:\x00\v\x00;\x00;\x00\x0e\x00<\x00<\x00\f\x00=\x00=\x00\r\x00>\x00>\x00\x0f\x00E\x00E\x00\x10\x00F\x00F\x00\x12\x00G\x00G\x00\x11\x00I\x00I\x00\x13\x00L\x00L\x00\x14\x00Q\x00R\x00\x14\x00S\x00S\x00\x15\x00T\x00T\x00\x12\x00V\x00V\x00\x17\x00Z\x00Z\x00\x16\x00\\\x00\\\x00\x18\x00]\x00]\x00\x16\x00^\x00^\x00\x19\x00\x8a\x00\x8a\x00\x12\x00\x93\x00\x94\x00\x1a\x00\x95\x00\x95\x00\x1b\x00\x96\x00\x97\x00\x1a\x00\x98\x00\x98\x00\x1b\x00\xa8\x00\xa8\x00\x03\x00\xaf\x00\xaf\x00\x04\x00\xb0\x00\xb3\x00\x05\x00\xb4\x00\xb8\x00\x02\x00\xb9\x00\xbd\x00\x03\x00\xbe\x00\xc1\x00\n\x00\xc2\x00\xc2\x00\r\x00\xc3\x00\xc8\x00\x10\x00\xc9\x00\xc9\x00\x11\x00\xca\x00\xcd\x00\x13\x00\xd2\x00\xd2\x00\x14\x00\xd3\x00\xd7\x00\x15\x00\xdc\x00\xdd\x00\x16\x00\x02\x004\x00\x06\x00\x06\x00\x04\x00\v\x00\v\x00\x04\x00\x10\x00\x10\x00\x0e\x00\x11\x00\x11\x00\x12\x00\x12\x00\x12\x00\x0e\x00%\x00%\x00\f\x00'\x00'\x00\x02\x00+\x00+\x00\x02\x00.\x00.\x00\x17\x003\x003\x00\x02\x005\x005\x00\x02\x007\x007\x00\x14\x008\x008\x00\a\x009\x009\x00\x03\x00:\x00:\x00\n\x00;\x00;\x00\x06\x00<\x00<\x00\r\x00=\x00=\x00\v\x00>\x00>\x00\x0f\x00E\x00E\x00\x15\x00G\x00I\x00\x10\x00K\x00K\x00\x10\x00Q\x00R\x00\x13\x00S\x00S\x00\x05\x00T\x00T\x00\x13\x00U\x00U\x00\x10\x00W\x00W\x00\x16\x00Y\x00Y\x00\b\x00Z\x00Z\x00\x01\x00\\\x00\\\x00\x11\x00]\x00]\x00\x01\x00^\x00^\x00\t\x00\x83\x00\x83\x00\x02\x00\x8c\x00\x8c\x00\x02\x00\x8d\x00\x8d\x00\x10\x00\x91\x00\x92\x00\x12\x00\x93\x00\x94\x00\x04\x00\x95\x00\x95\x00\x0e\x00\x96\x00\x97\x00\x04\x00\x98\x00\x98\x00\x0e\x00\xa7\x00\xa7\x00\x12\x00\xa9\x00\xae\x00\f\x00\xaf\x00\xaf\x00\x02\x00\xb9\x00\xbd\x00\x02\x00\xbe\x00\xc1\x00\x03\x00\xc2\x00\xc2\x00\v\x00\xc3\x00\xc8\x00\x15\x00\xc9\x00\xcd\x00\x10\x00\xd2\x00\xd2\x00\x13\x00\xd3\x00\xd7\x00\x05\x00\xd8\x00\xdb\x00\b\x00\xdc\x00\xdd\x00\x01\x00\x00\x00\x01\x00\x00\x00\n\x00,\x00H\x00\x01latn\x00\b\x00\n\x00\x01TUR \x00\x12\x00\x00\xff\xff\x00\x01\x00\x00\x00\x00\xff\xff\x00\x01\x00\x01\x00\x02liga\x00\x0eliga\x00\x16\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\x02\x00\x06\x00 \x00\x04\x00\x00\x00\x01\x00\b\x00\x01\x00,\x00\x01\x00\b\x00\x01\x00\x04\x00\xa0\x00\x02\x00M\x00\x04\x00\x00\x00\x01\x00\b\x00\x01\x00\x12\x00\x01\x00\b\x00\x01\x00\x04\x00\xa1\x00\x02\x00P\x00\x01\x00\x01\x00J"), } file4 := &embedded.EmbeddedFile{ Filename: "3d3a53586bd78d1069ae4b89a3b9aa98.svg", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969054, 0), Content: string("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"), } file5 := &embedded.EmbeddedFile{ Filename: "674f50d287a8c48dc19ba404d20fe713.eot", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969054, 0), - Content: string("n\x87\x02\x00\xac\x86\x02\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x90\x01\x00\x00\x00\x00LP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00Yxϐ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00\x00\x0e\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00\x00$\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x004\x00.\x007\x00.\x000\x00 \x002\x000\x001\x006\x00\x00\x00\x16\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x80\x00\x03\x00PFFTMk\xbeG\xb9\x00\x02\x86\x90\x00\x00\x00\x1cGDEF\x02\xf0\x00\x04\x00\x02\x86p\x00\x00\x00 OS/2\x882z@\x00\x00\x01X\x00\x00\x00`cmap\n\xbf:\u007f\x00\x00\f\xa8\x00\x00\x02\xf2gasp\xff\xff\x00\x03\x00\x02\x86h\x00\x00\x00\bglyf\x8f\xf7\xaeM\x00\x00\x1a\xac\x00\x02L\xbchead\x10\x89\xe5-\x00\x00\x00\xdc\x00\x00\x006hhea\x0f\x03\n\xb5\x00\x00\x01\x14\x00\x00\x00$hmtxEy\x18\x85\x00\x00\x01\xb8\x00\x00\n\xf0loca\x02\xf5\xa2\\\x00\x00\x0f\x9c\x00\x00\v\x10maxp\x03,\x02\x1c\x00\x00\x018\x00\x00\x00 name㗋\xac\x00\x02gh\x00\x00\x04\x86post\xaf\x8f\x9b\xa1\x00\x02k\xf0\x00\x00\x1au\x00\x01\x00\x00\x00\x04\x01ː\xcfxY_\x0f<\xf5\x00\v\a\x00\x00\x00\x00\x00\xd43\xcd2\x00\x00\x00\x00\xd43\xcd2\xff\xff\xff\x00\t\x01\x06\x00\x00\x00\x00\b\x00\x02\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x06\x00\xff\x00\x00\x00\t\x00\xff\xff\xff\xff\t\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xb5\x00\x01\x00\x00\x02\xc3\x02\x19\x00'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x01\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x03\x06i\x01\x90\x00\x05\x00\x00\x04\x8c\x043\x00\x00\x00\x86\x04\x8c\x043\x00\x00\x02s\x00\x00\x01\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00pyrs\x00@\x00 \xf5\x00\x06\x00\xff\x00\x00\x00\x06\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x01\x03\x80\x00p\x00\x00\x00\x00\x02U\x00\x00\x01\xc0\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00]\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\x05\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00y\x05\x80\x00n\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x1a\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x002\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x04\x80\x00\x00\a\x00\x00@\x06\x80\x00\x00\x03\x00\x00\x00\x04\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\n\x05\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00z\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x06\x02\x00\x01\x05\x00\x00\x9a\x05\x00\x00Z\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00@\x06\x00\x00\x00\x06\x80\x005\x06\x80\x005\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\r\x05\x80\x00\x00\x05\x80\x00\x00\x06\x80\x00z\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x10\x05\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00Z\a\x00\x00Z\a\x80\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x03\x80\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00,\x04\x00\x00_\x06\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x15\a\x00\x00\x00\x05\x80\x00\x05\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x10\a\x80\x00\x00\x06\x80\x00s\a\x00\x00\x01\a\x00\x00\x00\x05\x80\x00\x04\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x0f\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x1b\a\x00\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\a\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x02\x80\x00@\x02\x80\x00\x00\x06\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00(\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x03\x80\x00\x01\a\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00@\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x80\x00@\a\x00\x00\x00\a\x80\x00\x00\x06\x80\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00-\x04\x00\x00\r\x04\x80\x00M\x04\x80\x00M\x02\x80\x00-\x02\x80\x00\r\x04\x80\x00M\x04\x80\x00M\a\x80\x00\x00\a\x80\x00\x00\x04\x80\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00@\x06\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\a\x00\x00@\a\x00\x00@\x06\x80\x00\r\a\x80\x00-\a\x00\x00\x00\x06\x80\x00\x02\x05\x80\x00\x02\x06\x80\x00\x00\x04\x00\x00\x00\x06\x80\x00\x00\x04\x00\x00`\x02\x80\x00\x00\x02\x80\x00b\x06\x00\x00\x05\x06\x00\x00\x05\a\x80\x00\x01\x06\x80\x00\x00\x04\x80\x00\x00\x05\x80\x00\r\x05\x00\x00\x00\x06\x80\x00\x00\x05\x80\x00\x03\x06\x80\x00$\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\f\a\x00\x00\x00\x04\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x01\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x006\x06\x00\x00\x00\x05\x80\x00\x00\x04\x00\x00\x03\x04\x00\x00\x03\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x004\x03\x82\x00\x00\x04\x03\x00\x04\x05\x00\x00\x00\a\x00\x00\x00\x05\x00\x008\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\"\x06\x80\x00\"\a\x00\x00\"\a\x00\x00\"\x06\x00\x00\"\x06\x00\x00\"\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x1b\x05\x80\x00\x05\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00D\x06\x00\x00\x00\x03\x00\x00\x03\x03\x00\x00\x03\a\x00\x00@\a\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00,\x06\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\a\x00\x00,\x06\x00\x00\x00\a\x00\x00@\x06\x80\x00 \a\x80\xff\xff\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x00\x00\x15\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\x05\x80\x00\x00\b\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00m\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\xf6\x00)\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00@\x06\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x10\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00 \x06\x00\x00\x00\x04\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00'\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x13\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00D\x06\x00\x00\x00\x05\x00\x009\a\x00\x00\x12\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00>\x05\x00\x00\x18\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x19\a\x00\x00d\x06\x00\x00Y\b\x00\x00\x00\b\x00\x00*\a\x00\x00\x00\x06\x00\x00\t\a\x00\x00'\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x0e\b\x00\x00\x0e\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x05\x00\x00\v\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x13\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x00\x00\x02\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x02\a\x80\x00\x01\b\x00\x00\x06\x06\x00\x00\x00\x05\x00\x00\x02\b\x00\x00\x04\x05\x00\x00\x00\x05\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\xf8\x00T\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\xb5\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\x05\x00\x00f\x06\x00\x00\x00\x06\xb8\x00\x00\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x16\x06\x00\x00\x0e\a\x00\x00\x1d\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00%\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00R\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00E\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00$\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00!\x06\x00\x00k\x04\x00\x00(\x06\x00\x00\x00\a\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00D\x06\x00\x00\x00\x05\x80\x00'\t\x00\x00\x03\x05\x80\x00\x00\b\x80\x00\x00\a\x00\x00\x00\t\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\x05\xff\x00%\x06\x80\x00\x01\a\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x0f\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00%\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x15\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x1d\t\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x01\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x02\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x80\x000\a\x00\x00%\x06\x00\x00\x00\x06\x80\x00/\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00&\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x00\x01\xec\x00\x03\x00\x01\x00\x00\x00\x1c\x00\x04\x01\xd0\x00\x00\x00p\x00@\x00\x05\x000\x00 \x00\xa9\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x0e\xf0\x1e\xf0>\xf0N\xf0^\xf0n\xf0~\xf0\x8e\xf0\x9e\xf0\xae\xf0\xb2\xf0\xce\xf0\xde\xf0\xee\xf0\xfe\xf1\x0e\xf1\x1e\xf1.\xf1>\xf1N\xf1^\xf1n\xf1~\xf1\x8e\xf1\x9e\xf1\xae\xf1\xbe\xf1\xce\xf1\xde\xf1\xee\xf1\xfe\xf2\x0e\xf2\x1e\xf2>\xf2N\xf2^\xf2n\xf2~\xf2\x8e\xf2\x9e\xf2\xae\xf2\xbe\xf2\xce\xf2\xde\xf2\xee\xf5\x00\xff\xff\x00\x00\x00 \x00\xa8\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x00\xf0\x10\xf0!\xf0@\xf0P\xf0`\xf0p\xf0\x80\xf0\x90\xf0\xa0\xf0\xb0\xf0\xc0\xf0\xd0\xf0\xe0\xf0\xf0\xf1\x00\xf1\x10\xf1 \xf10\xf1@\xf1P\xf1`\xf1p\xf1\x80\xf1\x90\xf1\xa0\xf1\xb0\xf1\xc0\xf1\xd0\xf1\xe0\xf1\xf0\xf2\x00\xf2\x10\xf2!\xf2@\xf2P\xf2`\xf2p\xf2\x80\xf2\x90\xf2\xa0\xf2\xb0\xf2\xc0\xf2\xd0\xf2\xe0\xf5\x00\xff\xff\xff\xe3\xff\\\xffX\xffS\xffB\xff1\xde\xe8\xdd\xedݬ\x10\r\x10\f\x10\n\x10\t\x10\b\x10\a\x10\x06\x10\x05\x10\x04\x10\x03\x10\x02\x0f\xf5\x0f\xf4\x0f\xf3\x0f\xf2\x0f\xf1\x0f\xf0\x0f\xef\x0f\xee\x0f\xed\x0f\xec\x0f\xeb\x0f\xea\x0f\xe9\x0f\xe8\x0f\xe7\x0f\xe6\x0f\xe5\x0f\xe4\x0f\xe3\x0f\xe2\x0f\xe1\x0f\xe0\x0f\xde\x0f\xdd\x0f\xdc\x0f\xdb\x0f\xda\x0f\xd9\x0f\xd8\x0f\xd7\x0f\xd6\x0f\xd5\x0f\xd4\x0f\xd3\r\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x05\n\a\x04\f\b\t\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00\x90\x00\x00\x01\x14\x00\x00\x01\x98\x00\x00\x02t\x00\x00\x02\xd0\x00\x00\x03L\x00\x00\x03\xf0\x00\x00\x04T\x00\x00\x06$\x00\x00\x06\xe0\x00\x00\bl\x00\x00\tx\x00\x00\t\xd0\x00\x00\nT\x00\x00\v(\x00\x00\v\xd4\x00\x00\f\x84\x00\x00\rd\x00\x00\x0e\xa8\x00\x00\x0f\xd4\x00\x00\x10\x84\x00\x00\x11\x00\x00\x00\x11\x9c\x00\x00\x12l\x00\x00\x13,\x00\x00\x13\xd8\x00\x00\x14\x80\x00\x00\x14\xfc\x00\x00\x15\x90\x00\x00\x164\x00\x00\x17\x10\x00\x00\x18d\x00\x00\x18\xcc\x00\x00\x19p\x00\x00\x1aH\x00\x00\x1a\x94\x00\x00\x1b$\x00\x00\x1cd\x00\x00\x1d,\x00\x00\x1e\b\x00\x00\x1et\x00\x00\x1f(\x00\x00 \x8c\x00\x00 \xf0\x00\x00!\xa0\x00\x00\"0\x00\x00# \x00\x00$,\x00\x00$\xe0\x00\x00&D\x00\x00'\xe4\x00\x00(\x9c\x00\x00)T\x00\x00*\b\x00\x00*\xbc\x00\x00,\x10\x00\x00,\xf4\x00\x00-\xd8\x00\x00.@\x00\x00.\xd8\x00\x00/`\x00\x00/\xbc\x00\x000\x14\x00\x000\xa4\x00\x001\x94\x00\x002\x90\x00\x003d\x00\x0044\x00\x004\x94\x00\x005 \x00\x005\x80\x00\x005\xb8\x00\x006 \x00\x006\\\x00\x006\xbc\x00\x007H\x00\x007\xa8\x00\x008\f\x00\x008`\x00\x008\xb4\x00\x009L\x00\x009\xb4\x00\x00:h\x00\x00:\xec\x00\x00;\xc0\x00\x00<\x00\x00>\xe4\x00\x00?h\x00\x00?\xd8\x00\x00@H\x00\x00@\xbc\x00\x00A0\x00\x00A\xb8\x00\x00BX\x00\x00B\xf8\x00\x00Cd\x00\x00C\x9c\x00\x00DL\x00\x00D\xe4\x00\x00E\xb8\x00\x00F\x9c\x00\x00G0\x00\x00G\xdc\x00\x00H\xec\x00\x00I\x8c\x00\x00J8\x00\x00K\xac\x00\x00L\xe4\x00\x00Md\x00\x00N,\x00\x00N\x80\x00\x00N\xd4\x00\x00O\xb0\x00\x00P`\x00\x00P\xa8\x00\x00Q4\x00\x00Q\xa0\x00\x00R\f\x00\x00Rl\x00\x00S,\x00\x00S\x98\x00\x00T`\x00\x00U0\x00\x00W\xf0\x00\x00X\xdc\x00\x00Z\b\x00\x00[@\x00\x00[\x8c\x00\x00\\<\x00\x00\\\xf8\x00\x00]\x98\x00\x00^(\x00\x00^\xe4\x00\x00_\xa0\x00\x00`p\x00\x00b,\x00\x00b\xf4\x00\x00d\x04\x00\x00d\xec\x00\x00eP\x00\x00e\xd0\x00\x00f\xc4\x00\x00g`\x00\x00g\xa8\x00\x00iL\x00\x00i\xc0\x00\x00jD\x00\x00k\f\x00\x00k\xd4\x00\x00l\x80\x00\x00m@\x00\x00n,\x00\x00oL\x00\x00p\x84\x00\x00q\xa4\x00\x00r\xdc\x00\x00sx\x00\x00t\x10\x00\x00t\xa8\x00\x00uD\x00\x00{`\x00\x00|\x00\x00\x00|\xbc\x00\x00}\x10\x00\x00}\xa4\x00\x00~\x88\x00\x00\u007f\x94\x00\x00\x80\xbc\x00\x00\x81\x18\x00\x00\x81\x8c\x00\x00\x83H\x00\x00\x84\x14\x00\x00\x84\xd4\x00\x00\x85\xa8\x00\x00\x85\xe4\x00\x00\x86l\x00\x00\x87@\x00\x00\x88\x98\x00\x00\x89\xc0\x00\x00\x8b\x10\x00\x00\x8c\xc8\x00\x00\x8d\x8c\x00\x00\x8el\x00\x00\x8fH\x00\x00\x90 \x00\x00\x90\xc0\x00\x00\x91T\x00\x00\x92\f\x00\x00\x92H\x00\x00\x92\x84\x00\x00\x92\xc0\x00\x00\x92\xfc\x00\x00\x93`\x00\x00\x93\xc8\x00\x00\x94\x04\x00\x00\x94@\x00\x00\x94\xf0\x00\x00\x95\x80\x00\x00\x96$\x00\x00\x97\\\x00\x00\x98X\x00\x00\x99\x1c\x00\x00\x9aD\x00\x00\x9a\xb8\x00\x00\x9b\x98\x00\x00\x9c\xa0\x00\x00\x9dT\x00\x00\x9eX\x00\x00\x9e\xf8\x00\x00\x9f\x9c\x00\x00\xa0D\x00\x00\xa1P\x00\x00\xa2,\x00\x00\xa2\xa4\x00\x00\xa38\x00\x00\xa3\xa8\x00\x00\xa4d\x00\x00\xa5\\\x00\x00\xa8\x90\x00\x00\xab\b\x00\x00\xac\x1c\x00\x00\xac\xec\x00\x00\xad\x90\x00\x00\xad\xe8\x00\x00\xae\x80\x00\x00\xaf\x18\x00\x00\xaf\xb0\x00\x00\xb0H\x00\x00\xb0\xe0\x00\x00\xb1x\x00\x00\xb1\xcc\x00\x00\xb2 \x00\x00\xb2t\x00\x00\xb2\xc8\x00\x00\xb3X\x00\x00\xb3\xf4\x00\x00\xb4p\x00\x00\xb5\x00\x00\x00\xb5d\x00\x00\xb6\x1c\x00\x00\xb6\xd4\x00\x00\xb7\xb4\x00\x00\xb7\xf0\x00\x00\xb8x\x00\x00\xb9t\x00\x00\xb9\xf8\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xbb\xa8\x00\x00\xbc\x84\x00\x00\xbd@\x00\x00\xbe\x04\x00\x00\xbf\xc8\x00\x00\xc0\xc4\x00\x00\xc2\f\x00\x00\u008c\x00\x00\xc3\\\x00\x00\xc4 \x00\x00ļ\x00\x00\xc5\x10\x00\x00Ÿ\x00\x00Ɣ\x00\x00\xc80\x00\x00\xc8\xe0\x00\x00\xc9d\x00\x00\xc9\xcc\x00\x00ʨ\x00\x00ˀ\x00\x00\xcb\xe0\x00\x00\xcc\xf4\x00\x00͔\x00\x00\xcex\x00\x00\xce\xe8\x00\x00ϰ\x00\x00Ќ\x00\x00\xd1,\x00\x00ш\x00\x00\xd2\b\x00\x00҈\x00\x00\xd3\f\x00\x00ӌ\x00\x00\xd3\xec\x00\x00\xd48\x00\x00\xd5,\x00\x00՜\x00\x00\xd6`\x00\x00\xd6\xe8\x00\x00\xd7l\x00\x00\xd8H\x00\x00ش\x00\x00\xd9`\x00\x00\xd9\xc4\x00\x00\xdaT\x00\x00ڸ\x00\x00\xdb\x18\x00\x00۔\x00\x00\xdc@\x00\x00\xdc\xc8\x00\x00\xddl\x00\x00\xdd\xf0\x00\x00ބ\x00\x00\xdf\x18\x00\x00߬\x00\x00\xe0\xbc\x00\x00\xe1l\x00\x00\xe2p\x00\x00\xe3 \x00\x00\xe3\xe4\x00\x00\xe4\x80\x00\x00\xe5\xc8\x00\x00\xe6\xc0\x00\x00\xe7\x18\x00\x00\xe7\xec\x00\x00\xe8\xe4\x00\x00\xe9\xd8\x00\x00\xea\xd8\x00\x00\xeb\xd8\x00\x00\xec\xd4\x00\x00\xed\xd0\x00\x00\xee\xdc\x00\x00\xef\xe4\x00\x00\xf2\x04\x00\x00\xf3\xf4\x00\x00\xf4\x80\x00\x00\xf54\x00\x00\xf6\x10\x00\x00\xf6\x9c\x00\x00\xf7\x18\x00\x00\xf8X\x00\x00\xf8\xc0\x00\x00\xf9$\x00\x00\xfal\x00\x00\xfb\xbc\x00\x00\xfc(\x00\x00\xfc\xb8\x00\x00\xfd\f\x00\x00\xfd`\x00\x00\xfd\xb4\x00\x00\xfe\b\x00\x00\xfe\xb8\x00\x00\xff\b\x00\x01\x00\x14\x00\x01\x05\xb4\x00\x01\x06\xf4\x00\x01\a\xf8\x00\x01\b\xd0\x00\x01\td\x00\x01\n\x10\x00\x01\n\x98\x00\x01\v\x18\x00\x01\f\x04\x00\x01\f\xa4\x00\x01\r,\x00\x01\x0e\x00\x00\x01\x0f\x88\x00\x01\x11,\x00\x01\x11\xa0\x00\x01\x12\xcc\x00\x01\x138\x00\x01\x13\xe4\x00\x01\x14\x90\x00\x01\x15(\x00\x01\x15\xa4\x00\x01\x16X\x00\x01\x16\xfc\x00\x01\x17\xc0\x00\x01\x18\x84\x00\x01\x19x\x00\x01\x1a|\x00\x01\x1bT\x00\x01\x1c\xd4\x00\x01\x1d@\x00\x01\x1d\xd4\x00\x01\x1e\x90\x00\x01\x1f\x04\x00\x01\x1f|\x00\x01 \xa4\x00\x01!\xc0\x00\x01\"x\x00\x01#\b\x00\x01#l\x00\x01$\x04\x00\x01$\xcc\x00\x01'h\x00\x01(\xe8\x00\x01*L\x00\x01,T\x00\x01.L\x00\x011t\x00\x011\xf4\x00\x012\xe0\x00\x0130\x00\x013\xb0\x00\x014\xa8\x00\x015t\x00\x016T\x00\x017$\x00\x018\f\x00\x019H\x00\x01:\x10\x00\x01:\xf0\x00\x01;\x90\x00\x01<\x84\x00\x01<\xd8\x00\x01?X\x00\x01@\x1c\x00\x01A\xc0\x00\x01B\xc8\x00\x01C\xc8\x00\x01D\x9c\x00\x01EH\x00\x01FH\x00\x01Gp\x00\x01HH\x00\x01Ix\x00\x01J \x00\x01J\xe4\x00\x01K\xd4\x00\x01L\xa0\x00\x01M\x18\x00\x01N@\x00\x01P@\x00\x01Q\xa0\x00\x01R\xe0\x00\x01SD\x00\x01T \x00\x01UL\x00\x01V`\x00\x01V\xd4\x00\x01WX\x00\x01X4\x00\x01X\xa0\x00\x01Z\x04\x00\x01Z\x88\x00\x01[d\x00\x01[\xe0\x00\x01\\|\x00\x01]\xd8\x00\x01^\xa0\x00\x01`\x94\x00\x01aH\x00\x01a\xbc\x00\x01b\xf0\x00\x01cX\x00\x01d\xac\x00\x01et\x00\x01fh\x00\x01g\xdc\x00\x01h\xb4\x00\x01i\\\x00\x01jx\x00\x01n\x84\x00\x01p@\x00\x01s\xe0\x00\x01v\x10\x00\x01w\xc8\x00\x01x\x90\x00\x01y\x88\x00\x01z\x8c\x00\x01{h\x00\x01|\x8c\x00\x01}\x1c\x00\x01}\xa4\x00\x01\u007f\\\x00\x01\u007f\x98\x00\x01\u007f\xf8\x00\x01\x80l\x00\x01\x81t\x00\x01\x82\x90\x00\x01\x834\x00\x01\x83\xa4\x00\x01\x84\xc8\x00\x01\x85\xb0\x00\x01\x86\xa4\x00\x01\x88t\x00\x01\x89\x8c\x00\x01\x8a8\x00\x01\x8b8\x00\x01\x8b\xa0\x00\x01\x8eL\x00\x01\x8e\xa8\x00\x01\x8fT\x00\x01\x90\x10\x00\x01\x91\x14\x00\x01\x93\x90\x00\x01\x94\x14\x00\x01\x95\x04\x00\x01\x95\xfc\x00\x01\x96\xf8\x00\x01\x97\xa0\x00\x01\x99|\x00\x01\x9a\xc8\x00\x01\x9c\x10\x00\x01\x9d\b\x00\x01\x9d\xd8\x00\x01\x9e|\x00\x01\x9f\x18\x00\x01\x9f\xe8\x00\x01\xa0\xc4\x00\x01\xa2\f\x00\x01\xa34\x00\x01\xa4x\x00\x01\xa5\xb0\x00\x01\xa6\x80\x00\x01\xa7L\x00\x01\xa8\x1c\x00\x01\xa8\x90\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa9X\x00\x01\xaa(\x00\x01\xab \x00\x01\xab\xcc\x00\x01\xac\xac\x00\x01\xad\xa8\x00\x01\xae \x00\x01\xae\x88\x00\x01\xaf\x04\x00\x01\xaf\xa8\x00\x01\xb0@\x00\x01\xb0\x88\x00\x01\xb6\xbc\x00\x01\xb7l\x00\x01\xb8\xe0\x00\x01\xb9t\x00\x01\xba\x04\x00\x01\xba\x94\x00\x01\xbb$\x00\x01\xbb\xa4\x00\x01\xbc\b\x00\x01\xbcx\x00\x01\xbdL\x00\x01\xbeL\x00\x01\xbe\xa4\x00\x01\xbf \x00\x01\xc0H\x00\x01\xc1\x18\x00\x01\xc1\xc4\x00\x01\xc3\x04\x00\x01\xc3\xe4\x00\x01Ġ\x00\x01\xc5T\x00\x01\xc6(\x00\x01\xc6\xec\x00\x01\xc8\f\x00\x01\xc9\f\x00\x01ʈ\x00\x01ˠ\x00\x01\xcc\xf8\x00\x01\xce\x1c\x00\x01ϔ\x00\x01\xd0l\x00\x01\xd1d\x00\x01\xd2\xdc\x00\x01\xd3P\x00\x01\xd3\xf8\x00\x01Մ\x00\x01\xd6x\x00\x01\xd7p\x00\x01\xd7\xfc\x00\x01\xd8\xf4\x00\x01ڬ\x00\x01\xdbT\x00\x01\xdcT\x00\x01\xdd\f\x00\x01\xdd\xf0\x00\x01ވ\x00\x01\xdfL\x00\x01\xe1\x80\x00\x01\xe2\xf8\x00\x01\xe4\x18\x00\x01\xe5\f\x00\x01\xe6<\x00\x01\xe7H\x00\x01\xe7\xa8\x00\x01\xe8$\x00\x01\xe8\xd4\x00\x01\xe9l\x00\x01\xea\x1c\x00\x01\xea\xd4\x00\x01\xeb\xe4\x00\x01\xec4\x00\x01\xec\xb8\x00\x01\xec\xf4\x00\x01\xed\xf0\x00\x01\xef\b\x00\x01\xef\xa4\x00\x01\xf0\x04\x00\x01\xf0\xcc\x00\x01\xf1 \x00\x01\xf2P\x00\x01\xf3l\x00\x01\xf3\xe8\x00\x01\xf5\f\x00\x01\xf6,\x00\x01\xf6\xc0\x00\x01\xf7x\x00\x01\xf7\xe0\x00\x01\xf8p\x00\x01\xf9,\x00\x01\xfax\x00\x01\xfbt\x00\x01\xfc\f\x00\x01\xfcd\x00\x01\xfd\f\x00\x01\xfd\x8c\x00\x01\xfe4\x00\x01\xff\b\x00\x01\xff\xd0\x00\x02\x014\x00\x02\x02\x1c\x00\x02\x03,\x00\x02\x04h\x00\x02\x05\xd4\x00\x02\aP\x00\x02\t4\x00\x02\n\xd4\x00\x02\f\xe0\x00\x02\r\xf0\x00\x02\x0f\x18\x00\x02\x104\x00\x02\x11\xe4\x00\x02\x13<\x00\x02\x14,\x00\x02\x15,\x00\x02\x164\x00\x02\x170\x00\x02\x188\x00\x02\x19$\x00\x02\x1a\x88\x00\x02\x1b8\x00\x02\x1d\xb4\x00\x02\x1eT\x00\x02\x1e\xcc\x00\x02 |\x00\x02!h\x00\x02\"\xac\x00\x02$L\x00\x02%0\x00\x02&H\x00\x02'\x88\x00\x02(\xf4\x00\x02)\x8c\x00\x02*0\x00\x02*\xdc\x00\x02+\x94\x00\x02,\xdc\x00\x02.$\x00\x02.\xec\x00\x020\xec\x00\x021\x84\x00\x022@\x00\x022\xfc\x00\x023\xb8\x00\x024t\x00\x025$\x00\x026\xf4\x00\x029 \x00\x02:\x8c\x00\x02:\xd4\x00\x02;\f\x00\x02;\x88\x00\x02<(\x00\x02<\xd8\x00\x02=4\x00\x02?\xb8\x00\x02@\x98\x00\x02A\xe0\x00\x02C\xa0\x00\x02D\xfc\x00\x02F\x98\x00\x02H`\x00\x02H\xf4\x00\x02I\xcc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02\x00p\x00\x00\x03\x10\x06\x00\x00\x03\x00\a\x00\x007!\x11!\x03\x11!\x11\xe0\x01\xc0\xfe@p\x02\xa0p\x05 \xfap\x06\x00\xfa\x00\x00\x00\x00\x00\x01\x00]\xff\x00\x06\xa3\x05\x80\x00\x1d\x00\x00\x01\x14\a\x01\x11!2\x16\x14\x06#!\"&463!\x11\x01&54>\x013!2\x1e\x01\x06\xa3+\xfd\x88\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfd\x88+$(\x17\x05\x80\x17($\x05F#+\xfd\x88\xfd\x00&4&&4&\x03\x00\x02x+#\x17\x1b\b\b\x1b\x00\x00\x01\x00\x00\xff\x00\x06\x00\x05\x80\x00+\x00\x00\x01\x11\x14\x0e\x02\".\x024>\x0232\x17\x11\x05\x11\x14\x0e\x02\".\x024>\x0232\x17\x11467\x01632\x16\x06\x00DhgZghDDhg-iW\xfd\x00DhgZghDDhg-iW&\x1e\x03@\f\x10(8\x05 \xfb\xa02N+\x15\x15+NdN+\x15'\x02\x19\xed\xfd;2N+\x15\x15+NdN+\x15'\x03\xc7\x1f3\n\x01\x00\x048\x00\x02\x00\x00\xff\x00\x06\x80\x05\x80\x00\a\x00!\x00\x00\x00\x10\x00 \x00\x10\x00 \x01\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x16\x04\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aL46$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W%\x02\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x804L&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9%\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00=\x00M\x00\x00%\x11\x06\a\x04\a\x0e\x02+\x02\".\x01'&%&'\x11\x14\x163!26\x11<\x02.\x03#!\"\x06\x15\x14\x17\x16\x17\x1e\x04;\x022>\x03767>\x017\x11\x14\x06#!\"&5\x11463!2\x16\x06\x80 %\xfe\xf4\x9e3@m0\x01\x010m@3\x9e\xfe\xf4% \x13\r\x05\xc0\r\x13\x01\x05\x06\f\b\xfa@\r\x13\x93\xc1\xd0\x06:\"7.\x14\x01\x01\x14.7\":\x06\xd0\xc16]\x80^B\xfa@B^^B\x05\xc0B^ \x03\x00$\x1e΄+0110+\x84\xce\x1e$\xfd\x00\r\x13\x13\x04(\x02\x12\t\x11\b\n\x05\x13\r\xa8t\x98\xa5\x051\x1a%\x12\x12%\x1a1\x05\xa5\x98+\x91`\xfb\xc0B^^B\x04@B^^\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x00\x00\x04\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x15\x14\a\x01\x03\x9a4\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\xe5\xfd\x91\x80\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\xdc\xdd\xe5\xfd\xa8\x00\x00\x01\x00\x00\xff\xad\x06\x80\x05\xe0\x00\"\x00\x00\x01\x14\a\x01\x13\x16\x15\x14\x06#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x06\x80\x1a\xfe\x95V\x01\x15\x14\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x03y\x16\x1a\xfe\x9e\xfe\f\a\r\x15\x1d\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x00\x00\x02\x00\x00\xff\xad\x06\x80\x05\xe0\x00\t\x00+\x00\x00\t\x01%\v\x01\x05\x01\x03%\x05\x01\x14\a\x01\x13\x16\x15\x14#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x04q\x012\xfeZ\xbd\xbd\xfeZ\x012I\x01z\x01y\x01\xc7\x1a\xfe\x95V\x01)\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x02\x14\x01)>\x01~\xfe\x82>\xfe\xd7\xfe[\xc7\xc7\x03\n\x16\x1a\xfe\x9e\xfe\f\a\r2\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x15\x00\x1d\x00\x00%\x14\x06#!\"&54>\x033\x16 72\x1e\x03\x00\x10\x06 &\x106 \x05\x00}X\xfc\xaaX}\x11.GuL\x83\x01l\x83LuG.\x11\xff\x00\xe1\xfe\xc2\xe1\xe1\x01>\x89m\x9c\x9cmU\x97\x99mE\x80\x80Em\x99\x97\x03\xc1\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\v\x00\x00\xff\x00\a\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x0554&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x01267\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\x00&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\xfc\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x05\x80&\x1a\x80\x1a&&\x1a\x80\x1a&\xfe\x80&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x80^B\xf9\xc0B^^B\x06@B^@\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xfd\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\x04\x9a\x80\x1a&&\x1a\x80\x1a&&\xfb\x9a\x80\x1a&&\x1a\x80\x1a&&\x03\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\xfe\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xba\xfa\xc0B^^B\x05@B^^\x00\x04\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x03\x00L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x03\x80L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x02\x00\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\xfc\xcc\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(8\xfb\x008(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(88(\xfc@(88(\x03\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x00\x01\x00y\x00\x0e\x06\x87\x04\xb2\x00\x16\x00\x00\x00\x14\a\x01\a\x06\"/\x01\x01&4?\x0162\x17\t\x0162\x1f\x01\x06\x87\x1c\xfd,\x88\x1cP\x1c\x88\xfe\x96\x1c\x1c\x88\x1cP\x1c\x01&\x02\x90\x1cP\x1c\x88\x03\xf2P\x1c\xfd,\x88\x1c\x1c\x88\x01j\x1cP\x1c\x88\x1c\x1c\xfe\xd9\x02\x91\x1c\x1c\x88\x00\x01\x00n\xff\xee\x05\x12\x04\x92\x00#\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\a\t\x01\x05\x12\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x1cP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\xfeP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\x1c\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00#\x00+\x00D\x00\x00\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01546;\x012\x16\x1d\x0132\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x0f\x00\x17\x000\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xfd\xc0\r\x13\x13\r\x02@\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\x13\r@\r\x13\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x06\x00\x00)\x005\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x1276\x16\x17\x16\x06\a\x0e\x01\x15\x14\x1e\x022>\x0254&'.\x017>\x01\x17\x16\x12\x01\x11\x14\x06\"&5\x11462\x16\x06\x00z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\xa1\x92+i\x1f \x0f*bkQ\x8a\xbdн\x8aQkb*\x0f \x1fj*\x92\xa1\xfd\x80LhLLhL\x02\x80\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\xb6\x01Bm \x0e+*i J\xd6yh\xbd\x8aQQ\x8a\xbdhy\xd6J i*+\x0e m\xfe\xbe\x02J\xfd\x804LL4\x02\x804LL\x00\x00\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x00\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12`\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12r\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\xf2\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x01r\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x12\x01\xf2\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00n\x00\x00\x004&\"\x06\x14\x162\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x04\x00\x96Ԗ\x96\xd4\x02\x96\x10\f\xb9\x13\x14#H\n\t\x1b\x90\x16\f\x0e\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8d\n\x0f\x0e\v~'\a\b\x0fH\x12\x1b\x0e\xb7\r\x10\x10\v\xba\x0e\x19(C\n\t\x1a\x91\x16\r\r\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8e\t\x0f\r\f\x81$\a\b\x0fH\x12\x1a\x0f\xb7\r\x10\x02\x16Ԗ\x96Ԗ\x01m\xde\f\x16\x02\x1c6%2X\f\x1a\n%\x8e\tl\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\vr6\n\r\f\v\x15[\x1921\x1b\x02\x15\r\xde\f\x16\x02\x1c..9Q\f\f\n\r$\x8f\nk\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\nw3\b\x0e\f\v\x15[\x1920\x1c\x02\x15\x00\x00\x06\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00;\x00C\x00g\x00\x00\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x13\x11!\x11\x14\x1e\x013!2>\x01\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\xfc\x80\x0e\x0f\x03\x03@\x03\x0f\x0e\xfd`\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\x03 \xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\xfd\x1e\x03\xb4\xfcL\x16%\x11\x11%\x04Ju\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x00\x00\x00\x02\x00\x1a\x00\x00\x06f\x05\x03\x00\x13\x005\x00\x00\x01\x11\x14\x06#!\x11!\x11!\"&5\x11465\t\x01\x167\a\x06\a#\"'\t\x01\x06'&/\x01&67\x0162\x1f\x01546;\x012\x16\x15\x11\x17\x1e\x01\x05\x80&\x1a\xfe\x80\xff\x00\xfe\x80\x1a&\x01\x02?\x02?\x01\xdf>\b\r\x03\r\b\xfdL\xfdL\f\f\r\b>\b\x02\n\x02\xcf X \xf4\x12\x0e\xc0\x0e\x12\xdb\n\x02\x02 \xfe \x1a&\x01\x80\xfe\x80&\x1a\x01\xe0\x01\x04\x01\x01\xda\xfe&\x02AJ\t\x02\a\x02A\xfd\xbf\b\x01\x02\tJ\n\x1b\b\x02W\x1a\x1a\xcc\xc3\x0e\x12\x12\x0e\xfeh\xb6\b\x1b\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\xe0\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\xfd\xfe\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x002\x00\x00\aN\x05\x00\x00\x11\x00C\x00\x00\x015\x03.\x01+\x01\"\x06\a\x03\x15\x06\x16;\x0126\x01\x14#!26'\x03.\x01#!\"\x06\a\x03\x06\x163!\"547\x01>\x013!\"\x06\x0f\x01\x06\x16;\x0126/\x01.\x01#!2\x16\x17\x01\x16\x04W\x18\x01\x14\r\xba\r\x14\x01\x18\x01\x12\f\xf4\f\x12\x02\xf6.\xfd@\r\x12\x01\x14\x01\x14\r\xfe\xf0\r\x14\x01\x14\x01\x12\r\xfd@.\x1a\x01\xa1\b$\x14\x01S\r\x14\x01\x0f\x01\x12\r\xa6\r\x12\x01\x0f\x01\x14\r\x01S\x14$\b\x01\xa1\x1a\x02\x1c\x04\x01@\r\x13\x13\r\xfe\xc0\x04\f\x10\x10\xfe9I\x13\r\x01\x00\r\x13\x13\r\xff\x00\r\x13I6>\x04\x14\x13\x1c\x13\r\xc0\x0e\x12\x12\x0e\xc0\r\x13\x1c\x13\xfb\xec>\x00\x04\x00\x00\x00\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00%\x00=\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x17\x162?\x01!2\x16\x01\x16\a\x01\x06\"'\x01&763!\x11463!2\x16\x15\x11!2\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01ч:\x9c:\x88\x01\xd0(8\xfe\xbb\x11\x1f\xfe@\x126\x12\xfe@\x1f\x11\x11*\x01\x00&\x1a\x01\x00\x1a&\x01\x00*\xa64&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(8\x8888\x888\x02\x11)\x1d\xfe@\x13\x13\x01\xc0\x1d)'\x01\xc0\x1a&&\x1a\xfe@\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x14\a\x01\x06\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04`\n\xfe\xc1\v\x18\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\xcc\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02`\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\x022\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x0162\x17\x01\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04^\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\n\x01?\v\x18\v\x01@\x0f\xd2\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x94\x14\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e\f\f\x01?\t\t\xfe\xc0\x10\x01\xf9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\r\x00#\x00\x00\x01!.\x01'\x03!\x03\x0e\x01\a!\x17!%\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x03\xff\x01<\x01\x03\x01\xd4\xfd<\xd4\x01\x03\x01\x01<_\x01@\x02`&\x1a\xfa\x80\x1a&\x19\xee\n5\x1a\x03@\x1a5\n\xee\x19\x02@\x03\v\x02\x01\xf0\xfe\x10\x03\v\x02\xc0\xa2\xfe\x1e\x1a&&\x1a\x01\xe2>=\x02(\x19\"\"\x19\xfd\xd8=\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00'\x00\x00\x00\x14\a\x01\x06#\"'&5\x11476\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xa0 \xfd\xe0\x0f\x11\x10\x10 !\x1f\x02 \xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xa5J\x12\xfe\xc0\t\b\x13%\x02\x80%\x13\x12\x13\xfe\xc0\xcb\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x003\x00\x00\x01\x11\x14\x06#!\"'&?\x01&#\"\x0e\x02\x14\x1e\x023267672\x1f\x01\x1e\x01\a\x06\x04#\"$&\x02\x10\x126$32\x04\x1776\x17\x16\x06\x00&\x1a\xfe@*\x11\x11\x1f\x8a\x94\xc9h\xbd\x8aQQ\x8a\xbdhw\xd4I\a\x10\x0f\n\x89\t\x01\bm\xfeʬ\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x93\x01\x13k\x82\x1d)'\x05\x00\xfe@\x1a&('\x1e\x8a\x89Q\x8a\xbdн\x8aQh_\n\x02\t\x8a\b\x19\n\x84\x91z\xce\x01\x1c\x018\x01\x1c\xcezoe\x81\x1f\x11\x11\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00G\x00\x00\x01\x14\a\x02\x00!\"$'\a\x06\"&5\x11463!2\x16\x14\x0f\x01\x1e\x013267676;\x012\x16\x13\x11\x14\x06#!\"&4?\x01&#\"\x06\a\x06\a\x06+\x01\"&=\x01\x12\x00!2\x04\x17762\x16\x05\xe7\x01@\xfeh\xfe\xee\x92\xfe\xefk\x81\x134&&\x1a\x01\xc0\x1a&\x13\x89G\xb4a\x86\xe8F\v*\b\x16\xc0\r\x13\x19&\x1a\xfe@\x1a&\x13\x8a\x94Ɇ\xe8F\v*\b\x16\xc7\r\x13A\x01\x9a\x01\x13\x92\x01\x14k\x82\x134&\x01\xe0\x05\x02\xfe\xf4\xfe\xb3nf\x81\x13&\x1a\x01\xc0\x1a&&4\x13\x89BH\x82r\x11d\x17\x13\x03\x13\xfe@\x1a&&4\x13\x8a\x89\x82r\x11d\x17\x13\r\a\x01\f\x01Moe\x81\x13&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x04\x80\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x80\x13\r\xfa@\r\x13\x13\r\x05\xc0\r\x13\x80^B\xfa@B^^B\x05\xc0B^\x01`@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd3\x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x00\x02\x00\x00\x00\x00\x04\x80\x05\x80\x00\a\x00\x1f\x00\x00\x01!54&\"\x06\x15\x01\x11\x14\x06#!\"&5\x1146;\x0154\x00 \x00\x1d\x0132\x16\x01@\x02\x00\x96Ԗ\x03@8(\xfc@(88( \x01\b\x01p\x01\b (8\x03\x00\xc0j\x96\x96j\xfe\xe0\xfd\xc0(88(\x02@(8\xc0\xb8\x01\b\xfe\xf8\xb8\xc08\x00\x00\x02\x00@\xff\x80\a\x00\x05\x80\x00\x11\x007\x00\x00\x01\x14\a\x11\x14\x06+\x01\"&5\x11&5462\x16\x05\x11\x14\x06\a\x06#\".\x02#\"\x05\x06#\"&5\x114767632\x16\x17\x1632>\x0232\x16\x01@@\x13\r@\r\x13@KjK\x05\xc0\x19\x1bך=}\\\x8bI\xc0\xfe\xf0\x11\x10\x1a&\x1f\x15:\xec\xb9k\xba~&26\u007f]S\r\x1a&\x05\x00H&\xfb\x0e\r\x13\x13\r\x04\xf2&H5KKu\xfd\x05\x19\x1b\x0et,4,\x92\t&\x1a\x02\xe6 \x17\x0e\x1dx:;\x13*4*&\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00K\x00\x00\x01\x14\x0f\x02\x0e\x01#\x15\x14\x06+\x01\"&5\x1146;\x012\x16\x1d\x012\x16\x177654\x02$ \x04\x02\x15\x14\x1f\x01>\x013546;\x012\x16\x15\x11\x14\x06+\x01\"&=\x01\"&/\x02&54\x126$ \x04\x16\x12\x06\x80<\x14\xb9\x16\x89X\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12Gv\"D\x1d\xb0\xfe\xd7\xfe\xb2\xfeװ\x1dD\"vG\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12X\x89\x16\xb9\x14<\x86\xe0\x014\x01L\x014\xe0\x86\x02\x8a\xa6\x941!Sk \x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e G<\f_b\x94\x01\x06\x9c\x9c\xfe\xfa\x94b_\f\x034.\x0354632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b\x00\x00\x00\x00\x04\x00\x00\xff\xb9\x06\x80\x05G\x00\x13\x00-\x00I\x00k\x00\x00\x01\x11\x14\x06\"'\x01!\"&5\x11463!\x0162\x16\x00\x14\x06\a\x06#\"&54>\x034.\x0354632\x17\x16\x04\x10\x02\a\x06#\"&54767>\x014&'&'&54632\x17\x16\x04\x10\x02\a\x06#\"&547>\x017676\x12\x10\x02'&'.\x01'&54632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x01U\xaa\x8c\r\f\x1b&'8\x14JSSJ\x148'&\x1a\r\r\x8c\x01\xaa\xfe\xd3\r\r\x1a&'\a\x1f\a.${\x8a\x8a{$.\a\x1f\a'&\x1a\r\r\xd3\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b7\xfe\xce\xfe\xfd;\x05&\x1a'\x14\x1d\x0f6\xa3\xb8\xa36\x0f\x1d\x14'\x1a&\x05;\xb6\xfe4\xfe\u007f[\x05&\x1a$\x17\x04\r\x04\x19\x1a[\x01\x10\x012\x01\x10[\x1a\x19\x04\r\x04\x17$\x1a&\x05[\x00\f\x00\x00\x00\x00\x05\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00/\x003\x007\x00\x00\x01\x15#5\x13\x15#5!\x15#5\x01!\x11!\x11!\x11!\x01!\x11!\x01\x11!\x11\x01\x15#5!\x15#5\x13\x11!5#\x11#\x11!\x1535\x01\x11!\x11!\x11!\x11\x01\x80\x80\x80\x80\x03\x80\x80\xfc\x80\x01\x80\xfe\x80\x01\x80\xfe\x80\x03\x00\x01\x80\xfe\x80\xff\x00\xfd\x80\x04\x80\x80\x01\x80\x80\x80\xfe\x80\x80\x80\x01\x80\x80\xfd\x80\xfd\x80\x05\x80\xfd\x80\x01\x80\x80\x80\x03\x00\x80\x80\x80\x80\xfc\x01\x01\u007f\x01\x80\x01\x80\xfe\x80\x01\x80\xfd\x80\xfd\x80\x02\x80\xfe\x00\x80\x80\x80\x80\x02\x00\xfe\x80\x80\xfe\x80\x02\x80\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x80\x02\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00;\x00?\x00\x003#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113???? ^\x1f\x1f\x9d\x1f\x1f\x9d>>~\x1f\x1f?\x1f\x1f?\x1f\x1f\x9d??\x9d??~??~??^??\xbd^^? ^??\x05\x80\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x80\x05\x80\x00\x00\x00\x02\x00\x00\xff\x95\x05\xeb\x05\x80\x00\a\x00\x1d\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'\x00\x00\x00\x00\x03\x00\x00\xff\x95\ak\x05\x80\x00\a\x00\x1d\x005\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x05\x14\a\x01\x06#\"&'\x01654'\x01.\x01#32\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x01\x80%\xfe\x15'4$.\x1e\x01\xd6%%\xfd5&\x805\xe05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'45%\xfe\x14%\x1c\x1f\x01\xd6%54'\x02\xca&55&\xfd6'\x00\x03\x00\n\xff\x80\x06y\x05\x80\x00T\x00d\x00t\x00\x00\x01\x16\a\x01\x0e\x01#!\"&'&74676&7>\x027>\x0176&7>\x017>\x0176&7>\x017>\x0176&7>\x027>\x06\x17\a63!2\x16\a\x01\x0e\x01#!\"\a\x06\x17\x163!267\x016'\x16\x05\x06\x163!26?\x016&#!\"\x06\a\x03\x06\x163!26?\x016&#!\"\x06\a\x06g(\x16\xfe\xed\x13sA\xfceM\x8f\x1c\x18\x16\x06\x01\x01\b\x01\x02\f\x15\x06\x17,\b\x03\x05\x02\x03\x1c\x03\x15*\x04\x01\a\x04\x04$\x04\x13/\x04\x01\b\x02\x02\x0e\x16\x06\b\x11\r\x13\x14!'\x1c\x01&\r\x02\xf9JP\x16\xfe\xee$G]\xfc\x9b\x1b\v\v\n\x18x\x03\x9b\x1d6\b\x01,\a\x02&\xfb\xed\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04h\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04\x04\"9H\xfcv@WkNC<\x04.\x0e\b\x1b\x06\v\x14\x1b\n&k&\n(\b\v\"\x06$p\"\t.\x05\r#\x05\x1au&\b#\t\b\x14\x1a\b\f%!'\x19\x16\x01\x06\x03\tpJ\xfcvwE\x0f\x10\x1bF\x1f\x1a\x03\xdb\x16#\x0f\x1e\r\x13\x13\r@\r\x13\x13\r\xfe\xc0\r\x13\x13\r@\r\x13\x13\r\x00\x00\x01\x00\x00\xff\x97\x05\x00\x05\x80\x00\x1c\x00\x00\x012\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x8c\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x80\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x80\x00\x03\x00\f\x00\x14\x00<\x00\x00)\x01\x11!\x11!\x11#\"&=\x01!\x004&\"\x06\x14\x1627\x11\x14\x06+\x01\x15\x14\x06#!\"&=\x01#\"&5\x1146;\x01\x11463!2\x16\x1f\x01\x1e\x01\x15\x1132\x16\x01\x80\x03\x80\xfc\x80\x03\x80\xa0(8\xfd\x80\x04\x80&4&&4\xa6\x13\r\xe08(\xfc@(8\xe0\r\x13qO@8(\x02\xa0(`\x1c\x98\x1c(@Oq\x01\x00\x01\x80\x01\x808(\xa0\xfd&4&&4&@\xfe`\r\x13\xa0(88(\xa0\x13\r\x01\xa0Oq\x02 (8(\x1c\x98\x1c`(\xff\x00q\x00\x03\x00\x00\xff\x80\a\x80\x06\x00\x00\a\x00!\x00)\x00\x00\x002\x16\x14\x06\"&4\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x017>\x013!2\x16\x1f\x01\x00 \x00\x10\x00 \x00\x10\x03I\uea69\xee\xa9\x03\xe0j\x96\x96j\xfa\x80j\x96\x96j\xe03\x13e5\x02\x005e\x133\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03`\xa9\uea69\xee\x02I\x96j\xfc\x80j\x96\x96j\x03\x80j\x96\x881GG1\x88\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x80\x05\x80\x00\a\x00P\x00\x00\x01\x032\x16327&\x017>\x047\x13\x01;\x01\x16\x17\x13\x16\x12\x17\x1e\x01\x17\x16\x17\x1e\x01\x17\x16\x15\x14\x06\x15\"&#\"\x04\a4?\x012>\x0554.\x01'%\x06\x02\x15\x14\x1e\x033\x16\x15\x14\a\"&#\"\x06#\x06\x02ժ!\xcf9\x13&W\xfc\xca\x02\x17B03&\f\xed\x01\x18K5\b\x03\xcd!\x92)\x0fV\x1d\x14\x0f\x13\x8a\x0f\x06\x01?\xfe@L\xfe\xea'\x04\x83\x01\x17\b\x15\t\r\x05>R\x01\xfe>\x1ae\x1c;&L\x03\x01\x02:\xe9:\b%\x03P\x03\xd1\xfe>\x04\x02\xfd\xfcvO\a\v\n\x13'\x1f\x02h\x02\xd4\x0e\a\xfe N\xfe\x99_\"\xdd:-\f\x0f\x1d\x06&\x13\x05\x11\x04\x10\x0e\x01+#\x1c\x05\x02\a\x06\n\f\b\x10\xa1\xc2\x03\x02:\xfe\xed\x19\x16\x1f\x12\t\b\x13'\t\x12\x14\b\x0e\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\x15\x00+\x00a\x00\x00%\x163 \x114'.\x04#\"\a\x14\x06\x15\x14\x06\x1e\x01\x03\x1632>\x0254.\x02#\"\a\x14\x16\x15\x14\x06\x15\x14\x017>\x017>\x04<\x015\x10'.\x04/\x016$32\x1632\x1e\x03\x15\x14\x0e\x03\a\x1e\x01\x15\x14\x0e\x03#\"&#\"\x04\x02+JB\x01x)\x1bEB_I:I\x1c\x01\x02\x01\b\x06*CRzb3:dtB2P\b\x01\xfd\xe4\x02\x0f\x8c$\a\v\x06\x05\x01\x16\x04$5.3\x05\x04b\x01\xe4\x83\x17Z\x17F\x85|\\8!-T>5\x9a\xcdFu\x9f\xa8\\,\xb0,j\xfen\x0f \x01OrB,\x027676\x1a\x01'5.\x02'7\x1e\x0232>\x017\x06\a\x0e\x01\a\x0e\x03\a\x06\x02\a\x0e\x03\x1f\x01\x16\x17\x06\a\"\x06#\"&#&#\"\x06\x11\x16OA\x1b\x1c\r\x01zj\x01\x18=N\x13\x13!\xae}:0e\x8d\x1c\x05\x0e\x1e\x8f%\b\f\x06\t\x02\x1by\x11\x02\x16\x12\x0e\x01\x01\x11\xa8\x03\r\v+\v\x1dt\x1c\x8aD3\xb8~U\a\x13\x13\x0e#B\a\x024\x02\v#\x19\r\v\x05\x03g\x02\t\x05\x05\t\x02'2\n%\x0f\x13/!:\r\x94\xfd\xe1T\tbRU\x0f\x12\x04\x1b,7\x03\x14\x02\x12\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\xfa\x05\x80\x00\x1b\x00}\x00\x00%2\x16\x0f\x01\x06\"/\x01&6;\x01\x11#\"&?\x0162\x1f\x01\x16\x06+\x01\x11\x01\x17\x1632632\x163!2\x16>\x02?\x012\x163\x16\x15\x14\a\x06\a&'.\x02'.\x03\x06#\"&\"\x06\a\x06\x17\x14\x12\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x0276\x114\x02=\x01464.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x06\xd0!\x12\x14~\x14:\x14~\x14\x12!PP!\x12\x14~\x14:\x14~\x14\x12!P\xf9\xd16\f\xc7,\xb0,$\x8f$\x01%\x06\x1e\v\x15\x0e\b*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\r\x01\x06\f\x13\a\x1d\x02\x11c2N \t\x01\x04\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\x13\x06\x01\x02\x04\x03\v\x97!x\x14\x13\x1e!\x1a*\x0e\x80%\x1a\xa2\x1a\x1a\xa2\x1a%\x04\x00%\x1a\xa2\x1a\x1a\xa2\x1a%\xfc\x00\x04\xff\x1b\x05\x04\x01\x01\x01\x05\r\v\x01\x01p\xe0P\x1d\x0e\x04,T\tNE\x01\b\t\x03\x02\x01\x01\x04\x04Q7^\xfd\xb4\xa1\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e*\x01Ue\x01\x94eu\x02\x1b\x17\x1c\x14\x04\f\x18\x0e\rwg\x02\x1a\x12\x01\u007f\x00\x00\x02\x00\x00\xff\x03\x06\x00\x05\x80\x00a\x00\x95\x00\x00\x13\x17\x1632632$\x04\x17\x16?\x012\x163\x16\x15\x14\a\x06\a&'.\x025&'&#\"&\"\x06\a\x06\x1f\x015\x14\x1e\x01\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x027>\x024&54&54>\x01.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x012\x1e\x02\x17\x16\x14\a\x0e\x03#\".\x01465!\x14\x16\x14\x0e\x01#\".\x02'&47>\x0332\x1e\x01\x14\x06\x15!4&4>\x01Q6\f\xc7,\xb0,F\x01a\x01\x00w!\x17*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\x0e\n\x11\x05=\x1e~Pl*\t\x01\x01\x02\x01\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\a\t\x03\x01\x05\x01\x01\x01\x05\x04\v\x97)\xf4\x10\x13\x1e!\x1a*\x0e\x05\x1e\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\xfc\x00\x03\x05\x0f\r\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\x04\x00\x03\x05\x0f\x05\u007f\x1b\x05\x04\x02\x01\x04\x01 \x01\x01p\xe0P\x1d\x0e\x04,T\tMF\x01\r\x06\x02\x02\x04\x05Q7\x9847ƢH\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e\x10t\xaf\x87\xac\x03\a\x1d\b\aJHQ6\x05\f\x1b\v\fwh\x02\x1a\x12\x01\u007f\xfa\xff',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01\x00&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\xfe\x80&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xfe\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xfa\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xe0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x04s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80\x13\r\x0e\t\xfe\xe0\t\t\x01 \t\x0e\r\x13\x05\x80\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x03\xe0\xfd\xc0\r\x13\t\x01 \t\x1c\t\x01 \t\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x00\x14\a\x01\x06#\"&5\x114632\x17\t\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01`\t\xfe\xe0\t\x0e\r\x13\x13\r\x0e\t\x01 \x05\xa9\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x02\xce\x1c\t\xfe\xe0\t\x13\r\x02@\r\x13\t\xfe\xe0\xfe\t\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x01\x00\x00\x00\x00\a\x00\x05\x00\x00\x1f\x00\x00\x01\x11\x14\a\x06#\"'\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x01632\x17\x16\a\x00'\r\f\x1b\x12\xfem\xa9w\xfd@w\xa9\xa9w\x02\xc0w\xa9\x01\x93\x12\x1b\f\r'\x04\xa0\xfb\xc0*\x11\x05\x13\x01\x93\xa6w\xa9\xa9w\x02\xc0w\xa9\xa9w\xa5\x01\x92\x13\x05\x11\x00\x00\x00\x00\x04\x00\x00\xff\x80\a\x80\x05\x80\x00\a\x00\x0e\x00\x1e\x00.\x00\x00\x00\x14\x06\"&462\x01\x11!5\x01\x17\t\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\x80p\xa0pp\xa0\x04p\xfa\x80\x01@\xa0\x02\x00\x02\x00\xf9\xc0\r\x13\x13\r\x06@\r\x13\x13\x93^B\xf9\xc0B^^B\x06@B^\x04\x10\xa0pp\xa0p\xfd\xc0\xfe@\xc0\x01@\xa0\x02\x00\x01 \x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13 \xfb@B^^B\x04\xc0B^^\x00\x04\x00\x00\xff\x80\x05\xeb\x05k\x00\x06\x00\x14\x00\x19\x00%\x00\x00!7'\a\x153\x15\x014#\"\a\x01\x06\x15\x14327\x016'\t\x01!\x11\x01\x14\x0f\x01\x017632\x1f\x01\x16\x01k[\xeb[\x80\x02v\x16\n\a\xfd\xe2\a\x16\n\a\x02\x1e\a6\x01\xa0\xfc\xc0\xfe`\x05\xeb%\xa6\xfe`\xa6$65&\xeb%[\xeb[k\x80\x03\xa0\x16\a\xfd\xe2\a\n\x16\a\x02\x1e\a\xca\xfe`\xfc\xc0\x01\xa0\x02\xe05%\xa6\x01\xa0\xa5&&\xea'\x00\x00\x02\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x17\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x0e\x01\"&'\x01&54\x00 \x00\x03\x00\x96Ԗ\x96\xd4\x01\x96!\xfe\x94\x10?H?\x0f\xfe\x93!\x01,\x01\xa8\x01,\x03\x16Ԗ\x96Ԗ\x01\x00mF\xfc\xfa!&&!\x03\x06Fm\xd4\x01,\xfe\xd4\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x00%\x11\"\x0e\x01\x10\x1e\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\x94\xfa\x92\x92\xfa\x03\x94\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a`\x04@\x92\xfa\xfe\xd8\xfa\x92\x02\xf1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x05\xc0\x00\x15\x00-\x00\x00\x014'.\x03'&\"\a\x0e\x03\a\x06\x15\x14\x1626%\x14\x00 \x00547>\x037>\x012\x16\x17\x1e\x03\x17\x16\x02\x00\x14\x01\x1d\x16\x1c\a\x04\"\x04\a\x1c\x16\x1d\x01\x14KjK\x02\x00\xfe\xd4\xfeX\xfe\xd4Q\x06qYn\x1c\t243\b\x1cnYq\x06Q\x01\x80$!\x01+!7\x17\x10\x10\x177!+\x01!$5KK\xb5\xd4\xfe\xd4\x01,ԑ\x82\t\xa3\x8b\xd9]\x1e\"\"\x1e]ً\xa3\t\u007f\x00\x05\x00\x00\x00\x00\x06\xf8\x05\x80\x00\x06\x00\x0e\x009\x00>\x00H\x00\x00\x017'\a\x153\x15\x00&\a\x01\x06\x167\x01\x13\x15\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x016\x16\x03\t\x01!\x11\x01\a\x01762\x1f\x01\x16\x14\x03xt\x98t`\x02\x00 \x11\xfe\xa2\x11 \x11\x01^Q\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\x0e\x12\x17\x16\xfc\xc0B^^B\x03@B^\t@\x0f(`\x01 \xfd`\xfe\xe0\x04\\\\\xfe\xe0\\\x1cP\x1c\x98\x1c\x01`t\x98t8`\x02\xc0 \x11\xfe\xa2\x11 \x11\x01^\xfdϾw\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\x0e\x06\x06^B\xfc\xc0B^^B~\r\t@\x0f\x10\x02\xcd\xfe\xe0\xfd`\x01 \x02\x1c\\\x01 \\\x1c\x1c\x98\x1cP\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x06\x00\x00+\x00Z\x00\x00\x01\x11\x14\x06#!\"&5\x11463!12\x16\x15\x14\a\x06\a\x06+\x01\"\x06\x15\x11\x14\x163!26=\x0147676\x17\x16\x13\x01\x06#\"'&=\x01# \a\x06\x13\x16\a\x06#\"'.\x0454>\a;\x01547632\x17\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x00\xff\r\x13\x1aM8\n\x06pB^^B\x03@B^\x12\x1c\x1a\x10\x13\x15\xed\xfe\x80\x12\x1b\f\r'\xa0\xfe\xbdsw-\x03\x17\b\x04\x10\n\n\x169*#\a\x15#;No\x8a\xb5j\xa0'\r\f\x1a\x13\x01\x80\x13\x02#\xfe\xfdw\xa9\xa9w\x03@w\xa9\x13\r\x1b\x05\x1a\"\x04^B\xfc\xc0B^^B\xd6\x13\n\r\x18\x10\b\t\x01\xdc\xfe\x80\x13\x05\x11*\xc0\x83\x89\xfe\xb0\x17\v\x02\r\x0e\"g`\x8481T`PSA:'\x16\xc0*\x11\x05\x13\xfe\x80\x134\x00\x00\x02\x00\x00\x00\x00\x06\u007f\x05\x80\x00/\x00D\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06#\"'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x01632\x17\x16\x13\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\n\r\x03\x06\x17\x16\xfc\xc0B^^B\x03@B^\t@\n\r\x06\x06\x14\xe7\xfc\xd2\x18B\x18\xfeR\x18\x18n\x18B\x18\x01\a\x02\x87\x18B\x18n\x18\x02^\xfe\xc2w\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\n\x02\x06^B\xfc\xc0B^^B\xfe\r\t@\n\x03\b\x01\xd4\xfc\xd2\x18\x18\x01\xae\x18B\x18n\x18\x18\xfe\xf9\x02\x87\x18\x18n\x18B\x00\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00C\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!\x11#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x11!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x13\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x03\xd3\x13\x1a\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x016\x16\x15\x1167\x06\xd3\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x01\x00z\xff\x80\x06\x80\x05\x80\x00\x19\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&47\x016\x16\x15\x1167\x06S\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\x13\x13\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x00\x01\x00\x00\xff|\x05\u007f\x05\x84\x00\v\x00\x00\t\x01\x06&5\x1146\x17\x01\x16\x14\x05h\xfa\xd0\x17!!\x17\x050\x17\x02a\xfd\x1e\r\x14\x1a\x05\xc0\x1a\x14\r\xfd\x1e\r$\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\xfc\x80&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x06\x05\x80\x00\x19\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x14\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\x13\x13\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\x134\x13\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\x00\x00\x00\x02\x00\x01\x00\x00\x06\x01\x05\x06\x00\v\x00\x1b\x00\x00\x13\x0162\x17\x01\x16\x06#!\"&\x01!\"&5\x11463!2\x16\x15\x11\x14\x06\x0e\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfa@\x1a\f\x05\xc6\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x02-\x02\xc6\x13\x13\xfd:\x13\x1a\x1a\xfd\xe6&\x1a\x01\x00\x1a&&\x1a\xff\x00\x1a&\x00\x00\x00\x00\x01\x00\x9a\xff\x9a\x04\xa6\x05\xe6\x00\x14\x00\x00\t\x02\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\x04\x93\xfd\xed\x02\x13\x13\x13\xa6\x134\x13\xfd\x1a\x13\x13\x02\xe6\x134\x13\xa6\x13\x04\xd3\xfd\xed\xfd\xed\x134\x13\xa6\x13\x13\x02\xe6\x134\x13\x02\xe6\x13\x13\xa6\x134\x00\x00\x00\x00\x01\x00Z\xff\x9a\x04f\x05\xe6\x00\x14\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x04S\xfd\x1a\x134\x13\xa6\x13\x13\x02\x13\xfd\xed\x13\x13\xa6\x134\x13\x02\xe6\x13\x02\x93\xfd\x1a\x13\x13\xa6\x134\x13\x02\x13\x02\x13\x134\x13\xa6\x13\x13\xfd\x1a\x134\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x1a\x80\x1a&\x01\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\x01\x00\x1a&&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&&\x1a\x80\x1a&&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00+\x007\x00\x00\x014/\x017654/\x01&#\"\x0f\x01'&#\"\x0f\x01\x06\x15\x14\x1f\x01\a\x06\x15\x14\x1f\x01\x1632?\x01\x17\x1632?\x016\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04}\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x01\x83\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x9e\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x01\xce\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00#\x00\x00\x014/\x01&\"\a\x01'&\"\x0f\x01\x06\x15\x14\x17\x01\x16327\x01>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x134\x13\xfeh\xe2\x134\x13[\x12\x12\x01j\x13\x1a\x1b\x13\x02\x1f\x12\xfc\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\"\x1c\x12Z\x13\x13\xfei\xe2\x13\x13Z\x12\x1c\x1b\x12\xfe\x96\x13\x13\x02\x1f\x12J\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00:\x00F\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x014.\x01#\"\a\x06\x1f\x01\x1632767632\x16\x15\x14\x06\a\x0e\x01\x1d\x01\x14\x16;\x01265467>\x04$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x00o\xa6W\xf3\x80\x0f\x17\x84\a\f\x10\t5!\"40K(0?i\x12\x0e\xc0\x0e\x12+! \":\x1f\x19\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\xaeX\x96R\xd5\x18\x12d\x06\fD\x18\x184!&.\x16\x1cuC$\x0e\x12\x12\x0e\x13=\x13\x12\x151/J=\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00.\x00:\x00\x00%54&+\x01\x114&#!\"\x06\x1d\x01\x14\x16;\x01\x11#\"\x06\x1d\x01\x14\x163!26\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x12\x0e`\x12\x0e\xfe\xc0\x0e\x12\x12\x0e``\x0e\x12\x12\x0e\x01\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xa0\x0e\x12\x02\x00\x0e\x12\x12\x0e\xa0\x0e\x12\xfe\xc0\x12\x0e\xa0\x0e\x12\x12\x03\x8e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\xc1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00/\x00_\x00\x00\x01#\"&=\x0146;\x01.\x01'\x15\x14\x06+\x01\"&=\x01\x0e\x01\a32\x16\x1d\x01\x14\x06+\x01\x1e\x01\x17546;\x012\x16\x1d\x01>\x01\x01\x15\x14\x06+\x01\x0e\x01\a\x15\x14\x06+\x01\"&=\x01.\x01'#\"&=\x0146;\x01>\x017546;\x012\x16\x1d\x01\x1e\x01\x1732\x16\x04\xadm\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1\x01s&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&\x02\x00&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1\x01,\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00;\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x146\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04I\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n͒\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01ɒ\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\x19\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\t\x01\x06\"'\x01&4?\x0162\x1f\x01\x0162\x1f\x01\x16\x14\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x93\xfeZ\x134\x13\xfe\xda\x13\x13f\x134\x13\x93\x01\x13\x134\x13f\x13z\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xd3\xfeZ\x13\x13\x01&\x134\x13f\x13\x13\x93\x01\x13\x13\x13f\x134\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x85\x00\t\x00\x12\x00\"\x00\x00\x014'\x01\x1632>\x02\x05\x01&#\"\x0e\x01\x15\x14\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05 W\xfd\x0e\x89\xa0oɒV\xfc\x19\x02\U000c7954\xfa\x92\x05 z\xcd\xfe\xe3\xfe\xc8\xfe\xe3\xcdzz\xcd\x01\x1d\x018\x01\x1d\xcd\x02\x83\xa1\x86\xfd\x0fYW\x92˼\x02\xf2[\x92\xfc\x94\xa2\x01?\xfe\xc6\xfe\xe2\xcezz\xce\x01\x1e\x01:\x01\x1d\xcezz\xce\x00\x00\x01\x00@\xff5\x06\x00\x05K\x00 \x00\x00\x01\x15\x14\x06#!\x01\x16\x14\x0f\x01\x06#\"'\x01&547\x01632\x1f\x01\x16\x14\a\x01!2\x16\x06\x00A4\xfd@\x01%&&K%54'\xfdu%%\x02\x8b&54&K&&\xfe\xdb\x02\xc04A\x02\x80\x805K\xfe\xda$l$L%%\x02\x8c%54'\x02\x8a&&J&j&\xfe\xdbK\x00\x00\x01\x00\x00\xff5\x05\xc0\x05K\x00 \x00\x00\x01\x14\a\x01\x06#\"/\x01&47\x01!\"&=\x01463!\x01&4?\x01632\x17\x01\x16\x05\xc0%\xfdu'43'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%\x02@6%\xfdu%%K&j&\x01%K5\x805K\x01&$l$K&&\xfdu#\x00\x00\x01\x005\xff\x80\x06K\x05@\x00!\x00\x00\x01\x14\x0f\x01\x06#\"'\x01\x11\x14\x06+\x01\"&5\x11\x01\x06\"/\x01&547\x01632\x17\x01\x16\x06K%K&56$\xfe\xdaK5\x805K\xfe\xda$l$K&&\x02\x8b#76%\x02\x8b%\x0253'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%%\xfdu'\x00\x00\x00\x00\x01\x005\xff\xb5\x06K\x05\x80\x00\"\x00\x00\x01\x14\a\x01\x06#\"'\x01&54?\x01632\x17\x01\x1146;\x012\x16\x15\x11\x01632\x1f\x01\x16\x06K%\xfdu'45%\xfdu&&J'45%\x01&L4\x804L\x01&%54'K%\x02\xc05%\xfdt%%\x02\x8c$65&K%%\xfe\xda\x02\xc04LL4\xfd@\x01&%%K'\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x00\x14\a\x01\x06\"&5\x11#\"\x0e\x05\x15\x14\x17\x14\x16\x15\x14\x06#\"'.\x02'\x02547\x12!3\x11462\x17\x01\a\x00\x13\xfe\x00\x134&\xe0b\x9b\x99qb>#\x05\x05\x11\x0f\x10\f\a\f\x0f\x03\u007f5\xa2\x02\xc9\xe0&4\x13\x02\x00\x03\x9a4\x13\xfe\x00\x13&\x1a\x01\x00\f\x1f6Uu\xa0e7D\x06#\t\x0f\x14\x11\t\x1a\"\a\x01\x1d\xa6dž\x01\x93\x01\x00\x1a&\x13\xfe\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00/\x00\x00\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x03\x17&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x01\xed\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x03I\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x00\x00\x00\x00\x02\x00\r\xff\x8d\x05\xf3\x05s\x00\x17\x00/\x00\x00\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x03\x00&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x02@\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x02\x93\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x00\x00\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x05\x808(\xfe`8(\xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(8\x03 \xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(88(\xfe`8\x00\x00\x00\x00\x01\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x05\x808(\xfb@(88(\x04\xc0(8\x03 \xc0(88(\xc0(88\x00\x00\x01\x00z\xff\x80\x06\x06\x05\x80\x005\x00\x00\x01\x1e\x01\x0f\x01\x0e\x01'%\x11\x14\x06+\x01\"&5\x11\x05\x06&/\x01&67-\x01.\x01?\x01>\x01\x17\x05\x1146;\x012\x16\x15\x11%6\x16\x1f\x01\x16\x06\a\x05\x05\xca.\x1b\x1a@\x1ag.\xfe\xf6L4\x804L\xfe\xf6.g\x1a@\x1a\x1b.\x01\n\xfe\xf6.\x1b\x1a@\x1ag.\x01\nL4\x804L\x01\n.g\x1a@\x1a\x1b.\xfe\xf6\x01\xe6\x1ag.n.\x1b\x1a\x99\xfe\xcd4LL4\x013\x99\x1a\x1b.n.g\x1a\x9a\x9a\x1ag.n.\x1b\x1a\x99\x0134LL4\xfe͙\x1a\x1b.n.g\x1a\x9a\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00-\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x02\xb2\x12\r\xc0\r\x14\x14\r\xc0\r\x12\x02\x12\n\n\x0e\xdc\x0e\n\n\x11\x14\x0e\xb9\x0e\x13\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xef\xbe\x0e\x13\x14\r\xbe\r\x14\x13\x01f\x02m\f\x06\b\b\x06\f\xfd\x93\n\x0f\x0f\x00\x00\x00\x04\x00\x00\x00\x00\x06\x00\x05@\x00\r\x00\x16\x00\x1f\x00J\x00\x00%5\x115!\x15\x11\x15\x14\x16;\x0126\x013'&#\"\x06\x14\x16$4&#\"\x0f\x0132\x05\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!\"&4632\x1f\x017632\x16\x14\x06#!2\x16\x03\xa0\xfe\xc0$\x1c\xc0\x1c$\xfe8\xc3~\x1a+(88\x02\xd88(+\x1a}\xc2(\x01\xb0\x12\x0e`8(\xfb\xc0(8`\x0e\x12\x12\x0e\x01\xb8]\x83\x83]k=\x80\x80=k]\x83\x83]\x01\xb8\x0e\x12\xb48\x01\xd4\xc0\xc0\xfe,8\x19\x1b\x1b\x03e\xa1\x1f8P88P8\x1f\xa1\xa0\xfe\xc0\x0e\x12\xfe`(88(\x01\xa0\x12\x0e\x01@\x0e\x12\x83\xba\x83M\xa5\xa5M\x83\xba\x83\x12\x00\x02\x00\x00\x00\x00\a\x00\x05\x80\x00\x15\x00N\x00\x00\x004&#\"\x04\x06\a\x06\x15\x14\x16327>\x0176$32\x01\x14\a\x06\x00\a\x06#\"'.\x01#\"\x0e\x02#\"&'.\x0354>\x0254&'&54>\x027>\x047>\x0432\x1e\x02\x05\x00&\x1a\xac\xfe\xdc\xe3z\x13&\x1a\x18\x15\x1b^\x14\x89\x01\a\xb6\x1a\x02&\x14.\xfe\xeb\xdb\xd6\xe0\x94\x8a\x0f\x92\x17\x10/+>\x1d+)\x19\x02\b\x03\x03>J>\x1c\x02\tW\x97\xbem7\xb4\xb3\xb2\x95'\n'\x14\"'\x18'? \x10\x03&4&c\xa9\x87\x15\x18\x1a&\x13\x18^\x13|h\x01\x06_b\xe0\xfe\xc2ml/\x05J@L@#*\x04\x0e\x06\r\a#M6:\x13\x04D\n35sҟw$\x12\x0f\x03\t'%\n'\x11\x17\t\\\x84t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x003\x00\x00\x05\x15\x14\x06#!\"&=\x01463!2\x16\x01\x14\x0e\x05\x15\x14\x17'\x17.\x0454>\x0554'\x17'\x1e\x04\x05\x80\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xff\x001O``O1C\x04\x01Z\x8c\x89Z71O``O1B\x03\x01Z\x8c\x89Z7\xa0@\r\x13\x13\r@\r\x13\x13\x04\x13N\x84]SHH[3`\x80\x01\x01)Tt\x81\xacbN\x84]SHH[3^\x82\x01\x01)Tt\x81\xac\x00\x00\x00\x00\x03\x00\x00\x00\x00\a\x00\x04\x80\x00\x11\x00!\x001\x00\x00\x01&'\x16\x15\x14\x00 \x00547\x06\a\x16\x04 $\x004&#\"\x06\x15\x14\x162654632\x00\x14\a\x06\x00 \x00'&476\x00 \x00\x17\x06\x80\x98\xe5=\xfe\xf9\xfe\x8e\xfe\xf9=嘅\x01\x91\x01\xd4\x01\x91\xfd\xb5\x1c\x14}\xb3\x1c(\x1czV\x14\x03l\x14\x8c\xfe'\xfd\xf2\xfe'\x8c\x14\x14\x8c\x01\xd9\x02\x0e\x01ٌ\x02@\xecuhy\xb9\xfe\xf9\x01\a\xb9yhu\xec\xcd\xf3\xf3\x029(\x1c\xb3}\x14\x1c\x1c\x14Vz\xfe\xd2D#\xe6\xfe\xeb\x01\x16\xe5#D#\xe5\x01\x16\xfe\xea\xe5\x00\x05\x00\x00\xff\xa0\a\x00\x04\xe0\x00\t\x00\x19\x00=\x00C\x00U\x00\x00%7.\x01547\x06\a\x12\x004&#\"\x06\x15\x14\x162654632%\x14\a\x06\x00\x0f\x01\x06#\"'&547.\x01'&476\x00!2\x177632\x1e\x03\x17\x16\x13\x14\x06\a\x01\x16\x04\x14\a\x06\a\x06\x04#76$7&'7\x1e\x01\x17\x02+NWb=嘧\x02\x89\x1c\x14}\xb3\x1c(\x1czV\x14\x01\x87\x01j\xfe\\i1\n\x12\fz\x10,\x8f\xf1X\x14\x14\x99\x01\xc6\x01\rY[6\n\x12\x05\x1a$\x1e!\x03\x10%\x9e\x82\x01\x18\b\x01\xc0\x14'F\x96\xfeu\xdeJ\xd4\x01iys\xa7?_\xaf9ɍ?\xc0kyhu\xec\xfe\xfe\x02n(\x1c\xb3}\x14\x1c\x1c\x14Vz\xef\a\x02\xbd\xfd\f\xbcY\x10F\n\x12\fKA؉\x1fL\x1f\xeb\x01\x10\x11a\x10\f\x13\x12\x13\x02\n\xfe0\x8b\xe52\x01\xf6-\x84F\"@Q\xac\xbe\x84\x12\uef33sp@\xb2_\x00\x00\x00\x00\x03\x00\x10\xff\x80\x06\xf0\x06\x00\x00\x0f\x00!\x003\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x03\x01\x16\a\x0e\x01#!\"&'&7\x01>\x012\x16\x04\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x12\n\r\v\xdc\v\r\n\x11\x14\x0e\xb9\x0e\x13\r\x03\x00#%\x11;\"\xfa\x00\";\x11%#\x03\x00\x11\x01\x05`,@L\xa1\xa0\x05\x11\x80\a\f\x04\x03\x0f\x06\xfe\xe9\xfe\xfd5\x05\r`\t\x0e\x02\x0f\t\xbd\xfc\v\x02\x01\n`\t\x0e\x06\x02\xc2\x01\x03\xfe\x04\x0e\x03\x02\v\x80\x0e\x10\x02\x99\xa0L\xc0\x05`4\xc0L\xa1\xfdH\x13\x0e`\x06\x01\x03\r\x01\xfc\xfe\xfd\xc2\x11\x0e`\t\x02\v\xfc\xbd\a\x10\r\fa\t\x015\x01\x03\x01\x17\b\x10\x10\v\x80\r\x05\x9f\xa0L@\x00\x0f\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x003\x007\x00;\x00?\x00O\x00s\x00\x00\x17!\x11!\x01!\x11!%!\x11!\x01!\x11!%!\x11!\x01!\x11!\x01!\x11!\x01!\x11!%!\x11!\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!\x11!%!\x11!\x01!\x11!7\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x02\xe0\x01@\xfe\xc0\xfe\x80\x01@\xfe\xc0\x03\x00\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\xfe\xa0\x13\r@\r\x13\x13\r@\r\x13\x02\xe0\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\x01\x80\x01 \xfe\xe0 \x13\r@\r\x13\x13\r@\r\x13\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x01 \xfe\xe0\x01 @\x01@\xfe\xc0\x01@@\x01 \xfc\x00\x01 \x01\xc0\x01 \xfc\x00\x01 @\x01@\x02 \x01 \r\x13\x13\r\xfe\xe0\r\x13\x13\xfc\xad\x01@@\x01 \xfe\xe0\x01 \xc0\x01 \r\x13\x13\r\xfe\xe0\r\x13\x13M\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x03\x00\x00\xff\xa0\a\x00\x05\xe0\x00\x12\x007\x00q\x00\x00\x01\x06\a.\x04+\x01\"&=\x0146;\x012\x00\x14\a\x01\x06#\"&=\x01\"\x0e\x01.\x06'67\x1e\x043!54632\x17\x01\x12\x14\a\x01\x06#\"&=\x01!\"\x0e\x02\a\x06\a\x0e\x06+\x01\"&=\x0146;\x012>\x02767>\x063!54632\x17\x01\x02\x9amBZxPV3!\x12\x0e\xc0\x0e\x12\x1emBZxPV3!\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x05\x00\x00&\x00\x00\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'5&6&>\x027>\x057&\x0254>\x01$32\x04\a\x00\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x11\x1b\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\xb6\xf4\x01\x9c\x03.\xfe\xa4\xfe٫\b\xafC\x0e\b\x02\x16\x12\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xace\xab\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x02\x04 $\x02=\x01463!2\x16\x1d\x01\x14\x1e\x032>\x03=\x01463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xc5\xfe\xa1\xfeH\xfe\xa1\xc5&\x1a\x01\x80\x1a&/\x027\x03#\"&463!2\x1e\x04\x17!2\x16\x02\x80LhLLh\x03\xccLhLLh\xcc!\x18\xfb\xec\r\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x10\x10\x1b\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0e\f\x04\a\x01\x04\xb1\x1a&4hLLhLLhLLhL\x03\xc0\xfe\x00\x18%\x03z<\n\x100&4&&\x1a\v)\x1f1\x05\x037&4&\r\x12\x1f\x15&\a&\x00\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00\x14\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\x03\xa0\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x00\x02\x00\x00\x00\x00\aW\x05\x80\x00\x13\x00*\x00\x00\x01\x14\a\x01\x0e\x01#!\"&547\x01>\x013!2\x16\x01\x15!\"\x06\a\x01\a4&5\x11463!2\x16\x1d\x01!2\x16\aW\x1f\xfe\xb0+\x9bB\xfb\xc0\"5\x1f\x01P+\x9bB\x04@\"5\xfe\xa9\xfc\xc0^\xce=\xfe\xaf\x05\x01\x84\\\x01@\\\x84\x02 \\\x84\x02H\x1f#\xfet3G\x1a\x1e\x1f#\x01\x8c3G\x1a\x01:\xa0_H\xfet\x06\x04\x11\x04\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x01\x00@\xff\x00\x02\xc0\x06\x00\x00\x1f\x00\x00\x00\x14\x06+\x01\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11#\"&47\x0162\x17\x01\x02\xc0&\x1a\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x04\xda4&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x13\x13\xff\x00\x00\x00\x00\x01\x00\x00\x01@\a\x00\x03\xc0\x00\x1f\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x80\x1a&\x13\xff\x00\x00\x00\x00\x05\x00\x00\xff\x80\b\x00\x05\x80\x00\x03\x00\a\x00\r\x00\x11\x00\x15\x00\x00\x01\x11!\x11\x01\x11!\x11\x01\x15!\x113\x11\x01\x11!\x11\x01\x11!\x11\x02\x80\xff\x00\x02\x80\xff\x00\x05\x00\xf8\x00\x80\x05\x00\xff\x00\x02\x80\xff\x00\x02\x80\xfe\x00\x02\x00\x02\x00\xfc\x00\x04\x00\xfb\x80\x80\x06\x00\xfa\x80\x03\x80\xfd\x00\x03\x00\x01\x80\xfb\x80\x04\x80\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x000\x00@\x00\x00\x01\x06\a67\x06\a&#\"\x06\x15\x14\x17.\x01'\x06\x15\x14\x17&'\x15\x14\x16\x17\x06#\"'\x1e\x01\x17\x06#\"'\x1632>\x0354'6\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x008AD\x19AE=\\W{\x05\x81\xe2O\x1d[/5dI\x1d\x16\r\x1a\x15kDt\x91\x1a\x18\x94\xaepČe1\x01?\x01*\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x9e\x19\t(M&\rB{W\x1d\x13\ata28r=\x01\x19\x02Ku\x0e\b\x04?R\x01Z\x03^Gw\x9b\xa9T\x12\t-\x01\x02\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x04\xe0w\xa9\xa9w\xbc\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd\xecw\xa9\xa9w\x05\x80\xa9w\xfc@w\xa9\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad\xa9w\x03\xc0w\xa9\x00\x00\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x17\x00\x1b\x00#\x00'\x00.\x00>\x00\x00\x004&#\"\x06\x15\x14\x1626546326\x14\x06\"&462\x01!5!\x00\x10& \x06\x10\x16 \x01!5!\x03!=\x01!\a!%\x11\x14\x06#!\"&5\x11463!2\x16\x03\xa0\x12\x0eB^\x12\x1c\x128(\x0e\xf2\x96Ԗ\x96\xd4\xfc\x96\x06\x00\xfa\x00\x04\x80\xe1\xfe\xc2\xe1\xe1\x01>\xfc\xe1\x01\x80\xfe\x80\x80\x06\x00\xfc\xc4@\xfd|\x06\x80K5\xfa\x005KK5\x06\x005K\x02\xb2\x1c\x12^B\x0e\x12\x12\x0e(8\bԖ\x96Ԗ\xfc\u0080\x01\x1f\x01>\xe1\xe1\xfe\xc2\xe1\x04\x02\x80\xfe\xc0v\x8a\x80\x80\xfb\x005KK5\x05\x005KK\x00\x02\x00\x00\xffH\x06\x93\x05\x80\x00\x15\x00G\x00\x00\x004&\"\x06\x15\x14\x17&#\"\x06\x14\x162654'\x1632\x01\x14\x06#\".\x02'\a\x17\x16\x15\x14\x06#\"'\x01\x06#\"&54\x12$32\x16\x15\x14\a\x017.\x0354632\x17\x1e\x04\x03@p\xa0p\x13)*Ppp\xa0p\x13)*P\x03\xc3b\x11\t'\"+\x03`\xdc\x1cN*(\x1c\xfda\xb0\xbd\xa3;\x012\xa0\xa3̓\x01c`\x03.\" b\x11\r\n\x06PTY9\x03\xb0\xa0ppP*)\x13p\xa0ppP*)\x13\xfe\x00\x11b \".\x03`\xdc\x1c(*N\x1c\x02\x9f\x83ͣ\xa0\x012\xbeͣ\xbd\xb0\xfe\x9d`\x03+\"'\t\x11b\n\x06MRZB\x00\x00\x00\x00\x06\x00\x00\xff\x0f\a\x80\x05\xf0\x00\a\x00\x11\x00\x1b\x00\u007f\x00\xbd\x00\xfb\x00\x00\x004&\"\x06\x14\x162\x014&\"\x06\x15\x14\x1626\x114&\"\x06\x15\x14\x1626\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x15\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x01\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x11\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x03\x80\x96Ԗ\x96\xd4\x03\x96LhLKjKLhLKjK\xfe\x80\x0e\t\x9b\v\x15\"8\a\a\x17w\x13\v\ns%(\v\f\a\x17\xba\v\x12\x01\x17\")v\a\r\v\n\x90\a\n>\x10\x17\f\x98\n\x0e\x0e\t\x9b\v\x15\"8\a\a\x16x\x13\v\ns\"+\v\f\a\x17\xba\v\x12\x01\x17\")v\b\f\v\n\x90\a\f<\x0f\x17\v\x98\n\x0e\x02\x80\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x02\x16Ԗ\x96Ԗ\xff\x004LL45KK\x0454LL45KK\xfe\x90\xb9\n\x13\x01\x18#)0C\v\t\f\a\x1ew\aZ\x13\fl/\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\t\n\x0eN\x16,&\x18\x01\x11\v\xb9\n\x13\x01\x18#)0C\v\t\f\b\x1ev\aZ\x12\x0el.\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\b\v\x10L\x160\"\x17\x02\x11\xfd\xe0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x03\xf0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00%\x00O\x00\x00\x00\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546$ \x04\x01\x14\x06\a\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x05\x80\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x01E\x01~\x01E\x02<\x8e|\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x03\x8b\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b쉉\xfd\x89x\xd1H\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6\x00\x00\x03\x00\x00\xff\x80\x06\x00\x06\x00\x00\a\x00<\x00m\x00\x00$4&\"\x06\x14\x162\x014&#!4654&#\x0e\x02\a\x06\a\x0e\x06+\x01\x1132\x1e\x04\x17\x16;\x01254'>\x014'654&'>\x017\x14\a\x16\x15\x14\a\x16\x15\x14\a\x16\x06+\x02\"&'&#!\"&5\x11463!6767>\x027632\x1e\x01\x15\x14\a32\x16\x01\x00&4&&4\x04\xa6N2\xfe\xa0`@`\x1a\x18%)\x167\x04&\x19,$)'\x10 \r%\x1d/\x170\x05Ӄy\xc0\x05\x1e#\x125\x14\x0f +\x801\t&\x03<\x01\xac\x8d$]`\xbb{t\x16\xfe\xe05KK5\x01\x12$e:1\x18\x17&+'3T\x86F0\xb0h\x98\xa64&&4&\x02\x803M:\xcb;b^\x1av\x85+\x17D\x052 5#$\x12\xfd\x80\x06\a\x0f\b\x11\x02I\xa7\x1a\x1e\x10IJ 2E\x19=\x11\x01\\$YJ!$MC\x15\x16eM\x8b\xa1-+(K5\x02\x805K\x18\x83K5\x19y\x84*%A\x8au]c\x98\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x05\x80\x00\a\x00>\x00q\x00\x00\x004&\"\x06\x14\x162\x014&'>\x0154'654&'654&+\x01\"\a\x0e\x05+\x01\x1132\x1e\x05\x17\x16\x17\x1e\x02\x172654&5!267\x14\x06+\x01\x16\x15\x14\a\x0e\x01#\"'.\x03'&'&'!\"&5\x11463!27>\x01;\x012\x16\a\x15\x16\x15\x14\a\x16\x15\x14\a\x16\x01\x00&4&&4\x04\xa6+ \x0f\x145\x12#\x1e\x05bW\x80\x83\xd3\x050\x17/\x1d%\r \x10')$,\x19&\x047\x16)%\x18\x1a`@`\x01`2N\x80\x98h\xb00##\x86T3'\"(\v\x18\x130;e$\xfe\xee5KK5\x01 \x16t\x80\xbeip\x8c\xad\x01<\x03&\t1\x04&4&&4&\xfe\x00#\\\x01\x11=\x19E2\x1f&%I\x10\x1e\x1aURI\x02\x11\b\x0f\a\x06\xfd\x80\x12$#5 2\x05D\x17+\x85v\x1a^b;\xcb:M2g\x98c]vDEA%!bSV\x152M\x83\x18K5\x02\x805K(,,\x9e\x89\x05Me\x16\x15CM$!I\x00\x00\x00\x01\x00\x00\xff\xad\x03@\x05\xe0\x00\x12\x00\x00\x01\x11\x05\x06#\"&547\x13\x01&547%\x136\x03@\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13\x05\xe0\xfa\xc5\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7)\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x009\x00\x00\x014.\x03\"\x0e\x02\a\x06\"'.\x03\"\x0e\x03\x15\x14\x17\t\x0167\x14\a\x01\x06\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x06\x80+C`\\hxeH\x18\x12>\x12\x18Hexh\\`C+\xbb\x02E\x02D\xbc\x80\xe5\xfd\x91\x124\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\x03\xacQ|I.\x103MC\x1c\x16\x16\x1cCM3\x10.I|Q\xa8\xbb\xfd\xd0\x02/\xbc\xa8\xdd\xe5\xfd\xa8\x12\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06 \x05\x00\x00(\x00@\x00\x00%\x14\x16\x0e\x02#!\"&5\x11463!2\x16\x15\x14\x16\x0e\x02#!\"\x06\x15\x11\x14\x163!:\x02\x1e\x03\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\x01\x02\x80\x02\x01\x05\x0f\r\xfe\xc0w\xa9\xa9w\x01@\r\x13\x02\x01\x05\x0f\r\xfe\xc0B^^B\x01 \x01\x14\x06\x11\x06\n\x04\x03\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 `\x04 \x15\x1a\r\xa9w\x02\xc0w\xa9\x13\r\x04 \x15\x1a\r^B\xfd@B^\x02\x04\a\v\x0224\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x0f\x00%\x005\x00\x0073\x11#7.\x01\"\x06\x15\x14\x16;\x0126\x013\x114&#\"\a35#\x16\x033\x1147>\x0132\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\xed\xe7\xe7\xf6\x01FtIG9\x01;H\x02I\xe7\x92x\x88I\x02\xe7\x03\x03\xe7\a\x0f<,t\x01ԩw\xfc@w\xa9\xa9w\x03\xc0w\xa9z\x02\xb6\xd64DD43EE\xfc\xa7\x01\x8e\x9a\x9eueB\xfd\x8c\x01\x84&\x12#1\x9d\x02s\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x00\x04\x80\x05\x80\x00\v\x00.\x00\x00\x01\x114&\"\x06\x15\x11\x14\x1626\x01\x14\x06#!\x03\x0e\x01+\x01\"'\x03!\"&5463\x11\"&463!2\x16\x14\x06#\x112\x16\x01\xe0\x12\x1c\x12\x12\x1c\x12\x02\xa0&\x1a\xfeS3\x02\x11\f\x01\x1b\x05L\xfel\x1a&\x9dc4LL4\x02\x804LL4c\x9d\x02\xa0\x01\xc0\x0e\x12\x12\x0e\xfe@\x0e\x12\x12\xfe\xae\x1a&\xfe\x1d\f\x11\x1b\x01\xe5&\x1a{\xc5\x02\x00LhLLhL\xfe\x00\xc5\x00\x00\x00\x02\x00\x00\x00\x00\a\x00\x06\x00\x00'\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x14\x06#!\"\x06\x15\x11\x14\x163!265\x1146;\x012\x16\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x02\xc0\x0e\x12\x12\x0e\xfd@B^^B\x03@B^\x12\x0e@\x0e\x12\x01\x80&4\x13\xb0\xfdt\n\x1a\nr\n\n\x02\x8c\xb0\x13&\x1a\x02\x00\x1a&\x02`\xfe\xc0w\xa9\xa9w\x03@w\xa9\x12\x0e@\x0e\x12^B\xfc\xc0B^^B\x01@\x0e\x12\x12\x03R\xfe\x00\x1a&\x13\xb0\xfdt\n\nr\n\x1a\n\x02\x8c\xb0\x134&&\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\x17\x00@\x00\x00\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\t\x01\x11\x14\x06#!\"&54&>\x023!265\x114&#!*\x02.\x0354&>\x023!2\x16\x04\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 \x01s\xa9w\xfe\xc0\r\x13\x02\x01\x05\x0f\r\x01@B^^B\xfe\xe0\x01\x14\x06\x11\x06\n\x04\x02\x01\x05\x0f\r\x01@w\xa9\x02\x9a4\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x013\xfd@w\xa9\x13\r\x04 \x15\x1a\r^B\x02\xc0B^\x02\x04\a\v\b\x04 \x15\x1a\r\xa9\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00I\x00\x00\x01&5!\x15\x14\x16%5!\x14\a>\x017\x15\x14\x0e\x02\a\x06\a\x0e\x01\x15\x14\x1632\x16\x1d\x01\x14\x06#!\"&=\x014632654&'&'.\x03=\x01463!5463!2\x16\x1d\x01!2\x16\x01\xcaJ\xff\x00\xbd\x04\xc3\xff\x00J\x8d\xbd\x80S\x8d\xcdq*5&\x1d=CKu\x12\x0e\xfc\xc0\x0e\x12uKC=\x1d&5*q͍S8(\x01 ^B\x02@B^\x01 (8\x02\x8d\xa2\xd1`N\xa8\xf6`Ѣ\x1d\xa8\u0380G\x90tO\x056)\"M36J[E@\x0e\x12\x12\x0e@E[J63M\")6\x05Ot\x90G\x80(8`B^^B`8\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00,\x002\x00\x81\x00\x91\x00\x00\x016'&\a\x06\x17\x16'&\a\x06\x17\x1676'6'&\a\x06\x17\x16\x176&'&\x06\x17\x16\x176'&\a\x06\x17\x1e\x014#\"\x147&\x06\x17\x166\x014\x00 \x00\x15\x14\x12\x17\x16654'\x0e\x02.\x01'&'.\x03632\x1e\x01\x17\x1e\x0126767.\x03547&76\x16\x1f\x0162\x17>\x02\x17\x16\a\x16\x15\x14\x0e\x03\a\x16\x15\x14\x06\x15\x14\x1676\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\a\x04\a\t\x05\x04\a\t\x17\x05\a\x06\x06\a\x05\x06/\x02\a\a\x01\x03\a\b\x16\x02\x01\x03\x06\b\x05\x06[\x02\v\t\x04\x02\v\t.\f\n=\x02\x16\x02\x02\x14\x02\x82\xfe\xd4\xfeX\xfe\xd4Ě\x12\x11\x01\x06\x134,+\b\x17\"\x02\x05\v\x03\v\x0e\x06\x12*\f\x10+, \x0e\a\x1a1JH'5\x18\x1d\x13G\x19\x1a:\x8c:\v#L\x13\x1d\x185\x1c+@=&#\x01\x11\x12\x9a\xc4\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01P\x06\a\a\x05\x06\a\a.\a\x03\x04\b\b\x03\x041\x04\x04\x02\x04\x05\x03\x02\x13\x01\a\x02\a\b\a\x06G\a\x04\x03\a\a\x04\x03\x04\x10\x10\x0f\a\x04\a\b\x04\x01E\xd4\x01,\xfe\xd4ԧ\xfe\xf54\x03\x10\f4+\x01\x03\x01\t\x1f\x1a;\x0f\x01\x05\v\b\a\x04\x1b\x16\x1c\x1c\a\x06/\x16\x06\x195cFO:>J\x06\x1b\x10\x10\x11\x11\a\x16\x1e\x06J>:O9W5$\x10\x04\x1f@(b\x02\f\x10\x034\x01\v\x02\x87\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x04\x00\x00\xff\x80\x06\x80\x05\xc0\x00\a\x00\x0f\x00'\x00?\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x1e\x013!267!2\x16\x01\x06#!\x11\x14\x06#!\"&5\x11!\"'&7\x0162\x17\x01\x16\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01\xab\x15c=\x01\x00=c\x15\x01\xab(8\xfe\xbb\x11*\xff\x00&\x1a\xff\x00\x1a&\xff\x00*\x11\x11\x1f\x01\xc0\x126\x12\x01\xc0\x1f&4&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(88HH88\x02`(\xfe@\x1a&&\x1a\x01\xc0('\x1e\x01\xc0\x13\x13\xfe@\x1e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x05\xff\x05\x80\x001\x00c\x00\x00\x014&'.\x0254654'&#\"\x06#\"&#\"\x0e\x01\a\x06\a\x0e\x02\x15\x14\x16\x15\x14\x06\x14\x1632632\x16327>\x01\x127\x14\x02\x06\a\x06#\"&#\"\x06#\"&54654&54>\x02767632\x1632632\x16\x15\x14\x06\x15\x14\x1e\x02\x17\x1e\x01\x05\u007f\x0e\v\f\n\b\n\n\x04\t\x13N\x14<\xe8;+gC8\x89A`\u007f1\x19\x16\x18\x16\x18a\x199\xe19\xb5g\x81\xd5w\x80\x8c\xfc\x9b|\xca9\xe28\x18a\x19Ie\x16\x19$I\x80VN\x9a\xc2z<\xe7:\x13L\x14QJ\n\x04\x03\f\x02\x10\x12\x02\xc6,\x8b\x1b\x1e\x1c-\x1a\x17[\x16%\x12\x01\t0\x17\x18\x1661I\xe9\xef\x81(\xa0)\x17W,\x1d\x16\x1f$-\xd7\x01\x14\x8b\xa5\xfe\xbb\xfb7,\x1d\x1doI\x18X\x17(\xa1)o\xd5ζA;=N0\neT\x17Z\x17\r\x18\t \x04(\x9d\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00O\x00\x00\x01\x14\x06\a\x06\a\x06#\".\x03'&'&\x00'&'.\x0454767>\x0132\x17\x16\x17\x1e\x02\x17\x1e\x02\x15\x14\x0e\x02\x15\x14\x1e\x02\x17\x1e\x01\x17\x1e\x0332>\x0232\x1e\x01\x17\x1e\x02\x17\x16\x17\x16\x05\x80\x14\v\x15e^\\\x1b4?\x1fP\tbM\u007f\xfe\xeeO0#\x03\x1e\v\x12\a382\x19W\x1b\x0e\a\x12#\v& \x0f\x03\x1d\x0e9C9\n\a\x15\x01Lĉ\x02\"\x0e\x1b\t\x1282<\x14\x0e\x1d*\x04\x199F\x13F\x06\x03\x01(\x1bW\x19283\a\x12\v\x1e\x03#0O\x01\x12\u007fMb\tP\x1f?4\x1b\\^e\x15\v\x14\x03\x06F\x13F9\x19\x04*\x1d\x0e\x14<28\x12\t\x1b\x0e\"\x02\x89\xc4L\x01\x15\a\n9C9\x0e\x1d\x03\x0f &\v#\x12\a\x00\x00\x00\x02\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00\x00\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x04`\xfc\xc0B^^B\x03@B^^ީw\xfc\xc0w\xa9\xa9w\x03@w\xa9\x05\x00^B\xfc\xc0B^^B\x03@B^\xa0\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x02\x00\x00\xff\x97\x05\x00\x05\x80\x00\x06\x00#\x00\x00\x01!\x11\x017\x17\x01\x132\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x80\xfc\x00\x01\xa7YY\x01\xa7\f\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x00\xfb&\x01\x96UU\xfej\x05Z\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00W\x00\x00\x014.\x04'.\x02#\"\x0e\x02#\".\x02'.\x01'.\x0354>\x0254.\x01'.\x05#\"\a\x0e\x01\x15\x14\x1e\x04\x17\x16\x00\x17\x1e\x0532676\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x04 1.-\x06\x05\x1c\x16\n\x0f+$)\r\a\x13\f\x16\x03c\x8e8\x02\r\x06\a)1)\n\x14\x03\x03\x18\x1a\x1b\x17\n\v05.D\x05\x05\r\a\x12\x02<\x019\xa4\x060\x12)\x19$\x109\x93\x15\x16\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01W\v\n\x17\x1b\x1a\x18\x03\x03\x14\n)1)\a\x06\r\x027\x8fc\x03\x16\f\x13\a\r)$+\x0f\n\x16\x1c\x05\x06-.1 \x04\x16\x15\x939\x10$\x19)\x120\x06\xa4\xfe\xc7<\x02\x12\a\r\x05\x05D.5\x039\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00,\x00\x00\x06T\x05\x00\x001\x00\x00\x01\x06\a\x16\x15\x14\x02\x0e\x01\x04# '\x16327.\x01'\x16327.\x01=\x01\x16\x17.\x01547\x16\x04\x17&54632\x1767\x06\a6\x06TC_\x01L\x9b\xd6\xfeҬ\xfe\xf1\xe1#+\xe1\xb0i\xa6\x1f!\x1c+*p\x93DNBN,y\x01[\xc6\b\xbd\x86\x8c`m`%i]\x04hbE\x0e\x1c\x82\xfe\xfd\xee\xb7m\x91\x04\x8a\x02}a\x05\v\x17\xb1u\x04&\x03,\x8eSXK\x95\xb3\n&$\x86\xbdf\x159s?\n\x00\x00\x00\x01\x00_\xff\x80\x03\xbf\x06\x00\x00\x14\x00\x00\x01\x11#\"\x06\x1d\x01!\x03#\x11!\x11#\x11!54632\x03\xbf\x9dV<\x01%'\xfe\xfe\xce\xff\x00\xffЭ\x93\x05\xf4\xfe\xf8HH\xbd\xfe\xd8\xfd\t\x02\xf7\x01(ں\xcd\x00\x00\x00\b\x00\x00\xff\xa7\x06\x00\x05\x80\x00T\x00\\\x00d\x00k\x00s\x00z\x00\x82\x00\x88\x00\x00\x00 \x04\x12\x15\x14\x00\a\x06&54654'>\x0454'6'&\x06\x0f\x01&\"\a.\x02\a\x06\x17\x06\x15\x14\x1e\x03\x17\x06\a\x0e\x01\"&'.\x01/\x01\"\x06\x1e\x01\x1f\x01\x1e\x01\x1f\x01\x1e\x03?\x01\x14\x16\x15\x14\x06'&\x0054\x12\x136'&\a\x06\x17\x16\x176'&\a\x06\x17\x16\x176'&\a\x06\x16\x176'&\a\x06\x17\x16\x176'&\x06\x17\x1674\a\"\x15\x14727&\a\x06\x166\x02/\x01\xa2\x01a\xce\xfe\xdb\xe8\x1b\x1a\x0149[aA)O%-\x1cj'&]\xc6]\x105r\x1c-%O)@a[9'\n\x150BA\x17\x13;\x14\x14\x15\x10\x06\f\a\a\x16+\n\n\r>HC\x16\x17\x01\x1a\x1b\xe8\xfe\xdb\xceU\x03\n\n\x03\x03\n\t#\a\t\n\x06\a\t\n$\t\t\b\t\t\x122\b\f\f\b\t\r\fA\x03\x10\x0f\b\x11\x0fC\x11\x10\x11\x10:\x02\x10\x10\x04 \x05\x80\xce\xfe\x9f\xd1\xfb\xfeoM\x05\x18\x12\x03\x93=a-\x06\x186O\x83UwW[q\t(\x18\x18\x1a\x1a\v -\tq[WwU\x82P6\x18\x06$C\n\n+) (\x04\x03\t\x0e\x0e\x05\x05\n8\x17\x17&/\r\x01\x04\x04&e\x04\x12\x18\x05M\x01\x91\xfb\xd1\x01a\xfc\u007f\a\x05\x03\x05\a\x05\x06\x1a\x05\v\t\x06\x05\v\n&\a\f\r\a\x05\x1a$\b\v\f\t\b\v\f\x10\v\x05\x04\x16\x04\x06\a\r\x02\v\r\x02\x15\v\x02\x03\x18\b\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00%\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&\"\x06\x1d\x0132\x16\x15\x11\x14\x06#!\"&5\x11463!54\x00 \x00\x06\x80&\x1a@\x1a&\x96Ԗ`(88(\xfc@(88(\x02\xa0\x01\a\x01r\x01\a\x03\xc0\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xc08(\xfd\xc0(88(\x02@(8\xc0\xb9\x01\a\xfe\xf9\x00\x00\x00\x05\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x00\x19\x00#\x00'\x00+\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x15\"\x06\x1d\x01!54&#\x11265\x11!\x11\x14\x16375!\x1535!\x15\x06\xe0B^^B\xf9\xc0B^^B\r\x13\x06\x80\x13\r\r\x13\xf9\x80\x13\r`\x01\x00\x80\x01\x80\x05\x80^B\xfb@B^^B\x04\xc0B^\x80\x13\r\xe0\xe0\r\x13\xfb\x00\x13\r\x02`\xfd\xa0\r\x13\x80\x80\x80\x80\x80\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\a\x00!\x00=\x00\x00\x00\x14\x06\"&462\x01\x16\a\x06+\x01\"&'&\x00'.\x01=\x01476;\x01\x16\x04\x17\x16\x12\x05\x16\a\x06+\x01\"&'&\x02\x00$'.\x01=\x01476;\x01\f\x01\x17\x16\x12\x01\x80p\xa0pp\xa0\x02p\x02\x13\x12\x1d\x87\x19$\x02\x16\xfe\xbb\xe5\x19!\x15\x11\x1a\x05\xa0\x01$qr\x87\x02\r\x02\x14\x12\x1c\x8f\x1a%\x01\f\xb2\xfe\xe3\xfe}\xd7\x19#\x14\x12\x1a\x03\x01\x06\x01ߺ\xbb\xd6\x01\x10\xa0pp\xa0p\xfe\xc5\x1c\x14\x15!\x19\xe5\x01E\x16\x02$\x19\x87\x1d\x12\x11\r\x87rq\xfeܢ\x1b\x14\x14#\x19\xd7\x01\x83\x01\x1d\xb2\r\x01%\x19\x8f\x1c\x12\x12\rֻ\xba\xfe!\x00\x05\x00\x00\x00\x00\x06\x00\x05\x00\x00\a\x00\x0f\x00\x1f\x00)\x00?\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x17\x114&#!\"\x06\x15\x11\x14\x163!26\x01!\x03.\x01#!\"\x06\a\x01\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x04\x10/B//B\x01//B//B\x9f\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfb2\x04\x9c\x9d\x04\x18\x0e\xfc\xf2\x0e\x18\x04\x04\xb1^B\xfb@B^\x10\xc5\x11\\7\x03\x0e7\\\x11\xc5\x10\x01aB//B//B//B/\xf0\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x01\xed\x01\xe2\r\x11\x11\r\xfd~\xfe\xc0B^^B\x01@\x192\x02^5BB5\xfd\xa22\x00\x02\x00\x00\xff\x83\a\x00\x05\x80\x00.\x004\x00\x00\x012\x16\x14\x06#\x11\x14\x06#\x00%\x0e\x01\x16\x17\x0e\x01\x1e\x02\x17\x0e\x01&'.\x0467#\"&=\x01463! \x012\x16\x15\x03\x11\x00\x05\x11\x04\x06\x805KK5L4\xfe_\xfeu:B\x04&\x14\x06\x121/&\x1d\xa5\xac.\a-\x13\x1b\x03\n\x11zB^^B\x01\xe0\x01\xb3\x01\xcd4L\x80\xfev\xfe\x8a\x01y\x03\x80KjK\xfe\x804L\x01[!\x13^k'!A3;)\x1e:2\x1b*\x17\x81\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\xfdv\x05\x14\xfe\xf60Z\x99\xba\x99Z0\x04\xc0L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x010\x01,\x02\x143lb??bl3\xfd\xec\xfe\xd44Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x00\x01\x00\x02\xff\x80\x05\xfe\x05}\x00I\x00\x00\x01\x17\x16\a\x06\x0f\x01\x17\x16\a\x06/\x01\a\x06\a\x06#\"/\x01\a\x06'&/\x01\a\x06'&?\x01'&'&?\x01'&76?\x01'&76\x1f\x017676\x1f\x0176\x17\x16\x1f\x0176\x17\x16\x0f\x01\x17\x16\x17\x16\a\x05`\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n)\f\a\x1f\x14\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x8a\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n))\x1d\x87\x87\x1d))\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x02\x80\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\x02\x16\x8a\x8a\x1e\n\v)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc)\n\f\x1f\x8b\x8b\x1e\v\n)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x005\x00h\x00\x00$4&\"\x06\x14\x162\x014&#!4>\x0254&#\"\a\x06\a\x06\a\x06\a\x06+\x01\x1132\x1e\x013254'>\x014'654&'!267\x14\x06+\x01\x06\a\x16\x15\x14\a\x16\x06#\"'&#!\"&5\x11463!2>\x05767>\x0432\x16\x15\x14\a!2\x16\x01\x00&4&&4\x05\xa6N2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5Q\xbd\x05\x1e#\x125\x14\x0f\x01K4L\x80\x97i\xa9\x04!\x03<\x01\xac\x8d\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\xa64&&4&\x02\x803M\x1495S+C=\x8b,\x15@QQ\x199\xfd\x80@@\xa7\x1a\x1e\x10IJ 2E\x19=\x11L5i\x98>9\x15\x16eM\x8b\xa1E;K5\x02\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x005\x00=\x00q\x00\x00%3\x11#\".\x02'&'&'&'.\x04#\"\x06\x15\x14\x1e\x02\x15!\"\x06\x15\x14\x163!\x0e\x01\x15\x14\x17\x06\x14\x16\x17\x06\x15\x14\x1632>\x01$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"\a\x06#\"&?\x01&547&'#\"&5463!&54632\x1e\x03\x17\x16\x17\x1e\x063!2\x16\x05` #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K\x0f\x145\x12#\x1e\x04aWTƾ\x01h&4&&4\xa6K5\xfe\xe0;\xa4\xbe\u007f\x8e\xb0\x01\x01=\x03!\x04\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5K\x80\x02\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L\x11=\x19E2 JI\x10\x18 UR@@&4&&4&\x02\x80\xfd\x805K;E\x9b\x8c\x05Lf\x16\x159>\x98ig\x98R\x157J\x03\x1c\x0f\x1c\x11\x13\tK\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x005\x00h\x00\x00\x044&\"\x06\x14\x162\x134#\"\a.\x01\"\a&#\"\x06\a\x114&#\"\x06\x15\x11\".\x02#\"\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x16\x1d\x01!54>\x017\x14\a\x06\x15\x11\x14\x06#!\"&5\x114.\x05'&'.\x0454632\x17\x114632\x16\x1d\x01\x16\x17632\x176\x16\x05\x00&4&&4\xa6\xa7\x1a\x1e\x10IJ 2E\x19=\x11L43M\x1495S+C=\x8b,\x15@QQ\x199\x02\x80@@\x80E;K5\xfd\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98gi\x98>9\x15\x16eM\x8b\xa1Z4&&4&\x03<\xbd\x05\x1e#\x125\x14\x0f\x01K4LN2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5V\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\x97i\xa9\x04!\x03<\x01\xac\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x004\x00<\x00p\x00\x00\x014.\x01=\x01!\x15\x14\x0e\x02\a\x06\a\x06\a\x06\a\x0e\x04\x15\x14\x1632>\x023\x11\x14\x163265\x11\x16327\x16267\x16326\x024&\"\x06\x14\x162\x01\x14\x06/\x01\x06#\"'\x06\a\x15\x14\x06#\"&5\x11\x06#\"&54>\x03767>\x065\x11463!2\x16\x15\x11\x14\x17\x16\x05\x80@@\xfd\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L.9E2 JI\x10\x18 UR\x80&4&&4\x01&\x9b\x8c\x05Lf\x16\x156A\x98ig\x986Jy\x87#@>R\x157J\x03\x1c\x0f\x1c\x11\x13\tK5\x02\x805K;E\x02@TƾH #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K#5\x12#\x1e\x04a\x03=4&&4&\xfdD\x8e\xb0\x01\x01=\x03\x1e\a\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5KK5\xfe\xe0;\xa4\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x0154&#!764/\x01&\"\a\x01\a\x06\x14\x1f\x01\x01\x162?\x0164/\x01!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x00&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x126\x12[\x12\x12\xbd\x01\xf6\x1a&\x01\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\xbd\x134\x13[\x12\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01\x01&\"\x0f\x01\x06\x14\x1f\x01!\"\x06\x1d\x01\x14\x163!\a\x06\x14\x1f\x01\x1627\x017$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x05\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\x126\x12\x01j[\x01\r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02e6\x12[\x01j\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\xfe\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004'\x01'&\"\x0f\x01\x01\x06\x14\x1f\x01\x162?\x01\x11\x14\x16;\x01265\x11\x17\x162?\x01$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02f6\x12\x01j[\x12\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\xfd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01&\"\x0f\x01\x114&+\x01\"\x06\x15\x11'&\"\x0f\x01\x06\x14\x17\x01\x17\x162?\x01\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\x126\x12[\x01j\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02d6\x12[\x12\x12\xbd\x01\xf6\x1a&&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x00\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x01\xd8\x02\x18\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x01\x0e\x01\a2>\x01767676\x17&67>\x01?\x01\x06&'\x14\a4&\x06'.\x02'.\x01'.\x03\"\x0e\x01#&\x0e\x02\a\x0e\x01\a6'&\a6&'3.\x02'.\x01\a\x06\x1e\x01\x15\x16\x06\x15\x14\x16\a\x0e\x01\a\x06\x16\x17\x16\x0e\x02\x0f\x01\x06&'&'&\a&'&\a6'&\a>\x01567>\x02#\x167>\x0176\x1e\x013\x166'\x16'&'&\a\x06\x17&\x0e\x01'.\x01'\"\a6&'6'.\x01\a\x0e\x01\x1e\x02\x17\x16\a\x0e\x02\a\x06\x16\a.\x01'\x16/\x01\"\x06&'&76\x17.\x01'\x06\a\x167>\x0176\x177\x16\x17&\a\x06\a\x16\a.\x02'\"\a\x06\a\x16\x17\x1e\x027\x16\a6\x17\x16\x17\x16\a.\x01\a\x06\x167\"\x06\x14\a\x17\x06\x167\x06\x17\x16\x17\x1e\x02\x17\x1e\x01\x17\x06\x16\a\"\x06#\x1e\x01\x17\x1e\x0276'&'.\x01'2\x1e\x02\a\x06\x1e\x02\x17\x1e\x01#2\x16\x17\x1e\x01\x17\x1e\x03\x17\x1e\x01\x17\x162676\x16\x17\x167\x06\x1e\x02\x17\x1e\x01\x1767\x06\x16765\x06'4.\x026326&'.\x01'\x06&'\x14\x06\x15\"'>\x017>\x03&\a\x06\a\x0e\x02\a\x06&'.\x0154>\x01'>\x017>\x01\x1667&'&#\x166\x17\x1674&7\x167\x1e\x01\x17\x1e\x0267\x16\x17\x16\x17\x16>\x01&/\x0145'.\x0167>\x0276'27\".\x01#6'>\x017\x1676'>\x017\x16647>\x01?\x016#\x1676'6&'6\x1676'&\x0367.\x01'&'6.\x02'.\x03\x06#\a\x0e\x03\x17&'.\x02\x06\a\x0e\x01\a&6'&\x0e\x04\a\x0e\x01\a.\x015\x1e\x01\x17\x16\a\x06\a\x06\x17\x14\x06\x17\x14\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03D\x02\x0f\x06\x02\x05\x05\x01\x06\x10\x0e&\"\x11\x02\x17\x03\x03\x18\x03\x02\f\v\x01\x06\t\x0e\x02\n\n\x06\x01\x02\x0f\x02\x01\x03\x03\x05\x06\b\a\x01\x03\x06\x03\x06\x02\x03\v\x03\x0f\x10\n\x06\t\x03\a\x05\x01\x0f\x14\x03\b4\a\x05\x01\a\x01\r\x1c\x04\x03\x1a\x03\x05\a\a\x02\x01\x06\x05\x04\x03\v\x13\x04\a\t\x17\x06\x05$\x19!\x06\x06\a\f\x03\x02\x03\t\x01\f\a\x03#\x0f\x05\r\x04\t\n\x13\x05\x0e\x03\t\f\t\x04\x04\f\x0f\b\n\x01\x11\x10\b\x01\t\x05\b\b\x03\x1c\n\x13\x1b\a\x1b\x06\x05\x01\v\n\r\x02\x0e\x06\x02\r\n\x01\x03\x06\x05\x05\b\x03\a \n\x04\x18\x11\x05\x04\x04\x01\x03\x04\x0e\x03.0\x06\x06\x05\x10\x02\"\b\x05\x0e\x06\a\x17\x14\x02\a\x02\x04\x0f\x0e\b\x10\x06\x92Y\a\x05\x04\x02\x03\n\t\x06\x01+\x13\x02\x03\r\x01\x10\x01\x03\a\a\a\x05\x01\x02\x03\x11\r\r!\x06\x02\x03\x12\f\x04\x04\f\b\x02\x17\x01\x01\x03\x01\x03\x19\x03\x01\x02\x04\x06\x02\x1a\x0f\x02\x03\x05\x02\x02\b\t\x06\x01\x03\n\x0e\x14\x02\x06\x10\b\t\x16\x06\x05\x06\x02\x02\r\f\x14\x03\x05\x1b\b\n\f\x11\x05\x0f\x1c\a$\x13\x02\x05\v\a\x02\x05\x1a\x05\x06\x01\x03\x14\b\x0e\x1f\x12\x05\x03\x02\x02\x04\t\x02\x06\x01\x01\x14\x02\x05\x16\x05\x03\r\x02\x01\x03\x02\x01\t\x06\x02\v\f\x13\a\x01\x04\x06\x06\a\"\a\r\x13\x05\x01\x06\x03\f\x04\x02\x05\x04\x04\x01\x01\x03\x03\x01\a+\x06\x0f\a\x05\x02\x05\x18\x03\x19\x05\x03\b\x03\a\x05\n\x02\v\b\a\b\x01\x01\x01\x01\x01\x0f\a\n\n\x01\x0e\x11\x04\x15\x06\a\x04\x01\b\a\x01\t\a\x05\x05\x05\t\f\b\a\x05\x1f\x03\a\x02\x03\x04\x16\x02\x11\x03\x03\x12\r\n\x10\x03\f\t\x03\x11\x02\x0f\x16\x11\xbdΑ\x03\x13\x03\x12\x06\x01\a\t\x10\x03\x02\n\x04\v\x06\a\x03\x03\x05\x06\x02\x01\x15\x0f\x05\f\t\v\x06\x05\x02\x01\a\x0e\x05\x03\x0f\t\x0e\x04\r\x02\x03\x06\x02\x02\x13\x02\x04\x03\a\x13\x1b\x02\x04\x10\x10\x01\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfe\xc5\x01\x11\x01\n\f\x01\a\b\x06\x06\b\x13\x02\x16\x01\x02\x05\x05\x16\x01\x10\r\x02\x06\a\x02\x04\x01\x03\t\x18\x03\x05\f\x04\x02\a\x06\x05\n\n\x02\x01\x01\x05\x01\x02\x02\x01\x05\x06\x04\x01\x04\x10\x06\x04\t\b\x02\x05\t\x04\x06\t\x13\x03\x06\x0e\x05\a\x11\r\b\x10\x04\b\x15\x06\x02\x04\x05\x03\x02\x02\x05\x16\x0f\x19\x05\b\t\r\r\t\x05\x01\x0e\x0f\x03\x06\x17\x02\r\n\x01\x0f\f\x04\x0f\x05\x18\x05\x06\x01\n\x01\x18\b\x01\x12\a\x02\x04\t\x04\x04\x01\x17\f\v\x01\x19\x01\x0f\b\x0e\x01\f\x0f\x04\x02\x05\a\t\a\x04\x04\x01\n\x04\x01\x05\x04\x02\x04\x14\x04\x05\x19\x04\t\x03\x01\x04\x02\a\b\f\x04\x02\x03\r\x02\x0f\x1a\x01\x02\x02\t\x01\x0e\a\x05\x10\t\x04\x03\x06\x06\f\x06\x03\x0e\b\x01\x01P\x8e\a\x01\x01\x10\x06\x06\b\v\x01\x1c\x11\x04\v\a\x02\x0e\x03\x05\x1b\x01 '\x04\x01\f-\x03\x03(\b\x01\x02\v\t\x06\x05#\x06\x06\x1c\t\x02\a\x0e\x06\x03\x0e\b\x02\x14*\x19\x04\x05\x15\x04\x03\x04\x04\x01\a\x15\x10\x16\x02\x06\x1b\x15\t\b$\x06\a\r\x06\n\x02\x02\x11\x03\x04\x05\x01\x02\"\x04\x13\b\x01\r\x12\v\x03\x06\x12\x06\x04\x05\b\x18\x02\x03\x1d\x0f!\x01\t\b\t\x06\a\x12\x04\b\x18\x03\t\x02\b\x01\t\x02\x01\x03\x1d\b\x04\x10\r\f\a\x01\x01\x13\x03\x0f\b\x03\x03\x02\x04\b*\x10\n!\x11\x10\x02\x0f\x03\x01\x01\x01\x04\x04\x01\x02\x03\x03\t\x06\v\r\x01\x11\x05\x1b\x12\x03\x04\x03\x02\a\x02\x03\x05\x0e\n(\x04\x03\x02\x11\v\a\b\t\t\b\x03\x12\x13\t\x01\x05\b\x04\x13\x10\t\x06\x04\x05\v\x03\x10\x02\f\n\b\b\a\a\x06\x02\b\x10\x04\x05\b\x01\v\x04\x02\r\v\t\x06\a\x02\x01\x01\x02\n\x06\x05\xfc\x82$\x99\x03\x03\x02\a\x01\a\f\x06\n\x02\x02\b\x03\x06\x02\x01\x01\x03\x03\x03\x01\x11\x05\x01\t\x05\x02\x06\x05\x14\x03\x05\x19\x06\x06\x03\x06\v\x02\t\x03\x04\x10\x03\x04\x05\x03\n2\r\x1f\x11\x19\x0f\x16\x04\a\x1b\b\x06\x00\x00\x03\x00\x15\xff\x15\x06~\x05\x80\x00\a\x00\x15\x00/\x00\x00$4&\"\x06\x14\x162\t\x01\x06#\"/\x01&547\x01\x1e\x01\x01\x14\a\x0e\x01#\"\x00\x10\x0032\x16\x17\x16\x14\a\x05\x15\x17>\x0232\x16\x01\x80&4&&4\x02\xaa\xfdV%54'j&&\x02\xa9'\x97\x02\xdc\x17/덹\xfe\xf9\x01\a\xb9:\u007f,\x10\x10\xfe\xdb\xc1\x05\x94{\t\x0f\x11&4&&4&\x01\xe4\xfdV%%l$65&\x02\xa9b\x97\x01\x8c'C\x86\xa7\x01\a\x01r\x01\a!\x1e\v\"\v\xa9\xe0k\x03[G\x14\x00\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x1b\x00+\x00;\x00\x00%!5!\x01!5!\x01!5!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x04\x00\x02\x80\xfd\x80\xfe\x80\x04\x00\xfc\x00\x02\x80\x01\x80\xfe\x80\x02\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\x80\x80\x01\x80\x80\x01\x80\x80\xfc@\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x01\x00\x05\xff\x80\x05{\x05\x00\x00\x15\x00\x00\x01\x16\a\x01\x11\x14\a\x06#\"'\x01&5\x11\x01&763!2\x05{\x11\x1f\xfe\x13'\r\f\x1b\x12\xff\x00\x13\xfe\x13\x1f\x11\x11*\x05\x00*\x04\xd9)\x1d\xfe\x13\xfd\x1a*\x11\x05\x13\x01\x00\x13\x1a\x01\xe6\x01\xed\x1d)'\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x06\x00\x00\x03\x00\x17\x00\x1b\x00/\x00\x00\x01!5!\x01\x11\x14\x06#!\"&5\x11!\x15\x14\x163!26=\x01#\x15!5\x01\x11!\x11463!5463!2\x16\x1d\x01!2\x16\x02\x80\x02\x00\xfe\x00\x04\x80^B\xfa@B^\x02\xa0&\x1a\x01@\x1a&`\xff\x00\x04\x00\xf9\x00^B\x01`8(\x02@(8\x01`B^\x05\x00\x80\xfd\x00\xfe B^^B\x01\xe0\xa0\x1a&&\x1a\xa0\x80\x80\x01\xe0\xfe\x80\x01\x80B^\xa0(88(\xa0^\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00\x00\t\x0276\x17\x16\x15\x11\x14\x06#!\"'&?\x01\t\x01\x17\x16\a\x06#!\"&5\x11476\x1f\x01\t\x01\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\t\x01'&763!2\x16\x15\x11\x14\a\x06#\"'\x05\x03\xfe\x9d\x01c\x90\x1d)'&\x1a\xfe@*\x11\x11\x1f\x90\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x13\x1a\f\f(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x1f\x11\x11*\x01\xc0\x1a&'\r\f\x1a\x13\x03\xe3\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x13\x05\x11*\x01\xc0\x1a&('\x1e\x90\xfe\x9d\x01c\x90\x1e'(&\x1a\xfe@*\x11\x05\x13\x00\x00\x06\x00\x00\xff\x00\a\x80\x06\x00\x00\x11\x001\x009\x00A\x00S\x00[\x00\x00\x01\x06\a#\"&5\x1032\x1e\x01327\x06\x15\x14\x01\x14\x06#!\"&54>\x0532\x1e\x022>\x0232\x1e\x05\x00\x14\x06\"&462\x00\x10\x06 &\x106 \x01\x14\x06+\x01&'654'\x1632>\x0132\x02\x14\x06\"&462\x02Q\xa2g\x86Rp|\x06Kx;CB\x05\x04\x80\x92y\xfc\x96y\x92\a\x15 6Fe=\nBP\x86\x88\x86PB\n=eF6 \x15\a\xfc\x00\x96Ԗ\x96\xd4\x03V\xe1\xfe\xc2\xe1\xe1\x01>\x03!pR\x86g\xa2Q\x05BC;xK\x06|\x80\x96Ԗ\x96\xd4\x02\x80\x05{QN\x01a*+\x17%\x1d\x8b\xfd\x0ex\x8b\x8bx5eud_C(+5++5+(C_due\x052Ԗ\x96Ԗ\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\xfd\x9fNQ{\x05u\x8b\x1d%\x17+*\x01jԖ\x96Ԗ\x00\x00\x00\x00\x03\x00\x10\xff\x90\x06p\x05\xf0\x00!\x00C\x00i\x00\x00\x014/\x01&#\"\a\x1e\x04\x15\x14\x06#\".\x03'\x06\x15\x14\x1f\x01\x1632?\x016\x014/\x01&#\"\x0f\x01\x06\x15\x14\x1f\x01\x16327.\x0454632\x1e\x03\x176\x00\x14\x0f\x01\x06#\"/\x01&547'\x06#\"/\x01&4?\x01632\x1f\x01\x16\x15\x14\a\x17632\x1f\x01\x05\xb0\x1c\xd0\x1c(*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x1c\xce\x1b)(\x1c\x93\x1c\xfdA\x1c\xce\x1c('\x1d\x93\x1c\x1c\xd0\x1b)*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x03\u007fU\x93SxyS\xceSXXVzxT\xd0TU\x93SxyS\xceSXXVzxT\xd0\x01@(\x1c\xd0\x1c \x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f*(\x1c\xcf\x1b\x1a\x92\x1c\x02\xe8(\x1c\xcf\x1c\x1b\x92\x1c'(\x1c\xd0\x1b\x1f\x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f\xfd\xe1\xf0S\x92SU\xcfSx{VXXT\xd0T\xf0S\x92SU\xcfSx{VXXT\xd0\x00\x01\x00\x00\x00\x00\a\x80\x05\x80\x00\x1b\x00\x00\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\a\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8et\x02\x01,Ԟ\x01\x01;F`j\x96)\x81\xa8\x01\x80\x9f\xe1\x01\a\xb9\x84\xdb6\x1c\x0f\xd4\x01,\xb0\x8e>\x96jK?\x1e\xd1\x00\x02\x00s\xff\x80\x06\r\x05\x80\x00\x17\x00!\x00\x00%\x16\x06#!\"&7\x01\x11#\"&463!2\x16\x14\x06+\x01\x11\x05\x01!\x01'5\x11#\x11\x15\x05\xf78Ej\xfb\x80jE8\x01\xf7@\x1a&&\x1a\x02\x00\x1a&&\x1a@\xfe\xec\xfe\xf0\x02\xc8\xfe\xf0\x14\x80XY\u007f\u007fY\x03\x19\x01\x8f&4&&4&\xfeqD\xfeS\x01\xad\x1f%\x01\x8f\xfeq%\x00\x00\x00\x00\a\x00\x01\xff\x80\a\x00\x05\x00\x00\a\x00N\x00\\\x00j\x00x\x00\x86\x00\x8c\x00\x00\x002\x16\x14\x06\"&4\x05\x01\x16\a\x06\x0f\x01\x06#\"'\x01\a\x06\a\x16\a\x0e\x01\a\x06#\"'&7>\x017632\x176?\x01'&'\x06#\"'.\x01'&67632\x17\x1e\x01\x17\x16\a\x16\x1f\x01\x01632\x1f\x01\x16\x17\x16\a\x056&'&#\"\a\x06\x16\x17\x1632\x03>\x01'&#\"\a\x0e\x01\x17\x1632\x01\x1754?\x01'\a\x0e\x01\a\x0e\x01\a\x1f\x01\x01'\x01\x15\a\x17\x16\x17\x1e\x01\x1f\x01\x017\x01\a\x06\a\x03\xa64&&4&\x01l\x01\xfb\x1c\x03\x05\x1e\x80\r\x10\x11\x0e\xfdNn\b\x04\x0e\x04\abS\x84\x91\x88VZ\v\abR\x84\x92SD\t\rzz\r\tDS\x92\x84Rb\a\x05)+U\x89\x91\x84Sb\a\x04\x0e\x04\bn\x02\xb2\x0e\x11\x10\r\x80\x1e\x05\x03\x1c\xfb\\.2Q\\dJ'.2Q\\dJ.Q2.'Jd\\Q2.'Jd\x01\x0e`!\x0eO\x1a\x03\x0e\x05\x02\x04\x01\xd7`\x02\xe0\x80\xfd\x00\xa0\t\x02\x05\x04\x0e\x04\x1a\x03`\x80\xfd\xf8\xb1\x02\v\x02\x80&4&&4\x1a\xfer\x14$#\x10@\a\b\x01\x83B\x04\x0110M\x8d5TNT{L\x8e5T\x1f\r\tII\t\r\x1fT5\x8eL;l'OT4\x8eM01\x01\x04B\x01\x83\b\a@\x10#$\x14\x8a*\x843;$*\x843;\xfd;3\x84*$;3\x84*$\x02\xa0:\v$\x14\b/\x1a\x03\x10\x04\x02\x03\x01\xe9 \x02@@\xfeQq`\b\x02\x04\x04\x10\x04\x1a\xfe\xc0@\x01\x98\x8a\x03\x04\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00\"\x00%\x003\x00<\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11!\"&5\x11467\x01>\x013!2\x16\x15\x1163\a\x01!\t\x01!\x13\x01\x11!\x11\x14\x06#!\x11!\x1146\x01\x11!\x11\x14\x06#!\x11\x06\xa0(88(\xfc@(8\xfd\xe0(8(\x1c\x01\x98\x1c`(\x01\xa0(8D<\x80\xfe\xd5\x01+\xfd\x80\xfe\xd5\x01+\xc4\x01<\xfe\x808(\xfe`\x02\x00(\x03\xd8\xfe\x808(\xfe`\x04\x808(\xfb@(88(\x01 8(\x02\xa0(`\x1c\x01\x98\x1c(8(\xfe\xb8(\xd5\xfe\xd5\x02\xab\xfe\xd5\xfe\xa4\x01<\x01\xa0\xfe`(8\xfd\x80\x01\x00(`\xfc\xf8\x04\x80\xfe`(8\xfd\x80\x00\x00\x00\x01\x00\x04\xff\x84\x05|\x05|\x00?\x00\x00%\x14\x06#\"'\x01&54632\x17\x01\x16\x15\x14\x06#\"'\x01&#\"\x06\x15\x14\x17\x01\x1632654'\x01&#\"\x06\x15\x14\x17\x01\x16\x15\x14\x06#\"'\x01&54632\x17\x01\x16\x05|\x9eu\x87d\xfc\xf7qܟ\x9es\x02]\n=\x10\r\n\xfd\xa2Ofj\x92L\x03\b?R@T?\xfd\xbb\x1a\"\x1d&\x19\x01\x9a\n>\x10\f\n\xfef?rRX=\x02Ed\x97u\x9ed\x03\bs\x9c\x9f\xdeq\xfd\xa2\n\f\x10=\n\x02_M\x96jiL\xfc\xf7?T@R?\x02E\x18&\x1d \x1b\xfef\n\f\x10>\n\x01\x9a=XRr?\xfd\xbbb\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00!\x001\x00E\x00\x00)\x01\x11!\x013\x114&'\x01.\x01#\x11\x14\x06#!\"&5\x11#\x113\x11463!2\x16\x15\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x05\x11\x14\x06#!\"&5\x11463!2\x16\x17\x01\x1e\x01\x01\x80\x03\x00\xfd\x00\x03\x80\x80\x14\n\xfe\xe7\n0\x0f8(\xfd\xc0(8\x80\x808(\x03@(8\xfe\x80\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x808(\xfa\xc0(88(\x03\xa0(`\x1c\x01\x18\x1c(\x01\x80\xfe\x80\x03\x80\x0e1\n\x01\x19\n\x14\xfe`(88(\x01\xa0\xfb\x00\x01\xa0(88(\x02\x00\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x13\xfc`(88(\x05@(8(\x1c\xfe\xe8\x1c`\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x04`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x05\x00\x00\x0f\x00\x1f\x00/\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x00\x06\x00\x00\xff\xc0\a\x00\x05@\x00\a\x00\x0f\x00\x1f\x00'\x007\x00G\x00\x00$\x14\x06\"&462\x12\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x00\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80p\xa0pp\xa0pp\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfa\x80p\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13Рpp\xa0p\x01\x90\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x03\xe3\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x06\x00\x0f\xff\x00\a\x00\x05\xf7\x00\x1e\x00<\x00L\x00\\\x00l\x00|\x00\x00\x05\x14\x06#\"'7\x1632654\a'>\x0275\"\x06#\x15#5!\x15\a\x1e\x01\x13\x15!&54>\x0354&#\"\a'>\x0132\x16\x15\x14\x0e\x02\a35\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15!5346=\x01#\x06\a'73\x11\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01}mQjB919\x1d+i\x1a\b1$\x13\x10A\x10j\x01M_3<\x02\xfe\x96\x06/BB/\x1d\x19.#U\x18_:IdDRE\x01\u007f\x05\xea\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\xfa\x80\xfe\xb1k\x01\x02\b*G\x88j\x05\xec\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13TP\\BX-\x1d\x1c@\b8\nC)\x12\x01\x025\x98Xs\fJ\x02@\x9f$\x123T4+,\x17\x19\x1b:;39SG2S.7\x19<\xfe\xc1\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x03vcc)\xa1)\f\x11%L\u007f\xfel\xfe}\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x005\x00e\x00\x00\x012\x16\x1d\x01\x14\x06#!\"&=\x01463%&'&5476!2\x17\x16\x17\x16\x17\x16\x15\x14\x0f\x01/\x01&'&#\"\a\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x03!\x16\x15\x14\a\x06\a\x06\a\x06\a\x06#\"/\x01&'&=\x014'&?\x0157\x1e\x02\x17\x16\x17\x16\x17\x1632767654'&\x06\xe0\x0e\x12\x12\x0e\xf9@\x0e\x12\x12\x0e\x01\xc3\x1c\x170\x86\x85\x01\x042uBo\n\v\x0e\x05\fT\x0e25XzrDCBB\xd5Eh:%\xec\x01\x9b\a)\x170%HPIP{rQ\x8c9\x0f\b\x02\x01\x01\x02f\x0f\x1e\x0f\x05#-+>;I@KM-/Q\"\x02\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12@#-bZ\xb5\x80\u007f\x13\f$&P{<\x12\x1b\x03\x06\x02\x958[;:XICC>\x14.\x1c\x18\xff\x00'5oe80#.0\x12\x15\x17(\x10\f\b\x0e\rl0\x1e&%,\x02\"J&\b9%$\x15\x16\x1b\x1a<=DTI\x1d\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00c\x00s\x00\x00\x13&/\x01632\x17\x163276727\a\x17\x15\x06#\"\a\x06\x15\x14\x16\x15\x17\x13\x16\x17\x16\x17\x16327676767654.\x01/\x01&'&\x0f\x01'73\x17\x167\x17\x16\x15\x14\a\x06\a\x06\a\x06\x15\x14\x16\x15\x16\x13\x16\a\x06\a\x06\a\x06\a\x06#\"'&'&'&5\x114'&\x0154&#!\"\x06\x1d\x01\x14\x163!260%\b\x03\r\x1b<4\x84\"VRt\x1e8\x1e\x01\x02<@<\x13\r\x01\x01\x0e\x06-#=XYhW8+0\x11$\x11\x15\a\x0f\x06\x04\x05\x13\"+d\x0e\x02T\xcdLx\x12\x06\x04-'I\x06\x0f\x03\b\x0e\x06\x15\x0f\x1a&JKkm\x92\xa7uw<=\x16\x10\x11\x19\x05V\x12\x0e\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x05!\x02\x02X\x01\x04\a\x03\x04\x01\x02\x0e@\t\t\x19\x0ev\r'\x06\xe5\xfe\xe8|N;!/\x1c\x12!$\x1c8:I\x9cOb\x93V;C\x15#\x01\x02\x03V\n\x03\r\x02&\r\a\x18\f\x01\v\x06\x0f\x1a\a(\v\x13\xfe\x87\xc3mL.A:9 !./KLwP\x9d\x01M\xbc\x19$\xfa\x82@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\n\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%54&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x80^B\xfa\xc0B^^B\x05@B^\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01N\xfb\xc0B^^B\x04@B^^\x00\x00\x00\x06\x00\x1b\xff\x9b\x06\x80\x06\x00\x00\x03\x00\x13\x00\x1b\x00#\x00+\x003\x00\x00\t\x01'\x01$\x14\a\x01\x06\"/\x01&47\x0162\x1f\x01%\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x04\xa6\x01%k\xfe\xdb\x02*\x12\xfa\xfa\x126\x12\xc6\x12\x12\x05\x06\x126\x12\xc6\xfa\xcbbb\x1e\x1ebb\x1e\x01|\xc4\xc4<<\xc4\xc4<\x03\xdebb\x1e\x1ebb\x1e\xfd\x9ebb\x1e\x1ebb\x1e\x03\xbb\x01%k\xfe\xdb\xd56\x12\xfa\xfa\x12\x12\xc6\x126\x12\x05\x06\x12\x12Ƒ\x1e\x1ebb\x1e\x1eb\xfe\xfc<<\xc4\xc4<<\xc4\xfd^\x1e\x1ebb\x1e\x1eb\x02\x1e\x1e\x1ebb\x1e\x1eb\x00\x00\x00\x04\x00@\xff\x80\a\x00\x05\x00\x00\a\x00\x10\x00\x18\x00M\x00\x00$4&\"\x06\x14\x162\x01!\x11#\"\x0f\x01\x06\x15\x004&\"\x06\x14\x162\x01\x11\x14\x0e\x04&#\x14\x06\"&5!\x14\x06\"&5#\"\x06.\x045463\x114&>\x03?\x01>\x01;\x015463!2\x16\x02\x80LhLLh\xfe\xcc\x01\x80\x9e\r\t\xc3\t\x05\x00LhLLh\x01L\b\x13\x0e!\f'\x03\x96Ԗ\xfe\x80\x96Ԗ@\x03'\f!\x0e\x13\b&\x1a\x01\x01\x04\t\x13\r\xc6\x13?\x1b\xa0&\x1a\x04\x00\x1a&LhLLhL\x02\x80\x01\x00\t\xc3\t\r\xfd\xaehLLhL\x04\xc0\xfc\x00\x0f\x17\x0e\t\x03\x01\x01j\x96\x96jj\x96\x96j\x01\x01\x03\t\x0e\x17\x0f\x1a&\x01@\b6\x16/\x1b\"\r\xc6\x13\x1a\xc0\x1a&&\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00J\x00\x00\x00\x10\x02\x04#\"'6767\x1e\x0132>\x0154.\x01#\"\x0e\x03\x15\x14\x16\x17\x167>\x0176'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17&\x0254\x12$ \x04\x06\x00\xce\xfe\x9f\xd1ok;\x13\t-\x14j=y\xbehw\xe2\x8ei\xb6\u007f[+PM\x1e\b\x02\f\x02\x06\x113ѩ\x97\xa9\x89k=J\x0e\b%\x1762>V\x19c\x11\x04\xce\xfe\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce ]G\"\xb1'9\x89\xf0\x96r\xc8~:`}\x86Ch\x9e \f \a0\x06\x17\x14=Z\x97٤\x83\xaa\xeeW=#uY\x1f2BrUI1\xfe^Fk[\x01|\xe9\xd1\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00L\x00\x00\x012\x16\x15\x11\x14\x06#!6767\x1e\x0132\x1254.\x02#\"\x0e\x03\x15\x14\x16\x17\x1667676'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17#\"&5\x11463\x04\xe0w\xa9\xa9w\xfd+U\x17\t,\x15i<\xb5\xe5F{\xb6jh\xb5}Z+OM\r\x15\x04\n\x05\x06\x112ϧ\x95\xa7\x87jX\x96բ\x81\xa8\xecW<\"uW\x1f1AqSH1\xfebd\x9a\xa9w\x03\xc0w\xa9\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1b\x00'\x007\x00\x00\x014'!\x153\x0e\x03#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x95\x06\xfe\x96\xd9\x03\x1b0U6c\x8c\x8cc\\=hl\x95\xa0\xe0ࠥ\xcb\x01Ymmnnnn\x01\x12\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02w\x1a&\x84\x1846#\x8eȎ;ed\xe1\xfe\xc2\xe1\xd2wnnnnn\x02\x85\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x02\x00\x00\xff\xa3\t\x00\x05]\x00#\x00/\x00\x00\x01\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x14\x1e\x0132>\x037!5!\x16%\x15#\x15#5#5353\x15\x05\x9d\xae\xfe\xbeЕ\xfe\xf0\xc4tt\xc4\x01\x10\x95\x01\x1e\xcd\xc7u\xaf{\xd1zz\xd1{S\x8bZC\x1f\x06\xfe`\x02\xb4\f\x03c\xd1\xd2\xd1\xd1\xd2\x02o\xd0\xfe\xbb\xb7t\xc4\x01\x10\x01*\x01\x10\xc4t\xc0\xbfq|\xd5\xfc\xd5|.EXN#\xfc??\xd2\xd1\xd1\xd2\xd1\xd1\x00\x00\x00\x04\x00\x00\x00\x00\a\x80\x05\x00\x00\f\x00\x1c\x00,\x00<\x00\x00\x01!5#\x11#\a\x17673\x11#$\x14\x0e\x02\".\x024>\x022\x1e\x01\x01\x11\"&5!\x14\x06#\x112\x16\x15!46\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x00\x01\x80\x80r\x94M*\r\x02\x80\x02\x00*M~\x96~M**M~\x96~M\x02*j\x96\xfb\x80\x96jj\x96\x04\x80\x96\xea&\x1a\xf9\x00\x1a&&\x1a\a\x00\x1a&\x01\x80`\x01\xc0\x89P%\x14\xfe\xe0挐|NN|\x90\x8c\x90|NN|\xfe*\x02\x00\x96jj\x96\xfe\x00\x96jj\x96\x03@\xfb\x80\x1a&&\x1a\x04\x80\x1a&&\x00\x00\x01\x00\x00\x01@\x04\x00\x03\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x03Z4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x01\x00\x04\x00\x03@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00@\x00\x80\x02\x80\x04\x80\x00\r\x00\x00\x01\x11\x14\x06\"'\x01&47\x0162\x16\x02\x80&4\x13\xfe@\x13\x13\x01\xc0\x134&\x04@\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x13&\x00\x00\x00\x01\x00\x00\x00\x80\x02@\x04\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"&5\x11462\x17\x01\x02@\x13\xfe@\x134&&4\x13\x01\xc0\x02\x9a4\x13\xfe@\x13&\x1a\x03\x80\x1a&\x13\xfe@\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00\x1d\x00\x003!\x11!\x11\x14\x16%\x11!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\xa0\x02`\xfd\x80\x13\x05m\xfd\x80\x02`\r\x13\x80^B\xfa\xc0B^^B\x05@B^\x04\x80\xfb\xa0\r\x13 \x04`\xfb\x80\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\xc0\x04\x00\x05@\x00\r\x00\x1b\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x12\x14\x06#!\"&47\x0162\x17\x01\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a&&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00\x00\xff\xc0\x04\x00\x02\x00\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x03\x00\x04\x00\x05@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x03Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00:\x00\x00\x01\x11\x14\x06#!\"&5\x11\x16\x17\x04\x17\x1e\x02;\x022>\x0176%6\x13\x14\x06\a\x00\a\x0e\x04+\x02\".\x03'&$'.\x015463!2\x16\a\x00^B\xfa@B^,9\x01j\x879Gv3\x01\x013vG9\xaa\x01H9+bI\xfe\x88\\\nA+=6\x17\x01\x01\x176=+A\n[\xfe\xaa\">nSM\x05\xc0A_\x03:\xfc\xe6B^^B\x03\x1a1&\xf6c*/11/*{\xde'\x01VO\x903\xfe\xfb@\a/\x1d$\x12\x12$\x1d/\a@\xed\x18*\x93?Nh^\x00\x03\x00\x00\xff\xb0\x06\x00\x05l\x00\x03\x00\x0f\x00+\x00\x00\x01\x11!\x11\x01\x16\x06+\x01\"&5462\x16\x01\x11!\x114&#\"\x06\a\x06\x15\x11!\x12\x10/\x01!\x15#>\x0332\x16\x01]\xfe\xb6\x01_\x01gT\x02Rdg\xa6d\x04\x8f\xfe\xb7QV?U\x15\v\xfe\xb7\x02\x01\x01\x01I\x02\x14*Gg?\xab\xd0\x03\x8f\xfc!\x03\xdf\x012IbbIJaa\xfc\xdd\xfd\xc8\x02\x12iwE3\x1e3\xfd\xd7\x01\x8f\x01\xf000\x90 08\x1f\xe3\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eoz\xce\x00\x01\x00(\xff\x15\x06\xeb\x05\xd8\x00q\x00\x00!\x14\x0f\x01\x06#\"'\x01&547\x01\a\x06\"'\x1e\x06\x15\x14\a\x0e\x05#\"'\x01&54>\x047632\x1e\x05\x17&47\x0162\x17.\x06547>\x0532\x17\x01\x16\x15\x14\x0e\x04\a\x06#\".\x05'\x16\x14\x0f\x01\x01632\x17\x01\x16\x06\xeb%k'45%\xfe\x95&+\xff\x00~\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\xfeh\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e\x01\\\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\x01\x98\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e~\x01\x00+54'\x01k%5%l%%\x01l$65+\x01\x00~\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\x01\x98\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e\x01\\\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\xfeh\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e~\xff\x00+%\xfe\x95'\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x00\x00\a\x00\x0f\x00!\x00)\x001\x009\x00K\x00\x00\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x136.\x01\x06\a\x03\x0e\x01\a\x06\x1e\x01676&$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x044&\"\x06\x14\x162\x01\x10\a\x06#!\"'&\x114\x126$ \x04\x16\x12\x01\x80KjKKj\x01\vKjKKj\x01\xf7e\x06\x1b2.\ae<^\x10\x14P\x9a\x8a\x14\x10,\x02bKjKKj\xfd\xcbKjKKj\x02\vKjKKj\x01\x8b\x8d\x13#\xfa\x86#\x13\x8d\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x01KjKKjK\x02\vjKKjK\xfe\x9f\x01~\x1a-\x0e\x1b\x1a\xfe\x82\x05M\x027>\x057&\x0254\x12$ \x04\x04L\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\xf0\x01\x9c\x01\xe8\x01\x9c\x04\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xc7\xfe\xa4\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\xae\x01'\xab\xab\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x14\x00:\x00d\x00\x00\x00 \x04\x06\x15\x14\x16\x1f\x01\a6?\x01\x17\x1632$64&$ \x04\x16\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546\x01\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x15\x14\x06\x03Y\xfe\xce\xfe\xf6\x9dj`a#\"\x1c,5NK\x99\x01\n\x9d\x9d\xfd\x9e\x01~\x01E\xbc\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x05:\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x8e\x04\x80h\xb2fR\x9888T\x14\x13\x1f\n\x0eh\xb2̲\xe8\x89\xec\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b\xec\xfb\xf8\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6{x\xd1\x00\x01\x00\x01\xff\x00\x03|\x05\x80\x00!\x00\x00\x01\x16\a\x01\x06#\"'.\x017\x13\x05\x06#\"'&7\x13>\x013!2\x16\x15\x14\a\x03%632\x03u\x12\v\xfd\xe4\r\x1d\x04\n\x11\x11\x04\xc5\xfej\x04\b\x12\r\x12\x05\xc9\x04\x18\x10\x01H\x13\x1a\x05\xab\x01\x8c\b\x04\x13\x03\xca\x14\x18\xfb{\x19\x02\x05\x1c\x10\x03(e\x01\v\x0f\x18\x039\x0e\x12\x19\x11\b\n\xfe1b\x02\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00U\x00\x00\x01\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015463!5#\"&5\x11463!2\x16\x15\x11\x14\x06+\x01\x15!2\x16\x1d\x0132\x16\a\x008(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`L4\x02\x00`(88(\x01@(88(`\x02\x004L`(8\x01 \xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc04L\xc08(\x01@(88(\xfe\xc0(8\xc0L4\xc08\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\xc0\x00\x13\x00O\x00Y\x00\x00\x01\x11\x14\x06\"&5462\x16\x15\x14\x16265\x1162\x05\x14\x06#\"'.\x01#\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01#\"\x06\a\x06#\"&5476\x00$32\x04\x1e\x01\x17\x16\x01\x15&\"\a5462\x16\x03\x80\x98И&4&NdN!>\x03!\x13\r\v\f1X:Dx+\a\x15\x04\v\x11\x12\v\x04\x15\a+w\x88w+\a\x15\x04\v\x12\x11\v\x04\x15\a+xD:X1\f\v\r\x13\x01-\x00\xff\x01U\xbe\x8c\x01\r\xe0\xa5!\x01\xfd\x00*,*&4&\x02\xc4\xfd\xbch\x98\x98h\x1a&&\x1a2NN2\x02D\v&\r\x13\n..J<\n$\x06\x11\x11\x06$\n\x01767\x14\a\x0e\x02\a\x16\x15\x14\a\x16\x15\x14\a\x16\x15\x14\x06#\x0e\x01\"&'\"&547&547&547.\x02'&54>\x022\x1e\x02\x02\xe0\x13\x1a\x13l4\r\x13\x13\r2cK\xa0Eo\x87\x8a\x87oED\n)\n\x80\r\xe4\r\x80\n)\nD\x80g-;<\x04/\x19\x19-\r?.\x14P^P\x14.?\r-\x19\x19/\x04<;-gY\x91\xb7\xbe\xb7\x91Y\x03\xc0\r\x13\x13\r.2\x13\x1a\x13 L4H|O--O|HeO\v,\v\x99\x91\x91\x99\v,\vOe\x9bq1Ls2\x1c6%\x1b\x1b%4\x1d\x17\x18.2,44,2.\x18\x17\x1d4%\x1b\x1b%6\x1c2sL1q\x9bc\xabqAAq\xab\x00\x02\x00\x00\xff\xa0\a\x00\x04\xe0\x00\x1a\x004\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&547\x01632\x16\x1d\x01!2\x16\x10\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\a\x00\x13\r\xfa\xa0\x13\r\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x05`\r\x13\t\xfe\xc0\t\x0e\r\x13\xfa\xa0\r\x13\x13\r\x05`\x12\x0e\f\f\x01?\x01`\xc0\r\x13\xc0\r\x13\n\x01@\t\r\x0e\t\x01@\t\x13\r\xc0\x13\x02!\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014&+\x01\x114&+\x01\"\x06\x15\x11#\"\x06\x15\x14\x17\x01\x1627\x016\x05\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\t\x01`\t\x1c\t\x01_\n\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02`\x0e\x12\x01`\r\x13\x13\r\xfe\xa0\x13\r\x0e\t\xfe\xa0\t\t\x01_\fԟ\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014'\x01&\"\a\x01\x06\x15\x14\x16;\x01\x11\x14\x16;\x01265\x11326\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\t\xfe\xa0\t\x1c\t\xfe\xa1\n\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02\xa0\x0e\t\x01`\t\t\xfe\xa1\f\f\x0e\x12\xfe\xa0\r\x13\x13\r\x01`\x13\xfe\xed\x9f\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x00\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00X\x00`\x00\x00$\x14\x06\"&462\x05\x14\x06#!\"&54>\x037\x06\x1d\x01\x0e\x01\x15\x14\x162654&'547\x16 7\x16\x1d\x01\"\x06\x1d\x01\x06\x15\x14\x162654'5462\x16\x1d\x01\x06\x15\x14\x162654'54&'46.\x02'\x1e\x04\x00\x10\x06 &\x106 \x01\x80&4&&4\x04&\x92y\xfc\x96y\x92\v%:hD\x16:Fp\xa0pG9\x19\x84\x01F\x84\x19j\x96 8P8 LhL 8P8 E;\x01\x01\x04\n\bDh:%\v\xfe\xc0\xe1\xfe\xc2\xe1\xe1\x01>\xda4&&4&}y\x8a\x8ayD~\x96s[\x0f4D\xcb\x14d=PppP=d\x14\xcb>\x1fhh\x1f>@\x96jY\x1d*(88(*\x1dY4LL4Y\x1d*(88(*\x1dYDw\"\nA\x1f4*\x13\x0f[s\x96~\x03\xd8\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x02\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00M\x00\x00\x004&\"\x06\x14\x1627\x14\x06\a\x11\x14\x04 $=\x01.\x015\x114632\x17>\x0132\x16\x14\x06#\"'\x11\x14\x16 65\x11\x06#\"&4632\x16\x17632\x16\x15\x11\x14\x06\a\x15\x14\x16 65\x11.\x015462\x16\x05\x00&4&&4\xa6G9\xfe\xf9\xfe\x8e\xfe\xf9\xa4\xdc&\x1a\x06\n\x11<#5KK5!\x1f\xbc\x01\b\xbc\x1f!5KK5#<\x11\n\x06\x1a&ܤ\xbc\x01\b\xbc9Gp\xa0p\x03&4&&4&@>b\x15\xfeu\x9f\xe1ោ\x14ؐ\x02\x00\x1a&\x02\x1e$KjK\x12\xfenj\x96\x96j\x01\x92\x12KjK$\x1e\x02&\x1a\xfe\x00\x90\xd8\x14\x84j\x96\x96j\x01\x8b\x15b>Ppp\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\r\x00\x1b\x00%\x00\x00\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x02\x80\x02\x00\xfe\x00\xfe\xa0@\\\x84\x84\\\x04\xa0\xfc\x00\x808(\x02@(8\x02\x00\x84\\@@\\\x84\x04\x80\x80\x80\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x02\x00@\xff\x00\x06\xc0\x06\x00\x00\v\x003\x00\x00\x044#\"&54\"\x15\x14\x163\x01\x14\x06#!\x14\x06\"&5!\"&5>\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\x03@L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x0104Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x03\x00\x00\xff\x80\a@\x05\x00\x00\a\x00\x0f\x00\"\x00\x00\x004&+\x01\x1132\x01!\x14\x06#!\"&\x00\x10\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x06\x80pP@@P\xf9\xf0\a\x00\x96j\xfb\x00j\x96\a@\xe1\x9f@\x84\\\xfd@\\\x84&\x1a\x04\x80\x9f\x030\xa0p\xfe\x80\xfd\xc0j\x96\x96\x04\t\xfe\xc2\xe1 \\\x84\x84\\\x02\xe0\x1a&\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00-\x00B\x00\x00\x01\x11\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015\x11462\x16\x15\x11\x14\x16265\x11462\x16\x15\x11\x14\x16265\x11462\x16\x05\x11\x14\x06+\x01\"&5\x11#\"&5\x11463!2\x16\x02\x80G9L4\x804L9G&4&&4&&4&&4&&4&\x03\x00L4\x804L\xe0\r\x13\xbc\x84\x01\x00\x1a&\x05\xc0\xfd\x80=d\x14\xfc\xf54LL4\x03\v\x14d=\x02\x80\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xf9\xc04LL4\x02\x00\x13\r\x03 \x84\xbc&\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01463!2\x16\x1d\x01\x14\x06#!\"&5\x052\x16\x1d\x01\x14\x06#!\"&=\x01463\x012\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\x00\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x02\xe0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03`\x0e\x12\x12\x0e@\x0e\x12\x12\x0e\xa0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xff\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01-\x01=\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x11!5463!2\x16\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xfb\x80\x01\x80\x13\r\x01@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfa\x93\x06\x00\xfa\x00\xe0\r\x13\x13\r\x05`\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x00\r\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xb7\x00\xdb\x00\xf5\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x15\x14\x06#!\"&=\x01!\x11!5463!2\x16\x15\x19\x014&+\x01\"\x06\x1d\x01#54&+\x01\"\x06\x15\x11\x14\x16;\x0126=\x013\x15\x14\x16;\x0126%\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x15\x11!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xff\x008(\xfe@(8\xff\x00\x01\x80\x13\r\x01@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x01@8(\x01\xc0(8\x01@\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfc\x93\x04\x80 (88( \xfb\x80\xe0\r\x13\x13\r\x03\xc0\x01@\r\x13\x13\r``\r\x13\x13\r\xfe\xc0\r\x13\x13\r``\r\x13\x13-\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01 (88(\xfe\xe0&\x00\x05\x00@\xff\x80\a\x80\x05\x80\x00\a\x00\x10\x00\x18\x00<\x00c\x00\x00$4&\"\x06\x14\x162\x01!\x11#\x06\x0f\x01\x06\a\x004&\"\x06\x14\x162\x1354&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01\x11\x14\x06+\x01\x14\x06\"&5!\x14\x06\"&5#\"&463\x1146?\x01>\x01;\x01\x11463!2\x16\x02\x80KjKKj\xfe\xcb\x01\x80\x9e\x0e\b\xc3\a\x02\x05\x00KjKKj\xcb\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x01\x00&\x1a\xc0\x96Ԗ\xfe\x80\x96Ԗ\x80\x1a&&\x1a\x1a\x13\xc6\x13@\x1a\xa0&\x1a\x04\x80\x1a&KjKKjK\x02\x80\x01\x00\x02\a\xc3\f\n\xfd\xadjKKjK\x03 \xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02.\xfb\x80\x1a&j\x96\x96jj\x96\x96j&4&\x01\xa0\x1a@\x13\xc6\x13\x1a\x01@\x1a&&\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x001\x00?\x00I\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x05\x00\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\xfd\x80\x02\x00\xfe\x00\xfe\x80 \\\x84\x84\\\x04\xc0\xfb\xc0\xa08(\x02@(8\x02\x00\x84\\ \\\x84\x01\xa0\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02\ue000\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x00\x00\x00\x01\x00\x00\x00\x00\a\x80\x04\x80\x00:\x00\x00\x01\x06\r\x01\a#\x0132\x16\x14\x06+\x0353\x11#\a#'53535'575#5#573\x173\x11#5;\x022\x16\x14\x06+\x01\x013\x17\x05\x1e\x01\x17\a\x80\x01\xfe\xe1\xfe\xa0\xe0@\xfe\xdbE\x1a&&\x1a`\xa0@@\xa0\xc0` \x80\xc0\xc0\x80 `\xc0\xa0@@\xa0`\x1a&&\x1aE\x01%@\xe0\x01`\x80\x90\b\x02@ @ @\xfe\xa0\t\x0e\t \x01\xa0\xe0 \xc0 \b\x18\x80\x18\b \xc0 \xe0\x01\xa0 \t\x0e\t\xfe\xa0@ \x1c0\n\x00\x00\x00\x02\x00@\x00\x00\x06\x80\x05\x80\x00\x06\x00\x18\x00\x00\x01\x11!\x11\x14\x163\x01\x15!57#\"&5\x11'7!7!\x17\a\x11\x02\x80\xff\x00K5\x04\x80\xfb\x80\x80\x80\x9f\xe1@ \x01\xe0 \x03\xc0 @\x02\x80\x01\x80\xff\x005K\xfe@\xc0\xc0\xc0\xe1\x9f\x01@@\x80\x80\xc0 \xfc\xe0\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00%\x114&+\x01\"\x06\x15\x11!\x114&+\x01\"\x06\x15\x11\x14\x16;\x01265\x11!\x11\x14\x16;\x0126\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\x80\x1a&\xfe\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x02\x00&\x1a\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xc0\x03\x80\x1a&&\x1a\xfe\xc0\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfe\xc0\x1a&&\x03\xba\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x1a\x80\x1a&\x01@\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&\x01@\x1a&&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00-\x00M\x03\xf3\x043\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x04\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x02s\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\x01\x8a\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\xad\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\x00\x00\x00\x02\x00\r\x00M\x03\xd3\x043\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x04\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x01\x8a\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x02\x00M\x00\x8d\x043\x04S\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x12\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\xed\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x01v\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x02\x00M\x00\xad\x043\x04s\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x12\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x02\xad\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x01v\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x01\x00-\x00M\x02s\x043\x00\x14\x00\x00\x00\x14\a\t\x01\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x02s\n\xfew\x01\x89\n\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\x03\xed\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\x00\x00\x00\x01\x00\r\x00M\x02S\x043\x00\x14\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x00\x01\x00M\x01\r\x043\x03S\x00\x14\x00\x00\x00\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\x01m\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x01\x00M\x01-\x043\x03s\x00\x14\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x03-\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x06\x00\x00\x0f\x00/\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x14\x1e\x01\x15\x14\x06#!\"&54>\x015!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd\xe0 &\x1a\xfe\x00\x1a& \xfd\xe0B^^B\x06@B^\x02 \x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x03M\xfb\xc0B^%Q=\r\x1a&&\x1a\x0e\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x94\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x04\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x05\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x03\x00pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x03\x80pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x02@\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8p\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x05\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x03\x00Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x03\x80Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x04\xc0\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80PppP\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80Ppp\x00\x00\x00\x00\b\x00@\xff@\x06\xc0\x06\x00\x00\t\x00\x11\x00\x19\x00#\x00+\x003\x00;\x00G\x00\x00$\x14\x06#\"&5462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&462\x16\x00\x14\x06\"&462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&54632\x16\x02\x0eK54LKj\x02=KjKKj\xfd\x8bKjKKj\x04\xfdL45KKjK\xfc<^\x84^^\x84\x04\xf0KjKKj\xfd\xcbp\xa0pp\xa0\x02\x82\x84\\]\x83\x83]\\\x84\xc3jKL45K\xfe\xe7jKKjK\x02ujKKjK\xfd\x8e4LKjKK\x03\xf1\x84^^\x84^\xfd\xa3jKKjK\x02\x90\xa0pp\xa0p\xfer]\x83\x83]\\\x84\x84\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x00\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x06\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x01\x14\x03\x0e\x02\a\x06#\"&5465654.\x05+\x01\x11\x14\x06\"'\x01&47\x0162\x16\x15\x113 \x13\x16\a\x00\u007f\x03\x0f\f\a\f\x10\x0f\x11\x05\x05#>bq\x99\x9bb\xe0&4\x13\xfe\x00\x13\x13\x02\x00\x134&\xe0\x02ɢ5\x01\xa0\xa6\xfe\xe3\a\"\x1a\t\x11\x14\x0f\t#\x06D7e\xa0uU6\x1f\f\xff\x00\x1a&\x13\x02\x00\x134\x13\x02\x00\x13&\x1a\xff\x00\xfem\x86\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\v\x00\x17\x001\x00X\x00\x00\x00\x14\x0e\x01\".\x014>\x012\x16\x04\x14\x0e\x01\".\x014>\x012\x16\x174&#\"\a\x06\"'&#\"\x06\x15\x14\x1e\x03;\x012>\x03\x13\x14\a\x0e\x04#\".\x04'&547&5472\x16\x17632\x17>\x013\x16\x15\x14\a\x16\x02\x80\x19=T=\x19\x19=T=\x02\x99\x19=T=\x19\x19=T=\xb9\x8av)\x9aG\xacG\x98+v\x8a@b\x92\x86R\xa8R\x86\x92b@\xe0=&\x87\x93\xc1\x96\\N\x80\xa7\x8a\x88j!>\x88\x1b3l\xa4k\x93\xa2\x94\x84i\xa4k3\x1b\x88\x01hPTDDTPTDDTPTDDTPTDD|x\xa8\x15\v\v\x15\xa8xX\x83K-\x0e\x0e-K\x83\x01\b\xcf|Mp<#\t\x06\x13)>dA{\xd0\xed\x9fRXtfOT# RNftWQ\xa0\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00\x17\x00,\x00\x00%\x114&#!\"&=\x014&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x008(\xfd@(88(\xfe\xc0(88(\x04\xc0(8\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\xe0\x02\xc0(88(@(88(\xfc@(88\x02\xe8\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x03\x00\x00\x00\x00\au\x05\x80\x00\x11\x00'\x00E\x00\x00\x014#!\"\x06\a\x01\x06\x15\x143!267\x016%!54&#!\"&=\x014&#!\"\x06\x15\x11\x01>\x01\x05\x14\a\x01\x0e\x01#!\"&5\x11463!2\x16\x1d\x01!2\x16\x1d\x0132\x16\x17\x16\x06\xf55\xfb\xc0([\x1a\xfe\xda\x125\x04@(\\\x19\x01&\x12\xfb\x8b\x03\x008(\xfd\xc0(88(\xfe\xc0(8\x01\x00,\x90\x059.\xfe\xd9+\x92C\xfb\xc0\\\x84\x84\\\x01@\\\x84\x02 \\\x84\xc06Z\x16\x0f\x02]#+\x1f\xfe\x95\x18\x10#,\x1f\x01k\x16\xb4\xa0(88(@(88(\xfc\xab\x01;5E\xa3>:\xfe\x955E\x84\\\x03\xc0\\\x84\x84\\ \x84\\\xa01. \x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x0e\x01\"&'&676\x16\x17\x1e\x01267>\x01\x1e\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n%\xca\xfe\xca%\b\x18\x1a\x19/\b\x19\x87\xa8\x87\x19\b02\x18\xfe\nKjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcdy\x94\x94y\x19/\b\b\x18\x1aPccP\x1a\x18\x10/\x01\xcfjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x16\x0e\x01&'.\x01\"\x06\a\x0e\x01'.\x017>\x012\x16\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n\b\x1820\b\x19\x87\xa8\x87\x19\b/\x19\x1a\x18\b%\xca\xfe\xca\xfe7KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x013\x19/\x10\x18\x1aPccP\x1a\x18\b\b/\x19y\x94\x94\x02\tjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x13\x00\x1b\x00+\x007\x00\x00\x00\x14\x06#!\"&463!2\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a\xfe&KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xda4&&4&\x01\xb5jKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\x00\x00\a\x80\x04\x00\x00#\x00+\x003\x00C\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x044&\"\x06\x14\x162\x004&\"\x06\x14\x162$\x10\x00#\"'#\x06#\"\x00\x10\x003!2\x03@\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x02@KjKKj\x01KKjKKj\x01K\xfe\xd4\xd4\xc0\x92ܒ\xc0\xd4\xfe\xd4\x01,\xd4\x03\x80\xd4\x01\xc0\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12gjKKjK\x01KjKKjK\xd4\xfeX\xfeԀ\x80\x01,\x01\xa8\x01,\x00\x00\x00\x0f\x00\x00\x00\x00\a\x80\x04\x80\x00\v\x00\x17\x00#\x00/\x00;\x00G\x00S\x00_\x00k\x00w\x00\x83\x00\x8f\x00\x9f\x00\xa3\x00\xb3\x00\x00\x01\x15\x14+\x01\"=\x014;\x0127\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14#!\"=\x0143!2%\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x05\x15\x14+\x01\"=\x014;\x012\x05\x11\x14+\x01\"=\x014;\x0154;\x012\x13\x11!\x11\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x10`\x10\x10`\x10\x80\x10\xe0\x10\x10\xe0\x10\x80\x10`\x10\x10`\x10\x04\x00\x10\xfc\xa0\x10\x10\x03`\x10\xfd\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\xfe\x00\x10`\x10\x10`\x10\x01\x00\x10`\x10\x10`\x10\x01\x00\x10\xe0\x10\x10p\x10`\x10\x80\xf9\x80\a\x00K5\xf9\x805KK5\x06\x805K\x01p`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfd\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\x01\xf0`\x10\x10`\x10\x10`\x10\x10`\x10\x10\xfe\xa0\x10\x10`\x10\xf0\x10\xfd\x00\x03\x80\xfc\x80\x03\x80\xfc\x805KK5\x03\x805KK\x00\x00\x00\x00\x03\x00@\xff\x80\a\x00\x05\x80\x00\x16\x00*\x00V\x00\x00\x01\x11\x06#\"'.\x01#\"\a\x11632\x1e\x02\x1f\x01\x1632\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x06\x80\xa9\x89R?d\xa8^\xad\xe6\xf5\xbc7ac77\x1c,9x\xfbm#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x01\xeb\x02h[ 17\u007f\xfd\xa9q\x0f%\x19\x1b\x0e\x16\x03q#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x00\x06\x00@\xff\x80\a\x00\x05\x80\x00\x05\x00\v\x00*\x002\x00F\x00r\x00\x00\x015\x06\a\x156\x135\x06\a\x156\x015\x06'5&'.\t#\"\a\x1532\x16\x17\x16\x17\x15\x1632\x135\x06#\"'\x15\x16\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x03@\xb5\xcbͳ\xac\xd4\xd7\x03\xe9\xeb\x95\x14\x13\x058\r2\x13.\x1a,#,\x16\x17\x1a\x13f\xb5k\x13\x14*1x\xad\xa9\x89-!\x94\xfb\xac#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x02\x18\xc0\x10e\xb9`\x01\xb0\xc5\bv\xbdo\xfe8\xb8t-\xe0\x06\t\x03\x1c\x06\x18\a\x13\x06\v\x04\x04\x03\xde:5\t\x06\xbc\x11\x02\a\xbd[\b\xc4*\x01\xee#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x02\x00\r\x00\x00\x06\x80\x043\x00\x14\x00$\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x01\x15\x14\x06#!\"&=\x01463!2\x16\x02I\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x04-\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x02)\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\xfe-@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x00\x03\x00-\xff\x93\aS\x04\xed\x00\x14\x00$\x009\x00\x00%\a\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x16\x14\t\x01\x0e\x01/\x01.\x017\x01>\x01\x1f\x01\x1e\x01\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x02i2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\x02E\xfe\x8b\x04\x17\f>\r\r\x04\x01u\x04\x17\f>\r\r\x02\x8d\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x892\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\x04!\xfa\xf5\r\r\x04\x11\x04\x17\r\x05\v\r\r\x04\x11\x04\x17\xfdh\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\xbb\x00\x15\x00;\x00\x00\x01\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x1d\x01\x01\x06\x14\x17\x01\x14\x0e\x03\a\x06#\"'&7\x12'.\x01'\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x15\x11\x04\x17\x16\x02\x80'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\xfes\x13\x13\x06\r\"+5\x1c\x06\b\x14\x06\x03\x19\x02+\x95@ա'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\x01\x9b\xbc\xa9\x01\xc6F*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*E\xfer\x134\x13\xfeM:\x97}}8\f\x11\x01\b\x1a\x01\x90\xa5GO\r\xfb*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*\xfe\xfa\x1c\xc1\xad\x00\x00\x00\x00\x02\x00\x02\xff\xad\x06~\x05\xe0\x00\n\x00(\x00\x00\x01-\x01/\x01\x03\x11\x17\x05\x03'\t\x01\x13\x16\x06#\"'%\x05\x06#\"&7\x13\x01&67%\x13632\x17\x13\x05\x1e\x01\x04\xa2\x01\x01\xfe\x9cB\x1e\x9f;\x01><\f\x01\xf5\xfe\x95V\x05\x16\x17\x11\x17\xfe?\xfe?\x17\x11\x17\x16\x05V\xfe\x94 \x12-\x01\xf6\xe1\x14\x1d\x1c\x15\xe1\x01\xf6-\x12\x02C\xfa4\n<\x01B\xfc=\x1f\xa8\x01cB\x015\xfe\x9e\xfe\f!%\f\xec\xec\f%!\x01\xf4\x01b 7\aI\x01\xc7))\xfe9I\a7\x00\x00\x00\x01\x00\x02\xff\x80\x05\x80\x05\x00\x00\x16\x00\x00\t\x01\x06#\"'.\x015\x11!\".\x0167\x01632\x17\x1e\x01\x05y\xfd\x80\x11(\x05\n\x16\x1b\xfd\xc0\x16#\n\x12\x14\x05\x00\r\x10\x1b\x12\x0f\a\x04\xa3\xfb\x00#\x02\x05#\x16\x02@\x1b,(\n\x02\x80\a\x13\x0e)\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x02\x00\x05\x008\x00\x00\x01!\x11\t\x01!\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\"&5\x11#\"&=\x0146;\x01546;\x012\x16\x1d\x01!762\x17\x16\x14\x0f\x01\x1132\x16\x02-\x02S\xfd\x80\x02S\xfd\xad\x04\x80\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xfc\xa0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\x03S\xf6\n\x1a\n\t\t\xf7\xe0\x0e\x12\x01\x00\x02S\xfd\xda\x02S\xfd`\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x03`\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xf7\t\t\n\x1a\n\xf6\xfc\xad\x12\x00\x00\x00\x04\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00K\x00\x00$4&\"\x06\x14\x162\x124&\"\x06\x14\x162\x044&\"\x06\x14\x1627\x14\x06\a\x02\a\x06\a\x0e\x01\x1d\x01\x1e\x01\x15\x14\x06\"&5467\x11.\x015462\x16\x15\x14\x06\a\x1167>\x055.\x015462\x16\x01 8P88P88P88P\x02\xb88P88P\x984,\x02\xe0C\x88\x80S,4p\xa0p4,,4p\xa0p4,6d7AL*'\x11,4p\xa0p\x18P88P8\x04\xb8P88P8HP88P8`4Y\x19\xfe\xe1\u007f&+(>E\x1a\x19Y4PppP4Y\x19\x034\x19Y4PppP4Y\x19\xfe\x0f\x1a\x1f\x11\x19%*\x0154&#\"\a\x06\a\x06#\"/\x01.\x017\x12!2\x1e\x02\x02\xc0\x18\x10\xf0\x10\x18\x18\x10\xf0\x10\x18\x01<\x1f'G,')7\x18\x10\xf0\x0f\x15\x82N;2]=A+#H\r\x12\f\r\xa4\r\x05\b\xa0\x010P\xa2\x82R\x01\x18\xf0\x10\x18\x18\x10\xf0\x10\x18\x18\x02H6^;<\x1b\x16\x17T\x19\x11\x1f%\x13-S\x93#\x1b:/*@\x1d\x19Z\x10\b}\n\x1e\r\x01\n>h\x97\x00\x00\x00\x02\x00\x00\x00\x00\x02\x80\x05\x80\x00\x1e\x00.\x00\x00%\x15\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x01463!2\x16\x15\x1132\x16\x03\x15\x14\x06#!\"&=\x01463!2\x16\x02\x80&\x1a\xfe\x00\x1a&&\x1a@@\x1a&&\x1a\x01\x80\x1a&@\x1a&\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\xfd\xc0&\x04f\xc0\x1a&&\x1a\xc0\x1a&&\x00\x00\x02\x00b\x00\x00\x02\x1e\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x03\x0e\x01#!\"&'\x03&63!2\x16\x02\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x1e\x1c\x01'\x1a\xff\x00\x1a'\x01\x1c\x01%\x1a\x01@\x1a%\x01 \xe0\x1a&&\x1a\xe0\x1a&&\x04\x06\xfd\x00\x1a&&\x1a\x03\x00\x1a&&\x00\x02\x00\x05\x00\x00\x05\xfe\x05k\x00%\x00J\x00\x00%\x15#/\x01&'#\x0e\x02\a\x06\x0f\x01!53\x13\x03#5!\x17\x16\x17\x16\x1736?\x02!\x15#\x03\x13\x01\x15!'&54>\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x04\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xea\xfd\xfe\x03\x044NZN4;)3.\x0e\x16i\x1a%Sin\x881KXL7\x03觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\x02\xa7\xce\x1b\x1c\x12@jC?.>!&1'\v\x1b\\%\x1dAwc8^;:+\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x03\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xec\xfd\xfe\x04\x034NZN4;)3.\x0e\x16i\x1a%Pln\x88EcdJ\x04觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\xd9\xce\x1b-\x01@jC?.>!&1'\v\x1b\\%\x1dAwcBiC:D'P\x00\x00\x00\x02\x00\x01\x00\x00\a\u007f\x05\x00\x00\x03\x00\x17\x00\x00%\x01!\t\x01\x16\x06\a\x01\x06#!\"&'&67\x0163!2\x16\x03\x80\x01P\xfd\x00\xfe\xb0\x06\xf5\x0f\v\x19\xfc\x80&:\xfd\x00&?\x10\x0f\v\x19\x03\x80&:\x03\x00&?\x80\x01\x80\xfe\x80\x045\"K\x1c\xfc\x00,)\"\"K\x1c\x04\x00,)\x00\x00\x01\x00\x00\xff\xdc\x06\x80\x06\x00\x00h\x00\x00\x01\x14\x06#\".\x02#\"\x15\x14\x16\a\x15\"\a\x0e\x02#\"&54>\x0254&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06#\"'.\x01/\x01\"'\"5\x11\x1e\x02\x17\x16327654.\x0254632\x16\x15\x14\x0e\x02\x15\x14\x163267\x15\x0e\x02\a\x06\x15\x14\x17\x1632>\x0232\x16\x06\x80YO)I-D%n \x01\x16\v\"\u007fh.=T#)#lQTv\x1e%\x1e.%P_\x96\t%\t\r\x01\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1evUPl#)#T=@\xe8/\x01\x05\x05\x01\x18#,-\x1691P+R[\x01\xb6Ql#)#|'\x98'\x05\x01\x03\x11\n59%D-I)OY[R+P19\x16-,#\x18\x02\x04\x02\x02\x01\x01\x04\x00\x01\x05\x05\x01\x18#,-\x1691P+R[YO)I-D%95\x1e\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1ev\x00\x00\x02\x00\x00\xff\x80\x04\x80\x06\x00\x00'\x003\x00\x00\x01\x15\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&\x00=\x01462\x16\x1d\x01\x14\x00 \x00=\x01462\x16\x01\x11\x14\x06 &5\x1146 \x16\x04\x80\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00\xd9\xfe\xd9&4&\x01\a\x01r\x01\a&4&\xff\x00\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x03@\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\x18\x01G݀\x1a&&\x1a\x80\xb9\xfe\xf9\x01\a\xb9\x80\x1a&&\x01f\xfe\x00\x84\xbc\xbc\x84\x02\x00\x84\xbc\xbc\x00\x03\x00\r\xff\x80\x05s\x06\x00\x00\v\x00C\x00K\x00\x00\x01\a&=\x01462\x16\x1d\x01\x14\t\x01\x15\x14\x06#\"'\a\x1632\x00=\x01462\x16\x1d\x01\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&'\a\x06\"/\x01&47\x0162\x1f\x01\x16\x14%\x01\x114632\x16\x01\x0fe*&4&\x04i\xfe\x97\xbc\x8476`al\xb9\x01\a&4&\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00}n\xfe\n\x1a\nR\n\n\x04\xd2\n\x1a\nR\n\xfez\xfd\x93\xbc\x84f\xa5\x02Oego\x80\x1a&&\x1a\x805\x02\x1e\xfe\x97\x80\x84\xbc\x13`3\x01\a\xb9\x80\x1a&&\x1a\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\rD\xfe\n\nR\n\x1a\n\x04\xd2\n\nR\n\x1az\xfd\x93\x02\x00\x84\xbcv\x00\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x06\x00\"\x00\x00\x01\x11!\x11676\x13\x11\x14\x0e\x05\a\x06\"'.\x065\x11463!2\x16\x04@\xfe@w^\xeb\xc0Cc\x89t~5\x10\f\x1c\f\x105~t\x89cC&\x1a\x04\x80\x1a&\x02@\x02\x80\xfb\x8f?J\xb8\x03\xb0\xfd\x00V\xa9\x83|RI\x1a\a\x06\x06\a\x1aIR|\x83\xa9V\x03\x00\x1a&&\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\x13\x00#\x00G\x00\x00\x17!\x11!%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x05\x80\xfa\x80\x01\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x04\x00\xc0\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12\x0e\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12N\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x02\x00\x03\xff\x80\x05\x80\x05\xe0\x00\a\x00L\x00\x00\x004&\"\x06\x14\x162%\x11\x14\a\x06#\"'%.\x015!\x15\x1e\x01\x15\x11\x14\x06#!\"&5\x114675#\"\x0e\x03\a\x06#\"'.\x017>\x047&5462\x16\x15\x14\a!467%632\x17\x16\x02\x00&4&&4\x03\xa6\f\b\f\x04\x03\xfe@\v\x0e\xff\x00o\x91&\x1a\xfe\x00\x1a&}c ;pG=\x14\x04\x11(\x10\r\x17\x11\f\x05\x138Ai8\x19^\x84^\x0e\x01.\x0e\v\x01\xc0\x03\x04\f\b\f\x05&4&&4&`\xfe\xc0\x10\t\a\x01`\x02\x12\vf\x17\xb0s\xfc\xe0\x1a&&\x1a\x03 j\xa9\x1eo/;J!\b#\a\f2\x18\n KAE\x12*,B^^B!\x1f\v\x12\x02`\x01\a\t\x00\x00\x02\x00$\xff \x06\x80\x05\x80\x00\a\x00-\x00\x00\x004&\"\x06\x14\x162\x01\x14\x02\a\x06\a\x03\x06\a\x05\x06#\"/\x01&7\x13\x01\x05\x06#\"/\x01&7\x1367%676$!2\x16\x05\xa08P88P\x01\x18\x97\xb2Qr\x14\x02\x0e\xfe\x80\a\t\f\v@\r\x05U\xfe\xe7\xfe\xec\x03\x06\x0e\t@\x11\f\xe0\n\x10\x01{`P\xbc\x01T\x01\x05\x0e\x14\x04\x18P88P8\x01\x80\xf9\xfe\x95\xb3P`\xfe\x85\x10\n\xe0\x04\t@\x0e\x12\x01\x14\x01\x19U\x01\t@\x13\x14\x01\x80\x0e\x02\x14rQ\xbb\x8e\x13\x00\x00\x00\x01\x00\x00\x00\x00\x06\xd1\x05\x00\x00\x16\x00\x00\x01\x03!\x136'&+\x01\x03!\x13!\x03!\x13\x03!2\x16\x17\x1e\x01\x06Ѥ\xfe\xb2\xb2\r\x1c\x1b8\xa9\xcc\xfe\xb2\xcc\xfe\xe2\xcc\xfe\xb2̙\x04\xfce\xb1;<*\x02\xfb\xfd\x05\x03@8 !\xfcG\x03\xb9\xfcG\x03\xb9\x01GQII\xbf\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%764'\t\x0164/\x01&\"\a\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x8df\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x13\x01\xc6\x134\x02\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8df\x134\x13\x013\x013\x134\x13f\x13\x13\xfe:\x134\x13\xfe:\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164'\x01&\"\x0f\x01\x06\x14\x17\t\x01\x06\x14\x1f\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xcd\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x13f\x134\x03F\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8d\x01\xc6\x134\x13\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00\x01764'\x01&\"\a\x01\x06\x14\x1f\x01\x1627\t\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x8df\x13\x13\xfe:\x134\x13\xfe:\x13\x13f\x134\x13\x013\x013\x134\x01\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x8df\x134\x13\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x01\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164/\x01&\"\a\t\x01&\"\x0f\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03-\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x13\x01\xc6\x134\x02\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xed\x01\xc6\x134\x13f\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x02w\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff@\x05\x80\x05\x80\x00\x11\x00\x16\x00\x00\x017!\x13!\x0f\x01/\x01#\x13\x0535%\x13!'\x01!\x03\x05%\x04j\x10\xfc\x8c/\x02d\x16\xc5\xc4\r\xaf\x16\x01j\x04\x01g2\xfd|\x0f\xfe8\x05\x80\x80\xfd\xbe\xfd\xc2\x03\xab\xaf\xfd\xea\xe455\x8c\xfe\xead\x01c\x02 \xb5\x01\xd5\xfab\xa2\xa2\x00\x00\x00\x01\x00\f\xff@\x06\xf4\x05\x80\x00\x0f\x00\x00\x01!\t\x02\x13!\a\x05%\x13!\x13!7!\x01\x13\x05\xe1\xfe\xf6\xfc\xdc\xfdFG\x01)\x1d\x01\xa6\x01\xe6D\xfbH:\x04\xb9&\xfbH\x05\x80\xfa\xcb\xfe\xf5\x01\v\x01d\x93\xa1\xa1\x01S\x01)\xbf\x00\x00\x00\x02\x00\x00\xff\x10\a\x00\x06\x00\x00\a\x00U\x00\x00\x004&\"\x06\x14\x162\x01\x11\x14\a\x06#\"/\x01\x06\x04 $'\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\x1e\x01\x17\x11#\"&=\x0146;\x015.\x015462\x16\x15\x14\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x11>\x017'&763!2\x16\x03\xc0&4&&4\x03f\x14\b\x04\f\v]w\xfeq\xfe4\xfeqw]\t\x0e\x04\b\x14\x12\x0e\x01`\x16\b\b\x0fdC\xf5\x95\xc0\x1a&&\x1a\xc0:F\x96ԖF:\xc0\x1a&&\x1a\xc0\x95\xf5Cd\x0f\b\b\x16\x01`\x0e\x12\x04\xe64&&4&\xfc\xa0\xfe\xa0\x16\b\x02\t]\x8f\xa7\xa7\x8f]\t\x02\b\x16\x01`\x0e\x12\x14\x13\x10d[}\x14\x02\x87&\x1a\x80\x1a&\xa3\"uFj\x96\x96jFu\"\xa3&\x1a\x80\x1a&\xfdy\x14}[d\x10\x13\x14\x12\x00\x01\x00\x00\x00\x00\x04\x80\x06\x00\x00#\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x01\x114\x00 \x00\x15\x14\x06+\x01\"&54&\"\x06\x15\x11\x04 (88(\xfc@(88( \x01\a\x01r\x01\a&\x1a@\x1a&\x96Ԗ\x03\x008(\xfd\xc0(88(\x02@(8\x01@\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1aj\x96\x96j\xfe\xc0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00'\x003\x00\x00\x00\x14\x06\"&462\x00\x10& \x06\x10\x16 \x00\x10\x00 \x00\x10\x00 \x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4\x01\x16\xe1\xfe\xc2\xe1\xe1\x01>\x01a\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8\x01\xacf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\xfea\x01>\xe1\xe1\xfe\xc2\xe1\x02T\xfeX\xfe\xd4\x01,\x01\xa8\x01,\xfd~\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x03 \xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88\x00\x00\x00\x00\x03\x00\x00\x00\x00\x01\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x1b\x005\x00E\x00\x00$4&\"\x06\x14\x162%&\x00'&\x06\x1d\x01\x14\x16\x17\x1e\x01\x17\x1e\x01;\x0126%&\x02.\x01$'&\a\x06\x1d\x01\x14\x16\x17\x16\x04\x12\x17\x1e\x01;\x01276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00KjKKj\x01\xaa\r\xfe\xb9\xe9\x0e\x14\x11\r\x9a\xdc\v\x01\x12\r\x80\r\x14\x01\u007f\x05f\xb1\xe9\xfe\xe1\x9a\x0e\t\n\x12\r\xcc\x01\\\xd1\a\x01\x12\r\x80\r\n\v\x01\x1f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xcbjKKjK\"\xe9\x01G\r\x01\x14\r\x80\r\x12\x01\vܚ\r\x11\x14\r\x9a\x01\x1f\xe9\xb1f\x05\x01\n\n\r\x80\r\x12\x01\a\xd1\xfe\xa4\xcc\r\x12\n\t\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0164'\x01&\a\x06\x15\x11\x14\x17\x16327\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03\xb2 \xfd\xe0\x1f! \x10\x10\x11\x0f\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfd\x97\x12J\x12\x01@\x13\x12\x13%\xfd\x80%\x13\b\t\x00\x03\x006\xff5\x06\xcb\x05\xca\x00\x03\x00\x13\x00/\x00\x00\t\x0564'\x01&\"\a\x01\x06\x14\x17\x01\x162\t\x01\x06\"/\x0164&\"\a'&47\x0162\x1f\x01\x06\x14\x1627\x17\x16\x14\x04\x00\x01<\xfd\xc4\xfe\xc4\x01i\x02j\x13\x13\xfe\x96\x126\x12\xfd\x96\x13\x13\x01j\x126\x03\x8b\xfcu%k%~8p\xa08}%%\x03\x8b%k%}8p\xa08~%\x04<\xfe\xc4\xfd\xc4\x01<\xfei\x02j\x134\x13\x01j\x12\x12\xfd\x96\x134\x13\xfe\x96\x12\x02\x8f\xfct%%~8\xa0p8~%k%\x03\x8a%%}8\xa0p8}%k\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&&\x1a\x80\x1a&&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x03@\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x01\x00\x03\x00\x00\x03\xfa\x05\u007f\x00\x1c\x00\x00\x01\x06+\x01\x11\x14\x06#!\"'&?\x0163!\x11#\"'&7\x0162\x17\x01\x16\x03\xfa\x12(\xc0\x12\x0e\xfd@\x15\b\b\f\xa0\t\x10\x01@\xc0(\x12\x11\x1a\x01@\x12>\x12\x01@\x1b\x03\xa5%\xfc\xa0\x0e\x12\x12\x14\x0f\xc0\v\x02\x80%%\x1f\x01\x80\x16\x16\xfe\x80 \x00\x00\x00\x01\x00\x03\xff\x80\x03\xfa\x05\x00\x00\x1b\x00\x00\x13!2\x16\x15\x1132\x16\a\x01\x06\"'\x01&76;\x01\x11!\"/\x01&76 \x02\xc0\r\x13\xc0($\x1b\xfe\xc0\x12>\x12\xfe\xc0\x1a\x11\x12(\xc0\xfe\xc0\x0e\v\xa0\r\t\t\x05\x00\x13\x0e\xfc\xa1J \xfe\x80\x16\x16\x01\x80\x1f&%\x02\x80\v\xc0\x0e\x14\x13\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00$\x00\x00%\x0164/\x01&\"\a\x01'&\"\x0f\x01\x06\x14\x17\x01\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad\x02f\x13\x13f\x134\x13\xfe-\xd3\x134\x13f\x13\x13\x01f\x134\x03f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xed\x02f\x134\x13f\x13\x13\xfe-\xd3\x13\x13f\x134\x13\xfe\x9a\x13\x03\x86\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x06\x00\x10\x00\x15\x00\x1f\x00/\x00\x00\x01\x17\a#5#5\x01\x16\a\x01\x06'&7\x016\t\x03\x11\x01764/\x01&\"\x0f\x01%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x94\x9848`\x01\xd2\x0e\x11\xfe\xdd\x11\r\x0e\x11\x01#\x11\xfe\xfb\x02 \xfe\xe0\xfd\xe0\x03\x80\\\x1c\x1c\x98\x1cP\x1c\\\x02\xa0\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xac\x984`8\x01\xba\r\x11\xfe\xdd\x11\x0e\r\x11\x01#\x11\xfd@\x02 \x01 \xfd\xe0\xfe\xe0\x02`\\\x1cP\x1c\x98\x1c\x1c\\`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00)\x00\x00\x01\x114&#!\"\a\x06\x1f\x01\x01\x06\x14\x1f\x01\x1627\x01\x17\x163276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe *\x11\x11\x1f\x90\xfd\xea\x13\x13f\x134\x13\x02\x16\x90\x12\x1b\f\r'\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02`\x01\xe0\x1a&')\x1d\x90\xfd\xea\x134\x13f\x13\x13\x02\x16\x90\x13\x05\x11\x02*\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00\t\x0164'\x01&\a\x06\x1d\x01\"\x0e\x05\x15\x14\x17\x163276'\x027>\x013\x15\x14\x17\x1632\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xed\x01`\x13\x13\xfe\xa0\x1e'(w\u0083a8!\n\xa7\v\x0e\a\x06\x16\x03,j.\xa8\x8c(\f\f\x1a\x02&\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xb3\x01`\x134\x13\x01`\x1f\x11\x11*\xa0'?_`ze<\xb5\xdf\f\x03\t\x18\x01bw4/\xa0*\x11\x05\x02\xc0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\x06\x00\x12\x00\x1e\x00\x00\x01-\x01\x01\x11\x01\x11\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\x80\x01\x00\xff\x00\x01\x80\xfe\x00\x03 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xc0\x80\x80\x01O\xfd\xe2\xff\x00\x02\x1e\xfe\xdd\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x16\a\x01\x06\"'\x01&763!2\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x12\x17\xfe\xc0\x13B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x98\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03]#\x1f\xfe@\x1b\x1b\x01\xc0\x1f##\xfd \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x06#!\"'&7\x0162\x17\x01\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x11(\xfd\x80(\x11\x12\x17\x01@\x13B\x13\x01@\x17u\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xa3###\x1f\x01\xc0\x1b\x1b\xfe@\x1f\xfe\xda\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x00\x14\a\x01\x06'&5\x11476\x17\x01\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04@\x1b\xfe@\x1f####\x1f\x01\xc0\xdb\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\xa1B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x11\x12\x17\xfe\xc0\xfd\xec\x03\xc0\x0e\x12\x12\x0e\xfc@\x0e\x12\x12\x03\xce\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x00\x00\x00\x03\xf3\x05\x80\x00`\x00\x00%\x17\x16\x06\x0f\x01\x0e\a#\"\x00'#\"&=\x0146;\x01&7#\"&=\x0146;\x016\x0032\x17\x16\x17\x16\x0f\x01\x0e\x01/\x01.\x05#\"\x06\a!2\x17\x16\x0f\x01\x06#!\x06\x17!2\x17\x16\x0f\x01\x0e\x01#!\x1e\x0132>\x04?\x016\x17\x16\x03\xd0#\x03\f\v\x05\x04\r\x13\x18\x1b!\"'\x13\xea\xfe\xa2?_\r\x13\x13\rB\x02\x03C\x0e\x12\x12\x0ebC\x01a\xe0f\\\v\t\x06\x03+\x03\x16\r\x04\x04\x0f\x14\x19\x1b\x1f\x0e~\xc82\x01\xd4\x10\t\n\x03\x18\x05\x1b\xfe\x18\x03\x03\x01\xcb\x0f\n\t\x03\x18\x02\x12\v\xfe}0\xcb\u007f\x12$\x1f\x1c\x15\x10\x04\x05\r\r\f\xe5\x9f\f\x15\x04\x01\x02\x03\x06\x05\x05\x05\x04\x02\x01\x05\xdd\x13\rq\r\x1390\x12\x0er\x0e\x12\xd2\x01\x00\x17\x03\f\v\r\x9f\r\r\x04\x01\x01\x03\x04\x03\x03\x02\x80p\f\f\x0er\x1a%D\f\f\x0fp\v\x0fu\x89\x03\x04\x05\x05\x04\x01\x02\x05\a\a\x00\x00\x01\x00\x00\x00\x00\x03\xfc\x05\x80\x00?\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x0146;\x0154632\x17\x1e\x01\x0f\x01\x06\a\x06'.\x02#\"\x06\x1d\x01!2\x16\x1d\x01\x14\x06#!\x11!546;\x012\x16\x03\xfc\x12\x0e\xfcD\x0e\x12\x13\ra_\x0e\x12\x12\x0e_\xf7\xbf\xb9\x96\t\x02\bg\t\r\r\n\x05*`-Uh\x011\r\x13\x13\r\xfe\xcf\x01\x9e\x12\x0e\xa2\x0e\x12\x01\x8f\xfe\x91\x0e\x12\x12\x0e\x96\r\x13\x01\u007f\x13\r\x83\x0e\x12߫\xde}\b\x19\n\u007f\v\x01\x02\t\x05\x1c$^L\xd7\x12\x0e\x83\r\x13\xfe\x85\xb5\r\x13\x13\x00\x00\x00\x01\x004\xff\x00\x03\xd2\x06\x00\x00b\x00\x00\x01\x14\x06\a\x15\x14\x06+\x01\"&=\x01.\x04'&?\x01676\x170\x17\x16\x17\x1632654.\x03'.\b5467546;\x012\x16\x1d\x01\x1e\x04\x17\x16\x0f\x01\x06\a\x06'.\x04#\"\x06\x15\x14\x1e\x04\x17\x1e\x06\x03\xd2ǟ\x12\x0e\x87\r\x13B{PD\x19\x05\x11\x0fg\a\x10\x0f\t\x02q\x82%%Q{\x1e%P46'-N/B).\x19\x11ĝ\x13\r\x87\x0e\x129kC<\x12\x06\x11\fQ\b\x0f\x0e\r\x03\x177>W*_x\x11*%K./58`7E%\x1a\x01_\x99\xdd\x1a\xaf\x0e\x12\x13\r\xaf\t,-3\x18\x06\x15\x14\x87\n\x02\x02\v\x02c\x1a\bVO\x1c2\")\x17\x15\x10\x12#\x1b,)9;J)\x8a\xd0\x1e\xb4\r\x13\x12\x0e\xb0\x06\"!*\x10\x06\x12\x14\x92\x0f\x01\x03\n\x03\x12#\x1d\x17VD\x1a,'\x1b#\x13\x12\x14\x17/&>AX\x00\x01\x00\x00\x00\x00\x03\x82\x05\x80\x00>\x00\x00\x01\x15\x14\x06+\x01\x0e\x01\a\x16\x01\x16\a\x06+\x01\"'\x00'&=\x0146;\x01267!\"&=\x01463!&+\x01\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01\x16\x1732\x16\x03\x82\x12\x0e\xa8\x17Ԫ\xa7\x01$\x0e\n\b\x15\xc3\x10\t\xfe\xce\xc0\t\x13\rp\x84\xa1\x16\xfeU\x0e\x12\x12\x0e\x01\x9d9ӑ\r\x13\x12\x0e\x03@\x0e\x12\x12\x0e\xe9/\x11\xab\x0e\x12\x04*f\x0e\x12\x90\xb4\x14\xb2\xfe\x9a\x10\x12\x12\f\x01o\xcc\t\r\u007f\r\x13VR\x12\x0ef\x0e\x12q\x13\r\x85\x0e\x12\x12\x0ef\x0e\x12=S\x12\x00\x01\x00\x04\x00\x00\x03\xff\x05\x80\x00E\x00\x00!#\"&5\x11!\"&=\x01463!5!\"&=\x0146;\x01\x01&76;\x012\x17\x13\x16\x17>\x017\x136;\x012\x17\x16\a\x0132\x16\x1d\x01\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x11\x14\x06\x02[\xac\r\x13\xfe\xe0\r\x13\x13\r\x01 \xfe\xe0\r\x13\x13\r\xd6\xfe\xbf\b\b\n\x12\xc2\x13\n\xd7\x13%\n)\a\xbf\b\x15\xbf\x11\n\t\b\xfe\xc7\xd7\r\x13\x13\r\xfe\xde\x01\"\r\x13\x13\r\xfe\xde\x13\x12\x0e\x01J\x12\x0eg\r\x13U\x12\x0eh\r\x13\x02B\x10\x10\x10\x12\xfeW&W\x18X\x11\x01\xa4\x13\x10\x0e\x11\xfd\xbd\x13\rh\x0e\x12U\x13\rg\x0e\x12\xfe\xb6\r\x13\x00\x02\x00\x00\x00\x00\x05\x00\x05\x80\x00\a\x008\x00\x00\x004&#!\x11!2\x00\x10\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015#\"&=\x0146;\x01\x11463!2\x04\x13\x82j\xfe\xc0\x01@j\x01o\xfd\xc8\xfe\xac\x01\xf9\x0e\x12\x12\x0e\xfe\a\x13\r\xa7\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x02\x1b\xc8\x03g\xc8|\xfe@\x01\xa1\xfe~\xf4v\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12v\x12\x0e\x95\r\x13\x02u\x0e\x12\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\b\x00\f\x00\x10\x00\x19\x00\x1d\x00n\x00\x00\x01\x13#\x13\x16\x14\x1746\x137!\x17!3'#\x01\x13#\x13\x14\x16\x1746\x137!\x17\x05\x15\x14\x06+\x01\x03\x06+\x01\"'\x03#\x03\x06+\x01\"&'\x03#\"&=\x0146;\x01'#\"&=\x0146;\x01\x03&76;\x012\x17\x13!\x136;\x012\x17\x13!\x136;\x012\x17\x16\a\x0332\x16\x1d\x01\x14\x06+\x01\a32\x16\x02\x02Q\x9fK\x01\x01\x01t#\xfe\xdc \x01\xa1\x8b#F\x01\x9fN\xa2Q\x01\x01\x01o!\xfe\xd7\"\x02\x80\x12\x0eդ\a\x18\x9f\x18\a\xa6ѧ\a\x18\x9f\v\x11\x02\xa0\xd0\x0e\x12\x12\x0e\xaf!\x8e\x0e\x12\x12\x0emY\x05\n\n\x10\x89\x1a\x05Z\x01ga\a\x18~\x18\ab\x01m]\x05\x1a\x89\x10\n\n\x05[o\x0e\x12\x12\x0e\x91\"\xb3\x0e\x12\x01U\x01+\xfe\xd4\x01\x04\x01\x01\x05\x01\xac\x80\x80\x80\xfd\xd4\x01,\xfe\xd5\x01\x05\x01\x01\x04\x01\xad\x80\x80 @\x0e\x12\xfd\x98\x18\x18\x02h\xfd\x98\x18\x0e\n\x02h\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x01X\x0f\r\f\x18\xfe\x98\x01h\x18\x18\xfe\x98\x01h\x18\f\r\x0f\xfe\xa8\x12\x0e@\x0e\x12\x80\x12\x00\x00\x03\x008\xff\x00\x04\xe8\x05\x80\x003\x00H\x00\\\x00\x00\x01\x16\a\x1e\x01\a\x0e\x04\a\x15#5\"'\x15#\x11\"&+\x017327\x113&#\x11&+\x015\x172753\x156353\x15\x1e\x03\x034.\x04\"\x06#\x112\x162>\x06\x034.\x04\x0e\x01#\x112\x16>\x06\x04\x8f\x12\x95ut\r\a3Nt\u007fR\x9aP*\x9a\x12H\x13\xc8\x1fo2\b\x10\x06\n\rLo\xd4@!\x9aR(\x9aOzh=\xd1\x1e,GID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xee\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x1e\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xdf?jJrL6V\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x127>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x02/rr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x00\x00\x00\x00\x04\x00\"\xff\x00\x05\xce\x06\x00\x00\n\x00$\x007\x00V\x00\x00\x014&#\"\x06\x14\x16326\x01\x14\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x05\x15!53\x1146=\x01#\a\x06\x0f\x01'73\x11\x13\x14\x0e\x03#\"'&'7\x16\x17\x163267#\x0e\x01#\"&54632\x16\x05BX;4>ID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xd0\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xc3\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x04\xdf?jJrL6\xfb\xaa\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x12\xfcrr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x053>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x00\x00\x03\x00\x00\xff\x80\x06@\x05\x80\x00\v\x00\x1b\x00\\\x00\x00%4&#\"\x06\x15\x14\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x14\a\x16\x15\x16\a\x16\a\x06\a\x16\a\x06\a+\x02\".\x01'&'.\x015\x11467>\x01767>\x027>\x027632\x1e\x05\x15\x14\x0e\x01\a\x0e\x02\a!2\x16\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04\xa07\x0f\x03.\x11\x11\x0f'\t:@\x85$L\x11B\x9cWM{#\x1a&$\x19\x18h1D!\x12\x1a\t\t\a\v\x1c\x14\x13\x1a.I/!\x0f\t\x01\x13\x13\x12\x03\x0e\b\x04\x01\x15Nr\xc0\x1a&&\x1a\x1b%%\x02\x1b\xfd\x80\x1a&&\x1a\x02\x80\x1a&&\x1aV?, L=8=9%pEL\x02\x1f\x1b\x1a+\x01\x01%\x1a\x02\x81\x19%\x02\x02r@W!\x12<%*',<\x14\x13\x15\x1f2(<\x1e\x18&L,\"\x06\x18\x14\x0er\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06@\x05\x00\x00\v\x00\x1b\x00\\\x00\x00\x01\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26%\x16\x15\x0e\x01#!\x1e\x02\x17\x1e\x02\x15\x14\x0e\x05#\"'.\x02'.\x02'&'.\x01'.\x015\x1146767>\x02;\x03\x16\x17\x16\a\x16\x17\x16\a\x16\a\x14\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04i7\x01qN\xfe\xeb\x04\b\x0e\x03\x12\x12\x14\x01\t\x0f!/I.\x1a\x13\x14\x1c\v\a\t\t\x1a\x12!D1h\x18\x19$&\x1a#{MW\x9cB\x11L$\x85@:\t'\x0f\x11\x11.\x03\x03\xc0\x1a&&\x1a\x1b%%\xfd\xe5\x02\x80\x1a&&\x1a\xfd\x80\x1a&&\xaf=XNr\x0e\x14\x18\x06%(M&\x18\x1e<(2\x1f\x15\x13\x14<,'*%<\x12!W@r\x02\x02%\x19\x02\x81\x1a%\x01\x01+\x1a\x1b\x1f\x02LEp%9=8=L \x00\x00\f\x00\x00\xff\x80\x06\x00\x05\x80\x00\t\x00\x0f\x00\x17\x00+\x00=\x00\\\x00d\x00\u007f\x00\x8c\x00\x9e\x00\xb2\x00\xc2\x00\x00%54#\"\a\x15\x16327354\"\x15%\x15#\x11#\x11#5\x05\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x05\x15\x14\a\x06#\"'\x15#\x113\x15632\x17\x16\x17\x15\x14\a\x06\a\x06#\"'&=\x014762\x17\x16\x1d\x01#\x15\x143274645\x01\x15\x14\"=\x0142\x014'.\x01'&! \a\x0e\x01\a\x06\x15\x14\x17\x1e\x01\x17\x16 7>\x0176\x01\x13#\a'#\x1e\x01\x17\x16\x17\x153%54'&#\"\a\x06\x1d\x01\x14\x17\x163276\x173\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x97\x1d\x11\x10\x10\x11\x1d\xb8BB\xfd\xc5PJN\x01\xb1C'%!\t\x06B\x01\x01\x0e\x14\x16\x01?\a\f)#!CC $)\f\a\xfb\x02\x03\f\x1b54\x1d\x15\x14\x1df\x1b\x15\x85\"\x18\x06\x01\xfe\x81@@\x02\x15\x13\nB+\x88\xfe\xec\xfe\xed\x88,A\n\x14\x14\nA+\x89\x02&\x89+A\n\x14\xfd\rZK35N\a \b#\vJ\x01!\x15\x1d13\x1b\x15\x15\x1b31\x1d\x15\xb5CC\x16\x14\x0f\x01\x01C\x06\v $)\x01\xf7\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xe9\x9d2\x10\xe0\x10\xab\"33\xe8F\xfeY\x01\xa7F~\xfe\x91(-\x1c\x11%\x01\"\xfe\xf2\x18\x02\x0f\x1f\x01\x18o\x924\x15*)$\x01\xed\xa1(*\x15\xb6\t\x1d\x0e\x16\x12(&\x1b;\x81;\x1b&&\x1d9LA3\x1a\x01\f\x15\v\x038\x9c33\x9c4\xfd\x03\xb1S,;\x05\x0f\x0f\x05;,W\xad\xb0T+<\x05\x0f\x0f\x05<+T\x03;\x01(\xc3\xc3\x17\\\x17g7\xc9x\x82:\x1d&&\x1d:\x82:\x1d&&\x1b<\x01r\xfe\xe5\x1f\x10\x02\x18\x01\x10\xfe\xdb%\x12\x1b-\x01\b\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\v\x00\x1b\xff\x00\x05\xe5\x06\x00\x00\t\x00\x0f\x00\x17\x00+\x00=\x00[\x00c\x00}\x00\x89\x00\x9b\x00\xaf\x00\x00\x01\x15\x14#\"'\x11632\x05\x15#542%35!\x153\x113!3\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327%54'&#\"\a5#\x1135\x163276%5#\x14\a\x06#\"=\x01354'&#\"\a\x06\x1d\x01\x14\x17\x16327676\x0154\"\x1d\x01\x142\x01\x14\a\x0e\x01\a\x06 '.\x01'&547>\x0176 \x17\x1e\x01\x17\x16\x013\x03\x11#\x11&'&'3\x13\x05\x15\x14\a\x06#\"'&=\x0147632\x17\x16%\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x03\xcb'\x17\x16\x16\x17'\x01RZZ\xfc:k\xfe\xc8id\x01 YY\x1e\x1b\x12\x03\x01Y\b\f.06\x01\xad\t\x1162+YY-06\x11\t\x01R[\x02\a!.\xb3\x1b'CD'\x1c\x1d'EH$\x12\x03\x02\xfd\xa0VV\x02\xcf\x1a\x0eX:\xb8\xfd\x1a\xb8:Y\r\x1a\x1a\x0eX;\xb7\x02\xe6\xb8:Y\r\x1a\xfc\x1afyd\x0e/%\x1cjG\x01\xb6\x1c&DC&\x1c\x1c&CD&\x1c\x01O[52.\r\b[\x01\x03\x12\x1b\x1e\x01$\xd3C\x16\x01-\x16D..D\x96^^\xfd\xc7\x01\xee\xfe\x86*\x15\x03 \x01l\xfey1\x18%=^\xc5I\x1a86\xd9\xfdi077\x1bS\r3\n$EWgO%33%O\xadO%35\x1b\x1b\t\x03\xc2\xd2EE\xd2F\xfdW\xeat;P\x06\x15\x15\x06P;p\xee\xeat;P\a\x14\x14\aP;p\x04\x0e\xfeq\xfe\xf1\x01\x0fJ\x8agT\xfe\xf9F\xafQ%33&P\xafP%33%R\xfe\r7>%\x183\x01\x8a\xfe\x91!\x02\x16+\x01}\x00\x00\x02\x00\x05\xff\x80\x05{\x05\xf6\x00\x13\x00'\x00\x00\x01\x06\x03\x06+\x01\"&7\x132'\x03&76;\x012\x17\x01\x16\a\x01\x15\x01\x16\a\x06+\x01\"'\x016\x016;\x012\x02U\n\xf7\x1b&\xef\x15\x14\n\xfd\x01\x01\xa1\f\v\t\x17\xef(\x1a\x03\xca\v\v\xfd\xf0\x01P\v\n\n\x16\xef*\x18\xfe\xad\x12\x02\x01\x19'\xf1\x16\x03e\x12\xfeJ.\"\x13\x01\xc0\x01\x01\x17\x16\x0f\x0f-\x01d\x10\x15\xfcZ\x01\xfd\x99\x14\x11\x0f-\x02n \x03\x8e-\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x13\x00'\x007\x00\x00\x014'&+\x01\"\a\x06\x1f\x01\x15\x03\x06\x17\x16;\x0127\x01&+\x01\"\a\x01\x16\x01\x16;\x01276'\x015\x016\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad~\x15\x1f\xb8\x12\b\a\b}\xc4\t\t\b\x10\xb9\x1f\x13\x037\a\x11\xbb\x1e\x13\xfee\x01\x01\x05\x14 \xb8\x12\a\b\t\xfe\xfc\x01\x99\b۩w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x03\x01\xdd\"\v\f\x11\xd8\x01\xfe\xa6\x0e\x0e\r$\x03Q\f#\xfd'\x02\xfe!#\f\r\x0f\x01\xdc\x01\x02\xd3\x10\x88\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\x00\n\a\x00\x04\xf6\x00\x02\x00I\x00\x00\x01-\x01\x132\x04\x1f\x012\x1e\x05\x17\x1e\x02\x17\x1e\x01\x17\x1d\x01\x16\a\x0e\x01\x0f\x01\x0e\x06#\x06!&$/\x02.\x02'.\x02'.\x01'=\x01&7>\x01?\x01>\x0636\x02\xc7\x01\xe4\xfe\x1c\xb9\xa8\x019II\x01 \x0e!\x18 \x1e\x0e\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0f\x1f\x01\xfb\xfe\x88\xcf\xfe\xcf01$$%A\x18\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0e \x01\xfb\x01\x98\xfa\xfd\x01g\t\x05\x04\x03\x03\x06\n\x10\x17\x0f\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x0f\n\x06\x03\x03\x13\x02\t\x03\x04\x04\x05\n \x19\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x10\n\x06\x03\x03\x12\x00\x00\x05\x00@\xff\x80\x06\xc0\x05\x8a\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00\x00\t\x04\x15\x01\x15'\a5\x015\x17\x015\x177\x15\t\f\x01\x92\x01\xee\xfe\xaa\xfe\x16\x05,\xfe\x16\x01\x01\xfe\x17\x93\x01V\x01\x01\x01W\xfdQ\x01V\xfe\x12\xfe\xae\x05.\x01R\xfe\x17\xfe\xa9\x01W\x01\xe9\xfe\xae\xfe\x12\x03=\xfe\xcf\xfe\xe3\x01?\xfe\xe4l\xfe\xdb\x01\x01\x01\x01\x01%l`\x01\x1c\x02\x01\x01\x02\xfe\xe4\x04\xd8\xfe\xe3\xfe\xd0\x01\x0e\xfe\xf2\xfe\xf1\xfe\xc1\x01\x1d\x03~\xfe\xc1\xfe\xf2\x010\x00\x06\x00\v\xff\x00\x05\xf5\x06\x00\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x00\x05!\x11#\x11!\x11#%7\x05\a\x017\x01\a\x017\x01\a\x03\x01\a\t\x015!\x15\x05\t\xfb\xa2\xa0\x05\x9e\xa0\xfcR!\x03\x0f!\xfdXC\x02\xd5C\xfd\xf4f\x02ff\xd9\x01݀\xfe#\xfd\xb2\x03 `\x01\xe0\xfd\x80\x02\x80,\x9d\xa5\x9c\x02\x1a\x92\xfe\xad\x91\x02\xb6{\xfd\xff{\x03{\xfd\u007f`\x02\x81\xfa\xa1\x9f\x9f\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00O\x00g\x00\x00\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 $\x14\x06\"&462$\"&\x0e\x02\a\x0e\x01\a\x0e\x03\x16\x14\x06\x1e\x02\x17\x1e\x01\x17\x1e\x0362\x16>\x027>\x017>\x03&46.\x02'.\x01'.\x03\x00\x10\a\x0e\x01\a\x06 '.\x01'&\x107>\x0176 \x17\x1e\x01\x17\x04\x00\x96Ԗ\x96\xd4\x01 \xe6\xfe\xb8\xe6\xe6\x01H\x01R6L66L\xfeG\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x02n\x05\n\xe4\xd0X\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x02\x16Ԗ\x96Ԗ\x01\xa4\xfe\xb8\xe6\xe6\x01H\xe66L66L6\x80\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\xfen\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x05\x05\n\xe4\xd0\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x17\x00\x1f\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x01\x9a|\xb0||\xb0\x02\xb0|\xb0||\xb0\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfc\xa8\xb0||\xb0||\xb0||\xb0|\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x15\x00\x00\x01\x13!\x053\t\x0137!\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\xc9\xfen\x026^\xfe5\xfe5^h\x02\n\x01\xfb\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\x92\xfe\xce\xe0\x02\xb3\xfdM\xa0\x011\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xffP\x05\x81\x05\xa3\x00\n\x00\x16\x00*\x00C\x00g\x00\x00\x01\x16\x06'.\x01676\x1e\x01\x17.\x01\a\x0e\x01\x17\x1e\x017>\x01\x13.\x02'$\x05\x0e\x02\a\x1e\x02\x17\x167>\x02\x13\x0e\x03\a\x0e\x01&'.\x03'&'?\x01\x16 7\x1e\x01\x06\x13\x06\x03\x0e\x02\a\x06%&'.\x04'.\x03'>\x04767$\x05\x16\x17\x1e\x01\x03/\bu5'\x1d\x1c&$I7o\x0e\xc6b?K\x03\x04\x93\\[z\xe4\x14H,1\xfe\xdd\xfe\xed+.@\x12\x1e\\7<\xe4\xdc?5\\V\b\x0f\r,$V\xcf\xc5g.GR@\x14\x19 \x06\x12\xdf\x027\xe0\x15\x06\x10\xb5\x1aU\x05,+!\xfc\xfe\x9a\xf8\x92\x0f\x15\r\x05\a\x02\t#\x15\x1a\t\x03\x1d\"8$\x1e}\xbc\x01{\x01)\x9b<\x10\x01\x02\xa5?L \x11RR\x11\x12\f;\x11kr,\x1cyE[\x80\b\b\x98\x02z\x1b#\t\b/1\a\n\"\x1a\x1c#\t\a\x1d\x1c\b\b#\xfc\x12\x1aeCI\x140/\x03\x11\b\x14\"5#`\xc4\x10\t\x94\x94\x06\"8\x03\xb8\xa7\xfe\x18\x1e4\x1c\x11~&\x1bp\f\x1d)\x1b4\t2\xc8{\xacH\x1a-\x1e\x1e\x0f\v.\x12%W.L\x14>\x00\x06\x00\x00\xff\x80\x06\x00\x05\x80\x00\b\x00\x13\x00'\x00:\x00Y\x00i\x00\x00\x014&\a\x06\x16\x17\x1667\x16\x0e\x01&'&676\x16\x13\x0e\x02\a\x06'.\x02'>\x0276\x17\x1e\x02\x1346&'\x06 '\x0f\x01\x16\x17\x16\x17\x167>\x02\x136'&'&\x05\x06\a\x0e\x02\a\x1e\x02\x17\x1e\x03\x17\x16\x17\x047>\x027\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03PR$+\x01+'TJ\bX\x84j\x03\x027-F\x8f\xb6\x14C',\x9b\xa9,&C\x15\r.\"\x1e\xc6\xd2!$28\v\x05\x0f\xa1\xfeh\xa2\f\x05\x1a\x0f/\x9d\xf9\xb3\"\x1e\x0f\x87\t\x11+p\xd8\xfe\xf1\x84^&+3\x04\b\x16$\x06\x01\b\x06\x12\ri\xb3\x01\x03\xb5\x18\x1f\x1f\x040\x01(\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x9a+.\x16\x14i\x12\x176=Bn\f\\C1X\x14\x1fR\x01:\x15\x1a\x06\x05\x14\x14\x06\a\x19\x14\x13\x18\a\x05#\"\x05\a\x19\xfd\x03\a'\x19\x04jj\x06\f\x9a8Q\x1b.c\x13Aj\x02\xc75\x167!?\x1b\f\"\x0f\x140\x1eD\x8c\xca$\x054\x14\"\vP\x14\x1c[\r\x14&\x15\x01\v\x012\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00D\xff\x80\x04\x00\x06\x00\x00\"\x00\x00%\x17\x0e\x01\a\x06.\x035\x11#5>\x047>\x01;\x01\x11!\x15!\x11\x14\x1e\x0276\x03\xb0P\x17\xb0Yh\xadpN!\xa8HrD0\x14\x05\x01\a\x04\xf4\x01M\xfe\xb2\r C0N\xcf\xed#>\x01\x028\\xx:\x02 \xd7\x1aW]oW-\x05\a\xfeX\xfc\xfd\xfa\x1e45\x1e\x01\x02\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00/\x00\x00%'\x06#\x06.\x025\x11!5!\x11#\"\a\x0e\x03\a\x153\x11\x14\x1e\x027>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04p>,;$4\x19\n\x01\x01\xff\x00\xbc\b\x01\x05\x195eD\x82+W\x9bcE\x87\x01\xa2\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9K\xb7\x16\x01\x17()\x17\x01\x8e\xc2\x01F\n,VhV\x19\xa5\xfe^9tjA\x02\x010\x04/\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x03\xff@\x02\xfd\x06\x00\x00\x17\x00\x00\x00\x16\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x113\x02\xf5\x10\r\xfe\xa2\n\r\x0e\n\xfe\x9d\r\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x01\x00&\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x12\x0e\xfb \x00\x00\x00\x01\x00\x03\xff\x00\x02\xfd\x05\xc0\x00\x17\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&7\x01632\x17\x01\x16\x02\xfd\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01c\r\x04\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\n\xfe\x80\x10\x00\x00\x00\x00\x01\x00@\x01\x03\a\x00\x03\xfd\x00\x17\x00\x00\x01\x15\x14\x06#!\x15\x14\x06'\x01&547\x016\x17\x16\x1d\x01!2\x16\a\x00\x12\x0e\xfb &\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x02\xe0\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01b\x0e\b\t\x14\xe0\x12\x00\x00\x00\x01\x00\x00\x01\x03\x06\xc0\x03\xfd\x00\x17\x00\x00\x01\x14\a\x01\x06'&=\x01!\"&=\x01463!546\x17\x01\x16\x06\xc0\n\xfe\x80\x10\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\x02\x83\x0e\n\xfe\x9e\x0e\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\xfe\xa2\n\x00\x00\x00\x02\x00\x00\xff\x80\x05q\x06\x00\x00&\x008\x00\x00\x01\x06\a\x06#\"'&#\"\a\x06#\"\x03\x02547632\x17\x16327632\x17\x16\x17\x06\a\x06\x15\x14\x16\x01\x14\a\x06\a\x06\a\x06\a6767\x1e\x01\x17\x14\x16\x05q'T\x81\x801[VA=QQ3\x98\x95\x93qq\xabHih\"-bfGw^44O#A\x8a\xfe\xe1\x1d\x1e?66%C\x03KJ\xb0\x01\x03\x01\x01\x01A}}\xc4 !\"\x01\x03\x01\x05\xf2䒐\x1e\x1e\"\"A$@C3^q|\xc6\x04z=KK?6\x12\v\x06\x95lk)\x03\x10\x03\x04\f\x00\x00\x04\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\x01\x11%\x11\x01\x11!\x11\x01\x11%\x11\x01\x11!\x11\x02\xaa\xfdV\x02\xaa\xfdV\x06\x80\xfcu\x03\x8b\xfcu\x02\x12\xfdu^\x02-\x02\xe7\xfdm\x025\xfdw\xfc\xee}\x02\x95\x03n\xfc\xe6\x02\x9d\x00\x00\x00\x06\x00\x00\xff\x00\x05\x80\x05~\x00\a\x00\x0f\x00\x1c\x007\x00M\x00[\x00\x00\x00264&\"\x06\x14\x04264&\"\x06\x14\x052\x16\x15\x11\x14\x06\"&5\x1146\x05\x11\x14\x06+\x01\x15\x14\x06\"&=\x01#\x15\x14\x06#\"&5'#\"&5\x11\x01\x1e\x01\x15!467'&76\x1f\x0162\x1776\x17\x16\a\x01\x11\x14\x06#\"&5\x114632\x16\x01\xdd \x17\x17 \x16\x01\xbc \x16\x16 \x17\xfc\xfb*<;V<<\x04O@-K\x03<\x01&\x014'>\x03&4.\x02'.\x01'\x16\x17\x16\a\x06\a\x06.\x01'.\x04'.\x03'&6&'.\x01'.\x01676\x16\a\x06\x167645.\x03'\x06\x17\x14#.\x01\x06'6&'&\x06\a\x06\x1e\x017676\a\"&'&6\x172\x16\x06\a\x06\a\x0e\x01\a\x0e\x01\x17\x1e\x03\x17\x167>\x0376\x17\x1e\x01\x06\a\x0e\x01\a\x06\a\x06'&\x17\x16\x17\x167>\x05\x16\x17\x14\x0e\x05\a\x0e\x02'&'&\a\x06\x15\x14\x0e\x02\x17\x0e\x01\a\x06\x16\a\x06'&'&76\a\x06\a\x06\x17\x1e\x01\x17\x1e\x01\x17\x1e\x01\x06\a\x1e\x02\x156'.\x027>\x01\x17\x167676\x17\x16\a\x06\a\x06\x16\x17>\x0176&6763>\x01\x16\x016&'&\x15\x16\x172\a\x0632\x05.\x02'.\x04\a\x06\x16\x17\x166'4.\x01\a\"\x06\x16\x17\x16\x17\x147674.\x01'&#\x0e\x01\x16\a\x0e\x02\x17\x16>\x017626\x01\x1e\x02\x0e\x05\a\x0e\x01\a\x0e\x01'.\x03'&#\"\x06\a\x0e\x03'.\x01'.\x04'&676.\x0167>\x017>\x015\x16\a\x06'&\a\x06\x17\x1e\x03\a\x14\x06\x17\x16\x17\x1e\x01\x17\x1e\x027>\x02.\x01'&'&\a\x06'&7>\x027>\x03767&'&67636\x16\x17\x1e\x01\a\x06\x17\x16\x17\x1e\x01\x17\x16\x0e\x01\a\x0e\x03'.\x04'&\x0e\x01\x17\x16\a\x06\x1667>\x017>\x01.\x01'.\x0167\x1e\x05\x02\x97\v\t\x04\x05\x13\x05\\\x04\x0f\n\x18\b\x03\xfe\x9b\x04\x04\x05\x03\x03\a\n\t\x04\x11\x04\x01\x02\x02\x01\x02\x03U7\x04\a\x03\x03\x02\a\x01\t\x01\nJ#\x18!W!\v'\x1f\x0f\x01\v\t\x15\x12\r\r\x01\x0e\"\x19\x16\x04\x04\x14\v'\x0f;\x06\b\x06\x16\x19%\x1c\n\v\x12\x15\r\x05\x11\x19\x16\x10k\x12\x01\t)\x19\x03\x01\"\x1c\x1b\x1d\x02\x01\t\x11\a\n\x06\x04\v\a\x11\x01\x01\x14\x18\x11\x14\x01\x01\x16\t\b'\x01\r\x05\n\x0e\x16\n\x1b\x16/7\x02*\x1b \x05\t\v\x05\x03\t\f\x14I\t,\x1a\x196\n\x01\x01\x10\x19*\x11&\"!\x1b\x16\r\x02\x02\x06\x06\v\a\r\x03\x1cO6\x16\x15*\x16\x03\x01\x1e\x1d\r\x12\x17O\b\x02\x01\x06\b\x15 \x04\x02\x06\x04\x05\x02\x02$.\x05(\x04\x14\xa8\t\x10\x03\x1f\x1e\b*\x0e.'\x04\r\x06\x01\x03\x14\n.x\x85,\x17\v\f\x02\x01\x16\t\x06\x15\x03\x17\x02\x02\x11\x02\x16\x0f$\x01CN\xfd\xa1\x03\v\x06\t\x02\x03\n\x03\x03\v\x03\x01\xa3\x02\t\x11\x06\x05\t\x05\x06\x02\x03\x0e*\x12\t\v\xb4\n\f\x03\x06\x04\x04\x03\x0e\x04\b\x026\x05\r\x03\x0f\t\t\x05\x03\x02\x01\n\x02\x04\x04\b\x0e\b\x01\x10\x0e\x027\x14\x16\x02\a\x18\x17%\x1a&\b&_\x1c\x11f&\x12\x17\n\"\x1e,V\x13L\x14,G$3\x1c\x1d\xa4@\x13@$+\x18\x05\n\"\x01\x01\n\n\x01\n\x0eV\x11\x1e\x18\x155 3\"\t\r\x12\x02\f\x05\x04\x01\"\x03\x03\"\x14\x81#\x18dA\x17++\x03\x12\x14\ny0D-\v\x04\x03\x01\x01\x12\x1e\a\b%\x16&\x14n\x0e\f\x04\x024P'A5j$9E\x05\x05#\"c7Y\x0f\b\x06\x12\v\n\x1b\x1b6\"\x12\x1b\x12\t\x0e\x02\x16&\x12\x10\x14\x13\n8Z(;=I50\v' !!\x03\x0e\x01\x0e\x0f\x1a\x10\x1b\x04e\x01\x13\x01\x06\f\x03\x0e\x01\x0f\x03\v\r\x06\xfeR\x01\b\x11\x05\x05\b\v\x01\x01\x10\n\x03\b\x04\x05\x03\x03\x02\xfe\x9a\x12\x18\x0f\x19\x1b\x10\x1d\n\"\a+\x050n\x14\x14?\xa2t(\x02\x04-z.'<\x1f\x12\f\x01>R\x1e$\x16\x15A\"\b\x03\x1e\x01\x0124\x01\x03B\x19\x13\x0f\a\x04@\x05\x1e(\x15\t\x03\b~\x0f\t\x03\x04\a9B\x01\x019\x1f\x0f,\x1f\x02\x03\v\t\x01\x1d\x13\x16\x1e\x01*$\x04\x0f\x0e\f\x17\x01\x0e\x1a\x05\b\x17\x0f\v\x01\x02\x11\x01\f\t\x11\t\x0e\x06\x03\v\r\x03\x06\x1f\x04\x13\x04\x05\a\x02\x04\x04\x0f\x17\x01\x01\f\x10\x13\x0f\t\x04\t\x02\x05\x05\x04\x06\x03\a\x01\x0e<\x1a\f\v>\x1f\t\x03\a\x19?0D\x1d\x06\xa89\x12f\b\x18\x15\x1f?\x1c\x1c\x13\x01\x01\x04Ae\f \x04\x17\x87\t\x0f.(\x03\x0f;1.\x18D\b\x10\b\x02\x05\t\a4\x10\x0fH&\b\x06.\x19C\x17\x1d\x01\x13t \x15iY\x1a\x12% \v\x03*\x11\x1a\x02\x02\t\x05\x01\x0f\x14\xc2\b\a\x03\x04\x03\n\x06\a\x01\x02\x107\x04\x01\x12\xe0\v\x11\b\x01\x04\x04\x01\x04\x1b\x03\x05\x02\xea\x02\x06\b\x02\x0f\x01\r\r\x06\x04\r\x05\x06\x03\x06\f\x03\x01\x04\xfa\xc8\f\x19\x17\x16\x16\x11\x14\r\x12\x04\x13J\x1b\x10\a\x12\t\x1d\x16\x11\x01\x01\x03\x01\x01\x1c \x19\x01\x01<\r\x04\v\a\f\x11\v\x17W\v\x100%$\t\f\x04\n\x12\"\"I!\x14\x05\x03\r\x0f*\x06\x18\f\x16\v\x0fD\x0e\x11\t\x06\x19\b\x06 \x0e\x03\x06,4A'\x11\xbe4J\"\t\x18\x10\x16\x1d.0\x12\x15f6D\x14\x8f4p\xc6Z{+\x15\x01\x1d\x1b*\x9fD_wqi;\xd0W1G(\x02\x02\"%\x1e\x01\x01\b\x13\f\x1d\x05%\x0eT7F}AG\x05!1#\x19\x12% \x19\v\vJG\f\x1f3\x1e\x1b\v\x0f\x00\b\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00 \x00'\x00.\x002\x00>\x00V\x00b\x00\x00%&\x03#\a\x0e\x04\a'\x1632\x03&'\x04!\x06\x15\x14\x16\x17>\x03?\x01>\x01'&'\x0e\x01\a \x05&\a\x16\x17>\x01\x01\"\a6\x05&#\"\a\x16\x17>\x04\x13&'\a\x0e\x04\a\x16\x17\x1e\x01\x17>\x012\x1e\x04\x176\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00*b\x02\x02\x106\x94~\x88#\x0f\xb8\xea\x84=\x15 \xfe\xc9\xfe\x96\x01XP2\x93\x8a{&%\x04\x12gx|\x8a\xc0 \x01.\x03\xdc\xd2\xc7W)o\x94\xfc\xf1\x01\x01\x01\x02O\xb9\xf8LO\x83sEzG<\x0f\xe4\x03\x92\x01\t\x14CK}E\x19\x13\x02\t\x03$MFD<5+\x1e\nz\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a$\xf1\x01\x01\x01\x06\x15MW\x8eM\v\x96\x02\x931>]\a\x0e|\xe1YY\x9b^D\x0e\r\x01\x05\xd6եA\xf2\x97\xef<\x1f\xef\xe6K\xe5\x03m\x01\x01\x91\xa4\x13\xaa\xd4\x1aE6<\x15\xfe\"\xe8\xb2\x01\f\x19@9I\x1c5*\x05\x18\x05\x05\x04\x03\x05\x06\a\x05\x02\xc8\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00>\x00^\x00\x00\x014.\x03/\x01.\x045432\x1e\x0332654.\x01#\"\x0e\x02\x15\x14\x1e\x02\x1f\x01\x16\x17\x16\x15\x14\x06#\".\x03#\"\x06\x15\x14\x1632>\x02\x05\x14\x06#\"'\x06#\"$&\x02547&54632\x17632\x04\x16\x12\x15\x14\a\x16\x04\x95':XM1h\x1e\x1c*\x12\x0f\x90+D($,\x1a/9p\xac`D\x80oC&JV<\x92Z\x16 PA3Q1*2\x1d23\xf4\xa9I\x86oB\x01kែhMI\x8f\xfe\xfb\xbdo\x10PែhMI\x8f\x01\x05\xbdo\x10P\x01\xd92S6,\x18\v\x18\a\a\x10\x10\x1a\x11M\x18!\"\x18@-7Y.\x1f?oI=[<%\x0e$\x16\x0e\x14('3 -- <-\\\x83%Fu\x90\x9f\xe1P\x10o\xbd\x01\x05\x8fIMh\x82\x9f\xe1P\x10o\xbd\xfe\xfb\x8fIMh\x00\x00\x00\x03\x00,\xff\x80\x04\xcb\x06\x00\x00#\x00?\x00D\x00\x00\x0176&#!\"\x06\x15\x11\x147\x01>\x01;\x01267676&#!\"&=\x01463!267\x06\n\x01\a\x0e\x04#!\"\a\x06\x01\x0e\x01'&5\x11463!2\x16\a\x036\x1a\x01\x03\xe8%\x05\x1c\x15\xfd8\x17\x1f\x06\x01#\x17\x1e!\xef\x16\x1e\x03\x18\r\x04\x1f\x15\xfe\xda\x1d&&\x1d\x01Z\x12\"\xe6\x0fM>\x04\x06\x06\x16\x1b2!\xfe\xf1\r\t\b\xfe^\x16I\f7LR\x03x_@\x16\x9e\x04>M\x04N\xc2\x17\"\"\x14\xfb\xb3\a\x06\x01`\x1a\x0f\x1d\x0f\x82=\x15&&\x1d*\x1d%\x1b\xeeI\xfe}\xfe\xc7\x11\x16\x15,\x16\x14\n\t\xfe\x1b\x19\a\t\x16L\x05\x827_jj\xfc\xea\x11\x019\x01\x83\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00%\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\xc0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\x02\xa0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\xa0&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x04\x00\x0e\x12\x12\x0e\xfc\x00\x0e\x12\x12\x01\x8e\x02\x80\x0e\x12\x12\x0e\xfd\x80\x0e\x12\x12\x03\x0e\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x00\x05\xe0\x001\x009\x00\x00\x01\x14\x06#\"'\x03#\x15\x13\x16\x15\x14\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x135#\x03\x06#\"&547\x0163!2\x17\x01\x16\x00\x14\x06\"&462\x05\x008(3\x1d\xe3-\xf7\t&\x1a\xc0B.\xa0.B\xc0\x1a&\t\xf7-\xe3\x1d3(8\x10\x01\x00Ig\x01\x80gI\x01\x00\x10\xfe`\x83\xba\x83\x83\xba\x01\xe0(8+\x01U\x84\xfee\x0f\x12\x1a&\xfe\xf0.BB.\x01\x10&\x1a\x12\x0f\x01\x9b\x84\xfe\xab+8(\x1d\x18\x01\x80kk\xfe\x80\x18\x03`\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x00\x04\x00\x05\xe0\x00%\x00-\x00\x00\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11463!2\x16\x00\x14\x06\"&462\x04\x008P8@B\\B@B\\B@8P8pP\x02\x80Pp\xfe\xe0\x83\xba\x83\x83\xba\x03@\xfe`(88(\x01`\xfcp.BB.\x01\xd0\xfe0.BB.\x03\x90\xfe\xa0(88(\x01\xa0Ppp\x01ͺ\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00!\x00\x00%\x01>\x01&'&\x0e\x01\a\x06#\"'.\x02\a\x0e\x01\x16\x17$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x05\x01^\x10\x11\x1d/(V=\x18$<;$\x18=V).\x1d\x11\x10\x04X\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xea\x01\xd9\x16J`\x1f\x1a\x01\"\x1c((\x1c\"\x01\x1a\x1f`J\x16\x8e\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00,\xff\x00\x06\xd4\x05\xff\x00\x0f\x00I\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01%\x06\a\x05\x11\x14\a\x06'%\a\x06\"/\x01\x05\x06'&5\x11%&'&?\x01'&767%\x11476\x17\x05762\x1f\x01%6\x17\x16\x15\x11\x05\x16\x17\x16\x0f\x01\x17\x16\x05\xc0[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01o\x04\x10\xfe\xdc\r\x0f\x0e\xfeܴ\n \n\xb4\xfe\xdc\x0e\x0f\r\xfe\xdc\x10\x04\x05\t\xb4\xb4\t\x05\x04\x10\x01$\r\x0f\x0e\x01$\xb4\t\"\t\xb4\x01$\x0e\x0f\r\x01$\x10\x04\x05\t\xb4\xb4\t\x02\v\xea՛[[\x9b\xd5\xea՛[[\x9b5\x0f\x05`\xfe\xce\x10\n\n\x06^\xf8\r\r\xf8^\x06\n\n\x10\x012`\x05\x0f\x11\f\xf8\xf8\r\x10\x0f\x05`\x012\x10\n\n\x06^\xf8\f\f\xf8^\x06\n\n\x10\xfe\xce`\x05\x0f\x10\r\xf8\xf8\f\x00\x02\x00\x00\xff\x80\x05\xbe\x05\u007f\x00\x12\x001\x00\x00%\x06#\"$\x02547\x06\x02\x15\x14\x1e\x0232$%\x06\x04#\"$&\x0254\x126$76\x17\x16\a\x0e\x01\x15\x14\x1e\x013276\x17\x1e\x01\x04\xee68\xb6\xfeʴh\xc9\xfff\xab킐\x01\x03\x01&^\xfe\x85\xe0\x9c\xfe\xe4\xcezs\xc5\x01\x12\x99,\x11\x12!V[\x92\xfa\x94vn)\x1f\x0e\a\xe9\t\xb4\x016\xb6\xc0\xa5<\xfe\xaeׂ\xed\xabf{\xc3\xcb\xf3z\xce\x01\x1c\x9c\x99\x01\x17\xcc}\x06\x02))\x1fN\xcfs\x94\xfa\x923\x12\x1f\x0e(\x00\x03\x00@\xff\x80\x06\xc0\x05\x80\x00\v\x00\x1b\x00+\x00\x00\x004&#!\"\x06\x14\x163!2\x01\x11\x14\x06#!\"&5\x11463!2\x16\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04@&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a\x02f&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&@&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\x02\xa64&&4&\x01\x00\xfc@\x1a&&\x1a\x03\xc0\x1a&&\x01\xa6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x02\x00 \xff\xa0\x06`\x05\xc0\x00B\x00H\x00\x00\x00\x14\x06+\x01\x14\a\x17\x16\x14\a\x06\"/\x01\x0e\x04#\x11#\x11\".\x02/\x01\a\x06#\"'.\x01?\x01&5#\"&46;\x01\x11'&462\x1f\x01!762\x16\x14\x0f\x01\x1132\x01!46 \x16\x06`&\x1a\xe0C\xd0\x13\x13\x126\x12\xc6\x05\x14@Bb0\x803eI;\x0e\x0f\xb7\x14\x1c\x18\x13\x13\x03\x11\xca:\xe0\x1a&&\x1a\xe0\xad\x13&4\x13\xad\x03L\xad\x134&\x13\xad\xe0\x1a\xfeF\xfd\x80\xbb\x01\n\xbb\x02Z4&\xabw\xd1\x134\x13\x13\x13\xc5\x05\x10) \x1a\x03\x80\xfc\x80\x1b''\r\x0e\xcf\x15\x10\x125\x14\xe3r\xa0&4&\x01&\xad\x134&\x13\xad\xad\x13&4\x13\xad\xfe\xda\x02\x00\x85\xbb\xbb\x00\x00\x01\xff\xff\x00\x01\a}\x04G\x00\x85\x00\x00\x01\x16\a\x06\a\x0e\x02\x1e\x02\x17\x16\x17\x16\x17\x1e\x02\x0e\x01#\x05\x06&/\x01.\x03\a\x0e\x04\x17\x14\x06\x0f\x01\x06\a#\x06.\x02/\x01.\x03\x02'&4?\x0163%\x1e\x01\x1f\x01\x16\x17\x1e\x01\x1f\x01\x1e\x0327>\x04'.\x01/\x01&'&7676\x17\x16\x17\x1e\x03\x14\x0e\x01\x15\x14\x06\x1e\x02\x17\x1e\x01>\x02767>\x01?\x01>\x02\x17%6\x16\x17\a}\x17\xad\x18)(\x1e\x1f\a\x13.\"\x04\x01\x8d2\x03\a\a\b*&\xff\x00\x18@\x14\x14\x1eP9A\x18\x03\n\x18\x13\x0f\x01\a\x04\x04\x12#sG\x96q]\x18\x19\n#lh\x8d<\x06\x03\x04\x0f*\x01\x12\f\x16\x05\x05\x10\b\x144\x0f\x10\x1d6+(\x1c\r\x02\x06\x12\t\n\x05\x02\x0e\a\x06\x19<\r\x12\x10\x165\xbaR5\x14\x1b\x0e\a\x02\x03\x02\x01\x06\x11\x0e\b\x12\"*>%\"/\x1f\t\x02\x04\x1a+[>hy\n\x0f\x03\x03\x01\x03\x03\x01\x02\x05\x0f\t\x00\a\x00\x00\xff\xaa\x06\xf7\x05K\x00\n\x00\x15\x00!\x00/\x00U\x00i\x00\u007f\x00\x00%6&'&\x06\a\x06\x1e\x01676&'&\x06\a\x06\x17\x166\x17\x0e\x01'.\x017>\x01\x17\x1e\x01%.\x01$\a\x06\x04\x17\x1e\x01\x0476$%\x14\x0e\x02\x04 $.\x0154\x1276$\x17\x16\a\x06\x1e\x016?\x0162\x17\x16\a\x0e\x01\x1e\x01\x17\x1e\x02\x02\x1e\x01\a\x0e\x01'.\x0176&\a\x06&'&676%\x1e\x01\a\x0e\x01.\x0176&'.\x01\a\x06.\x01676\x16\x02\xa3\x15\x14#\"N\x15\x16\x12DQt\b\t\r\x0e\x1d\a\x11\x1e\x0e\x1e\xb5-\xe2okQ//\xd1jo_\x01\v\t\xa0\xfe\xff\x92\xdf\xfe\xdb\x0e\t\xa0\x01\x01\x92\xdf\x01%\x01&J\x90\xc1\xfe\xfd\xfe\xe6\xfe\xf4Ղ\x8b\x80\xa9\x01YJA-\x04\x06\x0e\x0f\x06\x06\x8b\xd6.--\x02\x05\x0e\n\f9\\DtT\x19\x13\b+\x17\x17\x16\a\x14X?\x18*\x04\x05\x1a\x18<\x01UW3'\t26\x1a\b\x1c$>>\xacW\x1c0\f\x1f\x1c{\xf2\xfc\"F\x0f\x0e\x1a!\"E \x1b\x9b\r\x1b\x05\x05\v\r\x1f\x0e\x05\v^f`$\"\xb9_]\\\x1b\x1d\xb5<`\x94F\x0e\x17\xed\x92`\x94F\x0e\x17\xed\x8eD\x8f\x83h>Cw\xb7ls\x01\x04\x80\xa9\x86J@\x91\x0e\f\x02\x03\x02\x02;=?s\r\x0e\v\x04\x04\x12:i\x02_^{8\x17\x16\a\b+\x17?`\r\x05\x1a\x18\x18)\x05\rO`\xfds\x1b\x1a\x122\x1bR\xb4DE5\x12\x06\x1f8/\x06\x1aK\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05r\x00\t\x00\x13\x00\x1d\x00\x00\x05\x06#\"'>\x017\x1e\x01\x01\x11\x14\x02\a&\x114\x12$\x01\x10\a&\x025\x11\x16\x04\x12\x04m\xab\xc5ī\x8a\xc3\"#\xc3\xfe\x9b\xfd̵\xa7\x01$\x045\xb5\xcc\xfd\xb3\x01$\xa7\"^^W\xf8\x90\x90\xf8\x05=\xfe\x1b\xfc\xfeac\xd7\x01\x18\xbb\x01E\xd6\xfd*\xfe\xe8\xd7c\x01\x9f\xfc\x01\xe5\x1e\xd6\xfe\xbb\x00\x00\x00\x01\x00\x00\xff\x00\x05z\x06\x00\x00k\x00\x00\x01\x0e\x03.\x03/\x01\x06\x00\a\"&4636$7\x0e\x02.\x03'>\x01\x1e\x02\x1767\x0e\x02.\x05'>\x01\x1e\x05\x1f\x0165.\x0567\x1e\x04\x0e\x02\x0f\x01\x16\x14\a>\x05\x16\x17\x0e\x06&/\x01\x06\a>\x05\x16\x05z X^hc^O<\x10\x11q\xfe\x9f\xd0\x13\x1a\x1a\x13\xad\x01+f$H^XbVS!rȇr?\x195\x1a\a\x16GD_RV@-\x06F\u007fbV=3!\x16\x05\x04\f\b\x1bG84\x0e&3Im<$\x05\x06\x14\x12\b\a\x01\x01\x03\x0e/6X_\x81D\x02'=NUTL;\x11\x11\x172\x06\x18KPwt\x8e\x01\xb1Pt= \x03\x0e\x1e\x19\n\n\xe4\xfe\xf9\x01\x1a&\x19\x01ռ\x0e\x12\b\r,J~S/\x14#NL,\x83\xa0\x01\x03\x02\x03\x11\x1d8JsF\x1c\x11\x13);??1\x0f\x10zI\x06\x14EJpq\x8dD\x19IPZXSF6\x0f\x0f\x04\\\x1a\a\x17?5:\x1f\x02\x17N\u007fR=\x1e\x12\x01\x03\x03\x03\x93\x88\a\x17;.&\x021\x00\x04\x00\x15\xff\x00\x04\xeb\x05\x00\x00\f\x00\x10\x00\x14\x00\x1e\x00\x00\x01\x15\x14\x06+\x01\x01\x11!\"&=\x01\x01\x15!\x11\x01\x15!\x11%\x15!5463!2\x16\x04\xebsQ9\xfe\xfc\xfd\xefQs\x04\xd6\xfb*\x04\xd6\xfb*\x04\xd6\xfb*sQ\x03NQs\x01\x1bBUw\xfe\xf3\x01\rwUB\x01F\xff\x00\xff\x01H\xff\x00\xff\x8cCCTww\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x00\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\t\xfe\xc0\t\x0e\r\x13\xfe\xa0\r\x13\x13\r\x01`\x12\x0e\f\f\x01?\xa9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x8e\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\xab\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&47\x01632\x16\x1d\x01!2\x16\x12\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\x13\r\xfe\xa0\x12\x0e\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x01`\r\x13\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xe0\xc0\r\x13\xc0\x0e\x12\n\x01?\t\x1c\t\x01@\t\x13\r\xc0\x13\xfe\xff\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00&\x1a\x14\x11\xfe@\x1b\x1b\x01\xc0\x11\x14\x1a&\x01\x00\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xc0\xfd\x80\x1a&\f\x01@\x13B\x13\x01@\f&\xfc\xc6\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x1f\x00\x00\x00\x14\x06\"&462\x12 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4*\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\x01 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06]\x05\xe0\x00\x15\x006\x00\x00\x01\x17\x06\x04#\"$\x0254\x127\x17\x0e\x01\x15\x14\x0032>\x01%\x17\x05\x06#\"'\x03!\"&'\x03&7>\x0132\x16\x15\x14\x06'\x13!\x15!\x17!2\x17\x13\x03\xfff:\xfeл\x9c\xfe\xf7\x9bѪ\x11z\x92\x01\a\xb9~\xd5u\x02\x1b:\xff\x00\r\x10(\x11\xef\xfe(\x18%\x03`\x02\b\x0eV6B^hD%\x01\xa7\xfei\x10\x01\xc7(\x11\xe4\x01]̳ޛ\x01\t\x9c\xb5\x01*>\x836߅\xb9\xfe\xf9\x82\xdd\x1ar\x80\a#\x01\xdd!\x18\x03\v\x11\x193?^BEa\a\xfe߀\x80#\xfe9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x016'&\x03632\a\x0e\x01#\"'&'&\a\x06\a\x0e\x01\a\x17632\x17\x1e\x01\x17\x1632\x13\x12\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\f\n\xab\xe7Q,&U\v\x04\x8c#+'\r \x1e\x82;i\x1bl\x1b4L\v92\x0f<\x0fD`\x9d\xe2\xdc\xfa\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x82\xd8\x06\b\xfe\xf3\x13`9ܩ6ɽ\f\a]\x18`\x18C4\xb37\xdb7\xb3\x01&\x01\x1b\x01\u007f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x01\x00\x00\x00\x00\x04\x80\x05\x80\x00D\x00\x00\x01\x14\x02\x04+\x01\"&5\x11\a\x06#\"'&=\x014?\x015\a\x06#\"'&=\x014?\x01546;\x012\x16\x1d\x01%6\x16\x1d\x01\x14\a\x05\x15%6\x16\x1d\x01\x14\a\x05\x116\x00546;\x012\x16\x04\x80\xbd\xfe\xbc\xbf\xa0\x0e\x12\xd7\x03\x06\n\t\r\x17\xe9\xd7\x03\x06\n\t\r\x17\xe9\x12\x0e\xa0\x0e\x12\x01w\x0f\x1a\x17\xfew\x01w\x0f\x1a\x17\xfew\xbc\x01\x04\x12\x0e\xa0\x0e\x12\x02\xc0\xbf\xfe\xbc\xbd\x12\x0e\x02cB\x01\x06\n\x10\x80\x17\bG]B\x01\x06\n\x10\x80\x17\bG\xfa\x0e\x12\x12\x0e\xb5t\x05\x14\x10\x80\x17\by]t\x05\x14\x10\x80\x17\by\xfe\x19\r\x01\x14\xbe\x0e\x12\x12\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfe\xa0\x12\x0e@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x80\x05\x00\x00'\x00/\x00?\x00P\x00\x00\x01\x06+\x015#\"&547.\x01467&546;\x01532\x17!\x1e\x01\x17\x1e\x02\x14\x0e\x01\a\x0e\x01\a7\x16\x14\a\x1764'\x01!\x06\a\"\x06\x0f\x01\x01\x0e\x01+\x01\x0332\x03#\x1332\x16\x17\x01\x1e\x043\x05!&\x02ln\x9e\x80@\r\x13\a:MM:\a\x13\r@\x80\x9en\x04Y*\x81\x10Yz--zY\x10\x81*\x0655QDD\xfbU\x03\xf7\xd9\xef9p\x1b\x1c\xfe\xe0\x1aY-`]\x1d\x9d\x9d\x1d]`.X\x1a\x01 \x04\x0e/2I$\x01\xc8\xfc\tt\x01\xa0@@/!\x18\x19\x02\x11\x18\x11\x02\x19\x18!/@@\a\x16\x03\x0f3,$,3\x0f\x03\x16\a\xfc$p$\x1e0\x940\xfe\xd6&*0\x18\x18\xfe\xe0\x1a&\x01\xd0\x01\xe0\x01\xd0&\x1a\xfe\xe0\x04\r!\x19\x15P@\x00\x02\x00\x00\xff\x80\x06\x80\x06\x00\x00R\x00V\x00\x00\x012\x16\x15\x14\x0f\x01\x17\x16\x15\x14\x06#\"&/\x01\x05\x17\x16\x15\x14\x06#\"&/\x01\a\x06#\"&546?\x01\x03\a\x06#\"&546?\x01'&54632\x16\x1f\x01%'&54632\x16\x1f\x017632\x16\x15\x14\x06\x0f\x01\x1376\x01%\x03\x05\x05\xef>S]\xac8\aT;/M\x0f7\xfe\xca7\bT\x057%>\x01\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x03\xe0\x1f!\"\xc55bBBb/\xbe/\f*\n8(\x03@(87)\xfc\xc0(8=%/\xb5'\x03\x1c\x0e\x1c\x13\x18\x15\x14\x15\x18\x13\x1c\x0e\x1c\x03\x01\v#?\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfb\xe0\x01\xb4#\x14\x16~$EE y \b&\b\xfeL(88\x02e):8(%O\x19 r\x1a\x02\x13\t\x11\t\n\x05\x05\n\t\x11\t\x13\x02\xae\x17O\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x05\x00?\x00G\x00Q\x00a\x00q\x00\x00\x1347\x01&\x02\x01\x14\x0e\x03\a\x03\x0167>\x01&\x0f\x01&'&\x0e\x01\x1e\x01\x1f\x01\x13\x03\x0167>\x01&\x0f\x01\"$32\x04\x17#\"\x06\x15\x14\x1e\x06\x17\x16\x05\x13\x16\x17\x06#\"'\x01\x16\x15\x14\x02\a\x13654\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x00 $6\x12\x10\x02&$ \x04\x06\x02\x10\x12\x16\u007fC\x01o\xc4\xee\x05\b\x05\x0f\b\x1b\x04L\xfe\xea.*\x13\x0e\x13\x13\xcdK\u007f\f\x11\x06\x03\x0f\fPx\xa8\xfe\xe8.*\x13\x0e\x13\x13\xcd\a \ni\x01SƓ\x01\vi\n7J\x04\x04\f\x06\x12\a\x16\x03?\xfe\x06\xed\x01\x04~\x81pi\x03{_Я\xeb;\xfc\xa2\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01U\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3刈\xe5\x02\x80\xa3\x96\xfc\x13_\x01t\x01\b\x13'<\x1cZ\r\xff\x00\x03:\x03\x05\x02!\x1d\x01\n\x01\t\x01\f\x12\x13\x0e\x01\b\xfe\xb8\xfe\b\x03@\x03\x05\x02!\x1d\x01\n\x01\xa0\xbbj`Q7\f\x18\x13\x1b\x0f\x1e\f$\x05k\xd3\xfdy\x06\x05, \x04R\xae\xc3\xd1\xfe\x9ff\x02\xa6\xa9k*\x024\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xf9\xb7\x88\xe5\x01=\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3\xe5\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x06\x00\x00\x12\x00\x1b\x00\x00\x01\x11\x05&$&546$7\x15\x06\x04\x15\x14\x04\x17\x11\x01\x13%7&'5\x04\x17\x04>\xfe\xf0\xe4\xfe\x8c\xd6\xc9\x01]\xd9\xd9\xfe\xe9\x015\xea\x03\xad%\xfd\xf3\x93w\xa1\x01\x15\xcc\x06\x00\xfa\x00\x80\x14\xa4\xfd\x92\x8c\xf7\xa4\x1a\xac&\xe0\x8f\x98\xe6\x1e\x05P\xfe?\xfezrSF\x1d\xac!|\x00\x00\x00\x03\x00\x00\xff\x00\a\x80\x06\x00\x00\f\x00&\x000\x00\x00\t\x01\x15#\x14\x06#!\"&5#5\x01!\x113\x11!\x113\x11!\x113\x11!\x1132\x16\x1d\x01!546;\x01\x052\x16\x1d\x01!5463\x03\xc0\x03\xc0\x80)\x1c\xfa\n\x1c)\x80\x01\x00\x01\x00\x80\x01\x00\x80\x01\x00\x80\x01\x00;\x1c)\xf9\x80)\x1c;\x06;\x1c)\xf8\x80)\x1c\x06\x00\xfe\x80\x80\x1a&&\x1a\x80\xff\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00&\x1a@@\x1a&\xc0&\x1a\x80\x80\x1a&\x00\x00\x02\x00\x00\xff\x80\t\x00\x05\x80\x00\r\x006\x00\x00\x01\x13\x16\x06\x04 $&7\x13\x05\x1627\x00\x14\a\x01\x06\"'%\x0e\x01\a\x16\x15\x14\a\x13\x16\a\x06+\x01\"'&7\x13&54767%&47\x0162\x17\x01\x06\xee\x12\x04\xac\xfe\xd6\xfe\xa4\xfe֬\x04\x12\x02>\x164\x16\x04P\x16\xfb\xa0\x04\f\x04\xfdt+8\x06?::\x02\n\t\x0f\xc0\x0f\t\n\x02::A\vW\xfe\xb3\x16\x16\x04`\x04\f\x04\x04`\x02\xbc\xfe\xc4EvEEvE\x01<\xb5\a\a\x02\x10.\b\xfe\xa0\x01\x01\xce\"\x9be$IE&\xfeO\x0e\v\v\v\v\x0e\x01\xb1&EI&\xcf{h\b.\b\x01`\x01\x01\xfe\xa0\x00\x01\x00m\xff\x80\x05\x93\x06\x00\x00\"\x00\x00\x01\x13&#\"\a\x13&\x00\x02'\x16327\x1e\x01\x12\x17>\x037\x163271\x0e\x03\a\x06\x03[\r>+)@\r(\xfe\xff\xb0]:2,C?\x8d\xc1*%\x91Zx/658:\x1c@#N\n\x92\x02C\xfd=\v\v\x02\xc3E\x01\xc5\x01(\x8b\x0f\x0fo\xed\xfe\xc4E=\xe9\x93\xcdW\x0e\x0e'c:\x86\x11\xf8\x00\x00\x01\x00\x00\xff\x80\x05\xe1\x05\x80\x00#\x00\x00\x01!\x16\x15\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x10\x1e\x0132>\x037!\x03\x00\x02\xd5\f\xb6\xfe\xafڝ\xfe\xe4\xceyy\xce\x01\x1c\x9d\x01,\xd7\xd1{\xb7\x81ۀ\x80ہW\x92^F!\x06\xfeL\x02\xeeC=\xd9\xfe\xab\xc0y\xce\x01\x1c\x01:\x01\x1c\xcey\xc9\xc9w\x82\xdf\xfe\xf8߂0H\\R%\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x19\x00\"\x00N\x00^\x00\x00\x01\x16\a\x06 '&762\x17\x1632762$\x14\x06\"&5462\x05\x14\x06\"&462\x1674&\"\a&'\x13\x17\x14\x16264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x0432$54'>\x01$\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04G\x10\x10>\xfe\xee>\x10\x10\x06\x12\x060yx1\x06\x12\xfe\xd34J55J\x01\xbf5J44J5\xfbFd$\x82\xb5?\xc84J55%6\x1a\xdd\x13\x06E\xb4\x81#42F%\x1f\x06\x01\x18\xc5\xc6\x01\x18\a\x1e$\x01f\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01q\x10\x0f>>\x0f\x10\x06\x0611\x06\xd4J44%&4Z%44J54R1F$Z\x06\x01\x1b-%45J521\x05\x15\xfe\xc8\aZ%F1#:\x0f\x1b\x1d\x8e\xcaʎ \x19\x0f9\xbb\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x19\x00#\x00Q\x00a\x00\x00\x01\x16\a\x06\"'&762\x17\x162762%\x14\x06\"&5462\x16\x05\x14\x06\"&5462\x1674&#\"\a&'7\x17\x1e\x013264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x1632654'>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xab\r\r5\xec5\r\r\x05\x10\x05*\xce*\x05\x10\xfe\xfe.>.-@-\x01R.>.-@-\xd7<+*\x1fq\x9a6\xab\x01-\x1f -- 0\x15\xbd\x11\x04<\x9ao\x1e,+< \x1a\x05\xf0\xa9\xaa\xf0\x06\x19\x1f\x013\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x97\r\r55\r\r\x06\x06**\x06\x96\x1f..\x1f -- \x1f..\x1f --G*<\x1fN\x04\xf3' ,-@-+*\x05\x12\xfe\xf4\x06M <*\x1e2\r\x19\x17z\xad\xadz\x19\x18\r1\x01\xe4\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x000\x00<\x00\x00\x01754&\"\x06\x15\x11\x14\x06\"&=\x01#\x15\x14\x163265\x114632\x16\x1d\x01\x055#\x15\x14\x06#\"&=\x01\a'\x15\x14\x1626\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03bZt\xa0t\x1c&\x1b\x97sRQs\x1b\x14\x13\x1b\x01\x89\x96\x1b\x14\x13\x1bZOpoO\xfe\xe5\x14\x1b\x1b\x14xzRrqP\x01\x18\x13\x1c\x1c\x136\xdfz~\x14\x1b\x1c\x13{\x1a\x1c{Prr\x01\xad\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\xa3\a\x80\x05]\x00\x1e\x000\x00\x00\x0154&\"\x06\x15\x11\x14\x06#\"&5\x11!\x11\x14\x16265\x114632\x16\x1d\x01\a\x05!\x11\x14\x06#\"&5\x11\x177\x11\x14\x16265\x04&\x02'&\a\x0e\x01#\".\x01'&'\x04#\"&5467%&4>\x037>\x0132\x16\x17632\x16\x15\x14\x06\x0f\x02\x06\x1632654.\x02547'654'632\x1e\x05\x177\x0e\x03\x177.\a'.\x02*\x01#\"\a>\x057\x1e\x02?\x01\x15\x1767>\b?\x01\x06\a\x0e\x01\a\x0e\x02\a\x1e\x01\x15\x14\x03>\x0132\x1e\x03\x17\x06#\"'\x017\x17\a\x01\x16\x15\x14\x0e\x03\a'>\x023\x01\a'>\x0132\x133\x17\a\x015\x15\x0f\x01?\x02\x04\xc6K\x89cgA+![,7*\x14\x15\n\x18\f2\x03(-#\x01=\x05\x11\a\x0e\x06\n\a\t\x04\a\x0f\x1a\x12/\x0e~[\x10(D?\x1dG\b\f \x16\f\x16\xf7|\x1c,)\x19\"\x0e#\v+\b\a\x02)O\xfc\xb4\x0e8,\x11\x03+\xf7'\xb96\t\x1b\x1d\x17\x19\x02y{=@\xfe\xf90mI\x01\xa1\x03#938\x04\a\x15OA\x1c\xfeE`\x06\n-\f\x13\xd3\x1f\n)\x03y\x01\x02\x01\x02\x01\x02_\x03/FwaH8j7=\x1e7?\x10%\x9c\xad\xbc\x95a\x02\x04\x05\t\x05%\a\x1d\f\x1e\x19%\x16!\x1a?)L\x0f\x01\x15\n\x10\x1fJ\x16\r9=\x15\x02\x1a5]~\x99\x14\x04\x1ap\x16\x10\x0f\x17\x03j\x0e\x16\r\n\x04\x05\x02\x01\r \x11%\x16\x11\x0f\x16\x03(\x10\x1a\xb7\xa01$\"\x03\x14\x18\x10\x12\x13,I\x1a \x10\x03\x0e\r$\x1f@\x1c\x19((\x02\v\x0f\xd6\x05\x15\b\x0f\x06\n\x05\x05\x02\x03\x04\x01+\x1e!\x1a.\x1bS\t\t-\x1c\x01\x01L\x01__\x15$'\x17-\x119\x13L\x0f\t5V\xa5\xc6+\x03\t\n\t\x136\a\v\xfcT\x1a+\x1f6.8\x05-\v\x03$\f\xb10\xfe\xd0\x0f\x01\a\x0f\v\b\a\x01+\x02\r\a\x02t\x14\x11\x01\f\xfd|S\f\x061\x01\x01\x05\x02\x03\x04\x01\x00\x00\x04\x00\x00\xff\x12\x06\x00\x05\xee\x00\x17\x006\x00]\x00\x83\x00\x00\x05&\a\x0e\x01#\"'&#\"\a\x0e\x01\x17\x1e\x0167>\x0276'&'&#\"\a\x06\a\x06\x17\x1667>\a32\x1e\x01\x17\x1e\x0176\x014.\x02#\"\x0e\x01#\x06.\x03\a\x0e\x01\a\x06\x17\x1e\x0132>\x02\x17\x1e\x03\x17\x1667>\x017\x14\x02\x06\x04 $&\x0254>\x057>\x037>\x017\x16\x17\x1e\x01\x17\x1e\x06\x04\x8f\x05\x13\x1erJ\x81@\x05\b\v\x0f\a\x01\b\"kb2)W+\a\f,\x13\x14\x175/\x18\x1d1\x1a\x0e\t\x11\x17\x03\x0f\x06\x0e\t\x10\x0e\x13\v\x1b#\v\b\n\x05\n\x17\x01Z\n\x17-\x1e!\x80\x82$\x1bIOXp7s\xa4\x02\x02L\x1dCF9\x96vz \x1aNAG\x14#/ \x1c\x1d5|\xd0\xfe\xeb\xfe\xd0\xfe\xe6Հ';RKR/\x13\x0eJ#=\x1e$,\b\x819,\xac+\x15$UCS7'2\x13\x0e\x16\"1\x04\f\x06\x14\n \x1c\x03\x03\x04!\x1b\a\f\x84/\x0e\x0f\n\f,\x18\x14\b\a\x14\x02\r\x04\n\x04\x06\x03\x02\x0f\x0e\x0f\x11\x06\x04\f\x01/\x16--\x1cST\x01(::(\x01\x01\x9bep4\x14\x11AM@\x01\x01=I>\x01\x03\".)xΤ\xfe\xe7\xbfls\xc7\x01\x1c\xa0Y\xa7|qK@\x1d\n\b%\x14(\x18\x1cYQ\x9b&\x1dN\x1b\r\x18EHv~\xab\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00<\x00Z\x00x\x00\x00\x01\x0f\x02\x0e\x01'\x0e\x01#\"&5467&6?\x01\x17\a\x06\x14\x17\x162?\x03\x03\x17\a'&\"\x06\x14\x1f\x03\a/\x02.\x017.\x0154632\x16\x176\x16\x01\x14\x06#\"&'\x06&/\x017\x17\x16264/\x037\x1f\x02\x1e\x01\a\x1e\x01\x03\x14\x06\a\x16\x06\x0f\x01'764&\"\x0f\x03'?\x02>\x01\x17>\x0132\x16\x04.\xa0\x97\x1eA\xadU\x10pIUxYE\x16.A\f\x97\v%%%h%\x1e\x97\xa1\xbe\f\x98\f%hJ%\x1d\x98\xa0\x97\xa1\x97\x1eD,\x1bFZxULs\fT\xab\x03gxUJr\x0eV\xbbD\v\x97\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1d@/\x15Le\x02fL\x1a.C\f\x97\f%Jh%\x1e\x98\xa0\x98\xa1\x98\x1dC\xb8V\vsNUx\x01Ϡ\x98\x1e@.\x15FZyUHp\x10V\xaeA\f\x98\v%h&%%\x1e\x98\xa0\x02\x12\f\x98\f%Ji%\x1d\x98\xa0\x98\xa0\x98\x1eC\xb9W\x0fpIUybJ\x14/\xfb\x95Uy^G\x1c,D\f\x98\f%Jh%\x1e\x98\xa0\x98\xa0\x98\x1e@\xadU\vs\x04\x17Mt\vU\xb7C\f\x98\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1eC-\x1aKfy\x00\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00E\x00X\x00[\x00_\x00g\x00j\x00\x89\x00\xa3\x00\x00\x01\x06&/\x01&'.\x01'\x06\a\x06\a\x0e\x01'67>\x017>\x017&\a\x0e\x02\a\x06\x14\a\x06\a\x06'&'&'>\x0176763>\x017>\x02\x17\x16\a\x14\x0e\x01\a\x06\a\x17\x1e\x01\x17\x1e\x01\x03\x16\a\x06\a\x06#&'&'7\x1e\x0167672\x05\x17'\x01%\x11\x05\x01\x17\x03'\x03\x177\x17\x01\x05\x11\x01\x17\a'\x06\a\x06+\x01\"&'&54632\x1e\x01\x17\x1e\x013267>\x027\x01\x11%\x06\x04#\"'4'\x11676767\x11\x052,\x0132\x15\x11\x02\x8e\x01\x17\x14\x14,+\aD\x04CCQ\x18\x04\x1f\x03\x06L\x15\x81\x0e\x11D\x02\bf\b'\x1e\x02\x02\x01\x05\x1a\x17\x18\x12\n\x04\x01\x06%\v:/d\x02\nB\v\t\x19\x04\x04\x02\x03\x19\x1c\x03\x194@\f}\x05\x04\r\xcf\x03\a\f&\x1e\x1e\x1a\x17\x0e\x04\x01\x03!\x140$\x13\x11\x02\xbe?\x8b\xfb\xf8\x02\xb6\xfdJ\x04\xd9f\xb5d\xd8f-\xd3\xfe.\x02=\xfe\xfa\x9e6(\x82\x92:!TO\xf1?\b\n\b\x04\x1c!\x04I\xadG_\x90U\x0f\x1f%\n\x01\x95\xfc\xfa\x0e\xfd.\a\r\x05\x01\x03\x01\x05\x0fk*\x02.\x02\x01=\x01;\x04\x14\x01\xca\x03\a\b\t\x14\x1d\x055\x02gN_\x0f\x02\x04\x02\x04X\x18\xb6\x1b\x1e\x89\t\x01\"\x02\v\b\x01\x02\x11\x01\n\x05\a\a\x04\x11\x06\x11\x02\x06\x03\x10\x10#\x02#\x04\x03\n\x01\x01\f\x15\x0229\x052Q\x1c\x064\x02\x011\x01\xe0\x0f\r\x17\x0f\f\x03\x17\x0f\x1a\x03\x03\x04\x04\x0e\f\x02\x92\xe3*\xfd\x99\xe8\x04\b\xe9\xfd6\x1f\x02\x91\x1f\xfd\xe8\x1fnA\x03;\xb8\x01|\xfa\x11\r\xa0BS\x19\fN.\a\t\b\v\x0f\x12\x02%1\x1d$\a\x11\x15\x06\x04\x80\xfb\xc9\xf6\x06\xf3\r\x01\x02\x046\t\x01\x06\x05$\x0e\x01\x80\xc6nk\x15\xfe^\x00\f\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00'\x007\x00G\x00W\x00g\x00w\x00\x87\x00\x97\x00\xa7\x00\xb7\x00\xc0\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11463\x05\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x1f\x01\x1e\x01\x15\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x13\x11#\"&=\x01!\x11\x01 B^^B\x80B^^B\x05\xe0:F\x96j\xfc\xa0B^8(\x02\xa0(`\x1c\x98\x1c(\xfd \x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12`\xa0(8\xfd\x80\x04\x80^B\xfb\xc0B^^B\x04@B^\xa3\"vE\xfd\x00j\x96^B\x06\x00(8(\x1c\x98\x1c`(\xfb\x80\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x8e\x01\x008(\xa0\xfe\x00\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01/\x01?\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x05@\x1a&&\x1a\xfb\x00\x1a&&\x1a\x01\xc0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x06\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xb2@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfb\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x02\x00@\xff\x10\x04\xc0\x05`\x00\x1f\x00'\x00\x00\t\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11\x01&4762\x1f\x01!762\x17\x16\x14$\x14\x06\"&462\x04\xa4\xfe\xdcB\\B@B\\B\xfe\xdc\x1c\x1c\x1dO\x1c\xe4\x01p\xe4\x1cP\x1c\x1c\xfe\xa0\x83\xba\x83\x83\xba\x03\xdc\xfe\xdc\xfc\xc8.BB.\x01\x80\xfe\x80.BB.\x038\x01$\x1cP\x1c\x1c\x1c\xe4\xe4\x1c\x1c\x1dO広\x83\xba\x83\x00\x05\x00\x00\xff\x80\x06\x80\x05\x80\x00\x0f\x00\x1d\x003\x00C\x00Q\x00\x00\x01\x14\x0e\x01#\".\x0154>\x0132\x1e\x01\x01\x14\x06#\".\x0154632\x1e\x01\x052\x04\x12\x15\x14\x0e\x02#\"&#\"\x06#\"54>\x02%\".\x0154>\x0132\x1e\x01\x15\x14\x0e\x01%2\x16\x15\x14\x0e\x01#\"&54>\x01\x03\f&X=L|<&X=M{<\xfe\xaaTML\x83FTML\x83F\x01\x8av\x01\x12\xb8\"?B+D\xef?B\xfdJ\xb7p\xa7\xd0\x01H=X&<{M=X&<|\x01dMTF\x83LMTF\x83\x04(\x012\x1e\x01\x02\xc0r_-\x02$\x1a\xc0\x1a$\x02-_rU\x96\xaa\x96U\x03\xf0\x91\xc5%\xfc\xcb\x1a&&\x1a\x035%ő\x80\xf3\x9d\x9d\xf3\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\x1f\x00\x00\x05\x01\x11\x05'-\x01\r\x01\x11\x14\x06\a\x01\x06\"'\x01.\x015\x11467\x0162\x17\x01\x1e\x01\x03\x80\x02\x80\xfd\x80@\x02\xba\xfdF\xfdF\x05\xfa$\x1f\xfd@\x1cB\x1c\xfd@\x1f$.&\x02\xc0\x16,\x16\x02\xc0&.]\x01]\x02|\xe9q\xfe\xfe\xfe\x02\xfd\x00#<\x11\xfe\x80\x10\x10\x01\x80\x11<#\x03\x00(B\x0e\x01\x00\b\b\xff\x00\x0eB\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00B\x00\x00\x05%\x11\x05'-\x01\x05\x01%\x11\x05'-\x01\x05'%\x11\x05'-\x01\x05\x01\x11\x14\x06\a\x05\x06\"'%&'\x06\a\x05\x06\"'%.\x015\x11467%\x11467%62\x17\x05\x1e\x01\x15\x11\x05\x1e\x01\x02\x80\x01\x80\xfe\x80@\x01\x94\xfel\xfel\x05\xd4\x01\x80\xfe\x80@\x01\x94\xfel\xfel,\x01\x80\xfe\x80@\x01\xb9\xfeG\xfeG\x05\xf9&!\xfe@\x19@\x19\xfe@\x04\x03\x02\x05\xfe@\x19@\x19\xfe@!&+#\x01\xb2+#\x01\xc0\x176\x17\x01\xc0#+\x01\xb2$*`\xc0\x01:\xa4p\xad\xad\xad\xfd\x8d\xc0\x01:\xa4p\xad\xad\xadx\xa5\x01\n\xa4p\xbd\xbd\xbd\xfd=\xfe`$>\x10\xe0\x0e\x0e\xe0\x02\x02\x02\x02\xe0\x0e\x0e\xe0\x10>$\x01\xa0&@\x10\xba\x01\x90&@\x10\xc0\n\n\xc0\x10@&\xfep\xba\x10@\x00\x00\x06\x00\x00\xff\xfe\b\x00\x05\x02\x00\x03\x00\t\x00\x1f\x00&\x00.\x00A\x00\x00\x01!\x15!\x03\"\x06\a!&\x032673\x02!\"\x0254\x0032\x1e\x01\x15\x14\a!\x14\x16%!254#!5!2654#!%!2\x1e\x02\x15\x14\a\x1e\x01\x15\x14\x0e\x03#!\a8\xfe\x01\x01\xff\xfcZp\x06\x01\x98\x12\xa6?v\x11\xddd\xfe\xb9\xd6\xfd\x01\x05Ί\xcde\x02\xfdns\xfb6\x01(\xcd\xc7\xfe\xd2\x01\x19N[\xbe\xfe\xfc\xfe\xeb\x02RW\x88u?\xacrt1Sr\x80F\xfd\x9d\x04\xad|\xfe\xd2iZ\xc3\xfd\xb7@7\xfe\xcd\x01\b\xd7\xd0\x01\x13\x88މ\x11\x1eoy2\xa7\xb4\xbeIM\x90\xd7\x1cC~[\xb5R \xa6yK{T:\x1a\x00\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1e\x00%\x00,\x00A\x00G\x00K\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x13!\x11!2654'654.\x02\x03#532\x15\x14\x03#532\x15\x14\x05\"&5!654&#\"\x06\x15\x14\x16327#\x0e\x01\x032\x17#>\x01\x03!\x15!\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\xd3\xfe\x8d\x01~u\xa0\x8fk'JTM\xb0\xa3wa\xb9\xbd|\x02\nDH\x01\x9b\x01\x95\x81\x80\xa4\x9e\x86\xcd>\x8a\vI1q\v\xfe\x04Fj\x01?\xfe\xc1\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfe\x91\xfc\xedsq\x9e*4p9O*\x11\xfe¸Z^\xfe\xb1\xd9qh LE\n\x14\x84\xb1\xac\x82\x87\xa4\xbf\"(\x01nz8B\x01\nM\x00\x00\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x00\x1b\x00'\x00?\x00\x00\x00\x14\x06\"&462\x004&#\"\a\x17\x1e\x01\a\x0e\x01'.\x01'\x1e\x0132\x014&#\"\x06\x15\x14\x163267\x14\x00#\x01\x0e\x01#\"&/\x01\x11\x05632\x17\x016\x0032\x00\x06.\x8fʏ\x8f\xca\xfd\x8d\x92h\x1b\x1bhMA\x1f\x1f\x98L\x15R\x14 vGh\x03г~\u007f\xb3\xb3\u007f~\xb3\x96\xfe\xf5\xbc\xfeK\f\u0084y\xba\x19\xe6\x01\x85O^\r\x16\x01\x1c\x02\x01\v\xbb\xbc\x01\v\x04\x1fʏ\x8fʏ\xfb\xbeВ\x06*\x1f\x97LM@\x1f\b!\b\xfeשw\x03\xc0w\xa9\xf7\x8eȍ\x8dde\x8d\x03)\xa0qrOPq\xfeȦs:0\x14\x14\x183=\x027\x16\x1b\x01'\x0e\x03\x0f\x01\x03.\x01?\x0167'\x01\x03\x0e\x01\x0f\x01\x06\a\x17\x03\x13\x17\x1667\x01\x06\x03%'\x13>\x01\x17\x1e\x05\x01\x13\x16\x06\a\x0e\x05\a&\x03%'7\x03%7.\x03/\x01\x056\x16\x1f\x01\x16\x03D\x0f\x02\xfe\\$>\x10\v\a\x0f\t\"\x02N,\xb4\x93?a0\x1f\x03\x04\xbe\x11\x02\a\b#O\x8c\x06\x80\xbc\f1\x13\x12G\x94\b\xe6\xd3\a\xaa\xe29\xfd'/\xda\xfe\xc3\x13\xe1\x14P(\x181#0\x180\x02\x97\xd4\x12\v\x16\r($=!F\v\"\xe7\x019|\x8e\xdc\xfe]\x97\"RE<\x11\x11\x01\x95\x1f6\f\v'\x01o\xfe\x90\x16\x1d\x039%\x1b8J$\\\a\f\x02:\xfe\x85\\H\x91iT\x15\x15\x01e\x1a<\x11\x12?}V\xfd\xea\xfe\x99\x1d#\x03\x04\a\x05\xa4\x01o\x01j\xad\x10\x16\x16\x03\xb2?\xfe\x8c\xbb\f\x01d\x1f\x1c\x04\x02\x14\x16,\x196\xfe\xc5\xfe\x95%N#\x14\"\x16\x16\n\x12\x03H\x01l\xc3\xedS\xfe\x8b\x14VY\x9a]C\r\r\x01\x03\x1b\x0f\x0f=\x00\x00\x04\x00\x00\xff@\b\x00\x05\x80\x00\a\x00\x11\x00\x19\x00C\x00\x00\x004&\"\x06\x14\x162\x13!\x03.\x01#!\"\x06\a\x004&\"\x06\x14\x162\x13\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x013!2\x16\x17\x1332\x16\x01\xe0^\x84^^\x84\x82\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x05\x03^\x84^^\x84\xfe\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x03\x00b\xa2\x17i\x1c]\x83\x01~\x84^^\x84^\x01\xe0\x01e\b\x13\x13\b\xfd\x19\x84^^\x84^\x01\x00\xfe\x80\x0e\x12\x80PppP\x80\x80PppP\x80\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\u007f^\xfe]\x83\x00\x04\x00\x00\xff\x00\b\x00\x06\x00\x003\x00;\x00E\x00M\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x01;\x015463!2\x16\x1d\x0132\x16\x17\x13\x00264&\"\x06\x14\x01!\x03.\x01#!\"\x06\a\x00264&\"\x06\x14\a ]\x83\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x80\x12\x0e\x01\xc0\x0e\x12\x80b\xa2\x17i\xf9\xfa\x84^^\x84^\x01d\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x04!\x84^^\x84^\x02\x80\x83]\xfe\x80\x0e\x12@PppP@@PppP@\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\xe0\x0e\x12\x12\x0e\xe0\u007f^\xfe]\xfe ^\x84^^\x84\x01\x82\x01e\b\x13\x13\b\xfc\xbb^\x84^^\x84\x00\x01\x00 \xff\x00\x05\xe0\x06\x00\x003\x00\x00$\x14\x06#!\x1e\x01\x15\x14\x06#!\"&5467!\"&47\x01#\"&47\x01#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x01\x16\x14\x06+\x01\x01\x05\xe0&\x1a\xfe2\x01\n$\x19\xfe\xc0\x19$\n\x01\xfe2\x1a&\x13\x01\x92\xe5\x1a&\x13\x01\x92\xc5\x1a&\x13\x01\x80\x134\x13\x01\x80\x13&\x1a\xc5\x01\x92\x13&\x1a\xe5\x01\x92Z4&\x11\x8d&\x19##\x19&\x8d\x11&4\x13\x01\x93&4\x13\x01\x93&4\x13\x01\x80\x13\x13\xfe\x80\x134&\xfem\x134&\xfem\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00+\x00D\x00P\x00\x00\x014'&#\"\a\x06\x15\x14\x16327632\x17\x1632674'&!\"\a\x06\x15\x14\x1632763 \x17\x16326\x134'&$#\"\a\x0e\x01\x15\x14\x16327632\x04\x17\x1632>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x04g\x1e\xc1\xfe\x85\x9a*\x1b\x16\x05 \x84o\xe2\xab\x13\x0e\x13\x1c`#\xed\xfeə\x960#\x19\a\x1ez\x81\x01\x17\xd1\x18\x0e\x19#l(~\xfe\xb2\xb0̠\x17\x1f)\x1f\v\x1d\x85\xae\x9f\x01-g\x15\x13\x1d+\xcd\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01F \x13s\"\t+\x14\x1d\b\x1bg\v\x1b\xec(\x15\x8d*\r3\x19#\b!|\r#\x01\x11/\x17IK/\a%\x1e\x1f*\b%D=\f)[\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x04\x00\x06\x00\x00\x13\x00\x00\t\x01\x17!\x11!\a\x03\a!\x11\x01'!\x11!7\x137!\x04\x00\xfe\xd1\x18\x01\x17\xfe\x05,\x8e\x1e\xfe\xd3\x01/\x18\xfe\xe9\x01\xfb,\x8e\x1e\x01-\x04\xd1\xfd\xba\x1f\xfea\x1e\xfe\xef\x1e\x01/\x02G\x1e\x01\x9f\x1e\x01\x11\x1e\x00\x00\x00\x11\x00\x00\x00\x8c\t\x00\x04t\x00\x0e\x00%\x00/\x00;\x00<\x00H\x00T\x00b\x00c\x00q\x00\u007f\x00\x8d\x00\x90\x00\x9e\x00\xac\x00\xc0\x00\xd4\x00\x00%7\x03.\x01#\"\x06\x15\x03\x17\x1e\x0132%7\x034'&\"\a\x06\x15\a\x03\x14\x17\x15\x14\x17\x1632765\x01\x17\a\x06\"/\x017627\x17\a\x06#\"5'7432\x01\x03\x17\a\x14#\"/\x017632\x1f\x01\a\x06#\"5'7432\x1f\x01\a\x06#\"&5'74632\t\x01\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x06#\"/\x01\x134632\x16\x019\x01\x03\x13\a\x14\x06\"&/\x01\x13462\x16\x17\x13\a\x14\x06\"&/\x01\x13>\x012\x16\x13\a1\x14\x06\"&/\x02\x13567632\x17\x16\x17\x01\x14\x06#!.\x015\x1147632\x00\x17632\x16\x03\x10\x10\x10\x01\r\n\t\x0e\x0e\x0e\x01\r\t\x16\x01*\v\f\r\b\x10\b\r\x01\n\v\x06\t\x0e\v\t\t\xfb\xec\x14\x14\x02\x0e\x02\x11\x11\x02\x0eX\x1a\x1a\x02\b\t\x17\x17\t\b\x01\x1a\xbc\x19\x19\v\n\x02\x15\x15\x02\n\v^\x17\x17\x02\f\r\x15\x15\r\f`\x15\x15\x02\x0e\x06\t\x14\x14\t\x06\x0e\x01\x81\xfe\xdf\x15\x15\n\a\x10\x02\x12\x12\x02\x10\a\n^\x13\x13\v\b\x12\x02\x10\x10\x02\x12\b\vb\x12\x12\x02\x14\x13\x02\x10\x10\r\b\t\f\x01\x89\xc6\x0f\x0f\x0f\x14\x0e\x01\x0e\x0e\x0f\x14\x0fc\x0e\x0e\x10\x16\x10\x01\f\f\x01\x10\x16\x0f\xd5\x0e\x12\x1a\x12\x01\x06\x06\f\x02\n\t\v\b\a\x0e\x02\x04f\xa6u\xfc\xee\r\x12\x1cU`\xc3\x01\x1e\x1159u\xa6\xa4\xf1\x02\v\n\x0e\x0e\n\xfd\xf5\xf1\n\r4\xd3\x02J\x10\b\x05\x05\b\x10\x06\xfd\xbd\x01\xeb\x01\n\a\v\t\a\r\x01l\x80~\t\t~\x80\tF\xcf\xcb\t\n\xca\xcf\t\xfe2\x01\xeb\xf5\xed\v\v\xed\xf5\f\x05\xfc\xf4\r\r\xf4\xfc\r\x1f\xea\xf6\x10\t\a\xf6\xea\x06\t\xfe\x16\x02m\xfe\x84\xf6\a\v\x12\xf6\x01|\x12\vO\xfe,\xf4\b\v\x13\xf4\x01\xd4\x13\v \xfe\x06\xf2\x15\x15\xf2\x01\xfa\t\r\r\xfd\x11\x02\xea\xfe\x02\xef\n\x0f\x0e\v\xef\x01\xfe\v\x0e\x0e\x1e\xfe\x14\xec\v\x10\x10\v\xec\x01\xec\f\x10\x10\xfe\b\xe7\r\x12\x12\rru\x02|\x03\x0f\t\a\x05\b\x12\xfd\x94u\xa5\x02\x12\r\x03\x83\x17\n\"\xfe\xf9\xc0\x16\xa6\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\r\x00\x1b\x00)\x009\x00\x00\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 \x04\x16\x1d\x01\x14\x06\x04 $&=\x0146\x02\x13\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\xb9\x01\xa0\x01b\xce\xce\xfe\x9e\xfe`\xfe\x9e\xce\xce\x03\x00VT\xaaEvEEvE\xaaT\xfc\xaaVT\xaaEvEEvE\xaaT\x01*VT\xaaEvEEvE\xaaT\x04*EvE\x80EvEEvE\x80Ev\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00^\x00c\x00t\x00\u007f\x00\x87\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x17632\x17\x16\a\x14\x06\a\x15\x06#\"&'\x06\a\x02#\"/\x01&'&7>\x0176\x17\x16\x156767.\x0176;\x022\x17\x16\a\x06\a\x16\x1d\x01\x06\a\x16\x0167\x0e\x01\x01\x06\x17674767&5&5&'\x14\a\x0367.\x01'&'\x06\a\x06\x05&#\x163274\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\xfe!3;:\x93\x1e\x10\x0e\x02\x01\x06A0\x86?ݫ\x99Y\x0f\r\x18\x01\x05\n\x04\t^U\x0e\t\x0247D$\x18\r\r\v\x1f\x15\x01\x17\f\x12\t\x02\x02\x01\x02\f7\xfe\x1b4U3I\x01\x81\x0f\r\x01\x06\a\x01\x03\x01\x01\x01\f\x01|\x87\x95\x02\x16\x05L3\x1b8\x1e\x02w\x18tL0\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x02Q\x1a\x1e\a1\x16\x1e\x01\x02\x01\x01&(!\x18;\xfe\xfa\a\f\x01\x04\n\x1a(g-\t\x0f\x02\x02Up\x88~R\x9b2(\x0f\x15/\x06\x02\x03\x05\x1e{E\xa4\xfe\x1b\x18\x86(X\x03z*Z\a%\x03(\x04\x04\x01\x01\x02\x01\x16\x0e\x01\x01\xfdi6\x1b\x01\x11\x05CmVo8\v\x18\x1c\x01\x01\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00T\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x13\x153\x133\x1367653\x17\x1e\x01\x17\x133\x1335!\x153\x03\x06\x0f\x01#4.\x015.\x01'\x03#\x03\x0e\x01\x0f\x01#'&'\x0335\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00iF\xa4\x9f\x80\a\x03\x02\x04\x03\x01\x05\x03\x80\x9f\xa4F\xfe\xd4Zc\x05\x02\x02\x04\x01\x02\x01\x06\x02\x90r\x90\x02\x05\x01\x04\x04\x02\x02\x05cZ\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80k\xfdk\x01\xe5\x14\x1a\x10\b\x18\x03\"\t\xfe\x1b\x02\x95kk\xfeJ\x14\x1a\x15\x03\a\t\x02\x05 \t\x02!\xfd\xdf\t\x1f\x06\x15\x15\x1a\x14\x01\xb6k\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#7>\x02;\x01\x16\x17\x1e\x02\x1f\x01#\x15!5#\x03\x1335!\x153\a\x0e\x01\x0f\x01#&'&/\x0135!\x153\x13\x03\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01-\x01\x19Kg\x05\n\x05\x01\x02\x01\x04\x02\x05\a\x03kL\x01#D\xc0\xc3C\xfe\xe9Jg\x04\f\x03\x02\x02\x01\x04\x06\vjL\xfe\xdeD\xbd\xc2\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa1\a\x13\b\x04\x06\x04\a\t\x04\xa1jj\x01\x11\x01\x1akk\x9f\a\x13\x04\x03\x04\x06\v\f\x9fkk\xfe\xf0\xfe\xe5\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x008\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#5327>\x0154&'&#!\x153\x11\x01#\x1132\x17\x16\x15\x14\a\x06\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01 \x01G]\x89L*COJ?0R\xfe\x90\\\x01\x05wx4\x1f8>\x1f\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa7\x0f\x17\x80RQx\x1b\x13k\xfd\xd5\x01\x18\x01\f\x12!RY\x1f\x0f\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00*\x002\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x11!57\x17\x01\x04\"&462\x16\x14\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x80\xfc\x00\xc0\x80\x01\x80\xfeP\xa0pp\xa0p\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x01\xc0\xfe\xc0\xc0\xc0\x80\x01\x80\x80p\xa0pp\xa0\x00\x00\t\x00\x00\xff\x00\x06\x00\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00#\x00*\x007\x00J\x00R\x00\x00\x015#\x15\x055#\x1d\x015#\x15\x055#\x15\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11#\x15#5!\x11\x01\x13\x16\x15\x14\x06\"&5476\x1353\x1532\x16\x02264&\"\x06\x14\x02\x80\x80\x01\x00\x80\x80\x01\x00\x80\x03<\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\x80\x80\xfe\x00\x02\x8dk\b\x91ޑ\b\x15c\x80O\x16\"\xbcjKKjK\x04\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\x80\x80\xfa\x00\x02\xd1\xfe\xa3\x1b\x19SmmS\x19\x1b?\x01M\x80\x80\x1a\xfe\x1a&4&&4\x00\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x009\x00L\x00^\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x15\x11\x14\a\x06#\"/\x01#\"&=\x0146;\x0176\x01276\x10'.\x01\a\x0e\x01\x17\x16\x10\a\x06\x16\x17\x16'2764'.\x01\x0e\x01\x17\x16\x14\a\x06\x16\x17\x16\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\xec\x14\x14\b\x04\f\v\xa6\x83\x0e\x12\x12\x0e\x83\xa6\x10\x01\xb4\x1f\x13\x81\x81\x106\x14\x15\x05\x11dd\x11\x05\x15\x12\xbd\x1b\x14WW\x126&\x02\x1344\x13\x02\x13\x14\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03.\b\x16\xfd\xe0\x16\b\x02\t\xa7\x12\x0e\xc0\x0e\x12\xa7\x0f\xfdG\x18\x9f\x01\x98\x9f\x15\x06\x11\x115\x15{\xfe\xc2{\x155\x10\x0f\x94\x14]\xfc]\x13\x02$5\x149\x949\x145\x12\x11\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x16\x15\x11\x14\a\x06#\"'\x015\x01632\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\x804LL4\xfe\x804LL4\x03l\x14\x14\b\x04\x0e\t\xfe\xf7\x01\t\t\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80L4\xfe\x804LL4\x01\x804L\x02\b\x16\xfd\xc0\x16\b\x02\t\x01\nZ\x01\n\t\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x007\x00K\x00[\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01>\x01\x1f\x01\x1e\x01\x0f\x01\x17\x16\x06\x0f\x01\x06&'\x03&7!\x16\a\x03\x0e\x01/\x01.\x01?\x01'&6?\x016\x16\x17\x01.\x017\x13>\x01\x1f\x01\x1e\x01\a\x03\x0e\x01'\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01`\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xe2\x0e\x0e\x04\x04\x0e\x0e\xe2\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xfev\r\x0f\x02\x8a\x02\x16\r?\r\x0f\x02\x8a\x02\x16\r\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\x01-\x13\x13\x13\x13\xfe\xd3\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\xfd\x06\x02\x16\r\x03?\r\x0f\x02\n\x02\x16\r\xfc\xc1\r\x0f\x02\x00\x01\x00'\xff\x97\x05\xd9\x06\x00\x006\x00\x00\x01\x15\x06#\x06\x02\x06\a\x06'.\x04\n\x01'!\x16\x1a\x01\x16\x1767&\x0254632\x16\x15\x14\a\x0e\x01\".\x01'654&#\"\x06\x15\x14\x1632\x05\xd9eaAɢ/PR\x1cAids`W\x1b\x01\x1b\x1aXyzO\xa9v\x8e\xa2д\xb2\xbe:\a\x19C;A\x12\x1f:25@Ң>\x02\xc5\xc6\x17\x88\xfe\xf2\xa1\x1a-0\x115r\x8f\xe1\x01\a\x01n\xcf\xda\xfe\x97\xfe\xef\xc6`\xa9\xedH\x01(\xb9\xc0\xf5\xd3\xc0\x9f\u007f\x01\x04\f' gQWZc[\xba\xd7\x00\x00\b\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x06\x00\n\x00\x0e\x00\x12\x00\x15\x00\x19\x00-\x00\x00\x13\x01\x11%\x057'\t\x01%\x05'-\x01\x05'%\x11\t\x01\x17\x11\x05%\x01\x11\x05\x11\x14\a\x01\x06\"'\x01&5\x1147\x0162\x17\x01\x16\xd8\x02[\xfe\xb2\xfe\xb5\xc1\xc1\x033\x02[\xfe\xf3\xfe\xb2M\x01\x10\xfe\xf0\xfe\xf0\x8b\x01N\xfd\xa5\x04\xcd\xc1\xfe\xb5\x01\r\xfd\xa5\x033\"\xfc\xcd\x15,\x15\xfc\xcd\"\"\x033\x15,\x15\x033\"\x01o\xfen\x01g\xdf$\x81\x81\xfc\xdc\x01\x92\xb4߆\xb6\xb6\xb6]\xdf\x01g\xfen\xfe\xef\x81\x01\x02$\xb4\x01\x92\xfe\x99+\xfd\xde)\x17\xfd\xde\r\r\x02\"\x17)\x02\")\x17\x02\"\r\r\xfd\xde\x17\x00\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05x\x00#\x00W\x00\x00\x01\x1e\x01\x15\x14\x06#\"&#!+\x02.\x015467&54632\x176$32\x04\x12\x15\x14\x06\x01\x14\x16327.\x01'\x06#\"&54632\x1e\x0532654&#\"\a\x17632\x16\x15\x14\x06#\".\x05#\"\x06\a\bo\x89\xec\xa7\x04\x0f\x03\xfbG\x01\x02\x05\xaa\xecn\\\f\xa4u_MK\x01'\xb3\xa6\x01\x18\xa3\x01\xfą|\x89g\x10?\fCM7MM5,QAAIQqAy\xa7\xa8{\x8fb]BL4PJ9+OABIRo?z\xaa\x02\xfc.\xc7z\xa4\xe9\x01\n\xe7\xa5n\xba6'+s\xa2:\x9a\xbc\xa1\xfe\xec\xa3\x06\x18\xfe\xf0z\x8ec\x14I\x0eAC65D*DRRD*\x8fwy\x8eal@B39E*DRRD*\x8d\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00\x00\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \a\x1762\x177\x017&47'\x06\x10\x00 7'\x06\"'\a\x12 6\x10& \x06\x10\x05\x176\x10'\a\x16\x14\x02\xca\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x02\xc0\xfe\x84\xab\xc2R\xaaR\xc2\xfb\xf1\xc2\x1c\x1c\xc2Z\x02B\x01|\xab\xc2R\xaaR\xc2\xca\x01>\xe1\xe1\xfe\xc2\xe1\x03d\xc2ZZ\xc2\x1c\x06\x00\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x0eZ\xc2\x1c\x1c\xc2\xfb\xf1\xc2R\xaaR«\xfe\x84\xfd\xbeZ\xc2\x1c\x1c\xc2\x01&\xe1\x01>\xe1\xe1\xfe\xc2\b«\x01|\xab\xc2R\xaa\x00\x01\x00 \xff \x06\xe0\x05\xd7\x00!\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x12$7\x15\x06\x00\x15\x14\x1e\x02 >\x0254\x00'5\x16\x04\x12\x06\xe0\x89\xe7\xfe\xc0\xfe\xa0\xfe\xc0\xe7\x89\xc2\x01P\xce\xdd\xfe\xddf\xab\xed\x01\x04\xed\xabf\xfe\xdd\xdd\xce\x01P\xc2\x02\x80\xb0\xfe\xc0牉\xe7\x01@\xb0\xd5\x01s\xf0\x1f\xe4-\xfe\xa0\xe6\x82\xed\xabff\xab\xed\x82\xe6\x01`-\xe4\x1f\xf0\xfe\x8d\x00\x00\x01\x00\x13\xff\x00\x06\xee\x06\x00\x00c\x00\x00\x136\x12721\x14\a\x0e\x04\x1e\x01\x17\x1e\x01>\x01?\x01>\x01.\x01/\x01.\x03/\x017\x1e\x01\x1f\x016&/\x017\x17\x0e\x01\x0f\x01>\x01?\x01\x17\x0e\x01\x0f\x01\x0e\x01\x16\x17\x1e\x01>\x01?\x01>\x02.\x04/\x01&3\x161\x1e\b\x17\x12\x02\x04#\"$&\x02\x13\b\xd8\xc5\x05\x01\b(@8!\x05IH2hM>\x10\x10'\x1c\x0f\x1b\r\x0e\n)-*\x0e\rh'N\x14\x13\x01'\x15\x14\xa1\xa0!'\x03\x04\x16O\x1c\x1cg,R\x13\x13\x1f\"\x14/!YQG\x16\x15\x0154'6\x133&5\x1147#\x16\x15\x11\x14\x055\x06#\"=\x0132\x1635#47#\x16\x1d\x01#\x15632\x163\x15#\x15\x14\x1e\x0332\x014&\"\x06\x15\x14\x1626%\x11\x14\x06#!\"&5\x11463!2\x16\x02F]kbf$JMM$&\xa6N92Z2\x1d\b\x02\a\x18\x06\x15&`\x06\xe3\x06\xab\x0f9\x0eUW=\xfd\xf0N9:PO;:\x16dhe\x03\\=R\x91\x87\x01\xcd\xca\f\n+)\u007f\xb3\x17\b&'\x1f)\x17\x15\x1e-S9\xfe\xd0\x199kJ\xa5<\x04)Um\x1c\x04\x18\xa9Q\x8b\xb9/\xfc\xbe-Y\x02a^\"![\xfd\x9bY\xb1\xc4'(<`X;\x01_\x04\x02\x06\xbeL6#)|\xbe\x04\xfe\x93\x83\x04\x0etWW:;X\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02שw\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x03\x8a\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x009\xff\x00\x04\xc7\x06\x00\x00\x1d\x00I\x00\x00\x00\x14\x06#\"'\x06\a\x02\x13\x16\x06\a#\"&'&>\x03767&5462\x04\x10\x02\x04#\"'.\x017>\x01\x17\x1632>\x024.\x02\"\x0e\x02\x15\x14\x17\x16\x0e\x01&'&54>\x0232\x04\x03JrO<3>5\xf7-\x01\x1b\x15\x05\x14\x1e\x02\x0e\x15&FD(=G\x10q\xa0\x01\xee\x9c\xfe\xf3\x9e@C\x15\x17\x05\x05$\x1539a\xb2\x80LL\x80\xb2²\x80L4\n\r&)\n@]\x9c\xd8v\x9e\x01\r\x04\x14\xa0q#CO\xfe\x8d\xfe\x18\x16!\x02\x1b\x14~\U000ffd42\x0172765'.\x01/\x01\"\a\x0e\x01\a#\"&'&5\x10\x01\x0e\b\x16\r\x01\x11\x0e\xb9}\x8b\xb9\x85\x851R<2\"\x1f\x14\f\x017\x12\x03\x04MW'$\t\x15\x11\x15\v\x10\x01\x01\x02\x05;I\x14S7\b\x02\x04\x05@\xee5sQ@\x0f\b\x0e@\b)\xadR#DvTA\x14\x1f\v;\x14\x04\n\x02\x020x\r\x05\x04\b\x12I)\x01\x04\x04\x03\x17\x02\xda\x13!\x14:\x10\x16>\f\x8b\x01+\x03\x14)C\x04\t\x016.\x01\x13\x00\x00\x00\x00\x06\x00\x00\xff>\b\x00\x05\xc2\x00\n\x00\x16\x00!\x00-\x00I\x00[\x00\x00\x004&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x024&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x01&#\"\x04\x02\x15\x14\x17\x06#\".\x03'\a7$\x114\x12$32\x04\x16\x01\x14\x06\a\x17'\x06#\"$&\x106$32\x04\x16\x02D2)+BB+)\x03\x193(\x1b--\x1b(3\xec1)+BB+)\x02\xac4'\x1b--\x1b'4\xfe\xf6\x1f'\xa9\xfe\xe4\xa3\x17#!\x1a0>\x1bR\t\xfdH\xfe\xde\xc3\x01MŰ\x019\xd3\x02o\x89u7ǖD\xa9\xfe䣣\x01\x1c\xa9\xa1\x01\x1c\xab\x04\nR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xefR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xaa\x04\x9a\xfe\xf9\x9cNJ\x03\x03\n\x04\x11\x02\u007f\xda\xcb\x01\x1f\xa9\x01\x1c\xa3\x84\xe9\xfd?u\xd5W\xb5m%\x8d\xf2\x01\x1e\xf2\x8d\x8d\xf3\x00\x01\x00\x00\xff\x00\x06\xff\x06\x00\x00\x1e\x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x03\x06#\"'.\x015\x11\t\x01%&'&7\x01632\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfe;\xf2\x12\x1f\r\t\x13\x17\x03`\xfb\xd3\xfeu%\x03\x02\"\x06\x80\x0f\x11\x14\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xb9\xfe\xd9\x17\x04\a!\x14\x01]\x04#\xfcc\xa2\x0e)(\x13\x03\xc0\t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\xff\x05\xf7\x00\x1a\x00 \x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x01\x06#\"'.\x015\x11%&'&7\x016\x01\x13\x01\x05\t\x01\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfd\xf1\xfe\xd6\x12\x1d\x0e\t\x13\x16\xfe(%\x03\x03#\x06\x80#\xfe\xcb\xdd\xfaf\x01P\x03_\xfe\"\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xd7\xfe\xb9\x15\x04\a!\x14\x01\xc4\xc1\x0e)'\x14\x03\xc0\x15\xfa\x0e\x05+\xfcʼn\x02\u007f\xfc\xe3\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00I\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x05\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\xfd\xfa\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eozΘ\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x00 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x82\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x05\x00f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00>\xff\x80\x06\xc2\x05\x80\x00\x85\x00\x00\x05\"&#\"\x06#\"&54>\x02765\x034'&#!\"\a\x06\x15\x03\x14\x17\x1e\x03\x15\x14\x06#\"&#\"\x06#\"&54>\x02765'\x1146.\x04'.\x01\"&54632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x163!2765\x134'.\x0254632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x1e\x03\x15\x14\x06\x06\x92,\xb1-,\xb0,\x18\x1a\",:\x10!\x01\x01\r%\xfd]&\r\x01\x01%\x10@2(\x19\x18/\xb9.+\xaa*\x17\x19\x1f)6\x0f!\x01\x01\x01\x02\x05\b\x0e\t\x0f<.$\x18\x18.\xb9.*\xa9*\x19\x19\"+8\x0f#\x01\x01\r\x1a\x02\xbb\x19\r\x01\x01#\x12Q3\x19\x19,\xb0,+\xac+\x19\x19#-:\x0f#\x01\"\x10\x19$$\x19\x01\xf0\f/:yu\x8e\xa6xv)%$\x00\t\x00\x00\xff\x80\x06\x00\x05\x00\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00/\x00?\x00C\x00G\x00\x00%\x15!5%2\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15!5\x13\x15#5\x01\x15!5\x032\x16\x15\x11\x14\x06#!\"&5\x11463\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x15#5\x13\x15!5\x01`\xfe\xa0\x02\xc0\x1a&&\x1a\xff\x00\x1a&&\x1a\x01\xa0\xfc\xa0\xe0\xe0\x06\x00\xfd \xe0\x1a&&\x1a\xff\x00\x1a&&\x1a\x03\x80\x1a&&\x1a\xff\x00\x1a&&\x1a\x02@\xe0\xe0\xfc\xa0\x80\x80\x80\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x01\x80\x80\x80\x02\x00\x80\x80\xfc\x00\x80\x80\x04\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xfe\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x80\x80\x80\x02\x00\x80\x80\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x00\x00\x012\x16\x10\x06 &547%\x06#\"&\x10632\x17%&546 \x16\x10\x06#\"'\x05\x16\x14\a\x056\x04\xc0\x85\xbb\xbb\xfe\xf6\xbb\x02\xfe\x98\\~\x85\xbb\xbb\x85~\\\x01h\x02\xbb\x01\n\xbb\xbb\x85~\\\xfe\x98\x02\x02\x01h\\\x02\x00\xbb\xfe\xf6\xbb\xbb\x85\f\x16\xb4V\xbb\x01\n\xbbV\xb4\x16\f\x85\xbb\xbb\xfe\xf6\xbbV\xb4\x16\x18\x16\xb4V\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00$4&#\"\a'64'7\x163264&\"\x06\x15\x14\x17\a&#\"\x06\x14\x16327\x17\x06\x15\x14\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00}XT=\xf1\x02\x02\xf1=TX}}\xb0~\x02\xf1>SX}}XS>\xf1\x02~\xb0\x01}\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfd\xb0~:x\x10\x0e\x10x:~\xb0}}X\a\x10x9}\xb0}9x\x10\aX}\x03\xe0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\a\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00/\x00>\x00L\x00X\x00d\x00s\x00\x00\x00.\x01\a\x0e\x01\a\x06\x16\x17\x16327>\x0176\x01\x17\a\x17\x16\x14\x0f\x01\x16\x15\x14\x02\x06\x04 $&\x02\x10\x126$32\x17762\x1f\x01\x13\x06#\"/\x01&4762\x1f\x01\x16\x14\x17\x06\"/\x01&4762\x1f\x01\x16\x146\x14\x06+\x01\"&46;\x012'\x15\x14\x06\"&=\x01462\x16\x17\a\x06#\"'&4?\x0162\x17\x16\x14\x02E\x140\x19l\xa6,\n\x14\x19\r\v*\x12\"\x81T\x19\x03\xb8.\xf4D\x13\x13@Yo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x8f\xb6\xa1@\x135\x13D\xfb\n\f\r\n[\t\t\n\x1a\nZ\n\xdc\v\x18\vZ\n\n\t\x1b\t[\t \x12\x0e`\x0e\x12\x12\x0e`\x0e\xae\x12\x1c\x12\x12\x1c\x12\x97[\n\f\r\n\n\nZ\n\x1a\n\t\x03\x9a2\x14\n,\xa6l\x190\n\x05(T\x81\"\v\x01\xad.\xf3D\x135\x13@\xa1\xb6\x8f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoY@\x13\x13D\x01,\n\nZ\n\x1a\n\t\t[\t\x1b\xef\t\t[\t\x1b\t\n\nZ\n\x1a\xbb\x1c\x12\x12\x1c\x12\xa0`\x0e\x12\x12\x0e`\x0e\x12\x12EZ\n\n\t\x1b\t[\t\t\n\x1a\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x04\x00\x14\x005\x00\x00\x01%\x05\x03!\x02 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x016=\x01\a'\x13\x17&'\x17\x05%7\x06\a7\x13\a'\x15\x14\x177\x05\x13\a\x1627'\x13%\x02a\x01\x1f\x01\x1fm\xfe\x9d\x05\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x04m\x95f\xf0?\x86\x96\xef5\xfe\xe1\xfe\xe15\uf587>\xf0f\x95\x1e\x01F\x8btu\xf6ut\x8b\x01F\x02\xd0\xd0\xd0\xfe\xb0\x04\x80\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xfbH\xcb\xfb\x03Y\xe0\x01C\f\xceL|\x9f\x9f|L\xce\f\xfe\xbd\xe0Y\x03\xfb˄(\xfe\xd6E''E\x01*(\x00\x00\x00\f\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00I\x00Y\x00i\x00y\x00\x89\x00\xa2\x00\xb2\x00\xbc\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\"&=\x01!\x15\x14\x06#\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15!54\x05\x04\x1d\x01!54>\x04$ \x04\x1e\x04\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06#!\"&=\x01\x01\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xfd\xc2\x1c&\x02\x02&\x1b\x02\xff\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\xfd\xfe\xfe\x82\xfe\x82\xfd\xfe\x113P\x8d\xb3\x01\r\x01>\x01\f\xb4\x8dP3\x11\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12&\x1b\xfe\x80\x1b&\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x92&\x1b\x81\x81\x1b&\xfd\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8a\r\nh\x02\x01e\n\r\x114LKM:%%:MKL4\xfeW\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01T\x81\x1b&&\x1b\x81\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x14\x00%\x00/\x009\x00\x00\x01\x11\x14\x06#\x11\x14\x06#!\"&5\x11\x1363!\x11!\x11\x01\x11\x14\x06#!\"&5\x11\"&5\x11!2\x17\x01\x15!5463!2\x16\x05\x15!5463!2\x16\x02\xc0&\x1a&\x1a\xfe\x00\x1a&\xf9\a\x18\x02\xe8\xff\x00\x04\x00&\x1a\xfe\x00\x1a&\x1a&\x01\xa8\x18\a\xfc\xd9\xfe\xa0\x12\x0e\x01 \x0e\x12\x02\xa0\xfe\xa0\x12\x0e\x01 \x0e\x12\x04\xc0\xfd\x00\x1a&\xfd\xc0\x1a&&\x1a\x02\x00\x03i\x17\xfd@\x02\xc0\xfc\x80\xfe\x00\x1a&&\x1a\x02@&\x1a\x03\x00\x17\x017\xe0\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00\x00\x01\x16\x14\a\x01\x17\a\x06\x04'\x01#5\x01&\x12?\x01\x17\x0162\x16\x14\a\x01\x17\x0162\x06\xdb%%\xfeo\x96\xa0\xa3\xfe;\xb9\xfe\x96\xb5\x01j|/\xa3\xa0\x96\x01\x90&jJ%\xfep\xea\x01\x91&j\x04;&i&\xfep\x96\xa0\xa3/|\xfe\x96\xb5\x01j\xb9\x01ţ\xa0\x96\x01\x91%Jk%\xfeo\xea\x01\x90%\x00\x00\x00\x04\x00\x19\xff\f\x06\xe7\x06\x00\x00\t\x00\x15\x00:\x00g\x00\x00\x01\x14\x06\"&5462\x16\x05\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x1e\x052636\x17\x16\x17\x16\x176\x172\x1e\x02>\x057\x06\a\x12\a\x06\a\x06'&7\x035.\x01'\x03\x16\a\x06'&'&\x13&'&6\x17\x1e\x01\x17\x11463!2\x16\x15\x1176\x16\x03i\u007f\xb2\u007f\u007f\xb2\u007f\x01\xf6~ZY\u007f\u007fYZ~\xe1@O\xfb\xa8S;+[G[3Y\x1cU\x02D\x1b\x06\x04\x1a#\ao\x05?\x17D&G3I=J\xc6y\xfbTkBuhNV\x04\x01\b!\a\x01\x04WOhuAiS\xfby\x19*'\x04\x0f\x03^C\x04\xe9C^\x15'*\x03\x1cSwwSTvvTSwwSTvv\xfe\xf8\x02\x9bWID\\\xfd_\x17\"\x16\x0f\a\x01\x04\x01\x1c\x06\x03\x19\x1a[\x04\x03\x01\x01\x03\x06\v\x10\x17\x1f\x18\x95g\xfe\xe3\xb4q# /3q\x01F\x01\x02\b\x01\xfe\xaer2/ $r\xb4\x01\x1bg\x95%4\x1b\x02\n\x03\x02\xb6HffH\xfdJ\x0f\x1b4\x00\x00\x04\x00d\xff\x80\x06\x9c\x06\x00\x00\x03\x00\a\x00\x0f\x00\x19\x00\x00\x01\x11#\x11!\x11#\x11\x137\x11!\x11!\x157\x01\x11\x01!\a#5!\x11\x13\x03\x80\x91\x02\x1f\x91\x91\xfd\xfbV\x01F\xd9\x03\x1c\xfeN\xfe\xba\xd9\xd9\xferm\x04N\xfeN\x01\xb2\xfeN\x01\xb2\xfd\b\xfe\x03\x1b\xfb\xe7\xd9\xd9\x04\xaa\xfc\v\xfeN\xd9\xd9\x04\x86\x01!\x00\x00\x00\x00\x05\x00Y\xff\x01\x05\xaa\x05\xfd\x00\x16\x00+\x00?\x00N\x00e\x00\x00%\x15\x02\a\x06\a\x06&'&'&7>\x01727>\x01\x17\x1e\x01'\x06\x0f\x01\x04#&'&'&>\x01\x172\x17\x16\x1f\x01\x1e\x01\x01\x0e\x01\a\x06'&\x03'&676\x17\x16\x17\x1e\x01\x17\x16\x01\x16\a\x06'\x01&76$\x17\x16\x17\x16\x12\x05\x16\a\x06\x05\x06\a7\x06&'&767>\x0176\x17\x1e\x01\x17\x03\x05\x01\x05\f'6\xff#\r\x04\x01\x05\x04<\x97\x01;\x0f1\x19\x18\x1b\x96\x031x\xfe\xed\x11#\x13\f\x05\b\x12*#\r\xbdG,T\x17\x19\x039\a\xa93%\x1a\x0e\xaa/\x0e\x05\x11#0\x01v\xcbN\b\x1c\xfdZ\x05;:8\xfe\x86\b\x1b)\x01M:(\t\x03&\x02\x9b\x03\x1d\x0f\xfe\xc6C\x18\x01\x17.\x0e\x1e\x1e\x01J}2\t\x1c%0\x96\x06\xd9\u007f\xfe\xdc\r \b\t^*\x0f\x15\f\x0e\nJ\xb3F\x13\v\t\n&\xe47\x0f'X\x02\"\x192L\xb5D\x02M\x1d\x12\"\t+\xfe\xbc6\xd6\x14\x0e\x15\n\x01\x15M\x152\x15+\x11\x01'B\x1b\a\x16\x02Qf\x14\x11X\x02V#\x1b+]\x0f\n#\x12\xfd\xc1\xc8'\x14\nL\x0f\b\x02\x06\x14\x16/(\x01e\xabB\x06\x13\x11\x17\xdd9\x00\x00\x00\n\x00\x00\x00\x00\b\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00#\x00,\x008\x00\x00\x01!\x11!\x13\x15!5\x01\x11!\x11\x01\x15!5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x11#\x11\x14\x1626%\x11!\x11\x14\a!26\x13\x11\x14\x06#!\"&5\x11!5\x04\x00\xfe\x80\x01\x80\x80\xfd\x80\x02\x80\xfd\x80\x05\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\xfc\x00\x80&4&\x06\x80\xfa\x00\v\x05\xcb\x1a&\x80pP\xf9\x80Pp\x01\x00\x04\x00\xfe\x80\xff\x00\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\xfc@\x03\xc0\xfc@\x1a&&\x1a\x04@\xfb\xc0!\x1f&\x04\xda\xfb@PppP\x04@\x80\x00\x04\x00*\x00\r\a\xd6\x05\x80\x00\t\x00\x1f\x009\x00Q\x00\x00$\"&5462\x16\x15\x147\".\x01\"\x0e\x01#\"&547>\x012\x16\x17\x16\x15\x14\x06\x01\"'.\x01#\"\x0e\x03#\"&5476$ \x04\x17\x16\x15\x14\x06\x13\"'&$ \x04\a\x06#\"&5476$ \x04\x17\x16\x15\x14\x06\x04\x14(\x92}R}h\x02L\u007f\x82\u007fK\x03\x12\x97\nN\xec\xe6\xecN\n\x97\x00\xff\v\f\x88\xe8\x98U\xab\u007fd:\x02\x11\x96\n\x84\x01x\x01\x80\x01x\x84\n\x96\xfe\v\v\xb3\xfe\u007f\xfe8\xfe\u007f\xb3\v\v\x11\x97\n\xbb\x02\x04\x02\x1a\x02\x04\xbb\n\x97\r\x93\x14 ,, \x14|2222\x96\x12\r\nMXXM\n\r\x12\x96\x01\x10\bic,>>,\x96\x12\f\n\x84\x92\x92\x84\n\f\x12\x96\x01\x0f\t\x9d\x9f\x9f\x9d\t\x96\x12\r\n\xba\xcc̺\n\r\x12\x96\x00\x00\r\x00\x00\xff\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00?\x00K\x00S\x00c\x00k\x00{\x00\x00\x044&\"\x06\x14\x162$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x114&\"\x06\x15\x11\x14\x1626\x004&\"\x06\x14\x162\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x104&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80KjKKj\x01\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\x03KLhLLhL\xfe\x80KjKKj\x01\xcb&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&KjKKj\xcbL4\xfa\x804LL4\x05\x804L5jKKjKKjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\xfd\x80\x01\x804LL4\xfe\x804LL\x02\xffjKKjK\x01\xc0\x01\x00\x1a&&\x1a\xff\x00\x1a&&\xfe\xa5jKKjK\x03\x00\xfa\x004LL4\x06\x004LL\x00\x02\x00\t\xff\x00\x05\xef\x06\x00\x00'\x00E\x00\x00\x01\x16\a\x02!#\"\x06\x0f\x01\x03\a\x0e\x01+\x01\"&7>\x0376;\x01\x167676767>\x01\x16\x17\x16'\x14\a\x06\a\x06\a\x14#'\"\a\x06\x03\x06#!\"&7\x13>\x013!2\x16\x17\x1e\x01\x05\xef\x12\x16W\xfe\",\x19&\x05\x047\x02\x05'\x19\xfb\x15\x18\x03\t#\x12$\t\x05&\x83\x85g\xafpf5\x18\v\x01\x03\x04\x04O\x99.P\xdeq\x8bZZd\x12\x02S\x01\v\xfe\xd9\x16\x1d\x03\xe8\x05-\x1d\x02V\"\u007f0kq\x03zTx\xfeD!\x1a\x13\xfe\xa6\x0f\x1a!\x1e\x158\xe0p\xdf8%\x02\x17'i_\x97F?\x06\x03\x01\x03;\xb3k\x81\xe9R(\x02\x01\x01`\b\xfd\xf6\n!\x16\x05\xbf\x1d&\x1a\x13)\xa4\x00\x00\x04\x00'\xff\x00\a\x00\x06\x00\x00\n\x00\x12\x00\x19\x00(\x00\x00\x012\x17\x00\x13!\x02\x03&63\x01\x06\a\x02\x0367\x12\x13\x12\x00\x13!\x02\t\x01\x10\x03\x02\x01\x02\x03&63!2\x16\x17\x12\x01\xb9!\x13\x01\n`\xfeB\u007f\xf0\f\x12\x14\x03\xa41LO\xb1(\x04\xd3\xe1\xeb\x01+#\xfe=)\xfe\x00\x04heC\xfe\xdc\x19Q\x04\x13\x10\x01g\x15#\x05s\x03`\x1a\xfe\x94\xfef\x01\xb9\x014\x10#\xfe\x9b\xc7\xc2\x016\x01\x1c\xdd\xe4\xfe\xac\x01\x8f\xfe\xbc\xfd\x13\xfeq\x02\x99\x03'\xfd\xc0\xfeX\xfe|\x020\x02\v\x01-\x01\x1b\x10\x19\x1a\x14\xfeg\x00\a\x00\x00\xff\x80\t\x00\x05\x80\x00\b\x00\x0f\x00\x18\x00\x1c\x00>\x00I\x00Y\x00\x00\x01#6?\x01>\x017\x17\x05\x03&#!\a\x04%\x03'.\x01'\x133\x01\x033\x13#\x05&#\"\x06\a\x06\x17\x1e\x01\x15\x14\x06#\"/\x01\a\x163\x16674'.\x0154636\x1f\x01%#\"\a\x03373\x16\x173\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\xb7\x8a\x0e4\x03\x04\f\x03\f\xfa\x82:\v@\xfe\xf4\x02\x017\x01\x0f\xa2\x11\x1avH\x87\xaf\x01\x05%\xa6h\xa6\x02\x98EP{\x9c\x01\x01\x920&<'VF\x16\x17Jo\x82\x9d\x02\x8c1,1.F6\x0f\x01\xc0\x80A\x16\xf6\xae#\xd4\x05\x0f\x9a\x80L4\xf8\x004LL4\b\x004L\x02\"%\x8e\t\n \n7x\x01'6\rO\\\xfeJYFw\x1d\xfe\x02\x02\x81\xfd~\x02\x82\x10\x1bv^fH\x17$\x15\x1e !\v\x90\"\x01xdjD\x19\"\x15\x16!\x01\x19\b\x9b6\xfd\xb4`\x16J\x03\xc2\xfb\x004LL4\x05\x004LL\x00\x18\x00\x00\xff\x80\t\x00\x05\x80\x00\x11\x00\x19\x00+\x003\x00@\x00G\x00X\x00c\x00g\x00q\x00z\x00\x9c\x00\xb8\x00\xc7\x00\xe5\x00\xf9\x01\v\x01\x19\x01-\x01<\x01J\x01X\x01{\x01\x8b\x00\x00\x01&#\"\x0e\x02\x15\x14\x1e\x02327&\x02\x127\x06\x02\x12\x176\x12\x02'\x16\x12\x02\a\x1632>\x0254.\x02#\"\x0135#\x153\x15;\x025#\a'#\x1535\x1737\x03\x15+\x015;\x01\x153'23764/\x01\"+\x01\x15353$4632\x16\x15\x14\x06#\"$2\x17#\x04462\x16\x15\x14\x06#\"6462\x16\x15\x14\x06\"\x17\"'\"&5&547476125632\x17\x161\x17\x15\x16\x15\a\x1c\x01#\a\x06#\x06%354&'\"\a&#\"\a5#\x1535432\x1d\x0135432\x15\x173=\x01#\x15&#\"\x06\x14\x1632?\x014/\x01&5432\x177&#\"\x06\x15\x14\x1f\x01\x16\x15\x14#\"'\a\x16326\x17'\x06#\"=\x0135#5#\x15#\x153\x15\x14327\"\x06\x15\x14\x16327'\x06#\"'354&3\"\a5#\x1535432\x177&\x16\x14\x16327'\x06'\"&4632\x177&#\"\x173=\x01#\x15&#\"\x06\x14\x1632?\x01\"\a5#\x1535432\x177&\x173=\x01#\x15&\"\x06\x14\x1632?\x01\a\"#\x06\a\x06\x15\x06\x15\x14\x17\x14\x17\x1e\x013274?\x0167654'&'4/\x01\"&\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04_\x80\x99g\xbd\x88QQ\x88\xbch\x99\x80\x83^_\xa3~\\[\u007f\u007f[\\]\x82_^\x83\x80\x99h\xbc\x88QQ\x88\xbdg\x99\x02e\a\x11\a\x03\x1d\x04\x05\x06\x06\x05\x03\x06\x04\x05\b\x02\x03\x03\x02\x03\x04\x01\x01\x01\x01\x01\x01\x02\x01\x06\x03\x01\xfb\x16\x16\x13\x12\x16\x16\x12\x13\x01\xa5<\x05F\x01\x87\x16$\x17\x16\x13\x12\xfa\x17$\x17\x17$\x87\x02\x02\x01\x04\x01\x01\x02\x01\x02\x02\x02\x03\x01\x04\x02\x01\x01\x01\x01\x02\x02\x01\xfa\xbc\x1e\x1d\x19 \x0f\x0e\x1f\x18\x0f\x1e\x1e!\x1e\x1d!\x1e\xa6\x1d\x1d\x11\x1a\x1d&&\x1d\x1c\x0f\xb2/\x0e\x17\x19\x17\x14\f\x16!\x1a\x1e/\r\x18\x1f\x19\x14\r\x19!\x1d!\x82\b\r\r\x1300\x1e\x1c\x1c/\x15e\x1d&'\x1e!\x16\x0e\x12\x15\"\ae$\x83\x17\f\x1e\x1e\x1d\n\b\t\t\x12'!\x1d\x13\x0e\x12\x11\x12\x17\x17\x12\x13\x10\x0e\x14\x1c!\xce\x1e\x1e\x0f\x1b\x1d''\x1d\x1c\x0e\x85\x17\f\x1d\x1d\x1d\n\b\t\b\u007f\x1d\x1d\x0f8''\x1c\x1d\x0eN\x02\x02\x01\x02\x02\x03\x01\x01\x03\x02\x04\x03\x04\x02\x02\x02\x01\x02\x01\x01\x01\x02\x02\x02\x01\x04\x01gL4\xf8\x004LL4\b\x004L\x04\xabUQ\x88\xbcgh\xbc\x88QUk\x01=\x01(\x14\x18\"\x06\x02\x04\n\x0f\v\x18\x0e\x18\x14!\x06\x02\x04\n\x11\x0e\x17\x11\x18\x0e\x19\a\x16=\x1b))\x1b=2\x8e(\x1f '\x13\x16\x0f!\f '\x14\x10\x87L#\x04\x1c\x04(>(\x10\x18\r\x01\x18&\x18\f\x18\x10\x8bDC\x10\x14(>(\x14z\x14\x10\x87L#\x04\x1c\x04\x8bDzG\x14)<)\x14\x03\x01\x01\x02\x01\x03\x02\x04\x03\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x03\x02\x03\x04\x02\x01\x03\x01\x01\x01\x01\x04\xe5\xfb\x004LL4\x05\x004LL\x00\x00\f\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x11\x00\x1b\x00\x1f\x00B\x00W\x00b\x00j\x00q\x00}\x00\x8a\x00\x9a\x00\x00\x01\x14\a\x06+\x01532\x17\x16%\x14+\x01532\x054&+\x01\x113276\x173\x11#\x054&'.\x0154632\x177&#\"\x06\x15\x14\x16\x17\x16\x17\x16\x15\x14\x06#\"'\a\x16326\x055\x06#\"&54632\x175&#\"\x06\x14\x1632\x01\x11\x0e\x01\f\x02\x05!26\x004&\"\x06\x14\x162%\x13#\a'#\x13735#535#535#\x013'654&+\x01\x11353\x01\x11\x14\x06#!\"&5\x11463!2\x16\x019$\x1d<\x11\x11=\x1c$\x06\xf0@\x13\x14?\xf9SdO__J-<\x1eAA\x01@)7\x1d\x15\x1b\x15\x1d\x18\")9,<$.%\b\x13\x1c\x160\x17*,G3@\x01\x16%)1??.+&((JgfJ*\x04\xf7A\x9f\xfe\xc4\xfe\xa9\xfe\x14\xfe\xfe\x06!\x1a&\xfc\xadj\x96jj\x96\x01\x02\x90GZYG\x8eиwssw\xb8\x01\x87PiL>8aA\t\x01!M7\xf8\b7MM7\a\xf87M\x02\xf73!\x1a\xdc\x1b\x1f\r4erJ]\xfe\xb3&3Y\x01M\xe8(,\x14\n\x12\x0e\x10\x15\x1b,%7(#)\x10\r\x06\f\x16\x14\x1b,(@=)M%A20C&M\x14e\x92e\xfd\xb7\x02\x0f(X\x92\x81\x8c0&\x02Ėjj\x96j\b\x01V\xe0\xe0\xfe\xaa\t8Z8J9\xfe\xb3\x8c\x10N/4\xfe\xb3\x85\x02$\xfb\f8NN8\x04\xf48NN\x00\x00\x00\x00\x12\x00\x00\xff\x80\t\x00\x05\x80\x00\x02\x00\v\x00\x0e\x00\x15\x00\x1c\x00#\x00&\x00:\x00O\x00[\x00\xce\x00\xe2\x00\xf9\x01\x05\x01\t\x01$\x01?\x01b\x00\x00\x133'\x017'#\x153\x15#\x15%\x175\x174+\x01\x1532%4+\x01\x1532\x014+\x01\x1532\x053'%\x11#5\a#'\x15#'#\a#\x133\x13\x113\x177\x01\x14\x0e\x04\"&#\x15#'\a!\x11!\x17732%\x15#\x113\x15#\x153\x15#\x15\x01\x15\x14\x06#!\"&5\x11373\x1735\x1737\x15!572\x1d\x01!5\x1e\x026373\x1735\x173\x11#\x15'#\x15'#\"\a5#\x15&#!\a'#\x15'#\a\x11463!2\x16\x15\x11#\"\a5#\"\a5!\x15&+\x01\x15&+\x01\a'!\x11!7\x1735327\x153532\x16\x1d\x01!27\x1532%\x14\x06\a\x1e\x01\x1d\x01#54&+\x01\x15#\x1132\x16\x01\x14\x06\a\x1e\x01\x1d\x01#46.\x03+\x01\x15#\x11\x172\x16\x01\x15#\x113\x15#\x153\x15#\x15\x01\x11#\x11\x01\x14+\x0153254&\".\x01546;\x01\x15#\"\x15\x14\x166\x1e\x017\x15\x06+\x0153254&\x06.\x02546;\x01\x15#\"\x15\x14\x1e\x01\x03\x11#'\x15#'#\a#\"54;\x01\x15\"&\x0e\x04\x15\x14\x16;\x0173\x13\x113\x175wY-\x02AJF\xa3\x8e\x8e\x01=c\xbd(TS)\x01!*RQ+\xfe\xea*RQ+\x01\xcbY,\xfc\x16B^9^\x84\x19\x87\x19Ft`njUM\x02\x98\v\x11\x1c\x18'\x18)\t~PS\xff\x00\x01\x04PR\xcfm\xfe\xdd\xd9٘\x94\x94\x05\xd4M7\xf8\b7Mo\x197\x19\xda\x13q\x14\x02\x1d\n\n\x01\x17\x17@)U\t\x198\x19\xe3\"\xb6\xb4\x19\xb9\x17\xf9E(\xac\x181\xfd\x8c++\xc6\x16\xa9NM7\a\xf87Mx3\x1e\xb17\x17\xfe\xc4\x1f8\xd1\x17D\xea62\xfe\xa3\x01W74\xd3\x15;\x1f\xae\b\b\x04\x02\x119\x1f\xa8<\xfd-\x18\x16\x19\x12A\x18\"EA\x9a0:\xfe\xeb\x19\x15\x1a\x11A\x01\x01\x05\f\x17\x12F@\x991:\x02\x11\xd8ؗ\x94\x94\xfe\xedB\x02\xf7f~~\"\"12\"4(\x82w$#11#\xef\x18@}}!\x19%+%\x195(\x81v$:O\x94\\z\x84\x1a\x86\x19K\x81\x85?\a*\x0f\x1f\f\x11\x06\x1b$\x1d\\amcr\x03Vl\xfd\x86OO176Nn\xd9\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x06\x15\x14;\x012\x004&+\x01\"\x0f\x01'&+\x01\"\x06\x15\x14\x1e\x01\x17\x06\x15\x14;\x0127\x01%4&+\x01\"\a\x03\x06\x16;\x012?\x01>\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x14\x06\x15\x14;\x012\x1354+\x01\"\a\x03\a\x14\x16;\x0127\x01\x0e\x01#\a76;\x012\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xe93%\x1d#2%\x1c%\x03\x11,, \x11\x02\v\x12\x16\x1a\x18\x01_3$\x1d$2%\x1c%\xfa\xa8M>\xa0\x13\x02A\x01\b\x06L\x14\x02\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1bDHeE:\x1c<\x12\x04\rE\x13\x01\xc2\b\x05M\v\aj,\x05\x11K\x05\b'-\x01R\rM\v\a\x00\xff\x01~M>\x9f\x14\x02A\x01\b\x06R\f\x04\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1aEHeE:\x1d<\x11\x04\rE\x13\xdd\rJ\v\x02A\x01\b\x06B\x13\x02\xf9I\x05*'!\x11\x02\v\x13($\arL4\xf8\x004LL4\b\x004L\x02v%1 \x1c%3!x*\x1e\x01k\v\x04\x15\xa9$2 \x1c%3!\x8e;5\x13\xfeh\x06\n\x13n\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\f\t\x10\x01\x15\n\t\n\x9c\x96\x10\t\x05\x02r\x84\x04p\b\r\n\x01p8;5\x13\xfeh\x06\n\rt\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\x01\x10\x04\x10\x01\xac\x01\x0e\v\xfe`\x02\x05\t\x13\x01\x13#\x16\x01k\v\x17\x01\xdf\xfb\x004LL4\x05\x004LL\x00\x00\x00\n\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x0f\x002\x00H\x00W\x00[\x00l\x00t\x00\x8b\x00\x9b\x00\x00\x01\x14\a\x06#\"'5632\x05#632\x054&'.\x015432\x177&#\"\a\x06\x15\x14\x16\x17\x1e\x01\x15\x14#\"&'\a\x163276\x017#5\x0f\x033\x15\x14\x17\x163275\x06#\"=\x01\x055&#\"\x06\a'#\x113\x11632\x133\x11#\x054'&#\"\a'#\x1175\x163276\x004&\"\x06\x14\x162\x014'&#\"\x06\x15\x14\x17\x16327'\x06#\"'&'36\x13\x11\x14\x06#!\"&5\x11463!2\x16\x06=\x15\x13!\x17\x12\x1d\x1c9\x01\xb6n\x0623\xf9\xecBD$ &:B\x12CRM.0AC'\x1f0\x1dR\x1f\x12H`Q03\x01'\x13`\x81\x12.\x11>,&I / \f*\x01\x89\x0f\r /\n\n\x83\x96\x1a8\x10/\x96\x96\x02n-(G@5\b\x84\x96$ S3=\xfe,.B..B\x03\xb002^`o?7je;\x109G+\x14\x17\x05\xf8\x02\x80L4\xf8\x004LL4\b\x004L\x02yE%#\t\xe0\x1eVb\xe9;A\x19\r\x16\x0e\x1a!p &'F:A\x18\x0e\x17\x10\x1f\x19\x12q)%)\x01#o\x87\x15r\bg\xdbT$\x1e\vv\a2\xc5\x19\x8b\x03 \x1e8\xfe)\x012\x1f\xfe\xaf\x01\xd7\xdez948/\xfd{\x19\x97\v8A\x01\xc4B..B/\xfe\xebq?@\x84r\x80<7(g\x1f\x13\x13/\x0e\x02\xb1\xfb\x004LL4\x05\x004LL\x00\x00\x03\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x17\x00?\x00\x00\x01\x12\x17\x14\x06#!\x14\x06\"&'\x0524#\"&54\"\x15\x14\x16\x01\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x17\x06\x16=\xedL4\xfe@\x96ԕ\x01\x01\x00\x10\x10;U g\x043\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\b\x02\xac\xfe\x9c\xc84Lj\x96\x95j\xaf U;\x10\x10Ig\x06@\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\n\x00\x00\x00\x00\x04\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x16\x00&\x00N\x00\x00\x044#\"&54\"\x15\x14\x163\t\x01.\x01#\"\x0e\x02\x15\x10\x01\x14\x06#!\x14\x06\"&'7!&\x037\x12\x01\x17\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x04\x10\x10;U gI\xfd\xf7\x03m*\xb5\x85]\x99Z0\x04\xc0L4\xfe@\x96ԕ\x01\x95\x02\xf5\xa6=o=\x01CT\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\xb0 U;\x10\x10Ig\x01\xeb\x02\xf8Xu?bl3\xfe\x80\xfe@4Lj\x96\x95j\x81\xbb\x01\x10a\xfe\x9c\x04\xa8`\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\x00\x00\x00\x00\x05\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x007\x00[\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd\xe0\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\xa0\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x03\xeeu\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00,\x00<\x00H\x00\x00\x01\x15\x14\x0e\x02#\"\x0054\x0032\x1e\x03\x1d\x01\x14+\x01\"=\x014&#\"\x06\x15\x14\x16326=\x0146;\x012\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04~Isy9\xcd\xfe\xed\x01\x10\xcb\"SgR8\x10v\x10\x83H\x8c\xb1\xb7\x8eD\x8c\t\x06w\x06\n\xfc\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcem2N+\x16\x01\x16\xcf\xcb\x01\x10\t\x1b)H-m\x10\x10F+1\xb7\x92\x97\xc50*F\a\t\t\x03+f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00b\x00\x00\x014&#\"\x0e\x02\x15\x14\x1632>\x01\x05\x14\x0e\x02\a\"\x06#\"'&'\x0e\x01#\"&54\x12632\x16\x17?\x01>\x01;\x012\x17\x16\a\x03\x06\x15\x14\x163>\x045\x10\x00!\"\x0e\x02\x10\x1e\x023276\x16\x1f\x01\x16\a\x06\a\x0e\x01#\"$&\x02\x10\x126$3 \x00\x03\xcck^?zb=ka`\xa0U\x024J{\x8cK\x06\x13\a_/\x1c\x054\x9f^\xa1\xb1\x84\xe2\x85W\x88&\x02\v\x01\t\x05v\x05\b\x05\x02x\x05\x19 \x1c:XB0\xfe\xa4\xfe܂\xed\xabff\xab\xed\x82\xe4\xb1\v\x1a\b)\b\x01\x02\nf\xfb\x85\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x01X\x01\xa8\x02\xf9lz=l\xa6apz\x85\xc7\x11o\xacb3\x02\x015!2BX\xbf\xae\x9d\x01\n\x9bG@\x138\x06\f\v\x05\v\xfd\x9a\x18\x18'\x1a\x01\t'=vN\x01$\x01\\f\xab\xed\xfe\xfc\xed\xabf\x90\t\x02\v1\f\f\r\tSZz\xce\x01\x1c\x018\x01\x1c\xcez\xfeX\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x00(\x00\x00\x00\x16\x10\x0f\x01\x17\x16\x14\x0f\x01\x06\"/\x01\x01\x06+\x01\x05'\x13547\x01'&4?\x0162\x1f\x0176\t\x01'\x01\x15\x06D\xbc^\xe1h\n\n\xd2\n\x1a\ni\xfd\xa5%5\xcb\xff\x00@\x80%\x02[i\n\n\xd2\n\x1a\nh\xdf]\xfc\xc5\x02@\xc0\xfd\xc0\x06\x00\xbc\xfe\xf7]\xdfh\n\x1a\n\xd2\n\ni\xfd\xa5%\x80@\x01\x00\xcb5%\x02[i\n\x1a\n\xd2\n\nh\xe1^\xfa@\x02@\xc0\xfd\xc0\xc0\x00\x02\x00\x00\xff\x00\x06\xfe\x06\x00\x00\x10\x00)\x00\x00\x012\x16\x15\x14\a\x00\a\x06#\"&547\x016\x01\x1e\x01\x1f\x01\x16\x00#\".\x025\x1e\x03327>\x04\x06OFi-\xfe\xb4\x85ay~\xb5\\\x02~;\xfc\xba'\x87S\x01\x04\xfe\xf5\xd7{\xbes:\aD8>\x0f)\x0e\x19AJfh\x06\x00]F?X\xfd\x8b{[\xb9\u007f\x80T\x02C6\xfb\xf6Ll\x16G\xd5\xfe\xf4]\xa2\xccv\x052'\"%B];$\x0f\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%\x11!\x112>\x017>\x0132\x1e\x01\x17\x1e\x0232>\x017>\x0232\x16\x17\x1e\x022>\x017>\x0132\x16\x17\x1e\x02\x13\x15\".\x01'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x01#546;\x01\x11!\x11!\x11!\x11!\x11!\x1132\x16\x01\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\a\x00\xf9\x00-P&\x1c\x1e+#\x18(\x16\x16\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&PZP&\x1c\x1e+#\"+\x1e\x1c&P-\x18(\x16\x16\x1d$P-.P$\x1d\x16\x16(\x18#+\x1e\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&P-.P$\x1d\x1e+#pP@\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00@Pp\xfb\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x80\xfe\x80\x01\x80\x1c\x1b\x18\x1b\x16\x0e\x10\x13\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1b\x18\x1b\x16\x16\x1b\x18\x1b\x1c\x01@\xc0\x0e\x10\x13\x19\x1a\x1c\x1c\x1a\x19\x13\x10\x0e\x16\x1b\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1a\x19\x1b\x16\xc0Pp\x01\xc0\xfe@\x01\xc0\xfe@\x01\xc0\xfe@p\x03\x10MSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\v\x00\x00!\x15!\x113\x11\t\x01!\x11\t\x01\b\x00\xf8\x00\x80\x06\x00\x01\x00\xf9\x80\x01\xc0\x02@\x80\x06\x00\xfa\x80\x04\x00\xfc\x80\x02@\x02@\xfd\xc0\x00\x00\x00\x03\x00\x00\xff\x80\x06\xc0\x06\x00\x00\v\x00\x10\x00\x16\x00\x00\t\x01\x06\x04#\"$\x02\x10\x12$3\x13!\x14\x02\a\x13!\x112\x04\x12\x03\x00\x02\"j\xfe\xe5\x9d\xd1\xfe\x9f\xce\xce\x01aѻ\x03\x05xl\xa4\xfd\x00\xd1\x01a\xce\x02\x86\xfd\xdelx\xce\x01a\x01\xa2\x01a\xce\xfd\x00\x9d\xfe\xe5j\x02\xa2\x03\x00\xce\xfe\x9f\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\x1f\x00\x00!\x15!\x113\x11\x01\x11\x14\x06/\x01\x01\x06\"/\x01\x01'\x0162\x1f\x01\x01'&63!2\x16\b\x00\xf8\x00\x80\a\x00'\x10y\xfd\x87\n\x1a\n\xe9\xfe`\xc0\x02I\n\x1a\n\xe9\x01\xd0y\x10\x11\x15\x01\xb3\x0e\x12\x80\x06\x00\xfa\x80\x04\xe0\xfeM\x15\x11\x10y\xfd\x87\n\n\xe9\xfe`\xc0\x02I\n\n\xe9\x01\xd0y\x10'\x12\x00\x00\x01\x00\x00\x00\x00\a\x00\x04W\x00`\x00\x00\x01\x14\x17\x1e\x03\x17\x04\x15\x14\x06#\".\x06'.\x03#\"\x0e\x01\x15\x14\x1632767\x17\x06\a\x17\x06!\"&\x0254>\x0232\x1e\x06\x17\x1632654.\x06'&546\x17\x1e\x01\x17#\x1e\x02\x17\a&'5&#\"\x06\x05\f\n\n\x1e4$%\x01Eӕ;iNL29\x1e1\v ;XxR`\xaef՝\xb1Q8\x1bT\x0f\x1d\x01\x83\xfe\xff\x93\xf5\x88W\x91\xc7iW\x90gW:;*:\x1a`\x89Qs&?RWXJ8\v\x03\xafoNU0\x01\f\x16\x1e\x04\x81\x1a\x1c\x17J1F\x03@\x06#\x1d)\x1b\r\n[\xf1\x92\xc1%6_P\u007fO\x86\x1cQiX(o\xb2`\xa0\xef_?5\x98\"$\x01\x98\x9e\x01\x01\x92iʗ\\&>bd\x86s\x926\xc8aP*< \x1f\x17-;iF\x10\x11n\xa4\x04\x03\x17*\v\x1b-\x05c1\x15\x01\x15B\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00W\x00g\x00\x00\x014'.\x02'4.\x0154632\x17#\x16\x177&'.\x01#\"\x06\x15\x14\x17\x1e\x01\x17\x1e\x03\x1d\x01\x16\x06#\"'.\x05#\"\x0e\x01\x17\x15\x1e\x0232767'\x0e\x01#\"&54632\x16\x17\x1e\a326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x98\xea#$(\t\x04\x021$6\x11\x01\x14\x13]'\n!E3P|\x02\x10ad\x1d(2\x1b\x01S;aF\x179'EO\x80Se\xb6j\x03\x04]\xaem\xba]\x14\v<*rYs\x98\xa4hpt.\b#\x16)$78L*k\x98h\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xe4\xadB\n\r%\x1c\x02\r\v\x02$/\x0f\x0f$G6\n\x1d\x14sP\a\x10`X\x1d\b\x0f\x1c)\x1a\x05:F\x90/\x95fwH1p\xb8d\x01l\xb6qn\x1b\x18mPH\xaeui\xa8kw\x15_:[9D'\x1b\x8b\x02\xe5\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x0f\x00\x1f\x003\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01$4.\x02#!\x16\x12\x10\x02\a!2>\x01\x12\x10\x0e\x02#!\".\x02\x10>\x023!2\x1e\x01\x04\x80Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x03QQ\x8a\xbdh\xfe~w\x8b\x8bw\x01\x82h\xbd\x8a\xd1f\xab\xed\x82\xfd\x00\x82\xed\xabff\xab\xed\x82\x03\x00\x82\xed\xab\x02\x18н\x8aQQ\x8a\xbdн\x8aQQ\x8a\xbdн\x8aQZ\xfe\xf4\xfe\xcc\xfe\xf4ZQ\x8a\x01\xa7\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05\x00\x00\x13\x00#\x00\x00\x18\x01>\x023!2\x1e\x02\x10\x0e\x02#!\".\x01\x042>\x024.\x02\"\x0e\x02\x14\x1e\x01f\xab\xed\x82\x03\x00\x82\xed\xabff\xab\xed\x82\xfd\x00\x82\xed\xab\x04\xb2н\x8aQQ\x8a\xbdн\x8aQQ\x8a\x01\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x91Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x00\x00\x05\x00\x00\x00\x00\t\x00\x05\x00\x00\x0e\x00\x12\x00\x18\x00,\x00\\\x00\x00\x01!\"&?\x01&#\"\x06\x10\x16326'3&'\x05\x01!\a\x16\x17\x04\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\x16 \x00\x10\x00 \x005467'\x01\x06+\x01\x0e\x01#\"\x00\x10\x0032\x177#\"&463!\x15!'#\"&463!2\x17\x01632\x02\xfa\xfe\xc6(#\x18\xbcAH\x84\xbc\xbc\x84s\xb0\xa3\xba\x129\x01q\x01 \xfe ci\x15\x05\x05\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\xbc\x01\b\x01<\xfe\xf9\xfe\x8e\xfe\xf9OFA\xfe\x9f\x12!\xc5\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9re\x89\xe0\x1a&&\x1a\x01\x80\x01\xb3U\xde\x1a&&\x1a\x01\x00!\x14\x01\v[e\xb9\x01\x80F \xfb\x1f\xbc\xfe\xf8\xbc\x91\xefU?\x94\x01\x80\x84g\x95\xc4\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\xbc\x01\xf9\xfe\x8e\xfe\xf9\x01\a\xb9a\xad?b\xfe+\x1a\xa4\xdc\x01\a\x01r\x01\a7\xb7&4&\x80\x80&4&\x1c\xfep,\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x00\x0f\x00\x1f\x00+\x00K\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x03.\x01#!\"\x06\a\x03\x06\x163!26\x024&#!\"\x06\x14\x163!2\x01\x11#\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\x1147\x13>\x01$ \x04\x16\x17\x13\x16\x01\x80KjKKj\x04KKjKKj\x1dH\x05#\x17\xfcj\x17#\x05H\x05&\x1e\x04&\x1e&\xe7\x1c\x14\xfd\x80\x14\x1c\x1c\x14\x02\x80\x14\x01\xac\x80KjK\xfd\x00KjK\x80\x19g\t\xb1\x01\x1b\x01V\x01\x1b\xb1\ti\x17\x01\vjKKjKKjKKjK\x02\f\x01\x80\x17\x1d\x1d\x17\xfe\x80\x1e..\x02n(\x1c\x1c(\x1c\xfd[\xfd\xa5\x805KK5\x80\x805KK5\x80\x02[po\x01\xc6Nv<\x02\x01\x14\x06+\x01\x16\x15\x14\x02\x06\x04#\"\x00'#\"&546;\x01&54\x126$32\x00\x1732\x16\x05\xb72$\xfdB$22$\x02\xbe$\x01\b\x17\xfc*$22$\x03\x8cX\xfeڭ\xb1\xfeӯ\x17\x03\xd6$22$\xfctX\x01'\xad\x84\xf2\xaeh\x01s2$\x83\x11\x83\xdc\xfeϧ\xf6\xfekc\xbd$22$\x84\x11\x83\xdc\x011\xa8\xf5\x01\x95c\xbc$2\x02\xe3F33F3VVT2#$2\x8f\xa8\xaf\xfeԱVT2#$2\x8f\xa8g\xaf\xf1\x01\x84#2UU\xa7\xfe\xcf݃\x01\n\xd92$#2UU\xa7\x011݃\xfe\xf6\xd92\x00\x00\x06\x00\v\xff\x00\x04\xf5\x06\x00\x00\a\x00\x0f\x00\x1b\x00,\x00u\x00\xa3\x00\x00\x01\x03\x17\x1254#\"\x01\x16\x1767.\x02\x01\x14\x13632\x17\x03&#\"\x06\x03\x14\x1e\x0132654'.\x03#\"\x06\x03\x14\x17\x1e\x013276\x114.\x01'&$#\"\a\x06\x15\x14\x1e\x047232\x17\x16\x17\x06\a\x06\a\x0e\x01\x15\x14\x16\x15\a\x06\x15&'\x06#\x16\x15\x14\x06#\"&547\x16\x17\x1632654&#\"\x06\a467&54632\x17\x0254632\x13\x16\x17>\x0532\x16\x15\x14\x03\x1e\x03\x15\x14\x02\x0e\x01#\"'&\x02\x03\xb9ru\xa5&9\xfe\x8c\x1e\x03%\"\f*#\xfe͟\x11 \x0fO%GR\x9f=O&\x0e^\xaa\xfc\x98op\x95\xda\x04\x86\xfe\xb8\x15\x01\xc3C8\xfcpP\b*\x19\x02\a\a\x03\x85b\xfeY\n\x05\x01_\xdc#\xfc\xf5$\xa6\x8c\x1a\x0e\x18N Pb@6\xfe\x9d)?\x91\xa4\xaa\xa9\x01\x02+0L\x1215\v\x05\x1e\"4\x1c\x13\x04\x04\x02\x13\x13$\x1c\x1a\x16\x18.\x88E\x1fs\x1e\f\f\x02\n\xce\x02\a\x0e5I\x9cQ\"!@\fh\x11\f\"\xdeY7e|\x1aJ\x1e>z\x0f\x01\xceiPe\xfd\xbb\x11\x06\x10\u007fn\x91eHbIl\xfeF\x0f>^]@\x96\xfe\xfc\xben*9\x01\r\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x00\x05\x80\x00\x1a\x006\x00[\x00_\x00\x00\x013\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x0232%3\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x02326%4&'.\x02'&! \a\x0e\x02\a\x0e\x01\x15\x14\x16\x17\x1e\x02\x17\x16\x04! 7>\x027>\x01\x13\x11!\x11\x03\x11\xcf\x0e\xa9\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcb\x05=39?\n\x1a6'_\x02\xd6\xce\x0e\xa8\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcc\x04>29?\n\x1a5'17\x01m\x1f-\x06\x0f\x1c\x02V\xfd\x9d\xfd\x8fU\x05\x19\x11\x06-\x1e\x1e-\x06\x12\x17\x06,\x01\x87\x01\x13\x02bW\x05\x18\x11\x05.\x1e\xc0\xf8\x00\x02\x10\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$\x8b\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$L\xb6\xcf\xc8=\b\f\x12\x02??\x04\x0f\r\b<\xc7\xd1\xd0\xc7=\b\x0e\x0e\x05! A\x04\x0e\x0e\t<\xc6\x03\xcb\xfa\x00\x06\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x05`\x05\x80\x00\x1d\x00;\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&#!\x11\x14\x06+\x01\"&5\x11463!2\x1e\x01\x01\x11\x14\x0e\x01#!\"&5\x1146;\x012\x16\x15\x11!265\x1146;\x012\x16\x03\xe0\x12\x0e\xa0\x0e\x12\xa0p\xfe\xf0\x12\x0e\xa0\x0e\x12\x12\x0e\x01Ї\xe4\x85\x01\x80\x85\xe4\x87\xfe0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x10p\xa0\x12\x0e\xa0\x0e\x12\x03\x90\xfe\x10\x0e\x12\x12\x0e\x01\xf0p\xa0\xfb\x80\x0e\x12\x12\x0e\x05@\x0e\x12\x85\xe4\x01I\xfc\x90\x87\xe4\x85\x12\x0e\x03\xc0\x0e\x12\x12\x0e\xfd\x00\xa0p\x03p\x0e\x12\x12\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00S\x00c\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x0554&+\x01\"\a&+\x01\"\x06\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012%54&#!\"\x06\x15\x11\x14;\x012=\x01\x16;\x0126\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x1f\x1b\x18\xca\x18\x1c\x1c\x18\xca\x18\x1b\xfe\x16A5\x85D\x1c\x1cD\x825A\x157\x16\x1b\x19^\x18\x1c\x156\x16\x1c\x18a\x18\x1b\x167\x15\x02MB5\xfe\xf85B\x167\x15\x1f?\xbf5B~\x88`\xfb\xd0`\x88\x88`\x040`\x88\x02\xb6r\x18\x1c\x1c\x18r\x18\x1c\x1c\xfe\xfa5A44A5\xfa\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16v\x9a5AA5\xfef\x15\x15\xb4*A\x02\x9d\xfb\xd0`\x88\x88`\x040`\x88\x88\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x19\x00\x00\x01!\x1b\x01!\x01!\x01!\t\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x93\xfeړ\xe9\x017\xfe\xbc\xfeH\xfe\xbc\x017\x01\u007f\x02j\xaav\xfc@v\xaa\xaav\x03\xc0v\xaa\x01\xc2\x02'\xfc\x97\x04\x00\xfc\x00\x01:\x02\xa6\xfc@v\xaa\xaav\x03\xc0v\xaa\xaa\x00\x00\x00\x00\x17\x00\x00\xff\x00\b\x00\x06\x00\x00M\x00U\x00a\x00h\x00m\x00r\x00x\x00\u007f\x00\x84\x00\x89\x00\x91\x00\x96\x00\x9c\x00\xa0\x00\xa4\x00\xa7\x00\xaa\x00\xaf\x00\xb8\x00\xbb\x00\xbe\x00\xc1\x00\xcb\x00\x00\x01\x14\x06\a\x03\x16\x15\x14\x06\a\x03\x16\x15\x14\x06#\"'!\x06\"'!\x06#\"&547\x03.\x01547\x03.\x015467\x134&547\x13&54632\x17!62\x17!632\x16\x15\x14\a\x13\x1e\x01\x15\x14\a\x13\x1e\x01\x01!\x01#\x01!62\x01\x16\x15\x14\a\x13\x177\x11'\x06\a\x01!\x17%!\x06\"\x0167'\a#7\x03\x01\x17\x017\x13!\x016\x053\x01!\x11\x17\x16\x03!7\x01\x0f\x0135\a\x16\x11\x14\x16\x15\x14\a\x17\x117\x11\x17\x01/\x01\a\x117'\x06%#\x05\x17\x15\t\x02%'\x11\x05\a3\x01\x17\x13/\x02&=\x01\x03&'\t\x025\x03\x13#\x13\x01\a?\x01\x13&547\v\x01\x176\b\x00\x1a\x14\xcd\x03\x19\x14\xc1\x03!\x18\x19\x10\xfep\x114\x11\xfeq\x11\x1a\x17\"\x04\xc1\x14\x19\x03\xce\x14\x19\x1b\x14\xc7\x01\"\xd1\x04\"\x17\x1a\x12\x01\x8c\x106\x10\x01\x8e\x12\x1a\x17\"\x04\xcf\x17 \a\xbb\x13\x19\xfc'\x01\x85\xfe\xaa\x8f\xfe\xaa\x01h\x12*\xfc[\x01\x02\xd0\x0f\xbc\xbb\r\x10\x02\xa8\xfe|\xbe\x02*\xfe\xe8\x10,\x02\xaf\x01\x04@\x11\x1e\x16\xfc\xfe\xd8?\x01w\x10A\xfeU\x01M\b\xfcp\x05\x01V\xfe\x8b\x04\x0e\x12\x01\x92@\xfe˝\xc1\xa3\xa8\x04\x01\b\xab\x1e\x99\x01)\xdf\xdf\x04Ϳ\x06\x03w\x10\xfd\x93\xd5\xfe\xd7\x017\x01(\xfd{\x88\x01\xe6*U\x01%\xee\x84\x03\x01\x16\b\xd8\x05\b\xfeK\x016\xfc\xc0\xa3\xa3\xa3\xa3\x04=0\x82(\xcf\x02\x03\xab\x81M\x05\x02\x81\x15\x1f\x04\xfe\x9c\t\t\x14\x1f\x04\xfe\xaf\b\b\x17\"\x12\x14\x14\x14!\x18\b\f\x01O\x04\x1f\x14\t\t\x01d\x05\x1f\x14\x15\x1f\x04\x01X\x01\x04\x01$\x0f\x01k\n\b\x18!\x15\x15\x15\x15!\x18\x06\f\xfe\x9a\x01!\x16\r\x0e\xfe\xbc\x04\x1f\xfc\xcd\x01b\xfe\x9e\x10\x03\x1c\x04\t\n\x05\xfe\x98\x06\xc7\x01[\xc2\b\x02\x01\xc0\xc8\xc8\x10\xfbT\x06\x05DOi\x01\n\xfe\xcd@\xfe\x90\x1c\x016\xfe\xa9\x04\x0f\x01b\xfe\xb1\x06\x05\x01xB\x01A\xa6ݽ\xb1\b\x035\x01\x02\x01\x10\r\xb1\x01\r\v\xfeɝ\x01:\xec\xde\b\xfe\xf8J\xc9\x02\f\xe0\xe1+\xfe\xc5\xfe\xc1\x013\x0f\x8d\xfe\xe4\xdd,\x01\x88\xfb\x02p\x05\x01\x15\r\x10\x02\x01x\x01\x04\xfe1\xfe\xb9\x01\xf6\xdf\xfe\xe6\xfc\x89\xfe\xe5\x01\x1b\xe3\xe3F\x01i\n\x04\x01\x0f\x01(\xfd\x9cR\x03\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\r\x00\x1b\x00\x00\x11463!\x01\x11\x14\x06#!\"&5%'\x114&#!\"\x06\x15\x11\x14\x163\xb7\x83\x02\xe6\x01`\xb7\x83\xfc\xf4\x83\xb7\x04а@.\xfe\x1c.@A-\x03X\x83\xbf\x01f\xfaB\x84\xbe\xbe\x84$\xb4\x01\xa9.BB.\xfe\x14.C\x00\x00\x04\x00\x00\xff\x83\x06\x00\x05}\x00\n\x00\x14\x00\x1e\x00)\x00\x00\x01\x04\x00\x03&54\x12$32\x05\x16\x17\x04\x00\x03&'\x12\x00\x01\x12\x00%\x16\x17\x04\x00\x03&\x05&'\x06\a6\x007\x06\a\x16\x03\xa6\xfe\xc3\xfe\"w\x14\xcd\x01`\xd0R\x01d]G\xfe{\xfd\xc5o]>p\x026\xfe\xa3s\x02\x11\x01c(\x0e\xfe\xdc\xfe@wg\x03\xcf\xc1\xae\x87\x9bm\x01J\xcc\x15PA\x05jy\xfe\x1d\xfe\xc1YW\xd0\x01a͊AZq\xfd\xc1\xfe{HZ\x01\x82\x02:\xfb<\x01d\x02\x14v\\gx\xfe>\xfe\xdb\x0e\x142AT\x17\xcd\x01Kn\x98\x84\xaf\x00\x00\x03\x00\x00\xff\x80\b\x00\x04\xf7\x00\x16\x00+\x00;\x00\x00\x01\x13\"'&#\"\a&#\"\a\x06+\x01\x136!2\x1763 \x012\x16\x17\x03&#\"\a&#\"\a\x03>\x0232\x1767\x03\x06\a&#\"\a\x03>\x0132\x176\x17\ae\x9b\x83~\xc8\xc1└\xe2\xc1Ȁ|\x05\x9b\xe0\x01\x02隚\xe9\x01\x02\xfe\xf1\x81Ν|\xab\xc5\xe0\x96\x96\xe0ū|iy\xb0Zʬ\xac\xf27Ӕ\x98ް\xa0r|\xd1uѥ\xac\xca\x04x\xfb\b9[\x94\x94[9\x04\xf8\u007fjj\xfb\xa69A\x03\xfdN\x8d\x8dN\xfc\x03+,#ll\"\x03\x8b\x04\x97\x9bB\xfcS32fk\x05\x00\x00\x05\x00\x00\xff\xa5\b\x00\x05[\x00\x0f\x00\x1f\x00/\x00?\x00\\\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x14\x06#!\"&5467&54632\x176$32\x1e\x01\x15\x14\a\x1e\x01\x05\xdc\x1e\x14]\x14\x1e\x1e\x14]\x14\x1e\xfe\xe4\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\x05\x88\xec\xa6\xfb$\xa6\xec~i\n\xa1qfN-\x01*\xbd\x95\xfc\x93\x0e\x87\xac\xa5\x02\xdd\x15\x1e\x1e\x15\xfd#\x14\x1e\x1e\x14\x02\x13\x14\x1e\x1e\x14\xfd\xed\x14\x1e\x1e\x14\x01\xad\x14\x1e\x1e\x14\xfeS\x14\x1e\x1e\x14\x01j\x14\x1e\x1e\x14\xfe\x96\x14\x1e\x1e\xa6\xa6\xec\xec\xa6t\xc52\"'q\xa1C\xb7\xea\x93\xfc\x95B8!\xdb\x00\x00\x00'\x00\x00\xff>\x06\x00\x06\x00\x00\x04\x00\t\x00\r\x00\x11\x00\x15\x00\x19\x00\x1d\x00!\x00%\x00)\x00-\x001\x005\x009\x00=\x00A\x00E\x00I\x00M\x00Q\x00U\x00Y\x00]\x00a\x00g\x00k\x00o\x00s\x00w\x00{\x00\u007f\x00\x85\x00\x89\x00\x8d\x00\x91\x00\x95\x00\x99\x00\xa5\x00\xd5\x00\x00\x11!\x11\t\x01%\x11!\x11\t\x015!\x15\x13\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x177\x17\a\x177\x17\a\x177\x17\a\x177\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a\x01\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x01\x15#53\x157\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x175#53\x15\a53\x15\a53\x15\a53\x15\a53\x15\a53\x15%\"&54632\x16\x15\x14\x06\x01\x14\x1e\x026\x16\x15\x14#\"'#\a\x1632>\x0254.\x01\x06&54>\x0132\x16\x1737.\x06#\"\x0e\x02\x06\x00\xfc\xf8\xfd\b\x05\x9c\xfa\xc8\x02\x95\x02\xa3\xfa\xc8Q%%%%%%%%%?\x0fi\x0f\x1f\x0fi\x0f\x1e\x0fi\x0f\x1f\x0fh\x0fOi\x0fixi\x0fiyi\x0fixi\x0fi\xfcAr\x01\x14s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\x01\x14r\xfb\xb8%s\xa2s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\xf0Ns%%%%%%%%%%\xfd\x88\x81\xb8\xb8\x81\x82\xb7\xb7\xfe\xd9'\x0232\x16\x15\x14\a\x06\x04#\".\x0154\x0032\x1e\x0532654&#\"\x06#\"&54654&#\"\x0e\x02#\"&547>\x0132\x16\x15\x14\a6\x05\x96\x01\x04\x94\xd2ڞU\x9azrhgrx\x98S\x9a\xc3Пd\xd8U\x05 \x1c\b\x0e\x15\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x04\xc0&\x1a\x80&4&\x80\x1a&&\x1a\x80&4&\x80\x1a\xfd\xe6KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x80\x1a&&\x1a\x80&4&\x80\x1a&&\x1a\x80\xfd5jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\x17\x00\x1f\x00'\x00S\x00\x00\x004&\"\x0f\x01\x114&\"\x06\x15\x11'&\"\x06\x14\x17\x01\x1627\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x13\x11\x14\x06\a\x05\x1e\x02\x15\x14\a!2\x16\x14\x06#!\"&54>\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x05\x00&4\x13\x93&4&\x93\x134&\x13\x01\x00\x134\x13\x01\x00\xfd\x93KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x13\x92\x01%\x1a&&\x1a\xfeے\x13&4\x13\xff\x00\x13\x13\x01\x00\xfd\"jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x00\x05\x80\x00\x02\x00\x05\x00\t\x00\f\x00\x10\x00\x14\x00&\x00\x00\x13\t\x03!'\x13!\t\x02!%!\x03!\x01!\x01!%\x01\x16\x06\a\x01\x06\"'\x01.\x017\x0163!2\xd4\x02o\xfe\xd4\x01\xe9\x01]\xfdF\x89\xcc\xfe\xfa\xfe\xe0\x03\xfd\x02o\xfe\xbd\xfc\xc2\x02\xaa\xcc\xfe\xee\x02o\x01Z\xfe\xe0\xfe\xfa\x01Y\x01\x80\x0e\x02\x10\xfc@\x12:\x12\xfc@\x10\x02\x0e\x01\x80\x12!\x04\x80!\x03\x00\xfdg\x02\x99\xfc\xfc\x03\x04\x80\x01\x80\xfe\x80\xfc\xe7\x02\x99\x80\x01\x80\xfe\x80\x01\x80f\xfe\x00\x12/\x11\xfc\x00\x14\x14\x04\x00\x11/\x12\x02\x00\x1a\x00\x03\x00\x13\xff\x00\a\xed\x06\x00\x00I\x00\x97\x00\xa0\x00\x00\x0562\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x017\x17762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01%\x06\"/\x017\x17762\x1f\x017\x11\x03&6?\x01\x1135!5!\x15!\x153\x11\x17\x1e\x01\a\x03\x11762\x1f\x01762\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\x01\x15%\x055#5!\x15\a\x13\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13\x80ZSS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\xfa-\x134\x13\x80ZSS\x134\x13S@\xd2\x11\x14\x1e\xb1\x80\x01\x00\x01\x00\x01\x00\x80\xb1\x1e\x14\x11\xd2\x13\x134\x13SS\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\x01@\x01\x80\x01\x80\x80\xfe\x00\x13\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13Sy\x13\x13\x80ZRR\x13\x13R@\x01%\x01:\x1a=\n:\x01+\x80\x80\x80\x80\xfe\xd5:\n=\x1a\xfe\xc6\xfe\xdb\x12\x13\x13RR\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13S\x04\x1a\x80\x80\x80\x80\x80\x80\x00\x00\x00\x04\x00\x00\xff\x80\x05\x80\x06\x00\x00\x03\x00\a\x00C\x00v\x00\x00!\x13/\x01\x01\x13\x0f\x01\x01&'&#\"\a\x06\"'&#\"\a\x06\a\x16\x17\x1e\x01\x17\x1e\t32>\x03;\x012\x1e\x0332>\b7>\x0176\x01\x14\x06#!\"&54>\x037'3&547&547>\x017632\x162632\x17\x1e\x01\x17\x16\x15\x14\a\x16\a3\a\x1e\x03\x02@``\x80\x01\x80\x80\x80`\x01\x00\x02\x02\nVFa\a\x1c\aaFV\n\x02\x02\x02\x02\x02\v\x02\x02\v\x03\f\x05\r\v\x11\x12\x17\r$.\x13\n\r\v\f\v\r\n\x13.$\r\x17\x12\x11\v\r\x05\f\x03\v\x02\x02\v\x02\x02\x01\xa2\x92y\xfc\x96y\x92\t\x1d.Q5Z\xd6\x16\x02\xc2\xd2\x11E$ ,\x1el\x90*%>>%*\x90>*98(QO\xe1!\u007f\xa0\x8f\x00\x03\x00\x00\x00\x00\b\xfd\x05\x00\x00L\x00\\\x00p\x00\x00\x01\x16\x0e\x02'.\x01'&67'\x0e\x01\x15\x14\x06#!#\x0e\x01#\"\x00\x10\x0032\x177&+\x01\"&46;\x012\x1e\x02\x17!3'#\"&7>\x01;\x012\x1f\x0176;\x012\x16\x1d\x01\x14\x06+\x01\x176\x17\x1e\x01\x01267!\"'&7\x13&#\"\x06\x10\x16(\x016\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\b\xfd\fD\x82\xbbg\xa1\xed\x10\fOOG`n%\x1b\xff\x00E\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9LL\x18{\xb5@\x1a&&\x1a\x80N\x86c,\x1d\x02\x00sU\xde\x1e&\x05\x04&\x18\xfd!\x14Fr\x13\x1be\x1a&&\x1a\xb3s\x83\x90\x8f\xca\xf8\xd4s\xb0\x17\xfe\xc6#\x14\x12\x11\x93/,\x84\xbc\xbc\x05\x80\x01\b\xbc\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\x01\xf4g\xbf\x88L\a\v\xe4\xa0o\xc7GkP\xe4\x82\x1b'\xa4\xdc\x01\a\x01r\x01\a\x1b-n&4&\x1b2\x1d\x16\x80-\x1e\x17\x1e\x1cir\x13&\x1a\x80\x1a&\xac?\x1b\x1a\xd9\xfd\xfb\x91o\x1f \x1f\x01\x15\r\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\x00\x00\x03\x00\x00\xff\x00\x05\x80\x05\xe0\x005\x00O\x00W\x00\x00!\x14\x0e\x02 .\x0254>\x0276\x16\x17\x16\x06\a\x0e\x04\a\x1e\x042>\x037.\x04'.\x017>\x01\x17\x1e\x03\x01\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!2\x16\x02\x14\x06\"&462\x05\x80{\xcd\xf5\xfe\xfa\xf5\xcd{BtxG\x1a,\x04\x05\x1f\x1a:`9(\x0f\x01\x030b\x82\xbfԿ\x82b0\x03\x01\x0f(9`:\x1a\x1f\x05\x04,\x1aGxtB\xfe\x80&\x1a@&\x1a\xff\x00\x1a&@\x1a&K5\x01\x805K`\x83\xba\x83\x83\xba?e=\x1f\x1f=e?1O6#\f\x05\x1f\x1a\x1a,\x04\n\x1b\x18\x17\x10\x04\v\x1f#\x1e\x14\x14\x1e$\x1f\f\x04\x0e\x18\x17\x1b\n\x04,\x1a\x1a\x1f\x05\f#6O\x03O\xfe\x80\x1a&\xfe\x80\x1a&&\x1a\x01\x80&\x1a\x01\x805KK\x01\xa8\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1b\x00?\x00\x00\x01!\x0e\x01\x0f\x01\x01\x06\"'\x01&'!267\x1b\x01\x1e\x013267\x13\x17\x16\x01\x14\a!'.\x01\a\x06\a\v\x01.\x01\"\x06\a\x03!&54632\x1e\x02\x17>\x0332\x16\x05\x00\x011\x05\n\x04\x03\xfd\x91\x124\x12\xfd\x90\x05\x10\x01q\x16#\x05F\xbe\x06\"\x16\x15\"\x06\x928\x12\x02'g\xfe\x8fo\b#\x13-\v\x81\xc4\x06#,\"\x05t\xfeYg\xfe\xe0>\x81oP$$Po\x81>\xe0\xfe\x02\x00\x06\t\x03\x04\xfd\xa8\x12\x12\x02Z\x02\x12\x1b\x15\x01\x19\xfde\x14\x1a\x1a\x14\x01\xe5p#\x01\xac\x91\x9b\xdd\x11\x14\x02\x05)\xfeR\x02\xae\x14\x1a\x1b\x15\xfe0\x9b\x91\xdc\xf8+I@$$@I+\xf8\x00\x00\x02\x00\x02\xff\x00\x04\x80\x05\xfc\x00+\x003\x00\x00\x01\x14\x00\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x027>\x0276\x04\x12$\x10\x00 \x00\x10\x00 \x04\x80\xfe\xd9\xd9\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\v\x8bᅪ\x01*\xae\xfc\x00\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x03\xc0\xdd\xfe\xb9\x18\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\x86\xe6\x92\x0f\x13\x92\xfe\xea\x12\xfe\x8e\xfe\xf9\x01\a\x01r\x01\a\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00'\x00/\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x01\x16\x15\x14\x0e\x02\".\x024>\x0232\x17\x01!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12\xfe\x82~[\x9b\xd5\xea՛[[\x9b\xd5u˜\x01~\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\xfe\x81\x9c\xcbu՛[[\x9b\xd5\xea՛[~\x01~\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00=\x00E\x00\x00\x01\x16\x12\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x0054\x127&'&6;\x012\x17\x1e\x012676;\x012\x16\a\x06\x00 \x00\x10\x00 \x00\x10\x03>\x91\xb1\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfeٱ\x91\xa5?\x06\x13\x11E\x15\b,\xc0\xec\xc0,\b\x1d=\x11\x13\x06?\xfd\xa4\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x04\xc4H\xfe\xeb\xa7\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01Gݧ\x01\x15H`\xb1\x10\x1b\x14j\x82\x82j\x14\x1b\x10\xb1\xfb\xdc\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x02\x00\x02\xff\x00\x05\x80\x06\x00\x00B\x00J\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x16\x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x04\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x95\xf3\x82\f\x10\x01 \xcbv\xdcX\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x10\xae\x01\x11\x9b\xcc\x01+\x17\x0eBF\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x06\x80\x06\x00\x00k\x00s\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x00547'\a\x0e\x01/\x01.\x01?\x01'\x15\x14\x06+\x01\"&5\x11463!2\x16\x1d\x01\x14\x06+\x01\x177>\x01\x1f\x01\x1e\x01\x0f\x01\x176 \x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x05\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfe\xd9~4e\t\x1a\n0\n\x01\tio\x12\x0e@\x0e\x12&\x1a\x01 \x0e\x12\x12\x0e\x85jV\t\x1a\n0\n\x01\tZ9\x9e\x01\x92\x9e\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01G\xddɞ5o\n\x01\b,\b\x1b\nsp\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12k^\n\x01\b,\b\x1b\nc8~~\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x05\x00\x02\xff\x00\x06\xfe\x05\xfd\x008\x00>\x00K\x00R\x00_\x00\x00\x01\x16\x02\x06\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x0276\x0076\x176\x17\x16\x00\x016\x10'\x06\x10\x0327&547&#\"\x00\x10\x00\x01\x11&'\x06\a\x11\x012\x00\x10\x00#\"\a\x16\x15\x14\a\x16\x06\xfe\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xfe\x00\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\x11\x01'\xcdΫ\xab\xce\xcd\x01'\xfc\x93\x80\x80\x80\xc0sg\x9a\x9ags\xb9\xfe\xf9\x01\a\x02\xf9\x89ww\x89\x02@\xb9\x01\a\xfe\xf9\xb9sg\x9a\x9ag\x03\xef\x9b\xfe\xee\xae\x10\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\xce\x01-\x13\x15ss\x15\x13\xfe\xd3\xfdʃ\x01l\x83\x83\xfe\x94\xfe\xf69\xa5\xe2\xe0\xa79\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x80\x01\x04\x0fOO\x0f\xfe\xfc\x01\x80\x01\a\x01r\x01\a9\xa7\xe0\xe2\xa59\x00\x00\x04\x00\x01\xff\x06\a\x80\x06\x00\x00F\x00P\x00^\x00l\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06$'.\x037>\x0276\x16\x17%#\"&=\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x17\x16\x17%#\"&5\x014'\x0e\x01\x15\x14\x17>\x01%\x14\x16\x17&54\x007.\x01#\"\x00\x012\x0054&'\x16\x15\x14\x00\a\x1e\x01\x06\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16\x1f\xfe\xf2\xb7\xd2\xfe\xa3CuГP\b\t\x8a\xe2\x87v\xdbY\x00\xff\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe;\"\xb6\x92\x00\xff\x86\x0e\x12\xfe\x00\x04\xa2\xda\x04\xa2\xda\xfc\x80ޥ\x03\x01\x0e\xcb5݇\xb9\xfe\xf9\x03\xc0\xb9\x01\aޥ\x03\xfe\xf2\xcb5\xdd\x04`\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue036\xfe\xfc\x1a\x1dڿ\x06g\xa3\xdew\x87\xea\x95\x0f\x0eBF\xfe\x12\x0e@\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xffJ_\ts\xfe\x12\x0e\xfe\xa0\x14&\x19\xfa\xa7\x14&\x19\xfa\xa7\xa8\xfc\x17\x1d\x1e\xd2\x01?%x\x92\xfe\xf9\xfc\a\x01\a\xb9\xa8\xfc\x17\x1c\x1f\xd2\xfe\xc1%x\x92\x00\x04\x00\x06\xff\x00\b\x00\x06\x00\x00J\x00P\x00\\\x00h\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06'\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x17632\x17%#\"&5\x016\x10'\x06\x10\x00\x10\x00327&\x107&#\"\x012\x00\x10\x00#\"\a\x16\x10\a\x16\x06\x80\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16 \xfe\xf7\xb5ߺu\x8b`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x9b\xf9}\x17\x19\x01\r\xbaຒ\xaeɞ\x00\xff\x86\x0e\x12\xfd\x00\x80\x80\x80\xfd\x80\x01\a\xb9ue\x9a\x9aeu\xb9\x039\xb9\x01\a\xfe\xf9\xb9ue\x9a\x9ae\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue034\xfe\xfc\x1b\"|N\x0f\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x11\xb9\x01\"\xa2\xbb\x01\x0f\x1d\"|a~\xfe\x12\x0e\xfb\xe7\x83\x01l\x83\x83\xfe\x94\x01o\xfe\x8e\xfe\xf99\xa7\x01\xc0\xa79\xfc\x80\x01\a\x01r\x01\a9\xa7\xfe@\xa79\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00;\x00C\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\a\x17\x16\x14\x0f\x01\x06\"/\x01\a\x16\x15\x14\x0e\x02\".\x024>\x0232\x177'&4?\x0162\x1f\x017!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12Ռ\t\t.\t\x1a\n\x8cN~[\x9b\xd5\xea՛[[\x9b\xd5u˜N\xac\t\t.\t\x1a\n\xac\xd5\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\u058c\n\x1a\t.\t\t\x8dO\x9c\xcbu՛[[\x9b\xd5\xea՛[~N\xac\n\x1a\t.\t\t\xac\xd5\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x02\xff\x04\x04\x80\x06\x00\x009\x00A\x00\x00\x01\x16\x00\x15\x14\x02\x04'.\x02'&\x12675#\"&=\x0146;\x015\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14\x0f\x01\x06\"/\x01\x1532\x16\x1d\x01\x14\x06+\x01\x02 \x00\x10\x00 \x00\x10\x02\x80\xd9\x01'\xae\xfe֪\x85\xe1\x8b\v\f\x81\xf3\x96\xa0\x0e\x12\x12\x0e\xa0\\\n\x1a\t.\t\t\xca\x134\x13\xca\t\t.\t\x1a\n\\\xa0\x0e\x12\x12\x0e\xa0\xf9\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03|\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\xa5\\\t\t.\t\x1a\n\xc9\x13\x13\xc9\n\x1a\t.\t\t\\\xa5\x12\x0e@\x0e\x12\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x04\x00\x00\a\x80\x04~\x009\x00A\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01!\x15\x14\x06+\x01\"&=\x01#\x06\x00#\"$\x027>\x0276\x04\x16\x173546;\x012\x16\x1d\x01!'&4?\x0162\x17\x00 \x00\x10\x00 \x00\x10\am\x13\x13\xfe\xda\t\x1b\t-\n\n\xb9\xfe\xda\x12\x0e@\x0e\x12\x84\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\x01&\xb9\n\n-\t\x1b\t\xfb@\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x02m\x134\x13\xfe\xda\n\n-\t\x1b\t\xb9\xe0\x0e\x12\x12\x0e\xe0\xd9\xfeٮ\x01*\xaa\x85\xe1\x8b\v\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\xb9\t\x1b\t-\n\n\xfc\xed\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00\x17\x00\x1f\x00\x00\x01\x14\x00\a\x11\x14\x06+\x01\"&5\x11&\x0054>\x022\x1e\x02\x00 \x00\x10\x00 \x00\x10\x04\x80\xfe\xd9\xd9\x12\x0e@\x0e\x12\xd9\xfe\xd9[\x9b\xd5\xea՛[\xfd\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03\xc0\xdd\xfe\xb9\x18\xfd\x9c\x0e\x12\x12\x0e\x02d\x18\x01G\xddu՛[[\x9b\xd5\xfd\xcb\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\x00\x00\x04\x80\x04\x80\x00\a\x00\x17\x00\x00\x00\x10\x00 \x00\x10\x00 \x00\x14\x0e\x02\".\x024>\x022\x1e\x01\x04\x00\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x01\x87[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x025\xea՛[[\x9b\xd5\xea՛[[\x9b\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06#!\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x05\xab#22#\xfey\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd!#22#\x05\x802#\xfa\xaa#2\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad2#\x05V#2\x00\x00\x00\x01\x00\x00\xff\x80\x05\x00\x06\x00\x00L\x00\x00\x114>\x0332\x04\x16\x15\x14\x0e\x03#\"&'\x0e\x06\x0f\x01'&546\x127&54632\x16\x15\x14\x06\x15\x14\x1632>\x0454&#\"\x00\x15\x14\x1e\x02\x15\x14\x06#\"'.\x03K\x84\xac\xc6g\x9e\x01\x10\xaa&Rv\xacgD\x86\x1d\n$\v\x1e\x16*2%\x0e\t\x0f+Z\a hP=DXZ@7^?1\x1b\r۰\xc8\xfe\xf4\x19\x1d\x19\x1e\x16\x02\x0f3O+\x16\x03\xabl\xbf\x8eh4\x85\xfe\xa0`\xb8\xaa\x81M@8'\x93+c+RI2\x05\n\x9d\x1f\\\xe5\x01Z\x1eAhS\x92Q>B\xfa>?S2Vhui/\xad\xc1\xfe\xfd\xc7,R0+\t\x1cZ\x03\x0fRkm\x00\x00\x00\x00\x03\x00\x00\xffz\x06\x00\x05\x86\x00+\x00>\x00Q\x00\x00\x002\x16\x17\x16\x15\x14\a\x0e\x01#\"'.\x01'&7567632\x1632\x16\x17\x1e\x01\x15\x14\x06\x15\x14\x17\x16\x17\x16\x17\x1632\x032>\x024.\x02\"\x0e\x02\x15\x14\x17\a7\x16\x12 \x04\x16\x12\x10\x02\x06\x04#\"'\x05\x13&54\x126\x03\xcc\x1a\xa9\x05\x02\x11\x10n/9\x85b\x90LH\x01\x03G\x18\x1c\x06\x18\a\x13\x0f\b\b2E\x05\"D8_\f\n\x0fp\u007f\xe9\xa8dd\xa8\xe9\xfe\xe9\xa8dxO\xf2\x9e\"\x012\x01\x17\xcaxx\xca\xfe\xe9\x99ê\xfe_\x88lx\xca\x022X\t\x05\n!+'5>-\x92pkW\b[C\x16\x03\r\x15\x14\x88\a\x15I\n\a\bI@50\a\xfeOd\xa8\xe9\xfe\xe9\xa8dd\xa8\xe9\u007f˥\xe9Mh\x05fx\xca\xfe\xe9\xfe\xce\xfe\xe9\xcax^\x86\x01\x95\xb2ә\x01\x17\xca\x00\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\x0f\x00\x13\x00\x1b\x00#\x00'\x00+\x00/\x00\x007!5!\x11!5!\x004&\"\x06\x14\x162\x01!5!\x004&\"\x06\x14\x162\x124&\"\x06\x14\x162\x13\x11!\x11\x01\x11!\x11\x01\x11!\x11\x80\x04\x00\xfc\x00\x04\x00\xfc\x00\x06 8P88P\xfa\x18\x04\x00\xfc\x00\x06 8P88P88P88P\x98\xf9\x00\a\x00\xf9\x00\a\x00\xf9\x00\x80\x80\x01\x80\x80\xfd\x98P88P8\x04 \x80\xfd\x98P88P8\x028P88P8\xfd \xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x00\x00\x03\x00\x00\xff\x80\b\x00\x05\x80\x00\a\x00+\x00N\x00\x00\x00 &\x106 \x16\x10\x01!2\x16\x1d\x01\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x01\x14\x163!\x15\x06#!\"&54>\x0532\x17\x1e\x01267632\x17#\"\x06\x15\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02@\x01`\r\x13\x13\r\xfe\xa0\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\xfd L4\x01\x00Dg\xfc\x96y\x92\a\x15 6Fe=\x13\x14O\x97\xb2\x97O\x14\x13\x84U\xdf4L\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfe\x9f\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\x01`\r\x13\x13\r\xfd\xc04L\xee2\x8ay5eud_C(\x11====\x11`L4\x00\x00\x00\x03\x00\x00\xff\x80\a\xf7\x05\x80\x00\a\x003\x00V\x00\x00\x00 &\x106 \x16\x10\x01\x17\x16\x15\x14\x0f\x01\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&54?\x01632\x1f\x017632\x1f\x01\x16\x15\x14\a\x05\a\x06\x15\x14\x1f\x01\x06#!\"&54>\x0532\x17\x16 7632\x17\x0e\x01\x15\x14\x17\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02\xb5\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xfd\x15\xb5%%S\x15\x17\xfc\x96y\x92\a\x15 6Fe=\x13\x14\x9a\x01J\x9a\x14\x13\x1c\x1d\x1c\x1a%\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfd\xdf\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xb5%65%S\x03\x8ay5eud_C(\x11zz\x11\x06\x1b.!6%\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x12\x00\x1a\x00$\x00\x00\x01!2\x16\x15\x11!\x11!\x11!\x1146;\x012\x16\x15\x004&\"\x06\x14\x162!54&#!\"\x06\x15\x11\x01\x00\x06\xc0\x1a&\xff\x00\xfa\x00\xff\x00&\x1a\x80\x1a&\x02@\x96Ԗ\x96\xd4\x05V\xe1\x9f\xfd@\x1a&\x02\x00&\x1a\xfe@\x01\x00\xff\x00\x04\xc0\x1a&&\x1a\xfe\x16Ԗ\x96Ԗ@\x9f\xe1&\x1a\xfe\x80\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00\x16\x00\x19\x00\x00\x01\x033\x15!\a!\x15!\t\x01!5!'!53\x03!\x01!\t\x01\x13#\x06\x00\xc0\xc0\xfe\xee7\x01I\xfee\xfe\x9b\xfe\x9b\xfee\x01I7\xfe\xee\xc0\xc0\x01\x00\x01C\x01z\x01C\xfe\x00l\xd8\x06\x00\xfe@\xc0\x80\xc0\xfc\xc0\x03@\xc0\x80\xc0\x01\xc0\xfd\x00\x03\x00\xfb@\x01\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x12264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xf0\xa0pp\xa0p\x03\x00\xfb\x80\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xc0p\xa0pp\xa0\x01\xd0\x02\x00\xfe\x00\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00+\x00/\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x02264&\"\x06\x14\x01\x11!\x11\x00264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xe2\x84^^\x84^\x02@\xfd\xe0\x03\xfe\x84^^\x84^\x01@\xfd\xc0\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\xfd\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\x00\x00\x00\x00\x04\x00\x00\xff\x8a\a\x00\x05v\x00\x12\x00\x15\x00\x1c\x00(\x00\x00\x01\x11\x14\x06#\"'%.\x015\x114632\x17\x01\x16\x17\t\x02\x11\x14\x06\"'%\x01\x14\x00\a\t\x01632\x17\x01\x16\x02U\x19\x18\x11\x10\xfe/\x15\x1d\x14\x13\x0e\x1e\x01\xff\x03@\x02\x16\xfd\xea\x04k\x1c0\x17\xfeG\x02\x19\xfd\xff,\xfez\x01D\x11#\x0e\f\x02\x1d\x04\x04[\xfbk\x19#\b\xe9\n/\x17\x04t\x14\x1c\x0f\xff\x00\x03g\xfc\x9e\x01\n\x02F\xfb\xe2\x19\x1f\r\xdc\x03\xe5\x03\xfc\xbfG\x02z\x02\x0f\x1c\x06\xfe\xf2\x02\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x0f\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11!\x11\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02\xd7\xfa\x00\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x04\xaa\xfa\x00\x06\x00\x00\x00\x18\x00T\xff\x06\b\xa4\x05\xff\x00\v\x00\x17\x00#\x00/\x00D\x00M\x00\xfc\x01\x06\x01\x12\x01\x1b\x01%\x012\x01<\x01G\x01Q\x01^\x01l\x01w\x01\xb3\x01\xc2\x01\xd9\x01\xe9\x01\xfe\x02\r\x00\x00\x05\x0e\x01\a\x06&'&676\x16\x05\x1e\x01\x17\x16676&'&\x067\x1e\x01\x17\x16654&'&\x06\x05\x0e\x01\a\x06&54676\x16\x013\"\a\x1e\x01\x15\x14\x06#\"'\x06\x15\x14\x163264&7.\x01\a>\x02\x1e\x01\x01\x16\a\x16\x15\x16\x0e\x01\a\x06&'\x04%\x0e\x01'.\x01767&76\x1767&76\x1767476\x176\x17\x16\x175\"'.\x01'&767>\x02\x16\x173\x16\x17\x16\x17>\x017&'&'47.\x01'.\x017676\x16\x17\x14\x1e\x03\x17\x16767&\a76767.\x04'$\x01\x16\x17\x1673>\x03?\x01>\x01\x17\x16\x17\x16\x06\a\x0e\x01\a\x15\x06\a\x06\a\x1e\x01\x1767673>\x01\x1e\x01\x17\x16\x17\x16\a\x0e\x01\a\x06#\x14\a676\x176\x17\x16\x15\x16\x176\x17\x16\a\x16\x176\x01\x14\a\x16\x176&'&\x06\a\x1e\x01\a6767.\x01'\x06\a\"'\x16\x17276&\x0567&54&\a\x0e\x01\x17\x16\x17&671&'\x0e\x01\a\x16\x1767\x06\x0f\x015\x06\x17\x16\x05\x1e\x01\x17\x1e\x017>\x017&\x00\"\x06\x15\x14\x162654\x03&\a5\x06\x16\x17\x1e\x017>\x01&\x05>\x01&'5\x06#\x0e\x01\x16\x17\x1e\x01%\x06\x16\x17\x1667>\x017\x06\a\x16\a\x16\x04\x176$7&74>\x01=\x01\x15.\x01'\x06\a\x06'&'&'\x0e\b#\x06'\x0e\x03\a\x06#\x06'\x06'&'&'&'\x06\a\x16\x0365.\x01'&\x0e\x01\x17\x1e\x01\x17\x1667\x16\x1767.\x01'\x06\a\x14\x06\x15\x16\a\x06\a\x06\a#\x06\x17\x16\x17\x04%&'\x06\a\x06'&'\x06\a#\x152%6767\a65&'&'&7&5&'\x06\a\x16\x056.\x01\a\x0e\x01\a\x14\x17\x1e\x017>\x01\x01\xde\b&\x12\x195\x02\x01R\x1b\x17\x16\x054\a&\x13\x195\x01\x02S\x1b\x16\x169\rW\"-J\x870(/\xfar\rV\"-J\x870(.\x02\xc9\x01)#\x1b\"6&4\x1c\x05pOPpp\xe0c\xf3|\x1bo}vQ\x02\xf2\b\x13\a\x01[\x8060X\x16\xfdQ\xfd\xc4\x17W1V\xbb\x01\x02\x05\x13\b\x06\x19\x0e\x1b\a\t\v\x1c\x1d\x1e\r\x17\x1c#\x1a\x12\x14\v\a5X\v\t\t\x0fN\x02\"&\x1c\x05\r.\x0e\x03\x02\n)\n\x0f\x0f\x17D\x01>q\x1c \x15\b\x10J\x17:\x03\x03\x02\x04\a\x05\x1b102(z/=f\x91\x89\x14*4!>\f\x02S\x015b!\x11%\n\x19\x12\x05\x12\x03\x04\x01\x05\x01\v\x06(\x03\x06\x04\x02!\x1f$p8~5\x10\x17\x1d\x01\x1a\x10\x18\x0e\x03\x0e\x02.\x1c\x04\x12.:5I\r\b\x0f\r\b\x0e\x03~\xfe\xf7T\x8a\n\x13\x03\x0e\x18\x0f\x0e\x0e\x1c\x18\x114~9p# !\x02\n\x02)\x05\f\x01\x05\x01\x05\x03\x12\x05\x12\x18\b&\x11 ?()5F\t\x021\x18\x0f\x04\a\x05\x1c\f\t\x1c\x10\x12\r\t\n\x1c\x1e\x15\b\x03\xaf\x1d\x19 d%{\x1d\x13\x04v*\x85:\r \x0e\x0e@e\x10\x0f\n\x01s|\x03D\x861d \x19\x1d\x12\x04\x13\x1d{\x8b\x1f\x0e:\x85*\x06\x0f\x10dA\x11A|o\x04\x0e\x13\x01Yk\x03'&\x8d\x13\x12\a\b\x14\x83<\x02\x02\x83\xa5tu\xa5\xa5ut\xfe&\x02\x02\x01\x1bv\a\x0e\x01\v\x03HC\xba\x04XX\x13\x01\x03\x14TR\x05\x0f\x02\xc8;w\x19\b\x06\x12\x10\x94\x1d\x02\x82\x17\r\x8d\xc671\u0099\r\x15\x02\x03\x03\x01\x01\x01\x02\a\x01Z*&'\x06\b\r1\x05\b\x06\x05\x03\x02\x02\x01\x01\t\x14\x11\x13\v\x03\x02\x01\x119?\t\b.\r\r\x1d$\x06\x04\x02\xfd\x84\x0e\x10Gv\v\f5k65P\x02\x02<\xdc?8q=4\x88a\x04\t\x01\x06\x02\x12\x13\x17\v\r\vSC\"\xcd\x15\x15\x931#\x16\x03\x03\x15\x1c<\x80\x01/6B&!\x01ML\b\x11\t\x18\x14\x12\x04\x05\x04\b\xbe^;\x8c6k5\f\vwF\x10\x0e1<\x02\x02P\x00\x00\x03\x00\x00\xffC\t\x01\x05\xbd\x00\a\x00\x0f\x00;\x00\x00$\x14\x06\"&462\x04\x14\x06\"&462\x01\x1e\x05\f\x0132\x1e\x04\x0e\x03\a\x06\a>\x05.\x03\a\x06$.\a\x05\xf4`\x88aa\x88\xfdsa\x88``\x88\xfdZ9k\x87\x89\xc3\xcd\x01'\x019؋ӗa-\x03*Gl|M\xb9e\x1d_]`F&\fO\x9a\xfe\xb1\xa8\xfe\xdcܽ\x82sDD!/+\x88``\x88aa\x88``\x88a\x051\x0154&'\"&#!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\x9f\x1f\x17\b\n\x99\x99\n\b\x17\r\x1e\x17\x03\f\x8b\x8b\x03\v\x01\x17\xfbi\xe4LCly5\x88)*\x01H\x02\xcacelzzlec0h\x1c\x1c\u007f\xb7b,,b\xb7\u007fe\x03IVB9@RB\x03\x12\x05\xfe9\x01\xebJ_\x80L4\xf8\x004LL4\b\x004L\x0244%\x05\x02\x8c\x02\x05\xaf2\"\x04\x01\x81\x01\x04\xe0\x014\xfe\xcc:I;p\x0f\x10\x01\x01!q4\a\bb\xbab\b\a3p\f\x0f\x02\x02\x06(P`t`P(\x06\x04\x8e6E\x05\x03\bC.7B\x03\x01\xfe\x02I\x036\xfb\x004LL4\x05\x004LL\x00\x00\x05\x00\x00\xff\x80\t\x00\x05\x80\x00\x05\x00\v\x00\x1a\x00.\x00>\x00\x00\x01\x11\x0e\x01\x14\x16$4&'\x116\x00\x10\x02\x04#\".\x0254\x12$ \x04\x014.\x02#!\"\x04\x02\x15\x14\x12\x043!2>\x02\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03Zj\x84\x84\x02b\x84jj\x01[\x9d\xfe\xf2\x9fwٝ]\x9d\x01\x0e\x01>\x01\x0e\x02\x1co\xb8\xf3\x83\xfeӰ\xfeٯ\xae\x01*\xae\x01-\x81\xf5\xb8o\x01XL4\xf8\x004LL4\b\x004L\x01'\x02\xb5)\xbd꽽\xea\xbd)\xfdJ)\x01\xd1\xfe\xc2\xfe\xf2\x9d]\x9d\xd9w\x9f\x01\x0e\x9d\x9d\xfeL\x8b\xf5\xa6`\xa2\xfeֺ\xab\xfe۪e\xa9\xec\x03\x06\xfb\x004LL4\x05\x004LL\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x1f\x00;\x00\x00\x05\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15#54&#!\"\x06\x15\x11\x14\x16;\x01\x15#\"&5\x11463!2\x16\x06\x80\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x80^B\xfb\xc0B^^B\x04@B^\xfe\x80\x80\x13\r\xfb\xc0\r\x13\x13\r\xa0\xa0B^^B\x04@B^`\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x01>\xa0\xa0\r\x13\x13\r\xfb\xc0\r\x13\x80^B\x04@B^^\x00\x00\x06\x00\x00\xff\x00\b\x80\x06\x00\x00\x02\x00\x05\x005\x00=\x00U\x00m\x00\x00\t\x01!\t\x01!\x01\x0e\x01\a\x11!2\x16\x1d\x01\x14\x06#!\"&=\x01463!\x11.\x01'!\"&=\x01463!>\x012\x16\x17!2\x16\x1d\x01\x14\x06#\x04264&\"\x06\x14\x01\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x05\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x06\xc0\xfe\x80\x03\x00\xf9\x80\xfe\x80\x03\x00\x01\xb5\x0e?(\x02`\x0e\x12\x12\x0e\xfa\xc0\x0e\x12\x12\x0e\x02`(?\x0e\xfe\x15\x0e\x12\x12\x0e\x01\xeb\x15b|b\x15\x01\xeb\x0e\x12\x12\x0e\xfd?B//B/\x04\x90]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\xfb\x00]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\x04@\xfd@\x02\xc0\xfd@\x03\x80(?\x0e\xfa\xf5\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x05\v\x0e?(\x12\x0e@\x0e\x129GG9\x12\x0e@\x0e\x12\x10/B//B\xfcaItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\vItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00M\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x0e\x03\x15!4.\x02'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13M\x90sF\x04\x00Fs\x90M\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00?\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x114.\x02'#\x0e\x03\x15\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00\t\x03\xee\tDq\x8cL\xe6L\x8cqD\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12B>=\xfaC\x82\xef\xb1\u007f\x1f\x1f\u007f\xb1\xef\x82\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00;\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x03.\x01'#\x0e\x01\a\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00U\x03VU96\xb7g\xe6g\xb76\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12β\xb2\xfc\x0e\x8d\xc9**ɍ\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00G\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x06\a!&'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13\x89k\x02\xbck\x89\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a3\x91\x913\a!(!\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x0f\x009\x00I\x00\x00\x052\x16\x1d\x01\x14\x06#!\"&=\x014637>\b7.\b'!\x0e\b\a\x1e\b\x17\x132\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xe0\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0eb\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03\x04\xfc\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03b\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e@\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12@7hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh77hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh7\x06\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x00\x00A\x00j\x00\x00\x01\"\x06\x1d\x01#54&#\"\x06\x15\x11'54&#\"\x06\x1d\x01\x14\x17\x01\x16\x15\x14\x163!26=\x0147\x136=\x014&#\"\x06\x1d\x01#54&'&#\"\x06\x1d\x01#54&'&'2\x17632\x16\x17632\x16\x1d\x01\x14\a\x03\x06\x15\x14\x06#!\"&5\x01&=\x014632\x17>\x0132\x176\x03\x005K @0.B @0.B#\x016'&\x1a\x02\x80\x1a&\nl\n@0.B 2'\x0e\t.B A2\x05\bTA9B;h\"\x1b d\x8c\rm\x06pP\xfd\x80Tl\xfe\xccL\x8dc\v\x05\x06\x8b_4.H\x04\x80K5\x80]0CB.\xfeS\x1e\xac0CB.\xe0/#\xfe\xd8'?\x1a&&\x1a\x19)$\x01\xb4$)\xf60CB. }(A\b\x02B.\x80z3M\x05\x01\x802\"61\a\x8fd\xf639\xfeL\x18/PpuT\x01(If\xe0c\x8d\x01_\x82\x15E\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06`\x06\x00\x001\x00X\x00\x00\x00\"\x06\x15\x11#\x114&\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x1365\x114&\"\x06\x15\x11#\x114&\"\x06\x15\x11#\x114&2\x16\x17632\x16\x1d\x016\x16\x15\x11\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x114632\x176\x03\x9e\\B B\\B\x9a&@5K\x1a\x01\x80&@\x02\xb0\"6\aL\x05B\\B B\\B \xb4\x88s\x1f\x13\x17c\x8di\x97\bL\x0e}Q\xfdP\x01\x03%&#\"\x06\x15\x14\x16\x17\x05\x15!\"\x06\x14\x163!754?\x01\x0327%>\x015\x114&#!\a\x06\x15\x11\x14\x1626=\x013\x15\x14\a\x1e\x01\x15\x14\x06\a\x05\x041\xb1\xa3?\x17>I\x05\xfe\xfbj\x96\x96jq,J[\x96j.-\x02t\x01\x91j\x96lV\xfe\xad\\\x8f\x9b\xa3\x1e$B.\x1a\x14\x01R1?\x01@B.\x1a\x14\xfe\xde\x1c\x12+\x10\x10?2\x14\x12\x01`\x1e$\xe8\xfdv\x18\x165K-%\x02\x0e\xfd\x805KK5\x02\x17\xe9.olRI\x01S+6K5\xfë$B\\B 94E.&\xfeʀ\x8d15\x05\x1euE&\n\x96Ԗ\x11\x1c\x83Pj\x96\x11\xef\x96j\xfddX\x8b\x15U\x17\x02\xc7GJ\x0e7!.B\n\x9a\nP2\xff\x00.B\n\x84\r\b\x1a\x15%\x162@\t\xa0\x0e7\x03\x11\xf8\bK5(B\x0e\xc8@KjKj\xc6?+f\xfc\x00\x13U\vE,\x02\x9c5K~!1\xfe\xd8.>F.\xd0\xd0F,\bQ5*H\x11\x8d\x00\x00\x00\x00\x02\x00\x00\xff\x00\b\x00\x06\x00\x00$\x00b\x00\x00\x012\x16\x17\x01\x16\x15\x11\x14\x06#!\"&=\x01%!\"&=\x01463!7!\"&'&=\x01463\x01\x114'\x01&#!\"\x06\x15\x14\x1e\x01\x17>\x013!\x15!\"\x06\x15\x14\x17\x1e\x013!32\x16\x15\x14\x0f\x01\x0e\x01#!\"\x06\x1d\x01\x14\x163!2\x17\x05\x1e\x01\x1d\x01\x14\x163!26\x04\u007f=n$\x02\x0132\x16\x17\x1b\x01>\x0132\x16\x17\x1e\x01\x15\x14\a\x03>\x0532\x16\x15\x14\x06\a\x01\x06#\x03\"\x06\a\x03#\x03.\x01#\"\x06\x15\x14\x17\x13#\x03.\x01#\"\x06\x15\x14\x17\x13\x1e\x01\x17\x13\x1e\x013!27\x01654&#\"\a\x0554\x1a\x017654&#\"\x06\a\x03#\x13654&\x01\xcbMy\x13e\r\x05t\a|]\x11\x83WS\x82\x14Sg\x14\x82SY\x85\x0e\\x\a{\n7\x160\"1\x19i\x9692\xfe\x05DU1&=\t\xa4\u007f\x91\t=&0@\x03\x84\x1ac\t>&/B\x03t\a\x04\bd\b4!\x02\xb6*\"\x01\xfb8K4+\"\xfe\xcd@H\x03\x04@/'=\tt\x1a\x96\x03?\xff\x00_K\x01\x9193-\x16\x01\xdd\x1b\x1e]\x88\nUlgQ\xfe\xa4\x01\xacQgsW\n\x8a]\x18#\xfe\x00\a+\x10\x1e\v\v\x94i>p&\xfe\x843\x06\x800&\xfdV\x02Z&0B/\x0f\r\xfd\xdd\x01\x98%3B.\x0e\f\xfe\"\x1ct\x1e\xfeo )\x1a\x01{+C4I\x1a\xe6\xe3\x04\x01\f\x01(\r\x12\v/D0&\xfe\x1e\x02p\x0e\x0e0D\x00\x05\x00\x00\xff\x00\x06\x80\x06\x00\x003\x00[\x00_\x00c\x00g\x00\x00\x01\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x136=\x014&\"\x06\x15#54&#\"\x06\x1d\x01#54&#\"\x06\x1d\x01#\x114&'2\x16\x1d\x01632\x17632\x17632\x16\x1d\x01\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x1146\x13\x11#\x11!\x11#\x11!\x11#\x11\x02\x805K\x97)B4J\x1a\x01\x80&@\x02\xce\x16#\x05\\\x188P8 @0.B J65K J6k\x95\x16\ncJ/4qG\x1b\x1d^\x82\x1c\\\x10hB\xfd2.\xfe\xd81!~K5\x03y\x17?\xa3\xb1^\\\xfe\xadVl\x96j\x01\x91\x02t-.j\x96[J,qj\x96\x96j\xfe\xfb\x05I7$\x1e\xa3\x9b?1\x01R\x14\x1a.B\x87\x10\x10+\x12\x1c\xfe\xde\x14\x1a.B$\x1e\x01`\x12\x142?\x01g\x16\x18\xfdvEo.\xe9\x02\x175KK5\xfd\x80\x02\x0e%-K\xfa\xeb6+\x01SIR[\xfe\xca&.E49 B\\B$\x88\xfe\xcc5K\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\xb4\x04\x00\x00\x19\x00G\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!2\x16\x05\x13\x16\a\x06+\x01\"&'\v\x01\x06+\x01\"'\v\x01\x0e\x01+\x01\"'&5\x13>\x01;\x012\x17\x13\x16\x17>\x017\x136;\x012\x16\x03Y\x13\r\xfe\xd6\x12\r\x87\r\x13\xfe\xd7\r\x13\x12\x0e\x03\x19\r\x13\x04\x0eM\x01\t\n\r\x86\f\x12\x01.\xbd\b\x15x\x14\t\xbc-\x01\x12\f\x87\r\n\tN\x01\x12\f\x8e\x14\t\xdc\n\n\x03\r\x04\xdd\t\x14\x8d\r\x12\x03\xe0u\r\x12\xfc\xd4\r\x13\x12\x0e\x03,\x12\ru\x0e\x12\x13\n\xfc?\r\v\n\x11\f\x02L\xfeW\x13\x13\x01\xab\xfd\xb2\f\x11\n\n\x0e\x03\xc1\f\x11\x13\xfd\xf8\x18\x1b\a#\t\x02\b\x13\x11\x00\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\t\x00*\x00:\x00J\x00\x00\x014'&+\x01\x11326\x17\x13\x16\a\x06+\x01\"'\x03#\x11\x14\x06+\x01\"&5\x11463!2\x17\x1e\x01\x15\x14\x06\a\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\x12UbUI\x06-\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\x01ڎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03AX!\x12\xfe\xe7J\xd9\xfe\x8b\x11\x0e\x10\x11\x01m\xfe\xa2\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x18\x1f\x9cf\\\x93$\n\x036u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\xfeK\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00[\x00k\x00{\x00\x00\x01276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16!276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x02]\x99h\x0e\v-\x06\x12\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x94\xc4\xc2\x03\f\x99h\x0e\n-\b\x11\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x93\xc5\xc2'\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\xfd\xa4\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01/h\x12\x12R\r\x04\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbfh\x12\x12R\x0e\x03\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbf\x041u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\x01\x15\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x00\x00\x02\x00@\xff\xe0\a\xc0\x05 \x00\v\x00\x17\x00\x00\t\x04\x17\a'\t\x017\t\x03'7\x17\t\x01\a\x01\a\x01\x02\xe0\x01\x80\xfe\x80\xfd`\x02\xa0\xa8`H\xfe \x01\xe0\xc1\xfe\xdf\x02\xa0\x02\xa0\xfd`\xa8`H\x01\xe0\xfe \xc1\x01!`\xfe\x80\x02\xe0\xfe\x80\xfe\x80\x02\xa0\x02\xa0\xa8`H\xfe \xfe \xc1\x01\x1f\x02\xa0\xfd`\xfd`\xa8`H\x01\xe0\x01\xe0\xc1\xfe\xe1`\x01\x80\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00\x17\x00'\x00\x00%\t\x01\a\x17\a\t\x01\x177'\t\x057'7\t\x01'\a\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x02\xcd\x01\x0f\xfe\xe9X\xc0`\xfe\xe9\x01\x17(W\u007f\xfe:\x03,\x01\xc6\xfe:\xfe\xf1\x01\x17X\xc0`\x01\x17\xfe\xe9(W\x03L\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xb6\x01\x0f\x01\x17X\xbf`\x01\x17\x01\x17(W\x80\xfe:\xfeB\x01\xc6\x01\xc6\xfe\xf1\xfe\xe9X\xbf`\xfe\xe9\xfe\xe9(X\x01\xf9\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\n\x00\x00\xff\xdc\t\x00\x05$\x00\v\x00\x13\x00\x1c\x00%\x00/\x009\x00E\x00S\x00[\x00\x80\x00\x00\x01\x14\x06#\"&54632\x16$\x14\x06\"&462\x054&\"\x06\x14\x1626$4&#\"\x06\x14\x162%\x14\x06#\"&462\x16$\x14\x06#\"&4632\x00\x10\x00#\"\x0e\x01\x14\x1e\x0132\x01&! \a2\x1e\x02\x154>\x02\x00\x10\x00 \x00\x10\x00 \x13!\x0e\x01\a\x16\x15\x14\x02\x04#\"&'\x06\a.\x01'\x0e\x01#\"$\x02547.\x01'!6$32\x04\x02\x8b7&'77'&7\x04\x827N77N\xfc'q\xa0qq\xa0q\x04\x81qPOrq\xa0\xfcE\xa3st\xa3\xa4\xe6\xa3\x04\x82\xa3ts\xa3\xa3st\xfc\xdf\xfe\xf1\xbf}\xd4||\xd4}\xbf\x03\xab\xfe\xfe\xd2\xfe\xc1\xfeuԙ[W\x95\xce\x02Q\xfe\xf2\xfe\x82\xfe\xf1\x01\x0f\x01~\x04\x01\u007f,>\tn\x9a\xfe\xf8\x9b\x85\xe8P/R\vU P酛\xfe\xf8\x9an\t>,\x01m\x95\x01\x9c\xe2\xe0\x01\x8a\x02\x1b'77'&77\x02N77N6^Orq\xa0qq\x01\xa0qq\xa0q\xc0t\xa3\xa4棣\x01棣\xe6\xa3\xfe(\x01~\x01\x0f|\xd5\xfa\xd5|\x04\von[\x9a\xd4usј^\xfd\a\x01~\x01\x0f\xfe\xf1\xfe\x82\xfe\xf1\x04\x043\u007f3\x97\xba\x9c\xfe\xf8\x99pc8{\x16y%cq\x99\x01\b\x9c\xba\x973\u007f3dqp\x00\x03\x00f\xff\x00\x04\x9a\x06\x00\x00\t\x00\x13\x00L\x00\x00\x00 \x0054\x00 \x00\x15\x14\x00\"\x06\x15\x14\x162654\x01\x1e\x01\x0e\x02\a\x06\a\x17\x01\x16\x14\x0f\x01\x06\"'&'\x01\x06\"/\x01&47\x017&'.\x0367>\x02\x16\x17\x1e\x04326?\x01>\x01\x1e\x01\x03<\xfe\x88\xfe\xf6\x01\n\x01x\x01\n\xfe\x96\xb8\x83\x83\xb8\x83\x01,\r\x04\r(-'s\xc8I\x01\v\x1e\x1e\f\x1fV\x1fC\xc8\xfe\xf5\x1fV\x1e\f\x1f\x1f\x01\vH\xcbr'-(\r\x04\r\n$0@!\x05\x14BHp9[\xa6%&!@0$\x02u\x01\n\xbb\xbc\x01\n\xfe\xf6\xbc\xbb\x01\x9b\x83]\\\x83\x83\\]\xfd\xa7\x1b-$)!\x19I\x15H\xfe\xf5\x1fV\x1e\r\x1e\x1eD\xc8\xfe\xf4\x1e\x1e\r\x1eV\x1f\x01\vH\x15I\x19!)$-\x1b\x14\x1e\x0e\x12\x1a\x04\x0e#\x1a\x163\x19\x19\x1a\x12\x0e\x1e\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x006\x00>\x00N\x00\x00\x00\x14\x06\"&462\x01.\x01\x06\a\x0e\x02\"&/\x01.\x01\x06\a\x06\x16\x17\x16\x17\a\x06\a\x06\x14\x1f\x01\x162?\x01\x16\x17\x162?\x0164/\x0267>\x01\x02\x10& \x06\x10\x16 \x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9f]\x84]]\x84\x013\n$;\x1f\n&|\x82v\x1b\x1b\x1f;$\n\x16(CS\x8f3\x8e1\x16\x16\t\x16=\x16\xbfrM\x16=\x16\t\x16\x16\xbf4\x8dTC(G\xbe\xfe\xf4\xbe\xbe\x01\f\x02z\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfe\x84]]\x84]\xfd\xf6\x14\x18\x05\x19\b\x18($\x12\x12\x19\x05\x18\x14-;,5\x0e4\x8e0\x16=\x16\t\x16\x16\xbfsL\x16\x16\t\x16=\x16\xbe4\x0e5,;\x01\x12\x01\f\xbe\xbe\xfe\xf4\xbe\x01\xe8\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\xb8\x05\x80\x00\x12\x00(\x00\x00\x012\x16\x15\x11\x14\x02\x06\x04#\"$&\x025\x11463\x0127\x01654&#\"\a\t\x01&#\"\x06\x15\x14\x17\x01\x16\x06\x1dAZ\x88\xe5\xfe\xc1\xaf\xb0\xfe\xc1\xe6\x88\\@\x02\xc1/#\x01\x94%E1/#\xfe\xbd\xfe\xbd#.1E$\x01\x95!\x05\x80[A\xfd\xf9\xb0\xfe\xc0懇\xe6\x01@\xb0\x02\a@\\\xfb\xd8!\x01\x84#21E!\xfe\xca\x016!E13\"\xfe|!\x00\x00\x00\x01\x00\x00\xff\x98\t\x00\x05g\x00L\x00\x00\x05\x01\x06\x00\a\x06&5&\x00'.\x02#4&5!\x15\x0e\x02\x17\x16\x00\x176\x127&\x02'&'5\x05\x15\x0e\x01\x17\x1e\x01\x17676&'6452>\x013\x15\x0e\x01\a\x03\x16\x12\x17\x01.\x02'5\x05\x17\a\x06\a\x00\a\x05\xd6\xfe\xd9\x19\xfe\xf5A\x015R\xfe\xa5V\x15[t,\x01\x02G'Q4\x10\x1a\x01}-\x1f\xda\x16\x13\xd6\x1d&\xa3\x02\x01r!\xd5\r\xe5\a\x01\xb9\x0eG;\x1a\x01\xcc\x01\x01\x8b>\xfd\xf2!g\x02\xb71\xfd\xff\x85\x01\x01\x01\xc1\x03\x14\xca2sV\x05&\b2\x02\x1c:#;\xfc\x90d=\x01\x9b*'\x01\xe45E\x022\x01/\x02..F\xefD֕71\x02\a$\x06\x01\x011\x02>2\xfeF!\xfd\xfe\x11\x03\xf9&1\x0e\x012\x04\x02,\x04\x8d\xfb@K\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x18\x00r\x00\x82\x00\x92\x00\x00\x01\x14\x06#\"&5462\x16\x17\x01\x0e\x04\a\x01>\x04%\x14\a.\x02#\"\x15\x14\x17\x0e\x01\a'&#\"\x06\x1f\x01\x06#\"'>\x0254#\"\x0e\x01\a.\x01'7654&\x0f\x01&547\x1e\x023254&/\x01>\x017\x17\x16326/\x01632\x17\x06\x15\x14327\x1e\x01\x17\a\x06\x15\x14\x16?\x01\x1e\x01\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb5!\x19\x1a&\"2&\x0f\x01^\tu\x86\x8b_\x03\xfe\xa3\ax\x84\x8c^\x02\x8ah\x03\x1c\x19\x04\r;J݃\x10\x01\x0e\x05\x06\x01\x10HJǭ\x01\x18\x13\r\x06\x16\x17\x02q\x9e\x1fE\n\v\x05D\x0em\x02!\x1b\x04\r\x19\x14\x14M\xe0\x84\x0f\x02\r\x05\x06\x01\x0fG?̯'\f\v%o\x99\x1f8\n\v\x049\x0eU\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x01(\x01F\x01(\xd6ߎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x02\x83\x1a&!\x19\x1a&!S\x02E\bm|\x82[\x06\xfd\xbc\an{\x83[<ɪ\x02\x12\x0f\r\n\"p\x9d C\n\v\x04D\x0fi\x02%\x1e\x04\r\x1d(\x03K\xe1\x84\x0f\x03\f\x05\x06\x01\x0fHCέ\x01\x16\x10\f\x06\x13\f\fp\x9a\x1eC\n\v\x05B\rm8\t\r@Kނ\f\x02\x0e\x05\x06\x01\rH\xe7\x01F\x01(\xd6\u007f\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x02\x81\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x01\a\x00\x06\x00\x00\v\x00\x16\x00\"\x00*\x00\x00\x016\x17\x16\x17%&\x04\a\x016$\t\x01\x16\x047\x03&$\x025\x10%\x16\x12\x02\x06\a\x06%\x016\x02'$2\x16\x14\x06\"&4\x03}\xf0\xd3\xe8x\xfd\x1a\xa0\xfe\xf43\xfe\xec\x80\x01n\xfd\xdd\x01QH\x01\x16\x9a\xe6\xd4\xfe\xa6\xc7\x06\xc4:\x03dΏ\xe6\xfe\xf4\x01\x95X\ve\xfe8\xfa\xb1\xb1\xfa\xb1\x06\x00\x02z\x86\xee'\t\xa7\x92\x01\xa8\x9f\xad\xfel\xfdi\x8f\x94\x1d\xfe=!\xf9\x01\u007f\xdc\x01\v7\x96\xfe\xbf\xfe\xdd\xfdS\x85\x0e\x02o\x83\x01?v\x06\xb1\xfa\xb1\xb1\xfa\x00\x00\x01\x00\x02\xff\x00\a\x00\x05\xc9\x00M\x00\x00\x01 \x00'&\x02\x1a\x017\x03>\x01\x17>\x017\x0e\x01\x17\x1e\x03\x17\x16\x06\a\x0e\x02\a\x17'\x06\x1e\x027>\x02\x17\x1e\x01\a\x0e\x04'\x0e\x01'\x1e\x01>\x0276.\x01'\x1e\x01\x176\x02'\x04\x00\x13\x16\x02\x0e\x01\x04\x03\x87\xfe\xe5\xfeEl:\x12F\x98g\v\vr\r*\xedt6\x83\a\x19K3U\b\x0f\v\x19\x05\x17Z8\x0f\x8b\x12\x153P)3^I%=9\t\x01\x03\x0e\x16)\x1a<\xa9}J\xb1\xa0\x95k\x1b+\bC-Wd\x1b\x0f\x91\x89\x01\t\x01&\x04\x02U\xa2\xd8\xfe\xe9\xff\x00\x01-\xf8\x83\x01T\x01E\x01+]\xfe\xe7\x0e\x03\x11Qr\x02-\xcf<\b\v\x04\x04\x01\x05Q#\a\x170\n\xbdC+M8\x1b\a\t3'\x02\x04:$\x02\a\x12\r\b\x03_Q\v=+\x1fIf5[ˮ&&SG\xaa\x01ZoM\xfek\xfe\xc5\u007f\xff\x00ܬc\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x007\x00\x00\x01&#\"\x04\a\x0e\x01\a\x15\x1e\x01\x17\x16\x04327\x06\x04#\"'&$&\x0254\x126$;\x01\x16\x04\x01\x14\x02\a\x06#\"'6\x1254\x02'632\x17\x16\x12\x05ե\u009b\xfe\xecfKY\x04\x04YKf\x01\x14\x9b¥y\xfeͩ\x1d\x0e\xaf\xfe\xc4䆎\xf0\x01L\xb6\x03\xa8\x011\x01\xa4\x9a\x88hv\x89v\x9a\xc7ƚw\x87wk\x87\x97\x05\x1cn\x92\u007f]\xfa\x8d*\x8d\xfa]\u007f\x92nlx\x01\b\x94\xee\x01D\xb1\xb6\x01L\xf0\x8e\x01w\xfc\xf8\xc0\xfe\xab~?T8\x01b\xe4\xe3\x01b9SA}\xfe\xac\x00\x00\x00\x04\x00\x00\xff\x10\a\x00\x05\xf0\x00+\x005\x00?\x00F\x00\x00\x01\x14\a!\x14\x163267!\x0e\x01\x04#\"'\x06#\"\x114767\x12%\x06\x03\x12\x00!2\x17$32\x1e\x02\x15\x14\a\x16\x034&#\"\a\x1e\x01\x176\x01\x14\x16327.\x01'\x06\x01!.\x01#\"\x06\a\x00\a\xfb\x81۔c\xad2\x01\xa78\xe5\xfeΨ\xbb\xa9\xe4\xa6\xed-\x11\\\xc7\x01\x14\xb8\xf3?\x01\xb9\x01\x19\x1e\x0f\x00\xff\xb2@hU0KeFjTl\x92y\xcbE3\xf9\xc6aVs\x97z\xb7.b\x01\xf8\x02\xd8\x05؏\x90\xd7\x02W80\x92\xc5]T\x9f\xf4\x85St\x01\as\xa0<\xa9\x01h\xf6O\xfe\xed\x01\x12\x01_\x01u\x1a7bBt\xaa\xb6\x01\xb0SbF/\xa9o\x87\xfb|V]SHކ\xcd\x02J\x8e\xbe\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x003\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\"&=\x01463!5!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd \x01`\x0e\x12\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x01`\xfd B^^B\x06@B^\x01 \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@B^\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80^B\x03\xc0B^^\x00\x00\x00\x00\x02\x00\x16\xff\x80\x06\xea\x05\x80\x00\x17\x00>\x00\x00\x133\x06\a\x0e\x03\x1e\x01\x17\x16\x17\x16\x17\x16\x17!\"&5\x1146)\x012\x16\x15\x11\x14\x06+\x016\x03\x05\x0e\x03\a\x06'.\x02'.\x0167>\x0176\x1e\x03\x17%&\x8a\xc5F8$.\x0e\x03\x18\x12\x13\x04\x023\x1e9_\xfe\xf00DD\x04\xe8\x0140DD0\xb2\xd4\x10\xfe+\x02\x14*M7{L *=\"#\x15\n\x12\x14U<-M93#\x11\x01\xd4D\x05\x80@U8v\x85k\x9d_Y\x13\t\xee[\xabhD0\x05\x180DD0\xfa\xe80D\xd2\x01ce-JF1\f\x1aB\x1bD\xbe\xa3\xa3\xc8N&)@\r\f\v\x17/1 d\xaf\x00\x00\x00\x00\x04\x00\x0e\xff\x00\x05y\x06\x00\x00%\x00F\x00\xab\x00\xc5\x00\x00\x05\a\x06\a\x06#\"'&'&'&'&76\x17\x16\x15\x16\x17\x16\x17\x16\x17\x163276?\x016\x17\x16\x17\x16\x01\a\x17\x16\a\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&7632\x1f\x0176\x17\x16\x05\x14\a\x06\a\x0e\x01\"&'&'&5#&76\x17\x16\x173\x11567632\x16\x15\x14\x06#\"'&76\x1f\x01\x1e\x0132654'&#\"\a\x06\x15\x11\x1632>\x0254'&#\"\a\x06\x0f\x01\x0e\x02'.\x015\x11463!2\x14#!\x113>\x017632\x16\x17\x16\x17\x16\x03\x16\x14\x06\a\x06#\"'&'&#\"\a\x06'&767632\x17\x16\x05y\x06q\x92\x9a\xa3\xa5\x98\x94oq>*\f\x0443\x05\x01\x12\x1c2fb\x80\x84\x90\x8f\x85\x80a\x06\n\x0f\f\x15$\xfe\x15B?\x15\x1c\x11\x0f\n\t>B\x05\n\x0f\x10\x02\x12\bBB\x10\x1e\x12\r\x06\aAA\x12\x1e\x1b\x01\xc7.-QP\xd6\xf2\xd6PR+\x0f\x01\t42\n%<\x01\x03ci\x94\x93\xd0ђ:6\x1c\x0f\x10\x1c\x0e\x0e&\vh\x90HGhkG@n\x84`\xb2\x86I\x8d\x8c\xc7Ȍ5\x18\x02\b\n!\x16\x15\x1f\x15\x11\x03m\x1e\x1e\xfc\xd5\x01(|.mzy\xd6PQ-.\x1f\t\v\v\x1a\r\t\aje\x80\x94\x85\x81\x1b\x12\t\x01\x03\r\x82\xa9\xa4\x98\x89\v\x06q>@@?pp\x92gV\x1c\b\b\x1c\x01\x03ZE|fb6887a\x06\n\x04\x03\x13%\x02RB?\x15\x1c\x11\n=B\x05\x10\x02\x0f\x0e\a\nAB\x10\x1d\x12\x05BA\x11\x1e\x1bJvniQP\\\\PRh!\a\x1b\x11\x10\x1ccD\x01S\x02\x88`gΒ\x93\xd0\x10\v23\b\x03\x03\x06\x8fgeFGPHX\xfecCI\x86\xb0_ƍ\x8c\x8c5\"\x02\v\t\n\b\x05\x17\x0f\x02\xa8\x0f\x17n\xfe\x1d*T\x13.\\PQip\x01\xd0\b\x14\x10\r\x1a\a[*81\n/\x19\r\x10\x049@:\x00\x00\x04\x00\x1d\xff\x00\x06\xe1\x06\x00\x00\x1b\x00>\x00t\x00\x82\x00\x00%6\x16\x14\a\x0e\x04#\".\x03'.\x01>\x01\x16\x17\x16\x17\x04%6%\x16\x06\a\x06\a\x06&7>\x01'.\x03\x0e\x02#\x0e\x03*\x02.\x01'&676\x16\x01\x14\x1e\x02\x1f\x01\a.\x01/\x01&'\x0e\x03.\x0254>\x05754'&#\"\x0e\x03\a%4>\x0332\x1e\x03\x15\x01\x14\x17\x167676=\x01\x0e\x03\x06\x0f\x0f\x16\x0f\r>\x81\x99\xdfvw\ued25d\"\b\x04\x06\n\r\x05\xc0l\x01\x85\x01\x9a\xbe\x01\x98\v\x11\x14\"3\x11\x12\t\x15/\x11\x05\x15!\x1a,\x13+\x01\x06\x0e\b\t\x05\x06\x03\x03\x01\x01\x06j2.|\xfe\x84\x1b%&\x0e\r\xe3(N\x13\x13\v\x0e&w\x88\x90\x83h>8X}x\x8cc2\x15\"W\x06\x15<4<\x12\xfe\xda,Z~\xb1fd\xa2aA\x19\xfd`FBIT\x1e\x0e;hmA<\x06\x06\x1d\x13\x107QC1>[u])\t\x0f\t\x05\x01\x04u1\xb0V(\xd2\x10k1S)\x0e\n\x13-\x99\x16\a\t\x03\x02\x02\x02\x04\x01\x01\x01\x01\x01\x02\x02\x100\x06\a\f\x01\xa9\x1fB2*\v\v\xe0%M\x14\x14\v\x16;W(\x060S\x8f[T\x8c]I)\x1c\t\x02\u007fA 5\x02\x16%R7\x1b&\x1a\x80\x1a&T\x01\xa8\x01,\xfe\xd4\xfeX\xfe\xd4\x02\x00\x0e\x12\x12\x0e\x92\xce\x12\x1c\x12\xa9\x01\xc0\x0f\xfdq\x1a&&\x1a\x02\x8f\x041\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8L\x12\x1c\x12Β\x0e\x12\x12\x0ew\xa9\x00\x00\x00\x00\x03\x00%\xff\x00\x06\xdb\x06\x00\x00\x1b\x00%\x00;\x00\x00\x01\x16\x14\x0f\x01\x06#!\"&5\x11463!546;\x012\x16\x1d\x01!2\x17\x01!\x11\x14\x06+\x01\"&5\x012\x16\x15\x11\x14\x06#!\"/\x01&4?\x0163!5!\x15\x06\xd1\n\n\x8d\x1c(\xfa\xc0\x1a&&\x1a\x02@&\x1a\x80\x1a&\x02\x00(\x1c\xfc\xbc\x01\x00&\x1a\x80\x1a&\x03@\x1a&&\x1a\xfa\xc0(\x1c\x8d\n\n\x8d\x1c(\x02\x00\x01\x00\x04\xd7\n\x1a\n\x8d\x1c&\x1a\x01\x00\x1a&@\x1a&&\x1a@\x1c\xfb\xdc\xfe\x00\x1a&&\x1a\x03\xc0&\x1a\xff\x00\x1a&\x1c\x8d\n\x1a\n\x8d\x1c\xc0\xc0\x00\x04\x00\x00\xff\x00\b\x00\x05\xfb\x00\x1b\x00\x1f\x00#\x00'\x00\x00\x01\x16\x15\x11\x14\x06\a\x01\x06'%\x05\x06#\"'&5\x11467\x016\x17\x05%6\x05\x11\x05\x11%\x11%\x11\x01\x11\x05\x11\a\xe4\x1c\x16\x12\xfd\x80\x18\x18\xfd\x98\xfd\x98\n\x0e\x13\x11\x1c\x16\x12\x02\x80\x18\x18\x02h\x02h \xfb\x18\x02@\xfb`\x02 \x04\xe0\xfd\xe0\x05\xf5\x14!\xfa\x80\x14 \a\xff\x00\v\v\xf6\xf6\x05\v\x14!\x05\x80\x14 \a\x01\x00\v\v\xf6\xf6\r\x9a\xfb\n\xe6\x04\xf6\r\xfb\n\xd9\x04\xf6\xfa\xfd\x04\xf6\xd9\xfb\n\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00#\x005\x00\x00\x012\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x17\x01\x16\x15\x11\x14\x06#\"'\x01&5\x1146\x02\x00\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\x04\xe8\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\xfb\xa8\b\x06\x02\x00\x12\x13\r\b\x06\xfe\x00\x12\x13\x06\x00\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x03\xff\x00\n\x13\xfa@\r\x13\x03\x01\x00\n\x13\x05\xc0\r\x13\x00\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x008\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'&7>\a7.\x0154\x12$ \x04\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\x01\xcb\xf0\xfed\xf4ne\xad\xfe\xfa4\"\f\x14\x03\x04\x18\x05%\x0e!\x0f\x1a\x0e\x0f\x05\x92\xa7\xf0\x01\x9c\x01\xe8\x01\x9c\x02KjKKjKKjKKjKKjKKjK\x01.\xfe\xa4\xfe٫\x12\xad8\n\x03\x01\x0e\v\x0f\x16\x05!\x0e%\x1a00C'Z\xfd\x8f\xae\x01'\xab\xab\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x00.\x00W\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x04\x14\x06\"&462\x02 \x04\x06\x15\x14\x16\x1f\x01\a\x06\a6?\x01\x17\x1632$6\x10&\x01\x14\x02\x04#\"'\x06\x05\x06\a#\"&'5&6&>\x027>\x057&\x0254>\x01$ \x04\x1e\x01\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\xe9\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x02\xb5jKKjKKjKKjKKjKKjK\x01\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xfe\x8b\xae\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xacee\xac\xed\x00\x04\x00\x00\xff\t\x04\x00\x05\xf7\x00\x03\x00\x06\x00\n\x00\r\x00\x00\t\x01\x11\t\x01\x11\x01\x19\x01\x01\x11\t\x01\x11\x02\x00\x02\x00\xfe\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\x02\x00\x01Y\x01'\xfd\xb1\xfe\xd8\x03w\xfd\xb1\x01(\x04\x9e\xfd\xb1\xfe\xd8\x02O\xfe\xd9\x01'\xfd\xb1\x00\x00\x00\x01\x00R\xff\xc0\x06\xad\x05@\x00$\x00\x00\x01\x06\x01\x00#\"\x03&\x03\x02#\"\a'>\x017676\x16\x17\x12\x17\x16327676#\"\a\x12\x05\x16\x06\xad\n\xfe\xbe\xfe\xb3\xe5\x8eb,XHU\x12mM\x18\xa8.\x9cU_t\x17,\x167A3ge\b\rz9@x\x01S\xfb\x03\xfa\xec\xfea\xfeQ\x01\a\xa0\x01B\x01\x06Lb\x15\x97(\x8a\b\t\x81\x8b\xfe\xe1V\xf9\xa1\xa1U\x8b\x1a\x01\x89\v\b\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\n\x00\x00\x11!\x11!\x01\x03\x13!\x13\x03\x01\x06\x00\xfa\x00\x04=\xdd\xdd\xfd\x86\xdd\xdd\x01=\x05\x80\xfa\x00\x01\xa5\x02w\x01)\xfe\xd7\xfd\x89\xfe\xd0\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x12\x00A\x00U\x00\x00\x11!\x11!\x01\a\x17\a\x177\x177'7'#'#\a\x052\x16\a74.\x02#\"\x06\x1d\x01#\x1532\x15\x11\x14\x06\x0f\x01\x15!5'.\x02>\x015\x1137#\"76=\x014>\x02\x015'.\x01465\x11!\a\x17\x16\x15\x11\x14\x06\x0f\x01\x15\x06\x00\xfa\x00\x03\x8c\fK\x1f\x19kk\x19\x1fK\f_5 5\xfe\x96 \x19\x01\xae#BH1\x85\x84`L\x14\n\rI\x01\xc0\x95\x06\x05\x02\x01\x01\xbf&\xe7\x06\x04\x04\x03\f\x1b\x02v6\a\x05\x02\xfe\xed\x17S\x17\f\x0eF\x05\x80\xfa\x00\x04\xc0!Sr\x1999\x19rS!``\xa3 /\x157K%\x0es}H\x80\b\xfe\x82\x0e\f\x01\aXV\x0e\x01\x01\x04\x04\n\x05\x01\x83\x80\x06\x06\x03P\x1b\x1b\x1d\v\xfc\xc3V\t\x01\x03\x03\f\x06\x02\be\x16\a\x14\xfe\x8e\x0e\t\x02\tV\x00\x00\x04\x00\x00\xffd\a\x00\x06\x00\x00/\x009\x00Q\x00[\x00\x00\x01\x14\x06\a\x16\x15\x14\x02\x04 $\x02547.\x0154632\x176%\x13>\x01\x17\x05>\x0132\x16\x14\x06\"&5%\x03\x04\x17632\x16\x01\x14\x16264&#\"\x06\x0164'&\"\a\x0e\x01\"&'&\"\a\x06\x14\x17\x1e\x022>\x01&2654&#\"\x06\x14\a\x00;2\f\xd5\xfe\x90\xfeP\xfe\x91\xd5\v3>tSU<\xda\x01)t\x03\x18\x0e\x01q\x12H+>XX|W\xfe\xb2h\x01,\xdb:USt\xfa\xa2W|XX>=X\x03*\v\v\n\x1e\v)\xa0\xa0\xa0)\v\x1e\n\v\v+\x97^X^\x97\x16|WX=>X\x02\xb2:_\x19.2\x9b\xfe\xf8\x99\x99\x01\b\x9b//\x19a:Ru?\x98\n\x02\t\r\x10\x03Q%-W|XW>J\xfe(\t\x97=u\xfe\xe7>XX|WX\xfe`\v\x1e\v\n\n*((*\n\n\n\x1f\v+2\t\t2\xf8X>=XW|\x00\x00\x00\x01\x00E\xff\x02\x06\xbb\x06\x00\x000\x00\x00\x133>\x03$32\x04\x17\x16\x1d\x01!\x1e\x03>\x017\x11\x06\f\x01'&\x02'&\x127\x0e\x01\a!6.\x04/\x01\x0e\x03E\x01\x10U\x91\xbe\x01\x01\x94\xe7\x01noh\xfb\x9b\x01i\xa8\xd3\xd7\xc9I\\\xfe\xed\xfe\xa2\x8d\xbd\xf5\x02\x03\xe4\xd30<\x10\x02{\b >ORD\x16\x16\x87\xf9ƚ\x02\xe5~\xe7˕V\xd3ƻ\xff\xbco\xa3R \x1aC3\xfe\x877J\x026I\x01`\xc4\xf2\x01Tb<\x83^M~M8\x1a\x0f\x01\x01\x05O\x82\x97\x00\x00\x00\x04\x00\x00\xff\x80\t\x00\x05\x80\x00\t\x00\r\x00\x11\x00\x1b\x00\x005\x11!\x11\x14\x06#!\"&\x01\x15!5!\x15!5\x012\x16\x1d\x01!5463\t\x00^B\xf8@B^\x02\x80\x01\x80\xfd\x00\x01\x00\x06`B^\xf7\x00^B \x02`\xfd\xa0B^^\x01\"\x80\x80\x80\x80\x04\x80^B\xe0\xe0B^\x00\x00\x00\x03\x00\x00\xff\x00\x06\xbb\x06\x00\x00\x1f\x000\x00;\x00\x00%'\x0e\x01#\".\x0154>\x0232\x16\x177&$#\"\x04\x06\x02\x10\x12\x16\x0432$\t\x01\x06\x00!\"$&\x02\x10\x126$3 \x00\x17\x03#\x15#\x1132\x1e\x01\x0e\x01\x060\xdaJ\xf5\x8d\x93\xf8\x90U\x91\xc7n\x83\xe9L\xd7n\xfe\x9fʡ\xfe\xda\xd4~~\xd4\x01&\xa1\xd5\x01q\xfe@\x02\xb5t\xfeK\xfe\xee\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\xb6\x01\x04\x01\xa5}\x9f'`\x88 -\f\n-\xf6ox\x8a\x90\xf8\x92nǑUyl}\xa9\xc0~\xd4\xfe\xda\xfe\xbe\xfe\xda\xd4~\xd6\x02F\xfe\xa0\xfd\xfeڎ\xf0\x01L\x01l\x01L\xf0\x8e\xfe\xf5\xe9\xfet\xa0\x01`(88(\x00\x04\x00 \xff\x00\x06\xe0\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\t\x017!\x01'\x11\x01\x1f\x01\x11\t\x02!\x01\x05\x93\xfd\x9a\\\x03W\xfa\xb5\xb8\x04\x9f\x14\x93\xfd\xec\x01\\\xfe\f\xfc\xa9\x01d\x03;\x01\x82\x97\xfc\xdet\x03Z\xfd\x19`_\xfc\xa6\x01O\x02\u007f\xfc\xde\x02;\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\xf0\x00\v\x00\x17\x00}\x00\x00\x0154+\x01\"\x1d\x01\x14;\x012%54+\x01\"\x1d\x01\x14;\x012\x05\x11!\x114&\"\x06\x15\x11!\x114;\x012\x1d\x013\x114;\x012\x1d\x01354;\x012\x1d\x01354>\x02\x163\x11&5462\x16\x15\x14\a\x15632\x1632632\x1d\x01\x14\x06#\"&#\"\a\x1526\x1e\x02\x1d\x01354;\x012\x1d\x01354;\x012\x15\x11354;\x012\x02\x80\x10`\x10\x10`\x10\x02\x00\x10`\x10\x10`\x10\x02\x00\xfd\x80p\xa0p\xfd\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x80\x05\f\a\x10\x01 !,! -&\x15M\x10\x11<\a\x10F\x1b\x12I\x13(2\x01\x10\a\f\x05\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x02\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xfd\x10\x01@PppP\xfe\xc0\x02\xf0\x10\x10p\x02p\x10\x10pp\x10\x10pp\x06\a\x03\x01\x01\x01\x87\x0f#\x17 \x17#\x0f\x11\n\x0f\x0f\x10\xd2\x0f\r\x0f\f\x85\x01\x01\x03\a\x06pp\x10\x10pp\x10\x10\xfd\x90p\x10\x00\x01\x00\x00\x00\x00\t\x00\x05\x80\x00j\x00\x00\x01\x16\x14\a\x05\x06#\"'&=\x01!\x16\x17\x1e\x05;\x015463!2\x16\x15\x11\x14\x06#!\"&=\x01#\".\x05'.\x03#!\x0e\x01#\"&4632\x16\x1732>\x027>\x06;\x01>\x0132\x16\x14\x06#\"&'#\"\x0e\x04\a\x06\a!546\x17\b\xf0\x10\x10\xfe\xc0\b\b\t\a\x10\xfc\xa6%.\x10\x11\x1f\x17\x1f \x11`\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12` :,.\x1c'\x12\x13\x17\x1c,-\x18\xfe\x98\x16\x8aXj\x96\x96jX\x8a\x16h\x18-,\x1c\x17\x13\x12'\x1c.,: k\x15b>PppP>b\x15k\x11 \x1f\x17\x1f\x11\x10.%\x04Z \x10\x02\xdb\b&\b\xc0\x05\x04\n\x12\x80:k%$> $\x10`\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e`\x14\x1b6&L')59I\"Tl\x96ԖlT\"I95)'L&6\x1b\x149Gp\xa0pG9\x10$ >$%k:\x80\x12\x14\v\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x11\x00!\x00\x00\x00\x14\x06+\x01\x1132\x00\x10&#!\x113\x1132\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04~O8\xfd\xfd8\x01\x02\xb7\x83\xfeO\xb4\xfd\x82\x02\x87\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03>pN\x01\r\xfe\xf7\x01\x04\xb8\xfc\x80\x01\r\x01i\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x04\x00\x00\xff\xd9\t\x00\x05'\x00'\x00:\x00M\x00a\x00\x00\x014&'\x06\a\x0e\x01#\"'.\x017654.\x01#\"\x06\a\x16\x17\x16\x14\x06\"'&#\"\x06\x14\x163!267\x14\x06#!\"&54676$32\x00\x17\x1e\x01\x17\x14\a\x06#\"'.\x0176\x10'&>\x01\x16\x17\x16$\x10\a\x06#\"'.\x017654'&676\x16\x17\x06mD5\a\x10\a)\x18\f\f\x1f\x1c\n\x17z\xd2{\x86\xe26lP\x16,@\x17Kij\x96\x96j\x04\x16Oo\x99Ɏ\xfb\xea\xa9\xf0ȕ>\x01>\xc3\xeb\x01[\x17t\x99\xfaa\x17)\x18\x13\x1a\f\x12GG\x12\f4?\x12a\x01\x00\x86\x17)\x17\x13\x1a\r\x12ll\x12\r\x1a\x1a>\x12\x01\xb6;_\x15-/\x18\x1c\x03\n9\x1eGH{\xd1z\x92y\x1cN\x17@,\x16K\x95ԕoN\x8e\xc8繁\xe4\x16\xb8\xe4\xfe\xc3\xe7\x19\xbby\xaf\x90!\r\x11?\x1ah\x01\x02h\x1a>$\r\x1a\x8eD\xfe\x18\xc7\"\r\x12>\x1a\xa4\xc2â\x1a?\x11\x12\f\x1b\x00\x02\x00$\xff\x00\x05\xdc\x06\x00\x00\t\x00n\x00\x00\x05\x14\x06\"&5462\x16'\x0e\x01\x15\x14\x17\x06#\".\x0554>\x032\x1e\x03\x15\x14\a\x1e\x01\x1f\x012654.\x04'&'.\x0354>\x0332\x1e\x03\x15\x14\x0e\x03#\"#*\x01.\x045.\x01/\x01\"\x0e\x01\x15\x14\x1e\x03\x17\x1e\b\x05\xdc~\xb4\u007f\u007f\xb4~\xe9s\x9b!\x92\xe9m\xb8{b6#\f\t\x1c-SjR,\x1b\b\x17\x1cl'(s\x96\x12-6^]I\x1c\x0ft\x8eg))[\x86\xc7zxȁZ&\x1e+6,\x11\x02\x06\x13\x1a4$.\x1c\x14\x0fX%%Dc*\n&D~WL}]I0\"\x13\n\x02\rY\u007f\u007fYZ\u007f\u007f\xbf\x0f\xafvJ@N*CVTR3\x0e\x13/A3$#/;'\x0e\"/\x1b\x1e\x02\x01fR\x1a-,&2-\"\r\a7Zr\x89^N\x90\x83a94Rji3.I+\x1d\n\n\x12&6W6\x10\x13\x01\x01>N%\x18&60;\x1d\x1996@7F6I3\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00+\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26%\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x007\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x16%\"&5\x1146;\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x012\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x01\xee\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04@\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\xc0\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x167\"&5\x11463!2\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92n\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00%\x00=\x00\x00%\x13\x16\a\x06#!\"'&7\x13\x01\x13!\x13>\x013!\x15\x14\x1626=\x01!\x15\x14\x1626=\x01!2\x16%\x11\x14\x06\"&5\x114&\"\x06\x15\x11\x14\x06\"&5\x1146 \x16\x06\xdd#\x03\x13\x13\x1d\xf9\x80\x1d\x13\x13\x03#\x06]V\xf9TV\x03$\x19\x01\x00KjK\x01\x80KjK\x01\x00\x19$\xfe\x83&4&\x96Ԗ&4&\xe1\x01>\xe1\x80\xfe\xc7\x1c\x16\x15\x15\x16\x1c\x019\x03G\xfc\xf9\x03\a\x18!\x805KK5\x80\x805KK5\x80!\xa1\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xff\x00\x1a&&\x1a\x01\x00\x9f\xe1\xe1\x00\x06\x00\x00\xff\x00\b\x00\x06\x00\x00\x15\x00#\x00/\x00;\x00I\x00m\x00\x00\x012\x16\x14\x06+\x01\x03\x0e\x01#!\"&'\x03#\"&463\x01>\x01'\x03.\x01\x0e\x01\x17\x13\x1e\x013%\x114&\"\x06\x15\x11\x14\x1626%\x114&\"\x06\x15\x11\x14\x1626%\x136.\x01\x06\a\x03\x06\x16\x17326\x01\x03#\x13>\x01;\x01463!2\x16\x1532\x16\x17\x13#\x03.\x01+\x01\x14\x06#!\"&5#\"\x06\a\x805KK5\x0fs\bH.\xfb\x00.H\bs\x0f5KK5\x01e\x1a#\x02 \x02)4#\x02 \x02%\x19\x01\xa0&4&&4&\x01\x80&4&&4&\x01` \x02#4)\x02 \x02#\x1a\x05\x19%\xfb~]\x84e\x13\x8cZ\xa7&\x1a\x01\x80\x1a&\xa7Z\x8c\x13e\x84]\vE-\xa7&\x1a\xfe\x80\x1a&\xa7-E\x03\x00KjK\xfdj.<<.\x02\x96KjK\xfc\xe0\x02)\x1a\x01\xa0\x1a#\x04)\x1a\xfe`\x19\"@\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x15\x01\xa0\x1a)\x04#\x1a\xfe`\x1a)\x02\"\x04\xda\xfed\x01\xb9Xo\x1a&&\x1aoX\xfeG\x01\x9c,8\x1a&&\x1a8\x00\x02\x00!\xff\x80\x06\xdf\x05\x80\x00\x03\x00O\x00\x00\x01\x13#\x03\x01\a\x06#!\x03!2\x17\x16\x0f\x01\x06#!\x03\x06+\x01\"'&7\x13#\x03\x06+\x01\"'&7\x13!\"'&?\x0163!\x13!\"'&?\x0163!\x136;\x012\x17\x16\a\x033\x136;\x012\x17\x16\a\x03!2\x17\x16\x03\xdf@\xfe@\x03\xfe8\a\x18\xfe\xb9@\x017\x0f\n\n\x048\x05\x1a\xfe\xb9Q\a\x18\xe0\x10\n\t\x03N\xfeQ\a\x18\xe1\x0f\n\t\x03N\xfe\xc9\x0f\n\t\x038\a\x18\x01G@\xfe\xc9\x0f\n\n\x048\x05\x1a\x01GQ\a\x19\xe0\x0f\n\t\x03N\xfeQ\a\x19\xe0\x0f\n\t\x03N\x017\x0f\n\t\x02\x00\x01\x00\xff\x00\x01\xf8\xe0\x18\xff\x00\f\x0e\x0e\xe0\x18\xfe\xb8\x18\f\f\x10\x018\xfe\xb8\x18\f\f\x10\x018\f\f\x10\xe0\x18\x01\x00\f\x0e\x0e\xe0\x18\x01H\x18\f\f\x10\xfe\xc8\x01H\x18\f\f\x10\xfe\xc8\f\f\x00\x00\x00\x00\x04\x00k\xff\x00\x05\x95\x06\x00\x00\x02\x00\x05\x00\x11\x00%\x00\x00\x01\x17\a\x11\x17\a\x03\t\x03\x11\x03\a\t\x01\x17\x01\x00\x10\x02\x0e\x02\".\x02\x02\x10\x12>\x022\x1e\x02\x03I\x94\x95\x95\x94\x83\x01\xd0\xfe\xce\x012\xfe0\xff]\x01@\xfe\xc0]\x00\xff\x02\xcf@o\xaa\xc1\xf6\xc1\xaao@@o\xaa\xc1\xf6\xc1\xaao\x01㔕\x03\x8c\x95\x94\xfca\x01\xd0\x012\x012\x01\xd0\xfd\x9d\x00\xff]\xfe\xbf\xfe\xbf]\x00\xff\x01p\xfe^\xfe\xc7\xc9|11|\xc9\x019\x01\xa2\x019\xc9|11|\xc9\x00\x00\x00\x00\x03\x00(\xff\x00\x03\xd8\x06\x00\x00\x02\x00\x05\x00\x11\x00\x00%7'\x117'\x13\t\x01\x11\x01'\t\x017\x01\x11\x01\x02T\xad\xad\xad\xad \x01d\xfd\xe5\xfe\xd7l\x01t\xfe\x8cl\x01)\x02\x1bq\xac\xac\x01n\xac\xac\xfd\xf1\xfe\x9c\xfd\xe4\x02\xc7\xfe\xd8l\x01u\x01ul\xfe\xd8\x02\xc7\xfd\xe4\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00)\x001\x00\x00$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 \x13\x14\a\x01\x06+\x01\"&547\x016;\x012\x16\x04\x10\x06 &\x106 \x05\x00LhLLh\xfdLLhLLh\x04L\xe1\xfe\xc2\xe1\xe1\x01>\x81\r\xfb\xe0\x13 \xa0\x1a&\r\x04 \x13 \xa0\x1a&\xfd`\xe1\xfe\xc2\xe1\xe1\x01>\xcchLLhL\x03LhLLhL\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\x02\xc0\x14\x12\xfa\x80\x1a&\x1a\x14\x12\x05\x80\x1a&\xbb\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x05\x00\x03\xffG\x06\xfd\x05\xb9\x00\x06\x00\n\x00\x10\x00\x17\x00\x1d\x00\x00\x13\t\x01.\x017\x13)\x01\x011\x01\x13!\x1362\x01\x13\x16\x06\a\t\x011!\x1362\x17h\x03\x18\xfc\x9c\x12\x0e\ae\x01\xce\x02\x94\xfe\xb6\xfd\xf0\xc6\xfe2\xc6\b2\x050e\a\x0e\x12\xfc\x9c\x03\x18\xfe2\xc6\b2\b\x03>\xfc\t\x02v\r+\x15\x014\xfc\t\x06[\xfd\x9c\x02d\x17\xfd\x85\xfe\xcc\x15+\r\xfd\x8a\x03\xf7\x02d\x17\x17\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\xe0\x00\x03\x00\x0f\x00\x13\x001\x00\x00\x0135#\x015\x06\a\x06&'\x17\x1e\x0172\x01!5!\x05\x14\a\x16\x15\x14\x04#\"&'\x06\"'\x0e\x01#\"$547&54\x12$ \x04\x12\x01\x80\xa0\xa0\x03Eh\x8b\x87\xf9`\x01X\xf8\x94\x81\xfe(\x02\x80\xfd\x80\x04\x80cY\xfe\xfd\xb8z\xce:\x13L\x13:\xcez\xb8\xfe\xfdYc\xf0\x01\x9d\x01\xe6\x01\x9d\xf0\x02\xc0\xe0\xfd\xd4\\$\x02\x01_K`Pa\x01\x01}\xe0\xc0\xbb\xa5f\u007f\x9d\xdeiX\x01\x01Xiޝ\u007ff\xa5\xbb\xd1\x01a\xce\xce\xfe\x9f\x00\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00(\x00+\x00.\x00>\x00\x00\x01\x15#5\x13\x15#5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x114&+\x01\x01'\a\x01#\"\x06\x15\x11\x14\x163!26\x017!\x057!\x05\x11\x14\x06#!\"&5\x11463!2\x16\x02\x03\xfc\xfc\xfc\x03\xf2\xfe\xab\x01U\xfd`\x02\xa0\xfd`\x03'\f\b \xfe\x86\xd2\xd2\xfe\x86 \b\f\f\b\x04\xd8\b\f\xfc\xa9\xb9\xfej\x02\x8b\xdd\xfej\x02\xe2V>\xfb(>VV>\x04\xd8>V\x02q\x80\x80\x00\xff\u007f\u007f\xfe\x01\x80\x80\x01\x00\x80\x80\x00\xff\u007f\u007f\xfc\xa4\x04\xd8\b\f\xff\x00\xab\xab\x01\x00\f\b\xfb(\b\f\f\x04^\x96\x96\x96\x14\xfb(>VV>\x04\xd8>VV\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00=\x00\x00\x01&'&'&'&\x06\x1f\x01\x1e\x03\x17\x16\x17\x1e\x04\x17\x1676'&'&\x02\x01.\x05\x02' \f\x01\x1e\x03\x0e\x01\a\x06\x15\x01#\x01\x0e\x02.\x02\x03\x80h8\x8b\xd0\"$Y\n''>eX5,\t\x04,Pts\x93K\x99\x01\x0125\x1cM\xcc\xfeRLqS;:.K'\x01\x11\x01\xc1\x015\xe9\x8aR\x1e\x05\x0e\r\r\x01Ch\xfe\xe7\x16\x8bh\xac\x95\xba\x02\xd0\xc4R\xcat\x13\x11(\x10\x1e\x1f+e\x84^T\x11\bT\x8a\xaa\x82u B\x06\x03\"$\x15:\x012\xfe~<\x82\x9d\x98\xdc\xc6\x012\x88Hp\xb1\xa8\xe5\xaa\xe3wTT\x17\xfe\xb9\x01\x1d\x02\x18\x0e\x02 V\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00/\x007\x00G\x00W\x00g\x00\x00\x00.\x01\a\x04 %&\x0e\x01\x16\x17\x16\x17\x0e\x02\x0f\x01\x06\x16\x17\x1632?\x01673\x16\x1f\x01\x16327>\x01/\x01.\x02'676$4&\"\x06\x14\x162\x04\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x00 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05d\f-\x1a\xfe\xfb\xfe\xe8\xfe\xfb\x1a-\f\x1b\x1a\xc2m\x02\x1b\x1a\x1c\t\n\x16\x19\t\x0e,\x10\b6\x11*\x116\b\x10,\x0e\t\x19\x16\n\t\x1c\x1a\x1b\x02m\xc2\x1a\xfe\xb7KjKKj\x02\x8bo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbd\xfeK\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xcezz\xce\x01Ȏ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03U4\x1b\x06>>\x06\x1b4-\x06.\f\x9e\xdeYG\x15\x190\n\x04)\x14\x8bxx\x8b\x14)\x04\n0\x19\x15GYޞ\f.\x06\xa3jKKjKq\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\x01lz\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xce\xfe0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x03\x00D\xff\x00\x05\xbb\x06\x00\x00/\x007\x00H\x00\x00\x00\x16\a\x03\x0e\x01#\"'.\x017\x13\a\x16\x15\x14\a'654&#\"\a'67\x01'\a\x06.\x016?\x01>\x01\x17\x01\x16\x17\x16\x0f\x01%\x02\"&462\x16\x14\x0127\x17\x06#\".\x01547\x17\x06\x15\x14\x16\x05|D\x05,\x04=)\x06\x03,9\x03#\x8f7\x94\x89[͑\x86f\x89x\xa4\x01\b\x95\xb5!X:\x05 \xef\x1aD\x1e\x01\xe8$\f\x11+\xcd\x01s)\x94hh\x94i\xfc\xdajZ\x8b\x92\xbd\x94\xfb\x92t\x8b<\xcd\x02\xf6F/\xfd\xd9*8\x01\x03C,\x01\xad\bq\u007f\u061c\x89e\x86\x91\xce\\\x8ar\x1b\x01,W\xa1\x1e\x05BX\x1d\xd5\x17\a\x12\xfe\xe5\x15/C2\xe8\x14\x01\xa9h\x94hh\x94\xfa\xbe=\x8bt\x92\xfa\x94\xbc\x94\x8bXm\x91\xcd\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00N\x00Z\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x14\x0e\x02\a\x0e\x02\x1d\x01\x14\x06+\x01\"&=\x014>\x037>\x0154&#\"\a\x06\a\x06#\"/\x01.\x017632\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03p\x12\x0e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x00\x1e=+& \x1d\x17\x12\x0e\xa0\x0e\x12\x15\x1b3\x1f\x1d5,W48'\x1d3\t\x10\v\bl\n\x04\az\xe3\x81\xdb\xee\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01P\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\x01\xe22P:\x1e\x15\x12\x14\x1c\x0f \x0e\x12\x12\x0eD#;$#\x10\r\x19$\x1f*;\x1b\x14?\f\x06R\a\x1a\n\xc0\xb3\x01Cf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x04\x00'\xff\x03\x05Y\x06\x00\x00\t\x00>\x00O\x00`\x00\x00\x00\"&5462\x16\x15\x14\x01\x14\x06&'\x01.\x01\x0f\x01\x06\x1f\x01\x13\x03\x06\a\x06\a\x06'.\x0176\x1b\x01\a\x17\x16\x0e\x02\x0f\x01\x06.\x035\x03\x13632\x17\x01\x16\x1f\x01\a\x16\x05\x1e\x01\x1f\x01\x16\x17\x16\a\x06.\x01'#&'\x03\x01\x16\x15\x14\a\x06.\x01'&\x01\x166?\x0165\x01\xae\x80\\\\\x80[\x01\x8c(\t\x01\x06\x02|\x03\x93\x1f\x03\t\v\x14\x06r\xfe\xcb\x03\b\x03\x03\v\x04\xc9[A@[[@A\xfd#2#\x16\x17\x01\xb6\f\a\x02\x03\b\r\x8b\xfe\x9e\xfe7\xc0*\x1a\x06\x1a\x19\r<\x1b\x11\x02Y\x01\xa0\xa4\xde\x18$\x13\r\x01\x02\x03\f\x14\x18\x0f\x02\x01+\x01}\"(\xfd\xf7\x05\f\x03\x01\r\xa6q\xe087] F\x1b\x16\f \x13\x10\t\x01_\xfe\xad1\b\x05\x02\x05\v)\n\xac\x01\xe9\x01\x04\x02\x02\t\b\x00\x00\x00\a\x00\x03\x00\xe3\t\x00\x04\x1c\x00\x02\x00\v\x00#\x001\x00K\x00e\x00\u007f\x00\x00\x013\x03\x054&+\x01\x11326\x01\x13\x14\x06+\x01\"&=\x01!\a\x06#!\"&7\x0163!2\x16\x04\x10\x06#!\"&5\x11463!2\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x17\x01\xf8\xab\x01\x03Xe`64[l\xfd\xc2\x01\x13\x0e\xd8\x0e\x13\xfe\xdd7\n\x12\xfe\xf5\x15\x13\r\x02,\t\x12\x01L\x0e\x14\x03;\xfb\xc7\xfe\xf2\x0e\x14\x14\x0e\x01\f\xc8\x01\x98\x01\x0f\x1c=+3&9\x1a\x10\x01\x01\x01\x0e\x1a8&+)>\x1d\x11\x02\xb9\x01\x0f\x1c>+3&9\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x02\xb6\x01\x0f\x1c=+3&8\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x01\x02\x1e\x01\t\xa6Wj\xfe|r\x01\xca\xfd\f\x0e\x14\x14\x0e>Q\x0f$\x11\x02\xf5\x0e\x14\xc6\xfe~\xdc\x14\x0e\x02\xf4\x0e\x14\xfed\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x00\x04\x00\x00\xff\x00\x05\x80\x05\xf2\x00J\x00\\\x00m\x00\x82\x00\x00\x054.\x01'.\x02'&#\"\x06#\"'.\x03'&47>\x037632\x16327>\x027>\x0254&'&#\"\a\x0e\x03\a\x06\a\x0e\x01\x10\x16\x17\x16\x17\x16\x17\x16\x17\x16327>\x01\x13\"&47654'&462\x17\x16\x14\a\x06\x16\"'&476\x10'&462\x17\x16\x10\a\x16\"'&47>\x01\x10&'&462\x17\x16\x12\x10\x02\a\x02i\x1a$\x02\x01\b\t\t\x0f$\x17^\x18\"\r\x06\n\x05\b\x01%%\x01\b\x05\n\x06\r\"\x18^\x17$\x0f\t\t\b\x01\x02$\x1aW \x14\x19\"@9O?\x1d\x1f\x06\x031&&18\x1b?t\x03\x03@\"\x19\x14 W\x9f\x1a&\x13%%\x13&4\x13KK\x15\xb86\x12\x13\x13pp\x13&4\x13\x96\x96\xa36\x12\x13\x13ZaaZ\x13&4\x13mttm\x99\v^x\t\x04-\x1b\b\x0e\v\v\x05\x15\x13\x1d\x04\x80\xfe\x80\x04\x1d\x13\x15\x05\v\v\x0e\b\x1b-\x04\tx^\v\x16=\f\b\x12\x11/U7C\f\ak\xda\xfe\xf2\xdakz'[$\x01\x01\x12\b\f=\x03\xa7&5\x13%54'\x134&\x13K\xd4K\x13\xb5\x13\x134\x13r\x01\x027>\x0254\x00 \x00\x15\x14\x06\"&54>\x022\x1e\x02\x04\x14\x06\"&462%\x14\x06\"&54&#\"\x06\x15\x14\x06\"&546 \x16%\x16\x06\a\x06#\"&'&'.\x017>\x01\x17\x16\x05\x16\x06\a\x06#\"'&'.\x017>\x01\x17\x16\x80&4&&4\xe6&4&&4S\x01\x00Z\xff\x00\x01\xad&4&&4\x02\xe9\x174$#\x1f\x1d&\x0f\xe1\x9f\x1a&&\x1aj\x96\x173$\"('$\xfe\xf9\xfe\x8e\xfe\xf9&4&[\x9b\xd5\xea՛[\xfd\xfd&4&&4\x01F&4&\x83]\\\x84&4&\xce\x01$\xce\x01\x8a\n\x16\x19\t\x0e\x13!\aD\x9c\x15\b\x10\x114\x15\xb7\x01%\t\x15\x19\v\f,\x10\\\xcd\x16\a\x10\x104\x15\xeb\xa64&&4&\x9a4&&4&\x01-\xff\x00Z\x01\x00\x874&&4&\x01\x00;cX/)#&>B)\x9f\xe1&4&\x96j9aU0'.4a7\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1au՛[[\x9b\xd5\xdb4&&4&@\x1a&&\x1a]\x83\x83]\x1a&&\x1a\x92\xceΏ\x190\n\x04\x16\x13\xb2u\x104\x15\x15\b\x10\x89\x85\x190\n\x04)\xee\x9b\x104\x15\x16\a\x10\xaf\x00\x00\x00\x00\x04\x00\x03\xff\x00\b\xfd\x06\x00\x00\x11\x00#\x00g\x00\xb0\x00\x00\x01&'.\x01#\"\x06\x15\x14\x1f\x01\x1632676%4/\x01&#\"\x06\a\x06\a\x16\x17\x1e\x01326\x01\x0e\x01'&#\"\a2632\x16\x17\x16\x06\a\x06#2\x17\x1e\x01\a\x0e\x01+\x01&'%\a\x06#\"'\x03&6?\x01\x136\x1276\x1e\x01\x06\a\x06\a676\x16\x17\x16\x06\a\x06\a632\x17\x1e\x01%\x13\x16\x06\x0f\x01\x03\x06\x02\a\x06#\"'&6767\x06\a\x06#\"&'&6767\x06#\"'.\x017>\x01\x17\x16327\"\x06#\"&'&6763\"'.\x017>\x01;\x02\x16\x17\x057632\x04\b;\x19\x11>%5K$\n\"0%>\x11\x19\x02s$\n\"0%>\x11\x19;;\x19\x11>%5K\xfeV\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x10\x1c\xfe\xde\xef\x0e\x0f(\x11\xa0\v\x0e\x16є\x11\x95y\x1fO2\a\x1fF/{\x90(?\x04\x050(TK.5sg$\x1a\x03\xb1\xa0\v\x0e\x16є\x11\x95y\x1a#-\x1d\x19\a\x1fF/{\x90\x04\b$7\x04\x050(TK.5sg$\x1a\x12\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x01\x0e\x1c\x01#\xef\x0e\x0f(\x02@\x025\"'K58!\b\x1f'\"5\x828!\b\x1f'\"5\x02\x025\"'K\x01\x12#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a#\x01@\x171\rw\x01\v\x9b\x01\x11d\x19\a>N\x1a;ET\x11\x050((?\x04\n-\n2\x12K|\xfe\xc0\x171\rw\xfe\xf5\x9b\xfe\xefd\x16#\x1fN\x1a;ET\x11\x010$(?\x04\n-\n2\x12K$#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\x13\x00D\x00N\x00\\\x00\x00\x01\x14\x162654& \x06\x15\x14\x16265462\x16\x02\"\x0e\x02\x15\x14\x162654\x00 \x00\x15\x14\x0e\x01\a\x0e\x03\x15\x14\x06#\"\x06\x14\x1632654>\x027>\x0354.\x01\x01\x17\x01\x06\"/\x01&47\x01\x17\x16\x14\x0f\x03&'?\x0162\x04 &4&\xce\xfe\xdc\xce&4&\x84\xb8\x84h\xea՛[&4&\x01\a\x01r\x01\a$'(\"$3\x17\x96j\x1a&&\x1a\x9f\xe1\x0f&\x1d\x1f#$4\x17[\x9b\xfd\xc2\xe2\xfd\xbd\f\"\f\xa8\f\f\x06@\xa8\f\f\xe9\x1aGB\x81[\xcf\r\"\x02\xc0\x1a&&\x1a\x92\xceΒ\x1a&&\x1a]\x83\x83\x01\xe3[\x9b\xd5u\x1a&&\x1a\xb9\x01\a\xfe\xf9\xb97a4.'0Ua9j\x96&4&\xe1\x9f)B>&#)/Xc;u՛\xfd\x8c\xe2\xfd\xbd\f\f\xa8\f\"\f\x06\x06\xa8\f\"\r\xe9\x19G\x99i[\xcf\f\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00X\x00h\x00\x00\x01\x14\a\x0e\x01\a\x0e\x01\a\x06#\"&5467632\x16\x014&'&#\"\a'>\x0154#\"\a\x0e\x02\x15\x14\x1632\x14\a\x06\a\x0e\x01#\"54>\x0354'.\x01#\"\x0e\x01\x15\x14\x1632>\x017>\x01767632\x17\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03b\r\v)\n\x02\x05\v\x14\v:4FD\x1c\x17\x1c\x11\x01\xe6N\r\x15\r[\x87\x02\x031\xf2\x18,^\x95J\xa1\x93\x19\x01\x04\x16\x0eK-*\x15\x1d\x1e\x16\a\x18E\x1f#9\x19gWR\x92Y\x15\x06\x13\x05\x03\vvm0O\x01\x03\x05\t\xb8\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfd\x1bC2\xc82\v\x03\x01\x02c@X\xac&\x0e!\xfe9\x0e{\x05\bM\x02\x16\xe2A\xe9\x06\x11\x91\xbc_\x92\x9e\x06\x02\"S4b/\x18/ \x19\x0f\x01\x03\a\x16\x1dDR\"Xlj\x92P\x16Y\x16\f\x06<\x12\x01\t\x02\x0f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00%\xff\x00\x05\xda\x05\xff\x00\x19\x00e\x00\x00\x014.\x02#\"\a\x06\x02\x15\x14\x1e\x0232\x16>\x0276\x1276\x01\x14\x06#'.\x02#\"\a\x06\a\x0e\x01\a\x0e\x03#\"&54>\x0132\x16\x17\x14\x0e\x03\x15\x14\x1632>\x03754&*\x01\x06#\"&54>\x02763 \x11\x14\x02\a\x17>\x0132\x17\x1e\x01\x02\xe8\x04\r\x1d\x17''il\x11$E/\x04\x1c\f\x14\n\x02\x10@\x10\x13\x02\xf2\x0f\b\x06\x16P@\x1f\xa7\xb8\x0f\x06\n\x1d\b\x17^\x83\xb2`\x87\x9f'W6&\xa4\x01!.. ! -P5+\x16\x05\a\n\n\n\x01\xe3\xfaE{\xbdn46\x01vL\x05\x03e\xa3V\x16\x1f\x13z\x04\xcf\x18\x1d\x1f\x0f\x17:\xfe\xf7\x89,SN/\x01\x01\x05\f\nM\x015M[\xfd\xa7\a\r\x01\x03\x10\t]\b\x13$\x8b\x1f[\xb1\x98^\xa7\x885\x80iC\x1c\x01\x17'2H&!(?]v`*\t\x02\x03\x01\xf5\xe2l\xe2\u008d\x13\t\xfe\x98b\xfe\xa2$\x039>\r\a\xbf\x00\x03\x00\x01\xff\x00\x06\u007f\x05\xfb\x00=\x00R\x00\x87\x00\x00\x012\x1f\x01\x16\x1f\x01\x16\a\x03\x0e\x01\a\r\x01#\"&5467%!\"&7>\x013-\x01.\x017>\x01;\x01\x05%.\x017>\x0132\x17\x05\x172\x16326/\x01.\x0176\a\x17/\x02\x03.\x01'&676\x16\x1f\x01\x0e\x01\a\x06\x16\x01\x13\x16\x0f\x01\x06\x0f\x016/\x01&/\x01&#\"\a\x03&676\x16\x17\t\x01&676\x16\x17\x13\x03&676\x16\x17\x13\x17\x1e\x016/\x01&672\x16\x03? \x1b\xde=1\x92(\vH\x06/ \xfd\xf1\xfe\xa0\t'96&\x01\x04\xfe@)9\x02\x02<'\x01\xba\xfd\xf7)2\x06\x069%\n\x01\xe1\xfe\xa1&0\x06\x066#\x06\x0e\x01\xc0\xd9\x01\x04\x01\x17\x0f\x14\xba#\x0e\x19\x1b\x15\xba\xda\x05$\xee\x01\x03\x01\x18\v \x1fJ\x1b\x8e\x02\x06\x01 \x12\x03\xa5\x0f\x04\x0f0\f7j\x02)\x925@\xde\"*3%\xeb\x19\x0e\"!M\x18\x01\n\xfe\xfa\x15\x15%#K\x14\xf1\x88\x0f\x15\"%N\x11\xc1e\b\x1e\x18\x01\f\x028)'8\x03_\x12\x94(9\xaa.<\xfec +\x048 8(%6\x05 <)'4\x01@\x05@)#-<^\n?%$-\x02`%\x01.\r}\x17Q!&\xca}%\x02&\x01\x06\x01\x05\x01\x1fN\x19\x17\v\x1c\x93\x01\x05\x02-l\x01\xa7\xfe\xf6IJ\xdb;\x1c6>/\xaa=*\x94\x17%\x018!Q\x17\x16\x10 \xfe\xa0\x01\xc7#P\x13\x12\x18\"\xfe\\\x01Q#N\x11\x13\x1a&\xfea\xc4\x0f\x05\x14\x10\xe0)<\x019\x00\x00\x04\x00\x00\xff\x1e\a\x00\x05b\x00R\x00]\x00m\x00p\x00\x00%\"'.\x01'&54>\x0676%&547632\x1f\x0163 \x00\x17\x16\x14\a\x0e\x01\a\x16\x15\x14\a\x06#\"/\x02\x017\x06\a\x16\x1a\x01\x15\x14\a\x06#\"'\x01\x06\a\x16\x00\x15\x14#\"&/\x01\x03\x06\a\x1e\x01\x17\x13\x14%\x17$\x13\x02%\x1e\x01\x15\x14\x06\x00\x14\x1632\x16\x15\x14\x162654&#\"%'\x17\x01O\x02\x04V\xa59\x15\x04\x04\n\a\x0e\x06\x12\x02\xb8\x01\fn\x11t\f\x12\n|\\d\x01\n\x01ϓ\x14\x14[\xff\x97n\x11t\v\x13\n|@\xfeD\a:)\x03\xf8\xee\t\r;9\x03\xfe8'+\x18\x01|\v\x0e\x89\x04j\xe0,\"\x02 \a\xb0\x0341\x01\x11\xb1\xb4\xfe\xe9CH^\xfen\x1c\x14Vz\x1c(\x1c\xb2~\x14\x01R\t\a\xb4\x029\xb0\\\x1e'\t\x14\x10\x14\f\x16\b\x17\x03\xfbr\xc6\r\x13\n@\x10\xe5\x13\xfe\xed\xe8\x1fL\x1f\x8e\xdf@\xc6\r\x14\t@\x10\xe5w\x034\a\x18\x17\x05\xfe6\xfeH\x03\a\x02\x03\a\x03I\x1c(+\xfdC\x04\n,\x06\xc5\x01\x9d55\x03,\f\xfe\xb9\nf[o\x01\x12\x01\x15p@\xa9\\j\xbd\x02;(\x1czV\x14\x1c\x1c\x14~\xb2\x11\x04\a\x00\x00\x00\x00\x04\x00\x00\xff\x97\x04\xfe\x05i\x00\x1f\x00/\x005\x00O\x00\x00\x01\x14\a\x06#\"'&54>\x0132\x17\x06\a&#\"\x06\x15\x14\x16 654'67\x16'\x14\x02\x0f\x01\"'>\x0454'\x16'\x15&'\x1e\x01\x13\"'6767\x0e\x01\a&546767>\x017\x16\x15\x14\a\x0e\x01\x04\x1a\x93\x94\xe6蒓\x88\xf2\x93`V \aBM\xa7\xe3\xe1\x01R\xe0 B9)̟\x9f\x0e\x1d!S\u007fH-\x0f\x0377I\x85Xm\xfdSM\xdaH\x13\x02*\xc3k#\"\x1a.o;^\x1bJ\x18 q\x01\xaeן\xa1\xa1\x9fד\xf7\x92\x1f>@\x1c\xf6\xa8\xaa\xed\xed\xaaYM\r$bK\xc0\xfe\xced\x01\x05 \x8d\xa8ү[E\"\xa0\xa2\x02\xd6\xe2;\xff\xfe\xb9Kx\u007f%\x13^\x91\x196;%T\x1a,\x1e\x10U:i\x94m=Mk\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1a\x00)\x00.\x00D\x00T\x00\x00\x014'\x06\a\x16\x15\x14\x06\"&54632\x1767&#\"\x06\x10\x16 6\x03\x16\x15\x14\x0e\x03\a\x16;\x016\x114'.\x01'\x16\x054'\x06\a\x0e\x01\x15\x14\x17>\x017\x0e\x01\a\x1632676%\x11\x14\x06#!\"&5\x11463!2\x16\x04\x1a\x1c),\x16\x9a蛜s5-\x04\x17\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xff\x16Cf\x1d\a'/'%\x14\f(\v\x04\b\x05\x11$\x86U\xc7L\x11\x05\x04\n\f(\n\x15#'/'\a@\x86\x16\x89\x02\b\x0f\x10\f3\x0e#@,G)+H+@#\x0e3\r\x10\x0e\b\x02\x89\x01\x01\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x84\x16\x05\x0fX@\x13\x06\x0f\x16\f\x1d\x16\x13\x19\x10\x02_\x13O#NW\xa5#O\x13_\x02\x0f\x18\x14\x15\x1d\f\x16\x0f\x06\x13\x8a\x1d\x05\x16.\x16\x05*\x13\t\x1e#\x1e\x1e#\x1e\b\x14(\x05\x16\x01\xfb\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x0f\xff\x80\x06q\x05\x80\x00[\x00\x00\x016\x16\x17\x16\x15\x14\a\x1632632\x16\x15\x14\x0e\x02\x15\x14\x17\x1e\x01\x17\x16\x17\x16\x15\x14\a\x0e\x02#\"&#\"\a\x0e\x04#\".\x03'&#\"\x06#\".\x01'&54767>\x017654.\x0254632\x16327&547>\x01\x03P\x86\xd59\x1b\t\x0e\x0e\x12B\x12\x1d6?K?\f%\x83O\x1c4\x1c\xdb\a\b\x14\x17\x14T\x16%\x19 >6>Z64Y=6>\x1f\x1a%\x18S\x11\x19\x14\b\a\xdb\x1c4\x1cN\x85$\f?L?4\x1d\x0fB\x14\x12\x0e\t\x1b@\xd8\x05\x80\x01\x8b{:y/\x90\a\x1b$\x1c ,\x13'\x1c\x0f\x1cR\x88!\f\v\x06\x1dF!\v8%\r\x05\x05#)(\x1b\x1b()#\x05\x05\x0f%:\v!F\x1d\x06\v\f \x8aQ\x1c\x0f\x1c'\x14+\x1f\x1b%\x1a\a\x8e0z:\x89z\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00O\x00_\x00\x00\x014'.\x01'&54>\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x16Cf\x1d\a'.'%\x14\v(\f\x04\b\x05\x11$\x85V\xc6M\x12\x06\n\x05\v)\n\x14#'.'\a@\x86\x16\x8a\x02\b\x0e\x10\r3\r#A,G)+H+A#\r4\r\x0f\x0f\b\x01\x8a\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x84\x16\x05\x0eXA\x0e\v\x0f\x16\f\x1d\x16\x13\x19\x10\x02?4N$NW\xa5&M&L\x02\x10\x19\x14\x15\x1d\f\x16\x0f\v\x0e\x8a\x1d\x05\x16/\x16\x05*\x13\n\x1e#\x1e\x1e#\x1e\t\x13+\x03\x16\x03\v\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00\x00\xff\x80\t\x00\x06\x00\x00O\x00\x00\x01\x0e\x05\a\x0e\x01\a\x0e\x03\a\x06\a$\x05\x06\a>\x01?\x01>\x0376\x052\x17\x1e\x01\a\x03\x06'&#\"\x04\a\x06.\x02/\x01454327\x12\x0032\x1e\x05\x177>\x047>\x03\t\x00EpB5\x16\x16\x03\n3\x17\x0fFAP\b/h\xfe\xab\xfe\xdf\\\xd3/N\x10\x0fG\xb8S\x85L\xba\x01\x17\x01\t\v\x06\x06\xc2\x0f \x80\xe2\x92\xfe\x00\x88R\x86P*\f\x01\x06\x8a\xe9\xc0\x01m\xc9\x05\x1395F84\x0ef\x02&3Ga4B|wB\x06\x00.\\FI*/\x06\x12\xed.\x1d?&,\x06\x1f\xc8\x0e\xac5~\x10\x1e\a\a\x1bK %\r\x1f&\x03\x06\x16\v\xfe\xa7\x1d\a\x18Y\x02\x01\x1c.\"\x11\x01\x01\x01\x067\x01n\x01<\x01\t\x0f\"-I.\xb1\x04M`{\x90ARwJ!\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00F\x00X\x00^\x00d\x00j\x00\x00\x01\x14\a'\x17\x06\a'\x17\x06\a'\x17\x06\a'\x17\x06\"'7\a&'7\a&'7\a&'7\a&547\x17'67\x17'67\x17'67\x17'632\x17\a7\x16\x17\a7\x16\x17\a7\x16\x17\a7\x16\x174\x02$#\"\x0e\x02\x15\x14\x1e\x0232$\x12\x13\x11\t\x01\x11\x01\x11\x01\x11\t\x01\x11\x01\x11\t\x01\x11\x01\x05*\x05\xec\xe0\x13'ֱ,?\x9dg=OO\x0e&L&\x0eNJBg\x9d;1\xb2\xd6'\x13\xe0\xed\x05\x05\xee\xe1\x13'ֱ.=\x9egCIM\r$'&&\x0eNJBg\x9e=.\xb1\xd5%\x15\xe0\xed\x05\x1e\x9d\xfe\xf3\x9ew\u061d\\\\\x9d\xd8w\x9e\x01\r\x9dI\xfdo\xfdo\x02\x91\x02\xc4\xfd<\xfd<\x05\xc4\xfd\x00\xfd\x00\x03\x00\x02\x80-\x1f\x0eNIDg\x9e=/\xb2\xd7%\x16\xe4\xf0\x06\x06\xee\xe2\x13(ײ+A\x9ehEHO\x0e*\"#*\x0eOICh\x9f=/\xb2\xd7'\x13\xe0\xec\x06\x06\xed\xe1\x13(ֲ/=\x9fh>ON\x0e\x1f.\xa0\x01\x0f\x9d]\x9d\xdaxwڝ]\x9d\x01\x0f\x02\x1e\xfd\x02\xfe\x81\x01\u007f\x02\xfe\x01\u007f\xf9\xcb\x01\x9c\x037\x01\x9b\xfee\xfc\xc9\x03[\xfc\x80\xfe@\x01\xc0\x03\x80\x01\xc0\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x14\x00)\x006\x00\x00\x01!\a!\"\x06\x15\x11\x14\x16\x17\x163\x15#\"&5\x1146%3\x01\x0e\x06\a567654'\x013\x13\x01\x11!67!\x114&'7\x1e\x01\x01S\x02\xb3\x1a\xfdgn\x9dy]\x17K-\x8c\xc7\xc7\x03\xdf\xf7\xfe\x1e\x17#75LSl>\xa39\x14\x14\xfe\xe3\xe4\xbb\x03V\xfc\xe5%\b\x02\xa6cP\x19e}\x05&H\x9en\xfc\xfd_\x95\x13\x05HȌ\x03\x03\x8c\xc8\xda\xfa\xf2=UoLQ1!\x02\xc3\x1a\x9c4564\x02\xdd\xfd\xb7\x01\xf2\xfb\xa97\x12\x04\x0eU\x8c\x1dC\"\xb3\x00\x00\x00\x00\n\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x14\x00!\x00-\x009\x00[\x00n\x00x\x00\x90\x00\xe7\x00\x00\x00\x14\x06\"&462\x0354&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x1626754&\"\x06\x1d\x01\x14\x1626\x01\x06\x04#\".\x02547\x06\x15\x14\x12\x17632\x17632\x1762\x17632\x16\x176\x12'4#\"\a\x06#\"547\x06\x15\x14\x163276\x014&\"\x06\x15\x14\x1626\x014.\x01#\"\x06\a\x06\x15\x14\x16327632\x16\x15\x14\a>\x01\x05\x14\x02\a\x06\x04\x0f\x01\x15\x14\x06#\"'\x06\"'\x06#\"'\x06#\"&5\x06#\"'67&'\x16327&'&54>\x0332\x1767>\x017>\x027>\x0132\x17632\x17\x16\x15\x14\x0e\x02\a\x1e\x01\x15\x14\a\x16\x17632\x17\x16\x03T\"8\"\"8\x82)<()\x1d\x1e)\xac(<))\x1e\x1d)\xae)<))<)\xae)<))<)\x01\fT\xfeد{ՐR\x15h\x82x\x1e=8\x1e 78\x1e n \x1e8\x1c1\rp\x82\x8eH\x11\x1e_6\xe2\x1eS\xb2\x92oc\r\xfeF@b@?d?\x02uK\x97bM\x9070[f5Y$\x1135\x04KU\x01\x17C<:\xfe\xee[\x04;+8\x1e n \x1e87 \x1e8/8Zlv]64qE 'YK\xc00\x18\x12-AlB;\x16\x13\x17\x02\x14\x03\n\x1a\x18\x10W\xf9\x88#\x1b;WS9\x05\f\r\x13\x01\x11&\x10\x9d(\x19#-7Z\x04\xe8://:/\xfaTr\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x02ʠ\xc7g\xab\xe0xXV\xafע\xfe\xd4e9222222\x1f\x19^\x01\x13\xb3K\x06\x13\xf3Vv\u007f\x94\x96\xddF0\x02\xb22OO23OO\xfe\xe0`\xa6lF;\x9fmhj\x13\x0684\x1a\x14D\xc3ro\xfe\xebB@\x9d\x1a\x01r+@222222C0DP\x01\x13\x1f`\a.\xc0r8h9\x89\x9c~T4\x1d\x19\x03\x14\x06\x0f.&\x14o\x84\x04@9\x05\a\x05\x11\x0f\x13\x01\x06\x18\f\x06\x13\x8a\xf0\x1e1P\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x014'!\x153\x0e\x01#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x95\x06\xfe\x96\xd9\f}Pc\x8c\x8cc]\x0132\x16\x06\x001\xae\xa4I\xfe\xe3U\xa4Π?L\x80\xb6\x80L?\xbe\x99cc\x0e\xc34MX\v\x8a\x14\x1a&\x04\x00\xfc\xb90\x0e4;0\xfe\xae\x05X\x19pD[\x80\x80[Dp\x19D,\x0f\x02)\x12\x02&&\x00\x00\x05\x00\x00\xffQ\t\x00\x05\x00\x00\x05\x009\x00V\x00\\\x00\x94\x00\x00\x1226&\"\x06\x05.\x05'\a\x06&'&6?\x01.\x02\x06#\"\x0f\x01#\x1126\x1e\x03\x17\x01\x16327\x1667\x167>\x01'\x1632>\x01&\x173\x11#'&+\x01\"\x0f\x01\x06\x14\x17\x1e\x01?\x016\x1e\x01\a\x1e\x01\x17\x1e\x01\x17\x16\x0426&\"\x06\x01\x11\x14\x06#!\x0e\x01\a\x0e\x01\a\x0e\x01'\x0e\x01.\x01'\x01!\"&5\x11463!>\x06;\x012\x176;\x012\x1e\x06\x17!2\x16\x98P P \x06\t\n9\x1a2#.\x16}S\xfbP9\x01:\xb1\x16:%L\v\\B\x9e\x9b\x05 \f\x1b\x0e\x15\b\x01)spN/9o\x11J5\x14 \x02\n!+D\x1f\a\x84`]\x9dBg\xa7Y9\xd1\x1c\x1b+\x86,\xc1\x199%\n\x10P\x14\x1dk\v4\x01\x00P P \x01\b&\x1a\xfeN\x1bnF!_7*}B<\x84{o0\xfe\xe1\xfe\x9a\x1a&&\x1a\x01\xa5\x0eB\x1d;*<@$ucRRc\xa7#@16#3\x1b7\x0e\x01c\x1a&\x01\x80@@@\x06\rJ\"@*4\x17\x8c^\x04`E\xb2D\xce\v\v\x01\x02B\x9e\xfd\xe0\x01\x01\x03\x06\v\b\xfe\xdco/\x1489\x062\x127\x17\n*@O\x18\x02\x00\xb4LC\xf3!T!3\x022\xda\x17\x033\x1f\x13X\x18$\x8b\x0fBJ@@@\x02\x00\xfd\x80\x1a&AS\n0C\f59\x04\"\v'D/\x01\x1a&\x1a\x02\xa0\x1a&\x0eD\x1c4\x17\x1c\v88\f\x11$\x1a5\x1fA\x10&\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00%\x00O\x00\x00\x01\x11\x14\x06#!\"&5\x1147>\x067>\x032\x1e\x02\x17\x1e\x06\x17\x16\x01$7>\x01/\x01.\x01\a\x06\a\x0e\x03\".\x02'&'&\x06\x0f\x01\x06\x16\x17\x16\x05\x1e\x042>\x03\a\x00^B\xfa@B^\v\b>\x15FFz\xa5n\x05_0P:P2\\\x06n\xa5zFF\x15>\b\v\xfd\xcc\x01\aR\v\x03\b&\b\x1a\v\xe7p\x05^1P:P1^\x05\xba\x9d\v\x1a\b&\b\x03\vR\x01\a\nP2NMJMQ0R\x03r\xfc.B^^B\x03\xd2\x0f\t\a7\x11:5]yP\x04H!%%\"F\x05Py]5:\x117\a\t\xfd\xa8\xbf=\b\x19\v4\v\x03\b\xa9Q\x03H!%%!H\x03\x86t\b\x03\v4\v\x19\b=\xbf\b<\"-\x16\x16/ ?\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x001\x00P\x00p\x00\x00\x01\x17\x16\x06\a\x0e\x02\a\x0e\x03+\x02\".\x02'.\x02'.\x01?\x01>\x01\x17\x16\x17\x1e\x03;\x022>\x027$76\x16\x13\x11&'&%.\x03+\x02\"\x0e\x02\a\x0e\x02\a\x06\a\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11476\x007>\x03;\x022\x1e\x02\x17\x1e\x02\x17\x16\x05\xc2'\b\x03\n+\xa7~\x04'*OJ%\x01\x01%JN,&\x05x\xa7'\v\x03\b%\b\x1b\v^\xd4\x05M,E\x18\x01\x01\x18E,M\x05\x01\x027\v\x1a\xc6ZE[\xfe\xd6\x03P*F\x18\x01\x01\x18F*P\x03\xd7\xc9:5\x0e\a\x13\r\x05\xc0\r\x13\x80^B\xfa@B^){\x01\xc6\x06$.MK%\x01\x01%KM.$+\xe2\xe2X)\x02o3\v\x19\b\"\x81a\x03 2\x17\x172!\x1f\x04]\x81\x1e\b\x19\v4\v\x04\tI\xa3\x04>\x1f\"\"\x1f>\x04\xc6,\b\x03\xfd&\x03\xa0S8J\xe6\x02B\x1e##\x1eB\x02\xa6\x9f12\f\a\xfc`\r\x13\x13\x03\xad\xfc`B^^B\x03\xa08&r\x01a\x05\x1e#1\x18\x181#\x1e$\xac\xb6R&\x00\x00\x00\x00\v\x00\x15\xff\x00\x05\xeb\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x1a\x00\x1e\x00\"\x00&\x00.\x002\x00v\x00\x00%\x17/\x01\x01%'\x05\x01\x17\x03'\x01%\x03\x05\x01\x17/\x01\x14\x16\x06\x0f\x01\x17\x16\x01\x05\x03%\x017\a\x17\x01%\x03\x05\x017'\a\x17\x16\x0f\x01%7\x0f\x02'\a\x14\x0f\x01\x06/\x01\x17\x14\a\x05\x06#&5'&\x03&?\x01&'\x03&?\x01&'\x03&7%2\x17\x05\x16\x15\x13\x14\x0f\x01\x17\x16\x15\x1776\x1f\x0174?\x016\x1f\x01\x1e\x01\x0e\x01\x15\x14\x0f\x01\x06\x01J\xca\"\xd8\x01\x12\x01\x12\v\xfe\xd4\xfe\xee\xe30\xf5\x01<\x01=\x0e\xfe\xa0\x01\x8d_\x02g\x02\x02\x04NU\a\xfd?\x01\x00D\xfe\xe9\x04f\x0f\xe6\x02\xfd\xe1\x01u\x13\xfeY\x03\x9a\x14\xe2\x02\x90\x06\x02\a\x01\x02\x1e\xb3\x14\x13G\b\x04\xea\a\ab\a\x04\xfe\xdb\x04\x02\b\xe4\x047\x02\a=^\x01H\x02\b^\x85\x02`\x02\t\x01\xb1\x05\x03\x01=\x06\x14\x06v~\x05\x05y\x05\x06T\x03\x05\xce\x06\x05\xf5\x04\x02\x0f\x14\x04\xbf\x06\x01\xd6\xec\xd5\xfe3\xda\xf5\xd7\x01\x86\xd5\x01G\xcc\xfd\xe2\xd6\x01D\xc8\xfe\xa3P\xefO\x01\x0f\t\x034F\x06\x02\x9e\xc8\x01ѭ\xfb\xb3\xea\xa4\xf0\x02q\xc2\x01\xb9\xa3\xfc\xbb\xe9\x8ei_\x04\x05w\\ހ\xe4!1u\x05\x03\xbb\x05\x05S\xa1\x05\x03\xea\x02\x02\x01\xf2\x04\x01\x11\a\x04%V\x06\x01_\a\x05-d\b\x01\xd2\n\x03\x87\x01\x99\x04\x05\xfe1\a\x03=U\x02\x06{J\x04\x048n\x06\x03~\x03\x03\x87\x04\x06r\x87\x03\x05\x02\x99\x05\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x1d\x00'\x00U\x00\x00\x014.\x03#\x0e\x04\".\x03'\"\x0e\x03\x15\x14\x163!26\x034&\"\x06\x15\x14\x1626\x01\x15\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x04\xb1\v\x1f0P3\x067\x1e3/./3\x1e7\x063P0\x1f\vT=\x02@=T\xad\x99֙\x99֙\x02|\x12\x0e`^B\xfb@B^^B\x04\xc0B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e``\x0e\x12\x01*9deG-\x04!\x10\x18\n\n\x18\x10!\x04-Ged9Iaa\x02\x9bl\x98\x98lk\x98\x98\xfeO\xc0\x0e\x12\xe0B^^B\x05\xc0B^^B\xe0\x12\x0e\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x80\x12\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\t\x00+\x00Y\x00i\x00\x00\x01\x14\x06\"&5462\x16\x032\x1e\x04\x15\x14\x06#!\"&54>\x03;\x01\x1e\x052>\x04\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x15\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x04\x04\x99֙\x99֙0.I/ \x10\aOB\xfd\xc0BO\t\x1c-Q5\x05\a2\x15-\x1d)&)\x1d-\x152\x02\xb3\x13\r``\r\x13\x13\r``\r\x13\x13\r`^B\xfb@B^^B\x04\xc0B^`\r\x13\xff\x00\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x03|k\x98\x98kl\x98\x98\xfe\xb8\"=IYL)CggC0[jM4\x04\x1f\v\x17\t\t\t\t\x17\v\x1f\x01\x04\r\x13\x80\x13\r\xc0\r\x13\x80\x13\r\xc0\r\x13\xe0B^^B\x05\xc0B^^B\xe0\x13\r\xfb@\x05\xc0\r\x13\x13\r\xfa@\r\x13\x13\x00\x00\x06\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x00\x004.\x02#\x0e\x04\".\x03'\"\x0e\x02\x14\x163!2\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!54&+\x01\"\x06\x1d\x01!54&+\x01\"\x06\x1d\x01!\"&5\x11463!2\x16\x04\x00\x12)P9\x060\x1b,***,\x1b0\x069P)\x12J6\x02\x006S\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\x00^B\xfe\xa0\x12\x0e@\x0e\x12\xfd\x00\x12\x0e@\x0e\x12\xfe\xa0B^^B\x06\xc0B^\x01U\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049ck\x80U\x02?\xbc\x85\x85\xbc\x85\xfe\xe6@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x128\x0f\x15\x15\x0f8\x0f\x15\x15\x01\v@\x0e\x12\x12\x0e@\x0e\x12\x12\x01N\xfb@B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`^B\x04\xc0B^^\x00\x00\a\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x85\x00\x00\x00\x14\x06#!\"&4>\x023\x1e\x042>\x0372\x1e\x01\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x01!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00J6\xfe\x006J\x12)P9\x060\x1b,***,\x1b0\x069P)\x8b\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x80\x13\r\xf9@\r\x13\x13\r\x01`\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x01`\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01ՀUU\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049c\x01\xbb\xbc\x85\x85\xbc\x85\xfd`@\x0e\x12\x12\x0e@\x0e\x12\x12\xee8\x0f\x15\x15\x0f8\x0f\x15\x15\xf5@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc2\x04\xc0\r\x13\x13\r\xfb@\r\x13`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00(\x00\x00%.\x01'\x0e\x01\"&'\x0e\x01\a\x16\x04 $\x02\x10& \x06\x10\x16 \x00\x10\x02\x06\x04#\"$&\x02\x10\x126$ \x04\x16\x05\xf3\x16\x83wC\xb9ιCw\x83\x16j\x01J\x01~\x01J\x89\xe1\xfe\xc2\xe1\xe1\x01>\x02\xe1\x8e\xef\xfe\xb4\xb7\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0ś\xcd\x10JSSJ\x10͛\x96\xaf\xaf\x02\xb2\x01>\xe1\xe1\xfe\xc2\xe1\x016\xfe\x94\xfe\xb5\xf1\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00$\x00,\x00\x00\x00 \x04\x16\x12\x15\x14\x02\x06\x04 $&\x02\x10\x126\x01654\x02&$ \x04\x06\x02\x15\x14\x17\x123\x16 72&\x10& \x06\x10\x16 \x02\xca\x01l\x01L\xf0\x8e\x8d\xf0\xfe\xb4\xfe\x92\xfe\xb4\uf38e\xf0\x04m\x95z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\x95B\xf0\x83\x01l\x83\xf0\xa9\xe1\xfe\xc2\xe1\xe1\x01>\x06\x00\x8e\xf0\xfe\xb4\xb6\xb5\xfe\xb4\xf0\x8f\x8e\xf1\x01K\x01l\x01L\xf0\xfbG\xcd\xfa\x9c\x01\x1c\xcezz\xce\xfe\xe4\x9c\xfa\xcd\x01G\x80\x80\xa1\x01>\xe1\xe1\xfe\xc2\xe1\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x1f\x00'\x007\x00\x00\x01\x1e\x04\x15\x14\x06#!\"&54>\x037&54>\x022\x1e\x02\x15\x14\x00 \x06\x10\x16 6\x10\x132654\x02'\x06 '\x06\x02\x15\x14\x163\x04\xb1/U]B,ȍ\xfc\xaa\x8d\xc8,B]U/OQ\x8a\xbdн\x8aQ\xfe\x9f\xfe\xc2\xe1\xe1\x01>\xe1+X}\x9d\x93\x91\xfe\x82\x91\x93\x9d}X\x02\xf0\x0e0b\x85Ӄ\x9a\xdbۚ\x83Ӆb0\x0e}\x93h\xbd\x8aQQ\x8a\xbdh\x93\x02\x13\xe1\xfe\xc2\xe1\xe1\x01>\xfa\xe1\x8ff\xef\x01\x14\a\u007f\u007f\a\xfe\xec\xeff\x8f\x00\x00\x00\x00\x04\x00\x00\xff\x00\x05\x00\x06\x00\x00\x11\x00\x19\x00#\x00=\x00\x00\x00\x14\x06#!\"&4>\x023\x16272\x1e\x01\x02\x14\x06\"&462\x01\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!\x15\x14\x16;\x0126=\x01!2\x16\x04\x00J6\xfe\x006J\x12)Q8P\xd8P8Q)\x88\x87\xbe\x87\x87\xbe\x01\xa1\xfc\x00\x13\r\x03\xc0\r\x13\x80^B\xfc@B^^B\x01`\x12\x0e\xc0\x0e\x12\x01`B^\x01V\x80VV\x80ld9KK9d\x01\xb9\xbc\x85\x85\xbc\x85\xfb\xa0\x05`\xfa\xa0\r\x13\x13\x05\xcd\xfa@B^^B\x05\xc0B^`\x0e\x12\x12\x0e`^\x00\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x014.\x02#\x06\"'\"\x0e\x02\x15\x14\x163!26\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01!54&#!\"\x06\x15!\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80\x0f\"D/@\xb8@/D\"\x0f?,\x01\xaa,?\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xf9\x80\a\x00\x12\x0e\xf9@\x0e\x12\a\x80^B\xf9@B^^B\x06\xc0B^\x01D6]W2@@2W]67MM\x01\xa3\xa0pp\xa0p\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01n`\x0e\x12\x12\x0e\xfb@B^^B\x04\xc0B^^\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x01\x14\x06#!\"&54>\x023\x16272\x1e\x02\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16%\x15\x14\x06#!\"&=\x01463!2\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80?,\xfeV,?\x0f\"D/@\xb8@/D\"\x0f\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x80\xf9\x00\x13\r\x06\xc0\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01D7MM76]W2@@2W]\x01֠pp\xa0p\xfd\xa0@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\xb2\x04`\xfb\xa0\r\x13\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x1d\xff\x00\x06\xe2\x06\x00\x00\x1a\x00A\x00\x00\x01\x10\x02#\"\x02\x11\x10\x12327.\x04#\"\a'632\x16\x176\x013\x16\x0e\x03#\".\x02'\x06#\"$&\x0254\x126$32\x1e\x03\x15\x14\x02\a\x1e\x01326\x04\xe7\xd2\xe1\xde\xd0\xd0\xdeJ9\x16\"65I).!1i\xab\x84\xa7CC\x01\x86u\x03\n+I\x8d\\Gw\\B!al\x96\xfe\xe3݇\x87\xde\x01\x1d\x95y\xebǙV\xa1\x8a/]:=B\x02\xed\x01>\x019\xfe\xc6\xfe\xc3\xfe\xc4\xfe\xc9\x11+\x0132\x16\x15\x14\a\x06\a\x06\x15\x10\x17\x16\x17\x1e\x04%\x14\x06#!\"&5463!2\x16\x03\x14\a\x0e\x01\a\x06#\"&54>\x0254'&#\"\x15\x14\x16\x15\x14\x06#\"54654'.\x01#\"\x0e\x01\x15\x14\x16\x15\x14\x0e\x03\x15\x14\x17\x16\x17\x16\x17\x16\x15\x14#\"'.\x0154>\x0354'&'&5432\x17\x1e\x04\x17\x14\x1e\x0532654&432\x17\x1e\x01\x05\x10\a\x0e\x03#\"&54>\x0176\x114&'&'.\x0554632\x17\x16\x12\x17\x16\x01\xc5 \x15\x01\f?c\xe1\xd5'p&\x13 ?b1w{2V\x02\x19\x0e\x14\t\x05?#\x1d\xfb\xc7\x1a&#\x1d\x049\x1a&\xd7C\x19Y'\x10\v\a\x10&.&#\x1d\x11\x03\x0f+\x17B\x03\n\r:\x16\x05\x04\x03 &65&*\x1d2\x10\x01\x01\x12\x06\x1bw\x981GF1\x19\x1d\x1b\x13)2<)<'\x1c\x10\b\x06\x03\b\n\f\x11\n\x17\x1c(\n\x1bBH=\x02ӊ\x13:NT \x10\x1e:O\t\xb7)4:i\x02\x16\v\x13\v\b \x13F~b`\f\x02e\x15!\x03\x0f}\x01\x1c\x01\x88\x01U\x01\x113i\x1b\x13\x1b?fR\xc7\xfa\xfe\xe7\xd2UX\x03\x1a\x10\x19\x16|\x1d'&\x1a\x1d'&\x02I\x86c&Q\x14\n\f\x06\t*2U.L6*\x05\f/\r\x16\x1aL\x0f:\x0f\x19\x15\x199\x01\x04\x04\x020\x1e%>..>%b>+\x14\x05\x05\x02\x03\x10\v+\xc1z7ymlw45)0\x10\t\f\x14\x1d\x1333J@0\x01!\x11!\x15\x16\v\x1c\x17\x19T\x14FL\xa0\x87\xfe\xee\xe5 P]=\x1f\x10\x0fGS\v\xe6\x01-\x83\xd0kwm\x03\x15\f\x17\x11\x14\t\x13!\xa9\x83\xfe\xe4\xac*\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x18\x00(\x00\x00%\x136&\a\x01\x0e\x01\x16\x1f\x01\x016\x17\x16\a\x019\x01\a2?\x01\x17\x16\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\xa5\x93\t' \xfc\xa0\x1d\x15\x10\x18\xdd\x02\x01\x15\v\a\v\xfea\x10\x17\x16l\xe0@\x02l\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xe5\x02\xb5,&\f\xfe\xb3\v\x1c\x19\aE\x01C\x0e\b\x05\n\xfe\x89\xe4\x16h\xa5$\x02\x9b\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x06\x00\x00\xff\x00\x04\x00\x06\x00\x00\r\x00\x1f\x00/\x003\x007\x00;\x00\x00%\x14\x06\"&5467\x113\x11\x1e\x01\x174&'\x114&\"\x06\x15\x11\x0e\x01\x15\x14\x16 67\x14\x00 \x00547\x1146 \x16\x15\x11\x16\x13\x15#5\x13\x15#5\x13\x15#5\x02\x80p\xa0pF:\x80:F\x80D\x00F\x00N\x00V\x00^\x00f\x00n\x00v\x00~\x00\x86\x00\x8e\x00\x96\x00\x9e\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01.\x017&#\"\x06\x15\x11!\x114>\x0232\x16\x176\x16\x17762\x17\x022\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04462\x16\x14\x06\"$2\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4$2\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x05\x99\n\n\xfd\x8e\n\x1a\nR\n\n,H\x138Jfj\x96\xff\x00Q\x8a\xbdhj\xbeG^\xceR,\n\x1a\n!4&&4&\x01Z4&&4&\xa64&&4&\xfd\xa64&&4&\x01\x00&4&&4\x01\x004&&4&\xfd\xa64&&4&\x01Z4&&4&\xa64&&4&\xfe\xda4&&4&\xa64&&4&\xfe\xa64&&4&\x01&4&&4&Z4&&4&Z4&&4&\x05\a\n\x1a\n\xfd\x8e\n\nR\n\x1a\n,[\xe8cG\x96j\xfb\x00\x05\x00h\xbd\x8aQRJ'\x1dA,\n\n\xfe\xa7&4&&4Z&4&&4Z&4&&4Z&4&&444&&4&\x80&4&&4Z&4&&4Z&4&&4Z&4&&4\xda&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4\x00\x11\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00%\x00-\x005\x00=\x00E\x00M\x00}\x00\x85\x00\x8d\x00\x95\x00\x9d\x00\xa5\x00\xad\x00\xb5\x00\xbd\x00\xc5\x00\x00\x01\x15\x14\a\x15\x14\x06+\x01\"&=\x01\x06#!\"'\x15\x14\x06+\x01\"&=\x01&=\x01\x00\x14\x06\"&4626\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x0146;\x01\x114632\x176\x16\x1776\x1f\x01\x16\a\x01\x06/\x01&?\x01.\x017&#\"\x06\x15\x11!2\x16\x00\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462\x06\x80\x80\x12\x0e@\x0e\x12?A\xfd\x00A?\x13\r@\r\x13\x80\x02@\x12\x1c\x12\x12\x1cR\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x04R\x12\x0e\xf9@\x0e\x12\x12\x0e`\x96jlL.h)\x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16$\t\x1c%35K\x05\xe0\x0e\x12\xfc\x80\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c\x01\xc0\xc0\xa9u\xc2\x0e\x12\x12\x0ev\x16\x16n\x11\x17\x17\x11\xbau\xa9\xc0\x01\xae\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\xfd\xe0@\x0e\x12\x12\x0e@\x0e\x12\x02\x80j\x96N\x13\x0e \x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16.t2#K5\xfd\x80\x12\x01\xc0\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12\x00\x00\x00\x04\x00\x01\xff\x00\x06\x00\x05\xfe\x00\r\x00@\x00H\x00q\x00\x00\x01\x14\a\x06\a\x06 '&'&54 \x01\x14\x00\a\x06&76767676\x1254\x02$\a\x0e\x03\x17\x16\x12\x17\x16\x17\x16\x17\x1e\x01\x17\x16\x06'.\x01\x0276\x126$76\x04\x16\x12\x04\x14\x06\"&462\x01\x14\x06\a\x06&'&'&7>\x0154.\x01\a\x0e\x01\a\x06\x16\x17\x16\a\x06\a\x0e\x01'.\x017>\x0276\x1e\x01\x03\xe2\x11\x1f\x18\x16\xfe\xfc\x16\x18\x1f\x11\x01\xc0\x02\x1e\xfe\xf4\xd8\b\x0e\x01\a\x03\x04\x02\x01\b\x9f\xc1\xb6\xfeȵ|\xe2\xa1_\x01\x01ğ\a\x02\x03\x03\x01\b\x02\x01\x0f\b\x94\xe2y\b\av\xbf\x01\x03\x8f\xa4\x01/ۃ\xfd\u20fa\x83\x83\xba\x01\xa3k]\b\x10\x02\x06\x17\a\n:Bu\xc6q\x85\xc0\r\nCA\n\a\x18\x05\x02\x10\b_k\x02\x03\x84ނ\x90\xf8\x91\x01XVo\xd7bZZb\xd7nW\xa8\x01\x00\xf0\xfe|V\x03\f\t0\x12 \x0f\t\x03Q\x012\xb8\xb4\x01-\xa8\n\al\xad\xe7}\xb8\xfe\xcfO\x03\t\x15\x18\t/\f\t\f\x04:\xdf\x011\xa7\x8f\x01\x05\xc1z\t\nq\xd0\xfe\xdb%\xba\x83\x83\xba\x83\xff\x00z\xd5G\x06\b\n4(\n\n6\x92Ro\xbaa\f\x0fą\\\xa8<\n\n)4\t\b\x06J\xda}\x83\xe2\x89\x06\a\x86\xf1\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\x13\x00\x00%!\x11!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x00\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x80\x03\x00\x01`\xfb@B^^B\x04\xc0B^^\x00\x01\x00\x00\xff\x80\a\x00\x01\x80\x00\x0f\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\a\x00^B\xfa@B^^B\x05\xc0B^\xe0\xc0B^^B\xc0B^^\x00\x00\x00\x03\x00\x00\xff\x00\b\x00\x06\x00\x00\x03\x00\f\x00&\x00\x00)\x01\x11)\x02\x11!\x1132\x16\x15\x01\x11\x14\x06#!\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x01\x00\x03\x00\xfd\x00\x04\x00\x02\x00\xfd\x00`B^\x03\x00^B\xfd\xa0^B\xfc@B^^B\x02`^B\x03\xc0B^\x02\x00\x03\x00\xff\x00^B\x02\x00\xfc@B^\xfe\xa0B^^B\x03\xc0B^\x01`B^^\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00#\x003\x00\x00%764/\x01764/\x01&\"\x0f\x01'&\"\x0f\x01\x06\x14\x1f\x01\a\x06\x14\x1f\x01\x162?\x01\x17\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x97\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\x02s^B\xfa@B^^B\x05\xc0B^ג\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\x04\x13\xfb@B^^B\x04\xc0B^^\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x007\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x14\x01!\x11!%\x11\x14\x06#!\"&5\x11463!2\x16\x04\xe9\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\xfc\r\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x01\xa9\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\xfe\xcd\x04\x00`\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x13\x00\x00\t\x01!\x01\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04.\x012\xfdr\xfe\xce\x05`\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01f\x024\xfd\xcc\x01\xd0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\a\x00\x00\xff\x00\a\x02\x06\x00\x00\a\x00\x13\x00#\x00.\x00C\x00\xc4\x00\xd4\x00\x00\x01&\x0e\x01\x17\x16>\x01\x05\x06\"'&4762\x17\x16\x14\x17\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14'\x06\"'&4762\x16\x14%\x0e\x01'.\x01>\x02\x16\x17\x1e\a\x0e\x01\x136.\x02'.\x01\a>\x01\x1f\x016'>\x01/\x01>\x0176&'&\x06\a\x0e\x01\x1e\x01\x17.\x01'&7&'\"\a>\x01?\x014'.\x01\x06\a67\x06\x1e\x01\x17\x06\a\x0e\x01\x0f\x01\x0e\x01\x17\x16\x17\x06\a\x06\x14\x167>\x017.\x02\a>\x043\x167654'\x16\a\x0e\x01\x0f\x01\x0e\x05\x16\x17&'\x0e\x04\x16\x17\x166\x127>\x017\x16\x17\x1676\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05\v\x0f(\f\v\x0e4\x10\xfeZ\b\x17\a\b\b\a\x17\b\a\x9e#\f#\r&\f\f#\f#\r&\fy\a\x17\b\a\a\b\x16\x10\x01\x8b\"\x936&.\x04JM@&\x02\x16\a\x13\x06\x0e\x03\x05\x03\a\xc3\x03\x17 \"\x06(XE\x13*\f\f\x02$\x06\x01\x03\x03+8\x06\njT\x01?\x013\x03\x13#'.\x01'&!\x11\x14\x163!2>\x04?\x013\x06\x02\a.\x01'#!\x0557>\x017\x13\x12'.\x01/\x015\x05!27\x0e\x01\x0f\x01#'.\x01#!\"\x06\x02\x06g\xb1%%D-\x11!g\x0e\ag\x1d\x0f<6W\xfe\xf7WZ\x01e#1=/2*\x12]Y\x063\x05\x92\xeb-,\xfd\x8c\xfe\x88\u007fC1\x01\b\x03\v\x02/D\u007f\x01x\x02\xbe\x8b\xeb\x06\x10\x04\x05] \x1fVF\xfd\xdc\x1c\x0f\x05I\xfdq\x01\x05\x03\x03\x02-H\x8e\xfe\xbe\xfe\xc1\u007fD2\x01\b\xfd\xd4NK\x04\v\x19'>*\xd8%\xfeR=\x05\x06\x01\ff\x19\r07\x02\x83\x01\x92\xf3=.\r\x18f\f\x1bD\xfd]\\|yu\x11\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x11\x00,\x000\x00>\x00S\x00e\x00u\x00\x00\x01\x15\x14\x16\x0e\x04#\x112\x1e\x03\x1c\x01\x05\x15\x14\x16\x0e\x02#\"'&5<\x03>\x0232\x1e\x03\x1c\x01\x053\x11#\x013\x11#\a&'#\x113\x11\x133\x13\x054'.\x05\"#\"+\x01\x1123\x166'&\x0554.\x02#\"\a5#\x1137\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9a\x01\x01\x02\x05\b\x0e\t\t\x0e\b\x05\x02\x01<\x01\x01\x04\v\b\t\x05\x04\x03\x04\x06\x05\x06\b\x05\x03\x01\xfb\xdezz\x01\xb2j\x9f\x1c\x14\f\x9ek-L+\x01\xa9\x05\x03\x10\x12 \x15)\x11\x15\b\x04[\x14$\xa98\x03\x01\x01=\x04\x0f\"\x1d.\x1fun\a\x1e/2 \xb4^B\xfb@B^^B\x04\xc0B^\x02\xe3\xb6\x04\x16\b\x10\a\b\x03\x015\x02\b\x03\x10\x05\x16cy\x01\x17\b\x0f\x06\t\n\x9b\x02\n\a\v\x06\b\x03\x03\x06\x06\v\x05\x0e\xee\x01\xd8\xfe(\x01\xd8ݔI\xfe(\x018\xfe\xc8\x01?\x0eC\x17\x10\x19\x10\f\x05\x03\xfe(\x013\x9b>\x9f\x85\x1d #\x0f\"\x9a\xfe(\x1e$=\x03\x12\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x05\x000\xff\x02\bK\x05\xf8\x00\f\x00\x15\x00\x1a\x00S\x00\x8f\x00\x00\x05&'.\x04'&'\x16\x00\x01\x17.\x01/\x01\x06\a\x16\x13\x06\a67\x014\x02&$#\"\x04\a\x06\a>\x03\x1f\x01\x1e\x03\a&\x0e\x02\a\x1e\x02\x17\x16>\x02?\x01>\x01\x16\x17\x16\a\x06\x05\x06'\x1e\x03\x1f\x01\x1676\x12\x13\x06\a\x06\x02\a\x06\a\x06'\x06# \x00\x03\"&#\x06\x1e\x02\x1f\x01\x16\x17.\x03/\x01.\x06'\x1e\x02\x177676767>\x0176$\x04\x17\x16\x12\x04w\x06\x05\r.~ku\x1f\x11\x9eB\x01R\xfe]\xa8\x19 \x03\x04T%\x05z+\",\x1e\x05\xa0|\xd3\xfeޟ\x93\xfe\xf4j\x1e\x0f<\xa6\x97\x87)(!(\t\x04\x03~ˣzF\x04\x0f8\"{\xf9\xb4\x91%%\x16#\x1a\x04\x0e5\xd0\xfe\xfd\x87\xb6)\x8a\x88}''\x8fx\xc3\xeeJ\x0e\x1aF\xdf\xcf0\"H[$%\xfe\xe5\xfeEJ\x01\x06\x02\x06\x11#%\r\x0e\b.Gk2\x1d\x03\x02\x059(B13\"\b\x13?\xa3@\x02\vS)\x87\x1c5\x0f\" \x9e\x01#\x019\x96\xdc\xe2\xc5\x01\x03\b\x1edm\xabW\x03\"\xd5\xfe\xd6\x02;\x1cL\xb765R\x8eA\x020@T.\x16\xfe\x9e\xa1\x01$\xd4}i`:f3A\x15\x06\x04\x03\x01\x1d%%\n\v\x15BM<$q\xf3:\x06)BD\x19\x18\x10\t\x13\x19a\x18a%\x14\x04`\xa1]A\v\f\x17&c\x01|\x01\t\x87M\xd0\xfe\xebs!\v\x1a\n\x03\x01Z\x01\r\x012}i[\x1a\x1a\fF&\x89\x8f\x83**\x02\x15\x0f\x1a\x18\x1b\x1b\f\n\x1f<\b \x95\x8dʣsc\x1c\"\x0fJ<&Ns\xfeF\x00\x05\x00%\xff\f\x06\xd8\x05\xf4\x00\x17\x000\x00@\x00W\x00m\x00\x00\x016&'.\x01\x06\a\x06\x16\x17\x1e\x02\x17\x1e\a6\x01\x0e\x02\x04$.\x01\x027>\x037\x06\x1a\x01\f\x01$76\a\x14\x02\x14\x0e\x02\".\x024>\x022\x1e\x01\x05.\x01,\x01\f\x01\x06\x02\x17&\x02>\x04\x1e\x02\x17\x1e\x01\x036\x00'\"'&7\x1e\x04\x0e\x03\a>\x03\x05=\x1dGV:\x87e\x12\f\x0f#\x17\x1f:\x1b$?+%\x18\x14\r\v\n\x01q4\xc1\xec\xfe\xf2\xfe\xfa\xf0\xb4g\x05\x01\x0f\n&\x043h\xf2\x01T\x01`\x01Zt\x14\x02\xf3Q\x88\xbcм\x88QQ\x88\xbcм\x88\x01pA\xe7\xfe\xed\xfe\xcb\xfe\xdb\xfe\xfe\xb6P\x1e1\x05L\x8e\xbd\xe1\xef\xf6\xe2\xceK!:<\f\xfe\xd7\xf8\b\x02\x02\x1a}҈`\x15\x17d\x91\xe1\x88l\xbb\xa1b\x02\xf0,\xab9'\x1d\x14\x1b\x17\n\x05\x03\x04\x0f\n\r%%($!\x18\r\x01\xfd\xcb\u007f\xbaa\x183\x83\xc0\x01\x17\xa4)W)x\r\xd0\xfe\x86\xfe\xfe\x9a\f\xa1\xa4\x1b\r\x04\x02\x1fо\x8aQQ\x8a\xbeо\x8aQQ\x8a\x06\x93\xd0c\bQ\xb1\xf6\xfe\xa4ǡ\x01-\xf4җe)\x17U\xa4s2\x8e\xfe\x81\xf4\x01XD\x05\x05\x03\x04\\\x94\xbd\xd1ϼ\x92Y\x02\x1ed\x92\xcf\x00\x00\x00\x00\v\x00\x00\xff\x80\x06\x00\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x0132\xc0p\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10\x04\xb08(\xfc\xc0(88(\x03@(8\x01\x00\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\xa0\xfa@(88(\x05\xc0(88\xfb\b \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\x00\x00\x00\x00\x01\x00/\xff\x00\x06Q\x06\x00\x00\x90\x00\x00\x01\a\x17\x1e\x01\a\x0e\x01/\x01\x17\x16\x06&'\x03%\x11\x17\x1e\x01\x0e\x01&/\x01\x15\x14\x06\"&=\x01\a\x0e\x01.\x016?\x01\x11\x05\x03\x0e\x01&?\x01\a\x06&'&6?\x01'.\x01>\x01\x17\x05-\x01\x05\x06#\".\x016?\x01'.\x01>\x01\x1f\x01'&6\x16\x17\x13\x05\x11'.\x01>\x01\x16\x1f\x015462\x16\x1d\x017>\x01\x1e\x01\x06\x0f\x01\x11%\x13>\x01\x16\x0f\x0176\x16\x17\x16\x06\x0f\x01\x17\x1e\x01\x0e\x01#\"'%\r\x01%6\x1e\x01\x06\x06\x1e\xa7\xba\x17\r\r\x0e2\x17\xba7\r2G\rf\xfe\xf1\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\xfe\xf1f\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1d\x1a\t*\x1d\x016\x01\x0f\xfe\xf1\xfe\xca\x04\t\x1b\"\x04\x1a\x1b\xa7\xba\x17\r\x1a4\x16\xba7\r2G\rf\x01\x0f\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\x01\x0ff\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1b\x1a\x04\"\x1b\t\x04\xfe\xca\xfe\xf1\x01\x0f\x016\x1d*\t\x1a\x01\xa3!k\r3\x17\x17\r\rj\xa0&3\n%\x01,\x9c\xfe\xc7\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\x019\x9c\xfe\xd4%\n3&\xa0j\r\r\x17\x173\rk!\x06./!\x06>\x9d\x9d>\x01$,*\x05!k\r3.\x0e\x0ej\xa0&3\n%\xfeԜ\x019\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\xfeǜ\x01,%\n3&\xa0j\r\r\x17\x173\rk!\x05*,$\x01>\x9d\x9d>\x06!/.\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x12\x00&\x00\x00\x016.\x02'&\x0e\x02\a\x06\x1e\x02\x17\x16$\x12\t\x01\x16\x12\a\x06\x02\x04\a\x05\x01&\x0276\x12$76$\x05\xc1\aP\x92\xd0utۥi\a\aP\x92\xd1u\x9b\x01\x14\xac\x01G\xfe\xa3xy\n\v\xb6\xfeԶ\xfc\x19\x01[xy\n\v\xb6\x01-\xb6\xa7\x02\x9a\x02_v١e\a\aN\x8f\xcfuv١e\a\t\x88\x00\xff\x04=\xfe\xa4u\xfeʦ\xb7\xfe\xc8\xc7\x19\x84\x01[t\x017\xa6\xb8\x018\xc7\x19\x16X\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x0e\x00\x12\x00\x16\x00&\x006\x00\x00\x01\x13#\v\x01#\x13'7\x17\a\x01\x05\x03-\x01\x17\a'%\x17\a'\x04\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb4\xa33\xaf\xab1\xb3N\x15\xf0\x15\xfeE\x010\x82\xfe\xd0\x01\xda\xf0g\xef\x01\u007f\xbfR\xbe\x02=|\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x01\"\x01>\x01\"\xd3\xec\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01\xfc\xfe\xb7\x01^\xfe\xa2\x01v!1f2\x02i\x82\xfeЂwg\xeffZQ\xbeQ^\x01>\x01\"\xd3||\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x02w\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\f\x00&\xff\x01\aZ\x05\xff\x00X\x00b\x00l\x00w\x00\x81\x00\xab\x00\xb7\x00\xc2\x00\xcd\x00\xd8\x00\xe4\x00\xee\x00\x00\x01.\x03'&>\x01'&'&\x0f\x01\x0e\x03\".\x01'.\x06'&\x06\a\x0e\x03&'&'&\x06\a\x0e\x03\x15\x06\x167>\x0176\x127>\x01\x17\x16\a\x0e\x01\a\x06\x1667>\x0276\x172\a\x06\x02\a\x06\x16\x17\x1e\x026\x04\x16\x06\a\x06&'&>\x01\x01\x16\x0e\x01&'&>\x01\x16\x00\x0e\x01'.\x017>\x01\x17\x16\x01\x16\x0e\x01.\x01676\x16\x13\x16\x02\a\x06'\x0e\x01&'\x06\a\x06&'&'.\x0267.\x01>\x017>\x02\x16\x176\x1e\x03\a\x1e\x02\x06\x01\x16\x06\a\x06&'&676\x16\x13\x16\x0e\x01&'&676\x16\x01\x16\x06\a\x06.\x01676\x16\x01\x16\x06\a\x06&'&>\x01\x16\x01\x16\x06\a\x06&'&676\x16'\x16\x06\a\x06.\x01>\x01\x16\x056\x04/4-\x03\x05LJ\x05\x0eg-\x1e\x03\x04\x02\a\x03\a\x05\a\x03\x03\f\x06\v\b\v\v\x06\x1e$\x1b\x01\x10\t\x15\f\v6\x1e)j\x17\x102%+\x16QF\x1e)\x12\a\x90\x05\x06\x1f\x0e\x1b\x06\x02b\x01\x063F\x14\x04SP\x06\x14\x15\x1d\x04\x02\u007f\a\f21\x11DK2\xfcA\x06\x10\x0f\x0e\x19\x03\x03\x10\x1c\x02W\f\a\")\f\v\a\")\xfd\x15$?\x1a\x1a\f\x12\x12?\x1a\x1a\x05\x04\x13\f8A&\f\x1b\x1cA\x84E5lZm\x14\x81\x9e=\f\x01g\xf4G2\x03Sw*&>$\x045jD \x86\x9f\xb1GH\x88yX/\x064F\x15 \xfbr\x0e\t\x14\x131\r\x0e\t\x14\x131\xac\x04\x12\"\x1c\x04\x03\x13\x10\x11\x1c\x04\xa5\x04\x15\x14\x13\"\b\x15\x14\x14!\xfdl\x10\x0f\x1c\x1b=\x10\x10\x0f6>\x02\xfa\x04\x10\x0f\x0f\x19\x03\x03\x10\x0f\x0e\x19\xbc\x0f\t\x16\x166\x1e\n,5\x01.\x18\x14\x01\x18\x1a/\xb9\xb1'e\x02\x01\x11\x02\x02\x01\x03\x01\x03\x04\x03\x02\r\x05\n\x05\x06\x03\x01\x05\x10\x17\x01\x0f\a\r\x02\x02\x1b\r\x12.*\x1c\x8d|\x90\x01Ed\x04\x02\x1a!\r\x01u\b\v\x0e\a\x0f&\x12\xf3\v&%\x17&\b\xa8\x9f\t\x1d\x01&\x10\xfe\xf9\x1c5d\x18\t\r\x03\x1f\xa8\x1e\x19\x03\x03\x10\x0f\x0e\x1a\x06\xfe\xda\x11)\x18\b\x11\x11)\x18\b\x0366\f\x13\x12@\x1a\x1b\f\x12\x13\xfd\x01\x1cC&\f8B\x14\x13\f\x02@q\xfe\xf9L?\x03P^\x057\t\x01G-hI[\x0eq\x8f\xa1:<\x88rS\tU~9\x177\x15\aA_\x87I\x10R`g\x02p\x141\x0e\x0e\t\x14\x141\x0e\x0e\t\x01\x05\x10\x1d\b\x13\x11\x11\x1c\x04\x04\x13\xfc;\x14\"\x04\x04\x15(\"\x05\x04\x17\x03j\x1b?\x10\x10\x0f\x1b\x1c>\"\x10\xfdT\x0f\x19\x04\x03\x11\x0e\x0f\x1a\x03\x03\x10\xe2\x166\x10\x0f\n,6 \n\x00\x00\x00\x18\x01&\x00\x01\x00\x00\x00\x00\x00\x00\x00/\x00`\x00\x01\x00\x00\x00\x00\x00\x01\x00\v\x00\xa8\x00\x01\x00\x00\x00\x00\x00\x02\x00\a\x00\xc4\x00\x01\x00\x00\x00\x00\x00\x03\x00\x11\x00\xf0\x00\x01\x00\x00\x00\x00\x00\x04\x00\v\x01\x1a\x00\x01\x00\x00\x00\x00\x00\x05\x00\x12\x01L\x00\x01\x00\x00\x00\x00\x00\x06\x00\v\x01w\x00\x01\x00\x00\x00\x00\x00\a\x00Q\x02'\x00\x01\x00\x00\x00\x00\x00\b\x00\f\x02\x93\x00\x01\x00\x00\x00\x00\x00\t\x00\n\x02\xb6\x00\x01\x00\x00\x00\x00\x00\v\x00\x15\x02\xed\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x1e\x03A\x00\x03\x00\x01\x04\t\x00\x00\x00^\x00\x00\x00\x03\x00\x01\x04\t\x00\x01\x00\x16\x00\x90\x00\x03\x00\x01\x04\t\x00\x02\x00\x0e\x00\xb4\x00\x03\x00\x01\x04\t\x00\x03\x00\"\x00\xcc\x00\x03\x00\x01\x04\t\x00\x04\x00\x16\x01\x02\x00\x03\x00\x01\x04\t\x00\x05\x00$\x01&\x00\x03\x00\x01\x04\t\x00\x06\x00\x16\x01_\x00\x03\x00\x01\x04\t\x00\a\x00\xa2\x01\x83\x00\x03\x00\x01\x04\t\x00\b\x00\x18\x02y\x00\x03\x00\x01\x04\t\x00\t\x00\x14\x02\xa0\x00\x03\x00\x01\x04\t\x00\v\x00*\x02\xc1\x00\x03\x00\x01\x04\t\x00\x0e\x00<\x03\x03\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00 \x002\x000\x001\x006\x00.\x00 \x00A\x00l\x00l\x00 \x00r\x00i\x00g\x00h\x00t\x00s\x00 \x00r\x00e\x00s\x00e\x00r\x00v\x00e\x00d\x00.\x00\x00Copyright Dave Gandy 2016. All rights reserved.\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00Regular\x00\x00F\x00O\x00N\x00T\x00L\x00A\x00B\x00:\x00O\x00T\x00F\x00E\x00X\x00P\x00O\x00R\x00T\x00\x00FONTLAB:OTFEXPORT\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x004\x00.\x007\x00.\x000\x00 \x002\x000\x001\x006\x00\x00Version 4.7.0 2016\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00P\x00l\x00e\x00a\x00s\x00e\x00 \x00r\x00e\x00f\x00e\x00r\x00 \x00t\x00o\x00 \x00t\x00h\x00e\x00 \x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00s\x00e\x00c\x00t\x00i\x00o\x00n\x00 \x00f\x00o\x00r\x00 \x00t\x00h\x00e\x00 \x00f\x00o\x00n\x00t\x00 \x00t\x00r\x00a\x00d\x00e\x00m\x00a\x00r\x00k\x00 \x00a\x00t\x00t\x00r\x00i\x00b\x00u\x00t\x00i\x00o\x00n\x00 \x00n\x00o\x00t\x00i\x00c\x00e\x00s\x00.\x00\x00Please refer to the Copyright section for the font trademark attribution notices.\x00\x00F\x00o\x00r\x00t\x00 \x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00Fort Awesome\x00\x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00\x00Dave Gandy\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00\x00http://fontawesome.io\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00/\x00\x00http://fontawesome.io/license/\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x8e\x00\x8b\x00\x8a\x00\x8d\x00\x90\x00\x91\x00\x8c\x00\x92\x00\x8f\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\a\x01\b\x01\t\x01\n\x01\v\x01\f\x01\r\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\"\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x011\x012\x013\x014\x015\x016\x017\x018\x019\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\\\x01]\x01^\x01_\x01`\x01a\x01b\x00\x0e\x00\xef\x00\r\x01c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01}\x01~\x01\u007f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\a\x02\b\x00\"\x02\t\x02\n\x02\v\x02\f\x02\r\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\"\x02#\x02$\x02%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x021\x022\x023\x024\x025\x026\x027\x028\x029\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02Q\x02R\x02S\x00\xd2\x02T\x02U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\\\x02]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02}\x02~\x02\u007f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\a\x03\b\x03\t\x03\n\x03\v\x03\f\x03\r\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\"\x03#\x03$\x03%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x031\x032\x033\x034\x035\x036\x037\x038\x039\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\\\x03]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03}\x03~\x03\u007f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x00\x94\x05glass\x05music\x06search\benvelope\x05heart\x04star\nstar_empty\x04user\x04film\bth_large\x02th\ath_list\x02ok\x06remove\azoom_in\bzoom_out\x03off\x06signal\x03cog\x05trash\x04home\bfile_alt\x04time\x04road\fdownload_alt\bdownload\x06upload\x05inbox\vplay_circle\x06repeat\arefresh\blist_alt\x04lock\x04flag\nheadphones\nvolume_off\vvolume_down\tvolume_up\x06qrcode\abarcode\x03tag\x04tags\x04book\bbookmark\x05print\x06camera\x04font\x04bold\x06italic\vtext_height\ntext_width\nalign_left\falign_center\valign_right\ralign_justify\x04list\vindent_left\findent_right\x0efacetime_video\apicture\x06pencil\nmap_marker\x06adjust\x04tint\x04edit\x05share\x05check\x04move\rstep_backward\rfast_backward\bbackward\x04play\x05pause\x04stop\aforward\ffast_forward\fstep_forward\x05eject\fchevron_left\rchevron_right\tplus_sign\nminus_sign\vremove_sign\aok_sign\rquestion_sign\tinfo_sign\nscreenshot\rremove_circle\tok_circle\nban_circle\narrow_left\varrow_right\barrow_up\narrow_down\tshare_alt\vresize_full\fresize_small\x10exclamation_sign\x04gift\x04leaf\x04fire\beye_open\teye_close\fwarning_sign\x05plane\bcalendar\x06random\acomment\x06magnet\nchevron_up\fchevron_down\aretweet\rshopping_cart\ffolder_close\vfolder_open\x0fresize_vertical\x11resize_horizontal\tbar_chart\ftwitter_sign\rfacebook_sign\fcamera_retro\x03key\x04cogs\bcomments\rthumbs_up_alt\x0fthumbs_down_alt\tstar_half\vheart_empty\asignout\rlinkedin_sign\apushpin\rexternal_link\x06signin\x06trophy\vgithub_sign\nupload_alt\x05lemon\x05phone\vcheck_empty\x0ebookmark_empty\nphone_sign\atwitter\bfacebook\x06github\x06unlock\vcredit_card\x03rss\x03hdd\bbullhorn\x04bell\vcertificate\nhand_right\thand_left\ahand_up\thand_down\x11circle_arrow_left\x12circle_arrow_right\x0fcircle_arrow_up\x11circle_arrow_down\x05globe\x06wrench\x05tasks\x06filter\tbriefcase\nfullscreen\x05group\x04link\x05cloud\x06beaker\x03cut\x04copy\npaper_clip\x04save\nsign_blank\areorder\x02ul\x02ol\rstrikethrough\tunderline\x05table\x05magic\x05truck\tpinterest\x0epinterest_sign\x10google_plus_sign\vgoogle_plus\x05money\ncaret_down\bcaret_up\ncaret_left\vcaret_right\acolumns\x04sort\tsort_down\asort_up\fenvelope_alt\blinkedin\x04undo\x05legal\tdashboard\vcomment_alt\fcomments_alt\x04bolt\asitemap\bumbrella\x05paste\nlight_bulb\bexchange\x0ecloud_download\fcloud_upload\auser_md\vstethoscope\bsuitcase\bbell_alt\x06coffee\x04food\rfile_text_alt\bbuilding\bhospital\tambulance\x06medkit\vfighter_jet\x04beer\x06h_sign\x04f0fe\x11double_angle_left\x12double_angle_right\x0fdouble_angle_up\x11double_angle_down\nangle_left\vangle_right\bangle_up\nangle_down\adesktop\x06laptop\x06tablet\fmobile_phone\fcircle_blank\nquote_left\vquote_right\aspinner\x06circle\x05reply\ngithub_alt\x10folder_close_alt\x0ffolder_open_alt\nexpand_alt\fcollapse_alt\x05smile\x05frown\x03meh\agamepad\bkeyboard\bflag_alt\x0eflag_checkered\bterminal\x04code\treply_all\x0fstar_half_empty\x0elocation_arrow\x04crop\tcode_fork\x06unlink\x04_279\vexclamation\vsuperscript\tsubscript\x04_283\fpuzzle_piece\nmicrophone\x0emicrophone_off\x06shield\x0ecalendar_empty\x11fire_extinguisher\x06rocket\x06maxcdn\x11chevron_sign_left\x12chevron_sign_right\x0fchevron_sign_up\x11chevron_sign_down\x05html5\x04css3\x06anchor\nunlock_alt\bbullseye\x13ellipsis_horizontal\x11ellipsis_vertical\x04_303\tplay_sign\x06ticket\x0eminus_sign_alt\vcheck_minus\blevel_up\nlevel_down\ncheck_sign\tedit_sign\x04_312\nshare_sign\acompass\bcollapse\fcollapse_top\x04_317\x03eur\x03gbp\x03usd\x03inr\x03jpy\x03rub\x03krw\x03btc\x04file\tfile_text\x10sort_by_alphabet\x04_329\x12sort_by_attributes\x16sort_by_attributes_alt\rsort_by_order\x11sort_by_order_alt\x04_334\x04_335\fyoutube_sign\ayoutube\x04xing\txing_sign\fyoutube_play\adropbox\rstackexchange\tinstagram\x06flickr\x03adn\x04f171\x0ebitbucket_sign\x06tumblr\vtumblr_sign\x0flong_arrow_down\rlong_arrow_up\x0flong_arrow_left\x10long_arrow_right\awindows\aandroid\x05linux\adribble\x05skype\nfoursquare\x06trello\x06female\x04male\x06gittip\x03sun\x04_366\aarchive\x03bug\x02vk\x05weibo\x06renren\x04_372\x0estack_exchange\x04_374\x15arrow_circle_alt_left\x04_376\x0edot_circle_alt\x04_378\fvimeo_square\x04_380\rplus_square_o\x04_382\x04_383\x04_384\x04_385\x04_386\x04_387\x04_388\x04_389\auniF1A0\x04f1a1\x04_392\x04_393\x04f1a4\x04_395\x04_396\x04_397\x04_398\x04_399\x04_400\x04f1ab\x04_402\x04_403\x04_404\auniF1B1\x04_406\x04_407\x04_408\x04_409\x04_410\x04_411\x04_412\x04_413\x04_414\x04_415\x04_416\x04_417\x04_418\x04_419\auniF1C0\auniF1C1\x04_422\x04_423\x04_424\x04_425\x04_426\x04_427\x04_428\x04_429\x04_430\x04_431\x04_432\x04_433\x04_434\auniF1D0\auniF1D1\auniF1D2\x04_438\x04_439\auniF1D5\auniF1D6\auniF1D7\x04_443\x04_444\x04_445\x04_446\x04_447\x04_448\x04_449\auniF1E0\x04_451\x04_452\x04_453\x04_454\x04_455\x04_456\x04_457\x04_458\x04_459\x04_460\x04_461\x04_462\x04_463\x04_464\auniF1F0\x04_466\x04_467\x04f1f3\x04_469\x04_470\x04_471\x04_472\x04_473\x04_474\x04_475\x04_476\x04f1fc\x04_478\x04_479\x04_480\x04_481\x04_482\x04_483\x04_484\x04_485\x04_486\x04_487\x04_488\x04_489\x04_490\x04_491\x04_492\x04_493\x04_494\x04f210\x04_496\x04f212\x04_498\x04_499\x04_500\x04_501\x04_502\x04_503\x04_504\x04_505\x04_506\x04_507\x04_508\x04_509\x05venus\x04_511\x04_512\x04_513\x04_514\x04_515\x04_516\x04_517\x04_518\x04_519\x04_520\x04_521\x04_522\x04_523\x04_524\x04_525\x04_526\x04_527\x04_528\x04_529\x04_530\x04_531\x04_532\x04_533\x04_534\x04_535\x04_536\x04_537\x04_538\x04_539\x04_540\x04_541\x04_542\x04_543\x04_544\x04_545\x04_546\x04_547\x04_548\x04_549\x04_550\x04_551\x04_552\x04_553\x04_554\x04_555\x04_556\x04_557\x04_558\x04_559\x04_560\x04_561\x04_562\x04_563\x04_564\x04_565\x04_566\x04_567\x04_568\x04_569\x04f260\x04f261\x04_572\x04f263\x04_574\x04_575\x04_576\x04_577\x04_578\x04_579\x04_580\x04_581\x04_582\x04_583\x04_584\x04_585\x04_586\x04_587\x04_588\x04_589\x04_590\x04_591\x04_592\x04_593\x04_594\x04_595\x04_596\x04_597\x04_598\x04f27e\auniF280\auniF281\x04_602\x04_603\x04_604\auniF285\auniF286\x04_607\x04_608\x04_609\x04_610\x04_611\x04_612\x04_613\x04_614\x04_615\x04_616\x04_617\x04_618\x04_619\x04_620\x04_621\x04_622\x04_623\x04_624\x04_625\x04_626\x04_627\x04_628\x04_629\auniF2A0\auniF2A1\auniF2A2\auniF2A3\auniF2A4\auniF2A5\auniF2A6\auniF2A7\auniF2A8\auniF2A9\auniF2AA\auniF2AB\auniF2AC\auniF2AD\auniF2AE\auniF2B0\auniF2B1\auniF2B2\auniF2B3\auniF2B4\auniF2B5\auniF2B6\auniF2B7\auniF2B8\auniF2B9\auniF2BA\auniF2BB\auniF2BC\auniF2BD\auniF2BE\auniF2C0\auniF2C1\auniF2C2\auniF2C3\auniF2C4\auniF2C5\auniF2C6\auniF2C7\auniF2C8\auniF2C9\auniF2CA\auniF2CB\auniF2CC\auniF2CD\auniF2CE\auniF2D0\auniF2D1\auniF2D2\auniF2D3\auniF2D4\auniF2D5\auniF2D6\auniF2D7\auniF2D8\auniF2D9\auniF2DA\auniF2DB\auniF2DC\auniF2DD\auniF2DE\auniF2E0\auniF2E1\auniF2E2\auniF2E3\auniF2E4\auniF2E5\auniF2E6\auniF2E7\x04_698\auniF2E9\auniF2EA\auniF2EB\auniF2EC\auniF2ED\auniF2EE\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x18\x00\x00\x00\x00\x00\x02\x00\x01\x00\x01\x02\xc2\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xcc=\xa2\xcf\x00\x00\x00\x00\xcbO<0\x00\x00\x00\x00\xd41h\xb9"), + Content: string("n\x87\x02\x00\xac\x86\x02\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x90\x01\x00\x00\x00\x00LP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00Yxϐ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00\x00\x0e\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00\x00$\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x004\x00.\x007\x00.\x000\x00 \x002\x000\x001\x006\x00\x00\x00\x16\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\r\x00\x80\x00\x03\x00PFFTMk\xbeG\xb9\x00\x02\x86\x90\x00\x00\x00\x1cGDEF\x02\xf0\x00\x04\x00\x02\x86p\x00\x00\x00 OS/2\x882z@\x00\x00\x01X\x00\x00\x00`cmap\n\xbf:\u007f\x00\x00\f\xa8\x00\x00\x02\xf2gasp\xff\xff\x00\x03\x00\x02\x86h\x00\x00\x00\bglyf\x8f\xf7\xaeM\x00\x00\x1a\xac\x00\x02L\xbchead\x10\x89\xe5-\x00\x00\x00\xdc\x00\x00\x006hhea\x0f\x03\n\xb5\x00\x00\x01\x14\x00\x00\x00$hmtxEy\x18\x85\x00\x00\x01\xb8\x00\x00\n\xf0loca\x02\xf5\xa2\\\x00\x00\x0f\x9c\x00\x00\v\x10maxp\x03,\x02\x1c\x00\x00\x018\x00\x00\x00 name㗋\xac\x00\x02gh\x00\x00\x04\x86post\xaf\x8f\x9b\xa1\x00\x02k\xf0\x00\x00\x1au\x00\x01\x00\x00\x00\x04\x01ː\xcfxY_\x0f<\xf5\x00\v\a\x00\x00\x00\x00\x00\xd43\xcd2\x00\x00\x00\x00\xd43\xcd2\xff\xff\xff\x00\t\x01\x06\x00\x00\x00\x00\b\x00\x02\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x06\x00\xff\x00\x00\x00\t\x00\xff\xff\xff\xff\t\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xb5\x00\x01\x00\x00\x02\xc3\x02\x19\x00'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x01\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x03\x06i\x01\x90\x00\x05\x00\x00\x04\x8c\x043\x00\x00\x00\x86\x04\x8c\x043\x00\x00\x02s\x00\x00\x01\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00pyrs\x00@\x00 \xf5\x00\x06\x00\xff\x00\x00\x00\x06\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x01\x03\x80\x00p\x00\x00\x00\x00\x02U\x00\x00\x01\xc0\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00]\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\x05\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00y\x05\x80\x00n\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x1a\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x002\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x04\x80\x00\x00\a\x00\x00@\x06\x80\x00\x00\x03\x00\x00\x00\x04\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\n\x05\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00z\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x06\x02\x00\x01\x05\x00\x00\x9a\x05\x00\x00Z\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00@\x06\x00\x00\x00\x06\x80\x005\x06\x80\x005\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\r\x05\x80\x00\x00\x05\x80\x00\x00\x06\x80\x00z\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x10\x05\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00Z\a\x00\x00Z\a\x80\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x03\x80\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00,\x04\x00\x00_\x06\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x15\a\x00\x00\x00\x05\x80\x00\x05\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x10\a\x80\x00\x00\x06\x80\x00s\a\x00\x00\x01\a\x00\x00\x00\x05\x80\x00\x04\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x0f\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x1b\a\x00\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\a\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x02\x80\x00@\x02\x80\x00\x00\x06\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00(\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x03\x80\x00\x01\a\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00@\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x80\x00@\a\x00\x00\x00\a\x80\x00\x00\x06\x80\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00-\x04\x00\x00\r\x04\x80\x00M\x04\x80\x00M\x02\x80\x00-\x02\x80\x00\r\x04\x80\x00M\x04\x80\x00M\a\x80\x00\x00\a\x80\x00\x00\x04\x80\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00@\x06\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\a\x00\x00@\a\x00\x00@\x06\x80\x00\r\a\x80\x00-\a\x00\x00\x00\x06\x80\x00\x02\x05\x80\x00\x02\x06\x80\x00\x00\x04\x00\x00\x00\x06\x80\x00\x00\x04\x00\x00`\x02\x80\x00\x00\x02\x80\x00b\x06\x00\x00\x05\x06\x00\x00\x05\a\x80\x00\x01\x06\x80\x00\x00\x04\x80\x00\x00\x05\x80\x00\r\x05\x00\x00\x00\x06\x80\x00\x00\x05\x80\x00\x03\x06\x80\x00$\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\f\a\x00\x00\x00\x04\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x01\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x006\x06\x00\x00\x00\x05\x80\x00\x00\x04\x00\x00\x03\x04\x00\x00\x03\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x004\x03\x82\x00\x00\x04\x03\x00\x04\x05\x00\x00\x00\a\x00\x00\x00\x05\x00\x008\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\"\x06\x80\x00\"\a\x00\x00\"\a\x00\x00\"\x06\x00\x00\"\x06\x00\x00\"\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x1b\x05\x80\x00\x05\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00D\x06\x00\x00\x00\x03\x00\x00\x03\x03\x00\x00\x03\a\x00\x00@\a\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00,\x06\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\a\x00\x00,\x06\x00\x00\x00\a\x00\x00@\x06\x80\x00 \a\x80\xff\xff\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x00\x00\x15\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\x05\x80\x00\x00\b\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00m\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\xf6\x00)\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00@\x06\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x10\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00 \x06\x00\x00\x00\x04\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00'\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x13\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00D\x06\x00\x00\x00\x05\x00\x009\a\x00\x00\x12\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00>\x05\x00\x00\x18\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x19\a\x00\x00d\x06\x00\x00Y\b\x00\x00\x00\b\x00\x00*\a\x00\x00\x00\x06\x00\x00\t\a\x00\x00'\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x0e\b\x00\x00\x0e\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x05\x00\x00\v\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x13\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x00\x00\x02\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x02\a\x80\x00\x01\b\x00\x00\x06\x06\x00\x00\x00\x05\x00\x00\x02\b\x00\x00\x04\x05\x00\x00\x00\x05\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\xf8\x00T\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\xb5\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\x05\x00\x00f\x06\x00\x00\x00\x06\xb8\x00\x00\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x16\x06\x00\x00\x0e\a\x00\x00\x1d\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00%\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00R\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00E\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00$\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00!\x06\x00\x00k\x04\x00\x00(\x06\x00\x00\x00\a\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00D\x06\x00\x00\x00\x05\x80\x00'\t\x00\x00\x03\x05\x80\x00\x00\b\x80\x00\x00\a\x00\x00\x00\t\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\x05\xff\x00%\x06\x80\x00\x01\a\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x0f\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00%\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x15\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x1d\t\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x01\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x02\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x80\x000\a\x00\x00%\x06\x00\x00\x00\x06\x80\x00/\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00&\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x00\x01\xec\x00\x03\x00\x01\x00\x00\x00\x1c\x00\x04\x01\xd0\x00\x00\x00p\x00@\x00\x05\x000\x00 \x00\xa9\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x0e\xf0\x1e\xf0>\xf0N\xf0^\xf0n\xf0~\xf0\x8e\xf0\x9e\xf0\xae\xf0\xb2\xf0\xce\xf0\xde\xf0\xee\xf0\xfe\xf1\x0e\xf1\x1e\xf1.\xf1>\xf1N\xf1^\xf1n\xf1~\xf1\x8e\xf1\x9e\xf1\xae\xf1\xbe\xf1\xce\xf1\xde\xf1\xee\xf1\xfe\xf2\x0e\xf2\x1e\xf2>\xf2N\xf2^\xf2n\xf2~\xf2\x8e\xf2\x9e\xf2\xae\xf2\xbe\xf2\xce\xf2\xde\xf2\xee\xf5\x00\xff\xff\x00\x00\x00 \x00\xa8\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x00\xf0\x10\xf0!\xf0@\xf0P\xf0`\xf0p\xf0\x80\xf0\x90\xf0\xa0\xf0\xb0\xf0\xc0\xf0\xd0\xf0\xe0\xf0\xf0\xf1\x00\xf1\x10\xf1 \xf10\xf1@\xf1P\xf1`\xf1p\xf1\x80\xf1\x90\xf1\xa0\xf1\xb0\xf1\xc0\xf1\xd0\xf1\xe0\xf1\xf0\xf2\x00\xf2\x10\xf2!\xf2@\xf2P\xf2`\xf2p\xf2\x80\xf2\x90\xf2\xa0\xf2\xb0\xf2\xc0\xf2\xd0\xf2\xe0\xf5\x00\xff\xff\xff\xe3\xff\\\xffX\xffS\xffB\xff1\xde\xe8\xdd\xedݬ\x10\r\x10\f\x10\n\x10\t\x10\b\x10\a\x10\x06\x10\x05\x10\x04\x10\x03\x10\x02\x0f\xf5\x0f\xf4\x0f\xf3\x0f\xf2\x0f\xf1\x0f\xf0\x0f\xef\x0f\xee\x0f\xed\x0f\xec\x0f\xeb\x0f\xea\x0f\xe9\x0f\xe8\x0f\xe7\x0f\xe6\x0f\xe5\x0f\xe4\x0f\xe3\x0f\xe2\x0f\xe1\x0f\xe0\x0f\xde\x0f\xdd\x0f\xdc\x0f\xdb\x0f\xda\x0f\xd9\x0f\xd8\x0f\xd7\x0f\xd6\x0f\xd5\x0f\xd4\x0f\xd3\r\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x05\n\a\x04\f\b\t\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00\x90\x00\x00\x01\x14\x00\x00\x01\x98\x00\x00\x02t\x00\x00\x02\xd0\x00\x00\x03L\x00\x00\x03\xf0\x00\x00\x04T\x00\x00\x06$\x00\x00\x06\xe0\x00\x00\bl\x00\x00\tx\x00\x00\t\xd0\x00\x00\nT\x00\x00\v(\x00\x00\v\xd4\x00\x00\f\x84\x00\x00\rd\x00\x00\x0e\xa8\x00\x00\x0f\xd4\x00\x00\x10\x84\x00\x00\x11\x00\x00\x00\x11\x9c\x00\x00\x12l\x00\x00\x13,\x00\x00\x13\xd8\x00\x00\x14\x80\x00\x00\x14\xfc\x00\x00\x15\x90\x00\x00\x164\x00\x00\x17\x10\x00\x00\x18d\x00\x00\x18\xcc\x00\x00\x19p\x00\x00\x1aH\x00\x00\x1a\x94\x00\x00\x1b$\x00\x00\x1cd\x00\x00\x1d,\x00\x00\x1e\b\x00\x00\x1et\x00\x00\x1f(\x00\x00 \x8c\x00\x00 \xf0\x00\x00!\xa0\x00\x00\"0\x00\x00# \x00\x00$,\x00\x00$\xe0\x00\x00&D\x00\x00'\xe4\x00\x00(\x9c\x00\x00)T\x00\x00*\b\x00\x00*\xbc\x00\x00,\x10\x00\x00,\xf4\x00\x00-\xd8\x00\x00.@\x00\x00.\xd8\x00\x00/`\x00\x00/\xbc\x00\x000\x14\x00\x000\xa4\x00\x001\x94\x00\x002\x90\x00\x003d\x00\x0044\x00\x004\x94\x00\x005 \x00\x005\x80\x00\x005\xb8\x00\x006 \x00\x006\\\x00\x006\xbc\x00\x007H\x00\x007\xa8\x00\x008\f\x00\x008`\x00\x008\xb4\x00\x009L\x00\x009\xb4\x00\x00:h\x00\x00:\xec\x00\x00;\xc0\x00\x00<\x00\x00>\xe4\x00\x00?h\x00\x00?\xd8\x00\x00@H\x00\x00@\xbc\x00\x00A0\x00\x00A\xb8\x00\x00BX\x00\x00B\xf8\x00\x00Cd\x00\x00C\x9c\x00\x00DL\x00\x00D\xe4\x00\x00E\xb8\x00\x00F\x9c\x00\x00G0\x00\x00G\xdc\x00\x00H\xec\x00\x00I\x8c\x00\x00J8\x00\x00K\xac\x00\x00L\xe4\x00\x00Md\x00\x00N,\x00\x00N\x80\x00\x00N\xd4\x00\x00O\xb0\x00\x00P`\x00\x00P\xa8\x00\x00Q4\x00\x00Q\xa0\x00\x00R\f\x00\x00Rl\x00\x00S,\x00\x00S\x98\x00\x00T`\x00\x00U0\x00\x00W\xf0\x00\x00X\xdc\x00\x00Z\b\x00\x00[@\x00\x00[\x8c\x00\x00\\<\x00\x00\\\xf8\x00\x00]\x98\x00\x00^(\x00\x00^\xe4\x00\x00_\xa0\x00\x00`p\x00\x00b,\x00\x00b\xf4\x00\x00d\x04\x00\x00d\xec\x00\x00eP\x00\x00e\xd0\x00\x00f\xc4\x00\x00g`\x00\x00g\xa8\x00\x00iL\x00\x00i\xc0\x00\x00jD\x00\x00k\f\x00\x00k\xd4\x00\x00l\x80\x00\x00m@\x00\x00n,\x00\x00oL\x00\x00p\x84\x00\x00q\xa4\x00\x00r\xdc\x00\x00sx\x00\x00t\x10\x00\x00t\xa8\x00\x00uD\x00\x00{`\x00\x00|\x00\x00\x00|\xbc\x00\x00}\x10\x00\x00}\xa4\x00\x00~\x88\x00\x00\u007f\x94\x00\x00\x80\xbc\x00\x00\x81\x18\x00\x00\x81\x8c\x00\x00\x83H\x00\x00\x84\x14\x00\x00\x84\xd4\x00\x00\x85\xa8\x00\x00\x85\xe4\x00\x00\x86l\x00\x00\x87@\x00\x00\x88\x98\x00\x00\x89\xc0\x00\x00\x8b\x10\x00\x00\x8c\xc8\x00\x00\x8d\x8c\x00\x00\x8el\x00\x00\x8fH\x00\x00\x90 \x00\x00\x90\xc0\x00\x00\x91T\x00\x00\x92\f\x00\x00\x92H\x00\x00\x92\x84\x00\x00\x92\xc0\x00\x00\x92\xfc\x00\x00\x93`\x00\x00\x93\xc8\x00\x00\x94\x04\x00\x00\x94@\x00\x00\x94\xf0\x00\x00\x95\x80\x00\x00\x96$\x00\x00\x97\\\x00\x00\x98X\x00\x00\x99\x1c\x00\x00\x9aD\x00\x00\x9a\xb8\x00\x00\x9b\x98\x00\x00\x9c\xa0\x00\x00\x9dT\x00\x00\x9eX\x00\x00\x9e\xf8\x00\x00\x9f\x9c\x00\x00\xa0D\x00\x00\xa1P\x00\x00\xa2,\x00\x00\xa2\xa4\x00\x00\xa38\x00\x00\xa3\xa8\x00\x00\xa4d\x00\x00\xa5\\\x00\x00\xa8\x90\x00\x00\xab\b\x00\x00\xac\x1c\x00\x00\xac\xec\x00\x00\xad\x90\x00\x00\xad\xe8\x00\x00\xae\x80\x00\x00\xaf\x18\x00\x00\xaf\xb0\x00\x00\xb0H\x00\x00\xb0\xe0\x00\x00\xb1x\x00\x00\xb1\xcc\x00\x00\xb2 \x00\x00\xb2t\x00\x00\xb2\xc8\x00\x00\xb3X\x00\x00\xb3\xf4\x00\x00\xb4p\x00\x00\xb5\x00\x00\x00\xb5d\x00\x00\xb6\x1c\x00\x00\xb6\xd4\x00\x00\xb7\xb4\x00\x00\xb7\xf0\x00\x00\xb8x\x00\x00\xb9t\x00\x00\xb9\xf8\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xbb\xa8\x00\x00\xbc\x84\x00\x00\xbd@\x00\x00\xbe\x04\x00\x00\xbf\xc8\x00\x00\xc0\xc4\x00\x00\xc2\f\x00\x00\u008c\x00\x00\xc3\\\x00\x00\xc4 \x00\x00ļ\x00\x00\xc5\x10\x00\x00Ÿ\x00\x00Ɣ\x00\x00\xc80\x00\x00\xc8\xe0\x00\x00\xc9d\x00\x00\xc9\xcc\x00\x00ʨ\x00\x00ˀ\x00\x00\xcb\xe0\x00\x00\xcc\xf4\x00\x00͔\x00\x00\xcex\x00\x00\xce\xe8\x00\x00ϰ\x00\x00Ќ\x00\x00\xd1,\x00\x00ш\x00\x00\xd2\b\x00\x00҈\x00\x00\xd3\f\x00\x00ӌ\x00\x00\xd3\xec\x00\x00\xd48\x00\x00\xd5,\x00\x00՜\x00\x00\xd6`\x00\x00\xd6\xe8\x00\x00\xd7l\x00\x00\xd8H\x00\x00ش\x00\x00\xd9`\x00\x00\xd9\xc4\x00\x00\xdaT\x00\x00ڸ\x00\x00\xdb\x18\x00\x00۔\x00\x00\xdc@\x00\x00\xdc\xc8\x00\x00\xddl\x00\x00\xdd\xf0\x00\x00ބ\x00\x00\xdf\x18\x00\x00߬\x00\x00\xe0\xbc\x00\x00\xe1l\x00\x00\xe2p\x00\x00\xe3 \x00\x00\xe3\xe4\x00\x00\xe4\x80\x00\x00\xe5\xc8\x00\x00\xe6\xc0\x00\x00\xe7\x18\x00\x00\xe7\xec\x00\x00\xe8\xe4\x00\x00\xe9\xd8\x00\x00\xea\xd8\x00\x00\xeb\xd8\x00\x00\xec\xd4\x00\x00\xed\xd0\x00\x00\xee\xdc\x00\x00\xef\xe4\x00\x00\xf2\x04\x00\x00\xf3\xf4\x00\x00\xf4\x80\x00\x00\xf54\x00\x00\xf6\x10\x00\x00\xf6\x9c\x00\x00\xf7\x18\x00\x00\xf8X\x00\x00\xf8\xc0\x00\x00\xf9$\x00\x00\xfal\x00\x00\xfb\xbc\x00\x00\xfc(\x00\x00\xfc\xb8\x00\x00\xfd\f\x00\x00\xfd`\x00\x00\xfd\xb4\x00\x00\xfe\b\x00\x00\xfe\xb8\x00\x00\xff\b\x00\x01\x00\x14\x00\x01\x05\xb4\x00\x01\x06\xf4\x00\x01\a\xf8\x00\x01\b\xd0\x00\x01\td\x00\x01\n\x10\x00\x01\n\x98\x00\x01\v\x18\x00\x01\f\x04\x00\x01\f\xa4\x00\x01\r,\x00\x01\x0e\x00\x00\x01\x0f\x88\x00\x01\x11,\x00\x01\x11\xa0\x00\x01\x12\xcc\x00\x01\x138\x00\x01\x13\xe4\x00\x01\x14\x90\x00\x01\x15(\x00\x01\x15\xa4\x00\x01\x16X\x00\x01\x16\xfc\x00\x01\x17\xc0\x00\x01\x18\x84\x00\x01\x19x\x00\x01\x1a|\x00\x01\x1bT\x00\x01\x1c\xd4\x00\x01\x1d@\x00\x01\x1d\xd4\x00\x01\x1e\x90\x00\x01\x1f\x04\x00\x01\x1f|\x00\x01 \xa4\x00\x01!\xc0\x00\x01\"x\x00\x01#\b\x00\x01#l\x00\x01$\x04\x00\x01$\xcc\x00\x01'h\x00\x01(\xe8\x00\x01*L\x00\x01,T\x00\x01.L\x00\x011t\x00\x011\xf4\x00\x012\xe0\x00\x0130\x00\x013\xb0\x00\x014\xa8\x00\x015t\x00\x016T\x00\x017$\x00\x018\f\x00\x019H\x00\x01:\x10\x00\x01:\xf0\x00\x01;\x90\x00\x01<\x84\x00\x01<\xd8\x00\x01?X\x00\x01@\x1c\x00\x01A\xc0\x00\x01B\xc8\x00\x01C\xc8\x00\x01D\x9c\x00\x01EH\x00\x01FH\x00\x01Gp\x00\x01HH\x00\x01Ix\x00\x01J \x00\x01J\xe4\x00\x01K\xd4\x00\x01L\xa0\x00\x01M\x18\x00\x01N@\x00\x01P@\x00\x01Q\xa0\x00\x01R\xe0\x00\x01SD\x00\x01T \x00\x01UL\x00\x01V`\x00\x01V\xd4\x00\x01WX\x00\x01X4\x00\x01X\xa0\x00\x01Z\x04\x00\x01Z\x88\x00\x01[d\x00\x01[\xe0\x00\x01\\|\x00\x01]\xd8\x00\x01^\xa0\x00\x01`\x94\x00\x01aH\x00\x01a\xbc\x00\x01b\xf0\x00\x01cX\x00\x01d\xac\x00\x01et\x00\x01fh\x00\x01g\xdc\x00\x01h\xb4\x00\x01i\\\x00\x01jx\x00\x01n\x84\x00\x01p@\x00\x01s\xe0\x00\x01v\x10\x00\x01w\xc8\x00\x01x\x90\x00\x01y\x88\x00\x01z\x8c\x00\x01{h\x00\x01|\x8c\x00\x01}\x1c\x00\x01}\xa4\x00\x01\u007f\\\x00\x01\u007f\x98\x00\x01\u007f\xf8\x00\x01\x80l\x00\x01\x81t\x00\x01\x82\x90\x00\x01\x834\x00\x01\x83\xa4\x00\x01\x84\xc8\x00\x01\x85\xb0\x00\x01\x86\xa4\x00\x01\x88t\x00\x01\x89\x8c\x00\x01\x8a8\x00\x01\x8b8\x00\x01\x8b\xa0\x00\x01\x8eL\x00\x01\x8e\xa8\x00\x01\x8fT\x00\x01\x90\x10\x00\x01\x91\x14\x00\x01\x93\x90\x00\x01\x94\x14\x00\x01\x95\x04\x00\x01\x95\xfc\x00\x01\x96\xf8\x00\x01\x97\xa0\x00\x01\x99|\x00\x01\x9a\xc8\x00\x01\x9c\x10\x00\x01\x9d\b\x00\x01\x9d\xd8\x00\x01\x9e|\x00\x01\x9f\x18\x00\x01\x9f\xe8\x00\x01\xa0\xc4\x00\x01\xa2\f\x00\x01\xa34\x00\x01\xa4x\x00\x01\xa5\xb0\x00\x01\xa6\x80\x00\x01\xa7L\x00\x01\xa8\x1c\x00\x01\xa8\x90\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa9X\x00\x01\xaa(\x00\x01\xab \x00\x01\xab\xcc\x00\x01\xac\xac\x00\x01\xad\xa8\x00\x01\xae \x00\x01\xae\x88\x00\x01\xaf\x04\x00\x01\xaf\xa8\x00\x01\xb0@\x00\x01\xb0\x88\x00\x01\xb6\xbc\x00\x01\xb7l\x00\x01\xb8\xe0\x00\x01\xb9t\x00\x01\xba\x04\x00\x01\xba\x94\x00\x01\xbb$\x00\x01\xbb\xa4\x00\x01\xbc\b\x00\x01\xbcx\x00\x01\xbdL\x00\x01\xbeL\x00\x01\xbe\xa4\x00\x01\xbf \x00\x01\xc0H\x00\x01\xc1\x18\x00\x01\xc1\xc4\x00\x01\xc3\x04\x00\x01\xc3\xe4\x00\x01Ġ\x00\x01\xc5T\x00\x01\xc6(\x00\x01\xc6\xec\x00\x01\xc8\f\x00\x01\xc9\f\x00\x01ʈ\x00\x01ˠ\x00\x01\xcc\xf8\x00\x01\xce\x1c\x00\x01ϔ\x00\x01\xd0l\x00\x01\xd1d\x00\x01\xd2\xdc\x00\x01\xd3P\x00\x01\xd3\xf8\x00\x01Մ\x00\x01\xd6x\x00\x01\xd7p\x00\x01\xd7\xfc\x00\x01\xd8\xf4\x00\x01ڬ\x00\x01\xdbT\x00\x01\xdcT\x00\x01\xdd\f\x00\x01\xdd\xf0\x00\x01ވ\x00\x01\xdfL\x00\x01\xe1\x80\x00\x01\xe2\xf8\x00\x01\xe4\x18\x00\x01\xe5\f\x00\x01\xe6<\x00\x01\xe7H\x00\x01\xe7\xa8\x00\x01\xe8$\x00\x01\xe8\xd4\x00\x01\xe9l\x00\x01\xea\x1c\x00\x01\xea\xd4\x00\x01\xeb\xe4\x00\x01\xec4\x00\x01\xec\xb8\x00\x01\xec\xf4\x00\x01\xed\xf0\x00\x01\xef\b\x00\x01\xef\xa4\x00\x01\xf0\x04\x00\x01\xf0\xcc\x00\x01\xf1 \x00\x01\xf2P\x00\x01\xf3l\x00\x01\xf3\xe8\x00\x01\xf5\f\x00\x01\xf6,\x00\x01\xf6\xc0\x00\x01\xf7x\x00\x01\xf7\xe0\x00\x01\xf8p\x00\x01\xf9,\x00\x01\xfax\x00\x01\xfbt\x00\x01\xfc\f\x00\x01\xfcd\x00\x01\xfd\f\x00\x01\xfd\x8c\x00\x01\xfe4\x00\x01\xff\b\x00\x01\xff\xd0\x00\x02\x014\x00\x02\x02\x1c\x00\x02\x03,\x00\x02\x04h\x00\x02\x05\xd4\x00\x02\aP\x00\x02\t4\x00\x02\n\xd4\x00\x02\f\xe0\x00\x02\r\xf0\x00\x02\x0f\x18\x00\x02\x104\x00\x02\x11\xe4\x00\x02\x13<\x00\x02\x14,\x00\x02\x15,\x00\x02\x164\x00\x02\x170\x00\x02\x188\x00\x02\x19$\x00\x02\x1a\x88\x00\x02\x1b8\x00\x02\x1d\xb4\x00\x02\x1eT\x00\x02\x1e\xcc\x00\x02 |\x00\x02!h\x00\x02\"\xac\x00\x02$L\x00\x02%0\x00\x02&H\x00\x02'\x88\x00\x02(\xf4\x00\x02)\x8c\x00\x02*0\x00\x02*\xdc\x00\x02+\x94\x00\x02,\xdc\x00\x02.$\x00\x02.\xec\x00\x020\xec\x00\x021\x84\x00\x022@\x00\x022\xfc\x00\x023\xb8\x00\x024t\x00\x025$\x00\x026\xf4\x00\x029 \x00\x02:\x8c\x00\x02:\xd4\x00\x02;\f\x00\x02;\x88\x00\x02<(\x00\x02<\xd8\x00\x02=4\x00\x02?\xb8\x00\x02@\x98\x00\x02A\xe0\x00\x02C\xa0\x00\x02D\xfc\x00\x02F\x98\x00\x02H`\x00\x02H\xf4\x00\x02I\xcc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02\x00p\x00\x00\x03\x10\x06\x00\x00\x03\x00\a\x00\x007!\x11!\x03\x11!\x11\xe0\x01\xc0\xfe@p\x02\xa0p\x05 \xfap\x06\x00\xfa\x00\x00\x00\x00\x00\x01\x00]\xff\x00\x06\xa3\x05\x80\x00\x1d\x00\x00\x01\x14\a\x01\x11!2\x16\x14\x06#!\"&463!\x11\x01&54>\x013!2\x1e\x01\x06\xa3+\xfd\x88\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfd\x88+$(\x17\x05\x80\x17($\x05F#+\xfd\x88\xfd\x00&4&&4&\x03\x00\x02x+#\x17\x1b\b\b\x1b\x00\x00\x01\x00\x00\xff\x00\x06\x00\x05\x80\x00+\x00\x00\x01\x11\x14\x0e\x02\".\x024>\x0232\x17\x11\x05\x11\x14\x0e\x02\".\x024>\x0232\x17\x11467\x01632\x16\x06\x00DhgZghDDhg-iW\xfd\x00DhgZghDDhg-iW&\x1e\x03@\f\x10(8\x05 \xfb\xa02N+\x15\x15+NdN+\x15'\x02\x19\xed\xfd;2N+\x15\x15+NdN+\x15'\x03\xc7\x1f3\n\x01\x00\x048\x00\x02\x00\x00\xff\x00\x06\x80\x05\x80\x00\a\x00!\x00\x00\x00\x10\x00 \x00\x10\x00 \x01\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x16\x04\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aL46$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W%\x02\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x804L&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9%\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00=\x00M\x00\x00%\x11\x06\a\x04\a\x0e\x02+\x02\".\x01'&%&'\x11\x14\x163!26\x11<\x02.\x03#!\"\x06\x15\x14\x17\x16\x17\x1e\x04;\x022>\x03767>\x017\x11\x14\x06#!\"&5\x11463!2\x16\x06\x80 %\xfe\xf4\x9e3@m0\x01\x010m@3\x9e\xfe\xf4% \x13\r\x05\xc0\r\x13\x01\x05\x06\f\b\xfa@\r\x13\x93\xc1\xd0\x06:\"7.\x14\x01\x01\x14.7\":\x06\xd0\xc16]\x80^B\xfa@B^^B\x05\xc0B^ \x03\x00$\x1e΄+0110+\x84\xce\x1e$\xfd\x00\r\x13\x13\x04(\x02\x12\t\x11\b\n\x05\x13\r\xa8t\x98\xa5\x051\x1a%\x12\x12%\x1a1\x05\xa5\x98+\x91`\xfb\xc0B^^B\x04@B^^\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x00\x00\x04\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x15\x14\a\x01\x03\x9a4\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\xe5\xfd\x91\x80\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\xdc\xdd\xe5\xfd\xa8\x00\x00\x01\x00\x00\xff\xad\x06\x80\x05\xe0\x00\"\x00\x00\x01\x14\a\x01\x13\x16\x15\x14\x06#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x06\x80\x1a\xfe\x95V\x01\x15\x14\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x03y\x16\x1a\xfe\x9e\xfe\f\a\r\x15\x1d\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x00\x00\x02\x00\x00\xff\xad\x06\x80\x05\xe0\x00\t\x00+\x00\x00\t\x01%\v\x01\x05\x01\x03%\x05\x01\x14\a\x01\x13\x16\x15\x14#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x04q\x012\xfeZ\xbd\xbd\xfeZ\x012I\x01z\x01y\x01\xc7\x1a\xfe\x95V\x01)\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x02\x14\x01)>\x01~\xfe\x82>\xfe\xd7\xfe[\xc7\xc7\x03\n\x16\x1a\xfe\x9e\xfe\f\a\r2\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x15\x00\x1d\x00\x00%\x14\x06#!\"&54>\x033\x16 72\x1e\x03\x00\x10\x06 &\x106 \x05\x00}X\xfc\xaaX}\x11.GuL\x83\x01l\x83LuG.\x11\xff\x00\xe1\xfe\xc2\xe1\xe1\x01>\x89m\x9c\x9cmU\x97\x99mE\x80\x80Em\x99\x97\x03\xc1\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\v\x00\x00\xff\x00\a\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x0554&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x01267\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\x00&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\xfc\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x05\x80&\x1a\x80\x1a&&\x1a\x80\x1a&\xfe\x80&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x80^B\xf9\xc0B^^B\x06@B^@\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xfd\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\x04\x9a\x80\x1a&&\x1a\x80\x1a&&\xfb\x9a\x80\x1a&&\x1a\x80\x1a&&\x03\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\xfe\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xba\xfa\xc0B^^B\x05@B^^\x00\x04\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x03\x00L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x03\x80L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x02\x00\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\xfc\xcc\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(8\xfb\x008(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(88(\xfc@(88(\x03\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x00\x01\x00y\x00\x0e\x06\x87\x04\xb2\x00\x16\x00\x00\x00\x14\a\x01\a\x06\"/\x01\x01&4?\x0162\x17\t\x0162\x1f\x01\x06\x87\x1c\xfd,\x88\x1cP\x1c\x88\xfe\x96\x1c\x1c\x88\x1cP\x1c\x01&\x02\x90\x1cP\x1c\x88\x03\xf2P\x1c\xfd,\x88\x1c\x1c\x88\x01j\x1cP\x1c\x88\x1c\x1c\xfe\xd9\x02\x91\x1c\x1c\x88\x00\x01\x00n\xff\xee\x05\x12\x04\x92\x00#\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\a\t\x01\x05\x12\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x1cP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\xfeP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\x1c\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00#\x00+\x00D\x00\x00\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01546;\x012\x16\x1d\x0132\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x0f\x00\x17\x000\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xfd\xc0\r\x13\x13\r\x02@\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\x13\r@\r\x13\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x06\x00\x00)\x005\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x1276\x16\x17\x16\x06\a\x0e\x01\x15\x14\x1e\x022>\x0254&'.\x017>\x01\x17\x16\x12\x01\x11\x14\x06\"&5\x11462\x16\x06\x00z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\xa1\x92+i\x1f \x0f*bkQ\x8a\xbdн\x8aQkb*\x0f \x1fj*\x92\xa1\xfd\x80LhLLhL\x02\x80\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\xb6\x01Bm \x0e+*i J\xd6yh\xbd\x8aQQ\x8a\xbdhy\xd6J i*+\x0e m\xfe\xbe\x02J\xfd\x804LL4\x02\x804LL\x00\x00\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x00\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12`\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12r\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\xf2\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x01r\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x12\x01\xf2\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00n\x00\x00\x004&\"\x06\x14\x162\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x04\x00\x96Ԗ\x96\xd4\x02\x96\x10\f\xb9\x13\x14#H\n\t\x1b\x90\x16\f\x0e\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8d\n\x0f\x0e\v~'\a\b\x0fH\x12\x1b\x0e\xb7\r\x10\x10\v\xba\x0e\x19(C\n\t\x1a\x91\x16\r\r\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8e\t\x0f\r\f\x81$\a\b\x0fH\x12\x1a\x0f\xb7\r\x10\x02\x16Ԗ\x96Ԗ\x01m\xde\f\x16\x02\x1c6%2X\f\x1a\n%\x8e\tl\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\vr6\n\r\f\v\x15[\x1921\x1b\x02\x15\r\xde\f\x16\x02\x1c..9Q\f\f\n\r$\x8f\nk\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\nw3\b\x0e\f\v\x15[\x1920\x1c\x02\x15\x00\x00\x06\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00;\x00C\x00g\x00\x00\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x13\x11!\x11\x14\x1e\x013!2>\x01\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\xfc\x80\x0e\x0f\x03\x03@\x03\x0f\x0e\xfd`\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\x03 \xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\xfd\x1e\x03\xb4\xfcL\x16%\x11\x11%\x04Ju\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x00\x00\x00\x02\x00\x1a\x00\x00\x06f\x05\x03\x00\x13\x005\x00\x00\x01\x11\x14\x06#!\x11!\x11!\"&5\x11465\t\x01\x167\a\x06\a#\"'\t\x01\x06'&/\x01&67\x0162\x1f\x01546;\x012\x16\x15\x11\x17\x1e\x01\x05\x80&\x1a\xfe\x80\xff\x00\xfe\x80\x1a&\x01\x02?\x02?\x01\xdf>\b\r\x03\r\b\xfdL\xfdL\f\f\r\b>\b\x02\n\x02\xcf X \xf4\x12\x0e\xc0\x0e\x12\xdb\n\x02\x02 \xfe \x1a&\x01\x80\xfe\x80&\x1a\x01\xe0\x01\x04\x01\x01\xda\xfe&\x02AJ\t\x02\a\x02A\xfd\xbf\b\x01\x02\tJ\n\x1b\b\x02W\x1a\x1a\xcc\xc3\x0e\x12\x12\x0e\xfeh\xb6\b\x1b\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\xe0\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\xfd\xfe\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x002\x00\x00\aN\x05\x00\x00\x11\x00C\x00\x00\x015\x03.\x01+\x01\"\x06\a\x03\x15\x06\x16;\x0126\x01\x14#!26'\x03.\x01#!\"\x06\a\x03\x06\x163!\"547\x01>\x013!\"\x06\x0f\x01\x06\x16;\x0126/\x01.\x01#!2\x16\x17\x01\x16\x04W\x18\x01\x14\r\xba\r\x14\x01\x18\x01\x12\f\xf4\f\x12\x02\xf6.\xfd@\r\x12\x01\x14\x01\x14\r\xfe\xf0\r\x14\x01\x14\x01\x12\r\xfd@.\x1a\x01\xa1\b$\x14\x01S\r\x14\x01\x0f\x01\x12\r\xa6\r\x12\x01\x0f\x01\x14\r\x01S\x14$\b\x01\xa1\x1a\x02\x1c\x04\x01@\r\x13\x13\r\xfe\xc0\x04\f\x10\x10\xfe9I\x13\r\x01\x00\r\x13\x13\r\xff\x00\r\x13I6>\x04\x14\x13\x1c\x13\r\xc0\x0e\x12\x12\x0e\xc0\r\x13\x1c\x13\xfb\xec>\x00\x04\x00\x00\x00\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00%\x00=\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x17\x162?\x01!2\x16\x01\x16\a\x01\x06\"'\x01&763!\x11463!2\x16\x15\x11!2\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01ч:\x9c:\x88\x01\xd0(8\xfe\xbb\x11\x1f\xfe@\x126\x12\xfe@\x1f\x11\x11*\x01\x00&\x1a\x01\x00\x1a&\x01\x00*\xa64&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(8\x8888\x888\x02\x11)\x1d\xfe@\x13\x13\x01\xc0\x1d)'\x01\xc0\x1a&&\x1a\xfe@\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x14\a\x01\x06\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04`\n\xfe\xc1\v\x18\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\xcc\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02`\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\x022\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x0162\x17\x01\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04^\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\n\x01?\v\x18\v\x01@\x0f\xd2\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x94\x14\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e\f\f\x01?\t\t\xfe\xc0\x10\x01\xf9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\r\x00#\x00\x00\x01!.\x01'\x03!\x03\x0e\x01\a!\x17!%\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x03\xff\x01<\x01\x03\x01\xd4\xfd<\xd4\x01\x03\x01\x01<_\x01@\x02`&\x1a\xfa\x80\x1a&\x19\xee\n5\x1a\x03@\x1a5\n\xee\x19\x02@\x03\v\x02\x01\xf0\xfe\x10\x03\v\x02\xc0\xa2\xfe\x1e\x1a&&\x1a\x01\xe2>=\x02(\x19\"\"\x19\xfd\xd8=\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00'\x00\x00\x00\x14\a\x01\x06#\"'&5\x11476\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xa0 \xfd\xe0\x0f\x11\x10\x10 !\x1f\x02 \xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xa5J\x12\xfe\xc0\t\b\x13%\x02\x80%\x13\x12\x13\xfe\xc0\xcb\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x003\x00\x00\x01\x11\x14\x06#!\"'&?\x01&#\"\x0e\x02\x14\x1e\x023267672\x1f\x01\x1e\x01\a\x06\x04#\"$&\x02\x10\x126$32\x04\x1776\x17\x16\x06\x00&\x1a\xfe@*\x11\x11\x1f\x8a\x94\xc9h\xbd\x8aQQ\x8a\xbdhw\xd4I\a\x10\x0f\n\x89\t\x01\bm\xfeʬ\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x93\x01\x13k\x82\x1d)'\x05\x00\xfe@\x1a&('\x1e\x8a\x89Q\x8a\xbdн\x8aQh_\n\x02\t\x8a\b\x19\n\x84\x91z\xce\x01\x1c\x018\x01\x1c\xcezoe\x81\x1f\x11\x11\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00G\x00\x00\x01\x14\a\x02\x00!\"$'\a\x06\"&5\x11463!2\x16\x14\x0f\x01\x1e\x013267676;\x012\x16\x13\x11\x14\x06#!\"&4?\x01&#\"\x06\a\x06\a\x06+\x01\"&=\x01\x12\x00!2\x04\x17762\x16\x05\xe7\x01@\xfeh\xfe\xee\x92\xfe\xefk\x81\x134&&\x1a\x01\xc0\x1a&\x13\x89G\xb4a\x86\xe8F\v*\b\x16\xc0\r\x13\x19&\x1a\xfe@\x1a&\x13\x8a\x94Ɇ\xe8F\v*\b\x16\xc7\r\x13A\x01\x9a\x01\x13\x92\x01\x14k\x82\x134&\x01\xe0\x05\x02\xfe\xf4\xfe\xb3nf\x81\x13&\x1a\x01\xc0\x1a&&4\x13\x89BH\x82r\x11d\x17\x13\x03\x13\xfe@\x1a&&4\x13\x8a\x89\x82r\x11d\x17\x13\r\a\x01\f\x01Moe\x81\x13&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x04\x80\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x80\x13\r\xfa@\r\x13\x13\r\x05\xc0\r\x13\x80^B\xfa@B^^B\x05\xc0B^\x01`@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd3\x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x00\x02\x00\x00\x00\x00\x04\x80\x05\x80\x00\a\x00\x1f\x00\x00\x01!54&\"\x06\x15\x01\x11\x14\x06#!\"&5\x1146;\x0154\x00 \x00\x1d\x0132\x16\x01@\x02\x00\x96Ԗ\x03@8(\xfc@(88( \x01\b\x01p\x01\b (8\x03\x00\xc0j\x96\x96j\xfe\xe0\xfd\xc0(88(\x02@(8\xc0\xb8\x01\b\xfe\xf8\xb8\xc08\x00\x00\x02\x00@\xff\x80\a\x00\x05\x80\x00\x11\x007\x00\x00\x01\x14\a\x11\x14\x06+\x01\"&5\x11&5462\x16\x05\x11\x14\x06\a\x06#\".\x02#\"\x05\x06#\"&5\x114767632\x16\x17\x1632>\x0232\x16\x01@@\x13\r@\r\x13@KjK\x05\xc0\x19\x1bך=}\\\x8bI\xc0\xfe\xf0\x11\x10\x1a&\x1f\x15:\xec\xb9k\xba~&26\u007f]S\r\x1a&\x05\x00H&\xfb\x0e\r\x13\x13\r\x04\xf2&H5KKu\xfd\x05\x19\x1b\x0et,4,\x92\t&\x1a\x02\xe6 \x17\x0e\x1dx:;\x13*4*&\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00K\x00\x00\x01\x14\x0f\x02\x0e\x01#\x15\x14\x06+\x01\"&5\x1146;\x012\x16\x1d\x012\x16\x177654\x02$ \x04\x02\x15\x14\x1f\x01>\x013546;\x012\x16\x15\x11\x14\x06+\x01\"&=\x01\"&/\x02&54\x126$ \x04\x16\x12\x06\x80<\x14\xb9\x16\x89X\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12Gv\"D\x1d\xb0\xfe\xd7\xfe\xb2\xfeװ\x1dD\"vG\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12X\x89\x16\xb9\x14<\x86\xe0\x014\x01L\x014\xe0\x86\x02\x8a\xa6\x941!Sk \x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e G<\f_b\x94\x01\x06\x9c\x9c\xfe\xfa\x94b_\f\x034.\x0354632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b\x00\x00\x00\x00\x04\x00\x00\xff\xb9\x06\x80\x05G\x00\x13\x00-\x00I\x00k\x00\x00\x01\x11\x14\x06\"'\x01!\"&5\x11463!\x0162\x16\x00\x14\x06\a\x06#\"&54>\x034.\x0354632\x17\x16\x04\x10\x02\a\x06#\"&54767>\x014&'&'&54632\x17\x16\x04\x10\x02\a\x06#\"&547>\x017676\x12\x10\x02'&'.\x01'&54632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x01U\xaa\x8c\r\f\x1b&'8\x14JSSJ\x148'&\x1a\r\r\x8c\x01\xaa\xfe\xd3\r\r\x1a&'\a\x1f\a.${\x8a\x8a{$.\a\x1f\a'&\x1a\r\r\xd3\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b7\xfe\xce\xfe\xfd;\x05&\x1a'\x14\x1d\x0f6\xa3\xb8\xa36\x0f\x1d\x14'\x1a&\x05;\xb6\xfe4\xfe\u007f[\x05&\x1a$\x17\x04\r\x04\x19\x1a[\x01\x10\x012\x01\x10[\x1a\x19\x04\r\x04\x17$\x1a&\x05[\x00\f\x00\x00\x00\x00\x05\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00/\x003\x007\x00\x00\x01\x15#5\x13\x15#5!\x15#5\x01!\x11!\x11!\x11!\x01!\x11!\x01\x11!\x11\x01\x15#5!\x15#5\x13\x11!5#\x11#\x11!\x1535\x01\x11!\x11!\x11!\x11\x01\x80\x80\x80\x80\x03\x80\x80\xfc\x80\x01\x80\xfe\x80\x01\x80\xfe\x80\x03\x00\x01\x80\xfe\x80\xff\x00\xfd\x80\x04\x80\x80\x01\x80\x80\x80\xfe\x80\x80\x80\x01\x80\x80\xfd\x80\xfd\x80\x05\x80\xfd\x80\x01\x80\x80\x80\x03\x00\x80\x80\x80\x80\xfc\x01\x01\u007f\x01\x80\x01\x80\xfe\x80\x01\x80\xfd\x80\xfd\x80\x02\x80\xfe\x00\x80\x80\x80\x80\x02\x00\xfe\x80\x80\xfe\x80\x02\x80\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x80\x02\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00;\x00?\x00\x003#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113???? ^\x1f\x1f\x9d\x1f\x1f\x9d>>~\x1f\x1f?\x1f\x1f?\x1f\x1f\x9d??\x9d??~??~??^??\xbd^^? ^??\x05\x80\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x80\x05\x80\x00\x00\x00\x02\x00\x00\xff\x95\x05\xeb\x05\x80\x00\a\x00\x1d\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'\x00\x00\x00\x00\x03\x00\x00\xff\x95\ak\x05\x80\x00\a\x00\x1d\x005\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x05\x14\a\x01\x06#\"&'\x01654'\x01.\x01#32\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x01\x80%\xfe\x15'4$.\x1e\x01\xd6%%\xfd5&\x805\xe05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'45%\xfe\x14%\x1c\x1f\x01\xd6%54'\x02\xca&55&\xfd6'\x00\x03\x00\n\xff\x80\x06y\x05\x80\x00T\x00d\x00t\x00\x00\x01\x16\a\x01\x0e\x01#!\"&'&74676&7>\x027>\x0176&7>\x017>\x0176&7>\x017>\x0176&7>\x027>\x06\x17\a63!2\x16\a\x01\x0e\x01#!\"\a\x06\x17\x163!267\x016'\x16\x05\x06\x163!26?\x016&#!\"\x06\a\x03\x06\x163!26?\x016&#!\"\x06\a\x06g(\x16\xfe\xed\x13sA\xfceM\x8f\x1c\x18\x16\x06\x01\x01\b\x01\x02\f\x15\x06\x17,\b\x03\x05\x02\x03\x1c\x03\x15*\x04\x01\a\x04\x04$\x04\x13/\x04\x01\b\x02\x02\x0e\x16\x06\b\x11\r\x13\x14!'\x1c\x01&\r\x02\xf9JP\x16\xfe\xee$G]\xfc\x9b\x1b\v\v\n\x18x\x03\x9b\x1d6\b\x01,\a\x02&\xfb\xed\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04h\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04\x04\"9H\xfcv@WkNC<\x04.\x0e\b\x1b\x06\v\x14\x1b\n&k&\n(\b\v\"\x06$p\"\t.\x05\r#\x05\x1au&\b#\t\b\x14\x1a\b\f%!'\x19\x16\x01\x06\x03\tpJ\xfcvwE\x0f\x10\x1bF\x1f\x1a\x03\xdb\x16#\x0f\x1e\r\x13\x13\r@\r\x13\x13\r\xfe\xc0\r\x13\x13\r@\r\x13\x13\r\x00\x00\x01\x00\x00\xff\x97\x05\x00\x05\x80\x00\x1c\x00\x00\x012\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x8c\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x80\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x80\x00\x03\x00\f\x00\x14\x00<\x00\x00)\x01\x11!\x11!\x11#\"&=\x01!\x004&\"\x06\x14\x1627\x11\x14\x06+\x01\x15\x14\x06#!\"&=\x01#\"&5\x1146;\x01\x11463!2\x16\x1f\x01\x1e\x01\x15\x1132\x16\x01\x80\x03\x80\xfc\x80\x03\x80\xa0(8\xfd\x80\x04\x80&4&&4\xa6\x13\r\xe08(\xfc@(8\xe0\r\x13qO@8(\x02\xa0(`\x1c\x98\x1c(@Oq\x01\x00\x01\x80\x01\x808(\xa0\xfd&4&&4&@\xfe`\r\x13\xa0(88(\xa0\x13\r\x01\xa0Oq\x02 (8(\x1c\x98\x1c`(\xff\x00q\x00\x03\x00\x00\xff\x80\a\x80\x06\x00\x00\a\x00!\x00)\x00\x00\x002\x16\x14\x06\"&4\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x017>\x013!2\x16\x1f\x01\x00 \x00\x10\x00 \x00\x10\x03I\uea69\xee\xa9\x03\xe0j\x96\x96j\xfa\x80j\x96\x96j\xe03\x13e5\x02\x005e\x133\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03`\xa9\uea69\xee\x02I\x96j\xfc\x80j\x96\x96j\x03\x80j\x96\x881GG1\x88\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x80\x05\x80\x00\a\x00P\x00\x00\x01\x032\x16327&\x017>\x047\x13\x01;\x01\x16\x17\x13\x16\x12\x17\x1e\x01\x17\x16\x17\x1e\x01\x17\x16\x15\x14\x06\x15\"&#\"\x04\a4?\x012>\x0554.\x01'%\x06\x02\x15\x14\x1e\x033\x16\x15\x14\a\"&#\"\x06#\x06\x02ժ!\xcf9\x13&W\xfc\xca\x02\x17B03&\f\xed\x01\x18K5\b\x03\xcd!\x92)\x0fV\x1d\x14\x0f\x13\x8a\x0f\x06\x01?\xfe@L\xfe\xea'\x04\x83\x01\x17\b\x15\t\r\x05>R\x01\xfe>\x1ae\x1c;&L\x03\x01\x02:\xe9:\b%\x03P\x03\xd1\xfe>\x04\x02\xfd\xfcvO\a\v\n\x13'\x1f\x02h\x02\xd4\x0e\a\xfe N\xfe\x99_\"\xdd:-\f\x0f\x1d\x06&\x13\x05\x11\x04\x10\x0e\x01+#\x1c\x05\x02\a\x06\n\f\b\x10\xa1\xc2\x03\x02:\xfe\xed\x19\x16\x1f\x12\t\b\x13'\t\x12\x14\b\x0e\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\x15\x00+\x00a\x00\x00%\x163 \x114'.\x04#\"\a\x14\x06\x15\x14\x06\x1e\x01\x03\x1632>\x0254.\x02#\"\a\x14\x16\x15\x14\x06\x15\x14\x017>\x017>\x04<\x015\x10'.\x04/\x016$32\x1632\x1e\x03\x15\x14\x0e\x03\a\x1e\x01\x15\x14\x0e\x03#\"&#\"\x04\x02+JB\x01x)\x1bEB_I:I\x1c\x01\x02\x01\b\x06*CRzb3:dtB2P\b\x01\xfd\xe4\x02\x0f\x8c$\a\v\x06\x05\x01\x16\x04$5.3\x05\x04b\x01\xe4\x83\x17Z\x17F\x85|\\8!-T>5\x9a\xcdFu\x9f\xa8\\,\xb0,j\xfen\x0f \x01OrB,\x027676\x1a\x01'5.\x02'7\x1e\x0232>\x017\x06\a\x0e\x01\a\x0e\x03\a\x06\x02\a\x0e\x03\x1f\x01\x16\x17\x06\a\"\x06#\"&#&#\"\x06\x11\x16OA\x1b\x1c\r\x01zj\x01\x18=N\x13\x13!\xae}:0e\x8d\x1c\x05\x0e\x1e\x8f%\b\f\x06\t\x02\x1by\x11\x02\x16\x12\x0e\x01\x01\x11\xa8\x03\r\v+\v\x1dt\x1c\x8aD3\xb8~U\a\x13\x13\x0e#B\a\x024\x02\v#\x19\r\v\x05\x03g\x02\t\x05\x05\t\x02'2\n%\x0f\x13/!:\r\x94\xfd\xe1T\tbRU\x0f\x12\x04\x1b,7\x03\x14\x02\x12\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\xfa\x05\x80\x00\x1b\x00}\x00\x00%2\x16\x0f\x01\x06\"/\x01&6;\x01\x11#\"&?\x0162\x1f\x01\x16\x06+\x01\x11\x01\x17\x1632632\x163!2\x16>\x02?\x012\x163\x16\x15\x14\a\x06\a&'.\x02'.\x03\x06#\"&\"\x06\a\x06\x17\x14\x12\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x0276\x114\x02=\x01464.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x06\xd0!\x12\x14~\x14:\x14~\x14\x12!PP!\x12\x14~\x14:\x14~\x14\x12!P\xf9\xd16\f\xc7,\xb0,$\x8f$\x01%\x06\x1e\v\x15\x0e\b*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\r\x01\x06\f\x13\a\x1d\x02\x11c2N \t\x01\x04\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\x13\x06\x01\x02\x04\x03\v\x97!x\x14\x13\x1e!\x1a*\x0e\x80%\x1a\xa2\x1a\x1a\xa2\x1a%\x04\x00%\x1a\xa2\x1a\x1a\xa2\x1a%\xfc\x00\x04\xff\x1b\x05\x04\x01\x01\x01\x05\r\v\x01\x01p\xe0P\x1d\x0e\x04,T\tNE\x01\b\t\x03\x02\x01\x01\x04\x04Q7^\xfd\xb4\xa1\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e*\x01Ue\x01\x94eu\x02\x1b\x17\x1c\x14\x04\f\x18\x0e\rwg\x02\x1a\x12\x01\u007f\x00\x00\x02\x00\x00\xff\x03\x06\x00\x05\x80\x00a\x00\x95\x00\x00\x13\x17\x1632632$\x04\x17\x16?\x012\x163\x16\x15\x14\a\x06\a&'.\x025&'&#\"&\"\x06\a\x06\x1f\x015\x14\x1e\x01\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x027>\x024&54&54>\x01.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x012\x1e\x02\x17\x16\x14\a\x0e\x03#\".\x01465!\x14\x16\x14\x0e\x01#\".\x02'&47>\x0332\x1e\x01\x14\x06\x15!4&4>\x01Q6\f\xc7,\xb0,F\x01a\x01\x00w!\x17*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\x0e\n\x11\x05=\x1e~Pl*\t\x01\x01\x02\x01\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\a\t\x03\x01\x05\x01\x01\x01\x05\x04\v\x97)\xf4\x10\x13\x1e!\x1a*\x0e\x05\x1e\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\xfc\x00\x03\x05\x0f\r\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\x04\x00\x03\x05\x0f\x05\u007f\x1b\x05\x04\x02\x01\x04\x01 \x01\x01p\xe0P\x1d\x0e\x04,T\tMF\x01\r\x06\x02\x02\x04\x05Q7\x9847ƢH\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e\x10t\xaf\x87\xac\x03\a\x1d\b\aJHQ6\x05\f\x1b\v\fwh\x02\x1a\x12\x01\u007f\xfa\xff',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01\x00&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\xfe\x80&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xfe\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xfa\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xe0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x04s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80\x13\r\x0e\t\xfe\xe0\t\t\x01 \t\x0e\r\x13\x05\x80\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x03\xe0\xfd\xc0\r\x13\t\x01 \t\x1c\t\x01 \t\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x00\x14\a\x01\x06#\"&5\x114632\x17\t\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01`\t\xfe\xe0\t\x0e\r\x13\x13\r\x0e\t\x01 \x05\xa9\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x02\xce\x1c\t\xfe\xe0\t\x13\r\x02@\r\x13\t\xfe\xe0\xfe\t\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x01\x00\x00\x00\x00\a\x00\x05\x00\x00\x1f\x00\x00\x01\x11\x14\a\x06#\"'\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x01632\x17\x16\a\x00'\r\f\x1b\x12\xfem\xa9w\xfd@w\xa9\xa9w\x02\xc0w\xa9\x01\x93\x12\x1b\f\r'\x04\xa0\xfb\xc0*\x11\x05\x13\x01\x93\xa6w\xa9\xa9w\x02\xc0w\xa9\xa9w\xa5\x01\x92\x13\x05\x11\x00\x00\x00\x00\x04\x00\x00\xff\x80\a\x80\x05\x80\x00\a\x00\x0e\x00\x1e\x00.\x00\x00\x00\x14\x06\"&462\x01\x11!5\x01\x17\t\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\x80p\xa0pp\xa0\x04p\xfa\x80\x01@\xa0\x02\x00\x02\x00\xf9\xc0\r\x13\x13\r\x06@\r\x13\x13\x93^B\xf9\xc0B^^B\x06@B^\x04\x10\xa0pp\xa0p\xfd\xc0\xfe@\xc0\x01@\xa0\x02\x00\x01 \x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13 \xfb@B^^B\x04\xc0B^^\x00\x04\x00\x00\xff\x80\x05\xeb\x05k\x00\x06\x00\x14\x00\x19\x00%\x00\x00!7'\a\x153\x15\x014#\"\a\x01\x06\x15\x14327\x016'\t\x01!\x11\x01\x14\x0f\x01\x017632\x1f\x01\x16\x01k[\xeb[\x80\x02v\x16\n\a\xfd\xe2\a\x16\n\a\x02\x1e\a6\x01\xa0\xfc\xc0\xfe`\x05\xeb%\xa6\xfe`\xa6$65&\xeb%[\xeb[k\x80\x03\xa0\x16\a\xfd\xe2\a\n\x16\a\x02\x1e\a\xca\xfe`\xfc\xc0\x01\xa0\x02\xe05%\xa6\x01\xa0\xa5&&\xea'\x00\x00\x02\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x17\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x0e\x01\"&'\x01&54\x00 \x00\x03\x00\x96Ԗ\x96\xd4\x01\x96!\xfe\x94\x10?H?\x0f\xfe\x93!\x01,\x01\xa8\x01,\x03\x16Ԗ\x96Ԗ\x01\x00mF\xfc\xfa!&&!\x03\x06Fm\xd4\x01,\xfe\xd4\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x00%\x11\"\x0e\x01\x10\x1e\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\x94\xfa\x92\x92\xfa\x03\x94\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a`\x04@\x92\xfa\xfe\xd8\xfa\x92\x02\xf1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x05\xc0\x00\x15\x00-\x00\x00\x014'.\x03'&\"\a\x0e\x03\a\x06\x15\x14\x1626%\x14\x00 \x00547>\x037>\x012\x16\x17\x1e\x03\x17\x16\x02\x00\x14\x01\x1d\x16\x1c\a\x04\"\x04\a\x1c\x16\x1d\x01\x14KjK\x02\x00\xfe\xd4\xfeX\xfe\xd4Q\x06qYn\x1c\t243\b\x1cnYq\x06Q\x01\x80$!\x01+!7\x17\x10\x10\x177!+\x01!$5KK\xb5\xd4\xfe\xd4\x01,ԑ\x82\t\xa3\x8b\xd9]\x1e\"\"\x1e]ً\xa3\t\u007f\x00\x05\x00\x00\x00\x00\x06\xf8\x05\x80\x00\x06\x00\x0e\x009\x00>\x00H\x00\x00\x017'\a\x153\x15\x00&\a\x01\x06\x167\x01\x13\x15\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x016\x16\x03\t\x01!\x11\x01\a\x01762\x1f\x01\x16\x14\x03xt\x98t`\x02\x00 \x11\xfe\xa2\x11 \x11\x01^Q\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\x0e\x12\x17\x16\xfc\xc0B^^B\x03@B^\t@\x0f(`\x01 \xfd`\xfe\xe0\x04\\\\\xfe\xe0\\\x1cP\x1c\x98\x1c\x01`t\x98t8`\x02\xc0 \x11\xfe\xa2\x11 \x11\x01^\xfdϾw\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\x0e\x06\x06^B\xfc\xc0B^^B~\r\t@\x0f\x10\x02\xcd\xfe\xe0\xfd`\x01 \x02\x1c\\\x01 \\\x1c\x1c\x98\x1cP\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x06\x00\x00+\x00Z\x00\x00\x01\x11\x14\x06#!\"&5\x11463!12\x16\x15\x14\a\x06\a\x06+\x01\"\x06\x15\x11\x14\x163!26=\x0147676\x17\x16\x13\x01\x06#\"'&=\x01# \a\x06\x13\x16\a\x06#\"'.\x0454>\a;\x01547632\x17\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x00\xff\r\x13\x1aM8\n\x06pB^^B\x03@B^\x12\x1c\x1a\x10\x13\x15\xed\xfe\x80\x12\x1b\f\r'\xa0\xfe\xbdsw-\x03\x17\b\x04\x10\n\n\x169*#\a\x15#;No\x8a\xb5j\xa0'\r\f\x1a\x13\x01\x80\x13\x02#\xfe\xfdw\xa9\xa9w\x03@w\xa9\x13\r\x1b\x05\x1a\"\x04^B\xfc\xc0B^^B\xd6\x13\n\r\x18\x10\b\t\x01\xdc\xfe\x80\x13\x05\x11*\xc0\x83\x89\xfe\xb0\x17\v\x02\r\x0e\"g`\x8481T`PSA:'\x16\xc0*\x11\x05\x13\xfe\x80\x134\x00\x00\x02\x00\x00\x00\x00\x06\u007f\x05\x80\x00/\x00D\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06#\"'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x01632\x17\x16\x13\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\n\r\x03\x06\x17\x16\xfc\xc0B^^B\x03@B^\t@\n\r\x06\x06\x14\xe7\xfc\xd2\x18B\x18\xfeR\x18\x18n\x18B\x18\x01\a\x02\x87\x18B\x18n\x18\x02^\xfe\xc2w\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\n\x02\x06^B\xfc\xc0B^^B\xfe\r\t@\n\x03\b\x01\xd4\xfc\xd2\x18\x18\x01\xae\x18B\x18n\x18\x18\xfe\xf9\x02\x87\x18\x18n\x18B\x00\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00C\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!\x11#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x11!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x13\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x03\xd3\x13\x1a\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x016\x16\x15\x1167\x06\xd3\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x01\x00z\xff\x80\x06\x80\x05\x80\x00\x19\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&47\x016\x16\x15\x1167\x06S\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\x13\x13\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x00\x01\x00\x00\xff|\x05\u007f\x05\x84\x00\v\x00\x00\t\x01\x06&5\x1146\x17\x01\x16\x14\x05h\xfa\xd0\x17!!\x17\x050\x17\x02a\xfd\x1e\r\x14\x1a\x05\xc0\x1a\x14\r\xfd\x1e\r$\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\xfc\x80&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x06\x05\x80\x00\x19\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x14\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\x13\x13\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\x134\x13\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\x00\x00\x00\x02\x00\x01\x00\x00\x06\x01\x05\x06\x00\v\x00\x1b\x00\x00\x13\x0162\x17\x01\x16\x06#!\"&\x01!\"&5\x11463!2\x16\x15\x11\x14\x06\x0e\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfa@\x1a\f\x05\xc6\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x02-\x02\xc6\x13\x13\xfd:\x13\x1a\x1a\xfd\xe6&\x1a\x01\x00\x1a&&\x1a\xff\x00\x1a&\x00\x00\x00\x00\x01\x00\x9a\xff\x9a\x04\xa6\x05\xe6\x00\x14\x00\x00\t\x02\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\x04\x93\xfd\xed\x02\x13\x13\x13\xa6\x134\x13\xfd\x1a\x13\x13\x02\xe6\x134\x13\xa6\x13\x04\xd3\xfd\xed\xfd\xed\x134\x13\xa6\x13\x13\x02\xe6\x134\x13\x02\xe6\x13\x13\xa6\x134\x00\x00\x00\x00\x01\x00Z\xff\x9a\x04f\x05\xe6\x00\x14\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x04S\xfd\x1a\x134\x13\xa6\x13\x13\x02\x13\xfd\xed\x13\x13\xa6\x134\x13\x02\xe6\x13\x02\x93\xfd\x1a\x13\x13\xa6\x134\x13\x02\x13\x02\x13\x134\x13\xa6\x13\x13\xfd\x1a\x134\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x1a\x80\x1a&\x01\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\x01\x00\x1a&&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&&\x1a\x80\x1a&&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00+\x007\x00\x00\x014/\x017654/\x01&#\"\x0f\x01'&#\"\x0f\x01\x06\x15\x14\x1f\x01\a\x06\x15\x14\x1f\x01\x1632?\x01\x17\x1632?\x016\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04}\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x01\x83\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x9e\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x01\xce\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00#\x00\x00\x014/\x01&\"\a\x01'&\"\x0f\x01\x06\x15\x14\x17\x01\x16327\x01>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x134\x13\xfeh\xe2\x134\x13[\x12\x12\x01j\x13\x1a\x1b\x13\x02\x1f\x12\xfc\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\"\x1c\x12Z\x13\x13\xfei\xe2\x13\x13Z\x12\x1c\x1b\x12\xfe\x96\x13\x13\x02\x1f\x12J\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00:\x00F\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x014.\x01#\"\a\x06\x1f\x01\x1632767632\x16\x15\x14\x06\a\x0e\x01\x1d\x01\x14\x16;\x01265467>\x04$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x00o\xa6W\xf3\x80\x0f\x17\x84\a\f\x10\t5!\"40K(0?i\x12\x0e\xc0\x0e\x12+! \":\x1f\x19\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\xaeX\x96R\xd5\x18\x12d\x06\fD\x18\x184!&.\x16\x1cuC$\x0e\x12\x12\x0e\x13=\x13\x12\x151/J=\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00.\x00:\x00\x00%54&+\x01\x114&#!\"\x06\x1d\x01\x14\x16;\x01\x11#\"\x06\x1d\x01\x14\x163!26\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x12\x0e`\x12\x0e\xfe\xc0\x0e\x12\x12\x0e``\x0e\x12\x12\x0e\x01\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xa0\x0e\x12\x02\x00\x0e\x12\x12\x0e\xa0\x0e\x12\xfe\xc0\x12\x0e\xa0\x0e\x12\x12\x03\x8e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\xc1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00/\x00_\x00\x00\x01#\"&=\x0146;\x01.\x01'\x15\x14\x06+\x01\"&=\x01\x0e\x01\a32\x16\x1d\x01\x14\x06+\x01\x1e\x01\x17546;\x012\x16\x1d\x01>\x01\x01\x15\x14\x06+\x01\x0e\x01\a\x15\x14\x06+\x01\"&=\x01.\x01'#\"&=\x0146;\x01>\x017546;\x012\x16\x1d\x01\x1e\x01\x1732\x16\x04\xadm\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1\x01s&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&\x02\x00&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1\x01,\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00;\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x146\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04I\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n͒\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01ɒ\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\x19\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\t\x01\x06\"'\x01&4?\x0162\x1f\x01\x0162\x1f\x01\x16\x14\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x93\xfeZ\x134\x13\xfe\xda\x13\x13f\x134\x13\x93\x01\x13\x134\x13f\x13z\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xd3\xfeZ\x13\x13\x01&\x134\x13f\x13\x13\x93\x01\x13\x13\x13f\x134\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x85\x00\t\x00\x12\x00\"\x00\x00\x014'\x01\x1632>\x02\x05\x01&#\"\x0e\x01\x15\x14\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05 W\xfd\x0e\x89\xa0oɒV\xfc\x19\x02\U000c7954\xfa\x92\x05 z\xcd\xfe\xe3\xfe\xc8\xfe\xe3\xcdzz\xcd\x01\x1d\x018\x01\x1d\xcd\x02\x83\xa1\x86\xfd\x0fYW\x92˼\x02\xf2[\x92\xfc\x94\xa2\x01?\xfe\xc6\xfe\xe2\xcezz\xce\x01\x1e\x01:\x01\x1d\xcezz\xce\x00\x00\x01\x00@\xff5\x06\x00\x05K\x00 \x00\x00\x01\x15\x14\x06#!\x01\x16\x14\x0f\x01\x06#\"'\x01&547\x01632\x1f\x01\x16\x14\a\x01!2\x16\x06\x00A4\xfd@\x01%&&K%54'\xfdu%%\x02\x8b&54&K&&\xfe\xdb\x02\xc04A\x02\x80\x805K\xfe\xda$l$L%%\x02\x8c%54'\x02\x8a&&J&j&\xfe\xdbK\x00\x00\x01\x00\x00\xff5\x05\xc0\x05K\x00 \x00\x00\x01\x14\a\x01\x06#\"/\x01&47\x01!\"&=\x01463!\x01&4?\x01632\x17\x01\x16\x05\xc0%\xfdu'43'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%\x02@6%\xfdu%%K&j&\x01%K5\x805K\x01&$l$K&&\xfdu#\x00\x00\x01\x005\xff\x80\x06K\x05@\x00!\x00\x00\x01\x14\x0f\x01\x06#\"'\x01\x11\x14\x06+\x01\"&5\x11\x01\x06\"/\x01&547\x01632\x17\x01\x16\x06K%K&56$\xfe\xdaK5\x805K\xfe\xda$l$K&&\x02\x8b#76%\x02\x8b%\x0253'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%%\xfdu'\x00\x00\x00\x00\x01\x005\xff\xb5\x06K\x05\x80\x00\"\x00\x00\x01\x14\a\x01\x06#\"'\x01&54?\x01632\x17\x01\x1146;\x012\x16\x15\x11\x01632\x1f\x01\x16\x06K%\xfdu'45%\xfdu&&J'45%\x01&L4\x804L\x01&%54'K%\x02\xc05%\xfdt%%\x02\x8c$65&K%%\xfe\xda\x02\xc04LL4\xfd@\x01&%%K'\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x00\x14\a\x01\x06\"&5\x11#\"\x0e\x05\x15\x14\x17\x14\x16\x15\x14\x06#\"'.\x02'\x02547\x12!3\x11462\x17\x01\a\x00\x13\xfe\x00\x134&\xe0b\x9b\x99qb>#\x05\x05\x11\x0f\x10\f\a\f\x0f\x03\u007f5\xa2\x02\xc9\xe0&4\x13\x02\x00\x03\x9a4\x13\xfe\x00\x13&\x1a\x01\x00\f\x1f6Uu\xa0e7D\x06#\t\x0f\x14\x11\t\x1a\"\a\x01\x1d\xa6dž\x01\x93\x01\x00\x1a&\x13\xfe\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00/\x00\x00\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x03\x17&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x01\xed\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x03I\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x00\x00\x00\x00\x02\x00\r\xff\x8d\x05\xf3\x05s\x00\x17\x00/\x00\x00\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x03\x00&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x02@\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x02\x93\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x00\x00\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x05\x808(\xfe`8(\xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(8\x03 \xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(88(\xfe`8\x00\x00\x00\x00\x01\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x05\x808(\xfb@(88(\x04\xc0(8\x03 \xc0(88(\xc0(88\x00\x00\x01\x00z\xff\x80\x06\x06\x05\x80\x005\x00\x00\x01\x1e\x01\x0f\x01\x0e\x01'%\x11\x14\x06+\x01\"&5\x11\x05\x06&/\x01&67-\x01.\x01?\x01>\x01\x17\x05\x1146;\x012\x16\x15\x11%6\x16\x1f\x01\x16\x06\a\x05\x05\xca.\x1b\x1a@\x1ag.\xfe\xf6L4\x804L\xfe\xf6.g\x1a@\x1a\x1b.\x01\n\xfe\xf6.\x1b\x1a@\x1ag.\x01\nL4\x804L\x01\n.g\x1a@\x1a\x1b.\xfe\xf6\x01\xe6\x1ag.n.\x1b\x1a\x99\xfe\xcd4LL4\x013\x99\x1a\x1b.n.g\x1a\x9a\x9a\x1ag.n.\x1b\x1a\x99\x0134LL4\xfe͙\x1a\x1b.n.g\x1a\x9a\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00-\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x02\xb2\x12\r\xc0\r\x14\x14\r\xc0\r\x12\x02\x12\n\n\x0e\xdc\x0e\n\n\x11\x14\x0e\xb9\x0e\x13\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xef\xbe\x0e\x13\x14\r\xbe\r\x14\x13\x01f\x02m\f\x06\b\b\x06\f\xfd\x93\n\x0f\x0f\x00\x00\x00\x04\x00\x00\x00\x00\x06\x00\x05@\x00\r\x00\x16\x00\x1f\x00J\x00\x00%5\x115!\x15\x11\x15\x14\x16;\x0126\x013'&#\"\x06\x14\x16$4&#\"\x0f\x0132\x05\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!\"&4632\x1f\x017632\x16\x14\x06#!2\x16\x03\xa0\xfe\xc0$\x1c\xc0\x1c$\xfe8\xc3~\x1a+(88\x02\xd88(+\x1a}\xc2(\x01\xb0\x12\x0e`8(\xfb\xc0(8`\x0e\x12\x12\x0e\x01\xb8]\x83\x83]k=\x80\x80=k]\x83\x83]\x01\xb8\x0e\x12\xb48\x01\xd4\xc0\xc0\xfe,8\x19\x1b\x1b\x03e\xa1\x1f8P88P8\x1f\xa1\xa0\xfe\xc0\x0e\x12\xfe`(88(\x01\xa0\x12\x0e\x01@\x0e\x12\x83\xba\x83M\xa5\xa5M\x83\xba\x83\x12\x00\x02\x00\x00\x00\x00\a\x00\x05\x80\x00\x15\x00N\x00\x00\x004&#\"\x04\x06\a\x06\x15\x14\x16327>\x0176$32\x01\x14\a\x06\x00\a\x06#\"'.\x01#\"\x0e\x02#\"&'.\x0354>\x0254&'&54>\x027>\x047>\x0432\x1e\x02\x05\x00&\x1a\xac\xfe\xdc\xe3z\x13&\x1a\x18\x15\x1b^\x14\x89\x01\a\xb6\x1a\x02&\x14.\xfe\xeb\xdb\xd6\xe0\x94\x8a\x0f\x92\x17\x10/+>\x1d+)\x19\x02\b\x03\x03>J>\x1c\x02\tW\x97\xbem7\xb4\xb3\xb2\x95'\n'\x14\"'\x18'? \x10\x03&4&c\xa9\x87\x15\x18\x1a&\x13\x18^\x13|h\x01\x06_b\xe0\xfe\xc2ml/\x05J@L@#*\x04\x0e\x06\r\a#M6:\x13\x04D\n35sҟw$\x12\x0f\x03\t'%\n'\x11\x17\t\\\x84t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x003\x00\x00\x05\x15\x14\x06#!\"&=\x01463!2\x16\x01\x14\x0e\x05\x15\x14\x17'\x17.\x0454>\x0554'\x17'\x1e\x04\x05\x80\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xff\x001O``O1C\x04\x01Z\x8c\x89Z71O``O1B\x03\x01Z\x8c\x89Z7\xa0@\r\x13\x13\r@\r\x13\x13\x04\x13N\x84]SHH[3`\x80\x01\x01)Tt\x81\xacbN\x84]SHH[3^\x82\x01\x01)Tt\x81\xac\x00\x00\x00\x00\x03\x00\x00\x00\x00\a\x00\x04\x80\x00\x11\x00!\x001\x00\x00\x01&'\x16\x15\x14\x00 \x00547\x06\a\x16\x04 $\x004&#\"\x06\x15\x14\x162654632\x00\x14\a\x06\x00 \x00'&476\x00 \x00\x17\x06\x80\x98\xe5=\xfe\xf9\xfe\x8e\xfe\xf9=嘅\x01\x91\x01\xd4\x01\x91\xfd\xb5\x1c\x14}\xb3\x1c(\x1czV\x14\x03l\x14\x8c\xfe'\xfd\xf2\xfe'\x8c\x14\x14\x8c\x01\xd9\x02\x0e\x01ٌ\x02@\xecuhy\xb9\xfe\xf9\x01\a\xb9yhu\xec\xcd\xf3\xf3\x029(\x1c\xb3}\x14\x1c\x1c\x14Vz\xfe\xd2D#\xe6\xfe\xeb\x01\x16\xe5#D#\xe5\x01\x16\xfe\xea\xe5\x00\x05\x00\x00\xff\xa0\a\x00\x04\xe0\x00\t\x00\x19\x00=\x00C\x00U\x00\x00%7.\x01547\x06\a\x12\x004&#\"\x06\x15\x14\x162654632%\x14\a\x06\x00\x0f\x01\x06#\"'&547.\x01'&476\x00!2\x177632\x1e\x03\x17\x16\x13\x14\x06\a\x01\x16\x04\x14\a\x06\a\x06\x04#76$7&'7\x1e\x01\x17\x02+NWb=嘧\x02\x89\x1c\x14}\xb3\x1c(\x1czV\x14\x01\x87\x01j\xfe\\i1\n\x12\fz\x10,\x8f\xf1X\x14\x14\x99\x01\xc6\x01\rY[6\n\x12\x05\x1a$\x1e!\x03\x10%\x9e\x82\x01\x18\b\x01\xc0\x14'F\x96\xfeu\xdeJ\xd4\x01iys\xa7?_\xaf9ɍ?\xc0kyhu\xec\xfe\xfe\x02n(\x1c\xb3}\x14\x1c\x1c\x14Vz\xef\a\x02\xbd\xfd\f\xbcY\x10F\n\x12\fKA؉\x1fL\x1f\xeb\x01\x10\x11a\x10\f\x13\x12\x13\x02\n\xfe0\x8b\xe52\x01\xf6-\x84F\"@Q\xac\xbe\x84\x12\uef33sp@\xb2_\x00\x00\x00\x00\x03\x00\x10\xff\x80\x06\xf0\x06\x00\x00\x0f\x00!\x003\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x03\x01\x16\a\x0e\x01#!\"&'&7\x01>\x012\x16\x04\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x12\n\r\v\xdc\v\r\n\x11\x14\x0e\xb9\x0e\x13\r\x03\x00#%\x11;\"\xfa\x00\";\x11%#\x03\x00\x11\x01\x05`,@L\xa1\xa0\x05\x11\x80\a\f\x04\x03\x0f\x06\xfe\xe9\xfe\xfd5\x05\r`\t\x0e\x02\x0f\t\xbd\xfc\v\x02\x01\n`\t\x0e\x06\x02\xc2\x01\x03\xfe\x04\x0e\x03\x02\v\x80\x0e\x10\x02\x99\xa0L\xc0\x05`4\xc0L\xa1\xfdH\x13\x0e`\x06\x01\x03\r\x01\xfc\xfe\xfd\xc2\x11\x0e`\t\x02\v\xfc\xbd\a\x10\r\fa\t\x015\x01\x03\x01\x17\b\x10\x10\v\x80\r\x05\x9f\xa0L@\x00\x0f\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x003\x007\x00;\x00?\x00O\x00s\x00\x00\x17!\x11!\x01!\x11!%!\x11!\x01!\x11!%!\x11!\x01!\x11!\x01!\x11!\x01!\x11!%!\x11!\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!\x11!%!\x11!\x01!\x11!7\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x02\xe0\x01@\xfe\xc0\xfe\x80\x01@\xfe\xc0\x03\x00\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\xfe\xa0\x13\r@\r\x13\x13\r@\r\x13\x02\xe0\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\x01\x80\x01 \xfe\xe0 \x13\r@\r\x13\x13\r@\r\x13\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x01 \xfe\xe0\x01 @\x01@\xfe\xc0\x01@@\x01 \xfc\x00\x01 \x01\xc0\x01 \xfc\x00\x01 @\x01@\x02 \x01 \r\x13\x13\r\xfe\xe0\r\x13\x13\xfc\xad\x01@@\x01 \xfe\xe0\x01 \xc0\x01 \r\x13\x13\r\xfe\xe0\r\x13\x13M\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x03\x00\x00\xff\xa0\a\x00\x05\xe0\x00\x12\x007\x00q\x00\x00\x01\x06\a.\x04+\x01\"&=\x0146;\x012\x00\x14\a\x01\x06#\"&=\x01\"\x0e\x01.\x06'67\x1e\x043!54632\x17\x01\x12\x14\a\x01\x06#\"&=\x01!\"\x0e\x02\a\x06\a\x0e\x06+\x01\"&=\x0146;\x012>\x02767>\x063!54632\x17\x01\x02\x9amBZxPV3!\x12\x0e\xc0\x0e\x12\x1emBZxPV3!\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x05\x00\x00&\x00\x00\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'5&6&>\x027>\x057&\x0254>\x01$32\x04\a\x00\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x11\x1b\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\xb6\xf4\x01\x9c\x03.\xfe\xa4\xfe٫\b\xafC\x0e\b\x02\x16\x12\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xace\xab\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x02\x04 $\x02=\x01463!2\x16\x1d\x01\x14\x1e\x032>\x03=\x01463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xc5\xfe\xa1\xfeH\xfe\xa1\xc5&\x1a\x01\x80\x1a&/\x027\x03#\"&463!2\x1e\x04\x17!2\x16\x02\x80LhLLh\x03\xccLhLLh\xcc!\x18\xfb\xec\r\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x10\x10\x1b\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0e\f\x04\a\x01\x04\xb1\x1a&4hLLhLLhLLhL\x03\xc0\xfe\x00\x18%\x03z<\n\x100&4&&\x1a\v)\x1f1\x05\x037&4&\r\x12\x1f\x15&\a&\x00\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00\x14\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\x03\xa0\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x00\x02\x00\x00\x00\x00\aW\x05\x80\x00\x13\x00*\x00\x00\x01\x14\a\x01\x0e\x01#!\"&547\x01>\x013!2\x16\x01\x15!\"\x06\a\x01\a4&5\x11463!2\x16\x1d\x01!2\x16\aW\x1f\xfe\xb0+\x9bB\xfb\xc0\"5\x1f\x01P+\x9bB\x04@\"5\xfe\xa9\xfc\xc0^\xce=\xfe\xaf\x05\x01\x84\\\x01@\\\x84\x02 \\\x84\x02H\x1f#\xfet3G\x1a\x1e\x1f#\x01\x8c3G\x1a\x01:\xa0_H\xfet\x06\x04\x11\x04\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x01\x00@\xff\x00\x02\xc0\x06\x00\x00\x1f\x00\x00\x00\x14\x06+\x01\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11#\"&47\x0162\x17\x01\x02\xc0&\x1a\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x04\xda4&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x13\x13\xff\x00\x00\x00\x00\x01\x00\x00\x01@\a\x00\x03\xc0\x00\x1f\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x80\x1a&\x13\xff\x00\x00\x00\x00\x05\x00\x00\xff\x80\b\x00\x05\x80\x00\x03\x00\a\x00\r\x00\x11\x00\x15\x00\x00\x01\x11!\x11\x01\x11!\x11\x01\x15!\x113\x11\x01\x11!\x11\x01\x11!\x11\x02\x80\xff\x00\x02\x80\xff\x00\x05\x00\xf8\x00\x80\x05\x00\xff\x00\x02\x80\xff\x00\x02\x80\xfe\x00\x02\x00\x02\x00\xfc\x00\x04\x00\xfb\x80\x80\x06\x00\xfa\x80\x03\x80\xfd\x00\x03\x00\x01\x80\xfb\x80\x04\x80\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x000\x00@\x00\x00\x01\x06\a67\x06\a&#\"\x06\x15\x14\x17.\x01'\x06\x15\x14\x17&'\x15\x14\x16\x17\x06#\"'\x1e\x01\x17\x06#\"'\x1632>\x0354'6\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x008AD\x19AE=\\W{\x05\x81\xe2O\x1d[/5dI\x1d\x16\r\x1a\x15kDt\x91\x1a\x18\x94\xaepČe1\x01?\x01*\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x9e\x19\t(M&\rB{W\x1d\x13\ata28r=\x01\x19\x02Ku\x0e\b\x04?R\x01Z\x03^Gw\x9b\xa9T\x12\t-\x01\x02\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x04\xe0w\xa9\xa9w\xbc\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd\xecw\xa9\xa9w\x05\x80\xa9w\xfc@w\xa9\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad\xa9w\x03\xc0w\xa9\x00\x00\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x17\x00\x1b\x00#\x00'\x00.\x00>\x00\x00\x004&#\"\x06\x15\x14\x1626546326\x14\x06\"&462\x01!5!\x00\x10& \x06\x10\x16 \x01!5!\x03!=\x01!\a!%\x11\x14\x06#!\"&5\x11463!2\x16\x03\xa0\x12\x0eB^\x12\x1c\x128(\x0e\xf2\x96Ԗ\x96\xd4\xfc\x96\x06\x00\xfa\x00\x04\x80\xe1\xfe\xc2\xe1\xe1\x01>\xfc\xe1\x01\x80\xfe\x80\x80\x06\x00\xfc\xc4@\xfd|\x06\x80K5\xfa\x005KK5\x06\x005K\x02\xb2\x1c\x12^B\x0e\x12\x12\x0e(8\bԖ\x96Ԗ\xfc\u0080\x01\x1f\x01>\xe1\xe1\xfe\xc2\xe1\x04\x02\x80\xfe\xc0v\x8a\x80\x80\xfb\x005KK5\x05\x005KK\x00\x02\x00\x00\xffH\x06\x93\x05\x80\x00\x15\x00G\x00\x00\x004&\"\x06\x15\x14\x17&#\"\x06\x14\x162654'\x1632\x01\x14\x06#\".\x02'\a\x17\x16\x15\x14\x06#\"'\x01\x06#\"&54\x12$32\x16\x15\x14\a\x017.\x0354632\x17\x1e\x04\x03@p\xa0p\x13)*Ppp\xa0p\x13)*P\x03\xc3b\x11\t'\"+\x03`\xdc\x1cN*(\x1c\xfda\xb0\xbd\xa3;\x012\xa0\xa3̓\x01c`\x03.\" b\x11\r\n\x06PTY9\x03\xb0\xa0ppP*)\x13p\xa0ppP*)\x13\xfe\x00\x11b \".\x03`\xdc\x1c(*N\x1c\x02\x9f\x83ͣ\xa0\x012\xbeͣ\xbd\xb0\xfe\x9d`\x03+\"'\t\x11b\n\x06MRZB\x00\x00\x00\x00\x06\x00\x00\xff\x0f\a\x80\x05\xf0\x00\a\x00\x11\x00\x1b\x00\u007f\x00\xbd\x00\xfb\x00\x00\x004&\"\x06\x14\x162\x014&\"\x06\x15\x14\x1626\x114&\"\x06\x15\x14\x1626\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x15\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x01\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x11\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x03\x80\x96Ԗ\x96\xd4\x03\x96LhLKjKLhLKjK\xfe\x80\x0e\t\x9b\v\x15\"8\a\a\x17w\x13\v\ns%(\v\f\a\x17\xba\v\x12\x01\x17\")v\a\r\v\n\x90\a\n>\x10\x17\f\x98\n\x0e\x0e\t\x9b\v\x15\"8\a\a\x16x\x13\v\ns\"+\v\f\a\x17\xba\v\x12\x01\x17\")v\b\f\v\n\x90\a\f<\x0f\x17\v\x98\n\x0e\x02\x80\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x02\x16Ԗ\x96Ԗ\xff\x004LL45KK\x0454LL45KK\xfe\x90\xb9\n\x13\x01\x18#)0C\v\t\f\a\x1ew\aZ\x13\fl/\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\t\n\x0eN\x16,&\x18\x01\x11\v\xb9\n\x13\x01\x18#)0C\v\t\f\b\x1ev\aZ\x12\x0el.\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\b\v\x10L\x160\"\x17\x02\x11\xfd\xe0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x03\xf0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00%\x00O\x00\x00\x00\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546$ \x04\x01\x14\x06\a\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x05\x80\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x01E\x01~\x01E\x02<\x8e|\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x03\x8b\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b쉉\xfd\x89x\xd1H\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6\x00\x00\x03\x00\x00\xff\x80\x06\x00\x06\x00\x00\a\x00<\x00m\x00\x00$4&\"\x06\x14\x162\x014&#!4654&#\x0e\x02\a\x06\a\x0e\x06+\x01\x1132\x1e\x04\x17\x16;\x01254'>\x014'654&'>\x017\x14\a\x16\x15\x14\a\x16\x15\x14\a\x16\x06+\x02\"&'&#!\"&5\x11463!6767>\x027632\x1e\x01\x15\x14\a32\x16\x01\x00&4&&4\x04\xa6N2\xfe\xa0`@`\x1a\x18%)\x167\x04&\x19,$)'\x10 \r%\x1d/\x170\x05Ӄy\xc0\x05\x1e#\x125\x14\x0f +\x801\t&\x03<\x01\xac\x8d$]`\xbb{t\x16\xfe\xe05KK5\x01\x12$e:1\x18\x17&+'3T\x86F0\xb0h\x98\xa64&&4&\x02\x803M:\xcb;b^\x1av\x85+\x17D\x052 5#$\x12\xfd\x80\x06\a\x0f\b\x11\x02I\xa7\x1a\x1e\x10IJ 2E\x19=\x11\x01\\$YJ!$MC\x15\x16eM\x8b\xa1-+(K5\x02\x805K\x18\x83K5\x19y\x84*%A\x8au]c\x98\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x05\x80\x00\a\x00>\x00q\x00\x00\x004&\"\x06\x14\x162\x014&'>\x0154'654&'654&+\x01\"\a\x0e\x05+\x01\x1132\x1e\x05\x17\x16\x17\x1e\x02\x172654&5!267\x14\x06+\x01\x16\x15\x14\a\x0e\x01#\"'.\x03'&'&'!\"&5\x11463!27>\x01;\x012\x16\a\x15\x16\x15\x14\a\x16\x15\x14\a\x16\x01\x00&4&&4\x04\xa6+ \x0f\x145\x12#\x1e\x05bW\x80\x83\xd3\x050\x17/\x1d%\r \x10')$,\x19&\x047\x16)%\x18\x1a`@`\x01`2N\x80\x98h\xb00##\x86T3'\"(\v\x18\x130;e$\xfe\xee5KK5\x01 \x16t\x80\xbeip\x8c\xad\x01<\x03&\t1\x04&4&&4&\xfe\x00#\\\x01\x11=\x19E2\x1f&%I\x10\x1e\x1aURI\x02\x11\b\x0f\a\x06\xfd\x80\x12$#5 2\x05D\x17+\x85v\x1a^b;\xcb:M2g\x98c]vDEA%!bSV\x152M\x83\x18K5\x02\x805K(,,\x9e\x89\x05Me\x16\x15CM$!I\x00\x00\x00\x01\x00\x00\xff\xad\x03@\x05\xe0\x00\x12\x00\x00\x01\x11\x05\x06#\"&547\x13\x01&547%\x136\x03@\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13\x05\xe0\xfa\xc5\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7)\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x009\x00\x00\x014.\x03\"\x0e\x02\a\x06\"'.\x03\"\x0e\x03\x15\x14\x17\t\x0167\x14\a\x01\x06\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x06\x80+C`\\hxeH\x18\x12>\x12\x18Hexh\\`C+\xbb\x02E\x02D\xbc\x80\xe5\xfd\x91\x124\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\x03\xacQ|I.\x103MC\x1c\x16\x16\x1cCM3\x10.I|Q\xa8\xbb\xfd\xd0\x02/\xbc\xa8\xdd\xe5\xfd\xa8\x12\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06 \x05\x00\x00(\x00@\x00\x00%\x14\x16\x0e\x02#!\"&5\x11463!2\x16\x15\x14\x16\x0e\x02#!\"\x06\x15\x11\x14\x163!:\x02\x1e\x03\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\x01\x02\x80\x02\x01\x05\x0f\r\xfe\xc0w\xa9\xa9w\x01@\r\x13\x02\x01\x05\x0f\r\xfe\xc0B^^B\x01 \x01\x14\x06\x11\x06\n\x04\x03\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 `\x04 \x15\x1a\r\xa9w\x02\xc0w\xa9\x13\r\x04 \x15\x1a\r^B\xfd@B^\x02\x04\a\v\x0224\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x0f\x00%\x005\x00\x0073\x11#7.\x01\"\x06\x15\x14\x16;\x0126\x013\x114&#\"\a35#\x16\x033\x1147>\x0132\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\xed\xe7\xe7\xf6\x01FtIG9\x01;H\x02I\xe7\x92x\x88I\x02\xe7\x03\x03\xe7\a\x0f<,t\x01ԩw\xfc@w\xa9\xa9w\x03\xc0w\xa9z\x02\xb6\xd64DD43EE\xfc\xa7\x01\x8e\x9a\x9eueB\xfd\x8c\x01\x84&\x12#1\x9d\x02s\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x00\x04\x80\x05\x80\x00\v\x00.\x00\x00\x01\x114&\"\x06\x15\x11\x14\x1626\x01\x14\x06#!\x03\x0e\x01+\x01\"'\x03!\"&5463\x11\"&463!2\x16\x14\x06#\x112\x16\x01\xe0\x12\x1c\x12\x12\x1c\x12\x02\xa0&\x1a\xfeS3\x02\x11\f\x01\x1b\x05L\xfel\x1a&\x9dc4LL4\x02\x804LL4c\x9d\x02\xa0\x01\xc0\x0e\x12\x12\x0e\xfe@\x0e\x12\x12\xfe\xae\x1a&\xfe\x1d\f\x11\x1b\x01\xe5&\x1a{\xc5\x02\x00LhLLhL\xfe\x00\xc5\x00\x00\x00\x02\x00\x00\x00\x00\a\x00\x06\x00\x00'\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x14\x06#!\"\x06\x15\x11\x14\x163!265\x1146;\x012\x16\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x02\xc0\x0e\x12\x12\x0e\xfd@B^^B\x03@B^\x12\x0e@\x0e\x12\x01\x80&4\x13\xb0\xfdt\n\x1a\nr\n\n\x02\x8c\xb0\x13&\x1a\x02\x00\x1a&\x02`\xfe\xc0w\xa9\xa9w\x03@w\xa9\x12\x0e@\x0e\x12^B\xfc\xc0B^^B\x01@\x0e\x12\x12\x03R\xfe\x00\x1a&\x13\xb0\xfdt\n\nr\n\x1a\n\x02\x8c\xb0\x134&&\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\x17\x00@\x00\x00\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\t\x01\x11\x14\x06#!\"&54&>\x023!265\x114&#!*\x02.\x0354&>\x023!2\x16\x04\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 \x01s\xa9w\xfe\xc0\r\x13\x02\x01\x05\x0f\r\x01@B^^B\xfe\xe0\x01\x14\x06\x11\x06\n\x04\x02\x01\x05\x0f\r\x01@w\xa9\x02\x9a4\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x013\xfd@w\xa9\x13\r\x04 \x15\x1a\r^B\x02\xc0B^\x02\x04\a\v\b\x04 \x15\x1a\r\xa9\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00I\x00\x00\x01&5!\x15\x14\x16%5!\x14\a>\x017\x15\x14\x0e\x02\a\x06\a\x0e\x01\x15\x14\x1632\x16\x1d\x01\x14\x06#!\"&=\x014632654&'&'.\x03=\x01463!5463!2\x16\x1d\x01!2\x16\x01\xcaJ\xff\x00\xbd\x04\xc3\xff\x00J\x8d\xbd\x80S\x8d\xcdq*5&\x1d=CKu\x12\x0e\xfc\xc0\x0e\x12uKC=\x1d&5*q͍S8(\x01 ^B\x02@B^\x01 (8\x02\x8d\xa2\xd1`N\xa8\xf6`Ѣ\x1d\xa8\u0380G\x90tO\x056)\"M36J[E@\x0e\x12\x12\x0e@E[J63M\")6\x05Ot\x90G\x80(8`B^^B`8\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00,\x002\x00\x81\x00\x91\x00\x00\x016'&\a\x06\x17\x16'&\a\x06\x17\x1676'6'&\a\x06\x17\x16\x176&'&\x06\x17\x16\x176'&\a\x06\x17\x1e\x014#\"\x147&\x06\x17\x166\x014\x00 \x00\x15\x14\x12\x17\x16654'\x0e\x02.\x01'&'.\x03632\x1e\x01\x17\x1e\x0126767.\x03547&76\x16\x1f\x0162\x17>\x02\x17\x16\a\x16\x15\x14\x0e\x03\a\x16\x15\x14\x06\x15\x14\x1676\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\a\x04\a\t\x05\x04\a\t\x17\x05\a\x06\x06\a\x05\x06/\x02\a\a\x01\x03\a\b\x16\x02\x01\x03\x06\b\x05\x06[\x02\v\t\x04\x02\v\t.\f\n=\x02\x16\x02\x02\x14\x02\x82\xfe\xd4\xfeX\xfe\xd4Ě\x12\x11\x01\x06\x134,+\b\x17\"\x02\x05\v\x03\v\x0e\x06\x12*\f\x10+, \x0e\a\x1a1JH'5\x18\x1d\x13G\x19\x1a:\x8c:\v#L\x13\x1d\x185\x1c+@=&#\x01\x11\x12\x9a\xc4\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01P\x06\a\a\x05\x06\a\a.\a\x03\x04\b\b\x03\x041\x04\x04\x02\x04\x05\x03\x02\x13\x01\a\x02\a\b\a\x06G\a\x04\x03\a\a\x04\x03\x04\x10\x10\x0f\a\x04\a\b\x04\x01E\xd4\x01,\xfe\xd4ԧ\xfe\xf54\x03\x10\f4+\x01\x03\x01\t\x1f\x1a;\x0f\x01\x05\v\b\a\x04\x1b\x16\x1c\x1c\a\x06/\x16\x06\x195cFO:>J\x06\x1b\x10\x10\x11\x11\a\x16\x1e\x06J>:O9W5$\x10\x04\x1f@(b\x02\f\x10\x034\x01\v\x02\x87\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x04\x00\x00\xff\x80\x06\x80\x05\xc0\x00\a\x00\x0f\x00'\x00?\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x1e\x013!267!2\x16\x01\x06#!\x11\x14\x06#!\"&5\x11!\"'&7\x0162\x17\x01\x16\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01\xab\x15c=\x01\x00=c\x15\x01\xab(8\xfe\xbb\x11*\xff\x00&\x1a\xff\x00\x1a&\xff\x00*\x11\x11\x1f\x01\xc0\x126\x12\x01\xc0\x1f&4&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(88HH88\x02`(\xfe@\x1a&&\x1a\x01\xc0('\x1e\x01\xc0\x13\x13\xfe@\x1e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x05\xff\x05\x80\x001\x00c\x00\x00\x014&'.\x0254654'&#\"\x06#\"&#\"\x0e\x01\a\x06\a\x0e\x02\x15\x14\x16\x15\x14\x06\x14\x1632632\x16327>\x01\x127\x14\x02\x06\a\x06#\"&#\"\x06#\"&54654&54>\x02767632\x1632632\x16\x15\x14\x06\x15\x14\x1e\x02\x17\x1e\x01\x05\u007f\x0e\v\f\n\b\n\n\x04\t\x13N\x14<\xe8;+gC8\x89A`\u007f1\x19\x16\x18\x16\x18a\x199\xe19\xb5g\x81\xd5w\x80\x8c\xfc\x9b|\xca9\xe28\x18a\x19Ie\x16\x19$I\x80VN\x9a\xc2z<\xe7:\x13L\x14QJ\n\x04\x03\f\x02\x10\x12\x02\xc6,\x8b\x1b\x1e\x1c-\x1a\x17[\x16%\x12\x01\t0\x17\x18\x1661I\xe9\xef\x81(\xa0)\x17W,\x1d\x16\x1f$-\xd7\x01\x14\x8b\xa5\xfe\xbb\xfb7,\x1d\x1doI\x18X\x17(\xa1)o\xd5ζA;=N0\neT\x17Z\x17\r\x18\t \x04(\x9d\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00O\x00\x00\x01\x14\x06\a\x06\a\x06#\".\x03'&'&\x00'&'.\x0454767>\x0132\x17\x16\x17\x1e\x02\x17\x1e\x02\x15\x14\x0e\x02\x15\x14\x1e\x02\x17\x1e\x01\x17\x1e\x0332>\x0232\x1e\x01\x17\x1e\x02\x17\x16\x17\x16\x05\x80\x14\v\x15e^\\\x1b4?\x1fP\tbM\u007f\xfe\xeeO0#\x03\x1e\v\x12\a382\x19W\x1b\x0e\a\x12#\v& \x0f\x03\x1d\x0e9C9\n\a\x15\x01Lĉ\x02\"\x0e\x1b\t\x1282<\x14\x0e\x1d*\x04\x199F\x13F\x06\x03\x01(\x1bW\x19283\a\x12\v\x1e\x03#0O\x01\x12\u007fMb\tP\x1f?4\x1b\\^e\x15\v\x14\x03\x06F\x13F9\x19\x04*\x1d\x0e\x14<28\x12\t\x1b\x0e\"\x02\x89\xc4L\x01\x15\a\n9C9\x0e\x1d\x03\x0f &\v#\x12\a\x00\x00\x00\x02\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00\x00\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x04`\xfc\xc0B^^B\x03@B^^ީw\xfc\xc0w\xa9\xa9w\x03@w\xa9\x05\x00^B\xfc\xc0B^^B\x03@B^\xa0\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x02\x00\x00\xff\x97\x05\x00\x05\x80\x00\x06\x00#\x00\x00\x01!\x11\x017\x17\x01\x132\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x80\xfc\x00\x01\xa7YY\x01\xa7\f\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x00\xfb&\x01\x96UU\xfej\x05Z\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00W\x00\x00\x014.\x04'.\x02#\"\x0e\x02#\".\x02'.\x01'.\x0354>\x0254.\x01'.\x05#\"\a\x0e\x01\x15\x14\x1e\x04\x17\x16\x00\x17\x1e\x0532676\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x04 1.-\x06\x05\x1c\x16\n\x0f+$)\r\a\x13\f\x16\x03c\x8e8\x02\r\x06\a)1)\n\x14\x03\x03\x18\x1a\x1b\x17\n\v05.D\x05\x05\r\a\x12\x02<\x019\xa4\x060\x12)\x19$\x109\x93\x15\x16\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01W\v\n\x17\x1b\x1a\x18\x03\x03\x14\n)1)\a\x06\r\x027\x8fc\x03\x16\f\x13\a\r)$+\x0f\n\x16\x1c\x05\x06-.1 \x04\x16\x15\x939\x10$\x19)\x120\x06\xa4\xfe\xc7<\x02\x12\a\r\x05\x05D.5\x039\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00,\x00\x00\x06T\x05\x00\x001\x00\x00\x01\x06\a\x16\x15\x14\x02\x0e\x01\x04# '\x16327.\x01'\x16327.\x01=\x01\x16\x17.\x01547\x16\x04\x17&54632\x1767\x06\a6\x06TC_\x01L\x9b\xd6\xfeҬ\xfe\xf1\xe1#+\xe1\xb0i\xa6\x1f!\x1c+*p\x93DNBN,y\x01[\xc6\b\xbd\x86\x8c`m`%i]\x04hbE\x0e\x1c\x82\xfe\xfd\xee\xb7m\x91\x04\x8a\x02}a\x05\v\x17\xb1u\x04&\x03,\x8eSXK\x95\xb3\n&$\x86\xbdf\x159s?\n\x00\x00\x00\x01\x00_\xff\x80\x03\xbf\x06\x00\x00\x14\x00\x00\x01\x11#\"\x06\x1d\x01!\x03#\x11!\x11#\x11!54632\x03\xbf\x9dV<\x01%'\xfe\xfe\xce\xff\x00\xffЭ\x93\x05\xf4\xfe\xf8HH\xbd\xfe\xd8\xfd\t\x02\xf7\x01(ں\xcd\x00\x00\x00\b\x00\x00\xff\xa7\x06\x00\x05\x80\x00T\x00\\\x00d\x00k\x00s\x00z\x00\x82\x00\x88\x00\x00\x00 \x04\x12\x15\x14\x00\a\x06&54654'>\x0454'6'&\x06\x0f\x01&\"\a.\x02\a\x06\x17\x06\x15\x14\x1e\x03\x17\x06\a\x0e\x01\"&'.\x01/\x01\"\x06\x1e\x01\x1f\x01\x1e\x01\x1f\x01\x1e\x03?\x01\x14\x16\x15\x14\x06'&\x0054\x12\x136'&\a\x06\x17\x16\x176'&\a\x06\x17\x16\x176'&\a\x06\x16\x176'&\a\x06\x17\x16\x176'&\x06\x17\x1674\a\"\x15\x14727&\a\x06\x166\x02/\x01\xa2\x01a\xce\xfe\xdb\xe8\x1b\x1a\x0149[aA)O%-\x1cj'&]\xc6]\x105r\x1c-%O)@a[9'\n\x150BA\x17\x13;\x14\x14\x15\x10\x06\f\a\a\x16+\n\n\r>HC\x16\x17\x01\x1a\x1b\xe8\xfe\xdb\xceU\x03\n\n\x03\x03\n\t#\a\t\n\x06\a\t\n$\t\t\b\t\t\x122\b\f\f\b\t\r\fA\x03\x10\x0f\b\x11\x0fC\x11\x10\x11\x10:\x02\x10\x10\x04 \x05\x80\xce\xfe\x9f\xd1\xfb\xfeoM\x05\x18\x12\x03\x93=a-\x06\x186O\x83UwW[q\t(\x18\x18\x1a\x1a\v -\tq[WwU\x82P6\x18\x06$C\n\n+) (\x04\x03\t\x0e\x0e\x05\x05\n8\x17\x17&/\r\x01\x04\x04&e\x04\x12\x18\x05M\x01\x91\xfb\xd1\x01a\xfc\u007f\a\x05\x03\x05\a\x05\x06\x1a\x05\v\t\x06\x05\v\n&\a\f\r\a\x05\x1a$\b\v\f\t\b\v\f\x10\v\x05\x04\x16\x04\x06\a\r\x02\v\r\x02\x15\v\x02\x03\x18\b\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00%\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&\"\x06\x1d\x0132\x16\x15\x11\x14\x06#!\"&5\x11463!54\x00 \x00\x06\x80&\x1a@\x1a&\x96Ԗ`(88(\xfc@(88(\x02\xa0\x01\a\x01r\x01\a\x03\xc0\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xc08(\xfd\xc0(88(\x02@(8\xc0\xb9\x01\a\xfe\xf9\x00\x00\x00\x05\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x00\x19\x00#\x00'\x00+\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x15\"\x06\x1d\x01!54&#\x11265\x11!\x11\x14\x16375!\x1535!\x15\x06\xe0B^^B\xf9\xc0B^^B\r\x13\x06\x80\x13\r\r\x13\xf9\x80\x13\r`\x01\x00\x80\x01\x80\x05\x80^B\xfb@B^^B\x04\xc0B^\x80\x13\r\xe0\xe0\r\x13\xfb\x00\x13\r\x02`\xfd\xa0\r\x13\x80\x80\x80\x80\x80\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\a\x00!\x00=\x00\x00\x00\x14\x06\"&462\x01\x16\a\x06+\x01\"&'&\x00'.\x01=\x01476;\x01\x16\x04\x17\x16\x12\x05\x16\a\x06+\x01\"&'&\x02\x00$'.\x01=\x01476;\x01\f\x01\x17\x16\x12\x01\x80p\xa0pp\xa0\x02p\x02\x13\x12\x1d\x87\x19$\x02\x16\xfe\xbb\xe5\x19!\x15\x11\x1a\x05\xa0\x01$qr\x87\x02\r\x02\x14\x12\x1c\x8f\x1a%\x01\f\xb2\xfe\xe3\xfe}\xd7\x19#\x14\x12\x1a\x03\x01\x06\x01ߺ\xbb\xd6\x01\x10\xa0pp\xa0p\xfe\xc5\x1c\x14\x15!\x19\xe5\x01E\x16\x02$\x19\x87\x1d\x12\x11\r\x87rq\xfeܢ\x1b\x14\x14#\x19\xd7\x01\x83\x01\x1d\xb2\r\x01%\x19\x8f\x1c\x12\x12\rֻ\xba\xfe!\x00\x05\x00\x00\x00\x00\x06\x00\x05\x00\x00\a\x00\x0f\x00\x1f\x00)\x00?\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x17\x114&#!\"\x06\x15\x11\x14\x163!26\x01!\x03.\x01#!\"\x06\a\x01\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x04\x10/B//B\x01//B//B\x9f\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfb2\x04\x9c\x9d\x04\x18\x0e\xfc\xf2\x0e\x18\x04\x04\xb1^B\xfb@B^\x10\xc5\x11\\7\x03\x0e7\\\x11\xc5\x10\x01aB//B//B//B/\xf0\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x01\xed\x01\xe2\r\x11\x11\r\xfd~\xfe\xc0B^^B\x01@\x192\x02^5BB5\xfd\xa22\x00\x02\x00\x00\xff\x83\a\x00\x05\x80\x00.\x004\x00\x00\x012\x16\x14\x06#\x11\x14\x06#\x00%\x0e\x01\x16\x17\x0e\x01\x1e\x02\x17\x0e\x01&'.\x0467#\"&=\x01463! \x012\x16\x15\x03\x11\x00\x05\x11\x04\x06\x805KK5L4\xfe_\xfeu:B\x04&\x14\x06\x121/&\x1d\xa5\xac.\a-\x13\x1b\x03\n\x11zB^^B\x01\xe0\x01\xb3\x01\xcd4L\x80\xfev\xfe\x8a\x01y\x03\x80KjK\xfe\x804L\x01[!\x13^k'!A3;)\x1e:2\x1b*\x17\x81\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\xfdv\x05\x14\xfe\xf60Z\x99\xba\x99Z0\x04\xc0L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x010\x01,\x02\x143lb??bl3\xfd\xec\xfe\xd44Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x00\x01\x00\x02\xff\x80\x05\xfe\x05}\x00I\x00\x00\x01\x17\x16\a\x06\x0f\x01\x17\x16\a\x06/\x01\a\x06\a\x06#\"/\x01\a\x06'&/\x01\a\x06'&?\x01'&'&?\x01'&76?\x01'&76\x1f\x017676\x1f\x0176\x17\x16\x1f\x0176\x17\x16\x0f\x01\x17\x16\x17\x16\a\x05`\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n)\f\a\x1f\x14\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x8a\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n))\x1d\x87\x87\x1d))\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x02\x80\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\x02\x16\x8a\x8a\x1e\n\v)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc)\n\f\x1f\x8b\x8b\x1e\v\n)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x005\x00h\x00\x00$4&\"\x06\x14\x162\x014&#!4>\x0254&#\"\a\x06\a\x06\a\x06\a\x06+\x01\x1132\x1e\x013254'>\x014'654&'!267\x14\x06+\x01\x06\a\x16\x15\x14\a\x16\x06#\"'&#!\"&5\x11463!2>\x05767>\x0432\x16\x15\x14\a!2\x16\x01\x00&4&&4\x05\xa6N2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5Q\xbd\x05\x1e#\x125\x14\x0f\x01K4L\x80\x97i\xa9\x04!\x03<\x01\xac\x8d\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\xa64&&4&\x02\x803M\x1495S+C=\x8b,\x15@QQ\x199\xfd\x80@@\xa7\x1a\x1e\x10IJ 2E\x19=\x11L5i\x98>9\x15\x16eM\x8b\xa1E;K5\x02\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x005\x00=\x00q\x00\x00%3\x11#\".\x02'&'&'&'.\x04#\"\x06\x15\x14\x1e\x02\x15!\"\x06\x15\x14\x163!\x0e\x01\x15\x14\x17\x06\x14\x16\x17\x06\x15\x14\x1632>\x01$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"\a\x06#\"&?\x01&547&'#\"&5463!&54632\x1e\x03\x17\x16\x17\x1e\x063!2\x16\x05` #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K\x0f\x145\x12#\x1e\x04aWTƾ\x01h&4&&4\xa6K5\xfe\xe0;\xa4\xbe\u007f\x8e\xb0\x01\x01=\x03!\x04\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5K\x80\x02\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L\x11=\x19E2 JI\x10\x18 UR@@&4&&4&\x02\x80\xfd\x805K;E\x9b\x8c\x05Lf\x16\x159>\x98ig\x98R\x157J\x03\x1c\x0f\x1c\x11\x13\tK\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x005\x00h\x00\x00\x044&\"\x06\x14\x162\x134#\"\a.\x01\"\a&#\"\x06\a\x114&#\"\x06\x15\x11\".\x02#\"\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x16\x1d\x01!54>\x017\x14\a\x06\x15\x11\x14\x06#!\"&5\x114.\x05'&'.\x0454632\x17\x114632\x16\x1d\x01\x16\x17632\x176\x16\x05\x00&4&&4\xa6\xa7\x1a\x1e\x10IJ 2E\x19=\x11L43M\x1495S+C=\x8b,\x15@QQ\x199\x02\x80@@\x80E;K5\xfd\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98gi\x98>9\x15\x16eM\x8b\xa1Z4&&4&\x03<\xbd\x05\x1e#\x125\x14\x0f\x01K4LN2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5V\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\x97i\xa9\x04!\x03<\x01\xac\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x004\x00<\x00p\x00\x00\x014.\x01=\x01!\x15\x14\x0e\x02\a\x06\a\x06\a\x06\a\x0e\x04\x15\x14\x1632>\x023\x11\x14\x163265\x11\x16327\x16267\x16326\x024&\"\x06\x14\x162\x01\x14\x06/\x01\x06#\"'\x06\a\x15\x14\x06#\"&5\x11\x06#\"&54>\x03767>\x065\x11463!2\x16\x15\x11\x14\x17\x16\x05\x80@@\xfd\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L.9E2 JI\x10\x18 UR\x80&4&&4\x01&\x9b\x8c\x05Lf\x16\x156A\x98ig\x986Jy\x87#@>R\x157J\x03\x1c\x0f\x1c\x11\x13\tK5\x02\x805K;E\x02@TƾH #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K#5\x12#\x1e\x04a\x03=4&&4&\xfdD\x8e\xb0\x01\x01=\x03\x1e\a\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5KK5\xfe\xe0;\xa4\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x0154&#!764/\x01&\"\a\x01\a\x06\x14\x1f\x01\x01\x162?\x0164/\x01!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x00&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x126\x12[\x12\x12\xbd\x01\xf6\x1a&\x01\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\xbd\x134\x13[\x12\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01\x01&\"\x0f\x01\x06\x14\x1f\x01!\"\x06\x1d\x01\x14\x163!\a\x06\x14\x1f\x01\x1627\x017$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x05\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\x126\x12\x01j[\x01\r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02e6\x12[\x01j\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\xfe\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004'\x01'&\"\x0f\x01\x01\x06\x14\x1f\x01\x162?\x01\x11\x14\x16;\x01265\x11\x17\x162?\x01$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02f6\x12\x01j[\x12\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\xfd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01&\"\x0f\x01\x114&+\x01\"\x06\x15\x11'&\"\x0f\x01\x06\x14\x17\x01\x17\x162?\x01\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\x126\x12[\x01j\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02d6\x12[\x12\x12\xbd\x01\xf6\x1a&&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x00\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x01\xd8\x02\x18\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x01\x0e\x01\a2>\x01767676\x17&67>\x01?\x01\x06&'\x14\a4&\x06'.\x02'.\x01'.\x03\"\x0e\x01#&\x0e\x02\a\x0e\x01\a6'&\a6&'3.\x02'.\x01\a\x06\x1e\x01\x15\x16\x06\x15\x14\x16\a\x0e\x01\a\x06\x16\x17\x16\x0e\x02\x0f\x01\x06&'&'&\a&'&\a6'&\a>\x01567>\x02#\x167>\x0176\x1e\x013\x166'\x16'&'&\a\x06\x17&\x0e\x01'.\x01'\"\a6&'6'.\x01\a\x0e\x01\x1e\x02\x17\x16\a\x0e\x02\a\x06\x16\a.\x01'\x16/\x01\"\x06&'&76\x17.\x01'\x06\a\x167>\x0176\x177\x16\x17&\a\x06\a\x16\a.\x02'\"\a\x06\a\x16\x17\x1e\x027\x16\a6\x17\x16\x17\x16\a.\x01\a\x06\x167\"\x06\x14\a\x17\x06\x167\x06\x17\x16\x17\x1e\x02\x17\x1e\x01\x17\x06\x16\a\"\x06#\x1e\x01\x17\x1e\x0276'&'.\x01'2\x1e\x02\a\x06\x1e\x02\x17\x1e\x01#2\x16\x17\x1e\x01\x17\x1e\x03\x17\x1e\x01\x17\x162676\x16\x17\x167\x06\x1e\x02\x17\x1e\x01\x1767\x06\x16765\x06'4.\x026326&'.\x01'\x06&'\x14\x06\x15\"'>\x017>\x03&\a\x06\a\x0e\x02\a\x06&'.\x0154>\x01'>\x017>\x01\x1667&'&#\x166\x17\x1674&7\x167\x1e\x01\x17\x1e\x0267\x16\x17\x16\x17\x16>\x01&/\x0145'.\x0167>\x0276'27\".\x01#6'>\x017\x1676'>\x017\x16647>\x01?\x016#\x1676'6&'6\x1676'&\x0367.\x01'&'6.\x02'.\x03\x06#\a\x0e\x03\x17&'.\x02\x06\a\x0e\x01\a&6'&\x0e\x04\a\x0e\x01\a.\x015\x1e\x01\x17\x16\a\x06\a\x06\x17\x14\x06\x17\x14\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03D\x02\x0f\x06\x02\x05\x05\x01\x06\x10\x0e&\"\x11\x02\x17\x03\x03\x18\x03\x02\f\v\x01\x06\t\x0e\x02\n\n\x06\x01\x02\x0f\x02\x01\x03\x03\x05\x06\b\a\x01\x03\x06\x03\x06\x02\x03\v\x03\x0f\x10\n\x06\t\x03\a\x05\x01\x0f\x14\x03\b4\a\x05\x01\a\x01\r\x1c\x04\x03\x1a\x03\x05\a\a\x02\x01\x06\x05\x04\x03\v\x13\x04\a\t\x17\x06\x05$\x19!\x06\x06\a\f\x03\x02\x03\t\x01\f\a\x03#\x0f\x05\r\x04\t\n\x13\x05\x0e\x03\t\f\t\x04\x04\f\x0f\b\n\x01\x11\x10\b\x01\t\x05\b\b\x03\x1c\n\x13\x1b\a\x1b\x06\x05\x01\v\n\r\x02\x0e\x06\x02\r\n\x01\x03\x06\x05\x05\b\x03\a \n\x04\x18\x11\x05\x04\x04\x01\x03\x04\x0e\x03.0\x06\x06\x05\x10\x02\"\b\x05\x0e\x06\a\x17\x14\x02\a\x02\x04\x0f\x0e\b\x10\x06\x92Y\a\x05\x04\x02\x03\n\t\x06\x01+\x13\x02\x03\r\x01\x10\x01\x03\a\a\a\x05\x01\x02\x03\x11\r\r!\x06\x02\x03\x12\f\x04\x04\f\b\x02\x17\x01\x01\x03\x01\x03\x19\x03\x01\x02\x04\x06\x02\x1a\x0f\x02\x03\x05\x02\x02\b\t\x06\x01\x03\n\x0e\x14\x02\x06\x10\b\t\x16\x06\x05\x06\x02\x02\r\f\x14\x03\x05\x1b\b\n\f\x11\x05\x0f\x1c\a$\x13\x02\x05\v\a\x02\x05\x1a\x05\x06\x01\x03\x14\b\x0e\x1f\x12\x05\x03\x02\x02\x04\t\x02\x06\x01\x01\x14\x02\x05\x16\x05\x03\r\x02\x01\x03\x02\x01\t\x06\x02\v\f\x13\a\x01\x04\x06\x06\a\"\a\r\x13\x05\x01\x06\x03\f\x04\x02\x05\x04\x04\x01\x01\x03\x03\x01\a+\x06\x0f\a\x05\x02\x05\x18\x03\x19\x05\x03\b\x03\a\x05\n\x02\v\b\a\b\x01\x01\x01\x01\x01\x0f\a\n\n\x01\x0e\x11\x04\x15\x06\a\x04\x01\b\a\x01\t\a\x05\x05\x05\t\f\b\a\x05\x1f\x03\a\x02\x03\x04\x16\x02\x11\x03\x03\x12\r\n\x10\x03\f\t\x03\x11\x02\x0f\x16\x11\xbdΑ\x03\x13\x03\x12\x06\x01\a\t\x10\x03\x02\n\x04\v\x06\a\x03\x03\x05\x06\x02\x01\x15\x0f\x05\f\t\v\x06\x05\x02\x01\a\x0e\x05\x03\x0f\t\x0e\x04\r\x02\x03\x06\x02\x02\x13\x02\x04\x03\a\x13\x1b\x02\x04\x10\x10\x01\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfe\xc5\x01\x11\x01\n\f\x01\a\b\x06\x06\b\x13\x02\x16\x01\x02\x05\x05\x16\x01\x10\r\x02\x06\a\x02\x04\x01\x03\t\x18\x03\x05\f\x04\x02\a\x06\x05\n\n\x02\x01\x01\x05\x01\x02\x02\x01\x05\x06\x04\x01\x04\x10\x06\x04\t\b\x02\x05\t\x04\x06\t\x13\x03\x06\x0e\x05\a\x11\r\b\x10\x04\b\x15\x06\x02\x04\x05\x03\x02\x02\x05\x16\x0f\x19\x05\b\t\r\r\t\x05\x01\x0e\x0f\x03\x06\x17\x02\r\n\x01\x0f\f\x04\x0f\x05\x18\x05\x06\x01\n\x01\x18\b\x01\x12\a\x02\x04\t\x04\x04\x01\x17\f\v\x01\x19\x01\x0f\b\x0e\x01\f\x0f\x04\x02\x05\a\t\a\x04\x04\x01\n\x04\x01\x05\x04\x02\x04\x14\x04\x05\x19\x04\t\x03\x01\x04\x02\a\b\f\x04\x02\x03\r\x02\x0f\x1a\x01\x02\x02\t\x01\x0e\a\x05\x10\t\x04\x03\x06\x06\f\x06\x03\x0e\b\x01\x01P\x8e\a\x01\x01\x10\x06\x06\b\v\x01\x1c\x11\x04\v\a\x02\x0e\x03\x05\x1b\x01 '\x04\x01\f-\x03\x03(\b\x01\x02\v\t\x06\x05#\x06\x06\x1c\t\x02\a\x0e\x06\x03\x0e\b\x02\x14*\x19\x04\x05\x15\x04\x03\x04\x04\x01\a\x15\x10\x16\x02\x06\x1b\x15\t\b$\x06\a\r\x06\n\x02\x02\x11\x03\x04\x05\x01\x02\"\x04\x13\b\x01\r\x12\v\x03\x06\x12\x06\x04\x05\b\x18\x02\x03\x1d\x0f!\x01\t\b\t\x06\a\x12\x04\b\x18\x03\t\x02\b\x01\t\x02\x01\x03\x1d\b\x04\x10\r\f\a\x01\x01\x13\x03\x0f\b\x03\x03\x02\x04\b*\x10\n!\x11\x10\x02\x0f\x03\x01\x01\x01\x04\x04\x01\x02\x03\x03\t\x06\v\r\x01\x11\x05\x1b\x12\x03\x04\x03\x02\a\x02\x03\x05\x0e\n(\x04\x03\x02\x11\v\a\b\t\t\b\x03\x12\x13\t\x01\x05\b\x04\x13\x10\t\x06\x04\x05\v\x03\x10\x02\f\n\b\b\a\a\x06\x02\b\x10\x04\x05\b\x01\v\x04\x02\r\v\t\x06\a\x02\x01\x01\x02\n\x06\x05\xfc\x82$\x99\x03\x03\x02\a\x01\a\f\x06\n\x02\x02\b\x03\x06\x02\x01\x01\x03\x03\x03\x01\x11\x05\x01\t\x05\x02\x06\x05\x14\x03\x05\x19\x06\x06\x03\x06\v\x02\t\x03\x04\x10\x03\x04\x05\x03\n2\r\x1f\x11\x19\x0f\x16\x04\a\x1b\b\x06\x00\x00\x03\x00\x15\xff\x15\x06~\x05\x80\x00\a\x00\x15\x00/\x00\x00$4&\"\x06\x14\x162\t\x01\x06#\"/\x01&547\x01\x1e\x01\x01\x14\a\x0e\x01#\"\x00\x10\x0032\x16\x17\x16\x14\a\x05\x15\x17>\x0232\x16\x01\x80&4&&4\x02\xaa\xfdV%54'j&&\x02\xa9'\x97\x02\xdc\x17/덹\xfe\xf9\x01\a\xb9:\u007f,\x10\x10\xfe\xdb\xc1\x05\x94{\t\x0f\x11&4&&4&\x01\xe4\xfdV%%l$65&\x02\xa9b\x97\x01\x8c'C\x86\xa7\x01\a\x01r\x01\a!\x1e\v\"\v\xa9\xe0k\x03[G\x14\x00\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x1b\x00+\x00;\x00\x00%!5!\x01!5!\x01!5!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x04\x00\x02\x80\xfd\x80\xfe\x80\x04\x00\xfc\x00\x02\x80\x01\x80\xfe\x80\x02\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\x80\x80\x01\x80\x80\x01\x80\x80\xfc@\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x01\x00\x05\xff\x80\x05{\x05\x00\x00\x15\x00\x00\x01\x16\a\x01\x11\x14\a\x06#\"'\x01&5\x11\x01&763!2\x05{\x11\x1f\xfe\x13'\r\f\x1b\x12\xff\x00\x13\xfe\x13\x1f\x11\x11*\x05\x00*\x04\xd9)\x1d\xfe\x13\xfd\x1a*\x11\x05\x13\x01\x00\x13\x1a\x01\xe6\x01\xed\x1d)'\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x06\x00\x00\x03\x00\x17\x00\x1b\x00/\x00\x00\x01!5!\x01\x11\x14\x06#!\"&5\x11!\x15\x14\x163!26=\x01#\x15!5\x01\x11!\x11463!5463!2\x16\x1d\x01!2\x16\x02\x80\x02\x00\xfe\x00\x04\x80^B\xfa@B^\x02\xa0&\x1a\x01@\x1a&`\xff\x00\x04\x00\xf9\x00^B\x01`8(\x02@(8\x01`B^\x05\x00\x80\xfd\x00\xfe B^^B\x01\xe0\xa0\x1a&&\x1a\xa0\x80\x80\x01\xe0\xfe\x80\x01\x80B^\xa0(88(\xa0^\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00\x00\t\x0276\x17\x16\x15\x11\x14\x06#!\"'&?\x01\t\x01\x17\x16\a\x06#!\"&5\x11476\x1f\x01\t\x01\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\t\x01'&763!2\x16\x15\x11\x14\a\x06#\"'\x05\x03\xfe\x9d\x01c\x90\x1d)'&\x1a\xfe@*\x11\x11\x1f\x90\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x13\x1a\f\f(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x1f\x11\x11*\x01\xc0\x1a&'\r\f\x1a\x13\x03\xe3\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x13\x05\x11*\x01\xc0\x1a&('\x1e\x90\xfe\x9d\x01c\x90\x1e'(&\x1a\xfe@*\x11\x05\x13\x00\x00\x06\x00\x00\xff\x00\a\x80\x06\x00\x00\x11\x001\x009\x00A\x00S\x00[\x00\x00\x01\x06\a#\"&5\x1032\x1e\x01327\x06\x15\x14\x01\x14\x06#!\"&54>\x0532\x1e\x022>\x0232\x1e\x05\x00\x14\x06\"&462\x00\x10\x06 &\x106 \x01\x14\x06+\x01&'654'\x1632>\x0132\x02\x14\x06\"&462\x02Q\xa2g\x86Rp|\x06Kx;CB\x05\x04\x80\x92y\xfc\x96y\x92\a\x15 6Fe=\nBP\x86\x88\x86PB\n=eF6 \x15\a\xfc\x00\x96Ԗ\x96\xd4\x03V\xe1\xfe\xc2\xe1\xe1\x01>\x03!pR\x86g\xa2Q\x05BC;xK\x06|\x80\x96Ԗ\x96\xd4\x02\x80\x05{QN\x01a*+\x17%\x1d\x8b\xfd\x0ex\x8b\x8bx5eud_C(+5++5+(C_due\x052Ԗ\x96Ԗ\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\xfd\x9fNQ{\x05u\x8b\x1d%\x17+*\x01jԖ\x96Ԗ\x00\x00\x00\x00\x03\x00\x10\xff\x90\x06p\x05\xf0\x00!\x00C\x00i\x00\x00\x014/\x01&#\"\a\x1e\x04\x15\x14\x06#\".\x03'\x06\x15\x14\x1f\x01\x1632?\x016\x014/\x01&#\"\x0f\x01\x06\x15\x14\x1f\x01\x16327.\x0454632\x1e\x03\x176\x00\x14\x0f\x01\x06#\"/\x01&547'\x06#\"/\x01&4?\x01632\x1f\x01\x16\x15\x14\a\x17632\x1f\x01\x05\xb0\x1c\xd0\x1c(*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x1c\xce\x1b)(\x1c\x93\x1c\xfdA\x1c\xce\x1c('\x1d\x93\x1c\x1c\xd0\x1b)*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x03\u007fU\x93SxyS\xceSXXVzxT\xd0TU\x93SxyS\xceSXXVzxT\xd0\x01@(\x1c\xd0\x1c \x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f*(\x1c\xcf\x1b\x1a\x92\x1c\x02\xe8(\x1c\xcf\x1c\x1b\x92\x1c'(\x1c\xd0\x1b\x1f\x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f\xfd\xe1\xf0S\x92SU\xcfSx{VXXT\xd0T\xf0S\x92SU\xcfSx{VXXT\xd0\x00\x01\x00\x00\x00\x00\a\x80\x05\x80\x00\x1b\x00\x00\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\a\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8et\x02\x01,Ԟ\x01\x01;F`j\x96)\x81\xa8\x01\x80\x9f\xe1\x01\a\xb9\x84\xdb6\x1c\x0f\xd4\x01,\xb0\x8e>\x96jK?\x1e\xd1\x00\x02\x00s\xff\x80\x06\r\x05\x80\x00\x17\x00!\x00\x00%\x16\x06#!\"&7\x01\x11#\"&463!2\x16\x14\x06+\x01\x11\x05\x01!\x01'5\x11#\x11\x15\x05\xf78Ej\xfb\x80jE8\x01\xf7@\x1a&&\x1a\x02\x00\x1a&&\x1a@\xfe\xec\xfe\xf0\x02\xc8\xfe\xf0\x14\x80XY\u007f\u007fY\x03\x19\x01\x8f&4&&4&\xfeqD\xfeS\x01\xad\x1f%\x01\x8f\xfeq%\x00\x00\x00\x00\a\x00\x01\xff\x80\a\x00\x05\x00\x00\a\x00N\x00\\\x00j\x00x\x00\x86\x00\x8c\x00\x00\x002\x16\x14\x06\"&4\x05\x01\x16\a\x06\x0f\x01\x06#\"'\x01\a\x06\a\x16\a\x0e\x01\a\x06#\"'&7>\x017632\x176?\x01'&'\x06#\"'.\x01'&67632\x17\x1e\x01\x17\x16\a\x16\x1f\x01\x01632\x1f\x01\x16\x17\x16\a\x056&'&#\"\a\x06\x16\x17\x1632\x03>\x01'&#\"\a\x0e\x01\x17\x1632\x01\x1754?\x01'\a\x0e\x01\a\x0e\x01\a\x1f\x01\x01'\x01\x15\a\x17\x16\x17\x1e\x01\x1f\x01\x017\x01\a\x06\a\x03\xa64&&4&\x01l\x01\xfb\x1c\x03\x05\x1e\x80\r\x10\x11\x0e\xfdNn\b\x04\x0e\x04\abS\x84\x91\x88VZ\v\abR\x84\x92SD\t\rzz\r\tDS\x92\x84Rb\a\x05)+U\x89\x91\x84Sb\a\x04\x0e\x04\bn\x02\xb2\x0e\x11\x10\r\x80\x1e\x05\x03\x1c\xfb\\.2Q\\dJ'.2Q\\dJ.Q2.'Jd\\Q2.'Jd\x01\x0e`!\x0eO\x1a\x03\x0e\x05\x02\x04\x01\xd7`\x02\xe0\x80\xfd\x00\xa0\t\x02\x05\x04\x0e\x04\x1a\x03`\x80\xfd\xf8\xb1\x02\v\x02\x80&4&&4\x1a\xfer\x14$#\x10@\a\b\x01\x83B\x04\x0110M\x8d5TNT{L\x8e5T\x1f\r\tII\t\r\x1fT5\x8eL;l'OT4\x8eM01\x01\x04B\x01\x83\b\a@\x10#$\x14\x8a*\x843;$*\x843;\xfd;3\x84*$;3\x84*$\x02\xa0:\v$\x14\b/\x1a\x03\x10\x04\x02\x03\x01\xe9 \x02@@\xfeQq`\b\x02\x04\x04\x10\x04\x1a\xfe\xc0@\x01\x98\x8a\x03\x04\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00\"\x00%\x003\x00<\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11!\"&5\x11467\x01>\x013!2\x16\x15\x1163\a\x01!\t\x01!\x13\x01\x11!\x11\x14\x06#!\x11!\x1146\x01\x11!\x11\x14\x06#!\x11\x06\xa0(88(\xfc@(8\xfd\xe0(8(\x1c\x01\x98\x1c`(\x01\xa0(8D<\x80\xfe\xd5\x01+\xfd\x80\xfe\xd5\x01+\xc4\x01<\xfe\x808(\xfe`\x02\x00(\x03\xd8\xfe\x808(\xfe`\x04\x808(\xfb@(88(\x01 8(\x02\xa0(`\x1c\x01\x98\x1c(8(\xfe\xb8(\xd5\xfe\xd5\x02\xab\xfe\xd5\xfe\xa4\x01<\x01\xa0\xfe`(8\xfd\x80\x01\x00(`\xfc\xf8\x04\x80\xfe`(8\xfd\x80\x00\x00\x00\x01\x00\x04\xff\x84\x05|\x05|\x00?\x00\x00%\x14\x06#\"'\x01&54632\x17\x01\x16\x15\x14\x06#\"'\x01&#\"\x06\x15\x14\x17\x01\x1632654'\x01&#\"\x06\x15\x14\x17\x01\x16\x15\x14\x06#\"'\x01&54632\x17\x01\x16\x05|\x9eu\x87d\xfc\xf7qܟ\x9es\x02]\n=\x10\r\n\xfd\xa2Ofj\x92L\x03\b?R@T?\xfd\xbb\x1a\"\x1d&\x19\x01\x9a\n>\x10\f\n\xfef?rRX=\x02Ed\x97u\x9ed\x03\bs\x9c\x9f\xdeq\xfd\xa2\n\f\x10=\n\x02_M\x96jiL\xfc\xf7?T@R?\x02E\x18&\x1d \x1b\xfef\n\f\x10>\n\x01\x9a=XRr?\xfd\xbbb\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00!\x001\x00E\x00\x00)\x01\x11!\x013\x114&'\x01.\x01#\x11\x14\x06#!\"&5\x11#\x113\x11463!2\x16\x15\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x05\x11\x14\x06#!\"&5\x11463!2\x16\x17\x01\x1e\x01\x01\x80\x03\x00\xfd\x00\x03\x80\x80\x14\n\xfe\xe7\n0\x0f8(\xfd\xc0(8\x80\x808(\x03@(8\xfe\x80\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x808(\xfa\xc0(88(\x03\xa0(`\x1c\x01\x18\x1c(\x01\x80\xfe\x80\x03\x80\x0e1\n\x01\x19\n\x14\xfe`(88(\x01\xa0\xfb\x00\x01\xa0(88(\x02\x00\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x13\xfc`(88(\x05@(8(\x1c\xfe\xe8\x1c`\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x04`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x05\x00\x00\x0f\x00\x1f\x00/\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x00\x06\x00\x00\xff\xc0\a\x00\x05@\x00\a\x00\x0f\x00\x1f\x00'\x007\x00G\x00\x00$\x14\x06\"&462\x12\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x00\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80p\xa0pp\xa0pp\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfa\x80p\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13Рpp\xa0p\x01\x90\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x03\xe3\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x06\x00\x0f\xff\x00\a\x00\x05\xf7\x00\x1e\x00<\x00L\x00\\\x00l\x00|\x00\x00\x05\x14\x06#\"'7\x1632654\a'>\x0275\"\x06#\x15#5!\x15\a\x1e\x01\x13\x15!&54>\x0354&#\"\a'>\x0132\x16\x15\x14\x0e\x02\a35\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15!5346=\x01#\x06\a'73\x11\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01}mQjB919\x1d+i\x1a\b1$\x13\x10A\x10j\x01M_3<\x02\xfe\x96\x06/BB/\x1d\x19.#U\x18_:IdDRE\x01\u007f\x05\xea\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\xfa\x80\xfe\xb1k\x01\x02\b*G\x88j\x05\xec\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13TP\\BX-\x1d\x1c@\b8\nC)\x12\x01\x025\x98Xs\fJ\x02@\x9f$\x123T4+,\x17\x19\x1b:;39SG2S.7\x19<\xfe\xc1\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x03vcc)\xa1)\f\x11%L\u007f\xfel\xfe}\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x005\x00e\x00\x00\x012\x16\x1d\x01\x14\x06#!\"&=\x01463%&'&5476!2\x17\x16\x17\x16\x17\x16\x15\x14\x0f\x01/\x01&'&#\"\a\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x03!\x16\x15\x14\a\x06\a\x06\a\x06\a\x06#\"/\x01&'&=\x014'&?\x0157\x1e\x02\x17\x16\x17\x16\x17\x1632767654'&\x06\xe0\x0e\x12\x12\x0e\xf9@\x0e\x12\x12\x0e\x01\xc3\x1c\x170\x86\x85\x01\x042uBo\n\v\x0e\x05\fT\x0e25XzrDCBB\xd5Eh:%\xec\x01\x9b\a)\x170%HPIP{rQ\x8c9\x0f\b\x02\x01\x01\x02f\x0f\x1e\x0f\x05#-+>;I@KM-/Q\"\x02\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12@#-bZ\xb5\x80\u007f\x13\f$&P{<\x12\x1b\x03\x06\x02\x958[;:XICC>\x14.\x1c\x18\xff\x00'5oe80#.0\x12\x15\x17(\x10\f\b\x0e\rl0\x1e&%,\x02\"J&\b9%$\x15\x16\x1b\x1a<=DTI\x1d\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00c\x00s\x00\x00\x13&/\x01632\x17\x163276727\a\x17\x15\x06#\"\a\x06\x15\x14\x16\x15\x17\x13\x16\x17\x16\x17\x16327676767654.\x01/\x01&'&\x0f\x01'73\x17\x167\x17\x16\x15\x14\a\x06\a\x06\a\x06\x15\x14\x16\x15\x16\x13\x16\a\x06\a\x06\a\x06\a\x06#\"'&'&'&5\x114'&\x0154&#!\"\x06\x1d\x01\x14\x163!260%\b\x03\r\x1b<4\x84\"VRt\x1e8\x1e\x01\x02<@<\x13\r\x01\x01\x0e\x06-#=XYhW8+0\x11$\x11\x15\a\x0f\x06\x04\x05\x13\"+d\x0e\x02T\xcdLx\x12\x06\x04-'I\x06\x0f\x03\b\x0e\x06\x15\x0f\x1a&JKkm\x92\xa7uw<=\x16\x10\x11\x19\x05V\x12\x0e\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x05!\x02\x02X\x01\x04\a\x03\x04\x01\x02\x0e@\t\t\x19\x0ev\r'\x06\xe5\xfe\xe8|N;!/\x1c\x12!$\x1c8:I\x9cOb\x93V;C\x15#\x01\x02\x03V\n\x03\r\x02&\r\a\x18\f\x01\v\x06\x0f\x1a\a(\v\x13\xfe\x87\xc3mL.A:9 !./KLwP\x9d\x01M\xbc\x19$\xfa\x82@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\n\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%54&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x80^B\xfa\xc0B^^B\x05@B^\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01N\xfb\xc0B^^B\x04@B^^\x00\x00\x00\x06\x00\x1b\xff\x9b\x06\x80\x06\x00\x00\x03\x00\x13\x00\x1b\x00#\x00+\x003\x00\x00\t\x01'\x01$\x14\a\x01\x06\"/\x01&47\x0162\x1f\x01%\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x04\xa6\x01%k\xfe\xdb\x02*\x12\xfa\xfa\x126\x12\xc6\x12\x12\x05\x06\x126\x12\xc6\xfa\xcbbb\x1e\x1ebb\x1e\x01|\xc4\xc4<<\xc4\xc4<\x03\xdebb\x1e\x1ebb\x1e\xfd\x9ebb\x1e\x1ebb\x1e\x03\xbb\x01%k\xfe\xdb\xd56\x12\xfa\xfa\x12\x12\xc6\x126\x12\x05\x06\x12\x12Ƒ\x1e\x1ebb\x1e\x1eb\xfe\xfc<<\xc4\xc4<<\xc4\xfd^\x1e\x1ebb\x1e\x1eb\x02\x1e\x1e\x1ebb\x1e\x1eb\x00\x00\x00\x04\x00@\xff\x80\a\x00\x05\x00\x00\a\x00\x10\x00\x18\x00M\x00\x00$4&\"\x06\x14\x162\x01!\x11#\"\x0f\x01\x06\x15\x004&\"\x06\x14\x162\x01\x11\x14\x0e\x04&#\x14\x06\"&5!\x14\x06\"&5#\"\x06.\x045463\x114&>\x03?\x01>\x01;\x015463!2\x16\x02\x80LhLLh\xfe\xcc\x01\x80\x9e\r\t\xc3\t\x05\x00LhLLh\x01L\b\x13\x0e!\f'\x03\x96Ԗ\xfe\x80\x96Ԗ@\x03'\f!\x0e\x13\b&\x1a\x01\x01\x04\t\x13\r\xc6\x13?\x1b\xa0&\x1a\x04\x00\x1a&LhLLhL\x02\x80\x01\x00\t\xc3\t\r\xfd\xaehLLhL\x04\xc0\xfc\x00\x0f\x17\x0e\t\x03\x01\x01j\x96\x96jj\x96\x96j\x01\x01\x03\t\x0e\x17\x0f\x1a&\x01@\b6\x16/\x1b\"\r\xc6\x13\x1a\xc0\x1a&&\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00J\x00\x00\x00\x10\x02\x04#\"'6767\x1e\x0132>\x0154.\x01#\"\x0e\x03\x15\x14\x16\x17\x167>\x0176'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17&\x0254\x12$ \x04\x06\x00\xce\xfe\x9f\xd1ok;\x13\t-\x14j=y\xbehw\xe2\x8ei\xb6\u007f[+PM\x1e\b\x02\f\x02\x06\x113ѩ\x97\xa9\x89k=J\x0e\b%\x1762>V\x19c\x11\x04\xce\xfe\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce ]G\"\xb1'9\x89\xf0\x96r\xc8~:`}\x86Ch\x9e \f \a0\x06\x17\x14=Z\x97٤\x83\xaa\xeeW=#uY\x1f2BrUI1\xfe^Fk[\x01|\xe9\xd1\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00L\x00\x00\x012\x16\x15\x11\x14\x06#!6767\x1e\x0132\x1254.\x02#\"\x0e\x03\x15\x14\x16\x17\x1667676'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17#\"&5\x11463\x04\xe0w\xa9\xa9w\xfd+U\x17\t,\x15i<\xb5\xe5F{\xb6jh\xb5}Z+OM\r\x15\x04\n\x05\x06\x112ϧ\x95\xa7\x87jX\x96բ\x81\xa8\xecW<\"uW\x1f1AqSH1\xfebd\x9a\xa9w\x03\xc0w\xa9\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1b\x00'\x007\x00\x00\x014'!\x153\x0e\x03#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x95\x06\xfe\x96\xd9\x03\x1b0U6c\x8c\x8cc\\=hl\x95\xa0\xe0ࠥ\xcb\x01Ymmnnnn\x01\x12\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02w\x1a&\x84\x1846#\x8eȎ;ed\xe1\xfe\xc2\xe1\xd2wnnnnn\x02\x85\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x02\x00\x00\xff\xa3\t\x00\x05]\x00#\x00/\x00\x00\x01\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x14\x1e\x0132>\x037!5!\x16%\x15#\x15#5#5353\x15\x05\x9d\xae\xfe\xbeЕ\xfe\xf0\xc4tt\xc4\x01\x10\x95\x01\x1e\xcd\xc7u\xaf{\xd1zz\xd1{S\x8bZC\x1f\x06\xfe`\x02\xb4\f\x03c\xd1\xd2\xd1\xd1\xd2\x02o\xd0\xfe\xbb\xb7t\xc4\x01\x10\x01*\x01\x10\xc4t\xc0\xbfq|\xd5\xfc\xd5|.EXN#\xfc??\xd2\xd1\xd1\xd2\xd1\xd1\x00\x00\x00\x04\x00\x00\x00\x00\a\x80\x05\x00\x00\f\x00\x1c\x00,\x00<\x00\x00\x01!5#\x11#\a\x17673\x11#$\x14\x0e\x02\".\x024>\x022\x1e\x01\x01\x11\"&5!\x14\x06#\x112\x16\x15!46\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x00\x01\x80\x80r\x94M*\r\x02\x80\x02\x00*M~\x96~M**M~\x96~M\x02*j\x96\xfb\x80\x96jj\x96\x04\x80\x96\xea&\x1a\xf9\x00\x1a&&\x1a\a\x00\x1a&\x01\x80`\x01\xc0\x89P%\x14\xfe\xe0挐|NN|\x90\x8c\x90|NN|\xfe*\x02\x00\x96jj\x96\xfe\x00\x96jj\x96\x03@\xfb\x80\x1a&&\x1a\x04\x80\x1a&&\x00\x00\x01\x00\x00\x01@\x04\x00\x03\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x03Z4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x01\x00\x04\x00\x03@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00@\x00\x80\x02\x80\x04\x80\x00\r\x00\x00\x01\x11\x14\x06\"'\x01&47\x0162\x16\x02\x80&4\x13\xfe@\x13\x13\x01\xc0\x134&\x04@\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x13&\x00\x00\x00\x01\x00\x00\x00\x80\x02@\x04\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"&5\x11462\x17\x01\x02@\x13\xfe@\x134&&4\x13\x01\xc0\x02\x9a4\x13\xfe@\x13&\x1a\x03\x80\x1a&\x13\xfe@\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00\x1d\x00\x003!\x11!\x11\x14\x16%\x11!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\xa0\x02`\xfd\x80\x13\x05m\xfd\x80\x02`\r\x13\x80^B\xfa\xc0B^^B\x05@B^\x04\x80\xfb\xa0\r\x13 \x04`\xfb\x80\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\xc0\x04\x00\x05@\x00\r\x00\x1b\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x12\x14\x06#!\"&47\x0162\x17\x01\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a&&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00\x00\xff\xc0\x04\x00\x02\x00\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x03\x00\x04\x00\x05@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x03Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00:\x00\x00\x01\x11\x14\x06#!\"&5\x11\x16\x17\x04\x17\x1e\x02;\x022>\x0176%6\x13\x14\x06\a\x00\a\x0e\x04+\x02\".\x03'&$'.\x015463!2\x16\a\x00^B\xfa@B^,9\x01j\x879Gv3\x01\x013vG9\xaa\x01H9+bI\xfe\x88\\\nA+=6\x17\x01\x01\x176=+A\n[\xfe\xaa\">nSM\x05\xc0A_\x03:\xfc\xe6B^^B\x03\x1a1&\xf6c*/11/*{\xde'\x01VO\x903\xfe\xfb@\a/\x1d$\x12\x12$\x1d/\a@\xed\x18*\x93?Nh^\x00\x03\x00\x00\xff\xb0\x06\x00\x05l\x00\x03\x00\x0f\x00+\x00\x00\x01\x11!\x11\x01\x16\x06+\x01\"&5462\x16\x01\x11!\x114&#\"\x06\a\x06\x15\x11!\x12\x10/\x01!\x15#>\x0332\x16\x01]\xfe\xb6\x01_\x01gT\x02Rdg\xa6d\x04\x8f\xfe\xb7QV?U\x15\v\xfe\xb7\x02\x01\x01\x01I\x02\x14*Gg?\xab\xd0\x03\x8f\xfc!\x03\xdf\x012IbbIJaa\xfc\xdd\xfd\xc8\x02\x12iwE3\x1e3\xfd\xd7\x01\x8f\x01\xf000\x90 08\x1f\xe3\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eoz\xce\x00\x01\x00(\xff\x15\x06\xeb\x05\xd8\x00q\x00\x00!\x14\x0f\x01\x06#\"'\x01&547\x01\a\x06\"'\x1e\x06\x15\x14\a\x0e\x05#\"'\x01&54>\x047632\x1e\x05\x17&47\x0162\x17.\x06547>\x0532\x17\x01\x16\x15\x14\x0e\x04\a\x06#\".\x05'\x16\x14\x0f\x01\x01632\x17\x01\x16\x06\xeb%k'45%\xfe\x95&+\xff\x00~\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\xfeh\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e\x01\\\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\x01\x98\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e~\x01\x00+54'\x01k%5%l%%\x01l$65+\x01\x00~\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\x01\x98\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e\x01\\\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\xfeh\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e~\xff\x00+%\xfe\x95'\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x00\x00\a\x00\x0f\x00!\x00)\x001\x009\x00K\x00\x00\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x136.\x01\x06\a\x03\x0e\x01\a\x06\x1e\x01676&$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x044&\"\x06\x14\x162\x01\x10\a\x06#!\"'&\x114\x126$ \x04\x16\x12\x01\x80KjKKj\x01\vKjKKj\x01\xf7e\x06\x1b2.\ae<^\x10\x14P\x9a\x8a\x14\x10,\x02bKjKKj\xfd\xcbKjKKj\x02\vKjKKj\x01\x8b\x8d\x13#\xfa\x86#\x13\x8d\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x01KjKKjK\x02\vjKKjK\xfe\x9f\x01~\x1a-\x0e\x1b\x1a\xfe\x82\x05M\x027>\x057&\x0254\x12$ \x04\x04L\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\xf0\x01\x9c\x01\xe8\x01\x9c\x04\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xc7\xfe\xa4\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\xae\x01'\xab\xab\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x14\x00:\x00d\x00\x00\x00 \x04\x06\x15\x14\x16\x1f\x01\a6?\x01\x17\x1632$64&$ \x04\x16\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546\x01\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x15\x14\x06\x03Y\xfe\xce\xfe\xf6\x9dj`a#\"\x1c,5NK\x99\x01\n\x9d\x9d\xfd\x9e\x01~\x01E\xbc\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x05:\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x8e\x04\x80h\xb2fR\x9888T\x14\x13\x1f\n\x0eh\xb2̲\xe8\x89\xec\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b\xec\xfb\xf8\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6{x\xd1\x00\x01\x00\x01\xff\x00\x03|\x05\x80\x00!\x00\x00\x01\x16\a\x01\x06#\"'.\x017\x13\x05\x06#\"'&7\x13>\x013!2\x16\x15\x14\a\x03%632\x03u\x12\v\xfd\xe4\r\x1d\x04\n\x11\x11\x04\xc5\xfej\x04\b\x12\r\x12\x05\xc9\x04\x18\x10\x01H\x13\x1a\x05\xab\x01\x8c\b\x04\x13\x03\xca\x14\x18\xfb{\x19\x02\x05\x1c\x10\x03(e\x01\v\x0f\x18\x039\x0e\x12\x19\x11\b\n\xfe1b\x02\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00U\x00\x00\x01\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015463!5#\"&5\x11463!2\x16\x15\x11\x14\x06+\x01\x15!2\x16\x1d\x0132\x16\a\x008(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`L4\x02\x00`(88(\x01@(88(`\x02\x004L`(8\x01 \xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc04L\xc08(\x01@(88(\xfe\xc0(8\xc0L4\xc08\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\xc0\x00\x13\x00O\x00Y\x00\x00\x01\x11\x14\x06\"&5462\x16\x15\x14\x16265\x1162\x05\x14\x06#\"'.\x01#\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01#\"\x06\a\x06#\"&5476\x00$32\x04\x1e\x01\x17\x16\x01\x15&\"\a5462\x16\x03\x80\x98И&4&NdN!>\x03!\x13\r\v\f1X:Dx+\a\x15\x04\v\x11\x12\v\x04\x15\a+w\x88w+\a\x15\x04\v\x12\x11\v\x04\x15\a+xD:X1\f\v\r\x13\x01-\x00\xff\x01U\xbe\x8c\x01\r\xe0\xa5!\x01\xfd\x00*,*&4&\x02\xc4\xfd\xbch\x98\x98h\x1a&&\x1a2NN2\x02D\v&\r\x13\n..J<\n$\x06\x11\x11\x06$\n\x01767\x14\a\x0e\x02\a\x16\x15\x14\a\x16\x15\x14\a\x16\x15\x14\x06#\x0e\x01\"&'\"&547&547&547.\x02'&54>\x022\x1e\x02\x02\xe0\x13\x1a\x13l4\r\x13\x13\r2cK\xa0Eo\x87\x8a\x87oED\n)\n\x80\r\xe4\r\x80\n)\nD\x80g-;<\x04/\x19\x19-\r?.\x14P^P\x14.?\r-\x19\x19/\x04<;-gY\x91\xb7\xbe\xb7\x91Y\x03\xc0\r\x13\x13\r.2\x13\x1a\x13 L4H|O--O|HeO\v,\v\x99\x91\x91\x99\v,\vOe\x9bq1Ls2\x1c6%\x1b\x1b%4\x1d\x17\x18.2,44,2.\x18\x17\x1d4%\x1b\x1b%6\x1c2sL1q\x9bc\xabqAAq\xab\x00\x02\x00\x00\xff\xa0\a\x00\x04\xe0\x00\x1a\x004\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&547\x01632\x16\x1d\x01!2\x16\x10\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\a\x00\x13\r\xfa\xa0\x13\r\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x05`\r\x13\t\xfe\xc0\t\x0e\r\x13\xfa\xa0\r\x13\x13\r\x05`\x12\x0e\f\f\x01?\x01`\xc0\r\x13\xc0\r\x13\n\x01@\t\r\x0e\t\x01@\t\x13\r\xc0\x13\x02!\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014&+\x01\x114&+\x01\"\x06\x15\x11#\"\x06\x15\x14\x17\x01\x1627\x016\x05\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\t\x01`\t\x1c\t\x01_\n\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02`\x0e\x12\x01`\r\x13\x13\r\xfe\xa0\x13\r\x0e\t\xfe\xa0\t\t\x01_\fԟ\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014'\x01&\"\a\x01\x06\x15\x14\x16;\x01\x11\x14\x16;\x01265\x11326\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\t\xfe\xa0\t\x1c\t\xfe\xa1\n\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02\xa0\x0e\t\x01`\t\t\xfe\xa1\f\f\x0e\x12\xfe\xa0\r\x13\x13\r\x01`\x13\xfe\xed\x9f\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x00\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00X\x00`\x00\x00$\x14\x06\"&462\x05\x14\x06#!\"&54>\x037\x06\x1d\x01\x0e\x01\x15\x14\x162654&'547\x16 7\x16\x1d\x01\"\x06\x1d\x01\x06\x15\x14\x162654'5462\x16\x1d\x01\x06\x15\x14\x162654'54&'46.\x02'\x1e\x04\x00\x10\x06 &\x106 \x01\x80&4&&4\x04&\x92y\xfc\x96y\x92\v%:hD\x16:Fp\xa0pG9\x19\x84\x01F\x84\x19j\x96 8P8 LhL 8P8 E;\x01\x01\x04\n\bDh:%\v\xfe\xc0\xe1\xfe\xc2\xe1\xe1\x01>\xda4&&4&}y\x8a\x8ayD~\x96s[\x0f4D\xcb\x14d=PppP=d\x14\xcb>\x1fhh\x1f>@\x96jY\x1d*(88(*\x1dY4LL4Y\x1d*(88(*\x1dYDw\"\nA\x1f4*\x13\x0f[s\x96~\x03\xd8\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x02\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00M\x00\x00\x004&\"\x06\x14\x1627\x14\x06\a\x11\x14\x04 $=\x01.\x015\x114632\x17>\x0132\x16\x14\x06#\"'\x11\x14\x16 65\x11\x06#\"&4632\x16\x17632\x16\x15\x11\x14\x06\a\x15\x14\x16 65\x11.\x015462\x16\x05\x00&4&&4\xa6G9\xfe\xf9\xfe\x8e\xfe\xf9\xa4\xdc&\x1a\x06\n\x11<#5KK5!\x1f\xbc\x01\b\xbc\x1f!5KK5#<\x11\n\x06\x1a&ܤ\xbc\x01\b\xbc9Gp\xa0p\x03&4&&4&@>b\x15\xfeu\x9f\xe1ោ\x14ؐ\x02\x00\x1a&\x02\x1e$KjK\x12\xfenj\x96\x96j\x01\x92\x12KjK$\x1e\x02&\x1a\xfe\x00\x90\xd8\x14\x84j\x96\x96j\x01\x8b\x15b>Ppp\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\r\x00\x1b\x00%\x00\x00\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x02\x80\x02\x00\xfe\x00\xfe\xa0@\\\x84\x84\\\x04\xa0\xfc\x00\x808(\x02@(8\x02\x00\x84\\@@\\\x84\x04\x80\x80\x80\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x02\x00@\xff\x00\x06\xc0\x06\x00\x00\v\x003\x00\x00\x044#\"&54\"\x15\x14\x163\x01\x14\x06#!\x14\x06\"&5!\"&5>\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\x03@L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x0104Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x03\x00\x00\xff\x80\a@\x05\x00\x00\a\x00\x0f\x00\"\x00\x00\x004&+\x01\x1132\x01!\x14\x06#!\"&\x00\x10\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x06\x80pP@@P\xf9\xf0\a\x00\x96j\xfb\x00j\x96\a@\xe1\x9f@\x84\\\xfd@\\\x84&\x1a\x04\x80\x9f\x030\xa0p\xfe\x80\xfd\xc0j\x96\x96\x04\t\xfe\xc2\xe1 \\\x84\x84\\\x02\xe0\x1a&\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00-\x00B\x00\x00\x01\x11\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015\x11462\x16\x15\x11\x14\x16265\x11462\x16\x15\x11\x14\x16265\x11462\x16\x05\x11\x14\x06+\x01\"&5\x11#\"&5\x11463!2\x16\x02\x80G9L4\x804L9G&4&&4&&4&&4&&4&\x03\x00L4\x804L\xe0\r\x13\xbc\x84\x01\x00\x1a&\x05\xc0\xfd\x80=d\x14\xfc\xf54LL4\x03\v\x14d=\x02\x80\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xf9\xc04LL4\x02\x00\x13\r\x03 \x84\xbc&\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01463!2\x16\x1d\x01\x14\x06#!\"&5\x052\x16\x1d\x01\x14\x06#!\"&=\x01463\x012\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\x00\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x02\xe0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03`\x0e\x12\x12\x0e@\x0e\x12\x12\x0e\xa0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xff\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01-\x01=\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x11!5463!2\x16\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xfb\x80\x01\x80\x13\r\x01@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfa\x93\x06\x00\xfa\x00\xe0\r\x13\x13\r\x05`\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x00\r\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xb7\x00\xdb\x00\xf5\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x15\x14\x06#!\"&=\x01!\x11!5463!2\x16\x15\x19\x014&+\x01\"\x06\x1d\x01#54&+\x01\"\x06\x15\x11\x14\x16;\x0126=\x013\x15\x14\x16;\x0126%\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x15\x11!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xff\x008(\xfe@(8\xff\x00\x01\x80\x13\r\x01@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x01@8(\x01\xc0(8\x01@\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfc\x93\x04\x80 (88( \xfb\x80\xe0\r\x13\x13\r\x03\xc0\x01@\r\x13\x13\r``\r\x13\x13\r\xfe\xc0\r\x13\x13\r``\r\x13\x13-\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01 (88(\xfe\xe0&\x00\x05\x00@\xff\x80\a\x80\x05\x80\x00\a\x00\x10\x00\x18\x00<\x00c\x00\x00$4&\"\x06\x14\x162\x01!\x11#\x06\x0f\x01\x06\a\x004&\"\x06\x14\x162\x1354&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01\x11\x14\x06+\x01\x14\x06\"&5!\x14\x06\"&5#\"&463\x1146?\x01>\x01;\x01\x11463!2\x16\x02\x80KjKKj\xfe\xcb\x01\x80\x9e\x0e\b\xc3\a\x02\x05\x00KjKKj\xcb\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x01\x00&\x1a\xc0\x96Ԗ\xfe\x80\x96Ԗ\x80\x1a&&\x1a\x1a\x13\xc6\x13@\x1a\xa0&\x1a\x04\x80\x1a&KjKKjK\x02\x80\x01\x00\x02\a\xc3\f\n\xfd\xadjKKjK\x03 \xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02.\xfb\x80\x1a&j\x96\x96jj\x96\x96j&4&\x01\xa0\x1a@\x13\xc6\x13\x1a\x01@\x1a&&\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x001\x00?\x00I\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x05\x00\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\xfd\x80\x02\x00\xfe\x00\xfe\x80 \\\x84\x84\\\x04\xc0\xfb\xc0\xa08(\x02@(8\x02\x00\x84\\ \\\x84\x01\xa0\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02\ue000\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x00\x00\x00\x01\x00\x00\x00\x00\a\x80\x04\x80\x00:\x00\x00\x01\x06\r\x01\a#\x0132\x16\x14\x06+\x0353\x11#\a#'53535'575#5#573\x173\x11#5;\x022\x16\x14\x06+\x01\x013\x17\x05\x1e\x01\x17\a\x80\x01\xfe\xe1\xfe\xa0\xe0@\xfe\xdbE\x1a&&\x1a`\xa0@@\xa0\xc0` \x80\xc0\xc0\x80 `\xc0\xa0@@\xa0`\x1a&&\x1aE\x01%@\xe0\x01`\x80\x90\b\x02@ @ @\xfe\xa0\t\x0e\t \x01\xa0\xe0 \xc0 \b\x18\x80\x18\b \xc0 \xe0\x01\xa0 \t\x0e\t\xfe\xa0@ \x1c0\n\x00\x00\x00\x02\x00@\x00\x00\x06\x80\x05\x80\x00\x06\x00\x18\x00\x00\x01\x11!\x11\x14\x163\x01\x15!57#\"&5\x11'7!7!\x17\a\x11\x02\x80\xff\x00K5\x04\x80\xfb\x80\x80\x80\x9f\xe1@ \x01\xe0 \x03\xc0 @\x02\x80\x01\x80\xff\x005K\xfe@\xc0\xc0\xc0\xe1\x9f\x01@@\x80\x80\xc0 \xfc\xe0\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00%\x114&+\x01\"\x06\x15\x11!\x114&+\x01\"\x06\x15\x11\x14\x16;\x01265\x11!\x11\x14\x16;\x0126\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\x80\x1a&\xfe\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x02\x00&\x1a\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xc0\x03\x80\x1a&&\x1a\xfe\xc0\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfe\xc0\x1a&&\x03\xba\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x1a\x80\x1a&\x01@\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&\x01@\x1a&&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00-\x00M\x03\xf3\x043\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x04\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x02s\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\x01\x8a\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\xad\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\x00\x00\x00\x02\x00\r\x00M\x03\xd3\x043\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x04\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x01\x8a\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x02\x00M\x00\x8d\x043\x04S\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x12\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\xed\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x01v\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x02\x00M\x00\xad\x043\x04s\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x12\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x02\xad\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x01v\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x01\x00-\x00M\x02s\x043\x00\x14\x00\x00\x00\x14\a\t\x01\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x02s\n\xfew\x01\x89\n\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\x03\xed\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\x00\x00\x00\x01\x00\r\x00M\x02S\x043\x00\x14\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x00\x01\x00M\x01\r\x043\x03S\x00\x14\x00\x00\x00\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\x01m\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x01\x00M\x01-\x043\x03s\x00\x14\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x03-\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x06\x00\x00\x0f\x00/\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x14\x1e\x01\x15\x14\x06#!\"&54>\x015!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd\xe0 &\x1a\xfe\x00\x1a& \xfd\xe0B^^B\x06@B^\x02 \x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x03M\xfb\xc0B^%Q=\r\x1a&&\x1a\x0e\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x94\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x04\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x05\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x03\x00pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x03\x80pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x02@\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8p\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x05\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x03\x00Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x03\x80Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x04\xc0\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80PppP\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80Ppp\x00\x00\x00\x00\b\x00@\xff@\x06\xc0\x06\x00\x00\t\x00\x11\x00\x19\x00#\x00+\x003\x00;\x00G\x00\x00$\x14\x06#\"&5462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&462\x16\x00\x14\x06\"&462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&54632\x16\x02\x0eK54LKj\x02=KjKKj\xfd\x8bKjKKj\x04\xfdL45KKjK\xfc<^\x84^^\x84\x04\xf0KjKKj\xfd\xcbp\xa0pp\xa0\x02\x82\x84\\]\x83\x83]\\\x84\xc3jKL45K\xfe\xe7jKKjK\x02ujKKjK\xfd\x8e4LKjKK\x03\xf1\x84^^\x84^\xfd\xa3jKKjK\x02\x90\xa0pp\xa0p\xfer]\x83\x83]\\\x84\x84\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x00\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x06\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x01\x14\x03\x0e\x02\a\x06#\"&5465654.\x05+\x01\x11\x14\x06\"'\x01&47\x0162\x16\x15\x113 \x13\x16\a\x00\u007f\x03\x0f\f\a\f\x10\x0f\x11\x05\x05#>bq\x99\x9bb\xe0&4\x13\xfe\x00\x13\x13\x02\x00\x134&\xe0\x02ɢ5\x01\xa0\xa6\xfe\xe3\a\"\x1a\t\x11\x14\x0f\t#\x06D7e\xa0uU6\x1f\f\xff\x00\x1a&\x13\x02\x00\x134\x13\x02\x00\x13&\x1a\xff\x00\xfem\x86\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\v\x00\x17\x001\x00X\x00\x00\x00\x14\x0e\x01\".\x014>\x012\x16\x04\x14\x0e\x01\".\x014>\x012\x16\x174&#\"\a\x06\"'&#\"\x06\x15\x14\x1e\x03;\x012>\x03\x13\x14\a\x0e\x04#\".\x04'&547&5472\x16\x17632\x17>\x013\x16\x15\x14\a\x16\x02\x80\x19=T=\x19\x19=T=\x02\x99\x19=T=\x19\x19=T=\xb9\x8av)\x9aG\xacG\x98+v\x8a@b\x92\x86R\xa8R\x86\x92b@\xe0=&\x87\x93\xc1\x96\\N\x80\xa7\x8a\x88j!>\x88\x1b3l\xa4k\x93\xa2\x94\x84i\xa4k3\x1b\x88\x01hPTDDTPTDDTPTDDTPTDD|x\xa8\x15\v\v\x15\xa8xX\x83K-\x0e\x0e-K\x83\x01\b\xcf|Mp<#\t\x06\x13)>dA{\xd0\xed\x9fRXtfOT# RNftWQ\xa0\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00\x17\x00,\x00\x00%\x114&#!\"&=\x014&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x008(\xfd@(88(\xfe\xc0(88(\x04\xc0(8\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\xe0\x02\xc0(88(@(88(\xfc@(88\x02\xe8\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x03\x00\x00\x00\x00\au\x05\x80\x00\x11\x00'\x00E\x00\x00\x014#!\"\x06\a\x01\x06\x15\x143!267\x016%!54&#!\"&=\x014&#!\"\x06\x15\x11\x01>\x01\x05\x14\a\x01\x0e\x01#!\"&5\x11463!2\x16\x1d\x01!2\x16\x1d\x0132\x16\x17\x16\x06\xf55\xfb\xc0([\x1a\xfe\xda\x125\x04@(\\\x19\x01&\x12\xfb\x8b\x03\x008(\xfd\xc0(88(\xfe\xc0(8\x01\x00,\x90\x059.\xfe\xd9+\x92C\xfb\xc0\\\x84\x84\\\x01@\\\x84\x02 \\\x84\xc06Z\x16\x0f\x02]#+\x1f\xfe\x95\x18\x10#,\x1f\x01k\x16\xb4\xa0(88(@(88(\xfc\xab\x01;5E\xa3>:\xfe\x955E\x84\\\x03\xc0\\\x84\x84\\ \x84\\\xa01. \x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x0e\x01\"&'&676\x16\x17\x1e\x01267>\x01\x1e\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n%\xca\xfe\xca%\b\x18\x1a\x19/\b\x19\x87\xa8\x87\x19\b02\x18\xfe\nKjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcdy\x94\x94y\x19/\b\b\x18\x1aPccP\x1a\x18\x10/\x01\xcfjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x16\x0e\x01&'.\x01\"\x06\a\x0e\x01'.\x017>\x012\x16\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n\b\x1820\b\x19\x87\xa8\x87\x19\b/\x19\x1a\x18\b%\xca\xfe\xca\xfe7KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x013\x19/\x10\x18\x1aPccP\x1a\x18\b\b/\x19y\x94\x94\x02\tjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x13\x00\x1b\x00+\x007\x00\x00\x00\x14\x06#!\"&463!2\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a\xfe&KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xda4&&4&\x01\xb5jKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\x00\x00\a\x80\x04\x00\x00#\x00+\x003\x00C\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x044&\"\x06\x14\x162\x004&\"\x06\x14\x162$\x10\x00#\"'#\x06#\"\x00\x10\x003!2\x03@\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x02@KjKKj\x01KKjKKj\x01K\xfe\xd4\xd4\xc0\x92ܒ\xc0\xd4\xfe\xd4\x01,\xd4\x03\x80\xd4\x01\xc0\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12gjKKjK\x01KjKKjK\xd4\xfeX\xfeԀ\x80\x01,\x01\xa8\x01,\x00\x00\x00\x0f\x00\x00\x00\x00\a\x80\x04\x80\x00\v\x00\x17\x00#\x00/\x00;\x00G\x00S\x00_\x00k\x00w\x00\x83\x00\x8f\x00\x9f\x00\xa3\x00\xb3\x00\x00\x01\x15\x14+\x01\"=\x014;\x0127\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14#!\"=\x0143!2%\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x05\x15\x14+\x01\"=\x014;\x012\x05\x11\x14+\x01\"=\x014;\x0154;\x012\x13\x11!\x11\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x10`\x10\x10`\x10\x80\x10\xe0\x10\x10\xe0\x10\x80\x10`\x10\x10`\x10\x04\x00\x10\xfc\xa0\x10\x10\x03`\x10\xfd\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\xfe\x00\x10`\x10\x10`\x10\x01\x00\x10`\x10\x10`\x10\x01\x00\x10\xe0\x10\x10p\x10`\x10\x80\xf9\x80\a\x00K5\xf9\x805KK5\x06\x805K\x01p`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfd\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\x01\xf0`\x10\x10`\x10\x10`\x10\x10`\x10\x10\xfe\xa0\x10\x10`\x10\xf0\x10\xfd\x00\x03\x80\xfc\x80\x03\x80\xfc\x805KK5\x03\x805KK\x00\x00\x00\x00\x03\x00@\xff\x80\a\x00\x05\x80\x00\x16\x00*\x00V\x00\x00\x01\x11\x06#\"'.\x01#\"\a\x11632\x1e\x02\x1f\x01\x1632\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x06\x80\xa9\x89R?d\xa8^\xad\xe6\xf5\xbc7ac77\x1c,9x\xfbm#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x01\xeb\x02h[ 17\u007f\xfd\xa9q\x0f%\x19\x1b\x0e\x16\x03q#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x00\x06\x00@\xff\x80\a\x00\x05\x80\x00\x05\x00\v\x00*\x002\x00F\x00r\x00\x00\x015\x06\a\x156\x135\x06\a\x156\x015\x06'5&'.\t#\"\a\x1532\x16\x17\x16\x17\x15\x1632\x135\x06#\"'\x15\x16\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x03@\xb5\xcbͳ\xac\xd4\xd7\x03\xe9\xeb\x95\x14\x13\x058\r2\x13.\x1a,#,\x16\x17\x1a\x13f\xb5k\x13\x14*1x\xad\xa9\x89-!\x94\xfb\xac#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x02\x18\xc0\x10e\xb9`\x01\xb0\xc5\bv\xbdo\xfe8\xb8t-\xe0\x06\t\x03\x1c\x06\x18\a\x13\x06\v\x04\x04\x03\xde:5\t\x06\xbc\x11\x02\a\xbd[\b\xc4*\x01\xee#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x02\x00\r\x00\x00\x06\x80\x043\x00\x14\x00$\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x01\x15\x14\x06#!\"&=\x01463!2\x16\x02I\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x04-\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x02)\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\xfe-@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x00\x03\x00-\xff\x93\aS\x04\xed\x00\x14\x00$\x009\x00\x00%\a\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x16\x14\t\x01\x0e\x01/\x01.\x017\x01>\x01\x1f\x01\x1e\x01\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x02i2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\x02E\xfe\x8b\x04\x17\f>\r\r\x04\x01u\x04\x17\f>\r\r\x02\x8d\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x892\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\x04!\xfa\xf5\r\r\x04\x11\x04\x17\r\x05\v\r\r\x04\x11\x04\x17\xfdh\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\xbb\x00\x15\x00;\x00\x00\x01\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x1d\x01\x01\x06\x14\x17\x01\x14\x0e\x03\a\x06#\"'&7\x12'.\x01'\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x15\x11\x04\x17\x16\x02\x80'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\xfes\x13\x13\x06\r\"+5\x1c\x06\b\x14\x06\x03\x19\x02+\x95@ա'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\x01\x9b\xbc\xa9\x01\xc6F*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*E\xfer\x134\x13\xfeM:\x97}}8\f\x11\x01\b\x1a\x01\x90\xa5GO\r\xfb*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*\xfe\xfa\x1c\xc1\xad\x00\x00\x00\x00\x02\x00\x02\xff\xad\x06~\x05\xe0\x00\n\x00(\x00\x00\x01-\x01/\x01\x03\x11\x17\x05\x03'\t\x01\x13\x16\x06#\"'%\x05\x06#\"&7\x13\x01&67%\x13632\x17\x13\x05\x1e\x01\x04\xa2\x01\x01\xfe\x9cB\x1e\x9f;\x01><\f\x01\xf5\xfe\x95V\x05\x16\x17\x11\x17\xfe?\xfe?\x17\x11\x17\x16\x05V\xfe\x94 \x12-\x01\xf6\xe1\x14\x1d\x1c\x15\xe1\x01\xf6-\x12\x02C\xfa4\n<\x01B\xfc=\x1f\xa8\x01cB\x015\xfe\x9e\xfe\f!%\f\xec\xec\f%!\x01\xf4\x01b 7\aI\x01\xc7))\xfe9I\a7\x00\x00\x00\x01\x00\x02\xff\x80\x05\x80\x05\x00\x00\x16\x00\x00\t\x01\x06#\"'.\x015\x11!\".\x0167\x01632\x17\x1e\x01\x05y\xfd\x80\x11(\x05\n\x16\x1b\xfd\xc0\x16#\n\x12\x14\x05\x00\r\x10\x1b\x12\x0f\a\x04\xa3\xfb\x00#\x02\x05#\x16\x02@\x1b,(\n\x02\x80\a\x13\x0e)\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x02\x00\x05\x008\x00\x00\x01!\x11\t\x01!\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\"&5\x11#\"&=\x0146;\x01546;\x012\x16\x1d\x01!762\x17\x16\x14\x0f\x01\x1132\x16\x02-\x02S\xfd\x80\x02S\xfd\xad\x04\x80\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xfc\xa0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\x03S\xf6\n\x1a\n\t\t\xf7\xe0\x0e\x12\x01\x00\x02S\xfd\xda\x02S\xfd`\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x03`\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xf7\t\t\n\x1a\n\xf6\xfc\xad\x12\x00\x00\x00\x04\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00K\x00\x00$4&\"\x06\x14\x162\x124&\"\x06\x14\x162\x044&\"\x06\x14\x1627\x14\x06\a\x02\a\x06\a\x0e\x01\x1d\x01\x1e\x01\x15\x14\x06\"&5467\x11.\x015462\x16\x15\x14\x06\a\x1167>\x055.\x015462\x16\x01 8P88P88P88P\x02\xb88P88P\x984,\x02\xe0C\x88\x80S,4p\xa0p4,,4p\xa0p4,6d7AL*'\x11,4p\xa0p\x18P88P8\x04\xb8P88P8HP88P8`4Y\x19\xfe\xe1\u007f&+(>E\x1a\x19Y4PppP4Y\x19\x034\x19Y4PppP4Y\x19\xfe\x0f\x1a\x1f\x11\x19%*\x0154&#\"\a\x06\a\x06#\"/\x01.\x017\x12!2\x1e\x02\x02\xc0\x18\x10\xf0\x10\x18\x18\x10\xf0\x10\x18\x01<\x1f'G,')7\x18\x10\xf0\x0f\x15\x82N;2]=A+#H\r\x12\f\r\xa4\r\x05\b\xa0\x010P\xa2\x82R\x01\x18\xf0\x10\x18\x18\x10\xf0\x10\x18\x18\x02H6^;<\x1b\x16\x17T\x19\x11\x1f%\x13-S\x93#\x1b:/*@\x1d\x19Z\x10\b}\n\x1e\r\x01\n>h\x97\x00\x00\x00\x02\x00\x00\x00\x00\x02\x80\x05\x80\x00\x1e\x00.\x00\x00%\x15\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x01463!2\x16\x15\x1132\x16\x03\x15\x14\x06#!\"&=\x01463!2\x16\x02\x80&\x1a\xfe\x00\x1a&&\x1a@@\x1a&&\x1a\x01\x80\x1a&@\x1a&\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\xfd\xc0&\x04f\xc0\x1a&&\x1a\xc0\x1a&&\x00\x00\x02\x00b\x00\x00\x02\x1e\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x03\x0e\x01#!\"&'\x03&63!2\x16\x02\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x1e\x1c\x01'\x1a\xff\x00\x1a'\x01\x1c\x01%\x1a\x01@\x1a%\x01 \xe0\x1a&&\x1a\xe0\x1a&&\x04\x06\xfd\x00\x1a&&\x1a\x03\x00\x1a&&\x00\x02\x00\x05\x00\x00\x05\xfe\x05k\x00%\x00J\x00\x00%\x15#/\x01&'#\x0e\x02\a\x06\x0f\x01!53\x13\x03#5!\x17\x16\x17\x16\x1736?\x02!\x15#\x03\x13\x01\x15!'&54>\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x04\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xea\xfd\xfe\x03\x044NZN4;)3.\x0e\x16i\x1a%Sin\x881KXL7\x03觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\x02\xa7\xce\x1b\x1c\x12@jC?.>!&1'\v\x1b\\%\x1dAwc8^;:+\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x03\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xec\xfd\xfe\x04\x034NZN4;)3.\x0e\x16i\x1a%Pln\x88EcdJ\x04觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\xd9\xce\x1b-\x01@jC?.>!&1'\v\x1b\\%\x1dAwcBiC:D'P\x00\x00\x00\x02\x00\x01\x00\x00\a\u007f\x05\x00\x00\x03\x00\x17\x00\x00%\x01!\t\x01\x16\x06\a\x01\x06#!\"&'&67\x0163!2\x16\x03\x80\x01P\xfd\x00\xfe\xb0\x06\xf5\x0f\v\x19\xfc\x80&:\xfd\x00&?\x10\x0f\v\x19\x03\x80&:\x03\x00&?\x80\x01\x80\xfe\x80\x045\"K\x1c\xfc\x00,)\"\"K\x1c\x04\x00,)\x00\x00\x01\x00\x00\xff\xdc\x06\x80\x06\x00\x00h\x00\x00\x01\x14\x06#\".\x02#\"\x15\x14\x16\a\x15\"\a\x0e\x02#\"&54>\x0254&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06#\"'.\x01/\x01\"'\"5\x11\x1e\x02\x17\x16327654.\x0254632\x16\x15\x14\x0e\x02\x15\x14\x163267\x15\x0e\x02\a\x06\x15\x14\x17\x1632>\x0232\x16\x06\x80YO)I-D%n \x01\x16\v\"\u007fh.=T#)#lQTv\x1e%\x1e.%P_\x96\t%\t\r\x01\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1evUPl#)#T=@\xe8/\x01\x05\x05\x01\x18#,-\x1691P+R[\x01\xb6Ql#)#|'\x98'\x05\x01\x03\x11\n59%D-I)OY[R+P19\x16-,#\x18\x02\x04\x02\x02\x01\x01\x04\x00\x01\x05\x05\x01\x18#,-\x1691P+R[YO)I-D%95\x1e\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1ev\x00\x00\x02\x00\x00\xff\x80\x04\x80\x06\x00\x00'\x003\x00\x00\x01\x15\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&\x00=\x01462\x16\x1d\x01\x14\x00 \x00=\x01462\x16\x01\x11\x14\x06 &5\x1146 \x16\x04\x80\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00\xd9\xfe\xd9&4&\x01\a\x01r\x01\a&4&\xff\x00\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x03@\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\x18\x01G݀\x1a&&\x1a\x80\xb9\xfe\xf9\x01\a\xb9\x80\x1a&&\x01f\xfe\x00\x84\xbc\xbc\x84\x02\x00\x84\xbc\xbc\x00\x03\x00\r\xff\x80\x05s\x06\x00\x00\v\x00C\x00K\x00\x00\x01\a&=\x01462\x16\x1d\x01\x14\t\x01\x15\x14\x06#\"'\a\x1632\x00=\x01462\x16\x1d\x01\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&'\a\x06\"/\x01&47\x0162\x1f\x01\x16\x14%\x01\x114632\x16\x01\x0fe*&4&\x04i\xfe\x97\xbc\x8476`al\xb9\x01\a&4&\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00}n\xfe\n\x1a\nR\n\n\x04\xd2\n\x1a\nR\n\xfez\xfd\x93\xbc\x84f\xa5\x02Oego\x80\x1a&&\x1a\x805\x02\x1e\xfe\x97\x80\x84\xbc\x13`3\x01\a\xb9\x80\x1a&&\x1a\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\rD\xfe\n\nR\n\x1a\n\x04\xd2\n\nR\n\x1az\xfd\x93\x02\x00\x84\xbcv\x00\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x06\x00\"\x00\x00\x01\x11!\x11676\x13\x11\x14\x0e\x05\a\x06\"'.\x065\x11463!2\x16\x04@\xfe@w^\xeb\xc0Cc\x89t~5\x10\f\x1c\f\x105~t\x89cC&\x1a\x04\x80\x1a&\x02@\x02\x80\xfb\x8f?J\xb8\x03\xb0\xfd\x00V\xa9\x83|RI\x1a\a\x06\x06\a\x1aIR|\x83\xa9V\x03\x00\x1a&&\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\x13\x00#\x00G\x00\x00\x17!\x11!%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x05\x80\xfa\x80\x01\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x04\x00\xc0\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12\x0e\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12N\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x02\x00\x03\xff\x80\x05\x80\x05\xe0\x00\a\x00L\x00\x00\x004&\"\x06\x14\x162%\x11\x14\a\x06#\"'%.\x015!\x15\x1e\x01\x15\x11\x14\x06#!\"&5\x114675#\"\x0e\x03\a\x06#\"'.\x017>\x047&5462\x16\x15\x14\a!467%632\x17\x16\x02\x00&4&&4\x03\xa6\f\b\f\x04\x03\xfe@\v\x0e\xff\x00o\x91&\x1a\xfe\x00\x1a&}c ;pG=\x14\x04\x11(\x10\r\x17\x11\f\x05\x138Ai8\x19^\x84^\x0e\x01.\x0e\v\x01\xc0\x03\x04\f\b\f\x05&4&&4&`\xfe\xc0\x10\t\a\x01`\x02\x12\vf\x17\xb0s\xfc\xe0\x1a&&\x1a\x03 j\xa9\x1eo/;J!\b#\a\f2\x18\n KAE\x12*,B^^B!\x1f\v\x12\x02`\x01\a\t\x00\x00\x02\x00$\xff \x06\x80\x05\x80\x00\a\x00-\x00\x00\x004&\"\x06\x14\x162\x01\x14\x02\a\x06\a\x03\x06\a\x05\x06#\"/\x01&7\x13\x01\x05\x06#\"/\x01&7\x1367%676$!2\x16\x05\xa08P88P\x01\x18\x97\xb2Qr\x14\x02\x0e\xfe\x80\a\t\f\v@\r\x05U\xfe\xe7\xfe\xec\x03\x06\x0e\t@\x11\f\xe0\n\x10\x01{`P\xbc\x01T\x01\x05\x0e\x14\x04\x18P88P8\x01\x80\xf9\xfe\x95\xb3P`\xfe\x85\x10\n\xe0\x04\t@\x0e\x12\x01\x14\x01\x19U\x01\t@\x13\x14\x01\x80\x0e\x02\x14rQ\xbb\x8e\x13\x00\x00\x00\x01\x00\x00\x00\x00\x06\xd1\x05\x00\x00\x16\x00\x00\x01\x03!\x136'&+\x01\x03!\x13!\x03!\x13\x03!2\x16\x17\x1e\x01\x06Ѥ\xfe\xb2\xb2\r\x1c\x1b8\xa9\xcc\xfe\xb2\xcc\xfe\xe2\xcc\xfe\xb2̙\x04\xfce\xb1;<*\x02\xfb\xfd\x05\x03@8 !\xfcG\x03\xb9\xfcG\x03\xb9\x01GQII\xbf\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%764'\t\x0164/\x01&\"\a\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x8df\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x13\x01\xc6\x134\x02\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8df\x134\x13\x013\x013\x134\x13f\x13\x13\xfe:\x134\x13\xfe:\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164'\x01&\"\x0f\x01\x06\x14\x17\t\x01\x06\x14\x1f\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xcd\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x13f\x134\x03F\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8d\x01\xc6\x134\x13\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00\x01764'\x01&\"\a\x01\x06\x14\x1f\x01\x1627\t\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x8df\x13\x13\xfe:\x134\x13\xfe:\x13\x13f\x134\x13\x013\x013\x134\x01\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x8df\x134\x13\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x01\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164/\x01&\"\a\t\x01&\"\x0f\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03-\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x13\x01\xc6\x134\x02\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xed\x01\xc6\x134\x13f\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x02w\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff@\x05\x80\x05\x80\x00\x11\x00\x16\x00\x00\x017!\x13!\x0f\x01/\x01#\x13\x0535%\x13!'\x01!\x03\x05%\x04j\x10\xfc\x8c/\x02d\x16\xc5\xc4\r\xaf\x16\x01j\x04\x01g2\xfd|\x0f\xfe8\x05\x80\x80\xfd\xbe\xfd\xc2\x03\xab\xaf\xfd\xea\xe455\x8c\xfe\xead\x01c\x02 \xb5\x01\xd5\xfab\xa2\xa2\x00\x00\x00\x01\x00\f\xff@\x06\xf4\x05\x80\x00\x0f\x00\x00\x01!\t\x02\x13!\a\x05%\x13!\x13!7!\x01\x13\x05\xe1\xfe\xf6\xfc\xdc\xfdFG\x01)\x1d\x01\xa6\x01\xe6D\xfbH:\x04\xb9&\xfbH\x05\x80\xfa\xcb\xfe\xf5\x01\v\x01d\x93\xa1\xa1\x01S\x01)\xbf\x00\x00\x00\x02\x00\x00\xff\x10\a\x00\x06\x00\x00\a\x00U\x00\x00\x004&\"\x06\x14\x162\x01\x11\x14\a\x06#\"/\x01\x06\x04 $'\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\x1e\x01\x17\x11#\"&=\x0146;\x015.\x015462\x16\x15\x14\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x11>\x017'&763!2\x16\x03\xc0&4&&4\x03f\x14\b\x04\f\v]w\xfeq\xfe4\xfeqw]\t\x0e\x04\b\x14\x12\x0e\x01`\x16\b\b\x0fdC\xf5\x95\xc0\x1a&&\x1a\xc0:F\x96ԖF:\xc0\x1a&&\x1a\xc0\x95\xf5Cd\x0f\b\b\x16\x01`\x0e\x12\x04\xe64&&4&\xfc\xa0\xfe\xa0\x16\b\x02\t]\x8f\xa7\xa7\x8f]\t\x02\b\x16\x01`\x0e\x12\x14\x13\x10d[}\x14\x02\x87&\x1a\x80\x1a&\xa3\"uFj\x96\x96jFu\"\xa3&\x1a\x80\x1a&\xfdy\x14}[d\x10\x13\x14\x12\x00\x01\x00\x00\x00\x00\x04\x80\x06\x00\x00#\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x01\x114\x00 \x00\x15\x14\x06+\x01\"&54&\"\x06\x15\x11\x04 (88(\xfc@(88( \x01\a\x01r\x01\a&\x1a@\x1a&\x96Ԗ\x03\x008(\xfd\xc0(88(\x02@(8\x01@\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1aj\x96\x96j\xfe\xc0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00'\x003\x00\x00\x00\x14\x06\"&462\x00\x10& \x06\x10\x16 \x00\x10\x00 \x00\x10\x00 \x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4\x01\x16\xe1\xfe\xc2\xe1\xe1\x01>\x01a\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8\x01\xacf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\xfea\x01>\xe1\xe1\xfe\xc2\xe1\x02T\xfeX\xfe\xd4\x01,\x01\xa8\x01,\xfd~\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x03 \xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88\x00\x00\x00\x00\x03\x00\x00\x00\x00\x01\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x1b\x005\x00E\x00\x00$4&\"\x06\x14\x162%&\x00'&\x06\x1d\x01\x14\x16\x17\x1e\x01\x17\x1e\x01;\x0126%&\x02.\x01$'&\a\x06\x1d\x01\x14\x16\x17\x16\x04\x12\x17\x1e\x01;\x01276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00KjKKj\x01\xaa\r\xfe\xb9\xe9\x0e\x14\x11\r\x9a\xdc\v\x01\x12\r\x80\r\x14\x01\u007f\x05f\xb1\xe9\xfe\xe1\x9a\x0e\t\n\x12\r\xcc\x01\\\xd1\a\x01\x12\r\x80\r\n\v\x01\x1f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xcbjKKjK\"\xe9\x01G\r\x01\x14\r\x80\r\x12\x01\vܚ\r\x11\x14\r\x9a\x01\x1f\xe9\xb1f\x05\x01\n\n\r\x80\r\x12\x01\a\xd1\xfe\xa4\xcc\r\x12\n\t\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0164'\x01&\a\x06\x15\x11\x14\x17\x16327\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03\xb2 \xfd\xe0\x1f! \x10\x10\x11\x0f\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfd\x97\x12J\x12\x01@\x13\x12\x13%\xfd\x80%\x13\b\t\x00\x03\x006\xff5\x06\xcb\x05\xca\x00\x03\x00\x13\x00/\x00\x00\t\x0564'\x01&\"\a\x01\x06\x14\x17\x01\x162\t\x01\x06\"/\x0164&\"\a'&47\x0162\x1f\x01\x06\x14\x1627\x17\x16\x14\x04\x00\x01<\xfd\xc4\xfe\xc4\x01i\x02j\x13\x13\xfe\x96\x126\x12\xfd\x96\x13\x13\x01j\x126\x03\x8b\xfcu%k%~8p\xa08}%%\x03\x8b%k%}8p\xa08~%\x04<\xfe\xc4\xfd\xc4\x01<\xfei\x02j\x134\x13\x01j\x12\x12\xfd\x96\x134\x13\xfe\x96\x12\x02\x8f\xfct%%~8\xa0p8~%k%\x03\x8a%%}8\xa0p8}%k\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&&\x1a\x80\x1a&&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x03@\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x01\x00\x03\x00\x00\x03\xfa\x05\u007f\x00\x1c\x00\x00\x01\x06+\x01\x11\x14\x06#!\"'&?\x0163!\x11#\"'&7\x0162\x17\x01\x16\x03\xfa\x12(\xc0\x12\x0e\xfd@\x15\b\b\f\xa0\t\x10\x01@\xc0(\x12\x11\x1a\x01@\x12>\x12\x01@\x1b\x03\xa5%\xfc\xa0\x0e\x12\x12\x14\x0f\xc0\v\x02\x80%%\x1f\x01\x80\x16\x16\xfe\x80 \x00\x00\x00\x01\x00\x03\xff\x80\x03\xfa\x05\x00\x00\x1b\x00\x00\x13!2\x16\x15\x1132\x16\a\x01\x06\"'\x01&76;\x01\x11!\"/\x01&76 \x02\xc0\r\x13\xc0($\x1b\xfe\xc0\x12>\x12\xfe\xc0\x1a\x11\x12(\xc0\xfe\xc0\x0e\v\xa0\r\t\t\x05\x00\x13\x0e\xfc\xa1J \xfe\x80\x16\x16\x01\x80\x1f&%\x02\x80\v\xc0\x0e\x14\x13\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00$\x00\x00%\x0164/\x01&\"\a\x01'&\"\x0f\x01\x06\x14\x17\x01\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad\x02f\x13\x13f\x134\x13\xfe-\xd3\x134\x13f\x13\x13\x01f\x134\x03f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xed\x02f\x134\x13f\x13\x13\xfe-\xd3\x13\x13f\x134\x13\xfe\x9a\x13\x03\x86\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x06\x00\x10\x00\x15\x00\x1f\x00/\x00\x00\x01\x17\a#5#5\x01\x16\a\x01\x06'&7\x016\t\x03\x11\x01764/\x01&\"\x0f\x01%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x94\x9848`\x01\xd2\x0e\x11\xfe\xdd\x11\r\x0e\x11\x01#\x11\xfe\xfb\x02 \xfe\xe0\xfd\xe0\x03\x80\\\x1c\x1c\x98\x1cP\x1c\\\x02\xa0\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xac\x984`8\x01\xba\r\x11\xfe\xdd\x11\x0e\r\x11\x01#\x11\xfd@\x02 \x01 \xfd\xe0\xfe\xe0\x02`\\\x1cP\x1c\x98\x1c\x1c\\`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00)\x00\x00\x01\x114&#!\"\a\x06\x1f\x01\x01\x06\x14\x1f\x01\x1627\x01\x17\x163276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe *\x11\x11\x1f\x90\xfd\xea\x13\x13f\x134\x13\x02\x16\x90\x12\x1b\f\r'\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02`\x01\xe0\x1a&')\x1d\x90\xfd\xea\x134\x13f\x13\x13\x02\x16\x90\x13\x05\x11\x02*\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00\t\x0164'\x01&\a\x06\x1d\x01\"\x0e\x05\x15\x14\x17\x163276'\x027>\x013\x15\x14\x17\x1632\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xed\x01`\x13\x13\xfe\xa0\x1e'(w\u0083a8!\n\xa7\v\x0e\a\x06\x16\x03,j.\xa8\x8c(\f\f\x1a\x02&\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xb3\x01`\x134\x13\x01`\x1f\x11\x11*\xa0'?_`ze<\xb5\xdf\f\x03\t\x18\x01bw4/\xa0*\x11\x05\x02\xc0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\x06\x00\x12\x00\x1e\x00\x00\x01-\x01\x01\x11\x01\x11\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\x80\x01\x00\xff\x00\x01\x80\xfe\x00\x03 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xc0\x80\x80\x01O\xfd\xe2\xff\x00\x02\x1e\xfe\xdd\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x16\a\x01\x06\"'\x01&763!2\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x12\x17\xfe\xc0\x13B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x98\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03]#\x1f\xfe@\x1b\x1b\x01\xc0\x1f##\xfd \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x06#!\"'&7\x0162\x17\x01\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x11(\xfd\x80(\x11\x12\x17\x01@\x13B\x13\x01@\x17u\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xa3###\x1f\x01\xc0\x1b\x1b\xfe@\x1f\xfe\xda\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x00\x14\a\x01\x06'&5\x11476\x17\x01\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04@\x1b\xfe@\x1f####\x1f\x01\xc0\xdb\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\xa1B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x11\x12\x17\xfe\xc0\xfd\xec\x03\xc0\x0e\x12\x12\x0e\xfc@\x0e\x12\x12\x03\xce\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x00\x00\x00\x03\xf3\x05\x80\x00`\x00\x00%\x17\x16\x06\x0f\x01\x0e\a#\"\x00'#\"&=\x0146;\x01&7#\"&=\x0146;\x016\x0032\x17\x16\x17\x16\x0f\x01\x0e\x01/\x01.\x05#\"\x06\a!2\x17\x16\x0f\x01\x06#!\x06\x17!2\x17\x16\x0f\x01\x0e\x01#!\x1e\x0132>\x04?\x016\x17\x16\x03\xd0#\x03\f\v\x05\x04\r\x13\x18\x1b!\"'\x13\xea\xfe\xa2?_\r\x13\x13\rB\x02\x03C\x0e\x12\x12\x0ebC\x01a\xe0f\\\v\t\x06\x03+\x03\x16\r\x04\x04\x0f\x14\x19\x1b\x1f\x0e~\xc82\x01\xd4\x10\t\n\x03\x18\x05\x1b\xfe\x18\x03\x03\x01\xcb\x0f\n\t\x03\x18\x02\x12\v\xfe}0\xcb\u007f\x12$\x1f\x1c\x15\x10\x04\x05\r\r\f\xe5\x9f\f\x15\x04\x01\x02\x03\x06\x05\x05\x05\x04\x02\x01\x05\xdd\x13\rq\r\x1390\x12\x0er\x0e\x12\xd2\x01\x00\x17\x03\f\v\r\x9f\r\r\x04\x01\x01\x03\x04\x03\x03\x02\x80p\f\f\x0er\x1a%D\f\f\x0fp\v\x0fu\x89\x03\x04\x05\x05\x04\x01\x02\x05\a\a\x00\x00\x01\x00\x00\x00\x00\x03\xfc\x05\x80\x00?\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x0146;\x0154632\x17\x1e\x01\x0f\x01\x06\a\x06'.\x02#\"\x06\x1d\x01!2\x16\x1d\x01\x14\x06#!\x11!546;\x012\x16\x03\xfc\x12\x0e\xfcD\x0e\x12\x13\ra_\x0e\x12\x12\x0e_\xf7\xbf\xb9\x96\t\x02\bg\t\r\r\n\x05*`-Uh\x011\r\x13\x13\r\xfe\xcf\x01\x9e\x12\x0e\xa2\x0e\x12\x01\x8f\xfe\x91\x0e\x12\x12\x0e\x96\r\x13\x01\u007f\x13\r\x83\x0e\x12߫\xde}\b\x19\n\u007f\v\x01\x02\t\x05\x1c$^L\xd7\x12\x0e\x83\r\x13\xfe\x85\xb5\r\x13\x13\x00\x00\x00\x01\x004\xff\x00\x03\xd2\x06\x00\x00b\x00\x00\x01\x14\x06\a\x15\x14\x06+\x01\"&=\x01.\x04'&?\x01676\x170\x17\x16\x17\x1632654.\x03'.\b5467546;\x012\x16\x1d\x01\x1e\x04\x17\x16\x0f\x01\x06\a\x06'.\x04#\"\x06\x15\x14\x1e\x04\x17\x1e\x06\x03\xd2ǟ\x12\x0e\x87\r\x13B{PD\x19\x05\x11\x0fg\a\x10\x0f\t\x02q\x82%%Q{\x1e%P46'-N/B).\x19\x11ĝ\x13\r\x87\x0e\x129kC<\x12\x06\x11\fQ\b\x0f\x0e\r\x03\x177>W*_x\x11*%K./58`7E%\x1a\x01_\x99\xdd\x1a\xaf\x0e\x12\x13\r\xaf\t,-3\x18\x06\x15\x14\x87\n\x02\x02\v\x02c\x1a\bVO\x1c2\")\x17\x15\x10\x12#\x1b,)9;J)\x8a\xd0\x1e\xb4\r\x13\x12\x0e\xb0\x06\"!*\x10\x06\x12\x14\x92\x0f\x01\x03\n\x03\x12#\x1d\x17VD\x1a,'\x1b#\x13\x12\x14\x17/&>AX\x00\x01\x00\x00\x00\x00\x03\x82\x05\x80\x00>\x00\x00\x01\x15\x14\x06+\x01\x0e\x01\a\x16\x01\x16\a\x06+\x01\"'\x00'&=\x0146;\x01267!\"&=\x01463!&+\x01\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01\x16\x1732\x16\x03\x82\x12\x0e\xa8\x17Ԫ\xa7\x01$\x0e\n\b\x15\xc3\x10\t\xfe\xce\xc0\t\x13\rp\x84\xa1\x16\xfeU\x0e\x12\x12\x0e\x01\x9d9ӑ\r\x13\x12\x0e\x03@\x0e\x12\x12\x0e\xe9/\x11\xab\x0e\x12\x04*f\x0e\x12\x90\xb4\x14\xb2\xfe\x9a\x10\x12\x12\f\x01o\xcc\t\r\u007f\r\x13VR\x12\x0ef\x0e\x12q\x13\r\x85\x0e\x12\x12\x0ef\x0e\x12=S\x12\x00\x01\x00\x04\x00\x00\x03\xff\x05\x80\x00E\x00\x00!#\"&5\x11!\"&=\x01463!5!\"&=\x0146;\x01\x01&76;\x012\x17\x13\x16\x17>\x017\x136;\x012\x17\x16\a\x0132\x16\x1d\x01\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x11\x14\x06\x02[\xac\r\x13\xfe\xe0\r\x13\x13\r\x01 \xfe\xe0\r\x13\x13\r\xd6\xfe\xbf\b\b\n\x12\xc2\x13\n\xd7\x13%\n)\a\xbf\b\x15\xbf\x11\n\t\b\xfe\xc7\xd7\r\x13\x13\r\xfe\xde\x01\"\r\x13\x13\r\xfe\xde\x13\x12\x0e\x01J\x12\x0eg\r\x13U\x12\x0eh\r\x13\x02B\x10\x10\x10\x12\xfeW&W\x18X\x11\x01\xa4\x13\x10\x0e\x11\xfd\xbd\x13\rh\x0e\x12U\x13\rg\x0e\x12\xfe\xb6\r\x13\x00\x02\x00\x00\x00\x00\x05\x00\x05\x80\x00\a\x008\x00\x00\x004&#!\x11!2\x00\x10\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015#\"&=\x0146;\x01\x11463!2\x04\x13\x82j\xfe\xc0\x01@j\x01o\xfd\xc8\xfe\xac\x01\xf9\x0e\x12\x12\x0e\xfe\a\x13\r\xa7\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x02\x1b\xc8\x03g\xc8|\xfe@\x01\xa1\xfe~\xf4v\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12v\x12\x0e\x95\r\x13\x02u\x0e\x12\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\b\x00\f\x00\x10\x00\x19\x00\x1d\x00n\x00\x00\x01\x13#\x13\x16\x14\x1746\x137!\x17!3'#\x01\x13#\x13\x14\x16\x1746\x137!\x17\x05\x15\x14\x06+\x01\x03\x06+\x01\"'\x03#\x03\x06+\x01\"&'\x03#\"&=\x0146;\x01'#\"&=\x0146;\x01\x03&76;\x012\x17\x13!\x136;\x012\x17\x13!\x136;\x012\x17\x16\a\x0332\x16\x1d\x01\x14\x06+\x01\a32\x16\x02\x02Q\x9fK\x01\x01\x01t#\xfe\xdc \x01\xa1\x8b#F\x01\x9fN\xa2Q\x01\x01\x01o!\xfe\xd7\"\x02\x80\x12\x0eդ\a\x18\x9f\x18\a\xa6ѧ\a\x18\x9f\v\x11\x02\xa0\xd0\x0e\x12\x12\x0e\xaf!\x8e\x0e\x12\x12\x0emY\x05\n\n\x10\x89\x1a\x05Z\x01ga\a\x18~\x18\ab\x01m]\x05\x1a\x89\x10\n\n\x05[o\x0e\x12\x12\x0e\x91\"\xb3\x0e\x12\x01U\x01+\xfe\xd4\x01\x04\x01\x01\x05\x01\xac\x80\x80\x80\xfd\xd4\x01,\xfe\xd5\x01\x05\x01\x01\x04\x01\xad\x80\x80 @\x0e\x12\xfd\x98\x18\x18\x02h\xfd\x98\x18\x0e\n\x02h\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x01X\x0f\r\f\x18\xfe\x98\x01h\x18\x18\xfe\x98\x01h\x18\f\r\x0f\xfe\xa8\x12\x0e@\x0e\x12\x80\x12\x00\x00\x03\x008\xff\x00\x04\xe8\x05\x80\x003\x00H\x00\\\x00\x00\x01\x16\a\x1e\x01\a\x0e\x04\a\x15#5\"'\x15#\x11\"&+\x017327\x113&#\x11&+\x015\x172753\x156353\x15\x1e\x03\x034.\x04\"\x06#\x112\x162>\x06\x034.\x04\x0e\x01#\x112\x16>\x06\x04\x8f\x12\x95ut\r\a3Nt\u007fR\x9aP*\x9a\x12H\x13\xc8\x1fo2\b\x10\x06\n\rLo\xd4@!\x9aR(\x9aOzh=\xd1\x1e,GID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xee\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x1e\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xdf?jJrL6V\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x127>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x02/rr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x00\x00\x00\x00\x04\x00\"\xff\x00\x05\xce\x06\x00\x00\n\x00$\x007\x00V\x00\x00\x014&#\"\x06\x14\x16326\x01\x14\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x05\x15!53\x1146=\x01#\a\x06\x0f\x01'73\x11\x13\x14\x0e\x03#\"'&'7\x16\x17\x163267#\x0e\x01#\"&54632\x16\x05BX;4>ID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xd0\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xc3\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x04\xdf?jJrL6\xfb\xaa\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x12\xfcrr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x053>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x00\x00\x03\x00\x00\xff\x80\x06@\x05\x80\x00\v\x00\x1b\x00\\\x00\x00%4&#\"\x06\x15\x14\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x14\a\x16\x15\x16\a\x16\a\x06\a\x16\a\x06\a+\x02\".\x01'&'.\x015\x11467>\x01767>\x027>\x027632\x1e\x05\x15\x14\x0e\x01\a\x0e\x02\a!2\x16\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04\xa07\x0f\x03.\x11\x11\x0f'\t:@\x85$L\x11B\x9cWM{#\x1a&$\x19\x18h1D!\x12\x1a\t\t\a\v\x1c\x14\x13\x1a.I/!\x0f\t\x01\x13\x13\x12\x03\x0e\b\x04\x01\x15Nr\xc0\x1a&&\x1a\x1b%%\x02\x1b\xfd\x80\x1a&&\x1a\x02\x80\x1a&&\x1aV?, L=8=9%pEL\x02\x1f\x1b\x1a+\x01\x01%\x1a\x02\x81\x19%\x02\x02r@W!\x12<%*',<\x14\x13\x15\x1f2(<\x1e\x18&L,\"\x06\x18\x14\x0er\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06@\x05\x00\x00\v\x00\x1b\x00\\\x00\x00\x01\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26%\x16\x15\x0e\x01#!\x1e\x02\x17\x1e\x02\x15\x14\x0e\x05#\"'.\x02'.\x02'&'.\x01'.\x015\x1146767>\x02;\x03\x16\x17\x16\a\x16\x17\x16\a\x16\a\x14\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04i7\x01qN\xfe\xeb\x04\b\x0e\x03\x12\x12\x14\x01\t\x0f!/I.\x1a\x13\x14\x1c\v\a\t\t\x1a\x12!D1h\x18\x19$&\x1a#{MW\x9cB\x11L$\x85@:\t'\x0f\x11\x11.\x03\x03\xc0\x1a&&\x1a\x1b%%\xfd\xe5\x02\x80\x1a&&\x1a\xfd\x80\x1a&&\xaf=XNr\x0e\x14\x18\x06%(M&\x18\x1e<(2\x1f\x15\x13\x14<,'*%<\x12!W@r\x02\x02%\x19\x02\x81\x1a%\x01\x01+\x1a\x1b\x1f\x02LEp%9=8=L \x00\x00\f\x00\x00\xff\x80\x06\x00\x05\x80\x00\t\x00\x0f\x00\x17\x00+\x00=\x00\\\x00d\x00\u007f\x00\x8c\x00\x9e\x00\xb2\x00\xc2\x00\x00%54#\"\a\x15\x16327354\"\x15%\x15#\x11#\x11#5\x05\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x05\x15\x14\a\x06#\"'\x15#\x113\x15632\x17\x16\x17\x15\x14\a\x06\a\x06#\"'&=\x014762\x17\x16\x1d\x01#\x15\x143274645\x01\x15\x14\"=\x0142\x014'.\x01'&! \a\x0e\x01\a\x06\x15\x14\x17\x1e\x01\x17\x16 7>\x0176\x01\x13#\a'#\x1e\x01\x17\x16\x17\x153%54'&#\"\a\x06\x1d\x01\x14\x17\x163276\x173\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x97\x1d\x11\x10\x10\x11\x1d\xb8BB\xfd\xc5PJN\x01\xb1C'%!\t\x06B\x01\x01\x0e\x14\x16\x01?\a\f)#!CC $)\f\a\xfb\x02\x03\f\x1b54\x1d\x15\x14\x1df\x1b\x15\x85\"\x18\x06\x01\xfe\x81@@\x02\x15\x13\nB+\x88\xfe\xec\xfe\xed\x88,A\n\x14\x14\nA+\x89\x02&\x89+A\n\x14\xfd\rZK35N\a \b#\vJ\x01!\x15\x1d13\x1b\x15\x15\x1b31\x1d\x15\xb5CC\x16\x14\x0f\x01\x01C\x06\v $)\x01\xf7\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xe9\x9d2\x10\xe0\x10\xab\"33\xe8F\xfeY\x01\xa7F~\xfe\x91(-\x1c\x11%\x01\"\xfe\xf2\x18\x02\x0f\x1f\x01\x18o\x924\x15*)$\x01\xed\xa1(*\x15\xb6\t\x1d\x0e\x16\x12(&\x1b;\x81;\x1b&&\x1d9LA3\x1a\x01\f\x15\v\x038\x9c33\x9c4\xfd\x03\xb1S,;\x05\x0f\x0f\x05;,W\xad\xb0T+<\x05\x0f\x0f\x05<+T\x03;\x01(\xc3\xc3\x17\\\x17g7\xc9x\x82:\x1d&&\x1d:\x82:\x1d&&\x1b<\x01r\xfe\xe5\x1f\x10\x02\x18\x01\x10\xfe\xdb%\x12\x1b-\x01\b\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\v\x00\x1b\xff\x00\x05\xe5\x06\x00\x00\t\x00\x0f\x00\x17\x00+\x00=\x00[\x00c\x00}\x00\x89\x00\x9b\x00\xaf\x00\x00\x01\x15\x14#\"'\x11632\x05\x15#542%35!\x153\x113!3\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327%54'&#\"\a5#\x1135\x163276%5#\x14\a\x06#\"=\x01354'&#\"\a\x06\x1d\x01\x14\x17\x16327676\x0154\"\x1d\x01\x142\x01\x14\a\x0e\x01\a\x06 '.\x01'&547>\x0176 \x17\x1e\x01\x17\x16\x013\x03\x11#\x11&'&'3\x13\x05\x15\x14\a\x06#\"'&=\x0147632\x17\x16%\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x03\xcb'\x17\x16\x16\x17'\x01RZZ\xfc:k\xfe\xc8id\x01 YY\x1e\x1b\x12\x03\x01Y\b\f.06\x01\xad\t\x1162+YY-06\x11\t\x01R[\x02\a!.\xb3\x1b'CD'\x1c\x1d'EH$\x12\x03\x02\xfd\xa0VV\x02\xcf\x1a\x0eX:\xb8\xfd\x1a\xb8:Y\r\x1a\x1a\x0eX;\xb7\x02\xe6\xb8:Y\r\x1a\xfc\x1afyd\x0e/%\x1cjG\x01\xb6\x1c&DC&\x1c\x1c&CD&\x1c\x01O[52.\r\b[\x01\x03\x12\x1b\x1e\x01$\xd3C\x16\x01-\x16D..D\x96^^\xfd\xc7\x01\xee\xfe\x86*\x15\x03 \x01l\xfey1\x18%=^\xc5I\x1a86\xd9\xfdi077\x1bS\r3\n$EWgO%33%O\xadO%35\x1b\x1b\t\x03\xc2\xd2EE\xd2F\xfdW\xeat;P\x06\x15\x15\x06P;p\xee\xeat;P\a\x14\x14\aP;p\x04\x0e\xfeq\xfe\xf1\x01\x0fJ\x8agT\xfe\xf9F\xafQ%33&P\xafP%33%R\xfe\r7>%\x183\x01\x8a\xfe\x91!\x02\x16+\x01}\x00\x00\x02\x00\x05\xff\x80\x05{\x05\xf6\x00\x13\x00'\x00\x00\x01\x06\x03\x06+\x01\"&7\x132'\x03&76;\x012\x17\x01\x16\a\x01\x15\x01\x16\a\x06+\x01\"'\x016\x016;\x012\x02U\n\xf7\x1b&\xef\x15\x14\n\xfd\x01\x01\xa1\f\v\t\x17\xef(\x1a\x03\xca\v\v\xfd\xf0\x01P\v\n\n\x16\xef*\x18\xfe\xad\x12\x02\x01\x19'\xf1\x16\x03e\x12\xfeJ.\"\x13\x01\xc0\x01\x01\x17\x16\x0f\x0f-\x01d\x10\x15\xfcZ\x01\xfd\x99\x14\x11\x0f-\x02n \x03\x8e-\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x13\x00'\x007\x00\x00\x014'&+\x01\"\a\x06\x1f\x01\x15\x03\x06\x17\x16;\x0127\x01&+\x01\"\a\x01\x16\x01\x16;\x01276'\x015\x016\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad~\x15\x1f\xb8\x12\b\a\b}\xc4\t\t\b\x10\xb9\x1f\x13\x037\a\x11\xbb\x1e\x13\xfee\x01\x01\x05\x14 \xb8\x12\a\b\t\xfe\xfc\x01\x99\b۩w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x03\x01\xdd\"\v\f\x11\xd8\x01\xfe\xa6\x0e\x0e\r$\x03Q\f#\xfd'\x02\xfe!#\f\r\x0f\x01\xdc\x01\x02\xd3\x10\x88\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\x00\n\a\x00\x04\xf6\x00\x02\x00I\x00\x00\x01-\x01\x132\x04\x1f\x012\x1e\x05\x17\x1e\x02\x17\x1e\x01\x17\x1d\x01\x16\a\x0e\x01\x0f\x01\x0e\x06#\x06!&$/\x02.\x02'.\x02'.\x01'=\x01&7>\x01?\x01>\x0636\x02\xc7\x01\xe4\xfe\x1c\xb9\xa8\x019II\x01 \x0e!\x18 \x1e\x0e\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0f\x1f\x01\xfb\xfe\x88\xcf\xfe\xcf01$$%A\x18\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0e \x01\xfb\x01\x98\xfa\xfd\x01g\t\x05\x04\x03\x03\x06\n\x10\x17\x0f\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x0f\n\x06\x03\x03\x13\x02\t\x03\x04\x04\x05\n \x19\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x10\n\x06\x03\x03\x12\x00\x00\x05\x00@\xff\x80\x06\xc0\x05\x8a\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00\x00\t\x04\x15\x01\x15'\a5\x015\x17\x015\x177\x15\t\f\x01\x92\x01\xee\xfe\xaa\xfe\x16\x05,\xfe\x16\x01\x01\xfe\x17\x93\x01V\x01\x01\x01W\xfdQ\x01V\xfe\x12\xfe\xae\x05.\x01R\xfe\x17\xfe\xa9\x01W\x01\xe9\xfe\xae\xfe\x12\x03=\xfe\xcf\xfe\xe3\x01?\xfe\xe4l\xfe\xdb\x01\x01\x01\x01\x01%l`\x01\x1c\x02\x01\x01\x02\xfe\xe4\x04\xd8\xfe\xe3\xfe\xd0\x01\x0e\xfe\xf2\xfe\xf1\xfe\xc1\x01\x1d\x03~\xfe\xc1\xfe\xf2\x010\x00\x06\x00\v\xff\x00\x05\xf5\x06\x00\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x00\x05!\x11#\x11!\x11#%7\x05\a\x017\x01\a\x017\x01\a\x03\x01\a\t\x015!\x15\x05\t\xfb\xa2\xa0\x05\x9e\xa0\xfcR!\x03\x0f!\xfdXC\x02\xd5C\xfd\xf4f\x02ff\xd9\x01݀\xfe#\xfd\xb2\x03 `\x01\xe0\xfd\x80\x02\x80,\x9d\xa5\x9c\x02\x1a\x92\xfe\xad\x91\x02\xb6{\xfd\xff{\x03{\xfd\u007f`\x02\x81\xfa\xa1\x9f\x9f\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00O\x00g\x00\x00\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 $\x14\x06\"&462$\"&\x0e\x02\a\x0e\x01\a\x0e\x03\x16\x14\x06\x1e\x02\x17\x1e\x01\x17\x1e\x0362\x16>\x027>\x017>\x03&46.\x02'.\x01'.\x03\x00\x10\a\x0e\x01\a\x06 '.\x01'&\x107>\x0176 \x17\x1e\x01\x17\x04\x00\x96Ԗ\x96\xd4\x01 \xe6\xfe\xb8\xe6\xe6\x01H\x01R6L66L\xfeG\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x02n\x05\n\xe4\xd0X\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x02\x16Ԗ\x96Ԗ\x01\xa4\xfe\xb8\xe6\xe6\x01H\xe66L66L6\x80\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\xfen\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x05\x05\n\xe4\xd0\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x17\x00\x1f\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x01\x9a|\xb0||\xb0\x02\xb0|\xb0||\xb0\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfc\xa8\xb0||\xb0||\xb0||\xb0|\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x15\x00\x00\x01\x13!\x053\t\x0137!\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\xc9\xfen\x026^\xfe5\xfe5^h\x02\n\x01\xfb\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\x92\xfe\xce\xe0\x02\xb3\xfdM\xa0\x011\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xffP\x05\x81\x05\xa3\x00\n\x00\x16\x00*\x00C\x00g\x00\x00\x01\x16\x06'.\x01676\x1e\x01\x17.\x01\a\x0e\x01\x17\x1e\x017>\x01\x13.\x02'$\x05\x0e\x02\a\x1e\x02\x17\x167>\x02\x13\x0e\x03\a\x0e\x01&'.\x03'&'?\x01\x16 7\x1e\x01\x06\x13\x06\x03\x0e\x02\a\x06%&'.\x04'.\x03'>\x04767$\x05\x16\x17\x1e\x01\x03/\bu5'\x1d\x1c&$I7o\x0e\xc6b?K\x03\x04\x93\\[z\xe4\x14H,1\xfe\xdd\xfe\xed+.@\x12\x1e\\7<\xe4\xdc?5\\V\b\x0f\r,$V\xcf\xc5g.GR@\x14\x19 \x06\x12\xdf\x027\xe0\x15\x06\x10\xb5\x1aU\x05,+!\xfc\xfe\x9a\xf8\x92\x0f\x15\r\x05\a\x02\t#\x15\x1a\t\x03\x1d\"8$\x1e}\xbc\x01{\x01)\x9b<\x10\x01\x02\xa5?L \x11RR\x11\x12\f;\x11kr,\x1cyE[\x80\b\b\x98\x02z\x1b#\t\b/1\a\n\"\x1a\x1c#\t\a\x1d\x1c\b\b#\xfc\x12\x1aeCI\x140/\x03\x11\b\x14\"5#`\xc4\x10\t\x94\x94\x06\"8\x03\xb8\xa7\xfe\x18\x1e4\x1c\x11~&\x1bp\f\x1d)\x1b4\t2\xc8{\xacH\x1a-\x1e\x1e\x0f\v.\x12%W.L\x14>\x00\x06\x00\x00\xff\x80\x06\x00\x05\x80\x00\b\x00\x13\x00'\x00:\x00Y\x00i\x00\x00\x014&\a\x06\x16\x17\x1667\x16\x0e\x01&'&676\x16\x13\x0e\x02\a\x06'.\x02'>\x0276\x17\x1e\x02\x1346&'\x06 '\x0f\x01\x16\x17\x16\x17\x167>\x02\x136'&'&\x05\x06\a\x0e\x02\a\x1e\x02\x17\x1e\x03\x17\x16\x17\x047>\x027\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03PR$+\x01+'TJ\bX\x84j\x03\x027-F\x8f\xb6\x14C',\x9b\xa9,&C\x15\r.\"\x1e\xc6\xd2!$28\v\x05\x0f\xa1\xfeh\xa2\f\x05\x1a\x0f/\x9d\xf9\xb3\"\x1e\x0f\x87\t\x11+p\xd8\xfe\xf1\x84^&+3\x04\b\x16$\x06\x01\b\x06\x12\ri\xb3\x01\x03\xb5\x18\x1f\x1f\x040\x01(\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x9a+.\x16\x14i\x12\x176=Bn\f\\C1X\x14\x1fR\x01:\x15\x1a\x06\x05\x14\x14\x06\a\x19\x14\x13\x18\a\x05#\"\x05\a\x19\xfd\x03\a'\x19\x04jj\x06\f\x9a8Q\x1b.c\x13Aj\x02\xc75\x167!?\x1b\f\"\x0f\x140\x1eD\x8c\xca$\x054\x14\"\vP\x14\x1c[\r\x14&\x15\x01\v\x012\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00D\xff\x80\x04\x00\x06\x00\x00\"\x00\x00%\x17\x0e\x01\a\x06.\x035\x11#5>\x047>\x01;\x01\x11!\x15!\x11\x14\x1e\x0276\x03\xb0P\x17\xb0Yh\xadpN!\xa8HrD0\x14\x05\x01\a\x04\xf4\x01M\xfe\xb2\r C0N\xcf\xed#>\x01\x028\\xx:\x02 \xd7\x1aW]oW-\x05\a\xfeX\xfc\xfd\xfa\x1e45\x1e\x01\x02\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00/\x00\x00%'\x06#\x06.\x025\x11!5!\x11#\"\a\x0e\x03\a\x153\x11\x14\x1e\x027>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04p>,;$4\x19\n\x01\x01\xff\x00\xbc\b\x01\x05\x195eD\x82+W\x9bcE\x87\x01\xa2\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9K\xb7\x16\x01\x17()\x17\x01\x8e\xc2\x01F\n,VhV\x19\xa5\xfe^9tjA\x02\x010\x04/\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x03\xff@\x02\xfd\x06\x00\x00\x17\x00\x00\x00\x16\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x113\x02\xf5\x10\r\xfe\xa2\n\r\x0e\n\xfe\x9d\r\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x01\x00&\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x12\x0e\xfb \x00\x00\x00\x01\x00\x03\xff\x00\x02\xfd\x05\xc0\x00\x17\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&7\x01632\x17\x01\x16\x02\xfd\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01c\r\x04\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\n\xfe\x80\x10\x00\x00\x00\x00\x01\x00@\x01\x03\a\x00\x03\xfd\x00\x17\x00\x00\x01\x15\x14\x06#!\x15\x14\x06'\x01&547\x016\x17\x16\x1d\x01!2\x16\a\x00\x12\x0e\xfb &\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x02\xe0\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01b\x0e\b\t\x14\xe0\x12\x00\x00\x00\x01\x00\x00\x01\x03\x06\xc0\x03\xfd\x00\x17\x00\x00\x01\x14\a\x01\x06'&=\x01!\"&=\x01463!546\x17\x01\x16\x06\xc0\n\xfe\x80\x10\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\x02\x83\x0e\n\xfe\x9e\x0e\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\xfe\xa2\n\x00\x00\x00\x02\x00\x00\xff\x80\x05q\x06\x00\x00&\x008\x00\x00\x01\x06\a\x06#\"'&#\"\a\x06#\"\x03\x02547632\x17\x16327632\x17\x16\x17\x06\a\x06\x15\x14\x16\x01\x14\a\x06\a\x06\a\x06\a6767\x1e\x01\x17\x14\x16\x05q'T\x81\x801[VA=QQ3\x98\x95\x93qq\xabHih\"-bfGw^44O#A\x8a\xfe\xe1\x1d\x1e?66%C\x03KJ\xb0\x01\x03\x01\x01\x01A}}\xc4 !\"\x01\x03\x01\x05\xf2䒐\x1e\x1e\"\"A$@C3^q|\xc6\x04z=KK?6\x12\v\x06\x95lk)\x03\x10\x03\x04\f\x00\x00\x04\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\x01\x11%\x11\x01\x11!\x11\x01\x11%\x11\x01\x11!\x11\x02\xaa\xfdV\x02\xaa\xfdV\x06\x80\xfcu\x03\x8b\xfcu\x02\x12\xfdu^\x02-\x02\xe7\xfdm\x025\xfdw\xfc\xee}\x02\x95\x03n\xfc\xe6\x02\x9d\x00\x00\x00\x06\x00\x00\xff\x00\x05\x80\x05~\x00\a\x00\x0f\x00\x1c\x007\x00M\x00[\x00\x00\x00264&\"\x06\x14\x04264&\"\x06\x14\x052\x16\x15\x11\x14\x06\"&5\x1146\x05\x11\x14\x06+\x01\x15\x14\x06\"&=\x01#\x15\x14\x06#\"&5'#\"&5\x11\x01\x1e\x01\x15!467'&76\x1f\x0162\x1776\x17\x16\a\x01\x11\x14\x06#\"&5\x114632\x16\x01\xdd \x17\x17 \x16\x01\xbc \x16\x16 \x17\xfc\xfb*<;V<<\x04O@-K\x03<\x01&\x014'>\x03&4.\x02'.\x01'\x16\x17\x16\a\x06\a\x06.\x01'.\x04'.\x03'&6&'.\x01'.\x01676\x16\a\x06\x167645.\x03'\x06\x17\x14#.\x01\x06'6&'&\x06\a\x06\x1e\x017676\a\"&'&6\x172\x16\x06\a\x06\a\x0e\x01\a\x0e\x01\x17\x1e\x03\x17\x167>\x0376\x17\x1e\x01\x06\a\x0e\x01\a\x06\a\x06'&\x17\x16\x17\x167>\x05\x16\x17\x14\x0e\x05\a\x0e\x02'&'&\a\x06\x15\x14\x0e\x02\x17\x0e\x01\a\x06\x16\a\x06'&'&76\a\x06\a\x06\x17\x1e\x01\x17\x1e\x01\x17\x1e\x01\x06\a\x1e\x02\x156'.\x027>\x01\x17\x167676\x17\x16\a\x06\a\x06\x16\x17>\x0176&6763>\x01\x16\x016&'&\x15\x16\x172\a\x0632\x05.\x02'.\x04\a\x06\x16\x17\x166'4.\x01\a\"\x06\x16\x17\x16\x17\x147674.\x01'&#\x0e\x01\x16\a\x0e\x02\x17\x16>\x017626\x01\x1e\x02\x0e\x05\a\x0e\x01\a\x0e\x01'.\x03'&#\"\x06\a\x0e\x03'.\x01'.\x04'&676.\x0167>\x017>\x015\x16\a\x06'&\a\x06\x17\x1e\x03\a\x14\x06\x17\x16\x17\x1e\x01\x17\x1e\x027>\x02.\x01'&'&\a\x06'&7>\x027>\x03767&'&67636\x16\x17\x1e\x01\a\x06\x17\x16\x17\x1e\x01\x17\x16\x0e\x01\a\x0e\x03'.\x04'&\x0e\x01\x17\x16\a\x06\x1667>\x017>\x01.\x01'.\x0167\x1e\x05\x02\x97\v\t\x04\x05\x13\x05\\\x04\x0f\n\x18\b\x03\xfe\x9b\x04\x04\x05\x03\x03\a\n\t\x04\x11\x04\x01\x02\x02\x01\x02\x03U7\x04\a\x03\x03\x02\a\x01\t\x01\nJ#\x18!W!\v'\x1f\x0f\x01\v\t\x15\x12\r\r\x01\x0e\"\x19\x16\x04\x04\x14\v'\x0f;\x06\b\x06\x16\x19%\x1c\n\v\x12\x15\r\x05\x11\x19\x16\x10k\x12\x01\t)\x19\x03\x01\"\x1c\x1b\x1d\x02\x01\t\x11\a\n\x06\x04\v\a\x11\x01\x01\x14\x18\x11\x14\x01\x01\x16\t\b'\x01\r\x05\n\x0e\x16\n\x1b\x16/7\x02*\x1b \x05\t\v\x05\x03\t\f\x14I\t,\x1a\x196\n\x01\x01\x10\x19*\x11&\"!\x1b\x16\r\x02\x02\x06\x06\v\a\r\x03\x1cO6\x16\x15*\x16\x03\x01\x1e\x1d\r\x12\x17O\b\x02\x01\x06\b\x15 \x04\x02\x06\x04\x05\x02\x02$.\x05(\x04\x14\xa8\t\x10\x03\x1f\x1e\b*\x0e.'\x04\r\x06\x01\x03\x14\n.x\x85,\x17\v\f\x02\x01\x16\t\x06\x15\x03\x17\x02\x02\x11\x02\x16\x0f$\x01CN\xfd\xa1\x03\v\x06\t\x02\x03\n\x03\x03\v\x03\x01\xa3\x02\t\x11\x06\x05\t\x05\x06\x02\x03\x0e*\x12\t\v\xb4\n\f\x03\x06\x04\x04\x03\x0e\x04\b\x026\x05\r\x03\x0f\t\t\x05\x03\x02\x01\n\x02\x04\x04\b\x0e\b\x01\x10\x0e\x027\x14\x16\x02\a\x18\x17%\x1a&\b&_\x1c\x11f&\x12\x17\n\"\x1e,V\x13L\x14,G$3\x1c\x1d\xa4@\x13@$+\x18\x05\n\"\x01\x01\n\n\x01\n\x0eV\x11\x1e\x18\x155 3\"\t\r\x12\x02\f\x05\x04\x01\"\x03\x03\"\x14\x81#\x18dA\x17++\x03\x12\x14\ny0D-\v\x04\x03\x01\x01\x12\x1e\a\b%\x16&\x14n\x0e\f\x04\x024P'A5j$9E\x05\x05#\"c7Y\x0f\b\x06\x12\v\n\x1b\x1b6\"\x12\x1b\x12\t\x0e\x02\x16&\x12\x10\x14\x13\n8Z(;=I50\v' !!\x03\x0e\x01\x0e\x0f\x1a\x10\x1b\x04e\x01\x13\x01\x06\f\x03\x0e\x01\x0f\x03\v\r\x06\xfeR\x01\b\x11\x05\x05\b\v\x01\x01\x10\n\x03\b\x04\x05\x03\x03\x02\xfe\x9a\x12\x18\x0f\x19\x1b\x10\x1d\n\"\a+\x050n\x14\x14?\xa2t(\x02\x04-z.'<\x1f\x12\f\x01>R\x1e$\x16\x15A\"\b\x03\x1e\x01\x0124\x01\x03B\x19\x13\x0f\a\x04@\x05\x1e(\x15\t\x03\b~\x0f\t\x03\x04\a9B\x01\x019\x1f\x0f,\x1f\x02\x03\v\t\x01\x1d\x13\x16\x1e\x01*$\x04\x0f\x0e\f\x17\x01\x0e\x1a\x05\b\x17\x0f\v\x01\x02\x11\x01\f\t\x11\t\x0e\x06\x03\v\r\x03\x06\x1f\x04\x13\x04\x05\a\x02\x04\x04\x0f\x17\x01\x01\f\x10\x13\x0f\t\x04\t\x02\x05\x05\x04\x06\x03\a\x01\x0e<\x1a\f\v>\x1f\t\x03\a\x19?0D\x1d\x06\xa89\x12f\b\x18\x15\x1f?\x1c\x1c\x13\x01\x01\x04Ae\f \x04\x17\x87\t\x0f.(\x03\x0f;1.\x18D\b\x10\b\x02\x05\t\a4\x10\x0fH&\b\x06.\x19C\x17\x1d\x01\x13t \x15iY\x1a\x12% \v\x03*\x11\x1a\x02\x02\t\x05\x01\x0f\x14\xc2\b\a\x03\x04\x03\n\x06\a\x01\x02\x107\x04\x01\x12\xe0\v\x11\b\x01\x04\x04\x01\x04\x1b\x03\x05\x02\xea\x02\x06\b\x02\x0f\x01\r\r\x06\x04\r\x05\x06\x03\x06\f\x03\x01\x04\xfa\xc8\f\x19\x17\x16\x16\x11\x14\r\x12\x04\x13J\x1b\x10\a\x12\t\x1d\x16\x11\x01\x01\x03\x01\x01\x1c \x19\x01\x01<\r\x04\v\a\f\x11\v\x17W\v\x100%$\t\f\x04\n\x12\"\"I!\x14\x05\x03\r\x0f*\x06\x18\f\x16\v\x0fD\x0e\x11\t\x06\x19\b\x06 \x0e\x03\x06,4A'\x11\xbe4J\"\t\x18\x10\x16\x1d.0\x12\x15f6D\x14\x8f4p\xc6Z{+\x15\x01\x1d\x1b*\x9fD_wqi;\xd0W1G(\x02\x02\"%\x1e\x01\x01\b\x13\f\x1d\x05%\x0eT7F}AG\x05!1#\x19\x12% \x19\v\vJG\f\x1f3\x1e\x1b\v\x0f\x00\b\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00 \x00'\x00.\x002\x00>\x00V\x00b\x00\x00%&\x03#\a\x0e\x04\a'\x1632\x03&'\x04!\x06\x15\x14\x16\x17>\x03?\x01>\x01'&'\x0e\x01\a \x05&\a\x16\x17>\x01\x01\"\a6\x05&#\"\a\x16\x17>\x04\x13&'\a\x0e\x04\a\x16\x17\x1e\x01\x17>\x012\x1e\x04\x176\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00*b\x02\x02\x106\x94~\x88#\x0f\xb8\xea\x84=\x15 \xfe\xc9\xfe\x96\x01XP2\x93\x8a{&%\x04\x12gx|\x8a\xc0 \x01.\x03\xdc\xd2\xc7W)o\x94\xfc\xf1\x01\x01\x01\x02O\xb9\xf8LO\x83sEzG<\x0f\xe4\x03\x92\x01\t\x14CK}E\x19\x13\x02\t\x03$MFD<5+\x1e\nz\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a$\xf1\x01\x01\x01\x06\x15MW\x8eM\v\x96\x02\x931>]\a\x0e|\xe1YY\x9b^D\x0e\r\x01\x05\xd6եA\xf2\x97\xef<\x1f\xef\xe6K\xe5\x03m\x01\x01\x91\xa4\x13\xaa\xd4\x1aE6<\x15\xfe\"\xe8\xb2\x01\f\x19@9I\x1c5*\x05\x18\x05\x05\x04\x03\x05\x06\a\x05\x02\xc8\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00>\x00^\x00\x00\x014.\x03/\x01.\x045432\x1e\x0332654.\x01#\"\x0e\x02\x15\x14\x1e\x02\x1f\x01\x16\x17\x16\x15\x14\x06#\".\x03#\"\x06\x15\x14\x1632>\x02\x05\x14\x06#\"'\x06#\"$&\x02547&54632\x17632\x04\x16\x12\x15\x14\a\x16\x04\x95':XM1h\x1e\x1c*\x12\x0f\x90+D($,\x1a/9p\xac`D\x80oC&JV<\x92Z\x16 PA3Q1*2\x1d23\xf4\xa9I\x86oB\x01kែhMI\x8f\xfe\xfb\xbdo\x10PែhMI\x8f\x01\x05\xbdo\x10P\x01\xd92S6,\x18\v\x18\a\a\x10\x10\x1a\x11M\x18!\"\x18@-7Y.\x1f?oI=[<%\x0e$\x16\x0e\x14('3 -- <-\\\x83%Fu\x90\x9f\xe1P\x10o\xbd\x01\x05\x8fIMh\x82\x9f\xe1P\x10o\xbd\xfe\xfb\x8fIMh\x00\x00\x00\x03\x00,\xff\x80\x04\xcb\x06\x00\x00#\x00?\x00D\x00\x00\x0176&#!\"\x06\x15\x11\x147\x01>\x01;\x01267676&#!\"&=\x01463!267\x06\n\x01\a\x0e\x04#!\"\a\x06\x01\x0e\x01'&5\x11463!2\x16\a\x036\x1a\x01\x03\xe8%\x05\x1c\x15\xfd8\x17\x1f\x06\x01#\x17\x1e!\xef\x16\x1e\x03\x18\r\x04\x1f\x15\xfe\xda\x1d&&\x1d\x01Z\x12\"\xe6\x0fM>\x04\x06\x06\x16\x1b2!\xfe\xf1\r\t\b\xfe^\x16I\f7LR\x03x_@\x16\x9e\x04>M\x04N\xc2\x17\"\"\x14\xfb\xb3\a\x06\x01`\x1a\x0f\x1d\x0f\x82=\x15&&\x1d*\x1d%\x1b\xeeI\xfe}\xfe\xc7\x11\x16\x15,\x16\x14\n\t\xfe\x1b\x19\a\t\x16L\x05\x827_jj\xfc\xea\x11\x019\x01\x83\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00%\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\xc0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\x02\xa0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\xa0&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x04\x00\x0e\x12\x12\x0e\xfc\x00\x0e\x12\x12\x01\x8e\x02\x80\x0e\x12\x12\x0e\xfd\x80\x0e\x12\x12\x03\x0e\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x00\x05\xe0\x001\x009\x00\x00\x01\x14\x06#\"'\x03#\x15\x13\x16\x15\x14\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x135#\x03\x06#\"&547\x0163!2\x17\x01\x16\x00\x14\x06\"&462\x05\x008(3\x1d\xe3-\xf7\t&\x1a\xc0B.\xa0.B\xc0\x1a&\t\xf7-\xe3\x1d3(8\x10\x01\x00Ig\x01\x80gI\x01\x00\x10\xfe`\x83\xba\x83\x83\xba\x01\xe0(8+\x01U\x84\xfee\x0f\x12\x1a&\xfe\xf0.BB.\x01\x10&\x1a\x12\x0f\x01\x9b\x84\xfe\xab+8(\x1d\x18\x01\x80kk\xfe\x80\x18\x03`\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x00\x04\x00\x05\xe0\x00%\x00-\x00\x00\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11463!2\x16\x00\x14\x06\"&462\x04\x008P8@B\\B@B\\B@8P8pP\x02\x80Pp\xfe\xe0\x83\xba\x83\x83\xba\x03@\xfe`(88(\x01`\xfcp.BB.\x01\xd0\xfe0.BB.\x03\x90\xfe\xa0(88(\x01\xa0Ppp\x01ͺ\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00!\x00\x00%\x01>\x01&'&\x0e\x01\a\x06#\"'.\x02\a\x0e\x01\x16\x17$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x05\x01^\x10\x11\x1d/(V=\x18$<;$\x18=V).\x1d\x11\x10\x04X\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xea\x01\xd9\x16J`\x1f\x1a\x01\"\x1c((\x1c\"\x01\x1a\x1f`J\x16\x8e\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00,\xff\x00\x06\xd4\x05\xff\x00\x0f\x00I\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01%\x06\a\x05\x11\x14\a\x06'%\a\x06\"/\x01\x05\x06'&5\x11%&'&?\x01'&767%\x11476\x17\x05762\x1f\x01%6\x17\x16\x15\x11\x05\x16\x17\x16\x0f\x01\x17\x16\x05\xc0[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01o\x04\x10\xfe\xdc\r\x0f\x0e\xfeܴ\n \n\xb4\xfe\xdc\x0e\x0f\r\xfe\xdc\x10\x04\x05\t\xb4\xb4\t\x05\x04\x10\x01$\r\x0f\x0e\x01$\xb4\t\"\t\xb4\x01$\x0e\x0f\r\x01$\x10\x04\x05\t\xb4\xb4\t\x02\v\xea՛[[\x9b\xd5\xea՛[[\x9b5\x0f\x05`\xfe\xce\x10\n\n\x06^\xf8\r\r\xf8^\x06\n\n\x10\x012`\x05\x0f\x11\f\xf8\xf8\r\x10\x0f\x05`\x012\x10\n\n\x06^\xf8\f\f\xf8^\x06\n\n\x10\xfe\xce`\x05\x0f\x10\r\xf8\xf8\f\x00\x02\x00\x00\xff\x80\x05\xbe\x05\u007f\x00\x12\x001\x00\x00%\x06#\"$\x02547\x06\x02\x15\x14\x1e\x0232$%\x06\x04#\"$&\x0254\x126$76\x17\x16\a\x0e\x01\x15\x14\x1e\x013276\x17\x1e\x01\x04\xee68\xb6\xfeʴh\xc9\xfff\xab킐\x01\x03\x01&^\xfe\x85\xe0\x9c\xfe\xe4\xcezs\xc5\x01\x12\x99,\x11\x12!V[\x92\xfa\x94vn)\x1f\x0e\a\xe9\t\xb4\x016\xb6\xc0\xa5<\xfe\xaeׂ\xed\xabf{\xc3\xcb\xf3z\xce\x01\x1c\x9c\x99\x01\x17\xcc}\x06\x02))\x1fN\xcfs\x94\xfa\x923\x12\x1f\x0e(\x00\x03\x00@\xff\x80\x06\xc0\x05\x80\x00\v\x00\x1b\x00+\x00\x00\x004&#!\"\x06\x14\x163!2\x01\x11\x14\x06#!\"&5\x11463!2\x16\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04@&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a\x02f&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&@&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\x02\xa64&&4&\x01\x00\xfc@\x1a&&\x1a\x03\xc0\x1a&&\x01\xa6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x02\x00 \xff\xa0\x06`\x05\xc0\x00B\x00H\x00\x00\x00\x14\x06+\x01\x14\a\x17\x16\x14\a\x06\"/\x01\x0e\x04#\x11#\x11\".\x02/\x01\a\x06#\"'.\x01?\x01&5#\"&46;\x01\x11'&462\x1f\x01!762\x16\x14\x0f\x01\x1132\x01!46 \x16\x06`&\x1a\xe0C\xd0\x13\x13\x126\x12\xc6\x05\x14@Bb0\x803eI;\x0e\x0f\xb7\x14\x1c\x18\x13\x13\x03\x11\xca:\xe0\x1a&&\x1a\xe0\xad\x13&4\x13\xad\x03L\xad\x134&\x13\xad\xe0\x1a\xfeF\xfd\x80\xbb\x01\n\xbb\x02Z4&\xabw\xd1\x134\x13\x13\x13\xc5\x05\x10) \x1a\x03\x80\xfc\x80\x1b''\r\x0e\xcf\x15\x10\x125\x14\xe3r\xa0&4&\x01&\xad\x134&\x13\xad\xad\x13&4\x13\xad\xfe\xda\x02\x00\x85\xbb\xbb\x00\x00\x01\xff\xff\x00\x01\a}\x04G\x00\x85\x00\x00\x01\x16\a\x06\a\x0e\x02\x1e\x02\x17\x16\x17\x16\x17\x1e\x02\x0e\x01#\x05\x06&/\x01.\x03\a\x0e\x04\x17\x14\x06\x0f\x01\x06\a#\x06.\x02/\x01.\x03\x02'&4?\x0163%\x1e\x01\x1f\x01\x16\x17\x1e\x01\x1f\x01\x1e\x0327>\x04'.\x01/\x01&'&7676\x17\x16\x17\x1e\x03\x14\x0e\x01\x15\x14\x06\x1e\x02\x17\x1e\x01>\x02767>\x01?\x01>\x02\x17%6\x16\x17\a}\x17\xad\x18)(\x1e\x1f\a\x13.\"\x04\x01\x8d2\x03\a\a\b*&\xff\x00\x18@\x14\x14\x1eP9A\x18\x03\n\x18\x13\x0f\x01\a\x04\x04\x12#sG\x96q]\x18\x19\n#lh\x8d<\x06\x03\x04\x0f*\x01\x12\f\x16\x05\x05\x10\b\x144\x0f\x10\x1d6+(\x1c\r\x02\x06\x12\t\n\x05\x02\x0e\a\x06\x19<\r\x12\x10\x165\xbaR5\x14\x1b\x0e\a\x02\x03\x02\x01\x06\x11\x0e\b\x12\"*>%\"/\x1f\t\x02\x04\x1a+[>hy\n\x0f\x03\x03\x01\x03\x03\x01\x02\x05\x0f\t\x00\a\x00\x00\xff\xaa\x06\xf7\x05K\x00\n\x00\x15\x00!\x00/\x00U\x00i\x00\u007f\x00\x00%6&'&\x06\a\x06\x1e\x01676&'&\x06\a\x06\x17\x166\x17\x0e\x01'.\x017>\x01\x17\x1e\x01%.\x01$\a\x06\x04\x17\x1e\x01\x0476$%\x14\x0e\x02\x04 $.\x0154\x1276$\x17\x16\a\x06\x1e\x016?\x0162\x17\x16\a\x0e\x01\x1e\x01\x17\x1e\x02\x02\x1e\x01\a\x0e\x01'.\x0176&\a\x06&'&676%\x1e\x01\a\x0e\x01.\x0176&'.\x01\a\x06.\x01676\x16\x02\xa3\x15\x14#\"N\x15\x16\x12DQt\b\t\r\x0e\x1d\a\x11\x1e\x0e\x1e\xb5-\xe2okQ//\xd1jo_\x01\v\t\xa0\xfe\xff\x92\xdf\xfe\xdb\x0e\t\xa0\x01\x01\x92\xdf\x01%\x01&J\x90\xc1\xfe\xfd\xfe\xe6\xfe\xf4Ղ\x8b\x80\xa9\x01YJA-\x04\x06\x0e\x0f\x06\x06\x8b\xd6.--\x02\x05\x0e\n\f9\\DtT\x19\x13\b+\x17\x17\x16\a\x14X?\x18*\x04\x05\x1a\x18<\x01UW3'\t26\x1a\b\x1c$>>\xacW\x1c0\f\x1f\x1c{\xf2\xfc\"F\x0f\x0e\x1a!\"E \x1b\x9b\r\x1b\x05\x05\v\r\x1f\x0e\x05\v^f`$\"\xb9_]\\\x1b\x1d\xb5<`\x94F\x0e\x17\xed\x92`\x94F\x0e\x17\xed\x8eD\x8f\x83h>Cw\xb7ls\x01\x04\x80\xa9\x86J@\x91\x0e\f\x02\x03\x02\x02;=?s\r\x0e\v\x04\x04\x12:i\x02_^{8\x17\x16\a\b+\x17?`\r\x05\x1a\x18\x18)\x05\rO`\xfds\x1b\x1a\x122\x1bR\xb4DE5\x12\x06\x1f8/\x06\x1aK\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05r\x00\t\x00\x13\x00\x1d\x00\x00\x05\x06#\"'>\x017\x1e\x01\x01\x11\x14\x02\a&\x114\x12$\x01\x10\a&\x025\x11\x16\x04\x12\x04m\xab\xc5ī\x8a\xc3\"#\xc3\xfe\x9b\xfd̵\xa7\x01$\x045\xb5\xcc\xfd\xb3\x01$\xa7\"^^W\xf8\x90\x90\xf8\x05=\xfe\x1b\xfc\xfeac\xd7\x01\x18\xbb\x01E\xd6\xfd*\xfe\xe8\xd7c\x01\x9f\xfc\x01\xe5\x1e\xd6\xfe\xbb\x00\x00\x00\x01\x00\x00\xff\x00\x05z\x06\x00\x00k\x00\x00\x01\x0e\x03.\x03/\x01\x06\x00\a\"&4636$7\x0e\x02.\x03'>\x01\x1e\x02\x1767\x0e\x02.\x05'>\x01\x1e\x05\x1f\x0165.\x0567\x1e\x04\x0e\x02\x0f\x01\x16\x14\a>\x05\x16\x17\x0e\x06&/\x01\x06\a>\x05\x16\x05z X^hc^O<\x10\x11q\xfe\x9f\xd0\x13\x1a\x1a\x13\xad\x01+f$H^XbVS!rȇr?\x195\x1a\a\x16GD_RV@-\x06F\u007fbV=3!\x16\x05\x04\f\b\x1bG84\x0e&3Im<$\x05\x06\x14\x12\b\a\x01\x01\x03\x0e/6X_\x81D\x02'=NUTL;\x11\x11\x172\x06\x18KPwt\x8e\x01\xb1Pt= \x03\x0e\x1e\x19\n\n\xe4\xfe\xf9\x01\x1a&\x19\x01ռ\x0e\x12\b\r,J~S/\x14#NL,\x83\xa0\x01\x03\x02\x03\x11\x1d8JsF\x1c\x11\x13);??1\x0f\x10zI\x06\x14EJpq\x8dD\x19IPZXSF6\x0f\x0f\x04\\\x1a\a\x17?5:\x1f\x02\x17N\u007fR=\x1e\x12\x01\x03\x03\x03\x93\x88\a\x17;.&\x021\x00\x04\x00\x15\xff\x00\x04\xeb\x05\x00\x00\f\x00\x10\x00\x14\x00\x1e\x00\x00\x01\x15\x14\x06+\x01\x01\x11!\"&=\x01\x01\x15!\x11\x01\x15!\x11%\x15!5463!2\x16\x04\xebsQ9\xfe\xfc\xfd\xefQs\x04\xd6\xfb*\x04\xd6\xfb*\x04\xd6\xfb*sQ\x03NQs\x01\x1bBUw\xfe\xf3\x01\rwUB\x01F\xff\x00\xff\x01H\xff\x00\xff\x8cCCTww\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x00\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\t\xfe\xc0\t\x0e\r\x13\xfe\xa0\r\x13\x13\r\x01`\x12\x0e\f\f\x01?\xa9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x8e\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\xab\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&47\x01632\x16\x1d\x01!2\x16\x12\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\x13\r\xfe\xa0\x12\x0e\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x01`\r\x13\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xe0\xc0\r\x13\xc0\x0e\x12\n\x01?\t\x1c\t\x01@\t\x13\r\xc0\x13\xfe\xff\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00&\x1a\x14\x11\xfe@\x1b\x1b\x01\xc0\x11\x14\x1a&\x01\x00\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xc0\xfd\x80\x1a&\f\x01@\x13B\x13\x01@\f&\xfc\xc6\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x1f\x00\x00\x00\x14\x06\"&462\x12 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4*\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\x01 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06]\x05\xe0\x00\x15\x006\x00\x00\x01\x17\x06\x04#\"$\x0254\x127\x17\x0e\x01\x15\x14\x0032>\x01%\x17\x05\x06#\"'\x03!\"&'\x03&7>\x0132\x16\x15\x14\x06'\x13!\x15!\x17!2\x17\x13\x03\xfff:\xfeл\x9c\xfe\xf7\x9bѪ\x11z\x92\x01\a\xb9~\xd5u\x02\x1b:\xff\x00\r\x10(\x11\xef\xfe(\x18%\x03`\x02\b\x0eV6B^hD%\x01\xa7\xfei\x10\x01\xc7(\x11\xe4\x01]̳ޛ\x01\t\x9c\xb5\x01*>\x836߅\xb9\xfe\xf9\x82\xdd\x1ar\x80\a#\x01\xdd!\x18\x03\v\x11\x193?^BEa\a\xfe߀\x80#\xfe9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x016'&\x03632\a\x0e\x01#\"'&'&\a\x06\a\x0e\x01\a\x17632\x17\x1e\x01\x17\x1632\x13\x12\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\f\n\xab\xe7Q,&U\v\x04\x8c#+'\r \x1e\x82;i\x1bl\x1b4L\v92\x0f<\x0fD`\x9d\xe2\xdc\xfa\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x82\xd8\x06\b\xfe\xf3\x13`9ܩ6ɽ\f\a]\x18`\x18C4\xb37\xdb7\xb3\x01&\x01\x1b\x01\u007f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x01\x00\x00\x00\x00\x04\x80\x05\x80\x00D\x00\x00\x01\x14\x02\x04+\x01\"&5\x11\a\x06#\"'&=\x014?\x015\a\x06#\"'&=\x014?\x01546;\x012\x16\x1d\x01%6\x16\x1d\x01\x14\a\x05\x15%6\x16\x1d\x01\x14\a\x05\x116\x00546;\x012\x16\x04\x80\xbd\xfe\xbc\xbf\xa0\x0e\x12\xd7\x03\x06\n\t\r\x17\xe9\xd7\x03\x06\n\t\r\x17\xe9\x12\x0e\xa0\x0e\x12\x01w\x0f\x1a\x17\xfew\x01w\x0f\x1a\x17\xfew\xbc\x01\x04\x12\x0e\xa0\x0e\x12\x02\xc0\xbf\xfe\xbc\xbd\x12\x0e\x02cB\x01\x06\n\x10\x80\x17\bG]B\x01\x06\n\x10\x80\x17\bG\xfa\x0e\x12\x12\x0e\xb5t\x05\x14\x10\x80\x17\by]t\x05\x14\x10\x80\x17\by\xfe\x19\r\x01\x14\xbe\x0e\x12\x12\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfe\xa0\x12\x0e@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x80\x05\x00\x00'\x00/\x00?\x00P\x00\x00\x01\x06+\x015#\"&547.\x01467&546;\x01532\x17!\x1e\x01\x17\x1e\x02\x14\x0e\x01\a\x0e\x01\a7\x16\x14\a\x1764'\x01!\x06\a\"\x06\x0f\x01\x01\x0e\x01+\x01\x0332\x03#\x1332\x16\x17\x01\x1e\x043\x05!&\x02ln\x9e\x80@\r\x13\a:MM:\a\x13\r@\x80\x9en\x04Y*\x81\x10Yz--zY\x10\x81*\x0655QDD\xfbU\x03\xf7\xd9\xef9p\x1b\x1c\xfe\xe0\x1aY-`]\x1d\x9d\x9d\x1d]`.X\x1a\x01 \x04\x0e/2I$\x01\xc8\xfc\tt\x01\xa0@@/!\x18\x19\x02\x11\x18\x11\x02\x19\x18!/@@\a\x16\x03\x0f3,$,3\x0f\x03\x16\a\xfc$p$\x1e0\x940\xfe\xd6&*0\x18\x18\xfe\xe0\x1a&\x01\xd0\x01\xe0\x01\xd0&\x1a\xfe\xe0\x04\r!\x19\x15P@\x00\x02\x00\x00\xff\x80\x06\x80\x06\x00\x00R\x00V\x00\x00\x012\x16\x15\x14\x0f\x01\x17\x16\x15\x14\x06#\"&/\x01\x05\x17\x16\x15\x14\x06#\"&/\x01\a\x06#\"&546?\x01\x03\a\x06#\"&546?\x01'&54632\x16\x1f\x01%'&54632\x16\x1f\x017632\x16\x15\x14\x06\x0f\x01\x1376\x01%\x03\x05\x05\xef>S]\xac8\aT;/M\x0f7\xfe\xca7\bT\x057%>\x01\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x03\xe0\x1f!\"\xc55bBBb/\xbe/\f*\n8(\x03@(87)\xfc\xc0(8=%/\xb5'\x03\x1c\x0e\x1c\x13\x18\x15\x14\x15\x18\x13\x1c\x0e\x1c\x03\x01\v#?\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfb\xe0\x01\xb4#\x14\x16~$EE y \b&\b\xfeL(88\x02e):8(%O\x19 r\x1a\x02\x13\t\x11\t\n\x05\x05\n\t\x11\t\x13\x02\xae\x17O\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x05\x00?\x00G\x00Q\x00a\x00q\x00\x00\x1347\x01&\x02\x01\x14\x0e\x03\a\x03\x0167>\x01&\x0f\x01&'&\x0e\x01\x1e\x01\x1f\x01\x13\x03\x0167>\x01&\x0f\x01\"$32\x04\x17#\"\x06\x15\x14\x1e\x06\x17\x16\x05\x13\x16\x17\x06#\"'\x01\x16\x15\x14\x02\a\x13654\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x00 $6\x12\x10\x02&$ \x04\x06\x02\x10\x12\x16\u007fC\x01o\xc4\xee\x05\b\x05\x0f\b\x1b\x04L\xfe\xea.*\x13\x0e\x13\x13\xcdK\u007f\f\x11\x06\x03\x0f\fPx\xa8\xfe\xe8.*\x13\x0e\x13\x13\xcd\a \ni\x01SƓ\x01\vi\n7J\x04\x04\f\x06\x12\a\x16\x03?\xfe\x06\xed\x01\x04~\x81pi\x03{_Я\xeb;\xfc\xa2\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01U\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3刈\xe5\x02\x80\xa3\x96\xfc\x13_\x01t\x01\b\x13'<\x1cZ\r\xff\x00\x03:\x03\x05\x02!\x1d\x01\n\x01\t\x01\f\x12\x13\x0e\x01\b\xfe\xb8\xfe\b\x03@\x03\x05\x02!\x1d\x01\n\x01\xa0\xbbj`Q7\f\x18\x13\x1b\x0f\x1e\f$\x05k\xd3\xfdy\x06\x05, \x04R\xae\xc3\xd1\xfe\x9ff\x02\xa6\xa9k*\x024\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xf9\xb7\x88\xe5\x01=\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3\xe5\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x06\x00\x00\x12\x00\x1b\x00\x00\x01\x11\x05&$&546$7\x15\x06\x04\x15\x14\x04\x17\x11\x01\x13%7&'5\x04\x17\x04>\xfe\xf0\xe4\xfe\x8c\xd6\xc9\x01]\xd9\xd9\xfe\xe9\x015\xea\x03\xad%\xfd\xf3\x93w\xa1\x01\x15\xcc\x06\x00\xfa\x00\x80\x14\xa4\xfd\x92\x8c\xf7\xa4\x1a\xac&\xe0\x8f\x98\xe6\x1e\x05P\xfe?\xfezrSF\x1d\xac!|\x00\x00\x00\x03\x00\x00\xff\x00\a\x80\x06\x00\x00\f\x00&\x000\x00\x00\t\x01\x15#\x14\x06#!\"&5#5\x01!\x113\x11!\x113\x11!\x113\x11!\x1132\x16\x1d\x01!546;\x01\x052\x16\x1d\x01!5463\x03\xc0\x03\xc0\x80)\x1c\xfa\n\x1c)\x80\x01\x00\x01\x00\x80\x01\x00\x80\x01\x00\x80\x01\x00;\x1c)\xf9\x80)\x1c;\x06;\x1c)\xf8\x80)\x1c\x06\x00\xfe\x80\x80\x1a&&\x1a\x80\xff\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00&\x1a@@\x1a&\xc0&\x1a\x80\x80\x1a&\x00\x00\x02\x00\x00\xff\x80\t\x00\x05\x80\x00\r\x006\x00\x00\x01\x13\x16\x06\x04 $&7\x13\x05\x1627\x00\x14\a\x01\x06\"'%\x0e\x01\a\x16\x15\x14\a\x13\x16\a\x06+\x01\"'&7\x13&54767%&47\x0162\x17\x01\x06\xee\x12\x04\xac\xfe\xd6\xfe\xa4\xfe֬\x04\x12\x02>\x164\x16\x04P\x16\xfb\xa0\x04\f\x04\xfdt+8\x06?::\x02\n\t\x0f\xc0\x0f\t\n\x02::A\vW\xfe\xb3\x16\x16\x04`\x04\f\x04\x04`\x02\xbc\xfe\xc4EvEEvE\x01<\xb5\a\a\x02\x10.\b\xfe\xa0\x01\x01\xce\"\x9be$IE&\xfeO\x0e\v\v\v\v\x0e\x01\xb1&EI&\xcf{h\b.\b\x01`\x01\x01\xfe\xa0\x00\x01\x00m\xff\x80\x05\x93\x06\x00\x00\"\x00\x00\x01\x13&#\"\a\x13&\x00\x02'\x16327\x1e\x01\x12\x17>\x037\x163271\x0e\x03\a\x06\x03[\r>+)@\r(\xfe\xff\xb0]:2,C?\x8d\xc1*%\x91Zx/658:\x1c@#N\n\x92\x02C\xfd=\v\v\x02\xc3E\x01\xc5\x01(\x8b\x0f\x0fo\xed\xfe\xc4E=\xe9\x93\xcdW\x0e\x0e'c:\x86\x11\xf8\x00\x00\x01\x00\x00\xff\x80\x05\xe1\x05\x80\x00#\x00\x00\x01!\x16\x15\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x10\x1e\x0132>\x037!\x03\x00\x02\xd5\f\xb6\xfe\xafڝ\xfe\xe4\xceyy\xce\x01\x1c\x9d\x01,\xd7\xd1{\xb7\x81ۀ\x80ہW\x92^F!\x06\xfeL\x02\xeeC=\xd9\xfe\xab\xc0y\xce\x01\x1c\x01:\x01\x1c\xcey\xc9\xc9w\x82\xdf\xfe\xf8߂0H\\R%\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x19\x00\"\x00N\x00^\x00\x00\x01\x16\a\x06 '&762\x17\x1632762$\x14\x06\"&5462\x05\x14\x06\"&462\x1674&\"\a&'\x13\x17\x14\x16264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x0432$54'>\x01$\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04G\x10\x10>\xfe\xee>\x10\x10\x06\x12\x060yx1\x06\x12\xfe\xd34J55J\x01\xbf5J44J5\xfbFd$\x82\xb5?\xc84J55%6\x1a\xdd\x13\x06E\xb4\x81#42F%\x1f\x06\x01\x18\xc5\xc6\x01\x18\a\x1e$\x01f\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01q\x10\x0f>>\x0f\x10\x06\x0611\x06\xd4J44%&4Z%44J54R1F$Z\x06\x01\x1b-%45J521\x05\x15\xfe\xc8\aZ%F1#:\x0f\x1b\x1d\x8e\xcaʎ \x19\x0f9\xbb\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x19\x00#\x00Q\x00a\x00\x00\x01\x16\a\x06\"'&762\x17\x162762%\x14\x06\"&5462\x16\x05\x14\x06\"&5462\x1674&#\"\a&'7\x17\x1e\x013264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x1632654'>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xab\r\r5\xec5\r\r\x05\x10\x05*\xce*\x05\x10\xfe\xfe.>.-@-\x01R.>.-@-\xd7<+*\x1fq\x9a6\xab\x01-\x1f -- 0\x15\xbd\x11\x04<\x9ao\x1e,+< \x1a\x05\xf0\xa9\xaa\xf0\x06\x19\x1f\x013\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x97\r\r55\r\r\x06\x06**\x06\x96\x1f..\x1f -- \x1f..\x1f --G*<\x1fN\x04\xf3' ,-@-+*\x05\x12\xfe\xf4\x06M <*\x1e2\r\x19\x17z\xad\xadz\x19\x18\r1\x01\xe4\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x000\x00<\x00\x00\x01754&\"\x06\x15\x11\x14\x06\"&=\x01#\x15\x14\x163265\x114632\x16\x1d\x01\x055#\x15\x14\x06#\"&=\x01\a'\x15\x14\x1626\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03bZt\xa0t\x1c&\x1b\x97sRQs\x1b\x14\x13\x1b\x01\x89\x96\x1b\x14\x13\x1bZOpoO\xfe\xe5\x14\x1b\x1b\x14xzRrqP\x01\x18\x13\x1c\x1c\x136\xdfz~\x14\x1b\x1c\x13{\x1a\x1c{Prr\x01\xad\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\xa3\a\x80\x05]\x00\x1e\x000\x00\x00\x0154&\"\x06\x15\x11\x14\x06#\"&5\x11!\x11\x14\x16265\x114632\x16\x1d\x01\a\x05!\x11\x14\x06#\"&5\x11\x177\x11\x14\x16265\x04&\x02'&\a\x0e\x01#\".\x01'&'\x04#\"&5467%&4>\x037>\x0132\x16\x17632\x16\x15\x14\x06\x0f\x02\x06\x1632654.\x02547'654'632\x1e\x05\x177\x0e\x03\x177.\a'.\x02*\x01#\"\a>\x057\x1e\x02?\x01\x15\x1767>\b?\x01\x06\a\x0e\x01\a\x0e\x02\a\x1e\x01\x15\x14\x03>\x0132\x1e\x03\x17\x06#\"'\x017\x17\a\x01\x16\x15\x14\x0e\x03\a'>\x023\x01\a'>\x0132\x133\x17\a\x015\x15\x0f\x01?\x02\x04\xc6K\x89cgA+![,7*\x14\x15\n\x18\f2\x03(-#\x01=\x05\x11\a\x0e\x06\n\a\t\x04\a\x0f\x1a\x12/\x0e~[\x10(D?\x1dG\b\f \x16\f\x16\xf7|\x1c,)\x19\"\x0e#\v+\b\a\x02)O\xfc\xb4\x0e8,\x11\x03+\xf7'\xb96\t\x1b\x1d\x17\x19\x02y{=@\xfe\xf90mI\x01\xa1\x03#938\x04\a\x15OA\x1c\xfeE`\x06\n-\f\x13\xd3\x1f\n)\x03y\x01\x02\x01\x02\x01\x02_\x03/FwaH8j7=\x1e7?\x10%\x9c\xad\xbc\x95a\x02\x04\x05\t\x05%\a\x1d\f\x1e\x19%\x16!\x1a?)L\x0f\x01\x15\n\x10\x1fJ\x16\r9=\x15\x02\x1a5]~\x99\x14\x04\x1ap\x16\x10\x0f\x17\x03j\x0e\x16\r\n\x04\x05\x02\x01\r \x11%\x16\x11\x0f\x16\x03(\x10\x1a\xb7\xa01$\"\x03\x14\x18\x10\x12\x13,I\x1a \x10\x03\x0e\r$\x1f@\x1c\x19((\x02\v\x0f\xd6\x05\x15\b\x0f\x06\n\x05\x05\x02\x03\x04\x01+\x1e!\x1a.\x1bS\t\t-\x1c\x01\x01L\x01__\x15$'\x17-\x119\x13L\x0f\t5V\xa5\xc6+\x03\t\n\t\x136\a\v\xfcT\x1a+\x1f6.8\x05-\v\x03$\f\xb10\xfe\xd0\x0f\x01\a\x0f\v\b\a\x01+\x02\r\a\x02t\x14\x11\x01\f\xfd|S\f\x061\x01\x01\x05\x02\x03\x04\x01\x00\x00\x04\x00\x00\xff\x12\x06\x00\x05\xee\x00\x17\x006\x00]\x00\x83\x00\x00\x05&\a\x0e\x01#\"'&#\"\a\x0e\x01\x17\x1e\x0167>\x0276'&'&#\"\a\x06\a\x06\x17\x1667>\a32\x1e\x01\x17\x1e\x0176\x014.\x02#\"\x0e\x01#\x06.\x03\a\x0e\x01\a\x06\x17\x1e\x0132>\x02\x17\x1e\x03\x17\x1667>\x017\x14\x02\x06\x04 $&\x0254>\x057>\x037>\x017\x16\x17\x1e\x01\x17\x1e\x06\x04\x8f\x05\x13\x1erJ\x81@\x05\b\v\x0f\a\x01\b\"kb2)W+\a\f,\x13\x14\x175/\x18\x1d1\x1a\x0e\t\x11\x17\x03\x0f\x06\x0e\t\x10\x0e\x13\v\x1b#\v\b\n\x05\n\x17\x01Z\n\x17-\x1e!\x80\x82$\x1bIOXp7s\xa4\x02\x02L\x1dCF9\x96vz \x1aNAG\x14#/ \x1c\x1d5|\xd0\xfe\xeb\xfe\xd0\xfe\xe6Հ';RKR/\x13\x0eJ#=\x1e$,\b\x819,\xac+\x15$UCS7'2\x13\x0e\x16\"1\x04\f\x06\x14\n \x1c\x03\x03\x04!\x1b\a\f\x84/\x0e\x0f\n\f,\x18\x14\b\a\x14\x02\r\x04\n\x04\x06\x03\x02\x0f\x0e\x0f\x11\x06\x04\f\x01/\x16--\x1cST\x01(::(\x01\x01\x9bep4\x14\x11AM@\x01\x01=I>\x01\x03\".)xΤ\xfe\xe7\xbfls\xc7\x01\x1c\xa0Y\xa7|qK@\x1d\n\b%\x14(\x18\x1cYQ\x9b&\x1dN\x1b\r\x18EHv~\xab\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00<\x00Z\x00x\x00\x00\x01\x0f\x02\x0e\x01'\x0e\x01#\"&5467&6?\x01\x17\a\x06\x14\x17\x162?\x03\x03\x17\a'&\"\x06\x14\x1f\x03\a/\x02.\x017.\x0154632\x16\x176\x16\x01\x14\x06#\"&'\x06&/\x017\x17\x16264/\x037\x1f\x02\x1e\x01\a\x1e\x01\x03\x14\x06\a\x16\x06\x0f\x01'764&\"\x0f\x03'?\x02>\x01\x17>\x0132\x16\x04.\xa0\x97\x1eA\xadU\x10pIUxYE\x16.A\f\x97\v%%%h%\x1e\x97\xa1\xbe\f\x98\f%hJ%\x1d\x98\xa0\x97\xa1\x97\x1eD,\x1bFZxULs\fT\xab\x03gxUJr\x0eV\xbbD\v\x97\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1d@/\x15Le\x02fL\x1a.C\f\x97\f%Jh%\x1e\x98\xa0\x98\xa1\x98\x1dC\xb8V\vsNUx\x01Ϡ\x98\x1e@.\x15FZyUHp\x10V\xaeA\f\x98\v%h&%%\x1e\x98\xa0\x02\x12\f\x98\f%Ji%\x1d\x98\xa0\x98\xa0\x98\x1eC\xb9W\x0fpIUybJ\x14/\xfb\x95Uy^G\x1c,D\f\x98\f%Jh%\x1e\x98\xa0\x98\xa0\x98\x1e@\xadU\vs\x04\x17Mt\vU\xb7C\f\x98\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1eC-\x1aKfy\x00\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00E\x00X\x00[\x00_\x00g\x00j\x00\x89\x00\xa3\x00\x00\x01\x06&/\x01&'.\x01'\x06\a\x06\a\x0e\x01'67>\x017>\x017&\a\x0e\x02\a\x06\x14\a\x06\a\x06'&'&'>\x0176763>\x017>\x02\x17\x16\a\x14\x0e\x01\a\x06\a\x17\x1e\x01\x17\x1e\x01\x03\x16\a\x06\a\x06#&'&'7\x1e\x0167672\x05\x17'\x01%\x11\x05\x01\x17\x03'\x03\x177\x17\x01\x05\x11\x01\x17\a'\x06\a\x06+\x01\"&'&54632\x1e\x01\x17\x1e\x013267>\x027\x01\x11%\x06\x04#\"'4'\x11676767\x11\x052,\x0132\x15\x11\x02\x8e\x01\x17\x14\x14,+\aD\x04CCQ\x18\x04\x1f\x03\x06L\x15\x81\x0e\x11D\x02\bf\b'\x1e\x02\x02\x01\x05\x1a\x17\x18\x12\n\x04\x01\x06%\v:/d\x02\nB\v\t\x19\x04\x04\x02\x03\x19\x1c\x03\x194@\f}\x05\x04\r\xcf\x03\a\f&\x1e\x1e\x1a\x17\x0e\x04\x01\x03!\x140$\x13\x11\x02\xbe?\x8b\xfb\xf8\x02\xb6\xfdJ\x04\xd9f\xb5d\xd8f-\xd3\xfe.\x02=\xfe\xfa\x9e6(\x82\x92:!TO\xf1?\b\n\b\x04\x1c!\x04I\xadG_\x90U\x0f\x1f%\n\x01\x95\xfc\xfa\x0e\xfd.\a\r\x05\x01\x03\x01\x05\x0fk*\x02.\x02\x01=\x01;\x04\x14\x01\xca\x03\a\b\t\x14\x1d\x055\x02gN_\x0f\x02\x04\x02\x04X\x18\xb6\x1b\x1e\x89\t\x01\"\x02\v\b\x01\x02\x11\x01\n\x05\a\a\x04\x11\x06\x11\x02\x06\x03\x10\x10#\x02#\x04\x03\n\x01\x01\f\x15\x0229\x052Q\x1c\x064\x02\x011\x01\xe0\x0f\r\x17\x0f\f\x03\x17\x0f\x1a\x03\x03\x04\x04\x0e\f\x02\x92\xe3*\xfd\x99\xe8\x04\b\xe9\xfd6\x1f\x02\x91\x1f\xfd\xe8\x1fnA\x03;\xb8\x01|\xfa\x11\r\xa0BS\x19\fN.\a\t\b\v\x0f\x12\x02%1\x1d$\a\x11\x15\x06\x04\x80\xfb\xc9\xf6\x06\xf3\r\x01\x02\x046\t\x01\x06\x05$\x0e\x01\x80\xc6nk\x15\xfe^\x00\f\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00'\x007\x00G\x00W\x00g\x00w\x00\x87\x00\x97\x00\xa7\x00\xb7\x00\xc0\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11463\x05\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x1f\x01\x1e\x01\x15\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x13\x11#\"&=\x01!\x11\x01 B^^B\x80B^^B\x05\xe0:F\x96j\xfc\xa0B^8(\x02\xa0(`\x1c\x98\x1c(\xfd \x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12`\xa0(8\xfd\x80\x04\x80^B\xfb\xc0B^^B\x04@B^\xa3\"vE\xfd\x00j\x96^B\x06\x00(8(\x1c\x98\x1c`(\xfb\x80\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x8e\x01\x008(\xa0\xfe\x00\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01/\x01?\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x05@\x1a&&\x1a\xfb\x00\x1a&&\x1a\x01\xc0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x06\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xb2@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfb\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x02\x00@\xff\x10\x04\xc0\x05`\x00\x1f\x00'\x00\x00\t\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11\x01&4762\x1f\x01!762\x17\x16\x14$\x14\x06\"&462\x04\xa4\xfe\xdcB\\B@B\\B\xfe\xdc\x1c\x1c\x1dO\x1c\xe4\x01p\xe4\x1cP\x1c\x1c\xfe\xa0\x83\xba\x83\x83\xba\x03\xdc\xfe\xdc\xfc\xc8.BB.\x01\x80\xfe\x80.BB.\x038\x01$\x1cP\x1c\x1c\x1c\xe4\xe4\x1c\x1c\x1dO広\x83\xba\x83\x00\x05\x00\x00\xff\x80\x06\x80\x05\x80\x00\x0f\x00\x1d\x003\x00C\x00Q\x00\x00\x01\x14\x0e\x01#\".\x0154>\x0132\x1e\x01\x01\x14\x06#\".\x0154632\x1e\x01\x052\x04\x12\x15\x14\x0e\x02#\"&#\"\x06#\"54>\x02%\".\x0154>\x0132\x1e\x01\x15\x14\x0e\x01%2\x16\x15\x14\x0e\x01#\"&54>\x01\x03\f&X=L|<&X=M{<\xfe\xaaTML\x83FTML\x83F\x01\x8av\x01\x12\xb8\"?B+D\xef?B\xfdJ\xb7p\xa7\xd0\x01H=X&<{M=X&<|\x01dMTF\x83LMTF\x83\x04(\x012\x1e\x01\x02\xc0r_-\x02$\x1a\xc0\x1a$\x02-_rU\x96\xaa\x96U\x03\xf0\x91\xc5%\xfc\xcb\x1a&&\x1a\x035%ő\x80\xf3\x9d\x9d\xf3\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\x1f\x00\x00\x05\x01\x11\x05'-\x01\r\x01\x11\x14\x06\a\x01\x06\"'\x01.\x015\x11467\x0162\x17\x01\x1e\x01\x03\x80\x02\x80\xfd\x80@\x02\xba\xfdF\xfdF\x05\xfa$\x1f\xfd@\x1cB\x1c\xfd@\x1f$.&\x02\xc0\x16,\x16\x02\xc0&.]\x01]\x02|\xe9q\xfe\xfe\xfe\x02\xfd\x00#<\x11\xfe\x80\x10\x10\x01\x80\x11<#\x03\x00(B\x0e\x01\x00\b\b\xff\x00\x0eB\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00B\x00\x00\x05%\x11\x05'-\x01\x05\x01%\x11\x05'-\x01\x05'%\x11\x05'-\x01\x05\x01\x11\x14\x06\a\x05\x06\"'%&'\x06\a\x05\x06\"'%.\x015\x11467%\x11467%62\x17\x05\x1e\x01\x15\x11\x05\x1e\x01\x02\x80\x01\x80\xfe\x80@\x01\x94\xfel\xfel\x05\xd4\x01\x80\xfe\x80@\x01\x94\xfel\xfel,\x01\x80\xfe\x80@\x01\xb9\xfeG\xfeG\x05\xf9&!\xfe@\x19@\x19\xfe@\x04\x03\x02\x05\xfe@\x19@\x19\xfe@!&+#\x01\xb2+#\x01\xc0\x176\x17\x01\xc0#+\x01\xb2$*`\xc0\x01:\xa4p\xad\xad\xad\xfd\x8d\xc0\x01:\xa4p\xad\xad\xadx\xa5\x01\n\xa4p\xbd\xbd\xbd\xfd=\xfe`$>\x10\xe0\x0e\x0e\xe0\x02\x02\x02\x02\xe0\x0e\x0e\xe0\x10>$\x01\xa0&@\x10\xba\x01\x90&@\x10\xc0\n\n\xc0\x10@&\xfep\xba\x10@\x00\x00\x06\x00\x00\xff\xfe\b\x00\x05\x02\x00\x03\x00\t\x00\x1f\x00&\x00.\x00A\x00\x00\x01!\x15!\x03\"\x06\a!&\x032673\x02!\"\x0254\x0032\x1e\x01\x15\x14\a!\x14\x16%!254#!5!2654#!%!2\x1e\x02\x15\x14\a\x1e\x01\x15\x14\x0e\x03#!\a8\xfe\x01\x01\xff\xfcZp\x06\x01\x98\x12\xa6?v\x11\xddd\xfe\xb9\xd6\xfd\x01\x05Ί\xcde\x02\xfdns\xfb6\x01(\xcd\xc7\xfe\xd2\x01\x19N[\xbe\xfe\xfc\xfe\xeb\x02RW\x88u?\xacrt1Sr\x80F\xfd\x9d\x04\xad|\xfe\xd2iZ\xc3\xfd\xb7@7\xfe\xcd\x01\b\xd7\xd0\x01\x13\x88މ\x11\x1eoy2\xa7\xb4\xbeIM\x90\xd7\x1cC~[\xb5R \xa6yK{T:\x1a\x00\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1e\x00%\x00,\x00A\x00G\x00K\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x13!\x11!2654'654.\x02\x03#532\x15\x14\x03#532\x15\x14\x05\"&5!654&#\"\x06\x15\x14\x16327#\x0e\x01\x032\x17#>\x01\x03!\x15!\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\xd3\xfe\x8d\x01~u\xa0\x8fk'JTM\xb0\xa3wa\xb9\xbd|\x02\nDH\x01\x9b\x01\x95\x81\x80\xa4\x9e\x86\xcd>\x8a\vI1q\v\xfe\x04Fj\x01?\xfe\xc1\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfe\x91\xfc\xedsq\x9e*4p9O*\x11\xfe¸Z^\xfe\xb1\xd9qh LE\n\x14\x84\xb1\xac\x82\x87\xa4\xbf\"(\x01nz8B\x01\nM\x00\x00\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x00\x1b\x00'\x00?\x00\x00\x00\x14\x06\"&462\x004&#\"\a\x17\x1e\x01\a\x0e\x01'.\x01'\x1e\x0132\x014&#\"\x06\x15\x14\x163267\x14\x00#\x01\x0e\x01#\"&/\x01\x11\x05632\x17\x016\x0032\x00\x06.\x8fʏ\x8f\xca\xfd\x8d\x92h\x1b\x1bhMA\x1f\x1f\x98L\x15R\x14 vGh\x03г~\u007f\xb3\xb3\u007f~\xb3\x96\xfe\xf5\xbc\xfeK\f\u0084y\xba\x19\xe6\x01\x85O^\r\x16\x01\x1c\x02\x01\v\xbb\xbc\x01\v\x04\x1fʏ\x8fʏ\xfb\xbeВ\x06*\x1f\x97LM@\x1f\b!\b\xfeשw\x03\xc0w\xa9\xf7\x8eȍ\x8dde\x8d\x03)\xa0qrOPq\xfeȦs:0\x14\x14\x183=\x027\x16\x1b\x01'\x0e\x03\x0f\x01\x03.\x01?\x0167'\x01\x03\x0e\x01\x0f\x01\x06\a\x17\x03\x13\x17\x1667\x01\x06\x03%'\x13>\x01\x17\x1e\x05\x01\x13\x16\x06\a\x0e\x05\a&\x03%'7\x03%7.\x03/\x01\x056\x16\x1f\x01\x16\x03D\x0f\x02\xfe\\$>\x10\v\a\x0f\t\"\x02N,\xb4\x93?a0\x1f\x03\x04\xbe\x11\x02\a\b#O\x8c\x06\x80\xbc\f1\x13\x12G\x94\b\xe6\xd3\a\xaa\xe29\xfd'/\xda\xfe\xc3\x13\xe1\x14P(\x181#0\x180\x02\x97\xd4\x12\v\x16\r($=!F\v\"\xe7\x019|\x8e\xdc\xfe]\x97\"RE<\x11\x11\x01\x95\x1f6\f\v'\x01o\xfe\x90\x16\x1d\x039%\x1b8J$\\\a\f\x02:\xfe\x85\\H\x91iT\x15\x15\x01e\x1a<\x11\x12?}V\xfd\xea\xfe\x99\x1d#\x03\x04\a\x05\xa4\x01o\x01j\xad\x10\x16\x16\x03\xb2?\xfe\x8c\xbb\f\x01d\x1f\x1c\x04\x02\x14\x16,\x196\xfe\xc5\xfe\x95%N#\x14\"\x16\x16\n\x12\x03H\x01l\xc3\xedS\xfe\x8b\x14VY\x9a]C\r\r\x01\x03\x1b\x0f\x0f=\x00\x00\x04\x00\x00\xff@\b\x00\x05\x80\x00\a\x00\x11\x00\x19\x00C\x00\x00\x004&\"\x06\x14\x162\x13!\x03.\x01#!\"\x06\a\x004&\"\x06\x14\x162\x13\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x013!2\x16\x17\x1332\x16\x01\xe0^\x84^^\x84\x82\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x05\x03^\x84^^\x84\xfe\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x03\x00b\xa2\x17i\x1c]\x83\x01~\x84^^\x84^\x01\xe0\x01e\b\x13\x13\b\xfd\x19\x84^^\x84^\x01\x00\xfe\x80\x0e\x12\x80PppP\x80\x80PppP\x80\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\u007f^\xfe]\x83\x00\x04\x00\x00\xff\x00\b\x00\x06\x00\x003\x00;\x00E\x00M\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x01;\x015463!2\x16\x1d\x0132\x16\x17\x13\x00264&\"\x06\x14\x01!\x03.\x01#!\"\x06\a\x00264&\"\x06\x14\a ]\x83\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x80\x12\x0e\x01\xc0\x0e\x12\x80b\xa2\x17i\xf9\xfa\x84^^\x84^\x01d\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x04!\x84^^\x84^\x02\x80\x83]\xfe\x80\x0e\x12@PppP@@PppP@\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\xe0\x0e\x12\x12\x0e\xe0\u007f^\xfe]\xfe ^\x84^^\x84\x01\x82\x01e\b\x13\x13\b\xfc\xbb^\x84^^\x84\x00\x01\x00 \xff\x00\x05\xe0\x06\x00\x003\x00\x00$\x14\x06#!\x1e\x01\x15\x14\x06#!\"&5467!\"&47\x01#\"&47\x01#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x01\x16\x14\x06+\x01\x01\x05\xe0&\x1a\xfe2\x01\n$\x19\xfe\xc0\x19$\n\x01\xfe2\x1a&\x13\x01\x92\xe5\x1a&\x13\x01\x92\xc5\x1a&\x13\x01\x80\x134\x13\x01\x80\x13&\x1a\xc5\x01\x92\x13&\x1a\xe5\x01\x92Z4&\x11\x8d&\x19##\x19&\x8d\x11&4\x13\x01\x93&4\x13\x01\x93&4\x13\x01\x80\x13\x13\xfe\x80\x134&\xfem\x134&\xfem\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00+\x00D\x00P\x00\x00\x014'&#\"\a\x06\x15\x14\x16327632\x17\x1632674'&!\"\a\x06\x15\x14\x1632763 \x17\x16326\x134'&$#\"\a\x0e\x01\x15\x14\x16327632\x04\x17\x1632>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x04g\x1e\xc1\xfe\x85\x9a*\x1b\x16\x05 \x84o\xe2\xab\x13\x0e\x13\x1c`#\xed\xfeə\x960#\x19\a\x1ez\x81\x01\x17\xd1\x18\x0e\x19#l(~\xfe\xb2\xb0̠\x17\x1f)\x1f\v\x1d\x85\xae\x9f\x01-g\x15\x13\x1d+\xcd\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01F \x13s\"\t+\x14\x1d\b\x1bg\v\x1b\xec(\x15\x8d*\r3\x19#\b!|\r#\x01\x11/\x17IK/\a%\x1e\x1f*\b%D=\f)[\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x04\x00\x06\x00\x00\x13\x00\x00\t\x01\x17!\x11!\a\x03\a!\x11\x01'!\x11!7\x137!\x04\x00\xfe\xd1\x18\x01\x17\xfe\x05,\x8e\x1e\xfe\xd3\x01/\x18\xfe\xe9\x01\xfb,\x8e\x1e\x01-\x04\xd1\xfd\xba\x1f\xfea\x1e\xfe\xef\x1e\x01/\x02G\x1e\x01\x9f\x1e\x01\x11\x1e\x00\x00\x00\x11\x00\x00\x00\x8c\t\x00\x04t\x00\x0e\x00%\x00/\x00;\x00<\x00H\x00T\x00b\x00c\x00q\x00\u007f\x00\x8d\x00\x90\x00\x9e\x00\xac\x00\xc0\x00\xd4\x00\x00%7\x03.\x01#\"\x06\x15\x03\x17\x1e\x0132%7\x034'&\"\a\x06\x15\a\x03\x14\x17\x15\x14\x17\x1632765\x01\x17\a\x06\"/\x017627\x17\a\x06#\"5'7432\x01\x03\x17\a\x14#\"/\x017632\x1f\x01\a\x06#\"5'7432\x1f\x01\a\x06#\"&5'74632\t\x01\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x06#\"/\x01\x134632\x16\x019\x01\x03\x13\a\x14\x06\"&/\x01\x13462\x16\x17\x13\a\x14\x06\"&/\x01\x13>\x012\x16\x13\a1\x14\x06\"&/\x02\x13567632\x17\x16\x17\x01\x14\x06#!.\x015\x1147632\x00\x17632\x16\x03\x10\x10\x10\x01\r\n\t\x0e\x0e\x0e\x01\r\t\x16\x01*\v\f\r\b\x10\b\r\x01\n\v\x06\t\x0e\v\t\t\xfb\xec\x14\x14\x02\x0e\x02\x11\x11\x02\x0eX\x1a\x1a\x02\b\t\x17\x17\t\b\x01\x1a\xbc\x19\x19\v\n\x02\x15\x15\x02\n\v^\x17\x17\x02\f\r\x15\x15\r\f`\x15\x15\x02\x0e\x06\t\x14\x14\t\x06\x0e\x01\x81\xfe\xdf\x15\x15\n\a\x10\x02\x12\x12\x02\x10\a\n^\x13\x13\v\b\x12\x02\x10\x10\x02\x12\b\vb\x12\x12\x02\x14\x13\x02\x10\x10\r\b\t\f\x01\x89\xc6\x0f\x0f\x0f\x14\x0e\x01\x0e\x0e\x0f\x14\x0fc\x0e\x0e\x10\x16\x10\x01\f\f\x01\x10\x16\x0f\xd5\x0e\x12\x1a\x12\x01\x06\x06\f\x02\n\t\v\b\a\x0e\x02\x04f\xa6u\xfc\xee\r\x12\x1cU`\xc3\x01\x1e\x1159u\xa6\xa4\xf1\x02\v\n\x0e\x0e\n\xfd\xf5\xf1\n\r4\xd3\x02J\x10\b\x05\x05\b\x10\x06\xfd\xbd\x01\xeb\x01\n\a\v\t\a\r\x01l\x80~\t\t~\x80\tF\xcf\xcb\t\n\xca\xcf\t\xfe2\x01\xeb\xf5\xed\v\v\xed\xf5\f\x05\xfc\xf4\r\r\xf4\xfc\r\x1f\xea\xf6\x10\t\a\xf6\xea\x06\t\xfe\x16\x02m\xfe\x84\xf6\a\v\x12\xf6\x01|\x12\vO\xfe,\xf4\b\v\x13\xf4\x01\xd4\x13\v \xfe\x06\xf2\x15\x15\xf2\x01\xfa\t\r\r\xfd\x11\x02\xea\xfe\x02\xef\n\x0f\x0e\v\xef\x01\xfe\v\x0e\x0e\x1e\xfe\x14\xec\v\x10\x10\v\xec\x01\xec\f\x10\x10\xfe\b\xe7\r\x12\x12\rru\x02|\x03\x0f\t\a\x05\b\x12\xfd\x94u\xa5\x02\x12\r\x03\x83\x17\n\"\xfe\xf9\xc0\x16\xa6\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\r\x00\x1b\x00)\x009\x00\x00\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 \x04\x16\x1d\x01\x14\x06\x04 $&=\x0146\x02\x13\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\xb9\x01\xa0\x01b\xce\xce\xfe\x9e\xfe`\xfe\x9e\xce\xce\x03\x00VT\xaaEvEEvE\xaaT\xfc\xaaVT\xaaEvEEvE\xaaT\x01*VT\xaaEvEEvE\xaaT\x04*EvE\x80EvEEvE\x80Ev\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00^\x00c\x00t\x00\u007f\x00\x87\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x17632\x17\x16\a\x14\x06\a\x15\x06#\"&'\x06\a\x02#\"/\x01&'&7>\x0176\x17\x16\x156767.\x0176;\x022\x17\x16\a\x06\a\x16\x1d\x01\x06\a\x16\x0167\x0e\x01\x01\x06\x17674767&5&5&'\x14\a\x0367.\x01'&'\x06\a\x06\x05&#\x163274\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\xfe!3;:\x93\x1e\x10\x0e\x02\x01\x06A0\x86?ݫ\x99Y\x0f\r\x18\x01\x05\n\x04\t^U\x0e\t\x0247D$\x18\r\r\v\x1f\x15\x01\x17\f\x12\t\x02\x02\x01\x02\f7\xfe\x1b4U3I\x01\x81\x0f\r\x01\x06\a\x01\x03\x01\x01\x01\f\x01|\x87\x95\x02\x16\x05L3\x1b8\x1e\x02w\x18tL0\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x02Q\x1a\x1e\a1\x16\x1e\x01\x02\x01\x01&(!\x18;\xfe\xfa\a\f\x01\x04\n\x1a(g-\t\x0f\x02\x02Up\x88~R\x9b2(\x0f\x15/\x06\x02\x03\x05\x1e{E\xa4\xfe\x1b\x18\x86(X\x03z*Z\a%\x03(\x04\x04\x01\x01\x02\x01\x16\x0e\x01\x01\xfdi6\x1b\x01\x11\x05CmVo8\v\x18\x1c\x01\x01\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00T\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x13\x153\x133\x1367653\x17\x1e\x01\x17\x133\x1335!\x153\x03\x06\x0f\x01#4.\x015.\x01'\x03#\x03\x0e\x01\x0f\x01#'&'\x0335\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00iF\xa4\x9f\x80\a\x03\x02\x04\x03\x01\x05\x03\x80\x9f\xa4F\xfe\xd4Zc\x05\x02\x02\x04\x01\x02\x01\x06\x02\x90r\x90\x02\x05\x01\x04\x04\x02\x02\x05cZ\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80k\xfdk\x01\xe5\x14\x1a\x10\b\x18\x03\"\t\xfe\x1b\x02\x95kk\xfeJ\x14\x1a\x15\x03\a\t\x02\x05 \t\x02!\xfd\xdf\t\x1f\x06\x15\x15\x1a\x14\x01\xb6k\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#7>\x02;\x01\x16\x17\x1e\x02\x1f\x01#\x15!5#\x03\x1335!\x153\a\x0e\x01\x0f\x01#&'&/\x0135!\x153\x13\x03\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01-\x01\x19Kg\x05\n\x05\x01\x02\x01\x04\x02\x05\a\x03kL\x01#D\xc0\xc3C\xfe\xe9Jg\x04\f\x03\x02\x02\x01\x04\x06\vjL\xfe\xdeD\xbd\xc2\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa1\a\x13\b\x04\x06\x04\a\t\x04\xa1jj\x01\x11\x01\x1akk\x9f\a\x13\x04\x03\x04\x06\v\f\x9fkk\xfe\xf0\xfe\xe5\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x008\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#5327>\x0154&'&#!\x153\x11\x01#\x1132\x17\x16\x15\x14\a\x06\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01 \x01G]\x89L*COJ?0R\xfe\x90\\\x01\x05wx4\x1f8>\x1f\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa7\x0f\x17\x80RQx\x1b\x13k\xfd\xd5\x01\x18\x01\f\x12!RY\x1f\x0f\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00*\x002\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x11!57\x17\x01\x04\"&462\x16\x14\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x80\xfc\x00\xc0\x80\x01\x80\xfeP\xa0pp\xa0p\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x01\xc0\xfe\xc0\xc0\xc0\x80\x01\x80\x80p\xa0pp\xa0\x00\x00\t\x00\x00\xff\x00\x06\x00\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00#\x00*\x007\x00J\x00R\x00\x00\x015#\x15\x055#\x1d\x015#\x15\x055#\x15\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11#\x15#5!\x11\x01\x13\x16\x15\x14\x06\"&5476\x1353\x1532\x16\x02264&\"\x06\x14\x02\x80\x80\x01\x00\x80\x80\x01\x00\x80\x03<\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\x80\x80\xfe\x00\x02\x8dk\b\x91ޑ\b\x15c\x80O\x16\"\xbcjKKjK\x04\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\x80\x80\xfa\x00\x02\xd1\xfe\xa3\x1b\x19SmmS\x19\x1b?\x01M\x80\x80\x1a\xfe\x1a&4&&4\x00\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x009\x00L\x00^\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x15\x11\x14\a\x06#\"/\x01#\"&=\x0146;\x0176\x01276\x10'.\x01\a\x0e\x01\x17\x16\x10\a\x06\x16\x17\x16'2764'.\x01\x0e\x01\x17\x16\x14\a\x06\x16\x17\x16\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\xec\x14\x14\b\x04\f\v\xa6\x83\x0e\x12\x12\x0e\x83\xa6\x10\x01\xb4\x1f\x13\x81\x81\x106\x14\x15\x05\x11dd\x11\x05\x15\x12\xbd\x1b\x14WW\x126&\x02\x1344\x13\x02\x13\x14\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03.\b\x16\xfd\xe0\x16\b\x02\t\xa7\x12\x0e\xc0\x0e\x12\xa7\x0f\xfdG\x18\x9f\x01\x98\x9f\x15\x06\x11\x115\x15{\xfe\xc2{\x155\x10\x0f\x94\x14]\xfc]\x13\x02$5\x149\x949\x145\x12\x11\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x16\x15\x11\x14\a\x06#\"'\x015\x01632\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\x804LL4\xfe\x804LL4\x03l\x14\x14\b\x04\x0e\t\xfe\xf7\x01\t\t\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80L4\xfe\x804LL4\x01\x804L\x02\b\x16\xfd\xc0\x16\b\x02\t\x01\nZ\x01\n\t\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x007\x00K\x00[\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01>\x01\x1f\x01\x1e\x01\x0f\x01\x17\x16\x06\x0f\x01\x06&'\x03&7!\x16\a\x03\x0e\x01/\x01.\x01?\x01'&6?\x016\x16\x17\x01.\x017\x13>\x01\x1f\x01\x1e\x01\a\x03\x0e\x01'\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01`\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xe2\x0e\x0e\x04\x04\x0e\x0e\xe2\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xfev\r\x0f\x02\x8a\x02\x16\r?\r\x0f\x02\x8a\x02\x16\r\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\x01-\x13\x13\x13\x13\xfe\xd3\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\xfd\x06\x02\x16\r\x03?\r\x0f\x02\n\x02\x16\r\xfc\xc1\r\x0f\x02\x00\x01\x00'\xff\x97\x05\xd9\x06\x00\x006\x00\x00\x01\x15\x06#\x06\x02\x06\a\x06'.\x04\n\x01'!\x16\x1a\x01\x16\x1767&\x0254632\x16\x15\x14\a\x0e\x01\".\x01'654&#\"\x06\x15\x14\x1632\x05\xd9eaAɢ/PR\x1cAids`W\x1b\x01\x1b\x1aXyzO\xa9v\x8e\xa2д\xb2\xbe:\a\x19C;A\x12\x1f:25@Ң>\x02\xc5\xc6\x17\x88\xfe\xf2\xa1\x1a-0\x115r\x8f\xe1\x01\a\x01n\xcf\xda\xfe\x97\xfe\xef\xc6`\xa9\xedH\x01(\xb9\xc0\xf5\xd3\xc0\x9f\u007f\x01\x04\f' gQWZc[\xba\xd7\x00\x00\b\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x06\x00\n\x00\x0e\x00\x12\x00\x15\x00\x19\x00-\x00\x00\x13\x01\x11%\x057'\t\x01%\x05'-\x01\x05'%\x11\t\x01\x17\x11\x05%\x01\x11\x05\x11\x14\a\x01\x06\"'\x01&5\x1147\x0162\x17\x01\x16\xd8\x02[\xfe\xb2\xfe\xb5\xc1\xc1\x033\x02[\xfe\xf3\xfe\xb2M\x01\x10\xfe\xf0\xfe\xf0\x8b\x01N\xfd\xa5\x04\xcd\xc1\xfe\xb5\x01\r\xfd\xa5\x033\"\xfc\xcd\x15,\x15\xfc\xcd\"\"\x033\x15,\x15\x033\"\x01o\xfen\x01g\xdf$\x81\x81\xfc\xdc\x01\x92\xb4߆\xb6\xb6\xb6]\xdf\x01g\xfen\xfe\xef\x81\x01\x02$\xb4\x01\x92\xfe\x99+\xfd\xde)\x17\xfd\xde\r\r\x02\"\x17)\x02\")\x17\x02\"\r\r\xfd\xde\x17\x00\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05x\x00#\x00W\x00\x00\x01\x1e\x01\x15\x14\x06#\"&#!+\x02.\x015467&54632\x176$32\x04\x12\x15\x14\x06\x01\x14\x16327.\x01'\x06#\"&54632\x1e\x0532654&#\"\a\x17632\x16\x15\x14\x06#\".\x05#\"\x06\a\bo\x89\xec\xa7\x04\x0f\x03\xfbG\x01\x02\x05\xaa\xecn\\\f\xa4u_MK\x01'\xb3\xa6\x01\x18\xa3\x01\xfą|\x89g\x10?\fCM7MM5,QAAIQqAy\xa7\xa8{\x8fb]BL4PJ9+OABIRo?z\xaa\x02\xfc.\xc7z\xa4\xe9\x01\n\xe7\xa5n\xba6'+s\xa2:\x9a\xbc\xa1\xfe\xec\xa3\x06\x18\xfe\xf0z\x8ec\x14I\x0eAC65D*DRRD*\x8fwy\x8eal@B39E*DRRD*\x8d\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00\x00\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \a\x1762\x177\x017&47'\x06\x10\x00 7'\x06\"'\a\x12 6\x10& \x06\x10\x05\x176\x10'\a\x16\x14\x02\xca\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x02\xc0\xfe\x84\xab\xc2R\xaaR\xc2\xfb\xf1\xc2\x1c\x1c\xc2Z\x02B\x01|\xab\xc2R\xaaR\xc2\xca\x01>\xe1\xe1\xfe\xc2\xe1\x03d\xc2ZZ\xc2\x1c\x06\x00\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x0eZ\xc2\x1c\x1c\xc2\xfb\xf1\xc2R\xaaR«\xfe\x84\xfd\xbeZ\xc2\x1c\x1c\xc2\x01&\xe1\x01>\xe1\xe1\xfe\xc2\b«\x01|\xab\xc2R\xaa\x00\x01\x00 \xff \x06\xe0\x05\xd7\x00!\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x12$7\x15\x06\x00\x15\x14\x1e\x02 >\x0254\x00'5\x16\x04\x12\x06\xe0\x89\xe7\xfe\xc0\xfe\xa0\xfe\xc0\xe7\x89\xc2\x01P\xce\xdd\xfe\xddf\xab\xed\x01\x04\xed\xabf\xfe\xdd\xdd\xce\x01P\xc2\x02\x80\xb0\xfe\xc0牉\xe7\x01@\xb0\xd5\x01s\xf0\x1f\xe4-\xfe\xa0\xe6\x82\xed\xabff\xab\xed\x82\xe6\x01`-\xe4\x1f\xf0\xfe\x8d\x00\x00\x01\x00\x13\xff\x00\x06\xee\x06\x00\x00c\x00\x00\x136\x12721\x14\a\x0e\x04\x1e\x01\x17\x1e\x01>\x01?\x01>\x01.\x01/\x01.\x03/\x017\x1e\x01\x1f\x016&/\x017\x17\x0e\x01\x0f\x01>\x01?\x01\x17\x0e\x01\x0f\x01\x0e\x01\x16\x17\x1e\x01>\x01?\x01>\x02.\x04/\x01&3\x161\x1e\b\x17\x12\x02\x04#\"$&\x02\x13\b\xd8\xc5\x05\x01\b(@8!\x05IH2hM>\x10\x10'\x1c\x0f\x1b\r\x0e\n)-*\x0e\rh'N\x14\x13\x01'\x15\x14\xa1\xa0!'\x03\x04\x16O\x1c\x1cg,R\x13\x13\x1f\"\x14/!YQG\x16\x15\x0154'6\x133&5\x1147#\x16\x15\x11\x14\x055\x06#\"=\x0132\x1635#47#\x16\x1d\x01#\x15632\x163\x15#\x15\x14\x1e\x0332\x014&\"\x06\x15\x14\x1626%\x11\x14\x06#!\"&5\x11463!2\x16\x02F]kbf$JMM$&\xa6N92Z2\x1d\b\x02\a\x18\x06\x15&`\x06\xe3\x06\xab\x0f9\x0eUW=\xfd\xf0N9:PO;:\x16dhe\x03\\=R\x91\x87\x01\xcd\xca\f\n+)\u007f\xb3\x17\b&'\x1f)\x17\x15\x1e-S9\xfe\xd0\x199kJ\xa5<\x04)Um\x1c\x04\x18\xa9Q\x8b\xb9/\xfc\xbe-Y\x02a^\"![\xfd\x9bY\xb1\xc4'(<`X;\x01_\x04\x02\x06\xbeL6#)|\xbe\x04\xfe\x93\x83\x04\x0etWW:;X\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02שw\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x03\x8a\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x009\xff\x00\x04\xc7\x06\x00\x00\x1d\x00I\x00\x00\x00\x14\x06#\"'\x06\a\x02\x13\x16\x06\a#\"&'&>\x03767&5462\x04\x10\x02\x04#\"'.\x017>\x01\x17\x1632>\x024.\x02\"\x0e\x02\x15\x14\x17\x16\x0e\x01&'&54>\x0232\x04\x03JrO<3>5\xf7-\x01\x1b\x15\x05\x14\x1e\x02\x0e\x15&FD(=G\x10q\xa0\x01\xee\x9c\xfe\xf3\x9e@C\x15\x17\x05\x05$\x1539a\xb2\x80LL\x80\xb2²\x80L4\n\r&)\n@]\x9c\xd8v\x9e\x01\r\x04\x14\xa0q#CO\xfe\x8d\xfe\x18\x16!\x02\x1b\x14~\U000ffd42\x0172765'.\x01/\x01\"\a\x0e\x01\a#\"&'&5\x10\x01\x0e\b\x16\r\x01\x11\x0e\xb9}\x8b\xb9\x85\x851R<2\"\x1f\x14\f\x017\x12\x03\x04MW'$\t\x15\x11\x15\v\x10\x01\x01\x02\x05;I\x14S7\b\x02\x04\x05@\xee5sQ@\x0f\b\x0e@\b)\xadR#DvTA\x14\x1f\v;\x14\x04\n\x02\x020x\r\x05\x04\b\x12I)\x01\x04\x04\x03\x17\x02\xda\x13!\x14:\x10\x16>\f\x8b\x01+\x03\x14)C\x04\t\x016.\x01\x13\x00\x00\x00\x00\x06\x00\x00\xff>\b\x00\x05\xc2\x00\n\x00\x16\x00!\x00-\x00I\x00[\x00\x00\x004&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x024&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x01&#\"\x04\x02\x15\x14\x17\x06#\".\x03'\a7$\x114\x12$32\x04\x16\x01\x14\x06\a\x17'\x06#\"$&\x106$32\x04\x16\x02D2)+BB+)\x03\x193(\x1b--\x1b(3\xec1)+BB+)\x02\xac4'\x1b--\x1b'4\xfe\xf6\x1f'\xa9\xfe\xe4\xa3\x17#!\x1a0>\x1bR\t\xfdH\xfe\xde\xc3\x01MŰ\x019\xd3\x02o\x89u7ǖD\xa9\xfe䣣\x01\x1c\xa9\xa1\x01\x1c\xab\x04\nR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xefR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xaa\x04\x9a\xfe\xf9\x9cNJ\x03\x03\n\x04\x11\x02\u007f\xda\xcb\x01\x1f\xa9\x01\x1c\xa3\x84\xe9\xfd?u\xd5W\xb5m%\x8d\xf2\x01\x1e\xf2\x8d\x8d\xf3\x00\x01\x00\x00\xff\x00\x06\xff\x06\x00\x00\x1e\x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x03\x06#\"'.\x015\x11\t\x01%&'&7\x01632\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfe;\xf2\x12\x1f\r\t\x13\x17\x03`\xfb\xd3\xfeu%\x03\x02\"\x06\x80\x0f\x11\x14\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xb9\xfe\xd9\x17\x04\a!\x14\x01]\x04#\xfcc\xa2\x0e)(\x13\x03\xc0\t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\xff\x05\xf7\x00\x1a\x00 \x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x01\x06#\"'.\x015\x11%&'&7\x016\x01\x13\x01\x05\t\x01\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfd\xf1\xfe\xd6\x12\x1d\x0e\t\x13\x16\xfe(%\x03\x03#\x06\x80#\xfe\xcb\xdd\xfaf\x01P\x03_\xfe\"\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xd7\xfe\xb9\x15\x04\a!\x14\x01\xc4\xc1\x0e)'\x14\x03\xc0\x15\xfa\x0e\x05+\xfcʼn\x02\u007f\xfc\xe3\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00I\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x05\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\xfd\xfa\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eozΘ\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x00 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x82\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x05\x00f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00>\xff\x80\x06\xc2\x05\x80\x00\x85\x00\x00\x05\"&#\"\x06#\"&54>\x02765\x034'&#!\"\a\x06\x15\x03\x14\x17\x1e\x03\x15\x14\x06#\"&#\"\x06#\"&54>\x02765'\x1146.\x04'.\x01\"&54632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x163!2765\x134'.\x0254632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x1e\x03\x15\x14\x06\x06\x92,\xb1-,\xb0,\x18\x1a\",:\x10!\x01\x01\r%\xfd]&\r\x01\x01%\x10@2(\x19\x18/\xb9.+\xaa*\x17\x19\x1f)6\x0f!\x01\x01\x01\x02\x05\b\x0e\t\x0f<.$\x18\x18.\xb9.*\xa9*\x19\x19\"+8\x0f#\x01\x01\r\x1a\x02\xbb\x19\r\x01\x01#\x12Q3\x19\x19,\xb0,+\xac+\x19\x19#-:\x0f#\x01\"\x10\x19$$\x19\x01\xf0\f/:yu\x8e\xa6xv)%$\x00\t\x00\x00\xff\x80\x06\x00\x05\x00\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00/\x00?\x00C\x00G\x00\x00%\x15!5%2\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15!5\x13\x15#5\x01\x15!5\x032\x16\x15\x11\x14\x06#!\"&5\x11463\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x15#5\x13\x15!5\x01`\xfe\xa0\x02\xc0\x1a&&\x1a\xff\x00\x1a&&\x1a\x01\xa0\xfc\xa0\xe0\xe0\x06\x00\xfd \xe0\x1a&&\x1a\xff\x00\x1a&&\x1a\x03\x80\x1a&&\x1a\xff\x00\x1a&&\x1a\x02@\xe0\xe0\xfc\xa0\x80\x80\x80\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x01\x80\x80\x80\x02\x00\x80\x80\xfc\x00\x80\x80\x04\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xfe\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x80\x80\x80\x02\x00\x80\x80\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x00\x00\x012\x16\x10\x06 &547%\x06#\"&\x10632\x17%&546 \x16\x10\x06#\"'\x05\x16\x14\a\x056\x04\xc0\x85\xbb\xbb\xfe\xf6\xbb\x02\xfe\x98\\~\x85\xbb\xbb\x85~\\\x01h\x02\xbb\x01\n\xbb\xbb\x85~\\\xfe\x98\x02\x02\x01h\\\x02\x00\xbb\xfe\xf6\xbb\xbb\x85\f\x16\xb4V\xbb\x01\n\xbbV\xb4\x16\f\x85\xbb\xbb\xfe\xf6\xbbV\xb4\x16\x18\x16\xb4V\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00$4&#\"\a'64'7\x163264&\"\x06\x15\x14\x17\a&#\"\x06\x14\x16327\x17\x06\x15\x14\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00}XT=\xf1\x02\x02\xf1=TX}}\xb0~\x02\xf1>SX}}XS>\xf1\x02~\xb0\x01}\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfd\xb0~:x\x10\x0e\x10x:~\xb0}}X\a\x10x9}\xb0}9x\x10\aX}\x03\xe0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\a\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00/\x00>\x00L\x00X\x00d\x00s\x00\x00\x00.\x01\a\x0e\x01\a\x06\x16\x17\x16327>\x0176\x01\x17\a\x17\x16\x14\x0f\x01\x16\x15\x14\x02\x06\x04 $&\x02\x10\x126$32\x17762\x1f\x01\x13\x06#\"/\x01&4762\x1f\x01\x16\x14\x17\x06\"/\x01&4762\x1f\x01\x16\x146\x14\x06+\x01\"&46;\x012'\x15\x14\x06\"&=\x01462\x16\x17\a\x06#\"'&4?\x0162\x17\x16\x14\x02E\x140\x19l\xa6,\n\x14\x19\r\v*\x12\"\x81T\x19\x03\xb8.\xf4D\x13\x13@Yo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x8f\xb6\xa1@\x135\x13D\xfb\n\f\r\n[\t\t\n\x1a\nZ\n\xdc\v\x18\vZ\n\n\t\x1b\t[\t \x12\x0e`\x0e\x12\x12\x0e`\x0e\xae\x12\x1c\x12\x12\x1c\x12\x97[\n\f\r\n\n\nZ\n\x1a\n\t\x03\x9a2\x14\n,\xa6l\x190\n\x05(T\x81\"\v\x01\xad.\xf3D\x135\x13@\xa1\xb6\x8f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoY@\x13\x13D\x01,\n\nZ\n\x1a\n\t\t[\t\x1b\xef\t\t[\t\x1b\t\n\nZ\n\x1a\xbb\x1c\x12\x12\x1c\x12\xa0`\x0e\x12\x12\x0e`\x0e\x12\x12EZ\n\n\t\x1b\t[\t\t\n\x1a\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x04\x00\x14\x005\x00\x00\x01%\x05\x03!\x02 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x016=\x01\a'\x13\x17&'\x17\x05%7\x06\a7\x13\a'\x15\x14\x177\x05\x13\a\x1627'\x13%\x02a\x01\x1f\x01\x1fm\xfe\x9d\x05\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x04m\x95f\xf0?\x86\x96\xef5\xfe\xe1\xfe\xe15\uf587>\xf0f\x95\x1e\x01F\x8btu\xf6ut\x8b\x01F\x02\xd0\xd0\xd0\xfe\xb0\x04\x80\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xfbH\xcb\xfb\x03Y\xe0\x01C\f\xceL|\x9f\x9f|L\xce\f\xfe\xbd\xe0Y\x03\xfb˄(\xfe\xd6E''E\x01*(\x00\x00\x00\f\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00I\x00Y\x00i\x00y\x00\x89\x00\xa2\x00\xb2\x00\xbc\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\"&=\x01!\x15\x14\x06#\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15!54\x05\x04\x1d\x01!54>\x04$ \x04\x1e\x04\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06#!\"&=\x01\x01\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xfd\xc2\x1c&\x02\x02&\x1b\x02\xff\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\xfd\xfe\xfe\x82\xfe\x82\xfd\xfe\x113P\x8d\xb3\x01\r\x01>\x01\f\xb4\x8dP3\x11\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12&\x1b\xfe\x80\x1b&\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x92&\x1b\x81\x81\x1b&\xfd\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8a\r\nh\x02\x01e\n\r\x114LKM:%%:MKL4\xfeW\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01T\x81\x1b&&\x1b\x81\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x14\x00%\x00/\x009\x00\x00\x01\x11\x14\x06#\x11\x14\x06#!\"&5\x11\x1363!\x11!\x11\x01\x11\x14\x06#!\"&5\x11\"&5\x11!2\x17\x01\x15!5463!2\x16\x05\x15!5463!2\x16\x02\xc0&\x1a&\x1a\xfe\x00\x1a&\xf9\a\x18\x02\xe8\xff\x00\x04\x00&\x1a\xfe\x00\x1a&\x1a&\x01\xa8\x18\a\xfc\xd9\xfe\xa0\x12\x0e\x01 \x0e\x12\x02\xa0\xfe\xa0\x12\x0e\x01 \x0e\x12\x04\xc0\xfd\x00\x1a&\xfd\xc0\x1a&&\x1a\x02\x00\x03i\x17\xfd@\x02\xc0\xfc\x80\xfe\x00\x1a&&\x1a\x02@&\x1a\x03\x00\x17\x017\xe0\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00\x00\x01\x16\x14\a\x01\x17\a\x06\x04'\x01#5\x01&\x12?\x01\x17\x0162\x16\x14\a\x01\x17\x0162\x06\xdb%%\xfeo\x96\xa0\xa3\xfe;\xb9\xfe\x96\xb5\x01j|/\xa3\xa0\x96\x01\x90&jJ%\xfep\xea\x01\x91&j\x04;&i&\xfep\x96\xa0\xa3/|\xfe\x96\xb5\x01j\xb9\x01ţ\xa0\x96\x01\x91%Jk%\xfeo\xea\x01\x90%\x00\x00\x00\x04\x00\x19\xff\f\x06\xe7\x06\x00\x00\t\x00\x15\x00:\x00g\x00\x00\x01\x14\x06\"&5462\x16\x05\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x1e\x052636\x17\x16\x17\x16\x176\x172\x1e\x02>\x057\x06\a\x12\a\x06\a\x06'&7\x035.\x01'\x03\x16\a\x06'&'&\x13&'&6\x17\x1e\x01\x17\x11463!2\x16\x15\x1176\x16\x03i\u007f\xb2\u007f\u007f\xb2\u007f\x01\xf6~ZY\u007f\u007fYZ~\xe1@O\xfb\xa8S;+[G[3Y\x1cU\x02D\x1b\x06\x04\x1a#\ao\x05?\x17D&G3I=J\xc6y\xfbTkBuhNV\x04\x01\b!\a\x01\x04WOhuAiS\xfby\x19*'\x04\x0f\x03^C\x04\xe9C^\x15'*\x03\x1cSwwSTvvTSwwSTvv\xfe\xf8\x02\x9bWID\\\xfd_\x17\"\x16\x0f\a\x01\x04\x01\x1c\x06\x03\x19\x1a[\x04\x03\x01\x01\x03\x06\v\x10\x17\x1f\x18\x95g\xfe\xe3\xb4q# /3q\x01F\x01\x02\b\x01\xfe\xaer2/ $r\xb4\x01\x1bg\x95%4\x1b\x02\n\x03\x02\xb6HffH\xfdJ\x0f\x1b4\x00\x00\x04\x00d\xff\x80\x06\x9c\x06\x00\x00\x03\x00\a\x00\x0f\x00\x19\x00\x00\x01\x11#\x11!\x11#\x11\x137\x11!\x11!\x157\x01\x11\x01!\a#5!\x11\x13\x03\x80\x91\x02\x1f\x91\x91\xfd\xfbV\x01F\xd9\x03\x1c\xfeN\xfe\xba\xd9\xd9\xferm\x04N\xfeN\x01\xb2\xfeN\x01\xb2\xfd\b\xfe\x03\x1b\xfb\xe7\xd9\xd9\x04\xaa\xfc\v\xfeN\xd9\xd9\x04\x86\x01!\x00\x00\x00\x00\x05\x00Y\xff\x01\x05\xaa\x05\xfd\x00\x16\x00+\x00?\x00N\x00e\x00\x00%\x15\x02\a\x06\a\x06&'&'&7>\x01727>\x01\x17\x1e\x01'\x06\x0f\x01\x04#&'&'&>\x01\x172\x17\x16\x1f\x01\x1e\x01\x01\x0e\x01\a\x06'&\x03'&676\x17\x16\x17\x1e\x01\x17\x16\x01\x16\a\x06'\x01&76$\x17\x16\x17\x16\x12\x05\x16\a\x06\x05\x06\a7\x06&'&767>\x0176\x17\x1e\x01\x17\x03\x05\x01\x05\f'6\xff#\r\x04\x01\x05\x04<\x97\x01;\x0f1\x19\x18\x1b\x96\x031x\xfe\xed\x11#\x13\f\x05\b\x12*#\r\xbdG,T\x17\x19\x039\a\xa93%\x1a\x0e\xaa/\x0e\x05\x11#0\x01v\xcbN\b\x1c\xfdZ\x05;:8\xfe\x86\b\x1b)\x01M:(\t\x03&\x02\x9b\x03\x1d\x0f\xfe\xc6C\x18\x01\x17.\x0e\x1e\x1e\x01J}2\t\x1c%0\x96\x06\xd9\u007f\xfe\xdc\r \b\t^*\x0f\x15\f\x0e\nJ\xb3F\x13\v\t\n&\xe47\x0f'X\x02\"\x192L\xb5D\x02M\x1d\x12\"\t+\xfe\xbc6\xd6\x14\x0e\x15\n\x01\x15M\x152\x15+\x11\x01'B\x1b\a\x16\x02Qf\x14\x11X\x02V#\x1b+]\x0f\n#\x12\xfd\xc1\xc8'\x14\nL\x0f\b\x02\x06\x14\x16/(\x01e\xabB\x06\x13\x11\x17\xdd9\x00\x00\x00\n\x00\x00\x00\x00\b\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00#\x00,\x008\x00\x00\x01!\x11!\x13\x15!5\x01\x11!\x11\x01\x15!5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x11#\x11\x14\x1626%\x11!\x11\x14\a!26\x13\x11\x14\x06#!\"&5\x11!5\x04\x00\xfe\x80\x01\x80\x80\xfd\x80\x02\x80\xfd\x80\x05\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\xfc\x00\x80&4&\x06\x80\xfa\x00\v\x05\xcb\x1a&\x80pP\xf9\x80Pp\x01\x00\x04\x00\xfe\x80\xff\x00\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\xfc@\x03\xc0\xfc@\x1a&&\x1a\x04@\xfb\xc0!\x1f&\x04\xda\xfb@PppP\x04@\x80\x00\x04\x00*\x00\r\a\xd6\x05\x80\x00\t\x00\x1f\x009\x00Q\x00\x00$\"&5462\x16\x15\x147\".\x01\"\x0e\x01#\"&547>\x012\x16\x17\x16\x15\x14\x06\x01\"'.\x01#\"\x0e\x03#\"&5476$ \x04\x17\x16\x15\x14\x06\x13\"'&$ \x04\a\x06#\"&5476$ \x04\x17\x16\x15\x14\x06\x04\x14(\x92}R}h\x02L\u007f\x82\u007fK\x03\x12\x97\nN\xec\xe6\xecN\n\x97\x00\xff\v\f\x88\xe8\x98U\xab\u007fd:\x02\x11\x96\n\x84\x01x\x01\x80\x01x\x84\n\x96\xfe\v\v\xb3\xfe\u007f\xfe8\xfe\u007f\xb3\v\v\x11\x97\n\xbb\x02\x04\x02\x1a\x02\x04\xbb\n\x97\r\x93\x14 ,, \x14|2222\x96\x12\r\nMXXM\n\r\x12\x96\x01\x10\bic,>>,\x96\x12\f\n\x84\x92\x92\x84\n\f\x12\x96\x01\x0f\t\x9d\x9f\x9f\x9d\t\x96\x12\r\n\xba\xcc̺\n\r\x12\x96\x00\x00\r\x00\x00\xff\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00?\x00K\x00S\x00c\x00k\x00{\x00\x00\x044&\"\x06\x14\x162$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x114&\"\x06\x15\x11\x14\x1626\x004&\"\x06\x14\x162\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x104&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80KjKKj\x01\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\x03KLhLLhL\xfe\x80KjKKj\x01\xcb&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&KjKKj\xcbL4\xfa\x804LL4\x05\x804L5jKKjKKjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\xfd\x80\x01\x804LL4\xfe\x804LL\x02\xffjKKjK\x01\xc0\x01\x00\x1a&&\x1a\xff\x00\x1a&&\xfe\xa5jKKjK\x03\x00\xfa\x004LL4\x06\x004LL\x00\x02\x00\t\xff\x00\x05\xef\x06\x00\x00'\x00E\x00\x00\x01\x16\a\x02!#\"\x06\x0f\x01\x03\a\x0e\x01+\x01\"&7>\x0376;\x01\x167676767>\x01\x16\x17\x16'\x14\a\x06\a\x06\a\x14#'\"\a\x06\x03\x06#!\"&7\x13>\x013!2\x16\x17\x1e\x01\x05\xef\x12\x16W\xfe\",\x19&\x05\x047\x02\x05'\x19\xfb\x15\x18\x03\t#\x12$\t\x05&\x83\x85g\xafpf5\x18\v\x01\x03\x04\x04O\x99.P\xdeq\x8bZZd\x12\x02S\x01\v\xfe\xd9\x16\x1d\x03\xe8\x05-\x1d\x02V\"\u007f0kq\x03zTx\xfeD!\x1a\x13\xfe\xa6\x0f\x1a!\x1e\x158\xe0p\xdf8%\x02\x17'i_\x97F?\x06\x03\x01\x03;\xb3k\x81\xe9R(\x02\x01\x01`\b\xfd\xf6\n!\x16\x05\xbf\x1d&\x1a\x13)\xa4\x00\x00\x04\x00'\xff\x00\a\x00\x06\x00\x00\n\x00\x12\x00\x19\x00(\x00\x00\x012\x17\x00\x13!\x02\x03&63\x01\x06\a\x02\x0367\x12\x13\x12\x00\x13!\x02\t\x01\x10\x03\x02\x01\x02\x03&63!2\x16\x17\x12\x01\xb9!\x13\x01\n`\xfeB\u007f\xf0\f\x12\x14\x03\xa41LO\xb1(\x04\xd3\xe1\xeb\x01+#\xfe=)\xfe\x00\x04heC\xfe\xdc\x19Q\x04\x13\x10\x01g\x15#\x05s\x03`\x1a\xfe\x94\xfef\x01\xb9\x014\x10#\xfe\x9b\xc7\xc2\x016\x01\x1c\xdd\xe4\xfe\xac\x01\x8f\xfe\xbc\xfd\x13\xfeq\x02\x99\x03'\xfd\xc0\xfeX\xfe|\x020\x02\v\x01-\x01\x1b\x10\x19\x1a\x14\xfeg\x00\a\x00\x00\xff\x80\t\x00\x05\x80\x00\b\x00\x0f\x00\x18\x00\x1c\x00>\x00I\x00Y\x00\x00\x01#6?\x01>\x017\x17\x05\x03&#!\a\x04%\x03'.\x01'\x133\x01\x033\x13#\x05&#\"\x06\a\x06\x17\x1e\x01\x15\x14\x06#\"/\x01\a\x163\x16674'.\x0154636\x1f\x01%#\"\a\x03373\x16\x173\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\xb7\x8a\x0e4\x03\x04\f\x03\f\xfa\x82:\v@\xfe\xf4\x02\x017\x01\x0f\xa2\x11\x1avH\x87\xaf\x01\x05%\xa6h\xa6\x02\x98EP{\x9c\x01\x01\x920&<'VF\x16\x17Jo\x82\x9d\x02\x8c1,1.F6\x0f\x01\xc0\x80A\x16\xf6\xae#\xd4\x05\x0f\x9a\x80L4\xf8\x004LL4\b\x004L\x02\"%\x8e\t\n \n7x\x01'6\rO\\\xfeJYFw\x1d\xfe\x02\x02\x81\xfd~\x02\x82\x10\x1bv^fH\x17$\x15\x1e !\v\x90\"\x01xdjD\x19\"\x15\x16!\x01\x19\b\x9b6\xfd\xb4`\x16J\x03\xc2\xfb\x004LL4\x05\x004LL\x00\x18\x00\x00\xff\x80\t\x00\x05\x80\x00\x11\x00\x19\x00+\x003\x00@\x00G\x00X\x00c\x00g\x00q\x00z\x00\x9c\x00\xb8\x00\xc7\x00\xe5\x00\xf9\x01\v\x01\x19\x01-\x01<\x01J\x01X\x01{\x01\x8b\x00\x00\x01&#\"\x0e\x02\x15\x14\x1e\x02327&\x02\x127\x06\x02\x12\x176\x12\x02'\x16\x12\x02\a\x1632>\x0254.\x02#\"\x0135#\x153\x15;\x025#\a'#\x1535\x1737\x03\x15+\x015;\x01\x153'23764/\x01\"+\x01\x15353$4632\x16\x15\x14\x06#\"$2\x17#\x04462\x16\x15\x14\x06#\"6462\x16\x15\x14\x06\"\x17\"'\"&5&547476125632\x17\x161\x17\x15\x16\x15\a\x1c\x01#\a\x06#\x06%354&'\"\a&#\"\a5#\x1535432\x1d\x0135432\x15\x173=\x01#\x15&#\"\x06\x14\x1632?\x014/\x01&5432\x177&#\"\x06\x15\x14\x1f\x01\x16\x15\x14#\"'\a\x16326\x17'\x06#\"=\x0135#5#\x15#\x153\x15\x14327\"\x06\x15\x14\x16327'\x06#\"'354&3\"\a5#\x1535432\x177&\x16\x14\x16327'\x06'\"&4632\x177&#\"\x173=\x01#\x15&#\"\x06\x14\x1632?\x01\"\a5#\x1535432\x177&\x173=\x01#\x15&\"\x06\x14\x1632?\x01\a\"#\x06\a\x06\x15\x06\x15\x14\x17\x14\x17\x1e\x013274?\x0167654'&'4/\x01\"&\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04_\x80\x99g\xbd\x88QQ\x88\xbch\x99\x80\x83^_\xa3~\\[\u007f\u007f[\\]\x82_^\x83\x80\x99h\xbc\x88QQ\x88\xbdg\x99\x02e\a\x11\a\x03\x1d\x04\x05\x06\x06\x05\x03\x06\x04\x05\b\x02\x03\x03\x02\x03\x04\x01\x01\x01\x01\x01\x01\x02\x01\x06\x03\x01\xfb\x16\x16\x13\x12\x16\x16\x12\x13\x01\xa5<\x05F\x01\x87\x16$\x17\x16\x13\x12\xfa\x17$\x17\x17$\x87\x02\x02\x01\x04\x01\x01\x02\x01\x02\x02\x02\x03\x01\x04\x02\x01\x01\x01\x01\x02\x02\x01\xfa\xbc\x1e\x1d\x19 \x0f\x0e\x1f\x18\x0f\x1e\x1e!\x1e\x1d!\x1e\xa6\x1d\x1d\x11\x1a\x1d&&\x1d\x1c\x0f\xb2/\x0e\x17\x19\x17\x14\f\x16!\x1a\x1e/\r\x18\x1f\x19\x14\r\x19!\x1d!\x82\b\r\r\x1300\x1e\x1c\x1c/\x15e\x1d&'\x1e!\x16\x0e\x12\x15\"\ae$\x83\x17\f\x1e\x1e\x1d\n\b\t\t\x12'!\x1d\x13\x0e\x12\x11\x12\x17\x17\x12\x13\x10\x0e\x14\x1c!\xce\x1e\x1e\x0f\x1b\x1d''\x1d\x1c\x0e\x85\x17\f\x1d\x1d\x1d\n\b\t\b\u007f\x1d\x1d\x0f8''\x1c\x1d\x0eN\x02\x02\x01\x02\x02\x03\x01\x01\x03\x02\x04\x03\x04\x02\x02\x02\x01\x02\x01\x01\x01\x02\x02\x02\x01\x04\x01gL4\xf8\x004LL4\b\x004L\x04\xabUQ\x88\xbcgh\xbc\x88QUk\x01=\x01(\x14\x18\"\x06\x02\x04\n\x0f\v\x18\x0e\x18\x14!\x06\x02\x04\n\x11\x0e\x17\x11\x18\x0e\x19\a\x16=\x1b))\x1b=2\x8e(\x1f '\x13\x16\x0f!\f '\x14\x10\x87L#\x04\x1c\x04(>(\x10\x18\r\x01\x18&\x18\f\x18\x10\x8bDC\x10\x14(>(\x14z\x14\x10\x87L#\x04\x1c\x04\x8bDzG\x14)<)\x14\x03\x01\x01\x02\x01\x03\x02\x04\x03\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x03\x02\x03\x04\x02\x01\x03\x01\x01\x01\x01\x04\xe5\xfb\x004LL4\x05\x004LL\x00\x00\f\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x11\x00\x1b\x00\x1f\x00B\x00W\x00b\x00j\x00q\x00}\x00\x8a\x00\x9a\x00\x00\x01\x14\a\x06+\x01532\x17\x16%\x14+\x01532\x054&+\x01\x113276\x173\x11#\x054&'.\x0154632\x177&#\"\x06\x15\x14\x16\x17\x16\x17\x16\x15\x14\x06#\"'\a\x16326\x055\x06#\"&54632\x175&#\"\x06\x14\x1632\x01\x11\x0e\x01\f\x02\x05!26\x004&\"\x06\x14\x162%\x13#\a'#\x13735#535#535#\x013'654&+\x01\x11353\x01\x11\x14\x06#!\"&5\x11463!2\x16\x019$\x1d<\x11\x11=\x1c$\x06\xf0@\x13\x14?\xf9SdO__J-<\x1eAA\x01@)7\x1d\x15\x1b\x15\x1d\x18\")9,<$.%\b\x13\x1c\x160\x17*,G3@\x01\x16%)1??.+&((JgfJ*\x04\xf7A\x9f\xfe\xc4\xfe\xa9\xfe\x14\xfe\xfe\x06!\x1a&\xfc\xadj\x96jj\x96\x01\x02\x90GZYG\x8eиwssw\xb8\x01\x87PiL>8aA\t\x01!M7\xf8\b7MM7\a\xf87M\x02\xf73!\x1a\xdc\x1b\x1f\r4erJ]\xfe\xb3&3Y\x01M\xe8(,\x14\n\x12\x0e\x10\x15\x1b,%7(#)\x10\r\x06\f\x16\x14\x1b,(@=)M%A20C&M\x14e\x92e\xfd\xb7\x02\x0f(X\x92\x81\x8c0&\x02Ėjj\x96j\b\x01V\xe0\xe0\xfe\xaa\t8Z8J9\xfe\xb3\x8c\x10N/4\xfe\xb3\x85\x02$\xfb\f8NN8\x04\xf48NN\x00\x00\x00\x00\x12\x00\x00\xff\x80\t\x00\x05\x80\x00\x02\x00\v\x00\x0e\x00\x15\x00\x1c\x00#\x00&\x00:\x00O\x00[\x00\xce\x00\xe2\x00\xf9\x01\x05\x01\t\x01$\x01?\x01b\x00\x00\x133'\x017'#\x153\x15#\x15%\x175\x174+\x01\x1532%4+\x01\x1532\x014+\x01\x1532\x053'%\x11#5\a#'\x15#'#\a#\x133\x13\x113\x177\x01\x14\x0e\x04\"&#\x15#'\a!\x11!\x17732%\x15#\x113\x15#\x153\x15#\x15\x01\x15\x14\x06#!\"&5\x11373\x1735\x1737\x15!572\x1d\x01!5\x1e\x026373\x1735\x173\x11#\x15'#\x15'#\"\a5#\x15&#!\a'#\x15'#\a\x11463!2\x16\x15\x11#\"\a5#\"\a5!\x15&+\x01\x15&+\x01\a'!\x11!7\x1735327\x153532\x16\x1d\x01!27\x1532%\x14\x06\a\x1e\x01\x1d\x01#54&+\x01\x15#\x1132\x16\x01\x14\x06\a\x1e\x01\x1d\x01#46.\x03+\x01\x15#\x11\x172\x16\x01\x15#\x113\x15#\x153\x15#\x15\x01\x11#\x11\x01\x14+\x0153254&\".\x01546;\x01\x15#\"\x15\x14\x166\x1e\x017\x15\x06+\x0153254&\x06.\x02546;\x01\x15#\"\x15\x14\x1e\x01\x03\x11#'\x15#'#\a#\"54;\x01\x15\"&\x0e\x04\x15\x14\x16;\x0173\x13\x113\x175wY-\x02AJF\xa3\x8e\x8e\x01=c\xbd(TS)\x01!*RQ+\xfe\xea*RQ+\x01\xcbY,\xfc\x16B^9^\x84\x19\x87\x19Ft`njUM\x02\x98\v\x11\x1c\x18'\x18)\t~PS\xff\x00\x01\x04PR\xcfm\xfe\xdd\xd9٘\x94\x94\x05\xd4M7\xf8\b7Mo\x197\x19\xda\x13q\x14\x02\x1d\n\n\x01\x17\x17@)U\t\x198\x19\xe3\"\xb6\xb4\x19\xb9\x17\xf9E(\xac\x181\xfd\x8c++\xc6\x16\xa9NM7\a\xf87Mx3\x1e\xb17\x17\xfe\xc4\x1f8\xd1\x17D\xea62\xfe\xa3\x01W74\xd3\x15;\x1f\xae\b\b\x04\x02\x119\x1f\xa8<\xfd-\x18\x16\x19\x12A\x18\"EA\x9a0:\xfe\xeb\x19\x15\x1a\x11A\x01\x01\x05\f\x17\x12F@\x991:\x02\x11\xd8ؗ\x94\x94\xfe\xedB\x02\xf7f~~\"\"12\"4(\x82w$#11#\xef\x18@}}!\x19%+%\x195(\x81v$:O\x94\\z\x84\x1a\x86\x19K\x81\x85?\a*\x0f\x1f\f\x11\x06\x1b$\x1d\\amcr\x03Vl\xfd\x86OO176Nn\xd9\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x06\x15\x14;\x012\x004&+\x01\"\x0f\x01'&+\x01\"\x06\x15\x14\x1e\x01\x17\x06\x15\x14;\x0127\x01%4&+\x01\"\a\x03\x06\x16;\x012?\x01>\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x14\x06\x15\x14;\x012\x1354+\x01\"\a\x03\a\x14\x16;\x0127\x01\x0e\x01#\a76;\x012\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xe93%\x1d#2%\x1c%\x03\x11,, \x11\x02\v\x12\x16\x1a\x18\x01_3$\x1d$2%\x1c%\xfa\xa8M>\xa0\x13\x02A\x01\b\x06L\x14\x02\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1bDHeE:\x1c<\x12\x04\rE\x13\x01\xc2\b\x05M\v\aj,\x05\x11K\x05\b'-\x01R\rM\v\a\x00\xff\x01~M>\x9f\x14\x02A\x01\b\x06R\f\x04\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1aEHeE:\x1d<\x11\x04\rE\x13\xdd\rJ\v\x02A\x01\b\x06B\x13\x02\xf9I\x05*'!\x11\x02\v\x13($\arL4\xf8\x004LL4\b\x004L\x02v%1 \x1c%3!x*\x1e\x01k\v\x04\x15\xa9$2 \x1c%3!\x8e;5\x13\xfeh\x06\n\x13n\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\f\t\x10\x01\x15\n\t\n\x9c\x96\x10\t\x05\x02r\x84\x04p\b\r\n\x01p8;5\x13\xfeh\x06\n\rt\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\x01\x10\x04\x10\x01\xac\x01\x0e\v\xfe`\x02\x05\t\x13\x01\x13#\x16\x01k\v\x17\x01\xdf\xfb\x004LL4\x05\x004LL\x00\x00\x00\n\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x0f\x002\x00H\x00W\x00[\x00l\x00t\x00\x8b\x00\x9b\x00\x00\x01\x14\a\x06#\"'5632\x05#632\x054&'.\x015432\x177&#\"\a\x06\x15\x14\x16\x17\x1e\x01\x15\x14#\"&'\a\x163276\x017#5\x0f\x033\x15\x14\x17\x163275\x06#\"=\x01\x055&#\"\x06\a'#\x113\x11632\x133\x11#\x054'&#\"\a'#\x1175\x163276\x004&\"\x06\x14\x162\x014'&#\"\x06\x15\x14\x17\x16327'\x06#\"'&'36\x13\x11\x14\x06#!\"&5\x11463!2\x16\x06=\x15\x13!\x17\x12\x1d\x1c9\x01\xb6n\x0623\xf9\xecBD$ &:B\x12CRM.0AC'\x1f0\x1dR\x1f\x12H`Q03\x01'\x13`\x81\x12.\x11>,&I / \f*\x01\x89\x0f\r /\n\n\x83\x96\x1a8\x10/\x96\x96\x02n-(G@5\b\x84\x96$ S3=\xfe,.B..B\x03\xb002^`o?7je;\x109G+\x14\x17\x05\xf8\x02\x80L4\xf8\x004LL4\b\x004L\x02yE%#\t\xe0\x1eVb\xe9;A\x19\r\x16\x0e\x1a!p &'F:A\x18\x0e\x17\x10\x1f\x19\x12q)%)\x01#o\x87\x15r\bg\xdbT$\x1e\vv\a2\xc5\x19\x8b\x03 \x1e8\xfe)\x012\x1f\xfe\xaf\x01\xd7\xdez948/\xfd{\x19\x97\v8A\x01\xc4B..B/\xfe\xebq?@\x84r\x80<7(g\x1f\x13\x13/\x0e\x02\xb1\xfb\x004LL4\x05\x004LL\x00\x00\x03\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x17\x00?\x00\x00\x01\x12\x17\x14\x06#!\x14\x06\"&'\x0524#\"&54\"\x15\x14\x16\x01\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x17\x06\x16=\xedL4\xfe@\x96ԕ\x01\x01\x00\x10\x10;U g\x043\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\b\x02\xac\xfe\x9c\xc84Lj\x96\x95j\xaf U;\x10\x10Ig\x06@\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\n\x00\x00\x00\x00\x04\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x16\x00&\x00N\x00\x00\x044#\"&54\"\x15\x14\x163\t\x01.\x01#\"\x0e\x02\x15\x10\x01\x14\x06#!\x14\x06\"&'7!&\x037\x12\x01\x17\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x04\x10\x10;U gI\xfd\xf7\x03m*\xb5\x85]\x99Z0\x04\xc0L4\xfe@\x96ԕ\x01\x95\x02\xf5\xa6=o=\x01CT\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\xb0 U;\x10\x10Ig\x01\xeb\x02\xf8Xu?bl3\xfe\x80\xfe@4Lj\x96\x95j\x81\xbb\x01\x10a\xfe\x9c\x04\xa8`\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\x00\x00\x00\x00\x05\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x007\x00[\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd\xe0\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\xa0\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x03\xeeu\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00,\x00<\x00H\x00\x00\x01\x15\x14\x0e\x02#\"\x0054\x0032\x1e\x03\x1d\x01\x14+\x01\"=\x014&#\"\x06\x15\x14\x16326=\x0146;\x012\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04~Isy9\xcd\xfe\xed\x01\x10\xcb\"SgR8\x10v\x10\x83H\x8c\xb1\xb7\x8eD\x8c\t\x06w\x06\n\xfc\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcem2N+\x16\x01\x16\xcf\xcb\x01\x10\t\x1b)H-m\x10\x10F+1\xb7\x92\x97\xc50*F\a\t\t\x03+f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00b\x00\x00\x014&#\"\x0e\x02\x15\x14\x1632>\x01\x05\x14\x0e\x02\a\"\x06#\"'&'\x0e\x01#\"&54\x12632\x16\x17?\x01>\x01;\x012\x17\x16\a\x03\x06\x15\x14\x163>\x045\x10\x00!\"\x0e\x02\x10\x1e\x023276\x16\x1f\x01\x16\a\x06\a\x0e\x01#\"$&\x02\x10\x126$3 \x00\x03\xcck^?zb=ka`\xa0U\x024J{\x8cK\x06\x13\a_/\x1c\x054\x9f^\xa1\xb1\x84\xe2\x85W\x88&\x02\v\x01\t\x05v\x05\b\x05\x02x\x05\x19 \x1c:XB0\xfe\xa4\xfe܂\xed\xabff\xab\xed\x82\xe4\xb1\v\x1a\b)\b\x01\x02\nf\xfb\x85\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x01X\x01\xa8\x02\xf9lz=l\xa6apz\x85\xc7\x11o\xacb3\x02\x015!2BX\xbf\xae\x9d\x01\n\x9bG@\x138\x06\f\v\x05\v\xfd\x9a\x18\x18'\x1a\x01\t'=vN\x01$\x01\\f\xab\xed\xfe\xfc\xed\xabf\x90\t\x02\v1\f\f\r\tSZz\xce\x01\x1c\x018\x01\x1c\xcez\xfeX\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x00(\x00\x00\x00\x16\x10\x0f\x01\x17\x16\x14\x0f\x01\x06\"/\x01\x01\x06+\x01\x05'\x13547\x01'&4?\x0162\x1f\x0176\t\x01'\x01\x15\x06D\xbc^\xe1h\n\n\xd2\n\x1a\ni\xfd\xa5%5\xcb\xff\x00@\x80%\x02[i\n\n\xd2\n\x1a\nh\xdf]\xfc\xc5\x02@\xc0\xfd\xc0\x06\x00\xbc\xfe\xf7]\xdfh\n\x1a\n\xd2\n\ni\xfd\xa5%\x80@\x01\x00\xcb5%\x02[i\n\x1a\n\xd2\n\nh\xe1^\xfa@\x02@\xc0\xfd\xc0\xc0\x00\x02\x00\x00\xff\x00\x06\xfe\x06\x00\x00\x10\x00)\x00\x00\x012\x16\x15\x14\a\x00\a\x06#\"&547\x016\x01\x1e\x01\x1f\x01\x16\x00#\".\x025\x1e\x03327>\x04\x06OFi-\xfe\xb4\x85ay~\xb5\\\x02~;\xfc\xba'\x87S\x01\x04\xfe\xf5\xd7{\xbes:\aD8>\x0f)\x0e\x19AJfh\x06\x00]F?X\xfd\x8b{[\xb9\u007f\x80T\x02C6\xfb\xf6Ll\x16G\xd5\xfe\xf4]\xa2\xccv\x052'\"%B];$\x0f\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%\x11!\x112>\x017>\x0132\x1e\x01\x17\x1e\x0232>\x017>\x0232\x16\x17\x1e\x022>\x017>\x0132\x16\x17\x1e\x02\x13\x15\".\x01'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x01#546;\x01\x11!\x11!\x11!\x11!\x11!\x1132\x16\x01\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\a\x00\xf9\x00-P&\x1c\x1e+#\x18(\x16\x16\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&PZP&\x1c\x1e+#\"+\x1e\x1c&P-\x18(\x16\x16\x1d$P-.P$\x1d\x16\x16(\x18#+\x1e\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&P-.P$\x1d\x1e+#pP@\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00@Pp\xfb\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x80\xfe\x80\x01\x80\x1c\x1b\x18\x1b\x16\x0e\x10\x13\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1b\x18\x1b\x16\x16\x1b\x18\x1b\x1c\x01@\xc0\x0e\x10\x13\x19\x1a\x1c\x1c\x1a\x19\x13\x10\x0e\x16\x1b\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1a\x19\x1b\x16\xc0Pp\x01\xc0\xfe@\x01\xc0\xfe@\x01\xc0\xfe@p\x03\x10MSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\v\x00\x00!\x15!\x113\x11\t\x01!\x11\t\x01\b\x00\xf8\x00\x80\x06\x00\x01\x00\xf9\x80\x01\xc0\x02@\x80\x06\x00\xfa\x80\x04\x00\xfc\x80\x02@\x02@\xfd\xc0\x00\x00\x00\x03\x00\x00\xff\x80\x06\xc0\x06\x00\x00\v\x00\x10\x00\x16\x00\x00\t\x01\x06\x04#\"$\x02\x10\x12$3\x13!\x14\x02\a\x13!\x112\x04\x12\x03\x00\x02\"j\xfe\xe5\x9d\xd1\xfe\x9f\xce\xce\x01aѻ\x03\x05xl\xa4\xfd\x00\xd1\x01a\xce\x02\x86\xfd\xdelx\xce\x01a\x01\xa2\x01a\xce\xfd\x00\x9d\xfe\xe5j\x02\xa2\x03\x00\xce\xfe\x9f\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\x1f\x00\x00!\x15!\x113\x11\x01\x11\x14\x06/\x01\x01\x06\"/\x01\x01'\x0162\x1f\x01\x01'&63!2\x16\b\x00\xf8\x00\x80\a\x00'\x10y\xfd\x87\n\x1a\n\xe9\xfe`\xc0\x02I\n\x1a\n\xe9\x01\xd0y\x10\x11\x15\x01\xb3\x0e\x12\x80\x06\x00\xfa\x80\x04\xe0\xfeM\x15\x11\x10y\xfd\x87\n\n\xe9\xfe`\xc0\x02I\n\n\xe9\x01\xd0y\x10'\x12\x00\x00\x01\x00\x00\x00\x00\a\x00\x04W\x00`\x00\x00\x01\x14\x17\x1e\x03\x17\x04\x15\x14\x06#\".\x06'.\x03#\"\x0e\x01\x15\x14\x1632767\x17\x06\a\x17\x06!\"&\x0254>\x0232\x1e\x06\x17\x1632654.\x06'&546\x17\x1e\x01\x17#\x1e\x02\x17\a&'5&#\"\x06\x05\f\n\n\x1e4$%\x01Eӕ;iNL29\x1e1\v ;XxR`\xaef՝\xb1Q8\x1bT\x0f\x1d\x01\x83\xfe\xff\x93\xf5\x88W\x91\xc7iW\x90gW:;*:\x1a`\x89Qs&?RWXJ8\v\x03\xafoNU0\x01\f\x16\x1e\x04\x81\x1a\x1c\x17J1F\x03@\x06#\x1d)\x1b\r\n[\xf1\x92\xc1%6_P\u007fO\x86\x1cQiX(o\xb2`\xa0\xef_?5\x98\"$\x01\x98\x9e\x01\x01\x92iʗ\\&>bd\x86s\x926\xc8aP*< \x1f\x17-;iF\x10\x11n\xa4\x04\x03\x17*\v\x1b-\x05c1\x15\x01\x15B\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00W\x00g\x00\x00\x014'.\x02'4.\x0154632\x17#\x16\x177&'.\x01#\"\x06\x15\x14\x17\x1e\x01\x17\x1e\x03\x1d\x01\x16\x06#\"'.\x05#\"\x0e\x01\x17\x15\x1e\x0232767'\x0e\x01#\"&54632\x16\x17\x1e\a326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x98\xea#$(\t\x04\x021$6\x11\x01\x14\x13]'\n!E3P|\x02\x10ad\x1d(2\x1b\x01S;aF\x179'EO\x80Se\xb6j\x03\x04]\xaem\xba]\x14\v<*rYs\x98\xa4hpt.\b#\x16)$78L*k\x98h\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xe4\xadB\n\r%\x1c\x02\r\v\x02$/\x0f\x0f$G6\n\x1d\x14sP\a\x10`X\x1d\b\x0f\x1c)\x1a\x05:F\x90/\x95fwH1p\xb8d\x01l\xb6qn\x1b\x18mPH\xaeui\xa8kw\x15_:[9D'\x1b\x8b\x02\xe5\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x0f\x00\x1f\x003\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01$4.\x02#!\x16\x12\x10\x02\a!2>\x01\x12\x10\x0e\x02#!\".\x02\x10>\x023!2\x1e\x01\x04\x80Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x03QQ\x8a\xbdh\xfe~w\x8b\x8bw\x01\x82h\xbd\x8a\xd1f\xab\xed\x82\xfd\x00\x82\xed\xabff\xab\xed\x82\x03\x00\x82\xed\xab\x02\x18н\x8aQQ\x8a\xbdн\x8aQQ\x8a\xbdн\x8aQZ\xfe\xf4\xfe\xcc\xfe\xf4ZQ\x8a\x01\xa7\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05\x00\x00\x13\x00#\x00\x00\x18\x01>\x023!2\x1e\x02\x10\x0e\x02#!\".\x01\x042>\x024.\x02\"\x0e\x02\x14\x1e\x01f\xab\xed\x82\x03\x00\x82\xed\xabff\xab\xed\x82\xfd\x00\x82\xed\xab\x04\xb2н\x8aQQ\x8a\xbdн\x8aQQ\x8a\x01\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x91Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x00\x00\x05\x00\x00\x00\x00\t\x00\x05\x00\x00\x0e\x00\x12\x00\x18\x00,\x00\\\x00\x00\x01!\"&?\x01&#\"\x06\x10\x16326'3&'\x05\x01!\a\x16\x17\x04\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\x16 \x00\x10\x00 \x005467'\x01\x06+\x01\x0e\x01#\"\x00\x10\x0032\x177#\"&463!\x15!'#\"&463!2\x17\x01632\x02\xfa\xfe\xc6(#\x18\xbcAH\x84\xbc\xbc\x84s\xb0\xa3\xba\x129\x01q\x01 \xfe ci\x15\x05\x05\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\xbc\x01\b\x01<\xfe\xf9\xfe\x8e\xfe\xf9OFA\xfe\x9f\x12!\xc5\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9re\x89\xe0\x1a&&\x1a\x01\x80\x01\xb3U\xde\x1a&&\x1a\x01\x00!\x14\x01\v[e\xb9\x01\x80F \xfb\x1f\xbc\xfe\xf8\xbc\x91\xefU?\x94\x01\x80\x84g\x95\xc4\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\xbc\x01\xf9\xfe\x8e\xfe\xf9\x01\a\xb9a\xad?b\xfe+\x1a\xa4\xdc\x01\a\x01r\x01\a7\xb7&4&\x80\x80&4&\x1c\xfep,\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x00\x0f\x00\x1f\x00+\x00K\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x03.\x01#!\"\x06\a\x03\x06\x163!26\x024&#!\"\x06\x14\x163!2\x01\x11#\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\x1147\x13>\x01$ \x04\x16\x17\x13\x16\x01\x80KjKKj\x04KKjKKj\x1dH\x05#\x17\xfcj\x17#\x05H\x05&\x1e\x04&\x1e&\xe7\x1c\x14\xfd\x80\x14\x1c\x1c\x14\x02\x80\x14\x01\xac\x80KjK\xfd\x00KjK\x80\x19g\t\xb1\x01\x1b\x01V\x01\x1b\xb1\ti\x17\x01\vjKKjKKjKKjK\x02\f\x01\x80\x17\x1d\x1d\x17\xfe\x80\x1e..\x02n(\x1c\x1c(\x1c\xfd[\xfd\xa5\x805KK5\x80\x805KK5\x80\x02[po\x01\xc6Nv<\x02\x01\x14\x06+\x01\x16\x15\x14\x02\x06\x04#\"\x00'#\"&546;\x01&54\x126$32\x00\x1732\x16\x05\xb72$\xfdB$22$\x02\xbe$\x01\b\x17\xfc*$22$\x03\x8cX\xfeڭ\xb1\xfeӯ\x17\x03\xd6$22$\xfctX\x01'\xad\x84\xf2\xaeh\x01s2$\x83\x11\x83\xdc\xfeϧ\xf6\xfekc\xbd$22$\x84\x11\x83\xdc\x011\xa8\xf5\x01\x95c\xbc$2\x02\xe3F33F3VVT2#$2\x8f\xa8\xaf\xfeԱVT2#$2\x8f\xa8g\xaf\xf1\x01\x84#2UU\xa7\xfe\xcf݃\x01\n\xd92$#2UU\xa7\x011݃\xfe\xf6\xd92\x00\x00\x06\x00\v\xff\x00\x04\xf5\x06\x00\x00\a\x00\x0f\x00\x1b\x00,\x00u\x00\xa3\x00\x00\x01\x03\x17\x1254#\"\x01\x16\x1767.\x02\x01\x14\x13632\x17\x03&#\"\x06\x03\x14\x1e\x0132654'.\x03#\"\x06\x03\x14\x17\x1e\x013276\x114.\x01'&$#\"\a\x06\x15\x14\x1e\x047232\x17\x16\x17\x06\a\x06\a\x0e\x01\x15\x14\x16\x15\a\x06\x15&'\x06#\x16\x15\x14\x06#\"&547\x16\x17\x1632654&#\"\x06\a467&54632\x17\x0254632\x13\x16\x17>\x0532\x16\x15\x14\x03\x1e\x03\x15\x14\x02\x0e\x01#\"'&\x02\x03\xb9ru\xa5&9\xfe\x8c\x1e\x03%\"\f*#\xfe͟\x11 \x0fO%GR\x9f=O&\x0e^\xaa\xfc\x98op\x95\xda\x04\x86\xfe\xb8\x15\x01\xc3C8\xfcpP\b*\x19\x02\a\a\x03\x85b\xfeY\n\x05\x01_\xdc#\xfc\xf5$\xa6\x8c\x1a\x0e\x18N Pb@6\xfe\x9d)?\x91\xa4\xaa\xa9\x01\x02+0L\x1215\v\x05\x1e\"4\x1c\x13\x04\x04\x02\x13\x13$\x1c\x1a\x16\x18.\x88E\x1fs\x1e\f\f\x02\n\xce\x02\a\x0e5I\x9cQ\"!@\fh\x11\f\"\xdeY7e|\x1aJ\x1e>z\x0f\x01\xceiPe\xfd\xbb\x11\x06\x10\u007fn\x91eHbIl\xfeF\x0f>^]@\x96\xfe\xfc\xben*9\x01\r\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x00\x05\x80\x00\x1a\x006\x00[\x00_\x00\x00\x013\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x0232%3\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x02326%4&'.\x02'&! \a\x0e\x02\a\x0e\x01\x15\x14\x16\x17\x1e\x02\x17\x16\x04! 7>\x027>\x01\x13\x11!\x11\x03\x11\xcf\x0e\xa9\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcb\x05=39?\n\x1a6'_\x02\xd6\xce\x0e\xa8\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcc\x04>29?\n\x1a5'17\x01m\x1f-\x06\x0f\x1c\x02V\xfd\x9d\xfd\x8fU\x05\x19\x11\x06-\x1e\x1e-\x06\x12\x17\x06,\x01\x87\x01\x13\x02bW\x05\x18\x11\x05.\x1e\xc0\xf8\x00\x02\x10\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$\x8b\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$L\xb6\xcf\xc8=\b\f\x12\x02??\x04\x0f\r\b<\xc7\xd1\xd0\xc7=\b\x0e\x0e\x05! A\x04\x0e\x0e\t<\xc6\x03\xcb\xfa\x00\x06\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x05`\x05\x80\x00\x1d\x00;\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&#!\x11\x14\x06+\x01\"&5\x11463!2\x1e\x01\x01\x11\x14\x0e\x01#!\"&5\x1146;\x012\x16\x15\x11!265\x1146;\x012\x16\x03\xe0\x12\x0e\xa0\x0e\x12\xa0p\xfe\xf0\x12\x0e\xa0\x0e\x12\x12\x0e\x01Ї\xe4\x85\x01\x80\x85\xe4\x87\xfe0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x10p\xa0\x12\x0e\xa0\x0e\x12\x03\x90\xfe\x10\x0e\x12\x12\x0e\x01\xf0p\xa0\xfb\x80\x0e\x12\x12\x0e\x05@\x0e\x12\x85\xe4\x01I\xfc\x90\x87\xe4\x85\x12\x0e\x03\xc0\x0e\x12\x12\x0e\xfd\x00\xa0p\x03p\x0e\x12\x12\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00S\x00c\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x0554&+\x01\"\a&+\x01\"\x06\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012%54&#!\"\x06\x15\x11\x14;\x012=\x01\x16;\x0126\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x1f\x1b\x18\xca\x18\x1c\x1c\x18\xca\x18\x1b\xfe\x16A5\x85D\x1c\x1cD\x825A\x157\x16\x1b\x19^\x18\x1c\x156\x16\x1c\x18a\x18\x1b\x167\x15\x02MB5\xfe\xf85B\x167\x15\x1f?\xbf5B~\x88`\xfb\xd0`\x88\x88`\x040`\x88\x02\xb6r\x18\x1c\x1c\x18r\x18\x1c\x1c\xfe\xfa5A44A5\xfa\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16v\x9a5AA5\xfef\x15\x15\xb4*A\x02\x9d\xfb\xd0`\x88\x88`\x040`\x88\x88\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x19\x00\x00\x01!\x1b\x01!\x01!\x01!\t\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x93\xfeړ\xe9\x017\xfe\xbc\xfeH\xfe\xbc\x017\x01\u007f\x02j\xaav\xfc@v\xaa\xaav\x03\xc0v\xaa\x01\xc2\x02'\xfc\x97\x04\x00\xfc\x00\x01:\x02\xa6\xfc@v\xaa\xaav\x03\xc0v\xaa\xaa\x00\x00\x00\x00\x17\x00\x00\xff\x00\b\x00\x06\x00\x00M\x00U\x00a\x00h\x00m\x00r\x00x\x00\u007f\x00\x84\x00\x89\x00\x91\x00\x96\x00\x9c\x00\xa0\x00\xa4\x00\xa7\x00\xaa\x00\xaf\x00\xb8\x00\xbb\x00\xbe\x00\xc1\x00\xcb\x00\x00\x01\x14\x06\a\x03\x16\x15\x14\x06\a\x03\x16\x15\x14\x06#\"'!\x06\"'!\x06#\"&547\x03.\x01547\x03.\x015467\x134&547\x13&54632\x17!62\x17!632\x16\x15\x14\a\x13\x1e\x01\x15\x14\a\x13\x1e\x01\x01!\x01#\x01!62\x01\x16\x15\x14\a\x13\x177\x11'\x06\a\x01!\x17%!\x06\"\x0167'\a#7\x03\x01\x17\x017\x13!\x016\x053\x01!\x11\x17\x16\x03!7\x01\x0f\x0135\a\x16\x11\x14\x16\x15\x14\a\x17\x117\x11\x17\x01/\x01\a\x117'\x06%#\x05\x17\x15\t\x02%'\x11\x05\a3\x01\x17\x13/\x02&=\x01\x03&'\t\x025\x03\x13#\x13\x01\a?\x01\x13&547\v\x01\x176\b\x00\x1a\x14\xcd\x03\x19\x14\xc1\x03!\x18\x19\x10\xfep\x114\x11\xfeq\x11\x1a\x17\"\x04\xc1\x14\x19\x03\xce\x14\x19\x1b\x14\xc7\x01\"\xd1\x04\"\x17\x1a\x12\x01\x8c\x106\x10\x01\x8e\x12\x1a\x17\"\x04\xcf\x17 \a\xbb\x13\x19\xfc'\x01\x85\xfe\xaa\x8f\xfe\xaa\x01h\x12*\xfc[\x01\x02\xd0\x0f\xbc\xbb\r\x10\x02\xa8\xfe|\xbe\x02*\xfe\xe8\x10,\x02\xaf\x01\x04@\x11\x1e\x16\xfc\xfe\xd8?\x01w\x10A\xfeU\x01M\b\xfcp\x05\x01V\xfe\x8b\x04\x0e\x12\x01\x92@\xfe˝\xc1\xa3\xa8\x04\x01\b\xab\x1e\x99\x01)\xdf\xdf\x04Ϳ\x06\x03w\x10\xfd\x93\xd5\xfe\xd7\x017\x01(\xfd{\x88\x01\xe6*U\x01%\xee\x84\x03\x01\x16\b\xd8\x05\b\xfeK\x016\xfc\xc0\xa3\xa3\xa3\xa3\x04=0\x82(\xcf\x02\x03\xab\x81M\x05\x02\x81\x15\x1f\x04\xfe\x9c\t\t\x14\x1f\x04\xfe\xaf\b\b\x17\"\x12\x14\x14\x14!\x18\b\f\x01O\x04\x1f\x14\t\t\x01d\x05\x1f\x14\x15\x1f\x04\x01X\x01\x04\x01$\x0f\x01k\n\b\x18!\x15\x15\x15\x15!\x18\x06\f\xfe\x9a\x01!\x16\r\x0e\xfe\xbc\x04\x1f\xfc\xcd\x01b\xfe\x9e\x10\x03\x1c\x04\t\n\x05\xfe\x98\x06\xc7\x01[\xc2\b\x02\x01\xc0\xc8\xc8\x10\xfbT\x06\x05DOi\x01\n\xfe\xcd@\xfe\x90\x1c\x016\xfe\xa9\x04\x0f\x01b\xfe\xb1\x06\x05\x01xB\x01A\xa6ݽ\xb1\b\x035\x01\x02\x01\x10\r\xb1\x01\r\v\xfeɝ\x01:\xec\xde\b\xfe\xf8J\xc9\x02\f\xe0\xe1+\xfe\xc5\xfe\xc1\x013\x0f\x8d\xfe\xe4\xdd,\x01\x88\xfb\x02p\x05\x01\x15\r\x10\x02\x01x\x01\x04\xfe1\xfe\xb9\x01\xf6\xdf\xfe\xe6\xfc\x89\xfe\xe5\x01\x1b\xe3\xe3F\x01i\n\x04\x01\x0f\x01(\xfd\x9cR\x03\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\r\x00\x1b\x00\x00\x11463!\x01\x11\x14\x06#!\"&5%'\x114&#!\"\x06\x15\x11\x14\x163\xb7\x83\x02\xe6\x01`\xb7\x83\xfc\xf4\x83\xb7\x04а@.\xfe\x1c.@A-\x03X\x83\xbf\x01f\xfaB\x84\xbe\xbe\x84$\xb4\x01\xa9.BB.\xfe\x14.C\x00\x00\x04\x00\x00\xff\x83\x06\x00\x05}\x00\n\x00\x14\x00\x1e\x00)\x00\x00\x01\x04\x00\x03&54\x12$32\x05\x16\x17\x04\x00\x03&'\x12\x00\x01\x12\x00%\x16\x17\x04\x00\x03&\x05&'\x06\a6\x007\x06\a\x16\x03\xa6\xfe\xc3\xfe\"w\x14\xcd\x01`\xd0R\x01d]G\xfe{\xfd\xc5o]>p\x026\xfe\xa3s\x02\x11\x01c(\x0e\xfe\xdc\xfe@wg\x03\xcf\xc1\xae\x87\x9bm\x01J\xcc\x15PA\x05jy\xfe\x1d\xfe\xc1YW\xd0\x01a͊AZq\xfd\xc1\xfe{HZ\x01\x82\x02:\xfb<\x01d\x02\x14v\\gx\xfe>\xfe\xdb\x0e\x142AT\x17\xcd\x01Kn\x98\x84\xaf\x00\x00\x03\x00\x00\xff\x80\b\x00\x04\xf7\x00\x16\x00+\x00;\x00\x00\x01\x13\"'&#\"\a&#\"\a\x06+\x01\x136!2\x1763 \x012\x16\x17\x03&#\"\a&#\"\a\x03>\x0232\x1767\x03\x06\a&#\"\a\x03>\x0132\x176\x17\ae\x9b\x83~\xc8\xc1└\xe2\xc1Ȁ|\x05\x9b\xe0\x01\x02隚\xe9\x01\x02\xfe\xf1\x81Ν|\xab\xc5\xe0\x96\x96\xe0ū|iy\xb0Zʬ\xac\xf27Ӕ\x98ް\xa0r|\xd1uѥ\xac\xca\x04x\xfb\b9[\x94\x94[9\x04\xf8\u007fjj\xfb\xa69A\x03\xfdN\x8d\x8dN\xfc\x03+,#ll\"\x03\x8b\x04\x97\x9bB\xfcS32fk\x05\x00\x00\x05\x00\x00\xff\xa5\b\x00\x05[\x00\x0f\x00\x1f\x00/\x00?\x00\\\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x14\x06#!\"&5467&54632\x176$32\x1e\x01\x15\x14\a\x1e\x01\x05\xdc\x1e\x14]\x14\x1e\x1e\x14]\x14\x1e\xfe\xe4\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\x05\x88\xec\xa6\xfb$\xa6\xec~i\n\xa1qfN-\x01*\xbd\x95\xfc\x93\x0e\x87\xac\xa5\x02\xdd\x15\x1e\x1e\x15\xfd#\x14\x1e\x1e\x14\x02\x13\x14\x1e\x1e\x14\xfd\xed\x14\x1e\x1e\x14\x01\xad\x14\x1e\x1e\x14\xfeS\x14\x1e\x1e\x14\x01j\x14\x1e\x1e\x14\xfe\x96\x14\x1e\x1e\xa6\xa6\xec\xec\xa6t\xc52\"'q\xa1C\xb7\xea\x93\xfc\x95B8!\xdb\x00\x00\x00'\x00\x00\xff>\x06\x00\x06\x00\x00\x04\x00\t\x00\r\x00\x11\x00\x15\x00\x19\x00\x1d\x00!\x00%\x00)\x00-\x001\x005\x009\x00=\x00A\x00E\x00I\x00M\x00Q\x00U\x00Y\x00]\x00a\x00g\x00k\x00o\x00s\x00w\x00{\x00\u007f\x00\x85\x00\x89\x00\x8d\x00\x91\x00\x95\x00\x99\x00\xa5\x00\xd5\x00\x00\x11!\x11\t\x01%\x11!\x11\t\x015!\x15\x13\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x177\x17\a\x177\x17\a\x177\x17\a\x177\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a\x01\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x01\x15#53\x157\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x175#53\x15\a53\x15\a53\x15\a53\x15\a53\x15\a53\x15%\"&54632\x16\x15\x14\x06\x01\x14\x1e\x026\x16\x15\x14#\"'#\a\x1632>\x0254.\x01\x06&54>\x0132\x16\x1737.\x06#\"\x0e\x02\x06\x00\xfc\xf8\xfd\b\x05\x9c\xfa\xc8\x02\x95\x02\xa3\xfa\xc8Q%%%%%%%%%?\x0fi\x0f\x1f\x0fi\x0f\x1e\x0fi\x0f\x1f\x0fh\x0fOi\x0fixi\x0fiyi\x0fixi\x0fi\xfcAr\x01\x14s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\x01\x14r\xfb\xb8%s\xa2s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\xf0Ns%%%%%%%%%%\xfd\x88\x81\xb8\xb8\x81\x82\xb7\xb7\xfe\xd9'\x0232\x16\x15\x14\a\x06\x04#\".\x0154\x0032\x1e\x0532654&#\"\x06#\"&54654&#\"\x0e\x02#\"&547>\x0132\x16\x15\x14\a6\x05\x96\x01\x04\x94\xd2ڞU\x9azrhgrx\x98S\x9a\xc3Пd\xd8U\x05 \x1c\b\x0e\x15\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x04\xc0&\x1a\x80&4&\x80\x1a&&\x1a\x80&4&\x80\x1a\xfd\xe6KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x80\x1a&&\x1a\x80&4&\x80\x1a&&\x1a\x80\xfd5jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\x17\x00\x1f\x00'\x00S\x00\x00\x004&\"\x0f\x01\x114&\"\x06\x15\x11'&\"\x06\x14\x17\x01\x1627\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x13\x11\x14\x06\a\x05\x1e\x02\x15\x14\a!2\x16\x14\x06#!\"&54>\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x05\x00&4\x13\x93&4&\x93\x134&\x13\x01\x00\x134\x13\x01\x00\xfd\x93KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x13\x92\x01%\x1a&&\x1a\xfeے\x13&4\x13\xff\x00\x13\x13\x01\x00\xfd\"jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x00\x05\x80\x00\x02\x00\x05\x00\t\x00\f\x00\x10\x00\x14\x00&\x00\x00\x13\t\x03!'\x13!\t\x02!%!\x03!\x01!\x01!%\x01\x16\x06\a\x01\x06\"'\x01.\x017\x0163!2\xd4\x02o\xfe\xd4\x01\xe9\x01]\xfdF\x89\xcc\xfe\xfa\xfe\xe0\x03\xfd\x02o\xfe\xbd\xfc\xc2\x02\xaa\xcc\xfe\xee\x02o\x01Z\xfe\xe0\xfe\xfa\x01Y\x01\x80\x0e\x02\x10\xfc@\x12:\x12\xfc@\x10\x02\x0e\x01\x80\x12!\x04\x80!\x03\x00\xfdg\x02\x99\xfc\xfc\x03\x04\x80\x01\x80\xfe\x80\xfc\xe7\x02\x99\x80\x01\x80\xfe\x80\x01\x80f\xfe\x00\x12/\x11\xfc\x00\x14\x14\x04\x00\x11/\x12\x02\x00\x1a\x00\x03\x00\x13\xff\x00\a\xed\x06\x00\x00I\x00\x97\x00\xa0\x00\x00\x0562\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x017\x17762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01%\x06\"/\x017\x17762\x1f\x017\x11\x03&6?\x01\x1135!5!\x15!\x153\x11\x17\x1e\x01\a\x03\x11762\x1f\x01762\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\x01\x15%\x055#5!\x15\a\x13\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13\x80ZSS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\xfa-\x134\x13\x80ZSS\x134\x13S@\xd2\x11\x14\x1e\xb1\x80\x01\x00\x01\x00\x01\x00\x80\xb1\x1e\x14\x11\xd2\x13\x134\x13SS\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\x01@\x01\x80\x01\x80\x80\xfe\x00\x13\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13Sy\x13\x13\x80ZRR\x13\x13R@\x01%\x01:\x1a=\n:\x01+\x80\x80\x80\x80\xfe\xd5:\n=\x1a\xfe\xc6\xfe\xdb\x12\x13\x13RR\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13S\x04\x1a\x80\x80\x80\x80\x80\x80\x00\x00\x00\x04\x00\x00\xff\x80\x05\x80\x06\x00\x00\x03\x00\a\x00C\x00v\x00\x00!\x13/\x01\x01\x13\x0f\x01\x01&'&#\"\a\x06\"'&#\"\a\x06\a\x16\x17\x1e\x01\x17\x1e\t32>\x03;\x012\x1e\x0332>\b7>\x0176\x01\x14\x06#!\"&54>\x037'3&547&547>\x017632\x162632\x17\x1e\x01\x17\x16\x15\x14\a\x16\a3\a\x1e\x03\x02@``\x80\x01\x80\x80\x80`\x01\x00\x02\x02\nVFa\a\x1c\aaFV\n\x02\x02\x02\x02\x02\v\x02\x02\v\x03\f\x05\r\v\x11\x12\x17\r$.\x13\n\r\v\f\v\r\n\x13.$\r\x17\x12\x11\v\r\x05\f\x03\v\x02\x02\v\x02\x02\x01\xa2\x92y\xfc\x96y\x92\t\x1d.Q5Z\xd6\x16\x02\xc2\xd2\x11E$ ,\x1el\x90*%>>%*\x90>*98(QO\xe1!\u007f\xa0\x8f\x00\x03\x00\x00\x00\x00\b\xfd\x05\x00\x00L\x00\\\x00p\x00\x00\x01\x16\x0e\x02'.\x01'&67'\x0e\x01\x15\x14\x06#!#\x0e\x01#\"\x00\x10\x0032\x177&+\x01\"&46;\x012\x1e\x02\x17!3'#\"&7>\x01;\x012\x1f\x0176;\x012\x16\x1d\x01\x14\x06+\x01\x176\x17\x1e\x01\x01267!\"'&7\x13&#\"\x06\x10\x16(\x016\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\b\xfd\fD\x82\xbbg\xa1\xed\x10\fOOG`n%\x1b\xff\x00E\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9LL\x18{\xb5@\x1a&&\x1a\x80N\x86c,\x1d\x02\x00sU\xde\x1e&\x05\x04&\x18\xfd!\x14Fr\x13\x1be\x1a&&\x1a\xb3s\x83\x90\x8f\xca\xf8\xd4s\xb0\x17\xfe\xc6#\x14\x12\x11\x93/,\x84\xbc\xbc\x05\x80\x01\b\xbc\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\x01\xf4g\xbf\x88L\a\v\xe4\xa0o\xc7GkP\xe4\x82\x1b'\xa4\xdc\x01\a\x01r\x01\a\x1b-n&4&\x1b2\x1d\x16\x80-\x1e\x17\x1e\x1cir\x13&\x1a\x80\x1a&\xac?\x1b\x1a\xd9\xfd\xfb\x91o\x1f \x1f\x01\x15\r\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\x00\x00\x03\x00\x00\xff\x00\x05\x80\x05\xe0\x005\x00O\x00W\x00\x00!\x14\x0e\x02 .\x0254>\x0276\x16\x17\x16\x06\a\x0e\x04\a\x1e\x042>\x037.\x04'.\x017>\x01\x17\x1e\x03\x01\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!2\x16\x02\x14\x06\"&462\x05\x80{\xcd\xf5\xfe\xfa\xf5\xcd{BtxG\x1a,\x04\x05\x1f\x1a:`9(\x0f\x01\x030b\x82\xbfԿ\x82b0\x03\x01\x0f(9`:\x1a\x1f\x05\x04,\x1aGxtB\xfe\x80&\x1a@&\x1a\xff\x00\x1a&@\x1a&K5\x01\x805K`\x83\xba\x83\x83\xba?e=\x1f\x1f=e?1O6#\f\x05\x1f\x1a\x1a,\x04\n\x1b\x18\x17\x10\x04\v\x1f#\x1e\x14\x14\x1e$\x1f\f\x04\x0e\x18\x17\x1b\n\x04,\x1a\x1a\x1f\x05\f#6O\x03O\xfe\x80\x1a&\xfe\x80\x1a&&\x1a\x01\x80&\x1a\x01\x805KK\x01\xa8\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1b\x00?\x00\x00\x01!\x0e\x01\x0f\x01\x01\x06\"'\x01&'!267\x1b\x01\x1e\x013267\x13\x17\x16\x01\x14\a!'.\x01\a\x06\a\v\x01.\x01\"\x06\a\x03!&54632\x1e\x02\x17>\x0332\x16\x05\x00\x011\x05\n\x04\x03\xfd\x91\x124\x12\xfd\x90\x05\x10\x01q\x16#\x05F\xbe\x06\"\x16\x15\"\x06\x928\x12\x02'g\xfe\x8fo\b#\x13-\v\x81\xc4\x06#,\"\x05t\xfeYg\xfe\xe0>\x81oP$$Po\x81>\xe0\xfe\x02\x00\x06\t\x03\x04\xfd\xa8\x12\x12\x02Z\x02\x12\x1b\x15\x01\x19\xfde\x14\x1a\x1a\x14\x01\xe5p#\x01\xac\x91\x9b\xdd\x11\x14\x02\x05)\xfeR\x02\xae\x14\x1a\x1b\x15\xfe0\x9b\x91\xdc\xf8+I@$$@I+\xf8\x00\x00\x02\x00\x02\xff\x00\x04\x80\x05\xfc\x00+\x003\x00\x00\x01\x14\x00\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x027>\x0276\x04\x12$\x10\x00 \x00\x10\x00 \x04\x80\xfe\xd9\xd9\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\v\x8bᅪ\x01*\xae\xfc\x00\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x03\xc0\xdd\xfe\xb9\x18\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\x86\xe6\x92\x0f\x13\x92\xfe\xea\x12\xfe\x8e\xfe\xf9\x01\a\x01r\x01\a\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00'\x00/\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x01\x16\x15\x14\x0e\x02\".\x024>\x0232\x17\x01!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12\xfe\x82~[\x9b\xd5\xea՛[[\x9b\xd5u˜\x01~\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\xfe\x81\x9c\xcbu՛[[\x9b\xd5\xea՛[~\x01~\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00=\x00E\x00\x00\x01\x16\x12\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x0054\x127&'&6;\x012\x17\x1e\x012676;\x012\x16\a\x06\x00 \x00\x10\x00 \x00\x10\x03>\x91\xb1\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfeٱ\x91\xa5?\x06\x13\x11E\x15\b,\xc0\xec\xc0,\b\x1d=\x11\x13\x06?\xfd\xa4\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x04\xc4H\xfe\xeb\xa7\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01Gݧ\x01\x15H`\xb1\x10\x1b\x14j\x82\x82j\x14\x1b\x10\xb1\xfb\xdc\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x02\x00\x02\xff\x00\x05\x80\x06\x00\x00B\x00J\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x16\x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x04\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x95\xf3\x82\f\x10\x01 \xcbv\xdcX\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x10\xae\x01\x11\x9b\xcc\x01+\x17\x0eBF\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x06\x80\x06\x00\x00k\x00s\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x00547'\a\x0e\x01/\x01.\x01?\x01'\x15\x14\x06+\x01\"&5\x11463!2\x16\x1d\x01\x14\x06+\x01\x177>\x01\x1f\x01\x1e\x01\x0f\x01\x176 \x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x05\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfe\xd9~4e\t\x1a\n0\n\x01\tio\x12\x0e@\x0e\x12&\x1a\x01 \x0e\x12\x12\x0e\x85jV\t\x1a\n0\n\x01\tZ9\x9e\x01\x92\x9e\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01G\xddɞ5o\n\x01\b,\b\x1b\nsp\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12k^\n\x01\b,\b\x1b\nc8~~\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x05\x00\x02\xff\x00\x06\xfe\x05\xfd\x008\x00>\x00K\x00R\x00_\x00\x00\x01\x16\x02\x06\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x0276\x0076\x176\x17\x16\x00\x016\x10'\x06\x10\x0327&547&#\"\x00\x10\x00\x01\x11&'\x06\a\x11\x012\x00\x10\x00#\"\a\x16\x15\x14\a\x16\x06\xfe\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xfe\x00\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\x11\x01'\xcdΫ\xab\xce\xcd\x01'\xfc\x93\x80\x80\x80\xc0sg\x9a\x9ags\xb9\xfe\xf9\x01\a\x02\xf9\x89ww\x89\x02@\xb9\x01\a\xfe\xf9\xb9sg\x9a\x9ag\x03\xef\x9b\xfe\xee\xae\x10\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\xce\x01-\x13\x15ss\x15\x13\xfe\xd3\xfdʃ\x01l\x83\x83\xfe\x94\xfe\xf69\xa5\xe2\xe0\xa79\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x80\x01\x04\x0fOO\x0f\xfe\xfc\x01\x80\x01\a\x01r\x01\a9\xa7\xe0\xe2\xa59\x00\x00\x04\x00\x01\xff\x06\a\x80\x06\x00\x00F\x00P\x00^\x00l\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06$'.\x037>\x0276\x16\x17%#\"&=\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x17\x16\x17%#\"&5\x014'\x0e\x01\x15\x14\x17>\x01%\x14\x16\x17&54\x007.\x01#\"\x00\x012\x0054&'\x16\x15\x14\x00\a\x1e\x01\x06\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16\x1f\xfe\xf2\xb7\xd2\xfe\xa3CuГP\b\t\x8a\xe2\x87v\xdbY\x00\xff\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe;\"\xb6\x92\x00\xff\x86\x0e\x12\xfe\x00\x04\xa2\xda\x04\xa2\xda\xfc\x80ޥ\x03\x01\x0e\xcb5݇\xb9\xfe\xf9\x03\xc0\xb9\x01\aޥ\x03\xfe\xf2\xcb5\xdd\x04`\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue036\xfe\xfc\x1a\x1dڿ\x06g\xa3\xdew\x87\xea\x95\x0f\x0eBF\xfe\x12\x0e@\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xffJ_\ts\xfe\x12\x0e\xfe\xa0\x14&\x19\xfa\xa7\x14&\x19\xfa\xa7\xa8\xfc\x17\x1d\x1e\xd2\x01?%x\x92\xfe\xf9\xfc\a\x01\a\xb9\xa8\xfc\x17\x1c\x1f\xd2\xfe\xc1%x\x92\x00\x04\x00\x06\xff\x00\b\x00\x06\x00\x00J\x00P\x00\\\x00h\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06'\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x17632\x17%#\"&5\x016\x10'\x06\x10\x00\x10\x00327&\x107&#\"\x012\x00\x10\x00#\"\a\x16\x10\a\x16\x06\x80\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16 \xfe\xf7\xb5ߺu\x8b`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x9b\xf9}\x17\x19\x01\r\xba\u0e92\xaeɞ\x00\xff\x86\x0e\x12\xfd\x00\x80\x80\x80\xfd\x80\x01\a\xb9ue\x9a\x9aeu\xb9\x039\xb9\x01\a\xfe\xf9\xb9ue\x9a\x9ae\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue034\xfe\xfc\x1b\"|N\x0f\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x11\xb9\x01\"\xa2\xbb\x01\x0f\x1d\"|a~\xfe\x12\x0e\xfb\xe7\x83\x01l\x83\x83\xfe\x94\x01o\xfe\x8e\xfe\xf99\xa7\x01\xc0\xa79\xfc\x80\x01\a\x01r\x01\a9\xa7\xfe@\xa79\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00;\x00C\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\a\x17\x16\x14\x0f\x01\x06\"/\x01\a\x16\x15\x14\x0e\x02\".\x024>\x0232\x177'&4?\x0162\x1f\x017!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12Ռ\t\t.\t\x1a\n\x8cN~[\x9b\xd5\xea՛[[\x9b\xd5u˜N\xac\t\t.\t\x1a\n\xac\xd5\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\u058c\n\x1a\t.\t\t\x8dO\x9c\xcbu՛[[\x9b\xd5\xea՛[~N\xac\n\x1a\t.\t\t\xac\xd5\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x02\xff\x04\x04\x80\x06\x00\x009\x00A\x00\x00\x01\x16\x00\x15\x14\x02\x04'.\x02'&\x12675#\"&=\x0146;\x015\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14\x0f\x01\x06\"/\x01\x1532\x16\x1d\x01\x14\x06+\x01\x02 \x00\x10\x00 \x00\x10\x02\x80\xd9\x01'\xae\xfe֪\x85\xe1\x8b\v\f\x81\xf3\x96\xa0\x0e\x12\x12\x0e\xa0\\\n\x1a\t.\t\t\xca\x134\x13\xca\t\t.\t\x1a\n\\\xa0\x0e\x12\x12\x0e\xa0\xf9\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03|\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\xa5\\\t\t.\t\x1a\n\xc9\x13\x13\xc9\n\x1a\t.\t\t\\\xa5\x12\x0e@\x0e\x12\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x04\x00\x00\a\x80\x04~\x009\x00A\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01!\x15\x14\x06+\x01\"&=\x01#\x06\x00#\"$\x027>\x0276\x04\x16\x173546;\x012\x16\x1d\x01!'&4?\x0162\x17\x00 \x00\x10\x00 \x00\x10\am\x13\x13\xfe\xda\t\x1b\t-\n\n\xb9\xfe\xda\x12\x0e@\x0e\x12\x84\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\x01&\xb9\n\n-\t\x1b\t\xfb@\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x02m\x134\x13\xfe\xda\n\n-\t\x1b\t\xb9\xe0\x0e\x12\x12\x0e\xe0\xd9\xfeٮ\x01*\xaa\x85\xe1\x8b\v\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\xb9\t\x1b\t-\n\n\xfc\xed\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00\x17\x00\x1f\x00\x00\x01\x14\x00\a\x11\x14\x06+\x01\"&5\x11&\x0054>\x022\x1e\x02\x00 \x00\x10\x00 \x00\x10\x04\x80\xfe\xd9\xd9\x12\x0e@\x0e\x12\xd9\xfe\xd9[\x9b\xd5\xea՛[\xfd\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03\xc0\xdd\xfe\xb9\x18\xfd\x9c\x0e\x12\x12\x0e\x02d\x18\x01G\xddu՛[[\x9b\xd5\xfd\xcb\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\x00\x00\x04\x80\x04\x80\x00\a\x00\x17\x00\x00\x00\x10\x00 \x00\x10\x00 \x00\x14\x0e\x02\".\x024>\x022\x1e\x01\x04\x00\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x01\x87[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x025\xea՛[[\x9b\xd5\xea՛[[\x9b\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06#!\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x05\xab#22#\xfey\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd!#22#\x05\x802#\xfa\xaa#2\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad2#\x05V#2\x00\x00\x00\x01\x00\x00\xff\x80\x05\x00\x06\x00\x00L\x00\x00\x114>\x0332\x04\x16\x15\x14\x0e\x03#\"&'\x0e\x06\x0f\x01'&546\x127&54632\x16\x15\x14\x06\x15\x14\x1632>\x0454&#\"\x00\x15\x14\x1e\x02\x15\x14\x06#\"'.\x03K\x84\xac\xc6g\x9e\x01\x10\xaa&Rv\xacgD\x86\x1d\n$\v\x1e\x16*2%\x0e\t\x0f+Z\a hP=DXZ@7^?1\x1b\r۰\xc8\xfe\xf4\x19\x1d\x19\x1e\x16\x02\x0f3O+\x16\x03\xabl\xbf\x8eh4\x85\xfe\xa0`\xb8\xaa\x81M@8'\x93+c+RI2\x05\n\x9d\x1f\\\xe5\x01Z\x1eAhS\x92Q>B\xfa>?S2Vhui/\xad\xc1\xfe\xfd\xc7,R0+\t\x1cZ\x03\x0fRkm\x00\x00\x00\x00\x03\x00\x00\xffz\x06\x00\x05\x86\x00+\x00>\x00Q\x00\x00\x002\x16\x17\x16\x15\x14\a\x0e\x01#\"'.\x01'&7567632\x1632\x16\x17\x1e\x01\x15\x14\x06\x15\x14\x17\x16\x17\x16\x17\x1632\x032>\x024.\x02\"\x0e\x02\x15\x14\x17\a7\x16\x12 \x04\x16\x12\x10\x02\x06\x04#\"'\x05\x13&54\x126\x03\xcc\x1a\xa9\x05\x02\x11\x10n/9\x85b\x90LH\x01\x03G\x18\x1c\x06\x18\a\x13\x0f\b\b2E\x05\"D8_\f\n\x0fp\u007f\xe9\xa8dd\xa8\xe9\xfe\xe9\xa8dxO\xf2\x9e\"\x012\x01\x17\xcaxx\xca\xfe\xe9\x99ê\xfe_\x88lx\xca\x022X\t\x05\n!+'5>-\x92pkW\b[C\x16\x03\r\x15\x14\x88\a\x15I\n\a\bI@50\a\xfeOd\xa8\xe9\xfe\xe9\xa8dd\xa8\xe9\u007f˥\xe9Mh\x05fx\xca\xfe\xe9\xfe\xce\xfe\xe9\xcax^\x86\x01\x95\xb2ә\x01\x17\xca\x00\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\x0f\x00\x13\x00\x1b\x00#\x00'\x00+\x00/\x00\x007!5!\x11!5!\x004&\"\x06\x14\x162\x01!5!\x004&\"\x06\x14\x162\x124&\"\x06\x14\x162\x13\x11!\x11\x01\x11!\x11\x01\x11!\x11\x80\x04\x00\xfc\x00\x04\x00\xfc\x00\x06 8P88P\xfa\x18\x04\x00\xfc\x00\x06 8P88P88P88P\x98\xf9\x00\a\x00\xf9\x00\a\x00\xf9\x00\x80\x80\x01\x80\x80\xfd\x98P88P8\x04 \x80\xfd\x98P88P8\x028P88P8\xfd \xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x00\x00\x03\x00\x00\xff\x80\b\x00\x05\x80\x00\a\x00+\x00N\x00\x00\x00 &\x106 \x16\x10\x01!2\x16\x1d\x01\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x01\x14\x163!\x15\x06#!\"&54>\x0532\x17\x1e\x01267632\x17#\"\x06\x15\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02@\x01`\r\x13\x13\r\xfe\xa0\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\xfd L4\x01\x00Dg\xfc\x96y\x92\a\x15 6Fe=\x13\x14O\x97\xb2\x97O\x14\x13\x84U\xdf4L\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfe\x9f\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\x01`\r\x13\x13\r\xfd\xc04L\xee2\x8ay5eud_C(\x11====\x11`L4\x00\x00\x00\x03\x00\x00\xff\x80\a\xf7\x05\x80\x00\a\x003\x00V\x00\x00\x00 &\x106 \x16\x10\x01\x17\x16\x15\x14\x0f\x01\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&54?\x01632\x1f\x017632\x1f\x01\x16\x15\x14\a\x05\a\x06\x15\x14\x1f\x01\x06#!\"&54>\x0532\x17\x16 7632\x17\x0e\x01\x15\x14\x17\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02\xb5\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xfd\x15\xb5%%S\x15\x17\xfc\x96y\x92\a\x15 6Fe=\x13\x14\x9a\x01J\x9a\x14\x13\x1c\x1d\x1c\x1a%\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfd\xdf\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xb5%65%S\x03\x8ay5eud_C(\x11zz\x11\x06\x1b.!6%\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x12\x00\x1a\x00$\x00\x00\x01!2\x16\x15\x11!\x11!\x11!\x1146;\x012\x16\x15\x004&\"\x06\x14\x162!54&#!\"\x06\x15\x11\x01\x00\x06\xc0\x1a&\xff\x00\xfa\x00\xff\x00&\x1a\x80\x1a&\x02@\x96Ԗ\x96\xd4\x05V\xe1\x9f\xfd@\x1a&\x02\x00&\x1a\xfe@\x01\x00\xff\x00\x04\xc0\x1a&&\x1a\xfe\x16Ԗ\x96Ԗ@\x9f\xe1&\x1a\xfe\x80\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00\x16\x00\x19\x00\x00\x01\x033\x15!\a!\x15!\t\x01!5!'!53\x03!\x01!\t\x01\x13#\x06\x00\xc0\xc0\xfe\xee7\x01I\xfee\xfe\x9b\xfe\x9b\xfee\x01I7\xfe\xee\xc0\xc0\x01\x00\x01C\x01z\x01C\xfe\x00l\xd8\x06\x00\xfe@\xc0\x80\xc0\xfc\xc0\x03@\xc0\x80\xc0\x01\xc0\xfd\x00\x03\x00\xfb@\x01\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x12264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xf0\xa0pp\xa0p\x03\x00\xfb\x80\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xc0p\xa0pp\xa0\x01\xd0\x02\x00\xfe\x00\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00+\x00/\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x02264&\"\x06\x14\x01\x11!\x11\x00264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xe2\x84^^\x84^\x02@\xfd\xe0\x03\xfe\x84^^\x84^\x01@\xfd\xc0\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\xfd\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\x00\x00\x00\x00\x04\x00\x00\xff\x8a\a\x00\x05v\x00\x12\x00\x15\x00\x1c\x00(\x00\x00\x01\x11\x14\x06#\"'%.\x015\x114632\x17\x01\x16\x17\t\x02\x11\x14\x06\"'%\x01\x14\x00\a\t\x01632\x17\x01\x16\x02U\x19\x18\x11\x10\xfe/\x15\x1d\x14\x13\x0e\x1e\x01\xff\x03@\x02\x16\xfd\xea\x04k\x1c0\x17\xfeG\x02\x19\xfd\xff,\xfez\x01D\x11#\x0e\f\x02\x1d\x04\x04[\xfbk\x19#\b\xe9\n/\x17\x04t\x14\x1c\x0f\xff\x00\x03g\xfc\x9e\x01\n\x02F\xfb\xe2\x19\x1f\r\xdc\x03\xe5\x03\xfc\xbfG\x02z\x02\x0f\x1c\x06\xfe\xf2\x02\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x0f\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11!\x11\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02\xd7\xfa\x00\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x04\xaa\xfa\x00\x06\x00\x00\x00\x18\x00T\xff\x06\b\xa4\x05\xff\x00\v\x00\x17\x00#\x00/\x00D\x00M\x00\xfc\x01\x06\x01\x12\x01\x1b\x01%\x012\x01<\x01G\x01Q\x01^\x01l\x01w\x01\xb3\x01\xc2\x01\xd9\x01\xe9\x01\xfe\x02\r\x00\x00\x05\x0e\x01\a\x06&'&676\x16\x05\x1e\x01\x17\x16676&'&\x067\x1e\x01\x17\x16654&'&\x06\x05\x0e\x01\a\x06&54676\x16\x013\"\a\x1e\x01\x15\x14\x06#\"'\x06\x15\x14\x163264&7.\x01\a>\x02\x1e\x01\x01\x16\a\x16\x15\x16\x0e\x01\a\x06&'\x04%\x0e\x01'.\x01767&76\x1767&76\x1767476\x176\x17\x16\x175\"'.\x01'&767>\x02\x16\x173\x16\x17\x16\x17>\x017&'&'47.\x01'.\x017676\x16\x17\x14\x1e\x03\x17\x16767&\a76767.\x04'$\x01\x16\x17\x1673>\x03?\x01>\x01\x17\x16\x17\x16\x06\a\x0e\x01\a\x15\x06\a\x06\a\x1e\x01\x1767673>\x01\x1e\x01\x17\x16\x17\x16\a\x0e\x01\a\x06#\x14\a676\x176\x17\x16\x15\x16\x176\x17\x16\a\x16\x176\x01\x14\a\x16\x176&'&\x06\a\x1e\x01\a6767.\x01'\x06\a\"'\x16\x17276&\x0567&54&\a\x0e\x01\x17\x16\x17&671&'\x0e\x01\a\x16\x1767\x06\x0f\x015\x06\x17\x16\x05\x1e\x01\x17\x1e\x017>\x017&\x00\"\x06\x15\x14\x162654\x03&\a5\x06\x16\x17\x1e\x017>\x01&\x05>\x01&'5\x06#\x0e\x01\x16\x17\x1e\x01%\x06\x16\x17\x1667>\x017\x06\a\x16\a\x16\x04\x176$7&74>\x01=\x01\x15.\x01'\x06\a\x06'&'&'\x0e\b#\x06'\x0e\x03\a\x06#\x06'\x06'&'&'&'\x06\a\x16\x0365.\x01'&\x0e\x01\x17\x1e\x01\x17\x1667\x16\x1767.\x01'\x06\a\x14\x06\x15\x16\a\x06\a\x06\a#\x06\x17\x16\x17\x04%&'\x06\a\x06'&'\x06\a#\x152%6767\a65&'&'&7&5&'\x06\a\x16\x056.\x01\a\x0e\x01\a\x14\x17\x1e\x017>\x01\x01\xde\b&\x12\x195\x02\x01R\x1b\x17\x16\x054\a&\x13\x195\x01\x02S\x1b\x16\x169\rW\"-J\x870(/\xfar\rV\"-J\x870(.\x02\xc9\x01)#\x1b\"6&4\x1c\x05pOPpp\xe0c\xf3|\x1bo}vQ\x02\xf2\b\x13\a\x01[\x8060X\x16\xfdQ\xfd\xc4\x17W1V\xbb\x01\x02\x05\x13\b\x06\x19\x0e\x1b\a\t\v\x1c\x1d\x1e\r\x17\x1c#\x1a\x12\x14\v\a5X\v\t\t\x0fN\x02\"&\x1c\x05\r.\x0e\x03\x02\n)\n\x0f\x0f\x17D\x01>q\x1c \x15\b\x10J\x17:\x03\x03\x02\x04\a\x05\x1b102(z/=f\x91\x89\x14*4!>\f\x02S\x015b!\x11%\n\x19\x12\x05\x12\x03\x04\x01\x05\x01\v\x06(\x03\x06\x04\x02!\x1f$p8~5\x10\x17\x1d\x01\x1a\x10\x18\x0e\x03\x0e\x02.\x1c\x04\x12.:5I\r\b\x0f\r\b\x0e\x03~\xfe\xf7T\x8a\n\x13\x03\x0e\x18\x0f\x0e\x0e\x1c\x18\x114~9p# !\x02\n\x02)\x05\f\x01\x05\x01\x05\x03\x12\x05\x12\x18\b&\x11 ?()5F\t\x021\x18\x0f\x04\a\x05\x1c\f\t\x1c\x10\x12\r\t\n\x1c\x1e\x15\b\x03\xaf\x1d\x19 d%{\x1d\x13\x04v*\x85:\r \x0e\x0e@e\x10\x0f\n\x01s|\x03D\x861d \x19\x1d\x12\x04\x13\x1d{\x8b\x1f\x0e:\x85*\x06\x0f\x10dA\x11A|o\x04\x0e\x13\x01Yk\x03'&\x8d\x13\x12\a\b\x14\x83<\x02\x02\x83\xa5tu\xa5\xa5ut\xfe&\x02\x02\x01\x1bv\a\x0e\x01\v\x03HC\xba\x04XX\x13\x01\x03\x14TR\x05\x0f\x02\xc8;w\x19\b\x06\x12\x10\x94\x1d\x02\x82\x17\r\x8d\xc671\u0099\r\x15\x02\x03\x03\x01\x01\x01\x02\a\x01Z*&'\x06\b\r1\x05\b\x06\x05\x03\x02\x02\x01\x01\t\x14\x11\x13\v\x03\x02\x01\x119?\t\b.\r\r\x1d$\x06\x04\x02\xfd\x84\x0e\x10Gv\v\f5k65P\x02\x02<\xdc?8q=4\x88a\x04\t\x01\x06\x02\x12\x13\x17\v\r\vSC\"\xcd\x15\x15\x931#\x16\x03\x03\x15\x1c<\x80\x01/6B&!\x01ML\b\x11\t\x18\x14\x12\x04\x05\x04\b\xbe^;\x8c6k5\f\vwF\x10\x0e1<\x02\x02P\x00\x00\x03\x00\x00\xffC\t\x01\x05\xbd\x00\a\x00\x0f\x00;\x00\x00$\x14\x06\"&462\x04\x14\x06\"&462\x01\x1e\x05\f\x0132\x1e\x04\x0e\x03\a\x06\a>\x05.\x03\a\x06$.\a\x05\xf4`\x88aa\x88\xfdsa\x88``\x88\xfdZ9k\x87\x89\xc3\xcd\x01'\x019؋ӗa-\x03*Gl|M\xb9e\x1d_]`F&\fO\x9a\xfe\xb1\xa8\xfe\xdcܽ\x82sDD!/+\x88``\x88aa\x88``\x88a\x051\x0154&'\"&#!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\x9f\x1f\x17\b\n\x99\x99\n\b\x17\r\x1e\x17\x03\f\x8b\x8b\x03\v\x01\x17\xfbi\xe4LCly5\x88)*\x01H\x02\xcacelzzlec0h\x1c\x1c\u007f\xb7b,,b\xb7\u007fe\x03IVB9@RB\x03\x12\x05\xfe9\x01\xebJ_\x80L4\xf8\x004LL4\b\x004L\x0244%\x05\x02\x8c\x02\x05\xaf2\"\x04\x01\x81\x01\x04\xe0\x014\xfe\xcc:I;p\x0f\x10\x01\x01!q4\a\bb\xbab\b\a3p\f\x0f\x02\x02\x06(P`t`P(\x06\x04\x8e6E\x05\x03\bC.7B\x03\x01\xfe\x02I\x036\xfb\x004LL4\x05\x004LL\x00\x00\x05\x00\x00\xff\x80\t\x00\x05\x80\x00\x05\x00\v\x00\x1a\x00.\x00>\x00\x00\x01\x11\x0e\x01\x14\x16$4&'\x116\x00\x10\x02\x04#\".\x0254\x12$ \x04\x014.\x02#!\"\x04\x02\x15\x14\x12\x043!2>\x02\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03Zj\x84\x84\x02b\x84jj\x01[\x9d\xfe\xf2\x9fwٝ]\x9d\x01\x0e\x01>\x01\x0e\x02\x1co\xb8\xf3\x83\xfeӰ\xfeٯ\xae\x01*\xae\x01-\x81\xf5\xb8o\x01XL4\xf8\x004LL4\b\x004L\x01'\x02\xb5)\xbd꽽\xea\xbd)\xfdJ)\x01\xd1\xfe\xc2\xfe\xf2\x9d]\x9d\xd9w\x9f\x01\x0e\x9d\x9d\xfeL\x8b\xf5\xa6`\xa2\xfeֺ\xab\xfe۪e\xa9\xec\x03\x06\xfb\x004LL4\x05\x004LL\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x1f\x00;\x00\x00\x05\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15#54&#!\"\x06\x15\x11\x14\x16;\x01\x15#\"&5\x11463!2\x16\x06\x80\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x80^B\xfb\xc0B^^B\x04@B^\xfe\x80\x80\x13\r\xfb\xc0\r\x13\x13\r\xa0\xa0B^^B\x04@B^`\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x01>\xa0\xa0\r\x13\x13\r\xfb\xc0\r\x13\x80^B\x04@B^^\x00\x00\x06\x00\x00\xff\x00\b\x80\x06\x00\x00\x02\x00\x05\x005\x00=\x00U\x00m\x00\x00\t\x01!\t\x01!\x01\x0e\x01\a\x11!2\x16\x1d\x01\x14\x06#!\"&=\x01463!\x11.\x01'!\"&=\x01463!>\x012\x16\x17!2\x16\x1d\x01\x14\x06#\x04264&\"\x06\x14\x01\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x05\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x06\xc0\xfe\x80\x03\x00\xf9\x80\xfe\x80\x03\x00\x01\xb5\x0e?(\x02`\x0e\x12\x12\x0e\xfa\xc0\x0e\x12\x12\x0e\x02`(?\x0e\xfe\x15\x0e\x12\x12\x0e\x01\xeb\x15b|b\x15\x01\xeb\x0e\x12\x12\x0e\xfd?B//B/\x04\x90]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\xfb\x00]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\x04@\xfd@\x02\xc0\xfd@\x03\x80(?\x0e\xfa\xf5\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x05\v\x0e?(\x12\x0e@\x0e\x129GG9\x12\x0e@\x0e\x12\x10/B//B\xfcaItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\vItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00M\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x0e\x03\x15!4.\x02'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13M\x90sF\x04\x00Fs\x90M\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00?\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x114.\x02'#\x0e\x03\x15\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00\t\x03\xee\tDq\x8cL\xe6L\x8cqD\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12B>=\xfaC\x82\xef\xb1\u007f\x1f\x1f\u007f\xb1\xef\x82\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00;\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x03.\x01'#\x0e\x01\a\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00U\x03VU96\xb7g\xe6g\xb76\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12β\xb2\xfc\x0e\x8d\xc9**ɍ\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00G\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x06\a!&'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13\x89k\x02\xbck\x89\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a3\x91\x913\a!(!\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x0f\x009\x00I\x00\x00\x052\x16\x1d\x01\x14\x06#!\"&=\x014637>\b7.\b'!\x0e\b\a\x1e\b\x17\x132\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xe0\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0eb\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03\x04\xfc\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03b\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e@\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12@7hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh77hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh7\x06\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x00\x00A\x00j\x00\x00\x01\"\x06\x1d\x01#54&#\"\x06\x15\x11'54&#\"\x06\x1d\x01\x14\x17\x01\x16\x15\x14\x163!26=\x0147\x136=\x014&#\"\x06\x1d\x01#54&'&#\"\x06\x1d\x01#54&'&'2\x17632\x16\x17632\x16\x1d\x01\x14\a\x03\x06\x15\x14\x06#!\"&5\x01&=\x014632\x17>\x0132\x176\x03\x005K @0.B @0.B#\x016'&\x1a\x02\x80\x1a&\nl\n@0.B 2'\x0e\t.B A2\x05\bTA9B;h\"\x1b d\x8c\rm\x06pP\xfd\x80Tl\xfe\xccL\x8dc\v\x05\x06\x8b_4.H\x04\x80K5\x80]0CB.\xfeS\x1e\xac0CB.\xe0/#\xfe\xd8'?\x1a&&\x1a\x19)$\x01\xb4$)\xf60CB. }(A\b\x02B.\x80z3M\x05\x01\x802\"61\a\x8fd\xf639\xfeL\x18/PpuT\x01(If\xe0c\x8d\x01_\x82\x15E\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06`\x06\x00\x001\x00X\x00\x00\x00\"\x06\x15\x11#\x114&\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x1365\x114&\"\x06\x15\x11#\x114&\"\x06\x15\x11#\x114&2\x16\x17632\x16\x1d\x016\x16\x15\x11\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x114632\x176\x03\x9e\\B B\\B\x9a&@5K\x1a\x01\x80&@\x02\xb0\"6\aL\x05B\\B B\\B \xb4\x88s\x1f\x13\x17c\x8di\x97\bL\x0e}Q\xfdP\x01\x03%&#\"\x06\x15\x14\x16\x17\x05\x15!\"\x06\x14\x163!754?\x01\x0327%>\x015\x114&#!\a\x06\x15\x11\x14\x1626=\x013\x15\x14\a\x1e\x01\x15\x14\x06\a\x05\x041\xb1\xa3?\x17>I\x05\xfe\xfbj\x96\x96jq,J[\x96j.-\x02t\x01\x91j\x96lV\xfe\xad\\\x8f\x9b\xa3\x1e$B.\x1a\x14\x01R1?\x01@B.\x1a\x14\xfe\xde\x1c\x12+\x10\x10?2\x14\x12\x01`\x1e$\xe8\xfdv\x18\x165K-%\x02\x0e\xfd\x805KK5\x02\x17\xe9.olRI\x01S+6K5\xfë$B\\B 94E.&\xfeʀ\x8d15\x05\x1euE&\n\x96Ԗ\x11\x1c\x83Pj\x96\x11\xef\x96j\xfddX\x8b\x15U\x17\x02\xc7GJ\x0e7!.B\n\x9a\nP2\xff\x00.B\n\x84\r\b\x1a\x15%\x162@\t\xa0\x0e7\x03\x11\xf8\bK5(B\x0e\xc8@KjKj\xc6?+f\xfc\x00\x13U\vE,\x02\x9c5K~!1\xfe\xd8.>F.\xd0\xd0F,\bQ5*H\x11\x8d\x00\x00\x00\x00\x02\x00\x00\xff\x00\b\x00\x06\x00\x00$\x00b\x00\x00\x012\x16\x17\x01\x16\x15\x11\x14\x06#!\"&=\x01%!\"&=\x01463!7!\"&'&=\x01463\x01\x114'\x01&#!\"\x06\x15\x14\x1e\x01\x17>\x013!\x15!\"\x06\x15\x14\x17\x1e\x013!32\x16\x15\x14\x0f\x01\x0e\x01#!\"\x06\x1d\x01\x14\x163!2\x17\x05\x1e\x01\x1d\x01\x14\x163!26\x04\u007f=n$\x02\x0132\x16\x17\x1b\x01>\x0132\x16\x17\x1e\x01\x15\x14\a\x03>\x0532\x16\x15\x14\x06\a\x01\x06#\x03\"\x06\a\x03#\x03.\x01#\"\x06\x15\x14\x17\x13#\x03.\x01#\"\x06\x15\x14\x17\x13\x1e\x01\x17\x13\x1e\x013!27\x01654&#\"\a\x0554\x1a\x017654&#\"\x06\a\x03#\x13654&\x01\xcbMy\x13e\r\x05t\a|]\x11\x83WS\x82\x14Sg\x14\x82SY\x85\x0e\\x\a{\n7\x160\"1\x19i\x9692\xfe\x05DU1&=\t\xa4\u007f\x91\t=&0@\x03\x84\x1ac\t>&/B\x03t\a\x04\bd\b4!\x02\xb6*\"\x01\xfb8K4+\"\xfe\xcd@H\x03\x04@/'=\tt\x1a\x96\x03?\xff\x00_K\x01\x9193-\x16\x01\xdd\x1b\x1e]\x88\nUlgQ\xfe\xa4\x01\xacQgsW\n\x8a]\x18#\xfe\x00\a+\x10\x1e\v\v\x94i>p&\xfe\x843\x06\x800&\xfdV\x02Z&0B/\x0f\r\xfd\xdd\x01\x98%3B.\x0e\f\xfe\"\x1ct\x1e\xfeo )\x1a\x01{+C4I\x1a\xe6\xe3\x04\x01\f\x01(\r\x12\v/D0&\xfe\x1e\x02p\x0e\x0e0D\x00\x05\x00\x00\xff\x00\x06\x80\x06\x00\x003\x00[\x00_\x00c\x00g\x00\x00\x01\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x136=\x014&\"\x06\x15#54&#\"\x06\x1d\x01#54&#\"\x06\x1d\x01#\x114&'2\x16\x1d\x01632\x17632\x17632\x16\x1d\x01\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x1146\x13\x11#\x11!\x11#\x11!\x11#\x11\x02\x805K\x97)B4J\x1a\x01\x80&@\x02\xce\x16#\x05\\\x188P8 @0.B J65K J6k\x95\x16\ncJ/4qG\x1b\x1d^\x82\x1c\\\x10hB\xfd2.\xfe\xd81!~K5\x03y\x17?\xa3\xb1^\\\xfe\xadVl\x96j\x01\x91\x02t-.j\x96[J,qj\x96\x96j\xfe\xfb\x05I7$\x1e\xa3\x9b?1\x01R\x14\x1a.B\x87\x10\x10+\x12\x1c\xfe\xde\x14\x1a.B$\x1e\x01`\x12\x142?\x01g\x16\x18\xfdvEo.\xe9\x02\x175KK5\xfd\x80\x02\x0e%-K\xfa\xeb6+\x01SIR[\xfe\xca&.E49 B\\B$\x88\xfe\xcc5K\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\xb4\x04\x00\x00\x19\x00G\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!2\x16\x05\x13\x16\a\x06+\x01\"&'\v\x01\x06+\x01\"'\v\x01\x0e\x01+\x01\"'&5\x13>\x01;\x012\x17\x13\x16\x17>\x017\x136;\x012\x16\x03Y\x13\r\xfe\xd6\x12\r\x87\r\x13\xfe\xd7\r\x13\x12\x0e\x03\x19\r\x13\x04\x0eM\x01\t\n\r\x86\f\x12\x01.\xbd\b\x15x\x14\t\xbc-\x01\x12\f\x87\r\n\tN\x01\x12\f\x8e\x14\t\xdc\n\n\x03\r\x04\xdd\t\x14\x8d\r\x12\x03\xe0u\r\x12\xfc\xd4\r\x13\x12\x0e\x03,\x12\ru\x0e\x12\x13\n\xfc?\r\v\n\x11\f\x02L\xfeW\x13\x13\x01\xab\xfd\xb2\f\x11\n\n\x0e\x03\xc1\f\x11\x13\xfd\xf8\x18\x1b\a#\t\x02\b\x13\x11\x00\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\t\x00*\x00:\x00J\x00\x00\x014'&+\x01\x11326\x17\x13\x16\a\x06+\x01\"'\x03#\x11\x14\x06+\x01\"&5\x11463!2\x17\x1e\x01\x15\x14\x06\a\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\x12UbUI\x06-\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\x01ڎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03AX!\x12\xfe\xe7J\xd9\xfe\x8b\x11\x0e\x10\x11\x01m\xfe\xa2\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x18\x1f\x9cf\\\x93$\n\x036u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\xfeK\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00[\x00k\x00{\x00\x00\x01276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16!276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x02]\x99h\x0e\v-\x06\x12\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x94\xc4\xc2\x03\f\x99h\x0e\n-\b\x11\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x93\xc5\xc2'\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\xfd\xa4\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01/h\x12\x12R\r\x04\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbfh\x12\x12R\x0e\x03\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbf\x041u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\x01\x15\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x00\x00\x02\x00@\xff\xe0\a\xc0\x05 \x00\v\x00\x17\x00\x00\t\x04\x17\a'\t\x017\t\x03'7\x17\t\x01\a\x01\a\x01\x02\xe0\x01\x80\xfe\x80\xfd`\x02\xa0\xa8`H\xfe \x01\xe0\xc1\xfe\xdf\x02\xa0\x02\xa0\xfd`\xa8`H\x01\xe0\xfe \xc1\x01!`\xfe\x80\x02\xe0\xfe\x80\xfe\x80\x02\xa0\x02\xa0\xa8`H\xfe \xfe \xc1\x01\x1f\x02\xa0\xfd`\xfd`\xa8`H\x01\xe0\x01\xe0\xc1\xfe\xe1`\x01\x80\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00\x17\x00'\x00\x00%\t\x01\a\x17\a\t\x01\x177'\t\x057'7\t\x01'\a\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x02\xcd\x01\x0f\xfe\xe9X\xc0`\xfe\xe9\x01\x17(W\u007f\xfe:\x03,\x01\xc6\xfe:\xfe\xf1\x01\x17X\xc0`\x01\x17\xfe\xe9(W\x03L\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xb6\x01\x0f\x01\x17X\xbf`\x01\x17\x01\x17(W\x80\xfe:\xfeB\x01\xc6\x01\xc6\xfe\xf1\xfe\xe9X\xbf`\xfe\xe9\xfe\xe9(X\x01\xf9\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\n\x00\x00\xff\xdc\t\x00\x05$\x00\v\x00\x13\x00\x1c\x00%\x00/\x009\x00E\x00S\x00[\x00\x80\x00\x00\x01\x14\x06#\"&54632\x16$\x14\x06\"&462\x054&\"\x06\x14\x1626$4&#\"\x06\x14\x162%\x14\x06#\"&462\x16$\x14\x06#\"&4632\x00\x10\x00#\"\x0e\x01\x14\x1e\x0132\x01&! \a2\x1e\x02\x154>\x02\x00\x10\x00 \x00\x10\x00 \x13!\x0e\x01\a\x16\x15\x14\x02\x04#\"&'\x06\a.\x01'\x0e\x01#\"$\x02547.\x01'!6$32\x04\x02\x8b7&'77'&7\x04\x827N77N\xfc'q\xa0qq\xa0q\x04\x81qPOrq\xa0\xfcE\xa3st\xa3\xa4\xe6\xa3\x04\x82\xa3ts\xa3\xa3st\xfc\xdf\xfe\xf1\xbf}\xd4||\xd4}\xbf\x03\xab\xfe\xfe\xd2\xfe\xc1\xfeuԙ[W\x95\xce\x02Q\xfe\xf2\xfe\x82\xfe\xf1\x01\x0f\x01~\x04\x01\u007f,>\tn\x9a\xfe\xf8\x9b\x85\xe8P/R\vU P酛\xfe\xf8\x9an\t>,\x01m\x95\x01\x9c\xe2\xe0\x01\x8a\x02\x1b'77'&77\x02N77N6^Orq\xa0qq\x01\xa0qq\xa0q\xc0t\xa3\xa4棣\x01棣\xe6\xa3\xfe(\x01~\x01\x0f|\xd5\xfa\xd5|\x04\von[\x9a\xd4usј^\xfd\a\x01~\x01\x0f\xfe\xf1\xfe\x82\xfe\xf1\x04\x043\u007f3\x97\xba\x9c\xfe\xf8\x99pc8{\x16y%cq\x99\x01\b\x9c\xba\x973\u007f3dqp\x00\x03\x00f\xff\x00\x04\x9a\x06\x00\x00\t\x00\x13\x00L\x00\x00\x00 \x0054\x00 \x00\x15\x14\x00\"\x06\x15\x14\x162654\x01\x1e\x01\x0e\x02\a\x06\a\x17\x01\x16\x14\x0f\x01\x06\"'&'\x01\x06\"/\x01&47\x017&'.\x0367>\x02\x16\x17\x1e\x04326?\x01>\x01\x1e\x01\x03<\xfe\x88\xfe\xf6\x01\n\x01x\x01\n\xfe\x96\xb8\x83\x83\xb8\x83\x01,\r\x04\r(-'s\xc8I\x01\v\x1e\x1e\f\x1fV\x1fC\xc8\xfe\xf5\x1fV\x1e\f\x1f\x1f\x01\vH\xcbr'-(\r\x04\r\n$0@!\x05\x14BHp9[\xa6%&!@0$\x02u\x01\n\xbb\xbc\x01\n\xfe\xf6\xbc\xbb\x01\x9b\x83]\\\x83\x83\\]\xfd\xa7\x1b-$)!\x19I\x15H\xfe\xf5\x1fV\x1e\r\x1e\x1eD\xc8\xfe\xf4\x1e\x1e\r\x1eV\x1f\x01\vH\x15I\x19!)$-\x1b\x14\x1e\x0e\x12\x1a\x04\x0e#\x1a\x163\x19\x19\x1a\x12\x0e\x1e\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x006\x00>\x00N\x00\x00\x00\x14\x06\"&462\x01.\x01\x06\a\x0e\x02\"&/\x01.\x01\x06\a\x06\x16\x17\x16\x17\a\x06\a\x06\x14\x1f\x01\x162?\x01\x16\x17\x162?\x0164/\x0267>\x01\x02\x10& \x06\x10\x16 \x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9f]\x84]]\x84\x013\n$;\x1f\n&|\x82v\x1b\x1b\x1f;$\n\x16(CS\x8f3\x8e1\x16\x16\t\x16=\x16\xbfrM\x16=\x16\t\x16\x16\xbf4\x8dTC(G\xbe\xfe\xf4\xbe\xbe\x01\f\x02z\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfe\x84]]\x84]\xfd\xf6\x14\x18\x05\x19\b\x18($\x12\x12\x19\x05\x18\x14-;,5\x0e4\x8e0\x16=\x16\t\x16\x16\xbfsL\x16\x16\t\x16=\x16\xbe4\x0e5,;\x01\x12\x01\f\xbe\xbe\xfe\xf4\xbe\x01\xe8\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\xb8\x05\x80\x00\x12\x00(\x00\x00\x012\x16\x15\x11\x14\x02\x06\x04#\"$&\x025\x11463\x0127\x01654&#\"\a\t\x01&#\"\x06\x15\x14\x17\x01\x16\x06\x1dAZ\x88\xe5\xfe\xc1\xaf\xb0\xfe\xc1\xe6\x88\\@\x02\xc1/#\x01\x94%E1/#\xfe\xbd\xfe\xbd#.1E$\x01\x95!\x05\x80[A\xfd\xf9\xb0\xfe\xc0懇\xe6\x01@\xb0\x02\a@\\\xfb\xd8!\x01\x84#21E!\xfe\xca\x016!E13\"\xfe|!\x00\x00\x00\x01\x00\x00\xff\x98\t\x00\x05g\x00L\x00\x00\x05\x01\x06\x00\a\x06&5&\x00'.\x02#4&5!\x15\x0e\x02\x17\x16\x00\x176\x127&\x02'&'5\x05\x15\x0e\x01\x17\x1e\x01\x17676&'6452>\x013\x15\x0e\x01\a\x03\x16\x12\x17\x01.\x02'5\x05\x17\a\x06\a\x00\a\x05\xd6\xfe\xd9\x19\xfe\xf5A\x015R\xfe\xa5V\x15[t,\x01\x02G'Q4\x10\x1a\x01}-\x1f\xda\x16\x13\xd6\x1d&\xa3\x02\x01r!\xd5\r\xe5\a\x01\xb9\x0eG;\x1a\x01\xcc\x01\x01\x8b>\xfd\xf2!g\x02\xb71\xfd\xff\x85\x01\x01\x01\xc1\x03\x14\xca2sV\x05&\b2\x02\x1c:#;\xfc\x90d=\x01\x9b*'\x01\xe45E\x022\x01/\x02..F\xefD֕71\x02\a$\x06\x01\x011\x02>2\xfeF!\xfd\xfe\x11\x03\xf9&1\x0e\x012\x04\x02,\x04\x8d\xfb@K\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x18\x00r\x00\x82\x00\x92\x00\x00\x01\x14\x06#\"&5462\x16\x17\x01\x0e\x04\a\x01>\x04%\x14\a.\x02#\"\x15\x14\x17\x0e\x01\a'&#\"\x06\x1f\x01\x06#\"'>\x0254#\"\x0e\x01\a.\x01'7654&\x0f\x01&547\x1e\x023254&/\x01>\x017\x17\x16326/\x01632\x17\x06\x15\x14327\x1e\x01\x17\a\x06\x15\x14\x16?\x01\x1e\x01\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb5!\x19\x1a&\"2&\x0f\x01^\tu\x86\x8b_\x03\xfe\xa3\ax\x84\x8c^\x02\x8ah\x03\x1c\x19\x04\r;J݃\x10\x01\x0e\x05\x06\x01\x10HJǭ\x01\x18\x13\r\x06\x16\x17\x02q\x9e\x1fE\n\v\x05D\x0em\x02!\x1b\x04\r\x19\x14\x14M\xe0\x84\x0f\x02\r\x05\x06\x01\x0fG?̯'\f\v%o\x99\x1f8\n\v\x049\x0eU\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x01(\x01F\x01(\xd6ߎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x02\x83\x1a&!\x19\x1a&!S\x02E\bm|\x82[\x06\xfd\xbc\an{\x83[<ɪ\x02\x12\x0f\r\n\"p\x9d C\n\v\x04D\x0fi\x02%\x1e\x04\r\x1d(\x03K\xe1\x84\x0f\x03\f\x05\x06\x01\x0fHCέ\x01\x16\x10\f\x06\x13\f\fp\x9a\x1eC\n\v\x05B\rm8\t\r@Kނ\f\x02\x0e\x05\x06\x01\rH\xe7\x01F\x01(\xd6\u007f\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x02\x81\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x01\a\x00\x06\x00\x00\v\x00\x16\x00\"\x00*\x00\x00\x016\x17\x16\x17%&\x04\a\x016$\t\x01\x16\x047\x03&$\x025\x10%\x16\x12\x02\x06\a\x06%\x016\x02'$2\x16\x14\x06\"&4\x03}\xf0\xd3\xe8x\xfd\x1a\xa0\xfe\xf43\xfe\xec\x80\x01n\xfd\xdd\x01QH\x01\x16\x9a\xe6\xd4\xfe\xa6\xc7\x06\xc4:\x03dΏ\xe6\xfe\xf4\x01\x95X\ve\xfe8\xfa\xb1\xb1\xfa\xb1\x06\x00\x02z\x86\xee'\t\xa7\x92\x01\xa8\x9f\xad\xfel\xfdi\x8f\x94\x1d\xfe=!\xf9\x01\u007f\xdc\x01\v7\x96\xfe\xbf\xfe\xdd\xfdS\x85\x0e\x02o\x83\x01?v\x06\xb1\xfa\xb1\xb1\xfa\x00\x00\x01\x00\x02\xff\x00\a\x00\x05\xc9\x00M\x00\x00\x01 \x00'&\x02\x1a\x017\x03>\x01\x17>\x017\x0e\x01\x17\x1e\x03\x17\x16\x06\a\x0e\x02\a\x17'\x06\x1e\x027>\x02\x17\x1e\x01\a\x0e\x04'\x0e\x01'\x1e\x01>\x0276.\x01'\x1e\x01\x176\x02'\x04\x00\x13\x16\x02\x0e\x01\x04\x03\x87\xfe\xe5\xfeEl:\x12F\x98g\v\vr\r*\xedt6\x83\a\x19K3U\b\x0f\v\x19\x05\x17Z8\x0f\x8b\x12\x153P)3^I%=9\t\x01\x03\x0e\x16)\x1a<\xa9}J\xb1\xa0\x95k\x1b+\bC-Wd\x1b\x0f\x91\x89\x01\t\x01&\x04\x02U\xa2\xd8\xfe\xe9\xff\x00\x01-\xf8\x83\x01T\x01E\x01+]\xfe\xe7\x0e\x03\x11Qr\x02-\xcf<\b\v\x04\x04\x01\x05Q#\a\x170\n\xbdC+M8\x1b\a\t3'\x02\x04:$\x02\a\x12\r\b\x03_Q\v=+\x1fIf5[ˮ&&SG\xaa\x01ZoM\xfek\xfe\xc5\u007f\xff\x00ܬc\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x007\x00\x00\x01&#\"\x04\a\x0e\x01\a\x15\x1e\x01\x17\x16\x04327\x06\x04#\"'&$&\x0254\x126$;\x01\x16\x04\x01\x14\x02\a\x06#\"'6\x1254\x02'632\x17\x16\x12\x05ե\u009b\xfe\xecfKY\x04\x04YKf\x01\x14\x9b¥y\xfeͩ\x1d\x0e\xaf\xfe\xc4䆎\xf0\x01L\xb6\x03\xa8\x011\x01\xa4\x9a\x88hv\x89v\x9a\xc7ƚw\x87wk\x87\x97\x05\x1cn\x92\u007f]\xfa\x8d*\x8d\xfa]\u007f\x92nlx\x01\b\x94\xee\x01D\xb1\xb6\x01L\xf0\x8e\x01w\xfc\xf8\xc0\xfe\xab~?T8\x01b\xe4\xe3\x01b9SA}\xfe\xac\x00\x00\x00\x04\x00\x00\xff\x10\a\x00\x05\xf0\x00+\x005\x00?\x00F\x00\x00\x01\x14\a!\x14\x163267!\x0e\x01\x04#\"'\x06#\"\x114767\x12%\x06\x03\x12\x00!2\x17$32\x1e\x02\x15\x14\a\x16\x034&#\"\a\x1e\x01\x176\x01\x14\x16327.\x01'\x06\x01!.\x01#\"\x06\a\x00\a\xfb\x81۔c\xad2\x01\xa78\xe5\xfeΨ\xbb\xa9\xe4\xa6\xed-\x11\\\xc7\x01\x14\xb8\xf3?\x01\xb9\x01\x19\x1e\x0f\x00\xff\xb2@hU0KeFjTl\x92y\xcbE3\xf9\xc6aVs\x97z\xb7.b\x01\xf8\x02\xd8\x05؏\x90\xd7\x02W80\x92\xc5]T\x9f\xf4\x85St\x01\as\xa0<\xa9\x01h\xf6O\xfe\xed\x01\x12\x01_\x01u\x1a7bBt\xaa\xb6\x01\xb0SbF/\xa9o\x87\xfb|V]SHކ\xcd\x02J\x8e\xbe\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x003\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\"&=\x01463!5!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd \x01`\x0e\x12\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x01`\xfd B^^B\x06@B^\x01 \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@B^\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80^B\x03\xc0B^^\x00\x00\x00\x00\x02\x00\x16\xff\x80\x06\xea\x05\x80\x00\x17\x00>\x00\x00\x133\x06\a\x0e\x03\x1e\x01\x17\x16\x17\x16\x17\x16\x17!\"&5\x1146)\x012\x16\x15\x11\x14\x06+\x016\x03\x05\x0e\x03\a\x06'.\x02'.\x0167>\x0176\x1e\x03\x17%&\x8a\xc5F8$.\x0e\x03\x18\x12\x13\x04\x023\x1e9_\xfe\xf00DD\x04\xe8\x0140DD0\xb2\xd4\x10\xfe+\x02\x14*M7{L *=\"#\x15\n\x12\x14U<-M93#\x11\x01\xd4D\x05\x80@U8v\x85k\x9d_Y\x13\t\xee[\xabhD0\x05\x180DD0\xfa\xe80D\xd2\x01ce-JF1\f\x1aB\x1bD\xbe\xa3\xa3\xc8N&)@\r\f\v\x17/1 d\xaf\x00\x00\x00\x00\x04\x00\x0e\xff\x00\x05y\x06\x00\x00%\x00F\x00\xab\x00\xc5\x00\x00\x05\a\x06\a\x06#\"'&'&'&'&76\x17\x16\x15\x16\x17\x16\x17\x16\x17\x163276?\x016\x17\x16\x17\x16\x01\a\x17\x16\a\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&7632\x1f\x0176\x17\x16\x05\x14\a\x06\a\x0e\x01\"&'&'&5#&76\x17\x16\x173\x11567632\x16\x15\x14\x06#\"'&76\x1f\x01\x1e\x0132654'&#\"\a\x06\x15\x11\x1632>\x0254'&#\"\a\x06\x0f\x01\x0e\x02'.\x015\x11463!2\x14#!\x113>\x017632\x16\x17\x16\x17\x16\x03\x16\x14\x06\a\x06#\"'&'&#\"\a\x06'&767632\x17\x16\x05y\x06q\x92\x9a\xa3\xa5\x98\x94oq>*\f\x0443\x05\x01\x12\x1c2fb\x80\x84\x90\x8f\x85\x80a\x06\n\x0f\f\x15$\xfe\x15B?\x15\x1c\x11\x0f\n\t>B\x05\n\x0f\x10\x02\x12\bBB\x10\x1e\x12\r\x06\aAA\x12\x1e\x1b\x01\xc7.-QP\xd6\xf2\xd6PR+\x0f\x01\t42\n%<\x01\x03ci\x94\x93\xd0ђ:6\x1c\x0f\x10\x1c\x0e\x0e&\vh\x90HGhkG@n\x84`\xb2\x86I\x8d\x8c\xc7Ȍ5\x18\x02\b\n!\x16\x15\x1f\x15\x11\x03m\x1e\x1e\xfc\xd5\x01(|.mzy\xd6PQ-.\x1f\t\v\v\x1a\r\t\aje\x80\x94\x85\x81\x1b\x12\t\x01\x03\r\x82\xa9\xa4\x98\x89\v\x06q>@@?pp\x92gV\x1c\b\b\x1c\x01\x03ZE|fb6887a\x06\n\x04\x03\x13%\x02RB?\x15\x1c\x11\n=B\x05\x10\x02\x0f\x0e\a\nAB\x10\x1d\x12\x05BA\x11\x1e\x1bJvniQP\\\\PRh!\a\x1b\x11\x10\x1ccD\x01S\x02\x88`gΒ\x93\xd0\x10\v23\b\x03\x03\x06\x8fgeFGPHX\xfecCI\x86\xb0_ƍ\x8c\x8c5\"\x02\v\t\n\b\x05\x17\x0f\x02\xa8\x0f\x17n\xfe\x1d*T\x13.\\PQip\x01\xd0\b\x14\x10\r\x1a\a[*81\n/\x19\r\x10\x049@:\x00\x00\x04\x00\x1d\xff\x00\x06\xe1\x06\x00\x00\x1b\x00>\x00t\x00\x82\x00\x00%6\x16\x14\a\x0e\x04#\".\x03'.\x01>\x01\x16\x17\x16\x17\x04%6%\x16\x06\a\x06\a\x06&7>\x01'.\x03\x0e\x02#\x0e\x03*\x02.\x01'&676\x16\x01\x14\x1e\x02\x1f\x01\a.\x01/\x01&'\x0e\x03.\x0254>\x05754'&#\"\x0e\x03\a%4>\x0332\x1e\x03\x15\x01\x14\x17\x167676=\x01\x0e\x03\x06\x0f\x0f\x16\x0f\r>\x81\x99\xdfvw\ued25d\"\b\x04\x06\n\r\x05\xc0l\x01\x85\x01\x9a\xbe\x01\x98\v\x11\x14\"3\x11\x12\t\x15/\x11\x05\x15!\x1a,\x13+\x01\x06\x0e\b\t\x05\x06\x03\x03\x01\x01\x06j2.|\xfe\x84\x1b%&\x0e\r\xe3(N\x13\x13\v\x0e&w\x88\x90\x83h>8X}x\x8cc2\x15\"W\x06\x15<4<\x12\xfe\xda,Z~\xb1fd\xa2aA\x19\xfd`FBIT\x1e\x0e;hmA<\x06\x06\x1d\x13\x107QC1>[u])\t\x0f\t\x05\x01\x04u1\xb0V(\xd2\x10k1S)\x0e\n\x13-\x99\x16\a\t\x03\x02\x02\x02\x04\x01\x01\x01\x01\x01\x02\x02\x100\x06\a\f\x01\xa9\x1fB2*\v\v\xe0%M\x14\x14\v\x16;W(\x060S\x8f[T\x8c]I)\x1c\t\x02\u007fA 5\x02\x16%R7\x1b&\x1a\x80\x1a&T\x01\xa8\x01,\xfe\xd4\xfeX\xfe\xd4\x02\x00\x0e\x12\x12\x0e\x92\xce\x12\x1c\x12\xa9\x01\xc0\x0f\xfdq\x1a&&\x1a\x02\x8f\x041\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8L\x12\x1c\x12Β\x0e\x12\x12\x0ew\xa9\x00\x00\x00\x00\x03\x00%\xff\x00\x06\xdb\x06\x00\x00\x1b\x00%\x00;\x00\x00\x01\x16\x14\x0f\x01\x06#!\"&5\x11463!546;\x012\x16\x1d\x01!2\x17\x01!\x11\x14\x06+\x01\"&5\x012\x16\x15\x11\x14\x06#!\"/\x01&4?\x0163!5!\x15\x06\xd1\n\n\x8d\x1c(\xfa\xc0\x1a&&\x1a\x02@&\x1a\x80\x1a&\x02\x00(\x1c\xfc\xbc\x01\x00&\x1a\x80\x1a&\x03@\x1a&&\x1a\xfa\xc0(\x1c\x8d\n\n\x8d\x1c(\x02\x00\x01\x00\x04\xd7\n\x1a\n\x8d\x1c&\x1a\x01\x00\x1a&@\x1a&&\x1a@\x1c\xfb\xdc\xfe\x00\x1a&&\x1a\x03\xc0&\x1a\xff\x00\x1a&\x1c\x8d\n\x1a\n\x8d\x1c\xc0\xc0\x00\x04\x00\x00\xff\x00\b\x00\x05\xfb\x00\x1b\x00\x1f\x00#\x00'\x00\x00\x01\x16\x15\x11\x14\x06\a\x01\x06'%\x05\x06#\"'&5\x11467\x016\x17\x05%6\x05\x11\x05\x11%\x11%\x11\x01\x11\x05\x11\a\xe4\x1c\x16\x12\xfd\x80\x18\x18\xfd\x98\xfd\x98\n\x0e\x13\x11\x1c\x16\x12\x02\x80\x18\x18\x02h\x02h \xfb\x18\x02@\xfb`\x02 \x04\xe0\xfd\xe0\x05\xf5\x14!\xfa\x80\x14 \a\xff\x00\v\v\xf6\xf6\x05\v\x14!\x05\x80\x14 \a\x01\x00\v\v\xf6\xf6\r\x9a\xfb\n\xe6\x04\xf6\r\xfb\n\xd9\x04\xf6\xfa\xfd\x04\xf6\xd9\xfb\n\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00#\x005\x00\x00\x012\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x17\x01\x16\x15\x11\x14\x06#\"'\x01&5\x1146\x02\x00\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\x04\xe8\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\xfb\xa8\b\x06\x02\x00\x12\x13\r\b\x06\xfe\x00\x12\x13\x06\x00\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x03\xff\x00\n\x13\xfa@\r\x13\x03\x01\x00\n\x13\x05\xc0\r\x13\x00\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x008\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'&7>\a7.\x0154\x12$ \x04\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\x01\xcb\xf0\xfed\xf4ne\xad\xfe\xfa4\"\f\x14\x03\x04\x18\x05%\x0e!\x0f\x1a\x0e\x0f\x05\x92\xa7\xf0\x01\x9c\x01\xe8\x01\x9c\x02KjKKjKKjKKjKKjKKjK\x01.\xfe\xa4\xfe٫\x12\xad8\n\x03\x01\x0e\v\x0f\x16\x05!\x0e%\x1a00C'Z\xfd\x8f\xae\x01'\xab\xab\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x00.\x00W\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x04\x14\x06\"&462\x02 \x04\x06\x15\x14\x16\x1f\x01\a\x06\a6?\x01\x17\x1632$6\x10&\x01\x14\x02\x04#\"'\x06\x05\x06\a#\"&'5&6&>\x027>\x057&\x0254>\x01$ \x04\x1e\x01\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\xe9\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x02\xb5jKKjKKjKKjKKjKKjK\x01\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xfe\x8b\xae\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xacee\xac\xed\x00\x04\x00\x00\xff\t\x04\x00\x05\xf7\x00\x03\x00\x06\x00\n\x00\r\x00\x00\t\x01\x11\t\x01\x11\x01\x19\x01\x01\x11\t\x01\x11\x02\x00\x02\x00\xfe\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\x02\x00\x01Y\x01'\xfd\xb1\xfe\xd8\x03w\xfd\xb1\x01(\x04\x9e\xfd\xb1\xfe\xd8\x02O\xfe\xd9\x01'\xfd\xb1\x00\x00\x00\x01\x00R\xff\xc0\x06\xad\x05@\x00$\x00\x00\x01\x06\x01\x00#\"\x03&\x03\x02#\"\a'>\x017676\x16\x17\x12\x17\x16327676#\"\a\x12\x05\x16\x06\xad\n\xfe\xbe\xfe\xb3\xe5\x8eb,XHU\x12mM\x18\xa8.\x9cU_t\x17,\x167A3ge\b\rz9@x\x01S\xfb\x03\xfa\xec\xfea\xfeQ\x01\a\xa0\x01B\x01\x06Lb\x15\x97(\x8a\b\t\x81\x8b\xfe\xe1V\xf9\xa1\xa1U\x8b\x1a\x01\x89\v\b\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\n\x00\x00\x11!\x11!\x01\x03\x13!\x13\x03\x01\x06\x00\xfa\x00\x04=\xdd\xdd\xfd\x86\xdd\xdd\x01=\x05\x80\xfa\x00\x01\xa5\x02w\x01)\xfe\xd7\xfd\x89\xfe\xd0\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x12\x00A\x00U\x00\x00\x11!\x11!\x01\a\x17\a\x177\x177'7'#'#\a\x052\x16\a74.\x02#\"\x06\x1d\x01#\x1532\x15\x11\x14\x06\x0f\x01\x15!5'.\x02>\x015\x1137#\"76=\x014>\x02\x015'.\x01465\x11!\a\x17\x16\x15\x11\x14\x06\x0f\x01\x15\x06\x00\xfa\x00\x03\x8c\fK\x1f\x19kk\x19\x1fK\f_5 5\xfe\x96 \x19\x01\xae#BH1\x85\x84`L\x14\n\rI\x01\xc0\x95\x06\x05\x02\x01\x01\xbf&\xe7\x06\x04\x04\x03\f\x1b\x02v6\a\x05\x02\xfe\xed\x17S\x17\f\x0eF\x05\x80\xfa\x00\x04\xc0!Sr\x1999\x19rS!``\xa3 /\x157K%\x0es}H\x80\b\xfe\x82\x0e\f\x01\aXV\x0e\x01\x01\x04\x04\n\x05\x01\x83\x80\x06\x06\x03P\x1b\x1b\x1d\v\xfc\xc3V\t\x01\x03\x03\f\x06\x02\be\x16\a\x14\xfe\x8e\x0e\t\x02\tV\x00\x00\x04\x00\x00\xffd\a\x00\x06\x00\x00/\x009\x00Q\x00[\x00\x00\x01\x14\x06\a\x16\x15\x14\x02\x04 $\x02547.\x0154632\x176%\x13>\x01\x17\x05>\x0132\x16\x14\x06\"&5%\x03\x04\x17632\x16\x01\x14\x16264&#\"\x06\x0164'&\"\a\x0e\x01\"&'&\"\a\x06\x14\x17\x1e\x022>\x01&2654&#\"\x06\x14\a\x00;2\f\xd5\xfe\x90\xfeP\xfe\x91\xd5\v3>tSU<\xda\x01)t\x03\x18\x0e\x01q\x12H+>XX|W\xfe\xb2h\x01,\xdb:USt\xfa\xa2W|XX>=X\x03*\v\v\n\x1e\v)\xa0\xa0\xa0)\v\x1e\n\v\v+\x97^X^\x97\x16|WX=>X\x02\xb2:_\x19.2\x9b\xfe\xf8\x99\x99\x01\b\x9b//\x19a:Ru?\x98\n\x02\t\r\x10\x03Q%-W|XW>J\xfe(\t\x97=u\xfe\xe7>XX|WX\xfe`\v\x1e\v\n\n*((*\n\n\n\x1f\v+2\t\t2\xf8X>=XW|\x00\x00\x00\x01\x00E\xff\x02\x06\xbb\x06\x00\x000\x00\x00\x133>\x03$32\x04\x17\x16\x1d\x01!\x1e\x03>\x017\x11\x06\f\x01'&\x02'&\x127\x0e\x01\a!6.\x04/\x01\x0e\x03E\x01\x10U\x91\xbe\x01\x01\x94\xe7\x01noh\xfb\x9b\x01i\xa8\xd3\xd7\xc9I\\\xfe\xed\xfe\xa2\x8d\xbd\xf5\x02\x03\xe4\xd30<\x10\x02{\b >ORD\x16\x16\x87\xf9ƚ\x02\xe5~\xe7˕V\xd3ƻ\xff\xbco\xa3R \x1aC3\xfe\x877J\x026I\x01`\xc4\xf2\x01Tb<\x83^M~M8\x1a\x0f\x01\x01\x05O\x82\x97\x00\x00\x00\x04\x00\x00\xff\x80\t\x00\x05\x80\x00\t\x00\r\x00\x11\x00\x1b\x00\x005\x11!\x11\x14\x06#!\"&\x01\x15!5!\x15!5\x012\x16\x1d\x01!5463\t\x00^B\xf8@B^\x02\x80\x01\x80\xfd\x00\x01\x00\x06`B^\xf7\x00^B \x02`\xfd\xa0B^^\x01\"\x80\x80\x80\x80\x04\x80^B\xe0\xe0B^\x00\x00\x00\x03\x00\x00\xff\x00\x06\xbb\x06\x00\x00\x1f\x000\x00;\x00\x00%'\x0e\x01#\".\x0154>\x0232\x16\x177&$#\"\x04\x06\x02\x10\x12\x16\x0432$\t\x01\x06\x00!\"$&\x02\x10\x126$3 \x00\x17\x03#\x15#\x1132\x1e\x01\x0e\x01\x060\xdaJ\xf5\x8d\x93\xf8\x90U\x91\xc7n\x83\xe9L\xd7n\xfe\x9fʡ\xfe\xda\xd4~~\xd4\x01&\xa1\xd5\x01q\xfe@\x02\xb5t\xfeK\xfe\xee\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\xb6\x01\x04\x01\xa5}\x9f'`\x88 -\f\n-\xf6ox\x8a\x90\xf8\x92nǑUyl}\xa9\xc0~\xd4\xfe\xda\xfe\xbe\xfe\xda\xd4~\xd6\x02F\xfe\xa0\xfd\xfeڎ\xf0\x01L\x01l\x01L\xf0\x8e\xfe\xf5\xe9\xfet\xa0\x01`(88(\x00\x04\x00 \xff\x00\x06\xe0\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\t\x017!\x01'\x11\x01\x1f\x01\x11\t\x02!\x01\x05\x93\xfd\x9a\\\x03W\xfa\xb5\xb8\x04\x9f\x14\x93\xfd\xec\x01\\\xfe\f\xfc\xa9\x01d\x03;\x01\x82\x97\xfc\xdet\x03Z\xfd\x19`_\xfc\xa6\x01O\x02\u007f\xfc\xde\x02;\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\xf0\x00\v\x00\x17\x00}\x00\x00\x0154+\x01\"\x1d\x01\x14;\x012%54+\x01\"\x1d\x01\x14;\x012\x05\x11!\x114&\"\x06\x15\x11!\x114;\x012\x1d\x013\x114;\x012\x1d\x01354;\x012\x1d\x01354>\x02\x163\x11&5462\x16\x15\x14\a\x15632\x1632632\x1d\x01\x14\x06#\"&#\"\a\x1526\x1e\x02\x1d\x01354;\x012\x1d\x01354;\x012\x15\x11354;\x012\x02\x80\x10`\x10\x10`\x10\x02\x00\x10`\x10\x10`\x10\x02\x00\xfd\x80p\xa0p\xfd\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x80\x05\f\a\x10\x01 !,! -&\x15M\x10\x11<\a\x10F\x1b\x12I\x13(2\x01\x10\a\f\x05\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x02\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xfd\x10\x01@PppP\xfe\xc0\x02\xf0\x10\x10p\x02p\x10\x10pp\x10\x10pp\x06\a\x03\x01\x01\x01\x87\x0f#\x17 \x17#\x0f\x11\n\x0f\x0f\x10\xd2\x0f\r\x0f\f\x85\x01\x01\x03\a\x06pp\x10\x10pp\x10\x10\xfd\x90p\x10\x00\x01\x00\x00\x00\x00\t\x00\x05\x80\x00j\x00\x00\x01\x16\x14\a\x05\x06#\"'&=\x01!\x16\x17\x1e\x05;\x015463!2\x16\x15\x11\x14\x06#!\"&=\x01#\".\x05'.\x03#!\x0e\x01#\"&4632\x16\x1732>\x027>\x06;\x01>\x0132\x16\x14\x06#\"&'#\"\x0e\x04\a\x06\a!546\x17\b\xf0\x10\x10\xfe\xc0\b\b\t\a\x10\xfc\xa6%.\x10\x11\x1f\x17\x1f \x11`\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12` :,.\x1c'\x12\x13\x17\x1c,-\x18\xfe\x98\x16\x8aXj\x96\x96jX\x8a\x16h\x18-,\x1c\x17\x13\x12'\x1c.,: k\x15b>PppP>b\x15k\x11 \x1f\x17\x1f\x11\x10.%\x04Z \x10\x02\xdb\b&\b\xc0\x05\x04\n\x12\x80:k%$> $\x10`\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e`\x14\x1b6&L')59I\"Tl\x96ԖlT\"I95)'L&6\x1b\x149Gp\xa0pG9\x10$ >$%k:\x80\x12\x14\v\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x11\x00!\x00\x00\x00\x14\x06+\x01\x1132\x00\x10&#!\x113\x1132\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04~O8\xfd\xfd8\x01\x02\xb7\x83\xfeO\xb4\xfd\x82\x02\x87\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03>pN\x01\r\xfe\xf7\x01\x04\xb8\xfc\x80\x01\r\x01i\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x04\x00\x00\xff\xd9\t\x00\x05'\x00'\x00:\x00M\x00a\x00\x00\x014&'\x06\a\x0e\x01#\"'.\x017654.\x01#\"\x06\a\x16\x17\x16\x14\x06\"'&#\"\x06\x14\x163!267\x14\x06#!\"&54676$32\x00\x17\x1e\x01\x17\x14\a\x06#\"'.\x0176\x10'&>\x01\x16\x17\x16$\x10\a\x06#\"'.\x017654'&676\x16\x17\x06mD5\a\x10\a)\x18\f\f\x1f\x1c\n\x17z\xd2{\x86\xe26lP\x16,@\x17Kij\x96\x96j\x04\x16Oo\x99Ɏ\xfb\xea\xa9\xf0ȕ>\x01>\xc3\xeb\x01[\x17t\x99\xfaa\x17)\x18\x13\x1a\f\x12GG\x12\f4?\x12a\x01\x00\x86\x17)\x17\x13\x1a\r\x12ll\x12\r\x1a\x1a>\x12\x01\xb6;_\x15-/\x18\x1c\x03\n9\x1eGH{\xd1z\x92y\x1cN\x17@,\x16K\x95ԕoN\x8e\xc8繁\xe4\x16\xb8\xe4\xfe\xc3\xe7\x19\xbby\xaf\x90!\r\x11?\x1ah\x01\x02h\x1a>$\r\x1a\x8eD\xfe\x18\xc7\"\r\x12>\x1a\xa4\xc2â\x1a?\x11\x12\f\x1b\x00\x02\x00$\xff\x00\x05\xdc\x06\x00\x00\t\x00n\x00\x00\x05\x14\x06\"&5462\x16'\x0e\x01\x15\x14\x17\x06#\".\x0554>\x032\x1e\x03\x15\x14\a\x1e\x01\x1f\x012654.\x04'&'.\x0354>\x0332\x1e\x03\x15\x14\x0e\x03#\"#*\x01.\x045.\x01/\x01\"\x0e\x01\x15\x14\x1e\x03\x17\x1e\b\x05\xdc~\xb4\u007f\u007f\xb4~\xe9s\x9b!\x92\xe9m\xb8{b6#\f\t\x1c-SjR,\x1b\b\x17\x1cl'(s\x96\x12-6^]I\x1c\x0ft\x8eg))[\x86\xc7zxȁZ&\x1e+6,\x11\x02\x06\x13\x1a4$.\x1c\x14\x0fX%%Dc*\n&D~WL}]I0\"\x13\n\x02\rY\u007f\u007fYZ\u007f\u007f\xbf\x0f\xafvJ@N*CVTR3\x0e\x13/A3$#/;'\x0e\"/\x1b\x1e\x02\x01fR\x1a-,&2-\"\r\a7Zr\x89^N\x90\x83a94Rji3.I+\x1d\n\n\x12&6W6\x10\x13\x01\x01>N%\x18&60;\x1d\x1996@7F6I3\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00+\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26%\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x007\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x16%\"&5\x1146;\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x012\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x01\xee\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04@\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\xc0\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x167\"&5\x11463!2\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92n\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00%\x00=\x00\x00%\x13\x16\a\x06#!\"'&7\x13\x01\x13!\x13>\x013!\x15\x14\x1626=\x01!\x15\x14\x1626=\x01!2\x16%\x11\x14\x06\"&5\x114&\"\x06\x15\x11\x14\x06\"&5\x1146 \x16\x06\xdd#\x03\x13\x13\x1d\xf9\x80\x1d\x13\x13\x03#\x06]V\xf9TV\x03$\x19\x01\x00KjK\x01\x80KjK\x01\x00\x19$\xfe\x83&4&\x96Ԗ&4&\xe1\x01>\xe1\x80\xfe\xc7\x1c\x16\x15\x15\x16\x1c\x019\x03G\xfc\xf9\x03\a\x18!\x805KK5\x80\x805KK5\x80!\xa1\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xff\x00\x1a&&\x1a\x01\x00\x9f\xe1\xe1\x00\x06\x00\x00\xff\x00\b\x00\x06\x00\x00\x15\x00#\x00/\x00;\x00I\x00m\x00\x00\x012\x16\x14\x06+\x01\x03\x0e\x01#!\"&'\x03#\"&463\x01>\x01'\x03.\x01\x0e\x01\x17\x13\x1e\x013%\x114&\"\x06\x15\x11\x14\x1626%\x114&\"\x06\x15\x11\x14\x1626%\x136.\x01\x06\a\x03\x06\x16\x17326\x01\x03#\x13>\x01;\x01463!2\x16\x1532\x16\x17\x13#\x03.\x01+\x01\x14\x06#!\"&5#\"\x06\a\x805KK5\x0fs\bH.\xfb\x00.H\bs\x0f5KK5\x01e\x1a#\x02 \x02)4#\x02 \x02%\x19\x01\xa0&4&&4&\x01\x80&4&&4&\x01` \x02#4)\x02 \x02#\x1a\x05\x19%\xfb~]\x84e\x13\x8cZ\xa7&\x1a\x01\x80\x1a&\xa7Z\x8c\x13e\x84]\vE-\xa7&\x1a\xfe\x80\x1a&\xa7-E\x03\x00KjK\xfdj.<<.\x02\x96KjK\xfc\xe0\x02)\x1a\x01\xa0\x1a#\x04)\x1a\xfe`\x19\"@\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x15\x01\xa0\x1a)\x04#\x1a\xfe`\x1a)\x02\"\x04\xda\xfed\x01\xb9Xo\x1a&&\x1aoX\xfeG\x01\x9c,8\x1a&&\x1a8\x00\x02\x00!\xff\x80\x06\xdf\x05\x80\x00\x03\x00O\x00\x00\x01\x13#\x03\x01\a\x06#!\x03!2\x17\x16\x0f\x01\x06#!\x03\x06+\x01\"'&7\x13#\x03\x06+\x01\"'&7\x13!\"'&?\x0163!\x13!\"'&?\x0163!\x136;\x012\x17\x16\a\x033\x136;\x012\x17\x16\a\x03!2\x17\x16\x03\xdf@\xfe@\x03\xfe8\a\x18\xfe\xb9@\x017\x0f\n\n\x048\x05\x1a\xfe\xb9Q\a\x18\xe0\x10\n\t\x03N\xfeQ\a\x18\xe1\x0f\n\t\x03N\xfe\xc9\x0f\n\t\x038\a\x18\x01G@\xfe\xc9\x0f\n\n\x048\x05\x1a\x01GQ\a\x19\xe0\x0f\n\t\x03N\xfeQ\a\x19\xe0\x0f\n\t\x03N\x017\x0f\n\t\x02\x00\x01\x00\xff\x00\x01\xf8\xe0\x18\xff\x00\f\x0e\x0e\xe0\x18\xfe\xb8\x18\f\f\x10\x018\xfe\xb8\x18\f\f\x10\x018\f\f\x10\xe0\x18\x01\x00\f\x0e\x0e\xe0\x18\x01H\x18\f\f\x10\xfe\xc8\x01H\x18\f\f\x10\xfe\xc8\f\f\x00\x00\x00\x00\x04\x00k\xff\x00\x05\x95\x06\x00\x00\x02\x00\x05\x00\x11\x00%\x00\x00\x01\x17\a\x11\x17\a\x03\t\x03\x11\x03\a\t\x01\x17\x01\x00\x10\x02\x0e\x02\".\x02\x02\x10\x12>\x022\x1e\x02\x03I\x94\x95\x95\x94\x83\x01\xd0\xfe\xce\x012\xfe0\xff]\x01@\xfe\xc0]\x00\xff\x02\xcf@o\xaa\xc1\xf6\xc1\xaao@@o\xaa\xc1\xf6\xc1\xaao\x01㔕\x03\x8c\x95\x94\xfca\x01\xd0\x012\x012\x01\xd0\xfd\x9d\x00\xff]\xfe\xbf\xfe\xbf]\x00\xff\x01p\xfe^\xfe\xc7\xc9|11|\xc9\x019\x01\xa2\x019\xc9|11|\xc9\x00\x00\x00\x00\x03\x00(\xff\x00\x03\xd8\x06\x00\x00\x02\x00\x05\x00\x11\x00\x00%7'\x117'\x13\t\x01\x11\x01'\t\x017\x01\x11\x01\x02T\xad\xad\xad\xad \x01d\xfd\xe5\xfe\xd7l\x01t\xfe\x8cl\x01)\x02\x1bq\xac\xac\x01n\xac\xac\xfd\xf1\xfe\x9c\xfd\xe4\x02\xc7\xfe\xd8l\x01u\x01ul\xfe\xd8\x02\xc7\xfd\xe4\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00)\x001\x00\x00$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 \x13\x14\a\x01\x06+\x01\"&547\x016;\x012\x16\x04\x10\x06 &\x106 \x05\x00LhLLh\xfdLLhLLh\x04L\xe1\xfe\xc2\xe1\xe1\x01>\x81\r\xfb\xe0\x13 \xa0\x1a&\r\x04 \x13 \xa0\x1a&\xfd`\xe1\xfe\xc2\xe1\xe1\x01>\xcchLLhL\x03LhLLhL\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\x02\xc0\x14\x12\xfa\x80\x1a&\x1a\x14\x12\x05\x80\x1a&\xbb\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x05\x00\x03\xffG\x06\xfd\x05\xb9\x00\x06\x00\n\x00\x10\x00\x17\x00\x1d\x00\x00\x13\t\x01.\x017\x13)\x01\x011\x01\x13!\x1362\x01\x13\x16\x06\a\t\x011!\x1362\x17h\x03\x18\xfc\x9c\x12\x0e\ae\x01\xce\x02\x94\xfe\xb6\xfd\xf0\xc6\xfe2\xc6\b2\x050e\a\x0e\x12\xfc\x9c\x03\x18\xfe2\xc6\b2\b\x03>\xfc\t\x02v\r+\x15\x014\xfc\t\x06[\xfd\x9c\x02d\x17\xfd\x85\xfe\xcc\x15+\r\xfd\x8a\x03\xf7\x02d\x17\x17\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\xe0\x00\x03\x00\x0f\x00\x13\x001\x00\x00\x0135#\x015\x06\a\x06&'\x17\x1e\x0172\x01!5!\x05\x14\a\x16\x15\x14\x04#\"&'\x06\"'\x0e\x01#\"$547&54\x12$ \x04\x12\x01\x80\xa0\xa0\x03Eh\x8b\x87\xf9`\x01X\xf8\x94\x81\xfe(\x02\x80\xfd\x80\x04\x80cY\xfe\xfd\xb8z\xce:\x13L\x13:\xcez\xb8\xfe\xfdYc\xf0\x01\x9d\x01\xe6\x01\x9d\xf0\x02\xc0\xe0\xfd\xd4\\$\x02\x01_K`Pa\x01\x01}\xe0\xc0\xbb\xa5f\u007f\x9d\xdeiX\x01\x01Xiޝ\u007ff\xa5\xbb\xd1\x01a\xce\xce\xfe\x9f\x00\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00(\x00+\x00.\x00>\x00\x00\x01\x15#5\x13\x15#5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x114&+\x01\x01'\a\x01#\"\x06\x15\x11\x14\x163!26\x017!\x057!\x05\x11\x14\x06#!\"&5\x11463!2\x16\x02\x03\xfc\xfc\xfc\x03\xf2\xfe\xab\x01U\xfd`\x02\xa0\xfd`\x03'\f\b \xfe\x86\xd2\xd2\xfe\x86 \b\f\f\b\x04\xd8\b\f\xfc\xa9\xb9\xfej\x02\x8b\xdd\xfej\x02\xe2V>\xfb(>VV>\x04\xd8>V\x02q\x80\x80\x00\xff\u007f\u007f\xfe\x01\x80\x80\x01\x00\x80\x80\x00\xff\u007f\u007f\xfc\xa4\x04\xd8\b\f\xff\x00\xab\xab\x01\x00\f\b\xfb(\b\f\f\x04^\x96\x96\x96\x14\xfb(>VV>\x04\xd8>VV\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00=\x00\x00\x01&'&'&'&\x06\x1f\x01\x1e\x03\x17\x16\x17\x1e\x04\x17\x1676'&'&\x02\x01.\x05\x02' \f\x01\x1e\x03\x0e\x01\a\x06\x15\x01#\x01\x0e\x02.\x02\x03\x80h8\x8b\xd0\"$Y\n''>eX5,\t\x04,Pts\x93K\x99\x01\x0125\x1cM\xcc\xfeRLqS;:.K'\x01\x11\x01\xc1\x015\xe9\x8aR\x1e\x05\x0e\r\r\x01Ch\xfe\xe7\x16\x8bh\xac\x95\xba\x02\xd0\xc4R\xcat\x13\x11(\x10\x1e\x1f+e\x84^T\x11\bT\x8a\xaa\x82u B\x06\x03\"$\x15:\x012\xfe~<\x82\x9d\x98\xdc\xc6\x012\x88Hp\xb1\xa8\xe5\xaa\xe3wTT\x17\xfe\xb9\x01\x1d\x02\x18\x0e\x02 V\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00/\x007\x00G\x00W\x00g\x00\x00\x00.\x01\a\x04 %&\x0e\x01\x16\x17\x16\x17\x0e\x02\x0f\x01\x06\x16\x17\x1632?\x01673\x16\x1f\x01\x16327>\x01/\x01.\x02'676$4&\"\x06\x14\x162\x04\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x00 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05d\f-\x1a\xfe\xfb\xfe\xe8\xfe\xfb\x1a-\f\x1b\x1a\xc2m\x02\x1b\x1a\x1c\t\n\x16\x19\t\x0e,\x10\b6\x11*\x116\b\x10,\x0e\t\x19\x16\n\t\x1c\x1a\x1b\x02m\xc2\x1a\xfe\xb7KjKKj\x02\x8bo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbd\xfeK\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xcezz\xce\x01Ȏ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03U4\x1b\x06>>\x06\x1b4-\x06.\f\x9e\xdeYG\x15\x190\n\x04)\x14\x8bxx\x8b\x14)\x04\n0\x19\x15GYޞ\f.\x06\xa3jKKjKq\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\x01lz\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xce\xfe0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x03\x00D\xff\x00\x05\xbb\x06\x00\x00/\x007\x00H\x00\x00\x00\x16\a\x03\x0e\x01#\"'.\x017\x13\a\x16\x15\x14\a'654&#\"\a'67\x01'\a\x06.\x016?\x01>\x01\x17\x01\x16\x17\x16\x0f\x01%\x02\"&462\x16\x14\x0127\x17\x06#\".\x01547\x17\x06\x15\x14\x16\x05|D\x05,\x04=)\x06\x03,9\x03#\x8f7\x94\x89[͑\x86f\x89x\xa4\x01\b\x95\xb5!X:\x05 \xef\x1aD\x1e\x01\xe8$\f\x11+\xcd\x01s)\x94hh\x94i\xfc\xdajZ\x8b\x92\xbd\x94\xfb\x92t\x8b<\xcd\x02\xf6F/\xfd\xd9*8\x01\x03C,\x01\xad\bq\u007f\u061c\x89e\x86\x91\xce\\\x8ar\x1b\x01,W\xa1\x1e\x05BX\x1d\xd5\x17\a\x12\xfe\xe5\x15/C2\xe8\x14\x01\xa9h\x94hh\x94\xfa\xbe=\x8bt\x92\xfa\x94\xbc\x94\x8bXm\x91\xcd\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00N\x00Z\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x14\x0e\x02\a\x0e\x02\x1d\x01\x14\x06+\x01\"&=\x014>\x037>\x0154&#\"\a\x06\a\x06#\"/\x01.\x017632\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03p\x12\x0e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x00\x1e=+& \x1d\x17\x12\x0e\xa0\x0e\x12\x15\x1b3\x1f\x1d5,W48'\x1d3\t\x10\v\bl\n\x04\az\xe3\x81\xdb\xee\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01P\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\x01\xe22P:\x1e\x15\x12\x14\x1c\x0f \x0e\x12\x12\x0eD#;$#\x10\r\x19$\x1f*;\x1b\x14?\f\x06R\a\x1a\n\xc0\xb3\x01Cf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x04\x00'\xff\x03\x05Y\x06\x00\x00\t\x00>\x00O\x00`\x00\x00\x00\"&5462\x16\x15\x14\x01\x14\x06&'\x01.\x01\x0f\x01\x06\x1f\x01\x13\x03\x06\a\x06\a\x06'.\x0176\x1b\x01\a\x17\x16\x0e\x02\x0f\x01\x06.\x035\x03\x13632\x17\x01\x16\x1f\x01\a\x16\x05\x1e\x01\x1f\x01\x16\x17\x16\a\x06.\x01'#&'\x03\x01\x16\x15\x14\a\x06.\x01'&\x01\x166?\x0165\x01\xae\x80\\\\\x80[\x01\x8c(\t\x01\x06\x02|\x03\x93\x1f\x03\t\v\x14\x06r\xfe\xcb\x03\b\x03\x03\v\x04\xc9[A@[[@A\xfd#2#\x16\x17\x01\xb6\f\a\x02\x03\b\r\x8b\xfe\x9e\xfe7\xc0*\x1a\x06\x1a\x19\r<\x1b\x11\x02Y\x01\xa0\xa4\xde\x18$\x13\r\x01\x02\x03\f\x14\x18\x0f\x02\x01+\x01}\"(\xfd\xf7\x05\f\x03\x01\r\xa6q\xe087] F\x1b\x16\f \x13\x10\t\x01_\xfe\xad1\b\x05\x02\x05\v)\n\xac\x01\xe9\x01\x04\x02\x02\t\b\x00\x00\x00\a\x00\x03\x00\xe3\t\x00\x04\x1c\x00\x02\x00\v\x00#\x001\x00K\x00e\x00\u007f\x00\x00\x013\x03\x054&+\x01\x11326\x01\x13\x14\x06+\x01\"&=\x01!\a\x06#!\"&7\x0163!2\x16\x04\x10\x06#!\"&5\x11463!2\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x17\x01\xf8\xab\x01\x03Xe`64[l\xfd\xc2\x01\x13\x0e\xd8\x0e\x13\xfe\xdd7\n\x12\xfe\xf5\x15\x13\r\x02,\t\x12\x01L\x0e\x14\x03;\xfb\xc7\xfe\xf2\x0e\x14\x14\x0e\x01\f\xc8\x01\x98\x01\x0f\x1c=+3&9\x1a\x10\x01\x01\x01\x0e\x1a8&+)>\x1d\x11\x02\xb9\x01\x0f\x1c>+3&9\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x02\xb6\x01\x0f\x1c=+3&8\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x01\x02\x1e\x01\t\xa6Wj\xfe|r\x01\xca\xfd\f\x0e\x14\x14\x0e>Q\x0f$\x11\x02\xf5\x0e\x14\xc6\xfe~\xdc\x14\x0e\x02\xf4\x0e\x14\xfed\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x00\x04\x00\x00\xff\x00\x05\x80\x05\xf2\x00J\x00\\\x00m\x00\x82\x00\x00\x054.\x01'.\x02'&#\"\x06#\"'.\x03'&47>\x037632\x16327>\x027>\x0254&'&#\"\a\x0e\x03\a\x06\a\x0e\x01\x10\x16\x17\x16\x17\x16\x17\x16\x17\x16327>\x01\x13\"&47654'&462\x17\x16\x14\a\x06\x16\"'&476\x10'&462\x17\x16\x10\a\x16\"'&47>\x01\x10&'&462\x17\x16\x12\x10\x02\a\x02i\x1a$\x02\x01\b\t\t\x0f$\x17^\x18\"\r\x06\n\x05\b\x01%%\x01\b\x05\n\x06\r\"\x18^\x17$\x0f\t\t\b\x01\x02$\x1aW \x14\x19\"@9O?\x1d\x1f\x06\x031&&18\x1b?t\x03\x03@\"\x19\x14 W\x9f\x1a&\x13%%\x13&4\x13KK\x15\xb86\x12\x13\x13pp\x13&4\x13\x96\x96\xa36\x12\x13\x13ZaaZ\x13&4\x13mttm\x99\v^x\t\x04-\x1b\b\x0e\v\v\x05\x15\x13\x1d\x04\x80\xfe\x80\x04\x1d\x13\x15\x05\v\v\x0e\b\x1b-\x04\tx^\v\x16=\f\b\x12\x11/U7C\f\ak\xda\xfe\xf2\xdakz'[$\x01\x01\x12\b\f=\x03\xa7&5\x13%54'\x134&\x13K\xd4K\x13\xb5\x13\x134\x13r\x01\x027>\x0254\x00 \x00\x15\x14\x06\"&54>\x022\x1e\x02\x04\x14\x06\"&462%\x14\x06\"&54&#\"\x06\x15\x14\x06\"&546 \x16%\x16\x06\a\x06#\"&'&'.\x017>\x01\x17\x16\x05\x16\x06\a\x06#\"'&'.\x017>\x01\x17\x16\x80&4&&4\xe6&4&&4S\x01\x00Z\xff\x00\x01\xad&4&&4\x02\xe9\x174$#\x1f\x1d&\x0f\xe1\x9f\x1a&&\x1aj\x96\x173$\"('$\xfe\xf9\xfe\x8e\xfe\xf9&4&[\x9b\xd5\xea՛[\xfd\xfd&4&&4\x01F&4&\x83]\\\x84&4&\xce\x01$\xce\x01\x8a\n\x16\x19\t\x0e\x13!\aD\x9c\x15\b\x10\x114\x15\xb7\x01%\t\x15\x19\v\f,\x10\\\xcd\x16\a\x10\x104\x15\xeb\xa64&&4&\x9a4&&4&\x01-\xff\x00Z\x01\x00\x874&&4&\x01\x00;cX/)#&>B)\x9f\xe1&4&\x96j9aU0'.4a7\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1au՛[[\x9b\xd5\xdb4&&4&@\x1a&&\x1a]\x83\x83]\x1a&&\x1a\x92\xceΏ\x190\n\x04\x16\x13\xb2u\x104\x15\x15\b\x10\x89\x85\x190\n\x04)\xee\x9b\x104\x15\x16\a\x10\xaf\x00\x00\x00\x00\x04\x00\x03\xff\x00\b\xfd\x06\x00\x00\x11\x00#\x00g\x00\xb0\x00\x00\x01&'.\x01#\"\x06\x15\x14\x1f\x01\x1632676%4/\x01&#\"\x06\a\x06\a\x16\x17\x1e\x01326\x01\x0e\x01'&#\"\a2632\x16\x17\x16\x06\a\x06#2\x17\x1e\x01\a\x0e\x01+\x01&'%\a\x06#\"'\x03&6?\x01\x136\x1276\x1e\x01\x06\a\x06\a676\x16\x17\x16\x06\a\x06\a632\x17\x1e\x01%\x13\x16\x06\x0f\x01\x03\x06\x02\a\x06#\"'&6767\x06\a\x06#\"&'&6767\x06#\"'.\x017>\x01\x17\x16327\"\x06#\"&'&6763\"'.\x017>\x01;\x02\x16\x17\x057632\x04\b;\x19\x11>%5K$\n\"0%>\x11\x19\x02s$\n\"0%>\x11\x19;;\x19\x11>%5K\xfeV\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x10\x1c\xfe\xde\xef\x0e\x0f(\x11\xa0\v\x0e\x16є\x11\x95y\x1fO2\a\x1fF/{\x90(?\x04\x050(TK.5sg$\x1a\x03\xb1\xa0\v\x0e\x16є\x11\x95y\x1a#-\x1d\x19\a\x1fF/{\x90\x04\b$7\x04\x050(TK.5sg$\x1a\x12\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x01\x0e\x1c\x01#\xef\x0e\x0f(\x02@\x025\"'K58!\b\x1f'\"5\x828!\b\x1f'\"5\x02\x025\"'K\x01\x12#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a#\x01@\x171\rw\x01\v\x9b\x01\x11d\x19\a>N\x1a;ET\x11\x050((?\x04\n-\n2\x12K|\xfe\xc0\x171\rw\xfe\xf5\x9b\xfe\xefd\x16#\x1fN\x1a;ET\x11\x010$(?\x04\n-\n2\x12K$#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\x13\x00D\x00N\x00\\\x00\x00\x01\x14\x162654& \x06\x15\x14\x16265462\x16\x02\"\x0e\x02\x15\x14\x162654\x00 \x00\x15\x14\x0e\x01\a\x0e\x03\x15\x14\x06#\"\x06\x14\x1632654>\x027>\x0354.\x01\x01\x17\x01\x06\"/\x01&47\x01\x17\x16\x14\x0f\x03&'?\x0162\x04 &4&\xce\xfe\xdc\xce&4&\x84\xb8\x84h\xea՛[&4&\x01\a\x01r\x01\a$'(\"$3\x17\x96j\x1a&&\x1a\x9f\xe1\x0f&\x1d\x1f#$4\x17[\x9b\xfd\xc2\xe2\xfd\xbd\f\"\f\xa8\f\f\x06@\xa8\f\f\xe9\x1aGB\x81[\xcf\r\"\x02\xc0\x1a&&\x1a\x92\xceΒ\x1a&&\x1a]\x83\x83\x01\xe3[\x9b\xd5u\x1a&&\x1a\xb9\x01\a\xfe\xf9\xb97a4.'0Ua9j\x96&4&\xe1\x9f)B>&#)/Xc;u՛\xfd\x8c\xe2\xfd\xbd\f\f\xa8\f\"\f\x06\x06\xa8\f\"\r\xe9\x19G\x99i[\xcf\f\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00X\x00h\x00\x00\x01\x14\a\x0e\x01\a\x0e\x01\a\x06#\"&5467632\x16\x014&'&#\"\a'>\x0154#\"\a\x0e\x02\x15\x14\x1632\x14\a\x06\a\x0e\x01#\"54>\x0354'.\x01#\"\x0e\x01\x15\x14\x1632>\x017>\x01767632\x17\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03b\r\v)\n\x02\x05\v\x14\v:4FD\x1c\x17\x1c\x11\x01\xe6N\r\x15\r[\x87\x02\x031\xf2\x18,^\x95J\xa1\x93\x19\x01\x04\x16\x0eK-*\x15\x1d\x1e\x16\a\x18E\x1f#9\x19gWR\x92Y\x15\x06\x13\x05\x03\vvm0O\x01\x03\x05\t\xb8\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfd\x1bC2\xc82\v\x03\x01\x02c@X\xac&\x0e!\xfe9\x0e{\x05\bM\x02\x16\xe2A\xe9\x06\x11\x91\xbc_\x92\x9e\x06\x02\"S4b/\x18/ \x19\x0f\x01\x03\a\x16\x1dDR\"Xlj\x92P\x16Y\x16\f\x06<\x12\x01\t\x02\x0f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00%\xff\x00\x05\xda\x05\xff\x00\x19\x00e\x00\x00\x014.\x02#\"\a\x06\x02\x15\x14\x1e\x0232\x16>\x0276\x1276\x01\x14\x06#'.\x02#\"\a\x06\a\x0e\x01\a\x0e\x03#\"&54>\x0132\x16\x17\x14\x0e\x03\x15\x14\x1632>\x03754&*\x01\x06#\"&54>\x02763 \x11\x14\x02\a\x17>\x0132\x17\x1e\x01\x02\xe8\x04\r\x1d\x17''il\x11$E/\x04\x1c\f\x14\n\x02\x10@\x10\x13\x02\xf2\x0f\b\x06\x16P@\x1f\xa7\xb8\x0f\x06\n\x1d\b\x17^\x83\xb2`\x87\x9f'W6&\xa4\x01!.. ! -P5+\x16\x05\a\n\n\n\x01\xe3\xfaE{\xbdn46\x01vL\x05\x03e\xa3V\x16\x1f\x13z\x04\xcf\x18\x1d\x1f\x0f\x17:\xfe\xf7\x89,SN/\x01\x01\x05\f\nM\x015M[\xfd\xa7\a\r\x01\x03\x10\t]\b\x13$\x8b\x1f[\xb1\x98^\xa7\x885\x80iC\x1c\x01\x17'2H&!(?]v`*\t\x02\x03\x01\xf5\xe2l\xe2\u008d\x13\t\xfe\x98b\xfe\xa2$\x039>\r\a\xbf\x00\x03\x00\x01\xff\x00\x06\u007f\x05\xfb\x00=\x00R\x00\x87\x00\x00\x012\x1f\x01\x16\x1f\x01\x16\a\x03\x0e\x01\a\r\x01#\"&5467%!\"&7>\x013-\x01.\x017>\x01;\x01\x05%.\x017>\x0132\x17\x05\x172\x16326/\x01.\x0176\a\x17/\x02\x03.\x01'&676\x16\x1f\x01\x0e\x01\a\x06\x16\x01\x13\x16\x0f\x01\x06\x0f\x016/\x01&/\x01&#\"\a\x03&676\x16\x17\t\x01&676\x16\x17\x13\x03&676\x16\x17\x13\x17\x1e\x016/\x01&672\x16\x03? \x1b\xde=1\x92(\vH\x06/ \xfd\xf1\xfe\xa0\t'96&\x01\x04\xfe@)9\x02\x02<'\x01\xba\xfd\xf7)2\x06\x069%\n\x01\xe1\xfe\xa1&0\x06\x066#\x06\x0e\x01\xc0\xd9\x01\x04\x01\x17\x0f\x14\xba#\x0e\x19\x1b\x15\xba\xda\x05$\xee\x01\x03\x01\x18\v \x1fJ\x1b\x8e\x02\x06\x01 \x12\x03\xa5\x0f\x04\x0f0\f7j\x02)\x925@\xde\"*3%\xeb\x19\x0e\"!M\x18\x01\n\xfe\xfa\x15\x15%#K\x14\xf1\x88\x0f\x15\"%N\x11\xc1e\b\x1e\x18\x01\f\x028)'8\x03_\x12\x94(9\xaa.<\xfec +\x048 8(%6\x05 <)'4\x01@\x05@)#-<^\n?%$-\x02`%\x01.\r}\x17Q!&\xca}%\x02&\x01\x06\x01\x05\x01\x1fN\x19\x17\v\x1c\x93\x01\x05\x02-l\x01\xa7\xfe\xf6IJ\xdb;\x1c6>/\xaa=*\x94\x17%\x018!Q\x17\x16\x10 \xfe\xa0\x01\xc7#P\x13\x12\x18\"\xfe\\\x01Q#N\x11\x13\x1a&\xfea\xc4\x0f\x05\x14\x10\xe0)<\x019\x00\x00\x04\x00\x00\xff\x1e\a\x00\x05b\x00R\x00]\x00m\x00p\x00\x00%\"'.\x01'&54>\x0676%&547632\x1f\x0163 \x00\x17\x16\x14\a\x0e\x01\a\x16\x15\x14\a\x06#\"/\x02\x017\x06\a\x16\x1a\x01\x15\x14\a\x06#\"'\x01\x06\a\x16\x00\x15\x14#\"&/\x01\x03\x06\a\x1e\x01\x17\x13\x14%\x17$\x13\x02%\x1e\x01\x15\x14\x06\x00\x14\x1632\x16\x15\x14\x162654&#\"%'\x17\x01O\x02\x04V\xa59\x15\x04\x04\n\a\x0e\x06\x12\x02\xb8\x01\fn\x11t\f\x12\n|\\d\x01\n\x01ϓ\x14\x14[\xff\x97n\x11t\v\x13\n|@\xfeD\a:)\x03\xf8\xee\t\r;9\x03\xfe8'+\x18\x01|\v\x0e\x89\x04j\xe0,\"\x02 \a\xb0\x0341\x01\x11\xb1\xb4\xfe\xe9CH^\xfen\x1c\x14Vz\x1c(\x1c\xb2~\x14\x01R\t\a\xb4\x029\xb0\\\x1e'\t\x14\x10\x14\f\x16\b\x17\x03\xfbr\xc6\r\x13\n@\x10\xe5\x13\xfe\xed\xe8\x1fL\x1f\x8e\xdf@\xc6\r\x14\t@\x10\xe5w\x034\a\x18\x17\x05\xfe6\xfeH\x03\a\x02\x03\a\x03I\x1c(+\xfdC\x04\n,\x06\xc5\x01\x9d55\x03,\f\xfe\xb9\nf[o\x01\x12\x01\x15p@\xa9\\j\xbd\x02;(\x1czV\x14\x1c\x1c\x14~\xb2\x11\x04\a\x00\x00\x00\x00\x04\x00\x00\xff\x97\x04\xfe\x05i\x00\x1f\x00/\x005\x00O\x00\x00\x01\x14\a\x06#\"'&54>\x0132\x17\x06\a&#\"\x06\x15\x14\x16 654'67\x16'\x14\x02\x0f\x01\"'>\x0454'\x16'\x15&'\x1e\x01\x13\"'6767\x0e\x01\a&546767>\x017\x16\x15\x14\a\x0e\x01\x04\x1a\x93\x94\xe6蒓\x88\xf2\x93`V \aBM\xa7\xe3\xe1\x01R\xe0 B9)̟\x9f\x0e\x1d!S\u007fH-\x0f\x0377I\x85Xm\xfdSM\xdaH\x13\x02*\xc3k#\"\x1a.o;^\x1bJ\x18 q\x01\xaeן\xa1\xa1\x9fד\xf7\x92\x1f>@\x1c\xf6\xa8\xaa\xed\xed\xaaYM\r$bK\xc0\xfe\xced\x01\x05 \x8d\xa8ү[E\"\xa0\xa2\x02\xd6\xe2;\xff\xfe\xb9Kx\u007f%\x13^\x91\x196;%T\x1a,\x1e\x10U:i\x94m=Mk\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1a\x00)\x00.\x00D\x00T\x00\x00\x014'\x06\a\x16\x15\x14\x06\"&54632\x1767&#\"\x06\x10\x16 6\x03\x16\x15\x14\x0e\x03\a\x16;\x016\x114'.\x01'\x16\x054'\x06\a\x0e\x01\x15\x14\x17>\x017\x0e\x01\a\x1632676%\x11\x14\x06#!\"&5\x11463!2\x16\x04\x1a\x1c),\x16\x9a蛜s5-\x04\x17\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xff\x16Cf\x1d\a'/'%\x14\f(\v\x04\b\x05\x11$\x86U\xc7L\x11\x05\x04\n\f(\n\x15#'/'\a@\x86\x16\x89\x02\b\x0f\x10\f3\x0e#@,G)+H+@#\x0e3\r\x10\x0e\b\x02\x89\x01\x01\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x84\x16\x05\x0fX@\x13\x06\x0f\x16\f\x1d\x16\x13\x19\x10\x02_\x13O#NW\xa5#O\x13_\x02\x0f\x18\x14\x15\x1d\f\x16\x0f\x06\x13\x8a\x1d\x05\x16.\x16\x05*\x13\t\x1e#\x1e\x1e#\x1e\b\x14(\x05\x16\x01\xfb\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x0f\xff\x80\x06q\x05\x80\x00[\x00\x00\x016\x16\x17\x16\x15\x14\a\x1632632\x16\x15\x14\x0e\x02\x15\x14\x17\x1e\x01\x17\x16\x17\x16\x15\x14\a\x0e\x02#\"&#\"\a\x0e\x04#\".\x03'&#\"\x06#\".\x01'&54767>\x017654.\x0254632\x16327&547>\x01\x03P\x86\xd59\x1b\t\x0e\x0e\x12B\x12\x1d6?K?\f%\x83O\x1c4\x1c\xdb\a\b\x14\x17\x14T\x16%\x19 >6>Z64Y=6>\x1f\x1a%\x18S\x11\x19\x14\b\a\xdb\x1c4\x1cN\x85$\f?L?4\x1d\x0fB\x14\x12\x0e\t\x1b@\xd8\x05\x80\x01\x8b{:y/\x90\a\x1b$\x1c ,\x13'\x1c\x0f\x1cR\x88!\f\v\x06\x1dF!\v8%\r\x05\x05#)(\x1b\x1b()#\x05\x05\x0f%:\v!F\x1d\x06\v\f \x8aQ\x1c\x0f\x1c'\x14+\x1f\x1b%\x1a\a\x8e0z:\x89z\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00O\x00_\x00\x00\x014'.\x01'&54>\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x16Cf\x1d\a'.'%\x14\v(\f\x04\b\x05\x11$\x85V\xc6M\x12\x06\n\x05\v)\n\x14#'.'\a@\x86\x16\x8a\x02\b\x0e\x10\r3\r#A,G)+H+A#\r4\r\x0f\x0f\b\x01\x8a\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x84\x16\x05\x0eXA\x0e\v\x0f\x16\f\x1d\x16\x13\x19\x10\x02?4N$NW\xa5&M&L\x02\x10\x19\x14\x15\x1d\f\x16\x0f\v\x0e\x8a\x1d\x05\x16/\x16\x05*\x13\n\x1e#\x1e\x1e#\x1e\t\x13+\x03\x16\x03\v\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00\x00\xff\x80\t\x00\x06\x00\x00O\x00\x00\x01\x0e\x05\a\x0e\x01\a\x0e\x03\a\x06\a$\x05\x06\a>\x01?\x01>\x0376\x052\x17\x1e\x01\a\x03\x06'&#\"\x04\a\x06.\x02/\x01454327\x12\x0032\x1e\x05\x177>\x047>\x03\t\x00EpB5\x16\x16\x03\n3\x17\x0fFAP\b/h\xfe\xab\xfe\xdf\\\xd3/N\x10\x0fG\xb8S\x85L\xba\x01\x17\x01\t\v\x06\x06\xc2\x0f \x80\xe2\x92\xfe\x00\x88R\x86P*\f\x01\x06\x8a\xe9\xc0\x01m\xc9\x05\x1395F84\x0ef\x02&3Ga4B|wB\x06\x00.\\FI*/\x06\x12\xed.\x1d?&,\x06\x1f\xc8\x0e\xac5~\x10\x1e\a\a\x1bK %\r\x1f&\x03\x06\x16\v\xfe\xa7\x1d\a\x18Y\x02\x01\x1c.\"\x11\x01\x01\x01\x067\x01n\x01<\x01\t\x0f\"-I.\xb1\x04M`{\x90ARwJ!\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00F\x00X\x00^\x00d\x00j\x00\x00\x01\x14\a'\x17\x06\a'\x17\x06\a'\x17\x06\a'\x17\x06\"'7\a&'7\a&'7\a&'7\a&547\x17'67\x17'67\x17'67\x17'632\x17\a7\x16\x17\a7\x16\x17\a7\x16\x17\a7\x16\x174\x02$#\"\x0e\x02\x15\x14\x1e\x0232$\x12\x13\x11\t\x01\x11\x01\x11\x01\x11\t\x01\x11\x01\x11\t\x01\x11\x01\x05*\x05\xec\xe0\x13'ֱ,?\x9dg=OO\x0e&L&\x0eNJBg\x9d;1\xb2\xd6'\x13\xe0\xed\x05\x05\xee\xe1\x13'ֱ.=\x9egCIM\r$'&&\x0eNJBg\x9e=.\xb1\xd5%\x15\xe0\xed\x05\x1e\x9d\xfe\xf3\x9ew\u061d\\\\\x9d\xd8w\x9e\x01\r\x9dI\xfdo\xfdo\x02\x91\x02\xc4\xfd<\xfd<\x05\xc4\xfd\x00\xfd\x00\x03\x00\x02\x80-\x1f\x0eNIDg\x9e=/\xb2\xd7%\x16\xe4\xf0\x06\x06\xee\xe2\x13(ײ+A\x9ehEHO\x0e*\"#*\x0eOICh\x9f=/\xb2\xd7'\x13\xe0\xec\x06\x06\xed\xe1\x13(ֲ/=\x9fh>ON\x0e\x1f.\xa0\x01\x0f\x9d]\x9d\xdaxwڝ]\x9d\x01\x0f\x02\x1e\xfd\x02\xfe\x81\x01\u007f\x02\xfe\x01\u007f\xf9\xcb\x01\x9c\x037\x01\x9b\xfee\xfc\xc9\x03[\xfc\x80\xfe@\x01\xc0\x03\x80\x01\xc0\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x14\x00)\x006\x00\x00\x01!\a!\"\x06\x15\x11\x14\x16\x17\x163\x15#\"&5\x1146%3\x01\x0e\x06\a567654'\x013\x13\x01\x11!67!\x114&'7\x1e\x01\x01S\x02\xb3\x1a\xfdgn\x9dy]\x17K-\x8c\xc7\xc7\x03\xdf\xf7\xfe\x1e\x17#75LSl>\xa39\x14\x14\xfe\xe3\xe4\xbb\x03V\xfc\xe5%\b\x02\xa6cP\x19e}\x05&H\x9en\xfc\xfd_\x95\x13\x05HȌ\x03\x03\x8c\xc8\xda\xfa\xf2=UoLQ1!\x02\xc3\x1a\x9c4564\x02\xdd\xfd\xb7\x01\xf2\xfb\xa97\x12\x04\x0eU\x8c\x1dC\"\xb3\x00\x00\x00\x00\n\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x14\x00!\x00-\x009\x00[\x00n\x00x\x00\x90\x00\xe7\x00\x00\x00\x14\x06\"&462\x0354&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x1626754&\"\x06\x1d\x01\x14\x1626\x01\x06\x04#\".\x02547\x06\x15\x14\x12\x17632\x17632\x1762\x17632\x16\x176\x12'4#\"\a\x06#\"547\x06\x15\x14\x163276\x014&\"\x06\x15\x14\x1626\x014.\x01#\"\x06\a\x06\x15\x14\x16327632\x16\x15\x14\a>\x01\x05\x14\x02\a\x06\x04\x0f\x01\x15\x14\x06#\"'\x06\"'\x06#\"'\x06#\"&5\x06#\"'67&'\x16327&'&54>\x0332\x1767>\x017>\x027>\x0132\x17632\x17\x16\x15\x14\x0e\x02\a\x1e\x01\x15\x14\a\x16\x17632\x17\x16\x03T\"8\"\"8\x82)<()\x1d\x1e)\xac(<))\x1e\x1d)\xae)<))<)\xae)<))<)\x01\fT\xfeد{ՐR\x15h\x82x\x1e=8\x1e 78\x1e n \x1e8\x1c1\rp\x82\x8eH\x11\x1e_6\xe2\x1eS\xb2\x92oc\r\xfeF@b@?d?\x02uK\x97bM\x9070[f5Y$\x1135\x04KU\x01\x17C<:\xfe\xee[\x04;+8\x1e n \x1e87 \x1e8/8Zlv]64qE 'YK\xc00\x18\x12-AlB;\x16\x13\x17\x02\x14\x03\n\x1a\x18\x10W\xf9\x88#\x1b;WS9\x05\f\r\x13\x01\x11&\x10\x9d(\x19#-7Z\x04\xe8://:/\xfaTr\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x02ʠ\xc7g\xab\xe0xXV\xafע\xfe\xd4e9222222\x1f\x19^\x01\x13\xb3K\x06\x13\xf3Vv\u007f\x94\x96\xddF0\x02\xb22OO23OO\xfe\xe0`\xa6lF;\x9fmhj\x13\x0684\x1a\x14D\xc3ro\xfe\xebB@\x9d\x1a\x01r+@222222C0DP\x01\x13\x1f`\a.\xc0r8h9\x89\x9c~T4\x1d\x19\x03\x14\x06\x0f.&\x14o\x84\x04@9\x05\a\x05\x11\x0f\x13\x01\x06\x18\f\x06\x13\x8a\xf0\x1e1P\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x014'!\x153\x0e\x01#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x95\x06\xfe\x96\xd9\f}Pc\x8c\x8cc]\x0132\x16\x06\x001\xae\xa4I\xfe\xe3U\xa4Π?L\x80\xb6\x80L?\xbe\x99cc\x0e\xc34MX\v\x8a\x14\x1a&\x04\x00\xfc\xb90\x0e4;0\xfe\xae\x05X\x19pD[\x80\x80[Dp\x19D,\x0f\x02)\x12\x02&&\x00\x00\x05\x00\x00\xffQ\t\x00\x05\x00\x00\x05\x009\x00V\x00\\\x00\x94\x00\x00\x1226&\"\x06\x05.\x05'\a\x06&'&6?\x01.\x02\x06#\"\x0f\x01#\x1126\x1e\x03\x17\x01\x16327\x1667\x167>\x01'\x1632>\x01&\x173\x11#'&+\x01\"\x0f\x01\x06\x14\x17\x1e\x01?\x016\x1e\x01\a\x1e\x01\x17\x1e\x01\x17\x16\x0426&\"\x06\x01\x11\x14\x06#!\x0e\x01\a\x0e\x01\a\x0e\x01'\x0e\x01.\x01'\x01!\"&5\x11463!>\x06;\x012\x176;\x012\x1e\x06\x17!2\x16\x98P P \x06\t\n9\x1a2#.\x16}S\xfbP9\x01:\xb1\x16:%L\v\\B\x9e\x9b\x05 \f\x1b\x0e\x15\b\x01)spN/9o\x11J5\x14 \x02\n!+D\x1f\a\x84`]\x9dBg\xa7Y9\xd1\x1c\x1b+\x86,\xc1\x199%\n\x10P\x14\x1dk\v4\x01\x00P P \x01\b&\x1a\xfeN\x1bnF!_7*}B<\x84{o0\xfe\xe1\xfe\x9a\x1a&&\x1a\x01\xa5\x0eB\x1d;*<@$ucRRc\xa7#@16#3\x1b7\x0e\x01c\x1a&\x01\x80@@@\x06\rJ\"@*4\x17\x8c^\x04`E\xb2D\xce\v\v\x01\x02B\x9e\xfd\xe0\x01\x01\x03\x06\v\b\xfe\xdco/\x1489\x062\x127\x17\n*@O\x18\x02\x00\xb4LC\xf3!T!3\x022\xda\x17\x033\x1f\x13X\x18$\x8b\x0fBJ@@@\x02\x00\xfd\x80\x1a&AS\n0C\f59\x04\"\v'D/\x01\x1a&\x1a\x02\xa0\x1a&\x0eD\x1c4\x17\x1c\v88\f\x11$\x1a5\x1fA\x10&\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00%\x00O\x00\x00\x01\x11\x14\x06#!\"&5\x1147>\x067>\x032\x1e\x02\x17\x1e\x06\x17\x16\x01$7>\x01/\x01.\x01\a\x06\a\x0e\x03\".\x02'&'&\x06\x0f\x01\x06\x16\x17\x16\x05\x1e\x042>\x03\a\x00^B\xfa@B^\v\b>\x15FFz\xa5n\x05_0P:P2\\\x06n\xa5zFF\x15>\b\v\xfd\xcc\x01\aR\v\x03\b&\b\x1a\v\xe7p\x05^1P:P1^\x05\xba\x9d\v\x1a\b&\b\x03\vR\x01\a\nP2NMJMQ0R\x03r\xfc.B^^B\x03\xd2\x0f\t\a7\x11:5]yP\x04H!%%\"F\x05Py]5:\x117\a\t\xfd\xa8\xbf=\b\x19\v4\v\x03\b\xa9Q\x03H!%%!H\x03\x86t\b\x03\v4\v\x19\b=\xbf\b<\"-\x16\x16/ ?\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x001\x00P\x00p\x00\x00\x01\x17\x16\x06\a\x0e\x02\a\x0e\x03+\x02\".\x02'.\x02'.\x01?\x01>\x01\x17\x16\x17\x1e\x03;\x022>\x027$76\x16\x13\x11&'&%.\x03+\x02\"\x0e\x02\a\x0e\x02\a\x06\a\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11476\x007>\x03;\x022\x1e\x02\x17\x1e\x02\x17\x16\x05\xc2'\b\x03\n+\xa7~\x04'*OJ%\x01\x01%JN,&\x05x\xa7'\v\x03\b%\b\x1b\v^\xd4\x05M,E\x18\x01\x01\x18E,M\x05\x01\x027\v\x1a\xc6ZE[\xfe\xd6\x03P*F\x18\x01\x01\x18F*P\x03\xd7\xc9:5\x0e\a\x13\r\x05\xc0\r\x13\x80^B\xfa@B^){\x01\xc6\x06$.MK%\x01\x01%KM.$+\xe2\xe2X)\x02o3\v\x19\b\"\x81a\x03 2\x17\x172!\x1f\x04]\x81\x1e\b\x19\v4\v\x04\tI\xa3\x04>\x1f\"\"\x1f>\x04\xc6,\b\x03\xfd&\x03\xa0S8J\xe6\x02B\x1e##\x1eB\x02\xa6\x9f12\f\a\xfc`\r\x13\x13\x03\xad\xfc`B^^B\x03\xa08&r\x01a\x05\x1e#1\x18\x181#\x1e$\xac\xb6R&\x00\x00\x00\x00\v\x00\x15\xff\x00\x05\xeb\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x1a\x00\x1e\x00\"\x00&\x00.\x002\x00v\x00\x00%\x17/\x01\x01%'\x05\x01\x17\x03'\x01%\x03\x05\x01\x17/\x01\x14\x16\x06\x0f\x01\x17\x16\x01\x05\x03%\x017\a\x17\x01%\x03\x05\x017'\a\x17\x16\x0f\x01%7\x0f\x02'\a\x14\x0f\x01\x06/\x01\x17\x14\a\x05\x06#&5'&\x03&?\x01&'\x03&?\x01&'\x03&7%2\x17\x05\x16\x15\x13\x14\x0f\x01\x17\x16\x15\x1776\x1f\x0174?\x016\x1f\x01\x1e\x01\x0e\x01\x15\x14\x0f\x01\x06\x01J\xca\"\xd8\x01\x12\x01\x12\v\xfe\xd4\xfe\xee\xe30\xf5\x01<\x01=\x0e\xfe\xa0\x01\x8d_\x02g\x02\x02\x04NU\a\xfd?\x01\x00D\xfe\xe9\x04f\x0f\xe6\x02\xfd\xe1\x01u\x13\xfeY\x03\x9a\x14\xe2\x02\x90\x06\x02\a\x01\x02\x1e\xb3\x14\x13G\b\x04\xea\a\ab\a\x04\xfe\xdb\x04\x02\b\xe4\x047\x02\a=^\x01H\x02\b^\x85\x02`\x02\t\x01\xb1\x05\x03\x01=\x06\x14\x06v~\x05\x05y\x05\x06T\x03\x05\xce\x06\x05\xf5\x04\x02\x0f\x14\x04\xbf\x06\x01\xd6\xec\xd5\xfe3\xda\xf5\xd7\x01\x86\xd5\x01G\xcc\xfd\xe2\xd6\x01D\xc8\xfe\xa3P\xefO\x01\x0f\t\x034F\x06\x02\x9e\xc8\x01ѭ\xfb\xb3\xea\xa4\xf0\x02q\xc2\x01\xb9\xa3\xfc\xbb\xe9\x8ei_\x04\x05w\\ހ\xe4!1u\x05\x03\xbb\x05\x05S\xa1\x05\x03\xea\x02\x02\x01\xf2\x04\x01\x11\a\x04%V\x06\x01_\a\x05-d\b\x01\xd2\n\x03\x87\x01\x99\x04\x05\xfe1\a\x03=U\x02\x06{J\x04\x048n\x06\x03~\x03\x03\x87\x04\x06r\x87\x03\x05\x02\x99\x05\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x1d\x00'\x00U\x00\x00\x014.\x03#\x0e\x04\".\x03'\"\x0e\x03\x15\x14\x163!26\x034&\"\x06\x15\x14\x1626\x01\x15\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x04\xb1\v\x1f0P3\x067\x1e3/./3\x1e7\x063P0\x1f\vT=\x02@=T\xad\x99֙\x99֙\x02|\x12\x0e`^B\xfb@B^^B\x04\xc0B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e``\x0e\x12\x01*9deG-\x04!\x10\x18\n\n\x18\x10!\x04-Ged9Iaa\x02\x9bl\x98\x98lk\x98\x98\xfeO\xc0\x0e\x12\xe0B^^B\x05\xc0B^^B\xe0\x12\x0e\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x80\x12\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\t\x00+\x00Y\x00i\x00\x00\x01\x14\x06\"&5462\x16\x032\x1e\x04\x15\x14\x06#!\"&54>\x03;\x01\x1e\x052>\x04\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x15\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x04\x04\x99֙\x99֙0.I/ \x10\aOB\xfd\xc0BO\t\x1c-Q5\x05\a2\x15-\x1d)&)\x1d-\x152\x02\xb3\x13\r``\r\x13\x13\r``\r\x13\x13\r`^B\xfb@B^^B\x04\xc0B^`\r\x13\xff\x00\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x03|k\x98\x98kl\x98\x98\xfe\xb8\"=IYL)CggC0[jM4\x04\x1f\v\x17\t\t\t\t\x17\v\x1f\x01\x04\r\x13\x80\x13\r\xc0\r\x13\x80\x13\r\xc0\r\x13\xe0B^^B\x05\xc0B^^B\xe0\x13\r\xfb@\x05\xc0\r\x13\x13\r\xfa@\r\x13\x13\x00\x00\x06\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x00\x004.\x02#\x0e\x04\".\x03'\"\x0e\x02\x14\x163!2\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!54&+\x01\"\x06\x1d\x01!54&+\x01\"\x06\x1d\x01!\"&5\x11463!2\x16\x04\x00\x12)P9\x060\x1b,***,\x1b0\x069P)\x12J6\x02\x006S\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\x00^B\xfe\xa0\x12\x0e@\x0e\x12\xfd\x00\x12\x0e@\x0e\x12\xfe\xa0B^^B\x06\xc0B^\x01U\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049ck\x80U\x02?\xbc\x85\x85\xbc\x85\xfe\xe6@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x128\x0f\x15\x15\x0f8\x0f\x15\x15\x01\v@\x0e\x12\x12\x0e@\x0e\x12\x12\x01N\xfb@B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`^B\x04\xc0B^^\x00\x00\a\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x85\x00\x00\x00\x14\x06#!\"&4>\x023\x1e\x042>\x0372\x1e\x01\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x01!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00J6\xfe\x006J\x12)P9\x060\x1b,***,\x1b0\x069P)\x8b\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x80\x13\r\xf9@\r\x13\x13\r\x01`\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x01`\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01ՀUU\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049c\x01\xbb\xbc\x85\x85\xbc\x85\xfd`@\x0e\x12\x12\x0e@\x0e\x12\x12\xee8\x0f\x15\x15\x0f8\x0f\x15\x15\xf5@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc2\x04\xc0\r\x13\x13\r\xfb@\r\x13`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00(\x00\x00%.\x01'\x0e\x01\"&'\x0e\x01\a\x16\x04 $\x02\x10& \x06\x10\x16 \x00\x10\x02\x06\x04#\"$&\x02\x10\x126$ \x04\x16\x05\xf3\x16\x83wC\xb9ιCw\x83\x16j\x01J\x01~\x01J\x89\xe1\xfe\xc2\xe1\xe1\x01>\x02\xe1\x8e\xef\xfe\xb4\xb7\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0ś\xcd\x10JSSJ\x10͛\x96\xaf\xaf\x02\xb2\x01>\xe1\xe1\xfe\xc2\xe1\x016\xfe\x94\xfe\xb5\xf1\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00$\x00,\x00\x00\x00 \x04\x16\x12\x15\x14\x02\x06\x04 $&\x02\x10\x126\x01654\x02&$ \x04\x06\x02\x15\x14\x17\x123\x16 72&\x10& \x06\x10\x16 \x02\xca\x01l\x01L\xf0\x8e\x8d\xf0\xfe\xb4\xfe\x92\xfe\xb4\uf38e\xf0\x04m\x95z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\x95B\xf0\x83\x01l\x83\xf0\xa9\xe1\xfe\xc2\xe1\xe1\x01>\x06\x00\x8e\xf0\xfe\xb4\xb6\xb5\xfe\xb4\xf0\x8f\x8e\xf1\x01K\x01l\x01L\xf0\xfbG\xcd\xfa\x9c\x01\x1c\xcezz\xce\xfe\xe4\x9c\xfa\xcd\x01G\x80\x80\xa1\x01>\xe1\xe1\xfe\xc2\xe1\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x1f\x00'\x007\x00\x00\x01\x1e\x04\x15\x14\x06#!\"&54>\x037&54>\x022\x1e\x02\x15\x14\x00 \x06\x10\x16 6\x10\x132654\x02'\x06 '\x06\x02\x15\x14\x163\x04\xb1/U]B,ȍ\xfc\xaa\x8d\xc8,B]U/OQ\x8a\xbdн\x8aQ\xfe\x9f\xfe\xc2\xe1\xe1\x01>\xe1+X}\x9d\x93\x91\xfe\x82\x91\x93\x9d}X\x02\xf0\x0e0b\x85Ӄ\x9a\xdbۚ\x83Ӆb0\x0e}\x93h\xbd\x8aQQ\x8a\xbdh\x93\x02\x13\xe1\xfe\xc2\xe1\xe1\x01>\xfa\xe1\x8ff\xef\x01\x14\a\u007f\u007f\a\xfe\xec\xeff\x8f\x00\x00\x00\x00\x04\x00\x00\xff\x00\x05\x00\x06\x00\x00\x11\x00\x19\x00#\x00=\x00\x00\x00\x14\x06#!\"&4>\x023\x16272\x1e\x01\x02\x14\x06\"&462\x01\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!\x15\x14\x16;\x0126=\x01!2\x16\x04\x00J6\xfe\x006J\x12)Q8P\xd8P8Q)\x88\x87\xbe\x87\x87\xbe\x01\xa1\xfc\x00\x13\r\x03\xc0\r\x13\x80^B\xfc@B^^B\x01`\x12\x0e\xc0\x0e\x12\x01`B^\x01V\x80VV\x80ld9KK9d\x01\xb9\xbc\x85\x85\xbc\x85\xfb\xa0\x05`\xfa\xa0\r\x13\x13\x05\xcd\xfa@B^^B\x05\xc0B^`\x0e\x12\x12\x0e`^\x00\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x014.\x02#\x06\"'\"\x0e\x02\x15\x14\x163!26\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01!54&#!\"\x06\x15!\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80\x0f\"D/@\xb8@/D\"\x0f?,\x01\xaa,?\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xf9\x80\a\x00\x12\x0e\xf9@\x0e\x12\a\x80^B\xf9@B^^B\x06\xc0B^\x01D6]W2@@2W]67MM\x01\xa3\xa0pp\xa0p\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01n`\x0e\x12\x12\x0e\xfb@B^^B\x04\xc0B^^\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x01\x14\x06#!\"&54>\x023\x16272\x1e\x02\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16%\x15\x14\x06#!\"&=\x01463!2\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80?,\xfeV,?\x0f\"D/@\xb8@/D\"\x0f\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x80\xf9\x00\x13\r\x06\xc0\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01D7MM76]W2@@2W]\x01֠pp\xa0p\xfd\xa0@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\xb2\x04`\xfb\xa0\r\x13\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x1d\xff\x00\x06\xe2\x06\x00\x00\x1a\x00A\x00\x00\x01\x10\x02#\"\x02\x11\x10\x12327.\x04#\"\a'632\x16\x176\x013\x16\x0e\x03#\".\x02'\x06#\"$&\x0254\x126$32\x1e\x03\x15\x14\x02\a\x1e\x01326\x04\xe7\xd2\xe1\xde\xd0\xd0\xdeJ9\x16\"65I).!1i\xab\x84\xa7CC\x01\x86u\x03\n+I\x8d\\Gw\\B!al\x96\xfe\xe3݇\x87\xde\x01\x1d\x95y\xebǙV\xa1\x8a/]:=B\x02\xed\x01>\x019\xfe\xc6\xfe\xc3\xfe\xc4\xfe\xc9\x11+\x0132\x16\x15\x14\a\x06\a\x06\x15\x10\x17\x16\x17\x1e\x04%\x14\x06#!\"&5463!2\x16\x03\x14\a\x0e\x01\a\x06#\"&54>\x0254'&#\"\x15\x14\x16\x15\x14\x06#\"54654'.\x01#\"\x0e\x01\x15\x14\x16\x15\x14\x0e\x03\x15\x14\x17\x16\x17\x16\x17\x16\x15\x14#\"'.\x0154>\x0354'&'&5432\x17\x1e\x04\x17\x14\x1e\x0532654&432\x17\x1e\x01\x05\x10\a\x0e\x03#\"&54>\x0176\x114&'&'.\x0554632\x17\x16\x12\x17\x16\x01\xc5 \x15\x01\f?c\xe1\xd5'p&\x13 ?b1w{2V\x02\x19\x0e\x14\t\x05?#\x1d\xfb\xc7\x1a&#\x1d\x049\x1a&\xd7C\x19Y'\x10\v\a\x10&.&#\x1d\x11\x03\x0f+\x17B\x03\n\r:\x16\x05\x04\x03 &65&*\x1d2\x10\x01\x01\x12\x06\x1bw\x981GF1\x19\x1d\x1b\x13)2<)<'\x1c\x10\b\x06\x03\b\n\f\x11\n\x17\x1c(\n\x1bBH=\x02ӊ\x13:NT \x10\x1e:O\t\xb7)4:i\x02\x16\v\x13\v\b \x13F~b`\f\x02e\x15!\x03\x0f}\x01\x1c\x01\x88\x01U\x01\x113i\x1b\x13\x1b?fR\xc7\xfa\xfe\xe7\xd2UX\x03\x1a\x10\x19\x16|\x1d'&\x1a\x1d'&\x02I\x86c&Q\x14\n\f\x06\t*2U.L6*\x05\f/\r\x16\x1aL\x0f:\x0f\x19\x15\x199\x01\x04\x04\x020\x1e%>..>%b>+\x14\x05\x05\x02\x03\x10\v+\xc1z7ymlw45)0\x10\t\f\x14\x1d\x1333J@0\x01!\x11!\x15\x16\v\x1c\x17\x19T\x14FL\xa0\x87\xfe\xee\xe5 P]=\x1f\x10\x0fGS\v\xe6\x01-\x83\xd0kwm\x03\x15\f\x17\x11\x14\t\x13!\xa9\x83\xfe\xe4\xac*\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x18\x00(\x00\x00%\x136&\a\x01\x0e\x01\x16\x1f\x01\x016\x17\x16\a\x019\x01\a2?\x01\x17\x16\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\xa5\x93\t' \xfc\xa0\x1d\x15\x10\x18\xdd\x02\x01\x15\v\a\v\xfea\x10\x17\x16l\xe0@\x02l\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xe5\x02\xb5,&\f\xfe\xb3\v\x1c\x19\aE\x01C\x0e\b\x05\n\xfe\x89\xe4\x16h\xa5$\x02\x9b\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x06\x00\x00\xff\x00\x04\x00\x06\x00\x00\r\x00\x1f\x00/\x003\x007\x00;\x00\x00%\x14\x06\"&5467\x113\x11\x1e\x01\x174&'\x114&\"\x06\x15\x11\x0e\x01\x15\x14\x16 67\x14\x00 \x00547\x1146 \x16\x15\x11\x16\x13\x15#5\x13\x15#5\x13\x15#5\x02\x80p\xa0pF:\x80:F\x80D\x00F\x00N\x00V\x00^\x00f\x00n\x00v\x00~\x00\x86\x00\x8e\x00\x96\x00\x9e\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01.\x017&#\"\x06\x15\x11!\x114>\x0232\x16\x176\x16\x17762\x17\x022\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04462\x16\x14\x06\"$2\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4$2\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x05\x99\n\n\xfd\x8e\n\x1a\nR\n\n,H\x138Jfj\x96\xff\x00Q\x8a\xbdhj\xbeG^\xceR,\n\x1a\n!4&&4&\x01Z4&&4&\xa64&&4&\xfd\xa64&&4&\x01\x00&4&&4\x01\x004&&4&\xfd\xa64&&4&\x01Z4&&4&\xa64&&4&\xfe\xda4&&4&\xa64&&4&\xfe\xa64&&4&\x01&4&&4&Z4&&4&Z4&&4&\x05\a\n\x1a\n\xfd\x8e\n\nR\n\x1a\n,[\xe8cG\x96j\xfb\x00\x05\x00h\xbd\x8aQRJ'\x1dA,\n\n\xfe\xa7&4&&4Z&4&&4Z&4&&4Z&4&&444&&4&\x80&4&&4Z&4&&4Z&4&&4Z&4&&4\xda&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4\x00\x11\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00%\x00-\x005\x00=\x00E\x00M\x00}\x00\x85\x00\x8d\x00\x95\x00\x9d\x00\xa5\x00\xad\x00\xb5\x00\xbd\x00\xc5\x00\x00\x01\x15\x14\a\x15\x14\x06+\x01\"&=\x01\x06#!\"'\x15\x14\x06+\x01\"&=\x01&=\x01\x00\x14\x06\"&4626\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x0146;\x01\x114632\x176\x16\x1776\x1f\x01\x16\a\x01\x06/\x01&?\x01.\x017&#\"\x06\x15\x11!2\x16\x00\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462\x06\x80\x80\x12\x0e@\x0e\x12?A\xfd\x00A?\x13\r@\r\x13\x80\x02@\x12\x1c\x12\x12\x1cR\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x04R\x12\x0e\xf9@\x0e\x12\x12\x0e`\x96jlL.h)\x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16$\t\x1c%35K\x05\xe0\x0e\x12\xfc\x80\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c\x01\xc0\xc0\xa9u\xc2\x0e\x12\x12\x0ev\x16\x16n\x11\x17\x17\x11\xbau\xa9\xc0\x01\xae\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\xfd\xe0@\x0e\x12\x12\x0e@\x0e\x12\x02\x80j\x96N\x13\x0e \x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16.t2#K5\xfd\x80\x12\x01\xc0\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12\x00\x00\x00\x04\x00\x01\xff\x00\x06\x00\x05\xfe\x00\r\x00@\x00H\x00q\x00\x00\x01\x14\a\x06\a\x06 '&'&54 \x01\x14\x00\a\x06&76767676\x1254\x02$\a\x0e\x03\x17\x16\x12\x17\x16\x17\x16\x17\x1e\x01\x17\x16\x06'.\x01\x0276\x126$76\x04\x16\x12\x04\x14\x06\"&462\x01\x14\x06\a\x06&'&'&7>\x0154.\x01\a\x0e\x01\a\x06\x16\x17\x16\a\x06\a\x0e\x01'.\x017>\x0276\x1e\x01\x03\xe2\x11\x1f\x18\x16\xfe\xfc\x16\x18\x1f\x11\x01\xc0\x02\x1e\xfe\xf4\xd8\b\x0e\x01\a\x03\x04\x02\x01\b\x9f\xc1\xb6\xfeȵ|\xe2\xa1_\x01\x01ğ\a\x02\x03\x03\x01\b\x02\x01\x0f\b\x94\xe2y\b\av\xbf\x01\x03\x8f\xa4\x01/ۃ\xfd\u20fa\x83\x83\xba\x01\xa3k]\b\x10\x02\x06\x17\a\n:Bu\xc6q\x85\xc0\r\nCA\n\a\x18\x05\x02\x10\b_k\x02\x03\x84ނ\x90\xf8\x91\x01XVo\xd7bZZb\xd7nW\xa8\x01\x00\xf0\xfe|V\x03\f\t0\x12 \x0f\t\x03Q\x012\xb8\xb4\x01-\xa8\n\al\xad\xe7}\xb8\xfe\xcfO\x03\t\x15\x18\t/\f\t\f\x04:\xdf\x011\xa7\x8f\x01\x05\xc1z\t\nq\xd0\xfe\xdb%\xba\x83\x83\xba\x83\xff\x00z\xd5G\x06\b\n4(\n\n6\x92Ro\xbaa\f\x0fą\\\xa8<\n\n)4\t\b\x06J\xda}\x83\xe2\x89\x06\a\x86\xf1\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\x13\x00\x00%!\x11!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x00\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x80\x03\x00\x01`\xfb@B^^B\x04\xc0B^^\x00\x01\x00\x00\xff\x80\a\x00\x01\x80\x00\x0f\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\a\x00^B\xfa@B^^B\x05\xc0B^\xe0\xc0B^^B\xc0B^^\x00\x00\x00\x03\x00\x00\xff\x00\b\x00\x06\x00\x00\x03\x00\f\x00&\x00\x00)\x01\x11)\x02\x11!\x1132\x16\x15\x01\x11\x14\x06#!\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x01\x00\x03\x00\xfd\x00\x04\x00\x02\x00\xfd\x00`B^\x03\x00^B\xfd\xa0^B\xfc@B^^B\x02`^B\x03\xc0B^\x02\x00\x03\x00\xff\x00^B\x02\x00\xfc@B^\xfe\xa0B^^B\x03\xc0B^\x01`B^^\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00#\x003\x00\x00%764/\x01764/\x01&\"\x0f\x01'&\"\x0f\x01\x06\x14\x1f\x01\a\x06\x14\x1f\x01\x162?\x01\x17\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x97\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\x02s^B\xfa@B^^B\x05\xc0B^ג\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\x04\x13\xfb@B^^B\x04\xc0B^^\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x007\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x14\x01!\x11!%\x11\x14\x06#!\"&5\x11463!2\x16\x04\xe9\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\xfc\r\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x01\xa9\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\xfe\xcd\x04\x00`\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x13\x00\x00\t\x01!\x01\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04.\x012\xfdr\xfe\xce\x05`\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01f\x024\xfd\xcc\x01\xd0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\a\x00\x00\xff\x00\a\x02\x06\x00\x00\a\x00\x13\x00#\x00.\x00C\x00\xc4\x00\xd4\x00\x00\x01&\x0e\x01\x17\x16>\x01\x05\x06\"'&4762\x17\x16\x14\x17\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14'\x06\"'&4762\x16\x14%\x0e\x01'.\x01>\x02\x16\x17\x1e\a\x0e\x01\x136.\x02'.\x01\a>\x01\x1f\x016'>\x01/\x01>\x0176&'&\x06\a\x0e\x01\x1e\x01\x17.\x01'&7&'\"\a>\x01?\x014'.\x01\x06\a67\x06\x1e\x01\x17\x06\a\x0e\x01\x0f\x01\x0e\x01\x17\x16\x17\x06\a\x06\x14\x167>\x017.\x02\a>\x043\x167654'\x16\a\x0e\x01\x0f\x01\x0e\x05\x16\x17&'\x0e\x04\x16\x17\x166\x127>\x017\x16\x17\x1676\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05\v\x0f(\f\v\x0e4\x10\xfeZ\b\x17\a\b\b\a\x17\b\a\x9e#\f#\r&\f\f#\f#\r&\fy\a\x17\b\a\a\b\x16\x10\x01\x8b\"\x936&.\x04JM@&\x02\x16\a\x13\x06\x0e\x03\x05\x03\a\xc3\x03\x17 \"\x06(XE\x13*\f\f\x02$\x06\x01\x03\x03+8\x06\njT\x01?\x013\x03\x13#'.\x01'&!\x11\x14\x163!2>\x04?\x013\x06\x02\a.\x01'#!\x0557>\x017\x13\x12'.\x01/\x015\x05!27\x0e\x01\x0f\x01#'.\x01#!\"\x06\x02\x06g\xb1%%D-\x11!g\x0e\ag\x1d\x0f<6W\xfe\xf7WZ\x01e#1=/2*\x12]Y\x063\x05\x92\xeb-,\xfd\x8c\xfe\x88\u007fC1\x01\b\x03\v\x02/D\u007f\x01x\x02\xbe\x8b\xeb\x06\x10\x04\x05] \x1fVF\xfd\xdc\x1c\x0f\x05I\xfdq\x01\x05\x03\x03\x02-H\x8e\xfe\xbe\xfe\xc1\u007fD2\x01\b\xfd\xd4NK\x04\v\x19'>*\xd8%\xfeR=\x05\x06\x01\ff\x19\r07\x02\x83\x01\x92\xf3=.\r\x18f\f\x1bD\xfd]\\|yu\x11\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x11\x00,\x000\x00>\x00S\x00e\x00u\x00\x00\x01\x15\x14\x16\x0e\x04#\x112\x1e\x03\x1c\x01\x05\x15\x14\x16\x0e\x02#\"'&5<\x03>\x0232\x1e\x03\x1c\x01\x053\x11#\x013\x11#\a&'#\x113\x11\x133\x13\x054'.\x05\"#\"+\x01\x1123\x166'&\x0554.\x02#\"\a5#\x1137\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9a\x01\x01\x02\x05\b\x0e\t\t\x0e\b\x05\x02\x01<\x01\x01\x04\v\b\t\x05\x04\x03\x04\x06\x05\x06\b\x05\x03\x01\xfb\xdezz\x01\xb2j\x9f\x1c\x14\f\x9ek-L+\x01\xa9\x05\x03\x10\x12 \x15)\x11\x15\b\x04[\x14$\xa98\x03\x01\x01=\x04\x0f\"\x1d.\x1fun\a\x1e/2 \xb4^B\xfb@B^^B\x04\xc0B^\x02\xe3\xb6\x04\x16\b\x10\a\b\x03\x015\x02\b\x03\x10\x05\x16cy\x01\x17\b\x0f\x06\t\n\x9b\x02\n\a\v\x06\b\x03\x03\x06\x06\v\x05\x0e\xee\x01\xd8\xfe(\x01\xd8ݔI\xfe(\x018\xfe\xc8\x01?\x0eC\x17\x10\x19\x10\f\x05\x03\xfe(\x013\x9b>\x9f\x85\x1d #\x0f\"\x9a\xfe(\x1e$=\x03\x12\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x05\x000\xff\x02\bK\x05\xf8\x00\f\x00\x15\x00\x1a\x00S\x00\x8f\x00\x00\x05&'.\x04'&'\x16\x00\x01\x17.\x01/\x01\x06\a\x16\x13\x06\a67\x014\x02&$#\"\x04\a\x06\a>\x03\x1f\x01\x1e\x03\a&\x0e\x02\a\x1e\x02\x17\x16>\x02?\x01>\x01\x16\x17\x16\a\x06\x05\x06'\x1e\x03\x1f\x01\x1676\x12\x13\x06\a\x06\x02\a\x06\a\x06'\x06# \x00\x03\"&#\x06\x1e\x02\x1f\x01\x16\x17.\x03/\x01.\x06'\x1e\x02\x177676767>\x0176$\x04\x17\x16\x12\x04w\x06\x05\r.~ku\x1f\x11\x9eB\x01R\xfe]\xa8\x19 \x03\x04T%\x05z+\",\x1e\x05\xa0|\xd3\xfeޟ\x93\xfe\xf4j\x1e\x0f<\xa6\x97\x87)(!(\t\x04\x03~ˣzF\x04\x0f8\"{\xf9\xb4\x91%%\x16#\x1a\x04\x0e5\xd0\xfe\xfd\x87\xb6)\x8a\x88}''\x8fx\xc3\xeeJ\x0e\x1aF\xdf\xcf0\"H[$%\xfe\xe5\xfeEJ\x01\x06\x02\x06\x11#%\r\x0e\b.Gk2\x1d\x03\x02\x059(B13\"\b\x13?\xa3@\x02\vS)\x87\x1c5\x0f\" \x9e\x01#\x019\x96\xdc\xe2\xc5\x01\x03\b\x1edm\xabW\x03\"\xd5\xfe\xd6\x02;\x1cL\xb765R\x8eA\x020@T.\x16\xfe\x9e\xa1\x01$\xd4}i`:f3A\x15\x06\x04\x03\x01\x1d%%\n\v\x15BM<$q\xf3:\x06)BD\x19\x18\x10\t\x13\x19a\x18a%\x14\x04`\xa1]A\v\f\x17&c\x01|\x01\t\x87M\xd0\xfe\xebs!\v\x1a\n\x03\x01Z\x01\r\x012}i[\x1a\x1a\fF&\x89\x8f\x83**\x02\x15\x0f\x1a\x18\x1b\x1b\f\n\x1f<\b \x95\x8dʣsc\x1c\"\x0fJ<&Ns\xfeF\x00\x05\x00%\xff\f\x06\xd8\x05\xf4\x00\x17\x000\x00@\x00W\x00m\x00\x00\x016&'.\x01\x06\a\x06\x16\x17\x1e\x02\x17\x1e\a6\x01\x0e\x02\x04$.\x01\x027>\x037\x06\x1a\x01\f\x01$76\a\x14\x02\x14\x0e\x02\".\x024>\x022\x1e\x01\x05.\x01,\x01\f\x01\x06\x02\x17&\x02>\x04\x1e\x02\x17\x1e\x01\x036\x00'\"'&7\x1e\x04\x0e\x03\a>\x03\x05=\x1dGV:\x87e\x12\f\x0f#\x17\x1f:\x1b$?+%\x18\x14\r\v\n\x01q4\xc1\xec\xfe\xf2\xfe\xfa\xf0\xb4g\x05\x01\x0f\n&\x043h\xf2\x01T\x01`\x01Zt\x14\x02\xf3Q\x88\xbcм\x88QQ\x88\xbcм\x88\x01pA\xe7\xfe\xed\xfe\xcb\xfe\xdb\xfe\xfe\xb6P\x1e1\x05L\x8e\xbd\xe1\xef\xf6\xe2\xceK!:<\f\xfe\xd7\xf8\b\x02\x02\x1a}҈`\x15\x17d\x91\xe1\x88l\xbb\xa1b\x02\xf0,\xab9'\x1d\x14\x1b\x17\n\x05\x03\x04\x0f\n\r%%($!\x18\r\x01\xfd\xcb\u007f\xbaa\x183\x83\xc0\x01\x17\xa4)W)x\r\xd0\xfe\x86\xfe\xfe\x9a\f\xa1\xa4\x1b\r\x04\x02\x1fо\x8aQQ\x8a\xbeо\x8aQQ\x8a\x06\x93\xd0c\bQ\xb1\xf6\xfe\xa4ǡ\x01-\xf4җe)\x17U\xa4s2\x8e\xfe\x81\xf4\x01XD\x05\x05\x03\x04\\\x94\xbd\xd1ϼ\x92Y\x02\x1ed\x92\xcf\x00\x00\x00\x00\v\x00\x00\xff\x80\x06\x00\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x0132\xc0p\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10\x04\xb08(\xfc\xc0(88(\x03@(8\x01\x00\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\xa0\xfa@(88(\x05\xc0(88\xfb\b \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\x00\x00\x00\x00\x01\x00/\xff\x00\x06Q\x06\x00\x00\x90\x00\x00\x01\a\x17\x1e\x01\a\x0e\x01/\x01\x17\x16\x06&'\x03%\x11\x17\x1e\x01\x0e\x01&/\x01\x15\x14\x06\"&=\x01\a\x0e\x01.\x016?\x01\x11\x05\x03\x0e\x01&?\x01\a\x06&'&6?\x01'.\x01>\x01\x17\x05-\x01\x05\x06#\".\x016?\x01'.\x01>\x01\x1f\x01'&6\x16\x17\x13\x05\x11'.\x01>\x01\x16\x1f\x015462\x16\x1d\x017>\x01\x1e\x01\x06\x0f\x01\x11%\x13>\x01\x16\x0f\x0176\x16\x17\x16\x06\x0f\x01\x17\x1e\x01\x0e\x01#\"'%\r\x01%6\x1e\x01\x06\x06\x1e\xa7\xba\x17\r\r\x0e2\x17\xba7\r2G\rf\xfe\xf1\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\xfe\xf1f\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1d\x1a\t*\x1d\x016\x01\x0f\xfe\xf1\xfe\xca\x04\t\x1b\"\x04\x1a\x1b\xa7\xba\x17\r\x1a4\x16\xba7\r2G\rf\x01\x0f\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\x01\x0ff\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1b\x1a\x04\"\x1b\t\x04\xfe\xca\xfe\xf1\x01\x0f\x016\x1d*\t\x1a\x01\xa3!k\r3\x17\x17\r\rj\xa0&3\n%\x01,\x9c\xfe\xc7\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\x019\x9c\xfe\xd4%\n3&\xa0j\r\r\x17\x173\rk!\x06./!\x06>\x9d\x9d>\x01$,*\x05!k\r3.\x0e\x0ej\xa0&3\n%\xfeԜ\x019\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\xfeǜ\x01,%\n3&\xa0j\r\r\x17\x173\rk!\x05*,$\x01>\x9d\x9d>\x06!/.\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x12\x00&\x00\x00\x016.\x02'&\x0e\x02\a\x06\x1e\x02\x17\x16$\x12\t\x01\x16\x12\a\x06\x02\x04\a\x05\x01&\x0276\x12$76$\x05\xc1\aP\x92\xd0utۥi\a\aP\x92\xd1u\x9b\x01\x14\xac\x01G\xfe\xa3xy\n\v\xb6\xfeԶ\xfc\x19\x01[xy\n\v\xb6\x01-\xb6\xa7\x02\x9a\x02_v١e\a\aN\x8f\xcfuv١e\a\t\x88\x00\xff\x04=\xfe\xa4u\xfeʦ\xb7\xfe\xc8\xc7\x19\x84\x01[t\x017\xa6\xb8\x018\xc7\x19\x16X\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x0e\x00\x12\x00\x16\x00&\x006\x00\x00\x01\x13#\v\x01#\x13'7\x17\a\x01\x05\x03-\x01\x17\a'%\x17\a'\x04\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb4\xa33\xaf\xab1\xb3N\x15\xf0\x15\xfeE\x010\x82\xfe\xd0\x01\xda\xf0g\xef\x01\u007f\xbfR\xbe\x02=|\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x01\"\x01>\x01\"\xd3\xec\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01\xfc\xfe\xb7\x01^\xfe\xa2\x01v!1f2\x02i\x82\xfeЂwg\xeffZQ\xbeQ^\x01>\x01\"\xd3||\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x02w\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\f\x00&\xff\x01\aZ\x05\xff\x00X\x00b\x00l\x00w\x00\x81\x00\xab\x00\xb7\x00\xc2\x00\xcd\x00\xd8\x00\xe4\x00\xee\x00\x00\x01.\x03'&>\x01'&'&\x0f\x01\x0e\x03\".\x01'.\x06'&\x06\a\x0e\x03&'&'&\x06\a\x0e\x03\x15\x06\x167>\x0176\x127>\x01\x17\x16\a\x0e\x01\a\x06\x1667>\x0276\x172\a\x06\x02\a\x06\x16\x17\x1e\x026\x04\x16\x06\a\x06&'&>\x01\x01\x16\x0e\x01&'&>\x01\x16\x00\x0e\x01'.\x017>\x01\x17\x16\x01\x16\x0e\x01.\x01676\x16\x13\x16\x02\a\x06'\x0e\x01&'\x06\a\x06&'&'.\x0267.\x01>\x017>\x02\x16\x176\x1e\x03\a\x1e\x02\x06\x01\x16\x06\a\x06&'&676\x16\x13\x16\x0e\x01&'&676\x16\x01\x16\x06\a\x06.\x01676\x16\x01\x16\x06\a\x06&'&>\x01\x16\x01\x16\x06\a\x06&'&676\x16'\x16\x06\a\x06.\x01>\x01\x16\x056\x04/4-\x03\x05LJ\x05\x0eg-\x1e\x03\x04\x02\a\x03\a\x05\a\x03\x03\f\x06\v\b\v\v\x06\x1e$\x1b\x01\x10\t\x15\f\v6\x1e)j\x17\x102%+\x16QF\x1e)\x12\a\x90\x05\x06\x1f\x0e\x1b\x06\x02b\x01\x063F\x14\x04SP\x06\x14\x15\x1d\x04\x02\u007f\a\f21\x11DK2\xfcA\x06\x10\x0f\x0e\x19\x03\x03\x10\x1c\x02W\f\a\")\f\v\a\")\xfd\x15$?\x1a\x1a\f\x12\x12?\x1a\x1a\x05\x04\x13\f8A&\f\x1b\x1cA\x84E5lZm\x14\x81\x9e=\f\x01g\xf4G2\x03Sw*&>$\x045jD \x86\x9f\xb1GH\x88yX/\x064F\x15 \xfbr\x0e\t\x14\x131\r\x0e\t\x14\x131\xac\x04\x12\"\x1c\x04\x03\x13\x10\x11\x1c\x04\xa5\x04\x15\x14\x13\"\b\x15\x14\x14!\xfdl\x10\x0f\x1c\x1b=\x10\x10\x0f6>\x02\xfa\x04\x10\x0f\x0f\x19\x03\x03\x10\x0f\x0e\x19\xbc\x0f\t\x16\x166\x1e\n,5\x01.\x18\x14\x01\x18\x1a/\xb9\xb1'e\x02\x01\x11\x02\x02\x01\x03\x01\x03\x04\x03\x02\r\x05\n\x05\x06\x03\x01\x05\x10\x17\x01\x0f\a\r\x02\x02\x1b\r\x12.*\x1c\x8d|\x90\x01Ed\x04\x02\x1a!\r\x01u\b\v\x0e\a\x0f&\x12\xf3\v&%\x17&\b\xa8\x9f\t\x1d\x01&\x10\xfe\xf9\x1c5d\x18\t\r\x03\x1f\xa8\x1e\x19\x03\x03\x10\x0f\x0e\x1a\x06\xfe\xda\x11)\x18\b\x11\x11)\x18\b\x0366\f\x13\x12@\x1a\x1b\f\x12\x13\xfd\x01\x1cC&\f8B\x14\x13\f\x02@q\xfe\xf9L?\x03P^\x057\t\x01G-hI[\x0eq\x8f\xa1:<\x88rS\tU~9\x177\x15\aA_\x87I\x10R`g\x02p\x141\x0e\x0e\t\x14\x141\x0e\x0e\t\x01\x05\x10\x1d\b\x13\x11\x11\x1c\x04\x04\x13\xfc;\x14\"\x04\x04\x15(\"\x05\x04\x17\x03j\x1b?\x10\x10\x0f\x1b\x1c>\"\x10\xfdT\x0f\x19\x04\x03\x11\x0e\x0f\x1a\x03\x03\x10\xe2\x166\x10\x0f\n,6 \n\x00\x00\x00\x18\x01&\x00\x01\x00\x00\x00\x00\x00\x00\x00/\x00`\x00\x01\x00\x00\x00\x00\x00\x01\x00\v\x00\xa8\x00\x01\x00\x00\x00\x00\x00\x02\x00\a\x00\xc4\x00\x01\x00\x00\x00\x00\x00\x03\x00\x11\x00\xf0\x00\x01\x00\x00\x00\x00\x00\x04\x00\v\x01\x1a\x00\x01\x00\x00\x00\x00\x00\x05\x00\x12\x01L\x00\x01\x00\x00\x00\x00\x00\x06\x00\v\x01w\x00\x01\x00\x00\x00\x00\x00\a\x00Q\x02'\x00\x01\x00\x00\x00\x00\x00\b\x00\f\x02\x93\x00\x01\x00\x00\x00\x00\x00\t\x00\n\x02\xb6\x00\x01\x00\x00\x00\x00\x00\v\x00\x15\x02\xed\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x1e\x03A\x00\x03\x00\x01\x04\t\x00\x00\x00^\x00\x00\x00\x03\x00\x01\x04\t\x00\x01\x00\x16\x00\x90\x00\x03\x00\x01\x04\t\x00\x02\x00\x0e\x00\xb4\x00\x03\x00\x01\x04\t\x00\x03\x00\"\x00\xcc\x00\x03\x00\x01\x04\t\x00\x04\x00\x16\x01\x02\x00\x03\x00\x01\x04\t\x00\x05\x00$\x01&\x00\x03\x00\x01\x04\t\x00\x06\x00\x16\x01_\x00\x03\x00\x01\x04\t\x00\a\x00\xa2\x01\x83\x00\x03\x00\x01\x04\t\x00\b\x00\x18\x02y\x00\x03\x00\x01\x04\t\x00\t\x00\x14\x02\xa0\x00\x03\x00\x01\x04\t\x00\v\x00*\x02\xc1\x00\x03\x00\x01\x04\t\x00\x0e\x00<\x03\x03\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00 \x002\x000\x001\x006\x00.\x00 \x00A\x00l\x00l\x00 \x00r\x00i\x00g\x00h\x00t\x00s\x00 \x00r\x00e\x00s\x00e\x00r\x00v\x00e\x00d\x00.\x00\x00Copyright Dave Gandy 2016. All rights reserved.\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00Regular\x00\x00F\x00O\x00N\x00T\x00L\x00A\x00B\x00:\x00O\x00T\x00F\x00E\x00X\x00P\x00O\x00R\x00T\x00\x00FONTLAB:OTFEXPORT\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x004\x00.\x007\x00.\x000\x00 \x002\x000\x001\x006\x00\x00Version 4.7.0 2016\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00P\x00l\x00e\x00a\x00s\x00e\x00 \x00r\x00e\x00f\x00e\x00r\x00 \x00t\x00o\x00 \x00t\x00h\x00e\x00 \x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00s\x00e\x00c\x00t\x00i\x00o\x00n\x00 \x00f\x00o\x00r\x00 \x00t\x00h\x00e\x00 \x00f\x00o\x00n\x00t\x00 \x00t\x00r\x00a\x00d\x00e\x00m\x00a\x00r\x00k\x00 \x00a\x00t\x00t\x00r\x00i\x00b\x00u\x00t\x00i\x00o\x00n\x00 \x00n\x00o\x00t\x00i\x00c\x00e\x00s\x00.\x00\x00Please refer to the Copyright section for the font trademark attribution notices.\x00\x00F\x00o\x00r\x00t\x00 \x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00Fort Awesome\x00\x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00\x00Dave Gandy\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00\x00http://fontawesome.io\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00/\x00\x00http://fontawesome.io/license/\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x8e\x00\x8b\x00\x8a\x00\x8d\x00\x90\x00\x91\x00\x8c\x00\x92\x00\x8f\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\a\x01\b\x01\t\x01\n\x01\v\x01\f\x01\r\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\"\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x011\x012\x013\x014\x015\x016\x017\x018\x019\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\\\x01]\x01^\x01_\x01`\x01a\x01b\x00\x0e\x00\xef\x00\r\x01c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01}\x01~\x01\u007f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\a\x02\b\x00\"\x02\t\x02\n\x02\v\x02\f\x02\r\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\"\x02#\x02$\x02%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x021\x022\x023\x024\x025\x026\x027\x028\x029\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02Q\x02R\x02S\x00\xd2\x02T\x02U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\\\x02]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02}\x02~\x02\u007f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\a\x03\b\x03\t\x03\n\x03\v\x03\f\x03\r\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\"\x03#\x03$\x03%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x031\x032\x033\x034\x035\x036\x037\x038\x039\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\\\x03]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03}\x03~\x03\u007f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x00\x94\x05glass\x05music\x06search\benvelope\x05heart\x04star\nstar_empty\x04user\x04film\bth_large\x02th\ath_list\x02ok\x06remove\azoom_in\bzoom_out\x03off\x06signal\x03cog\x05trash\x04home\bfile_alt\x04time\x04road\fdownload_alt\bdownload\x06upload\x05inbox\vplay_circle\x06repeat\arefresh\blist_alt\x04lock\x04flag\nheadphones\nvolume_off\vvolume_down\tvolume_up\x06qrcode\abarcode\x03tag\x04tags\x04book\bbookmark\x05print\x06camera\x04font\x04bold\x06italic\vtext_height\ntext_width\nalign_left\falign_center\valign_right\ralign_justify\x04list\vindent_left\findent_right\x0efacetime_video\apicture\x06pencil\nmap_marker\x06adjust\x04tint\x04edit\x05share\x05check\x04move\rstep_backward\rfast_backward\bbackward\x04play\x05pause\x04stop\aforward\ffast_forward\fstep_forward\x05eject\fchevron_left\rchevron_right\tplus_sign\nminus_sign\vremove_sign\aok_sign\rquestion_sign\tinfo_sign\nscreenshot\rremove_circle\tok_circle\nban_circle\narrow_left\varrow_right\barrow_up\narrow_down\tshare_alt\vresize_full\fresize_small\x10exclamation_sign\x04gift\x04leaf\x04fire\beye_open\teye_close\fwarning_sign\x05plane\bcalendar\x06random\acomment\x06magnet\nchevron_up\fchevron_down\aretweet\rshopping_cart\ffolder_close\vfolder_open\x0fresize_vertical\x11resize_horizontal\tbar_chart\ftwitter_sign\rfacebook_sign\fcamera_retro\x03key\x04cogs\bcomments\rthumbs_up_alt\x0fthumbs_down_alt\tstar_half\vheart_empty\asignout\rlinkedin_sign\apushpin\rexternal_link\x06signin\x06trophy\vgithub_sign\nupload_alt\x05lemon\x05phone\vcheck_empty\x0ebookmark_empty\nphone_sign\atwitter\bfacebook\x06github\x06unlock\vcredit_card\x03rss\x03hdd\bbullhorn\x04bell\vcertificate\nhand_right\thand_left\ahand_up\thand_down\x11circle_arrow_left\x12circle_arrow_right\x0fcircle_arrow_up\x11circle_arrow_down\x05globe\x06wrench\x05tasks\x06filter\tbriefcase\nfullscreen\x05group\x04link\x05cloud\x06beaker\x03cut\x04copy\npaper_clip\x04save\nsign_blank\areorder\x02ul\x02ol\rstrikethrough\tunderline\x05table\x05magic\x05truck\tpinterest\x0epinterest_sign\x10google_plus_sign\vgoogle_plus\x05money\ncaret_down\bcaret_up\ncaret_left\vcaret_right\acolumns\x04sort\tsort_down\asort_up\fenvelope_alt\blinkedin\x04undo\x05legal\tdashboard\vcomment_alt\fcomments_alt\x04bolt\asitemap\bumbrella\x05paste\nlight_bulb\bexchange\x0ecloud_download\fcloud_upload\auser_md\vstethoscope\bsuitcase\bbell_alt\x06coffee\x04food\rfile_text_alt\bbuilding\bhospital\tambulance\x06medkit\vfighter_jet\x04beer\x06h_sign\x04f0fe\x11double_angle_left\x12double_angle_right\x0fdouble_angle_up\x11double_angle_down\nangle_left\vangle_right\bangle_up\nangle_down\adesktop\x06laptop\x06tablet\fmobile_phone\fcircle_blank\nquote_left\vquote_right\aspinner\x06circle\x05reply\ngithub_alt\x10folder_close_alt\x0ffolder_open_alt\nexpand_alt\fcollapse_alt\x05smile\x05frown\x03meh\agamepad\bkeyboard\bflag_alt\x0eflag_checkered\bterminal\x04code\treply_all\x0fstar_half_empty\x0elocation_arrow\x04crop\tcode_fork\x06unlink\x04_279\vexclamation\vsuperscript\tsubscript\x04_283\fpuzzle_piece\nmicrophone\x0emicrophone_off\x06shield\x0ecalendar_empty\x11fire_extinguisher\x06rocket\x06maxcdn\x11chevron_sign_left\x12chevron_sign_right\x0fchevron_sign_up\x11chevron_sign_down\x05html5\x04css3\x06anchor\nunlock_alt\bbullseye\x13ellipsis_horizontal\x11ellipsis_vertical\x04_303\tplay_sign\x06ticket\x0eminus_sign_alt\vcheck_minus\blevel_up\nlevel_down\ncheck_sign\tedit_sign\x04_312\nshare_sign\acompass\bcollapse\fcollapse_top\x04_317\x03eur\x03gbp\x03usd\x03inr\x03jpy\x03rub\x03krw\x03btc\x04file\tfile_text\x10sort_by_alphabet\x04_329\x12sort_by_attributes\x16sort_by_attributes_alt\rsort_by_order\x11sort_by_order_alt\x04_334\x04_335\fyoutube_sign\ayoutube\x04xing\txing_sign\fyoutube_play\adropbox\rstackexchange\tinstagram\x06flickr\x03adn\x04f171\x0ebitbucket_sign\x06tumblr\vtumblr_sign\x0flong_arrow_down\rlong_arrow_up\x0flong_arrow_left\x10long_arrow_right\awindows\aandroid\x05linux\adribble\x05skype\nfoursquare\x06trello\x06female\x04male\x06gittip\x03sun\x04_366\aarchive\x03bug\x02vk\x05weibo\x06renren\x04_372\x0estack_exchange\x04_374\x15arrow_circle_alt_left\x04_376\x0edot_circle_alt\x04_378\fvimeo_square\x04_380\rplus_square_o\x04_382\x04_383\x04_384\x04_385\x04_386\x04_387\x04_388\x04_389\auniF1A0\x04f1a1\x04_392\x04_393\x04f1a4\x04_395\x04_396\x04_397\x04_398\x04_399\x04_400\x04f1ab\x04_402\x04_403\x04_404\auniF1B1\x04_406\x04_407\x04_408\x04_409\x04_410\x04_411\x04_412\x04_413\x04_414\x04_415\x04_416\x04_417\x04_418\x04_419\auniF1C0\auniF1C1\x04_422\x04_423\x04_424\x04_425\x04_426\x04_427\x04_428\x04_429\x04_430\x04_431\x04_432\x04_433\x04_434\auniF1D0\auniF1D1\auniF1D2\x04_438\x04_439\auniF1D5\auniF1D6\auniF1D7\x04_443\x04_444\x04_445\x04_446\x04_447\x04_448\x04_449\auniF1E0\x04_451\x04_452\x04_453\x04_454\x04_455\x04_456\x04_457\x04_458\x04_459\x04_460\x04_461\x04_462\x04_463\x04_464\auniF1F0\x04_466\x04_467\x04f1f3\x04_469\x04_470\x04_471\x04_472\x04_473\x04_474\x04_475\x04_476\x04f1fc\x04_478\x04_479\x04_480\x04_481\x04_482\x04_483\x04_484\x04_485\x04_486\x04_487\x04_488\x04_489\x04_490\x04_491\x04_492\x04_493\x04_494\x04f210\x04_496\x04f212\x04_498\x04_499\x04_500\x04_501\x04_502\x04_503\x04_504\x04_505\x04_506\x04_507\x04_508\x04_509\x05venus\x04_511\x04_512\x04_513\x04_514\x04_515\x04_516\x04_517\x04_518\x04_519\x04_520\x04_521\x04_522\x04_523\x04_524\x04_525\x04_526\x04_527\x04_528\x04_529\x04_530\x04_531\x04_532\x04_533\x04_534\x04_535\x04_536\x04_537\x04_538\x04_539\x04_540\x04_541\x04_542\x04_543\x04_544\x04_545\x04_546\x04_547\x04_548\x04_549\x04_550\x04_551\x04_552\x04_553\x04_554\x04_555\x04_556\x04_557\x04_558\x04_559\x04_560\x04_561\x04_562\x04_563\x04_564\x04_565\x04_566\x04_567\x04_568\x04_569\x04f260\x04f261\x04_572\x04f263\x04_574\x04_575\x04_576\x04_577\x04_578\x04_579\x04_580\x04_581\x04_582\x04_583\x04_584\x04_585\x04_586\x04_587\x04_588\x04_589\x04_590\x04_591\x04_592\x04_593\x04_594\x04_595\x04_596\x04_597\x04_598\x04f27e\auniF280\auniF281\x04_602\x04_603\x04_604\auniF285\auniF286\x04_607\x04_608\x04_609\x04_610\x04_611\x04_612\x04_613\x04_614\x04_615\x04_616\x04_617\x04_618\x04_619\x04_620\x04_621\x04_622\x04_623\x04_624\x04_625\x04_626\x04_627\x04_628\x04_629\auniF2A0\auniF2A1\auniF2A2\auniF2A3\auniF2A4\auniF2A5\auniF2A6\auniF2A7\auniF2A8\auniF2A9\auniF2AA\auniF2AB\auniF2AC\auniF2AD\auniF2AE\auniF2B0\auniF2B1\auniF2B2\auniF2B3\auniF2B4\auniF2B5\auniF2B6\auniF2B7\auniF2B8\auniF2B9\auniF2BA\auniF2BB\auniF2BC\auniF2BD\auniF2BE\auniF2C0\auniF2C1\auniF2C2\auniF2C3\auniF2C4\auniF2C5\auniF2C6\auniF2C7\auniF2C8\auniF2C9\auniF2CA\auniF2CB\auniF2CC\auniF2CD\auniF2CE\auniF2D0\auniF2D1\auniF2D2\auniF2D3\auniF2D4\auniF2D5\auniF2D6\auniF2D7\auniF2D8\auniF2D9\auniF2DA\auniF2DB\auniF2DC\auniF2DD\auniF2DE\auniF2E0\auniF2E1\auniF2E2\auniF2E3\auniF2E4\auniF2E5\auniF2E6\auniF2E7\x04_698\auniF2E9\auniF2EA\auniF2EB\auniF2EC\auniF2ED\auniF2EE\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x18\x00\x00\x00\x00\x00\x02\x00\x01\x00\x01\x02\xc2\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xcc=\xa2\xcf\x00\x00\x00\x00\xcbO<0\x00\x00\x00\x00\xd41h\xb9"), } file6 := &embedded.EmbeddedFile{ Filename: "7e367be02cd17a96d513ab74846bafb3.woff2", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969054, 0), Content: string("wOF2\x00\x01\x00\x00\x00\x008\xf8\x00\x12\x00\x00\x00\x00\x80\x80\x00\x008\x93\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1aL\x1b\x9a\x0e\x1c\x81\b\x06`\x00\x868\bL\t\x83<\x11\f\n\x81\xc6\x1c\x81\xafi\x12\x81h\x016\x02$\x03\x86v\v\x83>\x00\x04 \x05\x82\x10\a \f\x81[\x1bYr\x15l\\e\x86\x8d\x03\x80\x05\x9f\xedx\x14\xe2q\x00{\xd4;\x8a`\xe3\x00\x02i\xee\xce\xfe\xff\x96\xdc\x18\x03{\xc0\xfc\x1b\xaa\x04\xbbH\xe2\xb0\x03\xa3w7\xed\xcdF\xbc\x05\a2\xdb.5\xfc\x14I\xe9\"P\xdd!S\n-z}n;\u05ff\x90\xac\u0097=w\x8dM\n\xe7\x8b\x0e\xfd4ijJD'8c\xe3\xc3[\x05\a.\xfc\xaf\x1e\x92\x14M\x9e\u007f\xf2O\xf8_gfn\xf2\x00\xe4A\xe8dv\x80>\xa4JTEf\x0f\xcfϭ\xf7\xb7\x01#\x1d\x1b\xa2\x82\x01\xe80\x89\x94\xac!=\xa2rT\b=rԨ\x92\x1a\x82\fz\xa3C\xa4D\xa5\xcfSP̆\xe7\xfb\xfd\xfe\xb7\xb6\x9e{\xbeXv\xd4\x12CR\x8d\xbcF\xa5QIn)\xa9fJ\xa3\x04\x1ao\xf6}\xd3|gwg[\x91V\xa5\x9et\x92}\xf2/\xad\x00\x96\xc7\r`\x00\r`\x01Є\x86\x19\xc0\x0fa\xae\xd7廫;\xddٻ\xd2)@T#u@\x0f\x0e\xfcM\xa4\x00\v6\xa0gw\x92=\xe9\xb1K\x9f\xea\xa7'(\x05\x86\x00\xb7i\xf0,M\x80\x05+\xeb\xfbmj,\xaf\xac\xdc\xc3.\x8f\xbe\xa3s%\x9dK\xf8\xba\xaa8\xf5qx\xd3\xcb\xe9\x0ed\xa9\xd08$F/\xfdI\xae\x92a\x1c\x8a\xf3X7\u05cf\x8c\x8e\x05\x18ߚ\xef\xf2\xdd\x1e$\x13\xdeХ\xc4Sb\xf7\xbd\xafBU\x85\xaa\n\x9f\a\x1e\x88\xaf\xb1\xdf}\x11\xc1D\x12\x95\n\xa9Sþ\x9d\x9b\x9f2\xd0?^\xf6\xcb\xee^i\r#~b#\x90\x00\xf3\x83\xff\xf7\xf7{\xb3]9E\xb9\x85,\xc2M\x1a\xff\x8d\xac\x92\xaf\xafxsKt\v\xaa\n\x15\x82p\x15\xaa\xba\x92\x84\x02\x054\xc8\x12\xe2'\xa3Lj\x89\x1f?\xf3\xa9\xfa[\xef\xec\x94\xdf(\x16}dce\xd8\\\xa0\x0f\v\xcbȘ\xbb\x93N\x91\xceJ\xd1)\x84\xb8$\xfd\xb7\xe2\xd0B՝\xfcA'\u007fx\x92L\x89M\xf37\xbd\x8e\xa5\xf6\r\x96\x8d\xc7\xc8T\xea\xfcOs\xf6&ku;ƌ\x91,\xdd\xe1L\xfeO\xee\xae?\xb94Mw\xae3w\xac\xdf\xfd{\xc7hw\x8e\x15\xe6\xd0\b\vn\xe7\xae+eݱv\n[\xb5U\xadp<$\x12\ajY\x8c\xc1\xba\x16\x87\x83@װ\xa7\xfe\xfcP@T\x99\xc96\xff\u007f\xa8{\xee\xc35Rc>]\x1c\x8a\xf4\x85 E\xe4\xe4DZ☓L\xcdS\x823~l\xf8\xb8\xb5\xe3\r\x12\bК\x80D\xdc.U\x80UTW7,\xb0\x94@4كDN\x04\x97 H\x92 \xa9\x82\xa4\xff\x0f!\x99\xb2AjԂi\xb6\x03\x02\x01Vb*\x04\xe2\xd0\xc3\xf5L\x01\xcf%\x91\x04_ x\x05\xc1\xcd\a\x88_\xeb\x14\xe2\x0f\x94 \x00\xf2\x8f\x02\x16\x99P&,\v~\x86k.#\xf8\x03\x9ef\x1aP\xf5\x04\x02,\xcce\x1cm\xc6^\r\x13\x90\xc4ݱ\x83\x8b\x98W\xfa[9UQ\xdd\xd5R\b\x99\x90\xb9\xd9U\xdc\xc2'jeZ\xf4r\xaf\xcf\xe2[\xb7\x92\xa2\xeag\x0e\xd1w\xfb쁯\xf0mE^w/\xddk\x1f\x9a\xfd\u007fc \n\x18\xb1\xc2\xc0\xba\xea\x9a\xebn\x10!J\x82$\x19r\xe4)R\x82\xa3K\x8f1\x13x\xe6\xac\xd9)P\xa8H\xb1f\x14-\xeek\xd5\xe6\x81vT\x1d:u\xa1\xa1\x1b0hȸy\v\x16-Y\xb5f݆M\x8fm\xf7\xc0M\x98\xf0\x011\xcf\v\x10\x9b\x8c5o^\x0f\xc6\x12\x87\x84TCBd\x8byz\xd8d\x86߲\x1f\xc4\xe4\x9a\xf5]\xf4\xa5&Gzj!\xb0㢊\x93y\x0e9\xc1\x18\x9c\x82\x8dׁ#\xe0\xd4\xff\u0b00f\bNw\x9d%q689\v\xb0^t9\x13,\xf3\x8eM\xf6\xb8\xf9y\x91\x9f\xcf\xcdF'\xcc9y\xcb&\xaf@\x12\x1cs\x1cXr\x18l\x82#\x0f\x03\xae\xd7\xcd+\xe6\xd9b\xa9\xd2࿂_\x1e\x88ɒ\x84\xd4H͘\xf4\x8c*\xcd\x1aHa\xa8 \xba\xd8A\xceB\x00\xe6n\x10\xa5\xe6w\xa1\xe5\x8a(\x01a\x82\xc0\xe6\x06)Ҕ\xe9\x82\xc8d\v\x82\x1c.\xf2\xd0\x14q\x1b\xaf+\vC\x85\x1b\xf4\x93acNx\xf9\x9d\f.\x9a٥\x9d\xd7t\x048\xee\x80\xc7̵\xca+\xd69b\xe7f\xe75r\xb8))\xa4\xc4\\\v\xf7i\xa5\x8d\a\x85\x13\xd95\xc9\x14\xd3\xcc0\xeb玘g\x81E\x96X\xf3\xeb`\x83M\x1e\x17n\xe5\x95'<\xe5Y\xe1v\x8e\xec<\t\x03\x99l\x90\xcbs\xf29\xa1\x98\x1d\xe3\xc2#,P\xfd\x1b\x83\x95\xf5+\x18\t\xe7-Yb\x98\x11F\x19\xab̉\x11\nk\xa1v\x8e\xe8\x80\xe3N0\xcb+QX\x00\xa5\x90\"\x8a\v\xe7rd\x9e\x05\x16Y\xfar\x10.\b\xc0D\x80\x11o1\x8a@\x18\x18\xb2d\xc3A!V\xda9\xa1#\xc0q\a3\xb2\x99c\x9e\x05\x16Y\x8a\x8c\xf0\x925\xd6\xd9\xf0\x9b\xe0qe\x04T\x92\xa1!S\x92JN8\xe1\x84\x13N֟`\xa1\x87\x8f!0Z\x8fO<\x8b\xe4ZS~\x1dl\xb0\xc9\xe3\u007fv\xd8t\x11\x02\x98>ې\x9cw\x16\xc8r\xbeԻ\x10\xf3\xb9\x06r7_`\v%u\xaa<\x9e\xff\x9b;\xe2(s\\\xe7?\xf5\xe8<\x87\xc6\x19z\xf2U\x06\aj\ue032\x1cS\xf3n\xe7\x85zro\x00\xeb\xe4\x9d#\xfa\r\xf7\x98\xfe<\u007f\xb1J\xa7\xa0R\x9bI(\xda\xd9\x01D\xd0\xf2\xbb\xa6+g\xab \uf2d4\xac\xa0\x00\xd9\xcaA\xda-\x8e#'2J\u007f_\x89\xceH\xe6\x97T\x00\x12\xb4|S\xeb@\x8c\xc3\tF\xe5\xac\xee\xa3|\xa2\xf3IX\x0e\x96\x83\xff^\xec\xdc|C\xaa\x9b1_X\xbeA\xa9ǒ\xc6\xf6\xebz\xe1oȏ\xa9\x9c1%D\x1e\x95\x88b\xef\xe5\xc5!\x88\\=\xc5\xc3\by\x00\x9a\xae\xecZ\xdd\xd7\xc8\tWI\xb9m\xa5e\xcb!\xa7&-\x81)7\r\x1d'\x12r&\xf4n\xe2q\xcfT\x84&Y\x0e\xf5\x10b\xae\x9ai0\x18'\x02V\x16\x04%\x18\xf4\x9b\xc0a]\x87p\x8b$f2\x94\xa0i\xd2v\x0eN\xe8<=\xf7\x02c\xa6.2\x97\x00k\xf72[\xf6\xae\xc8x\x96\xab\n\x94\xb8\xa6\xd9\x12a\xab\x1e3}\x164g\rF*\xa2\xf1\x18\x8f\xf1F^\x82$\xc8U!\\\x13\xdcu\x97\xc1-B`\x84\xc5BDLD]$1\xe2`$\xa6\xe0$\xd3L\x88\x91\xacXȉ\x95\xbc8(\x88\x8d\xa2\xd8)\xe9\x14M\xa1h\tM;p\xe6e\x98|.ޤ\xf1x\xd2i\xa6\x01\x9d\xa3\x9d\x81;\xa1\xb3\xec\xc4\xcd>\x9c\xcb7\x1fm\xa6\x10\x0f2\x02\xef\xf3\xc5ȣ\x04\xe2\xd5\xec\xe1HD\x04*\xd63\xe8\xd6\x0f\x86\xb6\xbb\x1en\xd8\x18\x16\xe3䲛0\ve\xce\xe54o\t\xc6\xeab.k\x1e;]<\xb8M\xd2\x10\x86\x88\x1c8ahq\xc0\x06\xb6\x12F\x98\x9bh-[8S\xa4\xb4\xf4\xc9*\x98ہ\xabT\xc6dpc1Fc\xcfd\xf5\xa7\xe5\f\x0e\xca\x1d\n\xa8\xf2\x18\xc6\x18\"\x86\x19\x84b\x91\xf0V\b\xc8R\x19d\x9c\x06\x05\xe6QK\x84\xc9\"\xc1d/\xa0\xe4\xc9/\x9e!\x8c\xc3\x10\x91C\x13\x16\xa3Q<\xc0V\xc2ֲ\x19\xcc\xe0\xc6\xcai\xbf$ӂ\x19f1\x83-\xcf \xa9}$4w\x8b\x0ehܳ\x1e\x89\x05t\xeai&|\xd4>\xfai\x1f\xf9,\x86]{\x95\x87\x13\xe0hVp\x03\x9a\x91\rPdķ\xbb\x1d(H\x90[\xeax\x84\x1a0\xfa\xd6<4\xb5\xc1\xc8\xf3yt\xc1\xc7\xdd\xca\xc5\x00L/\x9b$\x00\xb59-\xf4o\xe0\xde.\xa7\xb5\xfa.?\xc7\x12#\xfcw\x01`\v\x80#N0\xd4\x06*@\xfe$\xf8\v\\>/k\x80\x0f\xf4j\x80q`P\xf1\xe1k\xdb\xdd\xeb\x85M\xc0A\xear\x16\xa0.\x84\xa8\xa3\x80}S\xdf\xcc\rXU\x9c\x9a1ͷ\x1c1\xed\xa1\x17\xde\xf9\a\xbd\x10|\x9b֧\xba\xbdʵ\x0e\xebi\xdd֏\xebo\xbe\x10\xbe\xd6\r\xfd\xff?\xf8\xe4\xf3ɯu\xde\x03\xa3f\xacx\xe9\xbd\xc81)Ĭ\xdd:e~\xf8\x11\x95\xaf\xf5\x1cc\xc6\xf3\xb3ƀ\x1c\x019\x04b\x1d\xb9\xf1\xec\xb8\xe7O\xf7~\x1c\x91K\xac\x18\xbbu\xef\xe3\xee\xd3\xfe\xd8[\xfd\x01\xdb\x03\xf6\x04\x9cK\xec\x1b\xab\x1dMЬ\u007f\x9c\xf6\xf7\x13%\x196bԘq\xc9RL\x984eڌY\xa9\xd2\xc6o\xb7\x13\xa5\xdb\xf2\xc4S\xcfl˰32\xef\xa9ǀ\x03۪\x86ʣuZ\xdf\xdd\x01\v\xc0\x9d\x80\x01x\x8d\xb8\xfbM\x80\xd7\x02\xde\x01\xb8\x04\xf0N\xf1lo\x06\xbc\v\xf01\xc0\r\x80\x8f\x03>\x93\xc5\x14\xf0Y$\xee\x02>\a\xf8\x1a\xe0݀\xaf\xe3\xe7\xbf\x05\xf0\r\xc0w\x01\xef\a|\x0f\xf0}\xc0\xbd\x80\x1f\x00~\x02\xf8(ী\x9f\x01\xee\a\xfc\x1c\xf0\x1b\xc0\xa7\x00\xbf\x15w?\b\xf8\x1d\xe0\x8f\x80/\x00\xfe$>\xfc!\xc0\x9f\x01\xff\x00|\x13\xf0O\xc0\xbf\x00\x0f\x03\xfe\r\xf8\u007f\xac\xee%J\x1f\x05\xa4\xe4'@\xed\xf1\x1c\x1e\x03\xead\xa0N\x01<\x0e\xb4ϊ\x1a\x9e\x04\xda\x0fkx\nh?\xae\xe4i`\xb1\xb6\xbb\x0e\x00\xcf\x00\x8b\r܍\x00x\x0eXl\xd2x3\x00^\x04,\xb6\xac\xe4\xa5\xc0\xe2\x80\xc6\a\x02\xf02`qh\r\xaf\x00\x16\xb7\xd6\xf0J`\xf1\x8e\x1a^\x05l\xb9V\xe8\x82W\xbba\xff\xe2\xf12DX\xe7ʀ\xb54\x8e\xccI6\x05\x06M\x02\xd6Y:\xfa\x86\xad\x1c_\xe7\x87u\x1c\x80kdCMT\\\xb3\xb3\x9c\xaeF\x9c\xb2\xf2\xf73ȟ\x96\xf4\f\xfaE\xaeErF\x8d\xd4]\xbf\xb0\xee\xe6p\xc8 ;\x88\xdc\xdbB.g\xd0\x1d\x90m&\x83\xed\xa0\n\xb6\xb1\x9aq\"\xa4\xf9\xb2\xa7n\xbaZ\xd1\xeb|\x83oTh\xe5\x8b\xdcuT\x10\x98\xf3\xbb\xb9\xf4\x82\r\x0e\x8a?o\xbc\x8b\x94\x19\xbc\x8b\xacO\xe8\xc8\x14}Zg?h\xeb\x14\xffL\xec\xe8\u007fP\xdb4\xe1)\xe3\x86\xf5qЊo\f9\xfc\x9ep\x1b\xb5s\x9fH\x86L\x0f\xa9\xda\xf7\xed%\n\xdaDn\x1b\xe5\xc1\xfb\x15挃>\x10}\xa4\xadI\fn\xa8\xfa\x9a<=.\xf2\xbbk#l\x17\x1cD\xd9\xefr\x8dܸh\x1d\xbd\xd1m_\x8e\x8c\x91Dɽ\x88\xd8\f}G\u007f\xcen\x1b\x9a턚[\xaf\xaf4W`\xe1\xf5\as\xb7\xde\x1c\x10q\x91\xf1ט\xa6\x02\b.\xefG\x02\xe2\xa9s-\xb8ҏ\xae\xc6K\xdd;\xde\xc7G\xfc\x0f\x05L\x9cἿ\xf5\xfa\xfb\xfem\xf8\x80\xf5\x99\x1dX\xa0\xb11\r\xb0\xfd\xe8hB\x00\x02\x83\x04˿\xf1\xca\xff\xffS\x80\xfa0\xe0\x97\xc0*o\x03\xd6\xfe\x02\x00\xfdi\xa0\xed\f\xd8\xf5_\x80\xe1\x19\x15\x9eT!\f\xf7\xb9R\x84a\n\xd76<\xbc\xf1\xe6\x9a\x03\xf9\x85\xe1\x1c\xe91\r\xf4&1\xd7i\x1d\xf4\xa3GV\x9d\x02\x1a\xd3(\x9d,v\xee\xecB2\xd6\x0eH/H\x89W\xd8`+۴\a'\x85\"\xe8\x01\x12\xa5\xb2\xbd;\x17/D\xbb\x18\x8f\xb6(\xe7\xd4}\xaaW\xf1,\xdf2\xa6\x19\xaf\x9cKo\x04ۘ0\x9c\x05\xf54\x1e'0\x90D\x8b\x96\x87\x10ǦmщE\x86\x86\x80\x1cS\x89PП\x97\xed\x10\x05* <\xa7\xcf\x05q%\xe2\x84+\x82c5T2\xea\x97h\x88\x8eK\x84\xcc\xc9\xe1\xf7=\x0e\n\x88\x04/\x1b\xd13\xd8L\v\xb0.\x80(\xab\x8d\xeei\x00\xd0d\xea\x9a\xcaz\xa52\x9bww\x17\x92\x17\xcav]-\x06\xff\xf7\xb8\xe4©\xd5\xf5\xd1X\xed%\x8dV\xad9I\n{\xa4Lw:C\xe7O\x8cm\x8e\x8feծLy\xbc\xa6\x97'j:6\x12B\xe0Qo\xa8\x81\x1eO̐\xe4\x02\x93]\xce\x12\x86\x83\xcd\xedh\x12\x96=K\xa5\x9f\xe2~\xe0\xcaML{\xf9\xca\xebu\xaf6\xa2\xf9e|\x85\xcf?\a\xe3\x9e\x04\x80\\\xf3\x1d/\xd7#\xe1\x13\xde\xfd\xc2=\x1a\x86P\x85\a5\x91\xc0\xed\x84!a ,\x8cF(\x9c\x86\xfe\x1dKK\x11\x8c\xc6]G\x12\x14\xed\xaeg\xc3\xcdu}P\tO\nP\x8d\xea\x02\xf9C\xdc\xff\xaf-\xe0\x93\x03\xd0:HJr\x0e\x9e+-A\xf2w%)\x97\xb2\x80\xb9\x8d\xcfY'Ur=W\xdf\x007\x10\xaa\x9e\a{\xed2!w\xb2:\xbe\x1c\xe4q\xd3\xf8%\xc8Q\x00-\xd7G\xdd\xd7\xeb\x98A\x8a[]g\xed\xb8\xa7w\xd2\x00\xaa\x86\xb1x\xa1\xba\x8f\f\xef\xfcl\xbbӳ>\xbdPSN\xe7\xf4\xbf\xa0,\x8fT}\xfc\xe7\x9e\xef\x19\xfd3w\x95\x93\xd9\xe9)\xed\x02\xd5qZSW\xbex\xf6#\xf8H\x19\x8dI8\xa3\xb7\xc3E\x96\x90\x88\n\xed\xf6\xc3\x17\xdf~\xbcZEvL\x81\xd4\u007f\xd0\xc1\xaf\x87\x0eFį\xa6\x96\xa9\xb4\x00\x85C\x04k>du\xac\xa1\xb0\u007f\xa8|\x8e\xab\x80輑Q?\x82s\xe4\\\x18yѿ\x02m\x01\x14\xd0\x17dh\vj\x84j:\x89K;F\xd1\xe2\x85^\x80\x91\x90\u007f\x1b\xc1\xfd\xc8\xe7\xf0o\x99\xf0\x1c\x9dY\xae\xfam\xa2\xbc\vM\x12~3\xa35\xd4>\x96\xac\xff\x84\xbf\x94R~\xa6\x91\"\x94\xcf=)\xd9#\x9f:\x19ߓ\xb3ݐ\x1a\xfb\x06\xe2\xf8/S-s\x06Ę\xe8f\xabA<\x06\xeaC\xe0#\xe0k\x83O\xc8=\xf9g\xbb\xf1\xb9_\xb8\x88\x19\xf2\x1c\xadI\x14\x93\noA\xe6\xc63Y\xda4\x1d[[G_\xe4\x88\xee4\xf8D%֊\xd4\xd1\x11\x9c\x03G/\xf9Z\xdb\"\xba\b\xab\x0ev\xdcz\x19\x0f\nh\x00\x8e\xd5\xc6\xd0>\xc2\f\x9di\x11\xf7\xb5m\x1a\rE\x0fJjp%\x0f\xbaL0\xd5\xff\x03\x9b'n\xac:\\\xfan\v\xed1k\f9\"\xaem\xb7Gt\xc1\xf5\xf9e\xe9\x0f\x8cu\x01\x91:\x0f\xf9\v\xb1h\byJ\x8b\x85I\b\xf22\xaf\x95\xb1\x96\x9c1\x96\u007foc\xb5j\xa0\x00\xad\xf2\x82\x9a\xcaq\xe0\x8d]\xebζ\x10\x02\xf0K\x16\xfe\x9e\xd9\xe5\x89\xde]|H>K\x01J\xba\x8fM\x8b\xd6\u007f\xb8m\x8b\xd6\xd0\xe9PU`\xb0\xbby\xb95\xf5\x0e\xbb\xa7\x951\x11\xb9\xb1\xb57\x9d\n\x11\xc8DÙ\xbc\xe4˅\xfb\xf3\xb09E\xe7\xff\"S\x8ďuX\x18檞|\xdaw.\x8b\xcc\xe8\xea\x94\r\x84\xcb{\x85Z\xad\xe4v\xa4v\xed\x95gK9w\xa9\x9ee\xa1Ƹ\xda,\xadx4\xb4\xeb60\xe8\xe5\x86@\x9f\xae\x87\xd6\x18\xee\xbe]\x82d\x84\x91\xb8ЭT\xb2\x16\xe2DA^\x1c\x9b\x90\x85d\x84[g\x9c\xb7\xdd`\x87ި\xaaB!T\xd4\xdb\x17+`\xb1G\xe0\xe2b\xeb$\xfd\x86$\xd26\x8c\xdb\xe1\x91D>Ƙ\xb6sa\xb6\x14\x1c\xf0\U0001a9b6i\xf4\v\xee\xc6\xc6\xe4+\\\xe3\xd0G\x1a\xe0̨\xa4\xfe\xe1\xa9+\x0e=\xae醝\xa7=\x83e#Ԋ\x9c3uu\x9f\xf8\\\x18M\"\x18\x9d\x89\xf2pq\xb6\xb5i7\xb6\xf4\xfa\x86\xda\\w\x14\x17ъl\xdb{}\teY5\x93\xb4P\xe2\xe7\x1aT\xe6tڸ\x8ce\xf1\xc2JR\x10e\x96e\xd2\x0f\xbf̆4?r,\x10\xc6\xf7c\xef\xb5?\x101\xd2\xc9z\xffnv\xa0kֆxô\x81\xbc\x86\x03\xa6\x9a\xfb\xca*y\x81\xd1\xf9$\xb6\xb2ֱ\x1c{F\xc7\x1dU\xe4\xabV\x03\xe8\x9a\xdbh\xe5\xe9u_\n(l\x13z\x06\xf1u\x92\x8a\x83\xadw\xa9\x16\x1c\x1d\xef\xa1a\x06\xed\x9f\x15*\x8e\tj^rz\xfb\x87\xba\x1eC\xb6\xd2>4\xb2yrN\x0f\xaaOLυ\r\xe3\xdb\x11x\xfc\rie\xe6c9\xb6\x13vP\x93\x88\xd3M\xf6e\f\xa7{x\x12\x106e8c\xed\xa9sRѲ\xeb\x847\xc0#!\xe7\xf6lT>IVpjz\xcak[R\xe6DB\xce\xe2\x1acO\xcf\xdb$\x1d&\x8e֍7h\x13\xb7X6`\x9d\x04\xa2\xc1\x88\x96\xa0\x97\xc4oJ\xc8\xf8;\xf7\xf4/O\xa9\x82W\x86\x04R\xb6\x8b\xe7bO\xb2\x80\x8b(\x03vق\xa7\xcbp\xf4\xebf\x19\x85\x82\xbc\x1f\x91\"\xad\x85\xad\x01\xdf` \fL\xcc\xebܻ\x85\xad\xbe\xc6\x0f\xc0\xe4\xa5\xc0\xdb\xd8\xec\x03\x91\x17\xde\xf25\xf8\x9fo{\x1b\v\xe0\x0f\xcf\xdd{\xe2\xed\xff9\xf9\xdb\xc7@-\x1c\xb2#b\xeb\x13Ã\xac˚\xc0\xfa\xe9q62^\xc8\xd77\xc6:\xca\xd7[\x84\xd3,\xe2\x82[\x00x\x93Ş\xa6\x1a\x9f\xfb]\x8a4,%\xb9һtf\r'X\xe6\x05\xe3jRX\x90\x96\xdcm\x163_j8\x1d\xa4\xff\xfaS\x95[)\x80|F\r\x92$\x95\x10n\x1b\x1f[\"\xbe\xae2\xbeR[?\xfc\xa8\x11\xf3\x8c\xbc\xdd\xc4M\u007f\xbdԟ\x9d\xd2@\b\x8f\x8d\xf2wO\x8e\x10un\t3\xaa\xf4\xa6\xcc/\xf5\xa2G\nGh\xa8\xd5\x17Ӵ\xcc\x94\x19!\xe3t<_m\xa0\x06\xdbQ1\xa4\xb8\xb0\x84\xfc\xf6\xf2\xfc*jr\xa4\x86$\x93\x93䗎J\x81\xc7\xf0\u007f\xdf\xf2>!if\xf8\x90u\xfd\xe03\xfb\xf2#\xb8\xca\x1f\xed|\xf3f\x13\xc4#\x92Cu\xd0E3\x8d\xee\xdag\x91\xb19}\xe4\xa2\xdc~\x0353\x1dl\x8f\xce8\x96|\x96\xabdK\\iRҏ@q\x12\t\x12M\x1e\b\x1f\xfa\xbb\xb7\xb2\xfa{\u007f0,~\x88Y\x8e\"\x01\x14\xdf\xfe\u05cf\xc7FO\x1e3\a;D\x95\x95\xfe,*\xfe\x9e\x9f\x9d\x94X\x90\xc3\xe9\xca㗚\x1a\x12\x90L\xdc=\x1b*\xe9\x99N\x12\x87\xf1\xb2\x1a5x\xc78z\xb4\xdb>1\xdf\xffx!\x9a\xb8\xf5]\xed\x8c4\xc50\xd5\x04q\xa5\xe2\xeas\xf8\x97\x17\x9c?\xec*\x82.\xe3u{+\xff\x8b\x8c*\xa0\x97\x92sF-Q(\xa6\xa4\xa0ߓ\x12\xfc\xd1\xf9-\xe6\xa8In\xc5{\xc2j\xb5j*j5jX\xb1ΌBذ\x94ST~\xbc\xd1\xe8Qn\xd7R(L,]\x0f\x9f\x98\x8a\xb7\xf7\xf3\xf2\v\xf3r\x8f\xf6\xb1\xa1A\xb5\x87ӽC\xab\xf3\x1d\xed\xb5\x14_\x1f\x1d\xa3\x92Q\x85[\xef\x04e\xec[\xfb\x95\xf5\xc3\xe33=\x03\x92MR\xa6\x19&\xba9y/ы\x1c\xf5\x11\xb0\xe1\x02/\xe3\xbb7\f\x95$\xae\xa3_\x14\x04e\xee1t\xa1\x93\xb5\x8a\r\xe6nOw\x85\xb3|a\xfdF\xf2\x15\x1c}d\xdd}\xb3\xf3\nasQ\xcc\xeb\xa7\xc7~g#+\x0f+z\xa77\xfa\xed\xbb\x1f.{m\r*\a\x81\xec\xd9FŖ\n\xfen\x97\xed\x91B_cTBK\xdex*<\x8aq&FO\vLQ\x9b\x056\xa8S\x9d\xe7\xde}k֢\x00\x06\xea\xf6\x9b\xb7\x13\xa3\xee\xc1\x15.7B\xdf\"\x1c9\xf1\x93\u007f\xf6\x8ed\x9a\xd9\x14S\xcb2\xa2\x98.*\x97\n\xc4\x15\xc5\xfaFd\xfa\x92Λ\xe9',\xf3\xbc\xb8\xf8\xf3-L:H:k!W\x82\xb9\xbe\xfd\xe8\f\x8c\xfb\xf9\xd8ٶ\xc6\xf2\xa2\xfe\x95S\xbf\xb2\xdfL\x9d\xe9\xaci\xc9\xe5\xed\xd2\xec\xf6\n\xe5×\x9b\xaa\xa4\xc0\xac\xdd\xf2\xf1P\x82\r\x13\x10\xbb\x14:t~\xf7+\xe6\x9f\xd9\xf7#\xf4\x06$\xab\x04\xab\rG\xecTV\xae\xa7[P\xb5\xb6\x1en\xa00\x9e\xe4\x924\xba\xfcaS\xab\xa6?\xba\xa8菎༐\x9e\xd4NLc\x91\x044\u007f\x17'\xee\xc5\xfd\xfc\xf4\xd1ōQ)>\x81\xb1i\x0e\x00\x92/{|#\xbe\xb5\":\xda\xc6\x15(g\xa3x0V\xbb[\xdb:x\x94\xb0K\x183\v\x9f?\xe6\x05\xd1\x1e\xea\x18ӣ\x9f\xaf\x1f=\xf9\xb03;\x1aK\xccL\f\xcf'\x83Ta\x9e\xfa\x8e\xfe\x93\x8b\rWR\x1f\x1e)$\n\xde\x13z\x11\xe2U\xd1Y\x19l6\x1b\xbb\xc6s\x9aza\xb2\xfe\x8c\xfbA\x91os\xba\\x^^pa\xbd\x04\xedx\xbb\x05guY\xd5B\xeb\xce\xcec\xcc\x0f*\xf4\xd9\xc3cD\xcf(\x9f\xb2IRbj\xa2\xb627\xe7\xcb@K^\xaby\xaa,-\xad\xed,\xcd$\x95\x8da\b\xfe\x90k\xa0w\x85\v\xf6\xc5\xe7\xd7\xeaE\x1a}\x81\x03\xf6[\xd6SV.\xd07\xe3\xdc;\x8eOs\xeb\xc8\xe7\xdf\xcc+\xac\xca\xee\xe5\xa6'\xde+ρ\xb9\xea\x1b\xa1)k)\xa2\x11f\xf0\x85\xc4\b\xf1OڜF\x9dF\xa7\xb2PHJ\x1b#\x00Z\xe4\x1e\xee\x11\xfe\x9f+\x97B\xb6\xaa\xf5\x87\xf5\xcc\xf5\x93\x1a\xe6\x87_\x91{\x9b\xc4\xfc\xb9D13/\xb6\xe5\xbc㫤悘\xb4\x1aR1\x10t2#~\xd5\xda_.iE\xefo\x17\xbd\n\x8e_\x88\x1cKn**ͩ\x8a\t\xb0*\x8a\xf2v[\x8cr\xbe\x17ЁY\u007fY\x04'd\xcd\xdc\x1dK\x1e/\xb9WR\x1b\xbdI\x0eq\u0085\xa2\xd7\x01\x03z\xa4\x1ebkU\xeeº\r\xd4]\xb0\x04\x18\x9e\x9d\xe2\u007f\xc7\vA\a\xfb\xc3O\xab\xda\x1e\xd4\xdekm\xabz\xa6\x90\xf1\x97\aѱ\xca?Em\xe1\xef\xa1>\x929\x9c\xe7\x1d\xb9֊\x86\u007f\xaf\xe3,\xf8~\xb5\xfd\xe2\x04\xc7\xe5\xe7cܧ\xa9\xed\xe8I,\xb7\u007fbL\b\xb6\x9d\xfb\xda6\xc1\xea\x9az\xa2\xad\xd0\xe1£͝\xe7n\xb7=n\xff\xf7xg\xf1с\x8f\xebz\xf4ӧ\x97\\\xf2.\x8d^j\xcc\xd8\x16\x93\xa9P\xad\xbc\x92+\xf6<\x91\xb3\xea[\xb6\x06_\xcf\xd1\b`$\x8e\x94D\x02\xa6\xfeH\x01X\n\x95z\xe7JP1\xa0(>ʐ\xa3J\xc6\x1c\xb1\x8cay\xea\a\x86\x0eZol\u07bd\xbey\xff\xaal|qaN\x88\xbc\x17귪!\xec\xde\xe5k\xff\x98\x8d\xe3S\xbaj\x16\xbb3)\x80~\xdcm\xe6\x14L\brIqѦ\x1b\x13\x8a&-\xc2\x06\xd6\xe8\xf0{\x1f\xc9X\v\xd4\xe7,\x8br+\x01\xed\xdd<\xd3\x19\x8b`\xa7H5\x18\xe7\xf7\xffn\x8d.\x05\xe4\"cZ\x00#\xa0)\x06dd\xec_\x87\xf7#\x86\xf2\x96\xd2\xfb\f)릔\ue502%W\xc5D\x97\x82p&\xabv\x84mhӤ\x8b\xff\x0eB\x10\\\xaa\n\xfe\xb2\x95V\xd8\xfb\xfe\tS[;\x93gN\xaaWv\xd9\xfc\xe8\xe5\x81\xd29\x9c=\xf6\xc7k\xe1\x91a\xff\x04IZ\x87\xa3\xa0\x05\x19\xec\x9f6=x\"\U0007d7f1\xbf\xf8a*ը\xf2\x83II+\xb1\xf8\x91\xab\x1ef\x1b\xc3\xf7Q\xa06\xea\xf7vN\xc2\xda\xf1i\xb8\xfe\x0e\xbc\xbas2\xc39\xcdP\\5\xd0\"m\x05\x1d<\x1fX\\Ǚ\u007f\x91\x83)+\xad\xcc\xeb\xe5\xfd\xfb\xa4\xfb\x01\x0fhC-*\xfb\xcc\xe4#)k'Og\xc2Kҷ\x91\xe6\xe2\x80\xfds|cl\xda?\x13\x19N\xe1[\xfd\xfea5t\xcfE\xce\xdc\xc1?,\xbf5\xad\xa88\xc3\xce\xff\xee\xe8\xf0+1\xda\xc7>\xf2JZ\xbbq\xd5[Ӳ\x96\xb4\xe2GI\\\xf8\xbe\xa8\xa2)\vX\xe2\x02m\x11\x84x\x06\x04X\xa79`\xf5\xe1\x9by$\xfa\xbb\x9f\x89^\xb1\x96\xd2`\x9e\x87\xb6ȩK\xad\\\xf7\xb9\x1e\\X$֫R\x06hrݰ\x18\xeb\xdc&\xe9!-Q\xfeKw\x02M\xce\xca\xd7\xe3\r\x82\x8dR\xf6\xfb\xda\xfb\x9f\x0f\x15\xd2\xf5\xe2\xfd\x9c݂,\xb4սԹ\x14\uf6d9DX\xe4\xbd|@K\x9c\xb1\t\xacw\xa4!l3|\t^q\xa6NgCU\x18\xe7I\xf3ժR*\xaa|\xd1E:\x18͘XrF\xf5\x14i\x8a\xd1A<\xde\xc7'\xeeQ[\xf7,\x98\x1c\xa5\r|\x9d]\u05ec\xc4\xd0\xe4\xa8\xf8\xf7?Q\x13\xcaCg5\xe4\xb2\xcf&\xcb\r\xc9h\xd4\xfc\v\xe1\xf2\xb4b5+B\x05K\xa2\xe0\x92E%\x8e\xad\x9f\x1d\u007f\xe3\xd4\xc4\r\xb2\xe3\xd7\a\xef2\xb6\x9c\xb8}\x056\u007f\x14f\xf6㓞U\x9b\xf87\x1c\xbf\xc7\xdc\xcdi^\xc9\x03W\xf6m\x01\r\xb6\"\x8c\xbd\xe7\x1d~\xd7k~g\xaf\b\xcf\xe3d\x8b\"\x8bm\x88X\xfc9\xbdR\xc9$\x8dp?\xaaX\xe7\xf3\xc1\x99O\xeby\xeb\x1fW\xa0\xde\a\xfb\x9d\xe2X\u008a\x1a\xcf\xfc\u007f\x8d\x96\x8dV\xff/\xc3\xd0K\xaab\xea\xecd\xc08LƠ\u007fΫ02o\xbf\xec\xc6w\x1b\x1f/\xf0\xac\xa8a\tT\xb1\x8e}п\xfa\xce\xf7}|\x9a\x1f\xec>x &f\xf0\x89\xb9\x8a\xbe\x95\xaesW\xb2\xb9\x00w\xf9\x86\x01\xde۾\x06\xaa\xe9[\xca\xd4\xcbTn\xaf\xf91\xa6g\x1f\xec\xa0F\xb9\xdf\fֹ\xc2qs\x8e\x9e\xd0}%\xe2\xb8Dׂ\b&\xcbv\x86ةYҹcګN\xfe\x19\xde\xed\xcb\xebs\xe7\xa9|\x87\xb4=2\xf7\xc8\x1a\x03Y\xfd\xc6`ٜɨ\x1fӳ2E\xeb\x1dP\x81\xacԏ\x10K\x84\x1c\x90L\xdb\r\x955H\xf8\xcc\xe77\xb3\xc3;k\x1d#>q\xd1\x01^\t\xa5\xb1H\xb8re\x8c\xc6\xfb\xc0\xaa\xa4G\x0f\xab\x12R\xd2\x12R3\xb2<\xca\xe7\x97\x03\xea\xf2\x8b\x12\xd2\xf2ɕ\xe1\x13\x93U\x11\x85\xc5IĢR\xbf\xba\x85I\xb7\xaa\x1cRR\x9a\x1c,:\x9a\xb06\x11y8\x11\x15\xb8\x1a\xfd{\xfc\x9a\x8c\b\f\x9a\b'\xac)\v\xbap\xf8\xd4>\xab}(\x13\x1b\xdf\x10\x1f\x13\xaf6\xa6\x16\x15\x13\xd5\x10\x15+[\xfbp\xdb'\x9f\xfd\f\xfd\xcc,\xfd+\xfd\xacv^\xfb\x10\xcdTCT;͵\x19>\xfd\xcc\xc6\xe4\x91\xcf&\xd9\xc6\\\xa5͉\xb1\xd1wU\"\xc5@\xa9\xa29\x03*o\x8d\xc6wʁ\x00o\xbf[\xa1\rY\xa8J\xe3\xf4\x15\\3(\x92X~\x95\xfb\xfbr\"\xaf\x8cz\x16\x96{{\xe6\x97yy\xe7\x93=\xbd\xc8俧\xa5qZ\xb2r8]\xe9ۺ\x06\xbe\xba8\x91k\x05\xe6\xbežUMU\t\xc5\t\x95M\\\\\x9f\xd4KԵZ\xca,|o\x9e\xf3u\xd3\x14\xfb\xadpG\xeb\x8el%\xa1\xb1\x00Y\x1a\xe7\xef\xe9\xed\x8d7h\xcf%\x99\xa2\n\xddLu\xb5\x15D\x85\x8e\xb5duůW:\xd7EŤ\x97Gx\xdeִV=[x\x8d\xe4M\x89!&7\xc4\xfaT\t\x19ȫk\xe9\xc8K\x04\x95C\x96阩\xbf\xfb\xacX\xf2\xe5Ӓr\x91\xa0νF\xba\xed͂\x18\xf7\xfa쪿D:\x84UTq\xf9\xec\x94uY\x9d\xe8\xe6\xdf\x18\x88E\x153b}(\x80\x0f\xb2V\x8e\x8cǐ{\xe8a\x84=S\xf0\xcc3l,n\x9c\xe9\xc5\u007fhY:y\xb6\xa5\r\n\x9cΩ.\x8a\x88n\xff>i\xc0B\x83f\xb1\xb2\xfc\x8a\xde=\xd9Y\x1d{w^SB\xd7~\x80d\x96\xa6W=\xdf\xd1k\xdc}\xd3\xe6F٩ԛR>\x81v&\x928\x87\xc1|\xf3tc\xab\x8ceS{\x0fo˧X/\x83}.\x86\xb4.\x15\xb3\x03\xbb즁\xd6\xe2\xcaö\x9d=3\x1f\xbf(O\xafL?\xe3>4\xe9C\xf7@p\xbb\x89\x98\x89\x92A\x9b\xb9\xd7\xeaKp\x1c\xbc\xc5\xd8\xde6L.\x8c\xb8\xf3V9\xad2B9\xb0H\xa7\x12w\xfa\xcd\xf3\x10(\xd3\x0f\xaf\xefe+\x05\x97\f.lAe\xf0\\JNɟ\x96\xd0<\xfd\x9d\xa9Ԯ*\xe4\xf7cRjڳ\xf8\x88\xbdԂ\x80\xa3億{\x11A\"\xe3YYO\nt\x9cG\x12\x93\xac{Ee\xaa\xdeJ=\xc8\x18\x8c\xd7qaLb?Ö\xa1c\x9bW;ܔ\xd58\x91\x18\xe8\xee\xa0\xdfTm\xd5\xf2E\xff\v\aY\xa9\x00sU\x1e\xb6E\xc2\xf2\x81\f|\xe7w\x1d\xf5{?\x83\xe4ow]\xa7 \xc6mq\xbcT\xa5*\xfa\xcf\x1e1\xd7\xd3L\x00W\x18\xe32\xbfX\xd8/=\xee\xe8o\u07b3\xa7\x93\xd1\xf4ĭ\xbb\xd7\xdc\x1f\xdf\uea56\xd9\xf8\x94\xe6\xa2F\xf0\xa7g\xcbTC\x93\x0eL\x1a/\x1e\xd5Ռ.G\xbf\x10\x98\v\x8c:\xb8\bu\u007fș\x1c\xa0E\xaa5\x03\xf5\xa7\xa8.\x86\x82њ/\xa0\xca\xd9\xc3(\xd0V\xe1\rrc\xcf\xf1\xe5\xf0m\x1b{\x0e-ˮ\x8d\xbf\xcas\x14\xac\x89\xf8\U000d4613>\x1b\xa2\xe0\xa2\xe26A\b|x\xfc\xe7u\xc82#\xe5\xded\xea`\xb8\x0f.\x96\x98\xf4%m1@\xc9E\xd1y:0u\x9bI\xe4o?\xb2\xaf\xfaqfz\xf5\xe6ro\xcdVFZ\xed\x86\xdaʦ\v\xb9\xeet:\a\x8f\a%\x17\x89\xba\xbee)%S\n)\xa5l_N\x05J\n\x84\xc6[D\x87\xd8\xd8F\x85\xb6FE\xf6\xd7a\xaek&\xa2\xa6.&\xaa\xaeꬦ!&\xae\xaayC\xe2\xffmߨ\x14\xdb\xeb]\x8e\x8a\xad\xe7\xafW\x89E3\xfaDd\xda]\x0ev\x90\xe5\xbftSF]H\t\xf5\x02\xe3\xa5m\x1b\a\xcb'\xf6\x87\xb8;\xce\xf03\x17r{j\xdb&\xc0H\xb9}\x89\xc0\xc5q\x9a?\x8b\xc7S\xc7:\x0e\x96\x17Fs]:\xb8\xfeŬ[\x9e\xda\xd6DX\t\x8dV\xef뼺\xad\xbc\xf7\x02\xe9\xf5>\x8e+\xa2\xc8{\b\v\xff\x00[\x9b _;\xac\x85\x9f\x9f\xbd\x9d\xbf\xbf%\xf7\x05,\x94\x95-\x98\x84\x11L\xceFq\x04\xf7\f\xb0m\x99\x03eC9\xa8:?\x8f\x05\x17\xba\u007fhf\x8c\x14\xfaB<|\xbc\xebQC\x88\x1b?\xa6:\xfcB\xc4\xf7\xf3W\x18X;c:\xd3;c;\x99\x19\xce_\xfc\xe4\x9dz\x11S\xeb+\xe0_O\x9dg\x18\xb8\x1b\x1b\x9f\x1e\x9f\xa6ԙ\xa9^\xac\xce;\x1f>\xc6k۳<7\x14آp\xb1\xb4F\xd2\xe7\x98[\x96k\xaa\xe4N\xf7\xf6þ\x80TF\xa5\x9az\x15\xb0 \xb2V\xeb\x9b\xfdz\x83\x86_\xa5\x86\xf4\xa1\x95\x91>Ga\x82\xb7I\xbbPz\x8d4\xa5\x0f%\x95>'*\t\xde\td\v\x83rc\xc1\x14\x05\x89\xdc*MJF\xa3i\x0f@Ӿ\x06\xad\xf2e)\xa0Իx\xed\x82l\x00\xfef\xa6\x82,\xb4t\x8d\xa6\x9dD\x82\xb7ς\"\xcbN\xf4jR\xbe\x8d\xa2\v\x9a\x10]\xb5\xec\x19\xcd\xf5G\x95\xb9W\xf7\x19\xa7{\xab\xe2/ \xf9\x82U\xd0.\xb1]ى\xe3\xa7X\x02\x0e\xa2\xa9\x06\x02kη&x˱gVj<\xf1o1+tcX\xdc\xc3\x04\xeb\x98ƛ\xc3k\x92\x9a\xed\"\x01\x1f\xd1\xfeЉ\x17\xed\t@s\xe5\xd1a\xb9\x97\xf2\x13\xbc\x95\bV\xde\xda\x19\x8d&\x9a\x03@s\xa15\xc1[\xae`\xc7\x11y%\xad\xdc\xfb4\xf0IT\xb6\x8a0\x9c\x02.\x19\xd0\xf5\b\xa3\xff\xa4\xe6\x8b\xf8\r\rח\xbbb\xa6VtW\xdc]{\x17Q\xd2#z\x8f\xb6\xc4\xf4\xcc\xd4\xc6\b\xd6/X\x03\xae\xfc\xfb\x18P\xd72Gv\x17 7\xa6NsƞCL\af\x18\x14\x06\xb7\xa6\xce\x00\xd8\xf7\xb6\xf49\rL\r\xb0풲\xebG\xe7\x81i\xd3&\t\xa7\xb4C\xa00\u007f\xe9\x9f.O\xf8R÷b\x12\n0\x0e\x9f\xab\xc0\xa9F2\xd5>P\xf7\xd86Q\x81v\x92\xa99\x06.)\x9bȾ\x00\xe4H\xd3\n\xa1qXN&\xe6Xa\x94s\xbfcCj\x8eɒFKja\xe0\x90\x06\xc0\xa7\x80\xf1!\x9b\xc5\xef\f\xfdU\xfc\xa5\xc2\x04p\x9e8\xa7\xf4l\xd8.5\xec\xc4\r\xd8\t\U00109ae6\xc2\x04\xd4\xdfTM\x03u\xc5\xf4\x87\"\xa0퇫\xe1\x83w\x8e\u007f\xff\xbe\x03\x1dV\n\x9c\x05\xf4\x9f\x85\xb6\xd8HC\xd2W-\v\x13\xe8nל)\x88S\xfb\xb6\x9a\n\x13\x109\x05\xf7\xf2\x8eQ\x89\xa5m\xa7\xae\xa6:\f\x06\xc3'6\x1f\xa0-\xbb\xb0\xeb\xabz%8:\x13\xe5J\xd0\xdd\xfb\xef\x92\x15\xa6\x00\x14љW\x81\\:\xa4]\x85\x84\xe9\xa43\xec\xfe\xfc\xa0\x88\xd0\xe9R,\x98\xd5ڬ\x81\x88\xd3\xf2\xb3\xb5\xe5\u007f.I\xb1\xe7\xa2\U0007aacc\xd2&ۿ\x06\x91\x82\x01\xa5\x10\xd0\r9\x98\xc6\xd2\x12\t>\b8d\x06w\ueebc\xda\x1f3炏4\x01\xb1\xf9j\xa3\x06\xd8\x1eK\xd5\x05;-\b\x02(\x81b\x15\x034\xa3\x80u\xc6\xf8iS\xa0\x1e\xd2p\xb3\xb7K\xcc\xd1\x13\x8d\x064p\x92\x994g\xb6\xc1{(쵝\x1bXD\x99˴\x0f\xac4\x02dC\f\xeep\xc7%\xb9\x86\x11\x86\x16\xa1\x9b\x1e\x06;ma\a\xf3\x86[\x9c\xc6|\xb8j\xdb\f_\xc8\xea7'\xcb\xdc\xf0\x86\xbe\xf3\xbfY\xfbw\xcc\fNS\x13Na\a\xbb\x8a\xdb\xeej.\xfa0\xdf\xffi\xecı\x96.l\x97\x8b\x15\xe5|q\xb9\xa7\\3Y\xda\xc7\x04\x97\x1c\x97\x9f\x0f\x83k+\xe9\x8b+\x8e\xff\x0f\x06#\xd6\xfb\xcc\x10\x9c\xe2\r\x81\xc8p\x13\xd7h\x89\n\x9c\xa3\x15\xd0\xd85\xd9i\xc1\x9d\x0e\x8b\x1a&\xeb\x9c\x18\xcd%\x10\xf0\n\xa0\xf5WJ\x88\x0f%\x93\\U\xe3q\x95rMo\x84f̐\x8c\xf0\r\x83\a\x1aXX&\xc9ۀ\xbc\x05W\xb9\x8d\x86\xdf\x0f\xa4\x8cZu\xea{U\x91+\x81Y+\xdc\n\xdbN\xc90\x83ѓ\xa0>e'\xf1\xec\xb5^\xf5!A?\xe4a\x9f\xe99\xf4<{\v\xa0\u007f\xa0\x80w`\xab϶ඳ\xe1\x89˼-\xe9\x01x\xc16\x97Ϥ\x03\xe8\xc1\xa4\xd2\xcf\xf9`I#\xfcD`Q\x92\xbb&=\x84R\xe8\x8bB\x10\xa5]R\xa5\x99\xb9!WP(\x90\f\x112\x12\x04\xee\a\x81\x88\x8b&{\xef\x91t8\xa2\xf1\xea\xbaÃBe̪3[\xaa\x11\x85\x0e\xa18\xc4\x01R\x83\xc0\xa0)5Qn\x82\x13\xc7I\xbf\x11考Յ\x00롚\x90\f\x83ʑ\x0f\x9d\x81c\xf2\xcf\xc1\x13\xff\x98rls\xb0b<\xbb\xaca>\xc2?\xb8\x1an\xf8\x10\xe3L\x01\xcc0/\xc8f\xad\xaf\xf8\x85\x83ߪ\x99<\xa28\xb7e\xd9K\xe8\x94Rލ\x9a\u007f\x9f\x90\x01\x81:T\xda\x0e\x1agjO\xe0\x83\x9f\x8b\xa2s\xc1\xf5\x00oϩ\x14pͬ\xa1\xd1\xe5\xe4`ۿ{\"\x92b\f\x19\xbe\x8f\xafPmTh`2^\xaf7i\x88\x94\xd7+p?\x05?8\xc2>\x8e\xf0\x12\x8e\xef\xb6+\xf0Pu\x1dݿ?h\x84\xdfc(>{&ukPd\xc4&\x1d\x12h\xbaܭ&\x84\x16\xf8l\x023r\x0fڼ\xa8\xa9\xf1\xa9\a`\x1a}K\xc2@Q0LӶÂ\xa82i)\rJ\xbfwۙ\xd4+\xdcհ{p\x00}\xc7d\xe8r\v\xa1\xd90\xa8VF\x92\b{qϡ\xb2$\xee\xafv\x1dU1\xa2\x1bTС)c\xef=)ϋ\x9f\x98㰱^$\u007f\x1b\xbe\xab\x9b\xe0U\xd0\xc2\xfb\xf9\xef\xb4m>\xcb\x0e\x01\x82#1\x8a\"ز\x11m\xc4\x00AT8g\x82-\x17\xf1\x91\xc1\x12k\x86{.8+\xf6\x11?\a\xbaijW\xae\xe4%\xef\xf9J\x8d\x1f\\IEĸ\xf4\xcf0\x92\xae\xfe\xab\xe6U\xf7jX55\x9f\xe6\xeb\xfc\x98\x19\x8eEC\xbf\xc4Q\x88\xe3\xf5\x91JPf3\xb8$N'c\x15\x04 J\xaf&Y\xc6\xe8\xb2IBD\xf1\xf3V\xf3\t\xc0\xdd\x01\x94\xe4\x1bL\xfd!d\x85C|\xff\xd05M1\xacT\x06\t\xbb\x1e%(\xdaTG\u05c9\\z\x9e\xf9\x95\x9a/ƹ\x00p\xf8\xb7*\x11\xd4\x15\x1f\xe2\xa2f\x89\xac\r\x90٨\x82\x15ف\xd5P\x05G8V%\xf5̛\xf1*\x89\x9a6\u061d\\9\x96\xa9\xf26\xc5N\xa8\xad\x90\xfa'8<\x00\x06-{\xebn\xb7\xb6t\xa9\xe4\xe0B\xaaׂ\xe6*\x18\xad P\xce\xd6!\x94#'\x91\xc7\xc4k\x8b\xfd\x8a\x9c\xba\xe14\xde\x19\xb5f\xed\x84\xc4\x16\x1d\x84n\x91o\x91\xd3a\x88V\xa9\xe9\x979\x1c\xadHMX\x17\xccaS\x9b\x14;7\xaa\xd4\xedg\x84 \xac\xa3+\x91\x0e4\xf97+ۥ63^`\xb9\xcab\xd6\x1d\x138\xabLx\x85c8\x184H\x12\xa4$\x19Z\x94E\x1b=1\x87\xde\xfc\x8e:\xc1\xcf\xe58\x96\xae\xb1K\x81\xebb&\xc3\xe8PD\x16\xac\x800eS\xdb>l\x8a߹\x84_9\x84\xec\x8c8\xfcx\xe3:\xc3EX!A7\x84\x99v\xdc\u007fa\xc78Q\xe9\xbc%0|:\xf6\x94B\xf0m\xe6m\x8d\xdd>OؾT\x8e\xfeU\n4W\xee\xdf\x01s\x124\xeb&\v+m\x9d\x16Ω\x98{\xfc87\xbc\x1fo\xe1\x9aA\x02O\x13G0\xe8\ue643\xaf\x0f\x12\xc0\xac\x04\xf5\xb2xf\x92\xbdh\x00$\r\x80k\xab\xe7\xc1\x92\x1a\x06\r\xf4\x8a\xf6\xb6\x0e8e\xe3\xfc\x9d\x1as\xb8\a!\x82py\x0f\xf5\xa0\xf6\xf6\xf1\a\x9e\x98\\\xa8\xcc\xe6\x96\xfb\x02\x89\x19t\xa99w6<\xf2\xab\x89\xdd\xcdJ\xb7\xa5:\xb0\x9d\b'\xfaۖ\xff+\xc3Ș\xad\xbd\u007fc\xc9p\xab\u007fw\"\xb4\xd0K\xbb9\xdc\xfdF+x&<#\x1b\xfc\xe2\xa6z7\x8e\xfa,߄S\xed\xa4\x9a\x1bj\xd94\xa5\xd3C\xb6\xd5\xc8ra\xe0_\x02\xd9\xc4G\xbb\xb2\x8d\xb7\xcal\x92\xa9h7\x94l\xbb\x98\xba\xb2\xe6 ٸ\xf5#otdpLu\x8a\x85U\x98j\xb5\xec>\xc6]C\a\x11\x1d\xc9#aP\x83u\x17|\xa4\xc5\xdf\xf6\xbe\x0f\xf0\xf8\xcdغ\x88fI\xdc#\xf9$\xd4°\xac5\xa3\xdc\xd3:xa\x0e\xab֓U\x93\xa7\xddkĨ\xeb\x1c\x96B\\P\x86\x82R\xfd\xf7\xb7\x1dU\xcax\x8dM\x14b\xd0+\xe6\x9c~\xd5@⫧B\xd6\xf3 \x1e7.\x89R\x02r\x89E\xe6ŝ'\x8bT\x01\x8bJ\n\xb3\xacٖlF\x87\xc9\u007f\xbbQ\xadO\aKW\xf5\xe8>İ\aE8;\x11\va0.\x88t$\xd4\x18 \x86֛\x83B\x15B\xd7)N\xb2\xcd9\xfa\xf8\x0e\x96\x9fO\x96\x15\x91\xd3I^h<^﷽\xdc\u007frՄ\xf8P\\2\xf1\xba\x9dt7\x9b\xfa\xc16r㩽\xa7\x04\x01\x83\xee*\np\x84\xd2LN\nAR6\x9aQ\a\x99\xd9\x05\x05\x12y\x92\xbe\xe1~\v\x99\xbe\x15ŭ\xfb\xf9\x82{Q\xd9\xf29\xc1ř\x1dM\xbd\xf9D\x1e?h\xb29\xb1\x17\xd5z^PO\xb1p\xe7\x95[\xaaF\xbfI\xb7\x15\xa1\x87\xdf/x\xa2d\xb9\xa5\xd7\x1d9V\xaf\x9aȻ<\xc8\xe1\x8b-\xc19\x87h\x89J\xferD\\@Nb\xf7q\xc4b\n\xbdc\xb5w\xfb\xadr\x8eT\x91\x98\xa5\x933@Y\n\xf1R\xfd\xaa\xc7Wr'\xd6\x03Q0:\x98P\xb5\xb7\x10A۰\x8f*O\xfd$\x18\xaa\xf2\xacyi\x9cgi\"\xce\x13\xee%Q\xe0!\xf8c@FB\xd2\xc5\x18\xeb[I,\\ֳ\xacx\xe8\xc4\xed:&\xf1\xb2\xcd\x18F\x91\x9e'}\bJ\xab\xfe\xfe\xa5]PVa\xe8\xb0}zTX1\"\xc8X-\xa0As!\xf3~\x0f\xbeg:\x8f\xeeB\x10\x8c)\xfa\xde\b\x0e\xee@c\xfbT\r\x95`9\xc5\xc2E\\\xc0\xa2\xc5Z탛g\xd3\x03\"\xf5N\xf1l\x84\x93ROȧ뻾TɮA\xdc=÷j\xc0E\xd7\\o\xbc\x8d\x14\xfe\x01\xde\x15@u\xf2\xa7\xff\xc4)\f\xef\xfa\xf5\x1f\x19\xfc'\uf7cd.:\x04\x03V\xfc#\xfa߾\x80\xf9\xb5K6\x00V<\xea?\xbc\u007fu\xbb诲\xef\xfdI\xcf\xe2\xba\xe4\xd5\u007f럵\xadNM#!\x8e7\x84\x8f8\xfe\xd36^\xe3\an\xe5ƣ\rJi\xb3\bv\x82\xf3#\x9dA\xe5\xbbФ\xc06^r\xbb\x1e4\xd7\n\x06l\x81v\xd0\x1eJ\xc12\x98\f\xf5a\xe0\x8f\xedZ\xefI\xad\x0e\xd7\a':\xc3U\xc9\x10&\xb5\xcfpg.\x82\xf7$\xc3\xf9\xf1\v\xca$E\xf8\xa4\fed\t\xe0\xfb!\xa6`QS7J\x13\xa2ox\x93\x9a\x106`01\xfb\rc\xd5\x14/lbS\x96_\xda?^\xf3\x18a4\xa6\x11\x9bDɚ\xcep~~\x0e\xc5\t\x81\xecX\xe6\xd4\xf8\x83y\xbbD~\xd7q\r/\xc6\xdc/Q\xe9\x15\x10\xed\x9a˲\xf6\xfd0\xb1\xb2\x86(\xb6#\x89\xc3PĮ͠`\xbe\x99\xe3\xf0\x94U\x1fȮ\xe3\x1a\x19\x1cr\xed\a*\xe6p2\x877\xb7\x9a\xcb\xc6gG\x16\x87\xd6C\x90\xef\xc3Vb\x1eW\x10\xfb>\xfc387\xfb7\xae\xf79\xb8\x85e\xe9.\xc7*\xf5\x89v`\xcc\x14$i\xd1*\u05f9\xc5h^\xc8\xfb\xe2-\x81J\xe8\xfbN\x9d7\xfd\x01W@\xa1\x00\x00"), } file7 := &embedded.EmbeddedFile{ Filename: "912ec66d7572ff821749319396470bde.svg", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969055, 0), Content: string("\n\n\n\nCreated by FontForge 20120731 at Mon Oct 24 17:37:40 2016\n By ,,,\nCopyright Dave Gandy 2016. All rights reserved.\n\n\n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n"), } file8 := &embedded.EmbeddedFile{ Filename: "9f916e330c478bbfa2a0dd6614042046.eot", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969055, 0), Content: string("c?\x00\x00\x99>\x00\x00\x02\x00\x02\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x90\x01\x00\x00\x00\x00LP\xff\n\x00\xe0\u007f!\x00P!\x00\x00\x00\x00\x00\x00\x00\x9f\x01\x00 \x00\x00\x00\x00\xaeQ\x1b0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f\x00R\x00o\x00b\x00o\x00t\x00o\x00\x00\x00\x0e\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00\x00,\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x002\x00.\x000\x000\x001\x001\x000\x001\x00;\x00 \x002\x000\x001\x004\x00\x00\x00\f\x00R\x00o\x00b\x00o\x00t\x00o\x00\x00\x00\x00\x00BSGP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00`d\x00/\x1c\x00/\xdc\x00\"2\x12\xcd\xe9\x8a\xc8c\xdaW\th1\xb97\xb88\x91\x12\x9d2\x16+\x96\x17sǷ\xa7\xe1\xc1n\x8d\x01\"\v\x16$@6\xa4\x95\xa7Y\xb0\x95G`^4\xb6\"G\xbb\xa9\xa2\xe3\xa6#&\xd7\x1fpJ\x8fl43\xe7o\x8e/i\xbb\x1fH\xb2I1>|6<\xa7\x9d\xb1\x8ey\xe2\b\xe3]\xd9\x1f\x1e~\x91\xad\xc58\xe7\xb4\xeb\x14\xe5\xfa\tU\x04wI\xba\xb8`Ԕᬀ\xb6\xb4\xea\r\v\xb2\x18\xf7J\x91\xe14X\xa3uβ\xb3\xbf2\xaeQ\xa0am\"ֱH\x14\x19\xb4\xd8d\xed\x8ce\x10H\xb7'_\x9b*\xf1v\x90\xb8\xf9\xe3;\xa6~\x9fyV\xa3ƌ>\x99\x97\xb2\x00\x01N̫'m\x0f\"\x9aM\xcbw\xc2\x1f\xef\xc2\xf8( o\xf0\x95\x03s\x8f\x10nr\xac\v\xce(\x82\xd8ʖ\xc2XŽ\xa87\x81Am\av\x00jIPGG\xa7\xe8\xbc\xda<\xb0\x1a\xef\x94X\x97Õ\x9a\x1b\xeb{\x81\x94\x9f\v\x10\x0fׂ\xe4Γ߆=\xa6\xae\xb9\xc3\t9s\x18\xe06/\xbc=2\x8c\xef\xa2\xee\x11\xac\xdf\xc9#\x80π\x89,r\xf5o:\xbf\xb8\x02\"\x8c,\a\xd7s\x9bd\x92Bp\x86\xef\xb0T(\xb0G\x17\x18\x80\x9e`-\xb5\xb0\x1b\x18M\x83[\x02E\x8e`\xda\xda\xd1P\xdcuX\x8bNS\xf95\x85\x19`\xdd\x18FX\xd1є$\xc2\xee\xeav\x02\x1f\xa1\xbe>\x1a\x1d T\xd8\x0f \xb1\x8dP\bq\x1e\xc4>{\x90\xf7Df!\xcfM!\xcd\x1c!\xa6\x80\x98\x8cޜ\f=\xb0\x04\xbc\xb1\xe5\xac\a\xb4\x89\xcc\x1a\xec\xc1F\xbc5\x92ږֽ\xa5\xed\x9dh\xebgh1\x88֏|r\xe7.=y\xf3Ϙ|\xd3\xde\x14\xec\x87\"\x1c\xeeZ\xe5\xe9ax\xed\xb0̸P\xa9\xf8\u007f\a\xb2\xfd\xe7w\xae\x1a\x05\xfb\x1d@TƸZAf\xa44\x99\x1a]\x8a\x9b\x83\x8a/\xb4\xc1/\xe9\"`i\xf3.\x9a\xc0\xace\b\x9e\x17(\xacU]\xc0\a!\xa7\x1b\xf9\v3\x9dT|\xab/U\xa7\x13\x8cDL\xcfW2ar\xb6\x9f\x88\"/m\uee93H\x05'W\x8b1@\xbe\x15\x92\xe0#\xe3\xf2J\xb0\xa1\x86*}.\xcbk\x01\x97\xfcdd\xea\xe3}]\xd1&W\\\xb1ܺF\x17\xd5\xf2\xf6\xbcC\xae\xcb\xfc!\xc3\xfc\x80\x99\xa6\xa1\x96\xc64iEfߴv\xf5H\x89]\x9a\x1az\x1d\xe1\xa2\xd0'b\x14\x17aCa~\xcf0\xf4\xc4\x14\xd5ir\xff\vv\xbe\xbfп\xedh\xd1:d\xf4\xfdt\xcbEhH\xc1\xd7<\x1d^{\x9cL\x88\xc5\xd7Ҥ\n\xfaA\x16\x90\xc3ܣ(\xb2\x8e\rs^\x15\xa2\xe02\xdcU\x83\x91c\xad\xac\xc1l\xcb٢M\x10T\x1a\xd9\xed\x12sE\xae`\xf91P\x90\x89 \xef\x11h\x9c\xe2\v\xb3\xbff\b\x8b7\x95\xa5.\x1fؑR\xeblb,b\xc0\xa4\\\x85\xd1\x06\\\xc0i\xc8#\x04\x11\x90\x8a\x0f \xdf\x1b\xe3`\xe9\xe1\xd7÷\x97~_\xf8\xfa\xf1\xf7\x83\xf2\xc7\xed\x89*\x16\xbe\xd6>\xf6.\xec@P¢\xc6\xe6p\xc0,28\x8cq\aa\xe9\xaa\xdbPM^v\x1e;\x9e'q\xbe1\xa0\xf3\x18\xa6?\x9c&u2\x89c}d\x1fg\xf5\x9f\xb61\xc9\x02d\"R\x98\xd2\x02Ȭ\x91\xd9$\xb3\x87,\x9dHȡ\xf0\xa4mH━C\xb9N\xf5\x00\bQ!\x04\xbal\x89\xfd-\xd9\xef\xb3c\xa2M\xe2+\x10\x84O\nAۚ\x1b\xae-g)\xa1\x81M\x01\xe0a@ʙJr(\x1dS1L\xd43\x90Q#\x12\xba\xf8w\xa3 \x02E1\x002\x00\x84\x1aZRrZ@[(\"RA\xdb\x06\xccQ\x18\xb23\xc4c\x11\x8eC\x18\x8c\x92o=\xe0\xb4>B\x8a馵\x93\xddS\x95\xf1\xb5He\x13X\rp#\xc7ێnt\x94/J\xee\ny\"\xdb-\x12\x85\\Qo\xab\x1a\xa3\x15\xbc\xa5ޜ=c\xbc\x06)\x19\xde\xe2\xba#\x82\xa2\a2^\xd7Rtԓ\xe4\v\xf1\xa8)\xe6\xa2@ۙ\x1d\xb5m;\x1e`\x92\x8aP\x8a(r7\xad\xb2\xbf\x03\x0e\n\u007f\xa0\xd4\xebhwK\x96A\xfaՒ\x1eh\xfe\x8b\x1d\x80\x81h\x12C϶\xe5\x06\x15\x9d\xa4\xb4U0\xa0\xe9+)5\x16\xbeE*24\xb5\xfc\x84LVBx\xe0\xcaP\xd0H%ڑ%\xc9\xe2\xbb\b\xb5\xdex\xf9(!\xb9Qs\xc2\\\xc8^\x8a\x97\xee\fZ^\xc6\x10\xd4^\xb8\x95,\x92\xabp\xec\xdf\x02\x9f>\xb3\xbcI\xf6\xccC9f\v\x9aI\t\x17\x03kH\xc5\b`\x10\xee\x13&\x1a\xe0,\xa8\x032\x13$\x04\x8f\xed#\x8c\x96\x1a\x147\x975\xe2\x8e\x04\xde\xee\x861\x03\xb4\x9aN\xacp\\\xc8\\\x9b\x95Lf\x91uE\xfd\u05cb!\xcaE\x00\f\xeeڸ\fH\xc2?\xb4\xe1\x97\x00\xd0\x06n]\xccj\x83\x01\x88\nvM4\xafB\x03u\xbe\x05\x9dNT\xb8%/0\xe6cZ!\x95Z\xc6\x1c\xd1\xdbq\xc1\xa9\\\x87\x8c\xf4\\\xfaZU\xdf\x0f\x84\xc88\x98\x1e\xddC%>\xab,\x0e\x03B\x03\xe9\xd0\x1cF\xdau:\x1f$\xe9ʃA\x92\xcdv\xc1\xc0\x8a\x12\b,\vk>j+\xe8+\x86\xb1)\xa2\xa5ߵO\xe1;\x8f\xc9\xd5\xf1\xa8 \xaf \x8c\x02\xd4|\x8dz\u007fj\x00\x85^\x86\xbb=\xf5\x89\xeb\\\xe4:\xc8-\v\x96\v\vٺ\xabΤHCGIr\xa2w\x96M\xeaX\f;\x94g\x8cg\xd3C#\xe9\xa4M\xca1\xb4E嫌\xady\x94e>\xc5\xd1@\fL\xcb\xcc\xfflww\xd9\xfa\x89\x94z\x03iTi@6x\xeff\xf21\x10\xef^B\xb6\xecG\xfeًb\xaam\x9b\xe54\x8d\xd4ͦ\x8e\xdbS\x05i\x15\x8a\xc3\x12\xa1ZO\fw?B\xc2\xf4\x8e\xbcc\xa8\xb1y\x8e>\xf9SL\xa6\xc3\xdcw\xad3\xb9N?\xd3\x1c\xa7\x14P\xdc\xd5R\xefWN\x94\xc3aq\xa5\xa7\x19H\xe6]N\u007f\xa4̟\x87i\x0eO\x85U6'\xda\xea\x80;ݶ\x11\xde\x05\xb0\xae\xe2M\xb4\xff;\x8d2<\xefm\xb2<-l\x8f_\xca\x12\xd5Y\x16\xde\xebF@\xf9ΝlĂ\x8a\x9cIBtL\xef\xe3m\xe0\xbeOL\xd5\x1cG>\x9a\xee\x1c\xfb\xa5!(\x98\xdd0-\xba\x88\f\x93\xa7\x849\xd3\xc3r+n\xa1\xbb\xebn\xb6:h`iGƆ\x16\xebz\xbf+)]\xd2\xca\xe4\xe6匔\xa7̲=\xb3pB\u00811K\x02`\xde´,\xbfϏ\xa6]\xf5-\xa53MZ\x1dL\xaf:\"\xe0$Z\xa9o\r\xfa\xfa\xe8\x1e\xd2\n\xf4E\x05\xb8zA\x16\x9c\a\x91(\x1b\x90<(#\xc3\xc0K\xdaT\xce\xfd+\xe5\xfaVK\xe2W\xb5\xe2WG\x92VM\xf6\"Q\xa5\x13\xf3\xa8\x05f@\xf7}\xa2s\xee(\xfffh\x99\x01\xde\x1c\x89N\xb0\xe0\xc4gx0T\xfc\u0083U\xe1M&!A\v\x80P;\xe9P\xc1\xa4ju\x0392\x83\fINR\xf5 \x1c\xa6\xbc=\xd1 q\x1a\x84?\x1a\x9dpa\x92\x8d\x95\xa3\xcf\xe3\xb8\xc6\x03\xd8\xc6\x1f\xe9\x88\az\xc0\x03\x9d\x10\x86p\x02\xa60\x19\xf2\xf0\v\x88\xbe\x12\x1a\xea)\xc0\xa8\xf5\x06\x9f\xc2\no\xc7\x03j\x96n\x13\xa0\xe6\x17R\v\x16*,\x81'c\xa3\x04\xe0f\x82w!\x9eOޒ\xb6]m\xbeQ\vZ\xb4Nf\r؈-L\xe3T\xf3\xbaH\x14\x1b\xacc)\xacD;kJ%\x11\xcd\u05ed\xc9\xe5s&E\x80\x91\x00\xc2D\x99\x8al\x8e\xf3\xb9\xb5('.\x9f\xc1\t\xc8P<\xe533\xb7\x0e\xb4J~5\x06\xb4h\x13`\xd2%\x88\b\xe5)\x00WE\xf7^\xc4\x15\"\xdc\xeez\x86q\xea\xacu\xa9czB\xb8\x8ceN\x93:\xf7L˞jD\x04(cR\x18\x11\xf5\xd25\x19\x82c+\x1aU\x8e\b \x9dq0~X\xec\xccʮ\x934\x95]\x966K\x90\xf4\xd3\xe3ֆ͘@\xd1\xd3G\x8f\xb2m3\xbc4\xf1A\xb0\x00l\x8d-dڙ\xab\bA\xbc\xa7\x8c5xٳ\x12\x10n\x95\xe0\\\xf3\v\x9bJ1\xba@\xf2\xdb!+\xea\x04\xed I3f\xa6><3\x85IZXV3o4\x98\x03\xbb\x1d\xe1\x9cu\x8dp58י\xa3\x9ax\xda\xdc\x12\\\xb7\r\x1e\x17_\xcaUL\x85m\n\xfe\xde\xe5Jȁ\x10\x11\xac\xedQ\xcab\x11\x02\x9c\xcdvQ\x04\xdb_'\xecU8\x94\xf6\xf0ftg\xa3\t\xd1\xd1\x05\xf3dl\xec\x01\xc4s\xcf\r\t\xd0=)y\x14\xaa\xdbS\xa3\n\x85\xd8M\xb3r\x1f\xe9\xe4LsE\xe8\xc9Q\x93 R\xfc\xe5G+#\xaf\x95wJ)\x84\xe4ȱ\x9ev>̼̹^\xe5u\x8a\xbf+0h\xf8kᇫ\xfc\xaa\x15^\xfa\xb0ʾz\xddX\xb2\xb0\xaa\xa7u\u007fպV\xf9P\rI\x92\x88u\x10j~T|\xa0\x03c\x83\x10\xe1 \xf4AOC\xa11C\u0603\xe9\x0e\xe3=\x1c\xf2'B&2!r\"\xc2K\x81&1/D\x89\xe2|W\x04/\xd9q\x1d\xe10\xb0\xebaVlM]\xd2\x11\xc8\xc8H\x92\x86\x0f\xe9\xcd8\xa5\xb9\x82\"2fS\x98&\xe1\x8a`\xbc\xa1\xb8,\xff,Ib\x04V3\xd4O\x12\x01\xbcg\xb4O)\x03r.^\x17\x90\"\x91p\xa1\x17\x04\b\xb8\xb5\x9e܁(\x17\x93\xb7 B\xe2\xc1\x1br\x04\xdb8\xc4ۯ v\x10\r\"\xbe+)DXV\xdb\x1b\xdd\x00$\x93Td\\<\x85\b\x1f\xaa\xa8y\xa1\xea\xdb~>\xd7f\xac%Fk\xbe\x11\xd8}\xd1\a\xe1\x89B\xe3h\xdeb_\x81k\xba\xa3,\xa4j?\x00\xb3\xdblϴ\x05jD\x80\x92V\xb5_?\xb7\x123\x98~\x96\x00\v!\"+\xd6\b\xbb\xc5\xecR\xeb\xcae\xcd{71ڏ\xed\xdd\xf5\xc1\x90\v\xe2\xee\xac\x0e\xa9C\xea\xb9uw)ء\xf2\x97\x0eG`\xbdQ\x89\xe6\x01\x98\a\xc1g\t\xcf́9\xe6aE陷'F\xc0\x18:\xa2\x8cӲ^Ɨ\xbe\xff\xe4k\x14\xa6Dś\xdd\xd4\xe1\xb1\x19_\u007f\x9d`\xe3\u007f\xfb\xad\xcf\x18Fz\xe7pyq)\xcdI\xba\xc59\x9a\xa7\x1f\xd50&Y\x9c$\xfdue\x98\x8b\xa2\xdb\xef\xcf\x1c\xb0\x04T\xa9\xecw\x8cj\x97\x00\x01\xa2.ɀO\x8c\x9f\xd2mX\xab!;\x15\x98\xeacW\xfaި.5\xd0\xf9\xe9\xb2\xbe\x01T\x11tS\x16\x97\xd6$\xb66r\u007f;`O\xfeU0G\xeaͲ\x00u\x8c\xc0t\f\x01\xf0\xf1\x97F9oʵ\x9e\xf5Ē\xa0\x93g\xf6\xf8\xb0\x1b\xacQ\x87\xf5\xd2\xf1!5\xa3\xdb\n\xf20\x9eU\xe5Ҕ\xbfV\x06!\xf1\xc0\xe8\xd1r\xbb\xce7\x03\x83\xb0\xa0=\xb2\x91(\xc8\x1e\xd3\xc4\x05\x14o\xe9\xdc\tM\xfbL\xdc\x1dZL\xed\xadO}\xb0-s\x9c\xab塷j\xb8\x1f@\x12\xa5\xd20\xb9P\xafɥ֊\xa1\xd2a\"\xc1\x00{!\x91,Sl\xf3\x1e\x1c\xea\xc3f\x89\xdc\v(A\xb0\x80\ar\xef\x18\xe2\x91\x04\xf0I\xd0y\"\xcc%}\xc1dbv\xa1\xdd.\x99\x88\b\x13B\xc0\b'\xa1\xd3\xee,\xb0{\x8d#\xe3\x9e\xd5i\xa4ݢq|G\x01\x17\xd0\xe2B\xa5ߒ+Z\xf0\xd23\n\xd1\x12\x82\xbb\x9f\xd6.\xd7LK\xce\xc1\x02 \xb7ZAu\xdb\xdf\x180\n=\x90\xb6\xa4v`{\xe5Jps\xc8\xec\x95\x18P\xa3\xf9\xb3\xcc\x04\x8a\x00\xd1sW^b\xe5ȱ\xc8<\xcfzf\x8a_^\xe2\xd1\xe3|\xe85=\xbaDb\x1d& D\x06#\x12a=1\u008e\x18\x10\xd5\n\xc8\xe0\xc5Ǡ\xf3\xc6l9\x11\xa8\xfd2\xb4\x04\x8b\x94\x11\xf5,\xef\x8f/8,2,\xc7Cp6\x96,\x05\b{\xc8\x06\x96e\x9cU\xebX\x93\xc8\xd20d\x1f\xab^lm\xbbc\xba\xe2V\x1b\x12f,\xcd\x06\xc7\xc6\x11bk\x9d\u007fg\x99;>\xe0S!\x978\x95\xe0+\x9e2\xbf\xbb\xb6\xe8\x86謘\"I:\xb8З#\xb5\xb0\xbeix\xe9\xaf\u007fC,8\xaaI\xdb\xd7G\xc9~\xf81\x82\xd1\xe0\x12\v\xc2\xe6\r?@\x8b\xf4\x82l9\x06B芆\x80\xbdG\x11c\x1c\xdc$\f\x10\x80+\x9dc\x04\x95_\x89\xa3|\xf1\n\xcc\xd0\x10\xa3\x1a\xc0.\xb0\n\x1b\x18\xf3\xdc`\xe9`\xf1\x19]4\x9e\xb6\xa5\x12\xac0,Aq\u007f)\xdc\xc1M9nx\x8c4Z\xc1\xda\x1d\xd1\xc6\x1b?%m\xd8\x1a\xf7\xaa~\fL(X\x8e\b.\xa1\x8cwx\xd1:A\vx\xbb\xa3\x1c\xba\x9a\x8c\x80\xf5\x82\x82l\x8fb\xc0\xed\xa0\xd2eX\x90\x91\x81z@؉[\xfe\x88\x8a\x840\x92\b\x01\xb7h\xde\x1e\xe4V\x16\xf5\xa4\x00\xc4\x17.`|Ι<95JH\xbdE\x9a\x8c˫;3\xf0T\x94\xfa\x80O\xca@\xf4\xa9\x10a\x10\xab\x06-BP\x11\x95\bH2%\xaad近\xa7\xc5\xea\xa4\xd1!\x950(\x1aW\x80\xd4\f`\xcc\xd0>)GL*\x9f\x0f7\xfey\xe8\x82M\xd4\vd\xfcF\xfe\xc3Q\xe5x\xdd\xefJ\xbf\xc0\xa3/\xb8\t\xd4\xe3\xe3xZ.fgА\xe1-\t\xe9\t\x04\xac\xbc\x9b\x824]\x81\xceIJ\x16ޤ\x1a\x89\x86E;p\xcaR\xb4@>\x97*\x10E\xc0\x0f]\\\xa7\x0eT\x10a\xa59b\x8c\xc11\xba\xb6\x04K\xa2\xee\xa6Ӑ3\x9f\x87\xe0\xf8&Z+\x02\v%b\x18\a\f\xc55\t\x84b\v\x80\a\x85\xbd\u007f\x02<[\xfeѢ\xe1 ԡ\xebUɕQCGxL\xf9Y\x17\xa2\xedݡ\xcf^\xfe\xadVTI\xc1+{a\x99\xb0\b_;\x10\x81*\xdf\xfd0v\xd1\x184\x18\xd9\xe9+\xc3\xde\f6\xac\x9e6\xae\xaa\x89\xb6v\xba)\x89=8\x94\x06\xa7P\a\x06\x9f\x19\xad\xb1e3N\x95)ӦZ\x8c'\xaa\xf9c{0\x19ɝ\xfa\x92\fM\xfb\xdc\xf5\x92h\xa9\x10\x17\xc9:`d\x12E\x05\xc1k{\xe18\xf9;\xed\xd4|x\x86\tQ\x9cZ\xc5\xe3\xed\x0e\a\xb9\x1c\xb3R\xd2\xe8\x93ɠ\xedg\x06j\xcfd\x81\xfa\xb8=~\x90y`\xd6\x13 &\x03LA\xf79\x04\xaamݢ\x1e'\xc8GU\xdey\x87A\x1evT\xee\xac \xb8\xde\\\x19 \x81\x89\xd2\xf6\x04!\x90x=\xccb\a<݈z\xcd\xce\xf5W\x00t\xe6\xde\x06\x88\x03\\\x06\x15$\x8a~\xa7\xdd=\xc6\xdf1\xa1\xa0\x94\x1b\xc6L\xc9\xea\\D\xbd\x04\xb5\xcbI\x00\xcc*Ҋ\xeb]\xdf\x04P\\w\x98K\xd3W\xb9\xfa\xe5\x81e\xe3\xd1\xe9\x9e['\x0f98\xa7\x9f\x90\x12[t\xac\x86\x03\xce\xc0o\x06H wb|\fC\xf6.Ѫ^\x96];Dpd:(\xf4\xdd\"\xcc\xcb\xe2ɵcA\x0f\xf7\xd2\x12\xf6X\x90\x99\x95C\x11\b\xef\xe1\xa7d\aQY\xbe\xd1\xef\x8d\x18\xc1\f܆I\xfa\x01E\xa0>\xe2ם\xad\xb5\xd5\xe0\xf4\xben\x82\xc1\xe1zI\x83\x83\x89\x93r\xe8\xfd\xad\xe7N\xe0\xeado\x83\x01\xd2u\xc4\xd1\xcb\xcf\xff\xed\xe07%\xab\xd0\xc9\x14\x15\xbc%\xf3\xb0\be˵\xbb\v+{\x10M\x82]\xb5\xd5\f\xf8/\xcdK\x1e\x1c\xfdY\x10\x14MC\xa2\xb2\x801\x93\xea\x11\xaf \"`\x1d\xd1D\x86\xebS\xd0Qm\xa9S\x85\xf0\x99֚\x00\x96\xedN\xb0\x15\x19\x99Π\xf2\x9a\x1d\x93Ӣ\x8cA\xeb\xfa@Lɣl\xe9\x1c\x82\xfb9\xe0\x0e\xb2n\bW\x96\xef$\x16DC\xe7F\x9f^\x848\"\xca\aC\x13\xbf3\xa3\r\x86\xb0K\x15 \x8f32\xb3)I\x93̛\x90J\x8cap\xe2/\x90o\xe4o\x91U\xd9E\x80b\x8c\x00y\x0e\x87\x01\x85\x8bPT\xf8\x98\xbc\xfb\xa4\x87M\x1fb\xea\xb0\xe0\x87`v\x99D)'\xa4\x9b\xa8\x10\x90\xff\ne\x83\t\xaed\xb0\x96\xb0\xfc ֍-SY\f\xb9\xe3VI\x8f\x9c\x1e%`\x10\x98\xa6\x01\xbc&0\x890\x1b\xb0\x87\x833\x96\xe6\xc3\x196\xab\xa7\x12\xe7\xa7⛛\x8b\xdd{@\x04\xa2\x03\x9bd\xebت\x11\x18\x12\x84ūb\x13)Y@\xb5/\x13\xb2\x02ٹ\x10-c\xcd\xd8\x11=\xa6j\xedf\x84 \xb2Ѣ@\xd2\x02(G^B\x1eg\xf6\xa9\x97\x8e,\x85D\x91\x92\xd6u=-\x87\xf9\x18\xf9\xfa\xb5\xc4隠8\xb5\xed\x18W\xcb֣ \x13\x13\x04\xab\xfeDT\tg@N\x85&\x13\x06\xbe\xa0\v\x8be\xb6\xc9\xc5S\x00\x86\xac\xa6\x89X\xfc\xebV\n\x86\xfe\xcf\xc7\xc3K\xb5\\\xf5\xe8\x15\x90\x8e\xc5(M\xa8\xb2\x9d}\xa6u\xfb&\xf2\x8b\xf5\x86\xcen\x8c\xe4\xe52\xa8$N\xbd\xcdn`\xb2\xaf\xf2\xc7\xd8\xe4\x92! \xd4w\xa1\xec:\x86\x88\b\x93\x93\x89\xfa\x02\x93ڃH\xb8\r\f\x02\xf2\xb9\xb2\x12\xa6\xac\ue0dd!\x84\\u;`d\xed\xb0\xd8\tQ>\xc8/\xc4\b\xcf\xee卦\xc6\xc6\x1d\x9bP\xf8z\xe1J%\xee\b;\x11\xa4yc\x88\xa4&\x1b\xa9y\xa8\xf0\x18:\x0f\x16\xf0e9.\xb8\a\x05c\x161M\x86\xa8\x98\xa2\x1bR#\x9a\xe1^\xdbK\xd0#\xab7A\xfa\x929\xb7o\x05\x8e\x00\xfb74\xd0\x05\x9be'&\f|\u007f[\x93\x87\x1cx\xc0\xee}\x18\xcdf\x8beUk\xa8)\xeb\x10\xbbf\x9e\x8d-\x00)E\xccm\x96\f\xdcy\x9cR^\x1f>\xcf5W\x8dř'H\xaaӃ\x1f'\r\x1c\x94\xba\xc3F\x04\xe3Q.\xec\x18\xe8\xacW\x88\xcb\xe4:\xfb7HeX\xa4\x1b\x1eg\x9b\xb0\x0eD\xa5\xe4\xb4\xc7-\xe7͆.#v\xd0d\xb7\"\x11q\xf4C\xdb\x141\x92\x8a\xea2\xad؎\x9c\x1dX\x8c\xc0\xc4\xdbX\xe8\tDU\xa3\x99A+\x14\f\v\xff\xea\x1e\x98\xf2'T\xcb\x13\xf1F\x1a[\x9fM\fm\x8e\xa3\xaeW7\xedA\xf6\xd6\xcb:\xc1\x0eC\xc4\xe1>\xd0~w1R7\xa3\xe0\xea\xe3\xb8ƈɉ$\x8c=zQ\x82\xa6\x95\xb0\xd3E\x95H\xf3E\xcbJ^2Xo\x19\x8b\x17\xf5u(#\x9d\x99\x0e\r\xad\xf2n\x9b\xbb\x10\xfa\x93\xafx\xf1\xdc\n\x019G\x80ť\x99\x17p\xa5\xf4°Y,\xccL\xf4\xc1q\x82'\x02S\x1d\x19\x05w\x8e\x03\xd5\xc1\xf8K\xbeL\x10J'\xa5L\xe8\b\x93\xa9tj\xc0\xa2C;b\x06o.\xda\x02YN\xb2'\xd1\n&O%l\xb3[4#\xeb\xc1\x9a\xb7\xf1\xd8|F?N\a\xbb\xd4\xc1\bk2\xcd\xf8\x02\xb1\x8c\xcbt\xd0\x00,\xed\xe4?=RR\xa7\xf9\x92n=\xb2\xad\xa5Xܿ\xbd\xb9\f\xd4\xd1+\x02\xaf\x8c\xba'_\xa9\xb1\\\xbagD\x12፺\xf93R?g\x1e\x95LC;&g\xb3\x9bd\xaaĤ\xd3\xeaC\x8c\x8d~z\xf5 \xa5\xe5'T\xc9dW}-[\xbcB\n\xcco%\x96\"k\u007fW\xc8IFtS\xc0\x91\x11p\x11\x82\x81z\xe0\x81\x9fl\xea\xe9\xef\x82\xe2ʪ!\u007f\x8a\xbdmK=\xcdenf\xcb\xc2z}\x92\x85\x95f\xeb\x19f\xa7\xf4q\xa2J\x06*\x12bm\x0f3\x032\x04\x9a\x05\x82B\xde\xfa\x13\xa5P \x04\x8e0\xfb\xa3\xbah\x8d\x80\x91\r\xbc\x95%@\x04X\x962@\xac:\xcd\xd2\x1d\xa4\xbc\xb7j\bG\xb3)\x9fi\xcb\xc0\x9cA\x80\xa6bb\x1c\x00)\x82j[]ubj`\xcdjE:o|\xa5vI\x1dm:<\\\x85\x01]\x98\x99\x10:\xd6=c\x11\xabi\x8e\xba\x8e^a\xe2\xfc\xa2\xe4L]\x83\xe3\xac\xf0\xedc\x1d\xca\f\xc7@L\xc5\u007f2\x84\xb6\x8c\x81,'`V5\x91\x8aґ\x90\xcf\xd0+\x1c\xde\x14\x80|3\xcfhT\x9e9\x84\xa8i_\xd9\xf6\xad\x94zU){\x9bx1h\x17e\x86\xcfT\n\x05tG\x05Z}3v\x14\xb9\x99@\xa0\xd9ݽ\xdc\x11\r\x0f\x91\xc9@\x98\x94(1\x94\x1b\x160\x8bF\x96/\xa0\x98\xf1a\x82\xc3&\x94\x9b/\xa0\x84\x86\x10\xe3Y\x81E\xa2\xbb\xb2\xe8!\x03`&\xc0\x82Ӻ\x18WL\xc0\xe5\x81\xe6\x90<\x13\xd5*\xfa/\x88\x83\x8c\xe0>\xf4\b\x80;\x99\xf5\x83t\xb0mbXY\x06U\xabU\xa6\xa1\x0e\x95\t\xc9v\xc1,\xb2?\x9cE\xee\x02\xc1\x95\xe0R0$T\xc8@%\x0fԝ\x1ah\x04\xd6\xd1\xc0\nq\x11\xba\xb7\xe65[\xb9Þm\xc7,\x84\xb6R\x16H\xd4&\x9b\x13T:t\xa8]z\x8b\xcc\x1f\x05\xb8\xf6\xd0R\xf4\x0f\x84,\x0f\a\xb7W1\x88o\x83\x82,\t\xe6?\xdd\b2w\xb9\x03c\xe1\x91Ӻ\xbd\xa6\xe7Z\x01>i\xbb5\xa0\xf5#ʕ4\x02\x02\x9ae\xbb\x03P\x8a__(\xa2\x17|\xae\xd2\bD\xa9'@\xb9$_\vM͉$\xd0i\xb6\ah\xa5\x12\x10\xeafǝL\xceB\x047\xde\xc4\xf1\x19\x9fSZRA\xf6\x81\x84Gbx\x8c\xf0\xa5a\x81K_\xb9\v\x9b\xbe\x1d\xb9\x0ev\xaf\x1c#\xf51'\vm\xb6\x91\f\x17%\x89Z\"\xce&\x92\xa1\xaf\x05s\x8ba\xe1;I=\xdeQ\xeea\xd05\x90\xf2Ove\x14BV\bb\x1f4\xea\x14ƅ\xebS\x05\x85\xb3|\xc5\x1dlW\x10\xb2+Bŵto\xd1\x16\xcc\xd5L\x16Lj\xa5\x02n#I\xdb\xeb$1n\x84MfB\xd9\v\x9a\x0e\x94\x1d\xdbZ\a\xb98\x8dЇx8\x85\xb1]!\xe7է~7g\x85\xaf\x99\x0f\x8d悔ɛ\xf7\x1c\n#`D\x19\xb50\x12H\x18\xb6ߊth\xf23{\tA38\xad0J\xe9&ƠJ\x90\xc9\xc6B;\xc8\xf4RR\xa2\xf1\xda\x03\xe8y{\"\r\xfdL\u007f\xaa#>\x18\xad\x18ڀ\x01\x8bG\xa8\xf2\xb7Ą\\t\x1e_\x1cqS]\xedaQC\x06d\xf8\xa3\xd3H\x1e\xde\x14\xc9\x12\xe5u\x14\x18?Ċ-`\xed\xb6@GVЈ\x928^܊\x03\x90\xbep|\xc0\xec`ڱ\xe3\x11\xef\x06U͂\xcc\x10\"\xf2݇_\xc8\x0e<\xc4\x1c\x15\x90s`C\xbe5pWT\x88\xf3 \xe0\x9d\xddIa\xffN\xc7\xccO\"\\\beW\x834EO)v\xa0\x92`=\x9co\xbc{\xbaͤ\xb9\xa6g\xfd\xfa\x8aJښ4q8p\xdf\amg\x9b7\x10\xec\xadg\xe8\xfe\x88\xc3V\x134c\xbc1\xef\xeb\x11\x14\xea\xa2\"\x17\"@X\xf7p\bqK\xa2\x87\xb3o:ϱ\xfa\x9a\xf8x\x96,\xef\x00Rs9|\xc9\xf7\x10{Wp\x18\xfe$\x1dm\x8f\xa6\x17\xc1v\x18\x80\x1eܻ\xda\xc2t\x898\x0e\xe6\xb5\xf9\x02\xd6y\x11XM\xc7vKO\xd0,\xeb\"\x1e\xeb:ut\xb3\x96\x05mn\xd4\xff\xdc\xd1\x05o0\xd9b\xfc%<\xb0[\x1c\x05CEpB\xc1\x9f\x94\x85\x1a\xffȐ\x00=_(uR\xc9'ntU\x9a0Ѫ\n\xd1\x19\xfcG\xbc\xb2\x01w\x05z\xd5\t\x89\xb4\x16\x98\x1c\xf6p\xf5\x80u7\xc5P_f\xf6\xc1\x838\xa2\x85\x04\xfdb\x8eA\xe0\x88\xbdd\xe0\xf0X;\xe8\x9cNO\xc8\xc2\x05\x97܀R\xf5x!}\xf2F\xaf\x84Eh\x82\xec@DQ\x05 w\x9c\x95\xe6ya:G\xdap\x89\x80\r\x164\xa7\xc2\xe4\xe6 <.\x1d\x93\xb5\xb2f\xb6I\xc1\xf7r\xb7\xab\x878\x89\u05f7S\xcd\xf7Ik\x9a\x8b\xcan\x9cv\x11\xd4\xf6\x87\xe1pG)\x0fo\x9ej\x9a\xf9\xf9Bbi\r(\x04\x80\x84x\xa7B\x8d\x11)\x80C5\x10}a\xe6\xd1\x0fۓ\xba\xb8{=\xf2\x8a\x8fz Eۄ\x181<\x8a_K,J\xa5\xf5`5k\x92\xeb\t/\x11\xf1\xb0V\xb2VK\x10\x86\u05f6C\x12xY\x1dR{F\xb4\x9c\x1a}\x1f\xd0|\x89\xc3&\xba{\xe4\xb2\x1c\x02\x9cz-\xf7\xb0\x8c\x10\x95(\x98,\x1b3\x8cu\x11\x0f+\xf5\xc0ݦ\xc7A\x17\x83\xc2\x18\xa9@q\x14D\x88\xa7!]\xac\xbf\x9dLа\xd0˩\xeaI\x91\x80T*\xb04\xd5\xe9uE\xe7\x03\x84 \xfa\x84\xe9\x1d.\xf9\x13\xaa%\x8d\xc0\x90\xb2\xe5e\x9b\xf7\x98\x8d\x83-\x82\xfa\xb8!\x1fʐY\b\xca\x03s\xa2\xae֔p\xe4\tD(\xd40\\\xab\t\x9ej*w\x81 \xc10?q\x11\xacw\xa0\x19Α0M\xc2tN}S\xe8j\x8e\\\x89\xb3\xa0\x16\xc8e\xa5\x1dI\x8a\xb4|\x86f\xf2.\xd4TP\xe8R\x12\x10\u009e#\xd4\x14\x95\x16@%\xd5i\xee\xf6\xba\x83\x99Г\x16\xb0\x90ao\xacQ\xa0\xd4\xfcqM\x90a\xa4R\f}\xff\xa2\xb4\x86\xb0\x97\x80F~i\xd6/\xc8d1m\xafS\xe5\xa3}\xedT\xfb;aP8\xa8\xc9j\x19\xbb9\x9e2~!\xe5\xb6oE\xd8#\x17\xcat\xf0\xe8h\n[\xf0\f\xa4ff}\xab\xd5\x13;\x83\x0f9f\xb5\x11\x99\x02| \xb6AOj\xba\x13\x8e\xd1\xfdxy\xf4\xa2\x89TH\t˄hb!\x12\x8d\x97\x92\x89\xc5\xf4!\xe1\xd1\n\x8cfJQ\x1cNX\xc8\xf0 \x9d\xc1\xe2\xef\x02\xbc\xb3\xd3\xfaF,J\xd7;lh\xd1뭽\xb3:\x92\xba\x00\bf\xa27\xde\x1d\x90\xbc?\xa2\tB\xaa,\xea\xb1\xc5V\xde\xf1B\xf1\xb9,\x83zb\xf8\xa0GR\xfc\x80\x8fD\x12\fu\xc1^\x9d\x19\x1eܚ\x99\x19\x8c\xb4W\xf9+\xe1F\xd1a,\x88\xf7%\x89J\xd6ɠI&\x03C\x97\xfc\x9ah7#)_\b\x05룳\xbd\xba7hTc\xce7%\x97Y\xd0$\xa6\x83Q\x82=\xb59-|c\xe7\xd8\xe4~C^(\x84\xd4r\n\x89\x11J\xe3\xaef\x87$\x94\xd3jw\xfb\xd8\x02\x0f%\xf3\xc4\xe2t\xf3\xa4\xc6\x16\vY#\x82Cg\xc1\x06L\x1e\x94U\xa6\x03E\xf3%\x01\xe5\x06\xb09\xec&@\xec\xe1\x12\b\xdcR\xd6AF7!\xbc\x19\xe6\xede0M_>\x0f\x846\x0f\x99/\xaecU\xf5\x81\xcbk\xeb\x8c\x14A\x80\x041\x80s\x86\x00rT\x94\x18^\x80)]*\xeeT\x93U\xa4%\x02\x9c\x9bM\x14\xf7[\x03^R$\a\xd4I\v\x89)8l.\x1f\x95\xb6\xa2\xd3&J\xdb\xd8\xf3\x15\xf6b\x9b~\x8e\xd49\x80\x16D\x8cסι\xed\xedO\xe8Sp\x06\xd1\x1b\xae\x8cU\x10\x90\xc9\x17\xcaFu\xac\xed\x9aH-\x19\x1bb\xc3f\u007f\xda4B\xcaw\x04]\xef\x90\xeb\xf4\xb5,%\x97\x95kJ^\xcaPHh<=\xa2(\x00\x8b\x0e\x82ЅL\xc8\x00\x00\xe8\x943\x00@\x066v)6\x8a\x14s\"\xb3\x11Z\x119h\x94C\x99\x04\x83\x92,\xa0\xfcȐ\x11\xb1u\xdcm\x9d\n1\xd8\xff\xa7\xf1xe!\xe8\xd0O\x88r\xed\xe1S\x9d\xa6\xb9\x0e\x19p\xa6-\xf2\x87\x02\xcfx\x87\xfc\"\xfa\xf5\x95g6A\xf3\b\x86\x02e\xfb\x85\x92\xd39m|[\uf82dWl#ov֒(UZ\xf0\x99\xbfq\xd5Lg\x14\xa7P\xa0^\x16\xbe\xf54\x84C3\xe3\xaeW\xbc\xff\xae\xe3\x94Ԟ\xae\xe2\x19\x1f@\x8eϓ\xa6ڵ\xbf>\x03\x8cWH\v\x02\x14\xafy\x899\xf4\x86\x95\n\x01\xc2\xd2Z\xe5\x8bv\xdf\x01\xc5\xfezf\x15.\x1f\xb2T\x0f\xd8>Ɠs\x020#U\xdd\xe6\xb20\xd0߇\x18^\n\x17\xf5\xc7\xc7\x1d~\xa7\x88k\xc5\x17\x11\x81\xa6L\x06\r\x80\xc0*\x1d\xa9EP\x93m\xe6Z\xbd\xe6\x12\xac#>\xe7~>^\f\xee\x93|B[\xe2\xfd7\xe2D}\xcbX?,\uf543~\xc1\xec\xc3n8<,\x9f`\xc4L\x00+8\xac!\xc2/\xcet\xf7\xe4\x89\xf6X\xbb\a\xdd\xfe2\xbc\x89\xf4w\xa5]\xd4њ\x01l\xfc\xda\x03j3\xdaJ\xd2\xc6s\x90io\"{\xba\u03a2'b\xda?\xaa\n%\xfb\xfeYPa\x80\x97蕄\x10\x98Ql\xc1\xd4\u007fCW\x12\xfb\xca!-\xf9\x92\x82`\x8cq\xfc\r\xa2T\xa9\x9c@t\xc2]\xab\xa0\x01\x81\xfc\xba\xdda\xd8\f\x11\x1f]6\x9b\xd0\x04\x86H\xc2mB\x844L\xd0TD\xbd\xa8rh\xa5\x03\v@\xf1Dj!\x01L\xd95\xfb\xb5\xc7\xcdz\x80\xae^\xefh\x82\x10\tR\x05\xfaѼ{\xf2\xa0\x10\xd1w\"TOv'\x01:\x9a\xf5\x0e\xdd;\x02\xe3\"\x8f\x8c\xa8lA\x01$q\x13\x02\x9d<\x8c\x11TB\xfa~\x11\xc6\xd5\xe0\xfa\"\xa0\xd5_S\xc5ϒ\x164%U_\xd5\xff+\x01m\xab=r\x84\v\x99XD\x98\x9c\xfeT[!\xfd\x0e\xd2\x156\xd4P\xd3\x1a\xad\x01U\t\u007f\x01D\xd0I\xa7^\x1e\xdc\x0eG4Spv@9\xabG\xfaQ\x93]m\x12K\xf4\xfb\xbc(\x92J\xdcΓ(/\xc7녬\x85\xfe\xac\x1a\u007f\x04\x82w\f\x9d\x02\x80\xd5dz\x8d\x1b\xaa\xf4P\xbf$\x01:\xb7\x03\xe6Q!0\x97ᆦ%\f?,O\xbd\xd4n\x97\xbe\xdfw׀3T\xab\v$;\xc0\xa9\"\xc8$\x97\nG\xc0\xecl\u007f\x1b\tc(l\xe0\x86\xb8\f\xf4mj\x1a6\xeb6\xb0p\xf0\x81\x86\xb9\xabz\x838\xady\xf7h\x90Jy\x8fʏӽ,\"\x1e4?6\x8a;\xb9\xab\x00%\xd0&\xe1C*\xe7afb\xf0\xbeؓ\x99\xf2\xa3\xd9&\xf1\x83I\xaf@\x80\xd8zҌ\fo\xf0\x11V\x17\xb7\x81\xe7\xd4؛O0\xa1k=͘C\xb2>A\xf32\x81\x84\b\xb5\xb4\xa3\xa2\xe8#[3\xd0\xeb[3\xd6\x1f\x8c46\xbbʖ\x11\xfd\x9bʐ\x0f\xa1@\xb6\x98\x83\xa1\xc0\x9f\x04\x0e\x9c\xe0k\u007f\xc0K\x81\xca\\\xe9\x15\x1e\xdczh\x1cd\x11Eϋ\xc4H\xc0\x10\xd7\x1f\xac\xf41rO\x1ff\xa4\xf4\xbd\xcd\xc8\xdcR{K\x0f\x84rC:\x9ej\xa0KV-\x00\x00\x1e\xf1\x00ᄽ\x82\xf1A\u007f\xc7\xee\x1dUx)\x8c\xd0N[\x82\xa8fڄW3\xdd(8\xb0\xb99\x91\xee\xe8L)\xe6E\x0fE\x9d\xa4\x1ec\xa4l\a\xfb\x84\x86\xc7t\xc0\x86\x04F*^\x98[\xfe\x9dt\xdc)\x81\x88\xa1\xaf\x04Id\x04g7\x98uZ\x8ak\x1b,\x00u.\xc8e\xe6\x9c\xf2=%\xd4\x16\xe8*\x8f\xec\xc1\x96\x88\r\xf1\xc9\r\x14v\x97\x01\xf7p6\x13%\x8cp\x1c\x9bi\xf7]\x022\xe9\x8d\xdc;V\x0e\xc8+&\x97\x97\x11\x1d\xe4\xa6\f\x0e\xa8/\xe74k\xaeA\t\xd9_\x11'9$\x94b p\b\xcc\x1b\u007fƄ\x03\xc5!u\xba\xdd\xff\x9f̵D\xddTF\x92\xbaY\xf0\xfd\x17\x85\x8b;\xe8b\x1d\x04\x1b\xab\x81\x02\x1c>d\xbbE\x81ʼn\xf7@\xda\\\xddM\x1c\xe6\x92\x04I\x00\xae\xbeܞ\u007f\x1c\xb5\x15\xa0\x86O\xd4\xdem\u05cd\xfb\x16\x1c\xb92s\x02\xb6\xa4p\x05\xbf\x1b\x1e(\x17\x16\xe1)\xf3\x9e\xb7j867B\xc6z\xd0!\t\x05\fݐ\xcc,\x06\x02\x8a&\x80\xceNU\x8f\x93\xb78\x98F#\xbeԝ\x14\x8b)5\x19a4,'\xafOI\t\x12:g\f\xbdJ*~w\xe4\x1dj]\x1c\x82\xb1%\xfe\xcaG\xc4L\xd4\x05\xf0nߗsL4z\x90\xa9\xf8\x1c8\xb50~\x81\xb9\x0e\x93\x89iAOH\xcc\x12\v\"\x98\x8b\xa2\x17M\xf3l\xc0\x9a\xac\x9a\xec\x84r\x81$>\n\x98\xcfo\xf0o.rB\xf5\x94\x8ay\t,9\xb4\xf2\xa6e2\xc3\xff2M\x04\x03C\x9d\"zQ\x1f\b=\xe0\xcf.\xa4\f[wԡ\x8e@\x18\x89LXy\xfdg>\x8fjz\xbbI\xc0\x98\xad\xa3\x0e\x86\xc9\xdb\xc3\xe3\x82\b\xb5v>\x04S5Oo\"..\x1c/Ѡ\xee=\x8f\xdb\x04x\x02\x82\xf1\x11\xd0ױ\x04\x9f\x90LT\xd55i@N\xd0\x15yԿ@\x8c\xf2\xb4\xc7\xe6\x0fE\x86\x90\xfd\x9d\x8a#F\x99\xb9\xa0?\x94\x97\xca(\x10\x04\xc3\x1d\x17\x835:C\x86\x13\x9d\x98\x8e\xc6\xee\xa5%\xfc\xd0\xc4.\xe1\x86\"\x14\xde$\x84\xbc\xc8'\xf5\xc1d\tW\xe7\\\x1d\n4\xf9iFҔ\x1e\x8c\xe6@\x14\x02#\xea\xc9@dY$\x05\b2\xcb\xccg\x16\x14\x03\xd5<+\x18\xb3\x85\x9b\xbe\xcbR\xfb\xb9\x92\xe7\\y@\xf64\x9ej҅[w\x02\x86.p)\xf5\x9d]\xcc\xcc9\xb6o\x80\x1dg)y¥\x97\xd7\xcd\uf634UX:\xd7\xfe\x9b\x89#͈\x8b4\xb2\x94\xc1\x9fR\xec\xaedWb\x95\x9d)\xde\xd0z\x1a\x13*SX\xe5\x9dy\xa5\xa9h\xb2\x84F|\a\x8f\xeb;劀\xbbu\xc0\x16\x01c\x0f\xe1\xa9$\xa0X.;~\\\nD\xd1\xf4\xc9\a\x90\x16RyD\xb4{<\x1a\xf6Ҙbtg\x8c\x86\x18-\xea\x19C\x12'Ͱ }T\x01\x10\\\xeb|Q\xc3\xf2\x97\x1eh\x00\xf0R2j\xfb\xc4\n\x14\xac\xd5=\x9c\xd2\xd4\x1f\x87\xf9\x1e\xd5G\x90\xd8'\xb74\xe7\xa0\xf5\xaa\x8c\xb0u\x82\x8dйk\xf9m\xa5\x98}\x1b\x02º\xd2\xf6\x05\b\xf9\xd9\x1cg\xeb\t\xb8Ub3\xdc\x10\x01\x05\xd0E\xb3o\ry\n\xf3PI\xd1ȭD\xfe\tf\xaaNIC\xbc \xc1H\x169Øj\x1e\xea\x89sUuM\x144\a\xcb\xf4.6\x82\xfch\xe5\x11\xdc44\xfb\xfc\x97,\x9aB\x85n\xae8\x03p\x14;\x0f\t\xec|\xba8\xc0zBP;\xf6\x83q\x99\x91SD\xc2:8\xa1\x11oy\xe0\x15P\xddJ\xa8\xdcF\xdb\xfe\xe5\x11\t\xd9SC\"2S\xc0|\xa3=\f\f\x86\xfa\x17\x95HN\xc8\xf0f\xf2\xa6\xd1\xf8\xf0\x84=\x16\x91\xdd*}X\xd2\x00\x93і\xf5\xba\x83\x01\xc1\x98:3J\x96\xba\xac߉\v\x98pT\xdc\xf7Ϸ,\xffn\xa7\a!\xd5\x05c\x86s\xe4\xe4\xd2be\x9d{\xc6\xe8F\xf2\x14\x0f\xf0\xda,Rc`\x94\x11\x1cTϖ\a@~\xdaif^\xa8\x8f>\x1bDEyP\xd1Y\xc9\x0f\xe3\x9aN\xd0\xc1\x16_ȑ\xb3\n\xcc\x1f\xec\x18\x8c\xe5t\\#\x14\x1d \xd5\x14.6~\xb0\xe1\x1c\xc7\x15\x90\xbc\xdc69\x8a\xbc\xbf\xd3\x1bi\x0e\xb2[O4e4D!M\x18 \t\n\xd3O4\xb7V\xfa\xe84\xed\xaa1\x8c\xbc[sf1\x13\x01\x1c\xbe\xb0\x0eJrn\xb0\uf566\x15\x15\v\x90\xaf<\x81p\xf2\xd1\xfd\xb6\x13D@s\x0e\x11\x00\x94\xf0DK\x10T|\t\f\xcb\xd2\xca\xfc\x18\xcd)ؕ\x1f=\xa7\xf3]\xc8\xce|\x9c\xea\x1b\xf2o\x14wJOiƍ\xbc@\x9a\xb9X\x14s2\xfa\xd5\x1a\x04\xe3\xc4\x17\xc2\xca\xf5H\xb5k\x13j\x97\xb6[\xa8\f\v\x8d\xa3\x0fl\xa5\xd7\xdab/\x12\r&1\xfdYsV8J)\x93\x03\xf9<\v\xe6\xff\xc8\x02\xa4\x12\x1d\x06\x11\x17q\x9a\x1a\xa1\x96k/\xed\x93g\xcbd\x95q\x1cw\xe4\x01Ɵ\x84\xf2\xb41\xdb6\xa5\x8a\x9c\x8a\xad,0\x8aπ\xb6e\x18\x9cT`\xa4$\x87z\xff7\xdb\x16\xa2\n\xf5\x18\x9c!\xbcDûa\x8ej\xba\x11,\u2d7d\xc4kKᱪ/\xfa\rw\xd1\xf6Ȥ\xcf*\x1cU[+\xa3\xf5\xdb1\xc4b\"\x13\x86\x0e#m\xc7T\x87Y\n)8l\xf2\x98\xb0#\xb8lvK\x85\xd85E\xeb\v\x82\xfcI\x91]`\b\x89\xa3|\xbcԍ\xa7OC\xe7d\xca\xcd\xf4)UlL\u007f\xd4m\xcd\x01Hn\xeb4\xfb\r\xd7Uv\xf0\x9bk6\xber\xb8\x06\x93\x8cM\xc3\x0eO\xc9\xf1\x01\x10\x06Ɛ[\xe9<\x94\xfaI\xfcX\x0e\xea\xee\xde\xceO\x9b\xa6\xfd\x01Ͱ\xe7\xf9\x89Q\x9f\xa9{C\xe8Yf}\x012ZP\xcb9+fRHU\xdf`\x10\v\xa8\xe9SvLE|\x95\xa2\xf3't\xc4>^\xcd9$qz\x17\x8cV\x8bm(y'\x85-\x02\xc6D\xb9IK\x1c\xb6T,OT\xd6\x0e\xf1\xa8\xad_\x96q\x14\xceZh.\vʓ\xe4\xcfe7\xc2\xf1垼\x04\x84\x9f\xa6\x04\t\x9e\xad%\x88R\\\xb1\x99jjv\xe1\xc9\x12\x85\\)As\x88\xfa\x1d\xaf\x05/\x89\xb9\xac\xc6\x1fH\x06\xb0U\xb7`S\xb03\xd2!s\x1d\x96د\xc7\xf40\xfcx\x88W\xbd\xa8eHt\x87{,\x00\x1b\b\\\xeb\x05S\x0f\xd9.\xbc\xa9\xfb\x0e\xb3\xba4\xb2\xac\u007f\xceT\x8e\xed<\x11y\x11<\x1c\xd3\x0ezx\xc7\xfdKh\x9b\a5\u007f\f0-Ph\xa3\x8a\x8c7\xbe\n,)ZR\xa3\xf0\xf9J\x8b\xc3b\x0e\x1bA\f\x83\xb9\x94\x00\a\xcd\x0f\x1eb\xc6p1tLr\xdfL\xb3Zg\x9a|\x8d\xc0\x93\x05\x98\xad\f$v\xdcP\x93XJ`\x14\xa0\n\xbd\x05\xf9\x05Q\x02\xe4\xc1c\xc1j\xf4\xcf\x17\xacZ\u0530\xa6\xb6qcr\xe9K\x02\x94[!G\x03\x899\xb3\v\xb1-_\x94\xea1\xbc\xc9\xc5\xf0\xaa%\\\x90\xed\xe1\xad\xfc\vX\xeboIh!\xae\xf0\x9d\f\x0e\xff\xaa\xca:'\xa5Gb\xa8x\x95\x85\xeeE\xc3G.\x1c\xae9\x97\xf2H\xa4r@\x1c\x8e8`\u007fQD:\xdbb\xf5\x8a\xd7\x14\x010~\x05\xa28*\x86j\xdcW\x01$\xc4\xf6hK\x0f+\x01\xa0s\xd0i.\x15!\xe7\x06n\x0ei\xac\x96\xe5\xf6oS`za\xb0B\x12\x05\xbc\x16XQ\xc0\x8fF\x8c\\\xfat$ۂ\xf8\x06v\xabP\x15\xc08h\x06\xf2\x0e\x82\xa8Rf,\xc3\xe7)\x16\xa0\xa2-\xf8\x98\xb82\x1f\xc75 \n\xc9\x03@\x9f!\x8fI\xe5\xcbw|?-\xb7\xc2e\x81\x0f\x82n\x138(\x06ε\xdc\xddEn\x06\x01\xb3\xba\x90\x1c\xe1iN\x1f\xda%jr\u0605\x18ׄ\t\xb0\xa7A[}o\xf5\xfb\xeeD\xcaG*\xb9:F\xceM\xc3`3\xa9}G\xba\x11\x18\xe1\x93M{+.\xe2\xdc{\xbbޮ\x8b\xb7\xb4\x95\x05\x89\xea#M\\,\xeb\xaa\xc6&i\x05\x84~\xa6zk7,ź\xbd\x88-\xd1\xccQͰDk\xc8w'\xfc\xe3\xa2W\b\xa1\x8ex{q7\xf6\xe4\u007fv\xb1\x19:`\xfb\x83q\x9f\xbc\x1f\x9a\x14b\x8b\x82\xa5\xf2PT/r\x95\xe8RLؙ$\xf3\xbb\xc5\xceS\x81X\x89\x01\n\x99\xb6u~\xb6k\xb7F\xd1A\x90\x9e\xc2\r\xc5\x16\xab\x01W\xd8SQ$\xb15\\\xab\xf7U\x1dy\xda[E\x13hC\xa5\xb8\va\xe4\x1b(\xf2\xb2\x0f \xb7\xb4\xcd<{Q>\xa4̚\xf4\xf3,<\x8ebPT\x84\xf2\x9b\xb4\xd8\x03\xe4\x1b\x02\x02!H\x13\xe4%\x04@\xe8\x10\x0e\x89A\x04\xaf\x14\x04\x11@\x15h\x02\xf07\x10s\x98\u007f\x8b\u007f샗C\xb8{ \xe3\xf0\xd58v\xf8\xe9\xf3j\x01\xfc\x80+!\x93\x03\x80\xa5\xff\xa4\xfeܐ)k\xf7)\nl\b\xf6׃ڇ짅l\x04;\x00\x0e&\a';)\xe8\x10\x9aH\x12h\xe5-\"J\x16\xb7y\x11jh݇\x0f$E\v\xdb#\xc2\xf2\x06\x18x\xc3hQ(dž\xd0ţn5\x89\x9a=\xf2$OO\xe5\x14\xf7\xf7\xdf\x1dJ\x84sP\x9f\x88\xc0\xc3\xfc\x80\xe0\xfd4\x9e\xb8\xbd\xe55\x88\xa6\xa5oA +\xb7\xe6LkW:a\x04x7\x93\xd2\x18\xa5\x19\xd7:\xc7b\xb7e\xb7%\x88\x8e\xbb\xc8z\xd22ڹ\x90\x04\xa9\xe9\xa5y䄫@\x1fF\x85ΐ\xfaش\x8eʲ\xfd_xԒp\xe6\xc6u\x1d\nr6o\xd3D\x16=\x92\x99Og\xc4\xffӠ\xbd\xc2\x12\ak\t\xe7\xab\xf3H\xe6O\x15\xa8|I\x8cB\xa2\x03r\x03\xa5\xfb\x9e\x94\x93I.\xbb\xfe?$\x90\xd0\xd5\xe1\x1c\xf0A&M|l.b\x05A\x80\x9dD\x18\xa5&\xc5i\x88\xce\x16\u0600\x88\x87\xea\x03\b\xc2\xc0\xab\x9dJ\xc3l\xd1\at@\xc4MX\\\x90\x04Q\na\x9eOA\xe7B@RT\x13\x8f[\xe5\xa2\x136\xde\f\xa2M\xa5\x82B\x02\x0ey\x13[\xc4B\xe8\xdb]\x9fc\xbc\x88\x86\xbf=Y»\xc9p\x1e$\xb0\xbe\x8b\x17\x12\xc1\a\x191\b\x88\xb8\x9b\xa1#&\xc7\xef\x81\x19Wn[\xa1\xf3\xcd-\x99\x01Ŕq@\xdb\x05h:\x18\xf1\n\xbf0\x12\bBl#\xf0~{i\xf8*[W\xe0\xd8\x10\x00\x00i\x0f\xc9c\xc0\xe0\xec\x98a\xf9 ~F#\x93Ic\xc0\xd9\b\x865!\x16\xa2\a\v\xc7\x00px=\r\x8fCe\n\xa4\xc34Ê\xa1\xb8\x1c-\x1d\x96\x87C\xb2\xb3㓁h\xe0͋3\x80\x8d\x02ƭ\x89\xd0\xc3l5XH\xf2\xa2j0\xd5W\xa7\xd0QxR\xad\x86\xe3&HAO\tq\xa1\xfcG٪\x9a\xc3\xc8\xd5 \xc1\xf3x3\r\x89*p8\x9b\x0eGLR\xa8\x17\xca\xe7\xc4J+\x11\xd9Je\xf3]fT\x1a3\xb3iZ\x95SE\xd2\xf7.\x92Li\x9e\xbb4Ҁ\xe4\xc3.HD\xe9\xdck\xa2\x8d\x11\x80\xd2nz\xc1\x8d%,\xae\xfd\x84\xb9\x1f\xec_`v\x15\xfe\xc2\xe0\xe2r\x01>\xb9k\x87\xdc\x00\x16\xf0\"\"\xb2m\x9bMgB\xbf\xb1jd\x17\x13\xaa)d*\x9e\xa2\x97\b4Jf#\xd6\xe3\x0fm0\x83`\x984\x05\x87\x83:\xee\x95R\xdb)\xe1UD\f\x03\xb6\xc4\x11k\"\x9c+;\x0f\xba~\xbb4C\x84\xbdHf\xf8\\\xa8*\x9dT8\x93\xef\xb8\xf0\x80\xf6r\x02\xca\xf8\xf5(`\x03Mjv\xa2\xc91\\\\5\xbcTL\xa5\xec\xba%,j2[>v\x96sW\xa2\x90#\xfb\x1bw\x94+}\xc6\xd5J\x19\xc1\xf1\xf2\xe8i\xa9\xa6\x14\\\x8e\xc6y\xe0\x16/\xe7I\x00ir\xbb\xb7\x81o%\x8c\x9b-.\x1e~\x1b\xf4G\x8e*\xca9\"R\xba\xe6\xb9\xfa\xc1ǜS\xb5\x05=֍\xadG\xe0\xa2\xc2\xe3R\xd9\xc1\x81B\x1e'\x88Y\x1d\xef#\x88\x1aP\xb7\xfa\xfb\x1d\x86\xaa\xf8\af\xc9*\x86\xab\xe7\x99\xcf\xe2\x94լ\x9f\b\xc5E@\x01\xaa\xdc\xc3Z\x1b\x9c\xed8\xcd\xc1b\\\xe7\x1a\xa9,QIa\x1f\xb9\xff\b灟\x83\x1a\xa7\tA\x05c\x8f\xd3\x14\x90=\x92\xdef?\xdc\xecw\xb7\x8b\xf6\xd4\a<\xc3\x19\x94\xcd\x0e\u07b9\xbcE\xdf\"\x8cH\xe2\x1dW\xc9c\x80=\xbdđ\xc2%\xe2\x15}\xf5\x17\xd8&\xe2\xfc\x89Z\x92\xbc\v\xfd\x9f\xccI\x89\x8a\v\xf5\xc6\a7d\xe7^:z\x01\x9a\b\n\x83\x1ap\b6\x85\xa95\xee\xf6\x8fR\xee\x1a\xee\x11\xd9\xdc\xf4դ\xb6\xfe\x04q\xd8\xe9\x8e\xe8$\xcf\xd4\x14\xa3i\xa7}\xae#\x10\xf6\v\\\x91\x85\xeb\x8eq\x06\xdcN\x1e\xfb\x97%\x1f\tO41ψ(\x0f]H\x1d\xe8\xe8\xa1$a\x9aA\xe7\x05\xe2k;\x90ĉ\x00\xb0b\x99\x88\xe8\n\xe9\x04\b\xbb9\xa9\xb8DQd\x95#\x15\xe2\xf8\x92mҐ\x92ɛ\x9d,\xc2\x04\x8dI@\xa9ĻG\x12\x16\xd2)X}\x87\x1dJ>y\x06\x03\xfb\x9b\xfa\x934\"\r\x93\xca=\x12\xda\x16\x11j\x04\xf7\x19\x81\x1c}\tNNv\xd5D\x9c\x8aJeR\x98\a\x17\xe6\x14\xccgs\x1a\xa3pPWw+\x1cŎ*\x055\xb6\xa9\x85\x18\x96\xe3U\xb3\xff:\xf2,O\x84Z\xda\x004*\rjh\x10i1U\xd1&sc\xa3\x97E\xdc\t\xfc\xad\x8c)1\x95\xea[^\xd85by2\xa5\xa0(\xe4˭Y\xd0\xfa\x9e\xf5\x02\x86\x8c\xce\xc9S\xbd\x8f\xd2\ue324jU\xd3\xd3\xd2̞\xf5ij~\x83\x9a\xa1e9\x14\xd5\xee\xad9\xda\x14\xa9.@*\xdf\xc6\\ܦ\x91r\x86\x94\xa55\xed\xf8?\xa1\xfc\x93l\xf9H\xf2e\x1a\x1f\xa3\xc1g\xe9YZ\xbb\x0f\xb0\xe7-\xcd\x00\xaft\xea@r\xccL\x18/qn\xc8\xe0\xfc\xde(B\xc7q\x87\xe1I\xac\x05\x89)-\x14\xb1;\bi?Q\x17E\x89B\xa7y\xf0\x01Ys\x85\xec7y3\x02\xd8\x14\xb9V\x00\xccz\\\xf2˂ܰ'\x02\x1b'\xf2Q4O\xc6\xe2\x90\xd6\xe4\xcc)\xb7\xa7A\xad\xaf\xdeNI>\xb1\x03\xf1\xa0\xe5\x05\x9eX\x13\xd7\xeb6\x11\xdb6\aѰ:\x83\xc0\x1b\xb8\x80\xbd:3\xbb\xc8\xcaJ\xc1A\xf1I\x1d\x02y\x96;˨*y\x9d\xeex\xd3}\xa9\xf7m\x95\f\xc0É f´\xd97\xce{\xb3E٬4\xc3\\k\t\u007f\x98iI\x91\xb4\x05\x02̌\x11\x82\x81\x8e\xb0\x97\x89C\xf0v\x1a\xdc\xf6FD\x90Ġ\xf0\x96+\x19\xe8\xc2\x0e\x85\x82\xd2\x1c\x84\x8f\xb7GƵ\x16\n\xc4\xe3\x86\x1dG^\x144=\xa0Dp\x85\bM\"\xe9_`\xe9?\xac\f\x18\xd9\x17\x0e\xc8bTA\vd\xaa\x05MU%\xce\xf6\x84\xef\x028\xff\xe5E\xa2\xe6B\vI\x80b%eO\xdafY\x06``\x8f\x0e+\xeeAK\v3\xa7+\xe8Y\xda4\x80\xa1B N\xf2l\x9d\xe3h_\xa3'm\xa4@X87\x14M\xcfBk\xc4\x0f̬\xd3*1\xf5Pp|\ue256T\xa7Z\x82ʆ$\xd5J\x81\x94\x00\t\xce\x13j\x9f\xe5nۉ\x11\r\x90\x008\x9a\xc9_\xc1(\xdeC\xe4\xdb\\&\xed%\x1ci\x99\x01\xe8\xdf\xee\xc6\x0eH\xef\x1bH+y\xe4\x0eX\x93\x11\xebu@ѣ\x99ͪ\xe8\t\x13X\xf2\xb4D\xee\xbcr\xfd|1\x03\xe2Xi\xd6\b\xd1/\xf2\xbd=\xfe\r\x19X2c\xcfi\xe9\xcc{\xb6A\x80\xcc\xe7p4\xebC9`բ\x89F\xb2O\xad\xc7A}\xf5\xe5\xe4\u007f\xedI>\xa2'E^m\x95\xa1}K$\xacK\xbbp\xe0\x85!a\x13\xceo\"\x95\xdfb+t\x18\x1f\x00s#\x83\x9c\xc1=\x84\x9e\x19Z\xaf\x02\x00\xacR]\x13*ْ7߁t\xff<\xfdwR\x84\x1f\xe7'ux\x02\\\x86=\x98m8\xe0\x96\xafS6\x02\x96\x93\x12\xb1\x01H\x98\xdeÐ\x9b\x89\x91L+&\x8agO}\x11\x98\xb7s\r\xcf/\xa9\x03\xa8\x18\x15%\xd7.l4v\xb8\xcd\xd9`zY\xdb\x02\"E\x82)\xf8\xc8ق\xa0f\x10ע\xdd\x05\x97\xb4\x84\xd2e\xad\b\x0e\xb7P\xc4\x13ΤgYP\xc4\xef\\\x81\x85L7\x9a\x19\xe4\xb4=\x83\\fVZ\x12\xdfn6\x020\x97B\x16p\x9d\xcd$\x84\xcf\v\x8a\xf9\xd0\xfc\x8e.\xa0\x95\xac\xb9\x80z/5 \x02H\x97r\x81D\xef`\x0eR\xfdI`D\xf9\x02\x01\xc7\xd5n\x946\xb6\xb8Ӻ\xca\xc0\x18\xc5Ҽ\x015\xf9\xaa\x89%!\xb3=(+'Kc\xb7\x94U\xb00\xd6\xc0\xf2hX\x1bB\xb8*)\x88#\x83\x82\x05\x1d\xd0|\x86\u007f!\xf2\x05\xb6\xd6pU\xd2\xf1\xfb\x14\x8e\x13\xd9\x13b\x81\xf8(e\xf4\x9e\xfa\x8e\x96\r\x9a\b˝\x19\x8e\xa3<#l\xba\t\x16\xa0\x1e\xf2b\xe0\x04钎\xee\x1b\na\xe4@@\xd0j\xcb(Q\xe1\f}\rDtE\x05R\x8c\xcdBԵmk\xe3q\xbfK\xf3\\\x80+#{\x94Z\xab\x1b\xc9\x1bE &\xdc\xc4\xfc)\xb8\x9a(\x85 Gf\xd5\xd2\x18\x90z\x1c\xcd\x01+\xe2\xa8LI\xcfC\x00/\x94\xb8\x8d\x18ӂ\x9b!\x99\x8115\xc8\xde\xf5\xa6\xb4K\u007f7\xfb\xc5,P\\m\x86\x01\x85\x87w\x81\xb0\x8a u\x9dJ\x96\xfe\xbb\x01-\xb2\xbbU\x17\xfe!\xc4֎u\x18\x9d\xccb\xf8l\x8f\x13\xa6\x91\xd8z\x85\r\x9b\x81 \xcfE?\xeb\xe6Bݥɥ+\x96\t\x9fy\xe0\xcar 1\x19\x86\x8bYS\x98\xd4>\xb9\xe4\xad\x19e\xbe\xf4\xe7\xd4\xcdO\x18\xca/\xaa¢F\x1a\xf05n\x81\xa3\xd6\xc1\t\x90\x83v\xa62\xa0\t0\a\x1c\xed\xa1~\x02\v\xbfDz\v\xf0%u\x03\bD\x9a\xe8\xd48\xab\x93\x05\xa2L\xdc7\xee#[\xd4@\xfdWOY\xcc\xda\xc7\xc18I\xddR \x91\xc1\x95W\xf2\\-\f\xe2\x9d\x19\xb1\xa7f\xc2\"F\x84`\xa91\xf9r\x9e\xcf\xdct[\x84f`\xa0|\x15/U\x9b\xf3&\xa8o6;\xf8a\xcf\x13n\xef\xc4ē\xb1\xf5\x1e\xa2b\xb0\xb6\x81\xcc[\xe9\x9a.\x03\xa9\xb7\"\x10\x82A\x9f\xffp\xe0\xa0\xe89K\xd5\x14\x977\a\xf0\xb3\t\x17d\x04,\xd8ٜnd\xd5P=\x18f,\x87\x18N\xb5Ą\t\xce^\xd6B7/\x15\xa3\x11\f\xfe\x862Hfm\xec\xf8y&.\xff\xd9s#\xb6\xe7E\nAN\xa86\xc534\x1f\x80\x0f\xf6Ĥ\xfb1+\xb4/\x80\xc8DG\xe3z\x90ޅF\x87'\x04\xf9\x02\xe8fՁ\xe9F\x13\x84\xeaט\xe8ԑ\xa1\xa6\xd5\xe13O&[\b\x01\x97\a\xdf\x1f\x0f\x13\f\xb9:\x02 \x01\xe6a\t\xfd\xccԓ\x9a.v\x04\xf2\xceG\xd8\xed\f\xa4tf7\x03\x05D\x8d\xbc1\xaaw\x91\x8b\x8ex\xa9µ\xa2\xa0\x0eQ\xa8\x1aA\xb2\"y\r$[\r@\xc2$\b\r*l\xdd\x11BR\xc8\xfdxG)ih\r @\xbaA\x94\x88L\roS¥\xf2\xd8\u007f\x96\xccM\xe5\xb2\xe0g(\x86=\xeb\x902\xa3&\xa6\x05\xcc\xda\xd8.\x90\x18\x9b\xe8|iXt \x91\x16\x12:\x866d`\x8f\xaa\"\xaa\x0e\xa2\x8d\a\xe9\x15+?\xee\x02\xd6(m\x96\xe0\x17>\x98n#\xb5\\\xf1g\xb5\xe7m\x96\xdd\xc0\x1a1\x8co\x01\xda^\xbcև#\xa9dTZ\xd9\x03\xa0\x00\x9fI_\x1evC\xa8(\x84\x8cR\x00Ҭ\xb5\xf2\xf4\x80\u007f(\x15\x18\xd6\x16[\xbe\x88W\xe0쾳\xb38\x98r~f\"\x10\xfb\"$m\xde\r8\x94\xda|D\x9bh*\b\x02\x12\v\x87\xab,\b\x1ad|\x04\x18\x81\x06 l\xad$n\xb9\xea\x10\xc1\xbd\x89<\xfbd\x85#\xac\xa8\x85\xc8\xe89\x197h\xc8\xe6Ku1\xa2\xc1G\xb5Ĕzخ\x14\xc1\x1cVq\xc0\x9f\xd7\fB%(Mi\xc5T\x17\x82睁\xd9njD\xa2\xc51\x94\x96\xc1d\xc4\xcbbJF\xa1\xcb n\xcc\x05\xfd\xad\xd0\xfbmDC)\x9cl\x8c\xb0\x1f\xcaд\x80\t\\p\xb32\a\xce\xf5چ\x0e\xa5li\xd1h\x95\xa8\b3\xa8\xeer\x06\xd3\x03\x95e\xc2YLH΄\xe3Y\xf6b,\xd1w\r\x1d!|r\x97\x14\xdd\xc5\xe9Z%\x1c\xffu\x836\xd0\xd4$71+)\x80\n\xe9\xc2I\u007f\xe0o\x9bq\xd6##@\x8aA\x1d\x8a\xbc\x8cH;\xf2.8\x92\xfe\x15HF\xebAJ]j\xa3\xe63S\x13\x10,rl\r\f\x1c\x83\xf65qjgS\x91e\x01@@<\xa4y\x84\x81\x02\x04\xc7Dv\xd9\xc7\xc0|\xde)\xb7)\x90\xbeq`\xaa\x93\x97$\x92\xf4-,|\xb63H\xbd\x1au\x9b\xf7\x11iCr4\xef,\xcb_$\xcbpe\xbbޯ\xb7\x1a\xc2\"6Ι\x94\x80\xb1\"\x86\n?\xb0O\x17\x05\x18\x94/l\x85t\v\x15/$\xc5\x1c\x8d&0\xd9:\xad\x86G\xe0*\fb\xb0h\r[\xfbd\xe1xL\r\xf4\xb7٪\xe0\x86\tީ\xc7l\x92k&\u007f\x11\xa8@\x91\x92\xdd\xda\xe2\xf4\a~\xa7\x1a'\x1dr\x00\x81\xb1\x05\x86\x1f3K|\x89m2\xeb\x03\xc3VI\\\x0f\x02\xcc`\xf8R\x9c%X\x8eS|_\a\xe0*2I\x12\xab\xac$\x02\xa2\x81\xf8\xb1\x1e\x91\n1D\x94P\xa8j\xe0\x8c*k\xc5\x19\xe1{;:\v\x86\xb7K\xd1\f\tG\x97χV\xbe\x15E3\xc7\xc2:\xba{\x00\x95ҳ\xb8:\t&N\xbe6\b\bH^m;\xf8\xccE\xce\xeeFv\xaf\xf3\x06\xefY\xee\xd6\xd45N\xbcC\xe8~\xd7]Z&IhkpI\xcc\xd6\xc3\x0f{%\x0fj\xc5\xca\x03\x88\xa9#J\bOV$\xe6\xe4\xb5+*&!k\x91bN\xe3>\xe1\xe6\u007f[\x82\xa4t^\xaa\xe5\xd1\r<}\xach\xbb0\x97\xb2\xf5i'r\xd2Ť\xa8\x14\xe3_A2L\xd8ҽr\x10!\xfc\x0e\xa4n{5;1\x92(=j\xb71.rE\xc1\\\x1a%\x12\x82J\xd0B\xd9\xe3\x86x\x02;D\uede0TG\xfc\xb41]\xd7\xe0O\x0f\x02\xfd\xcf`a\xc1\xaf^\xaa3!+\xee \xcb<\xe76\x0e\x0f\xb9Z`\xaf&|\xc1<3\v\x01\xde\xc0L,\x11\x11\xf7\xe9\x9b\xd6\xf7\x18?\x0f\xa1Z\xba \x97d\x16\x86ʤZ[g\x89a\xb9\x06\x03\xe4\xe5N!tx\x82h\x81\x1aŠl~\xa9\fv&\xc4\a<&\xf5\xd0\xe9\x17\x93$\xea\xd1@\xec\xf9!\xcb\x1eهj\xc4GL\xc6\x1e\x18\u007fsJ M$\x810"), } file9 := &embedded.EmbeddedFile{ Filename: "af7ae505a9eed503f8b8e6982036873e.woff2", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969056, 0), Content: string("wOF2\x00\x01\x00\x00\x00\x01-h\x00\r\x00\x00\x00\x02\x86\x98\x00\x01-\x0e\x00\x04\x01\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?FFTM\x1c\x1a \x06`\x00\x85r\x11\b\n\x89\x99(\x87\xb6X\x016\x02$\x03\x95p\v\x96\x10\x00\x04 \x05\x89\x06\a\xb4u[R\trGa\xf7\x91\x84*\xba\r\x81'\xed=\xeb:\xb5\x1a&\xd3\xcd=r\xb7*\n\x02\x19\xe5\x1a\xf1\xf6]\x04t\a\xdcE\xaan\xa3\xb2\xff\xff\xff\xff\xe4\xa41F\xdb\x0e\xdc@\xe0\xd5\xf4\xfb|\xad\x8a\x14\bf\x93m\x92`\x9b$ؑ\xa1@d[BQ\x11$([U<+(\xad\xb8@P\xd05\x1e\xe4`\x81\xb0\x0e\xda>\xf6P\x10\x1a;\xe1(\x91\xd11\xb3\xfdl\xdb\xfehԨ\xa2\xc2)\x9f\xdcYy\x94\xf2Ji\xe9\xeb\x17\xad\x85\xce|%ہ\xb7^\xac\x14G\x82\xa23\xb8\x12n\x9e\x95\xe8\xbaڕ\xdc\n\xc4͐D\x8a\x9ep\\Yr \x94L\xdfP\xf4\x0e\x8d\x1b\x83t\xa5)\xcb\x11\x98\xef\x13\xa76R\xc2^\"S\vL~\xf1YR\xd7CXR\x15\t\x8a4\x81\x8e\xe6F\xfay\\[\xbf\xe87n\xa1\xe2\xae|\x1ds໌q\x1e\xa3M\xbb\x8e%K\xc9\xff\x17.ۺ\x0e,\v\xfa\x84\xf7\xf8L\xd0t\xff'\xf6\x10\x90\xc9M\x1d,\x11\x15c\xf7\x88+b\xfa\xc4ׇ\xe7O\xfds\xf9^\xd8$\x85\x86\xd7z.\a\xf5mŠ\f\xfch&gb\xde\xf0\xe1v\xed\x87\xf3\x01\x0e\xc9'\x8a\x0f6\xa3:\xb0\xbb\xc3\xf3s\xebm\xa3b\x8c1بm0\"ǂ\x1a\xb0\xbf*V\x8c\xa8\x8d\x1e\xa3c\xa3$,0ATPT\xb41\x12\x03\xfb\xf4\xac<\v\xed;\xed\xf3\xd2`\x10\xe6\xb6'\xf1H\x0e?\xf1sΩ:\x91\x0fND\x9f\xa8\xfc\xa9\x10I\x11\xa4$\x8c\x04T\x14\x8b[\x81\x82b4\x8a\x11\xcd\xfc\u007f\xea\xec\xef,\xafμ\xd7」bl6\x91\xba\vIL\xe9i}ی&\xe04\xe3\x94m,'\xcb\x16\xcb\xf3#\xbdץ\xb3\u007fRw\x01\xa2bu\xc0\xb6,K\x96\v\xc6\x06\x9b\xe2v\x8b\x03\xdb\bm_-\xc0\xc0\xe6\\H\x8b\x9d\xfb\x8eHH\xfe\xaa\xf3\x93\xea\a\xc6\xc2?\x98\x96\xd3m\xf3\v9P\x88\xad\xd8)9\xe7J\xa8\x86$ƽ\x88\x9c\xe7\xb1\xf48\xf8\xe8\xc7\xda\xce\xce~\xb9;\xc4r\x15\x8dn\xbf=$\x11\x1a\xb5\x1f\x94Nddn\x1b!'\xae\xa6\xf0\xe3;\xb3\xf4\xac8\x99\xbc'\xd9N\xa6\xed\x1e!\u007f-\x18\x06J\x19ʶ\xd3.\xe0\xd8\xfa\x91\xeeX\xaf=\f,\x12\x04\x0e\x90\x9b\x1e\"`:\x18\xa2\xff\x1b\x0f\t\t {\x8d\xef\x9e\xdc\xe0\xbc\x12\xcbK!'\x9f\x00\xa1-FH\x94\x9c\t\x89#$~\x9bZ_\x84\xb9\x9d\x10\x12\xb5\x03N5VU8Fȯ\x1c\xa2\x8e%\x14P\xd4\xfbݫ\xda\xdb\xfb\x06\b\f\x86Cp\b\x02$\x04Q\x19\xa2\xb4\xbb\xda\x10\x9dr\xac\xec\xa2ʽ\x9b\xee\xbak\xbbk\xda\x1b\xa73ٷ\x13\xd1:R\x11%\x1e\x10\xb6\x812{\xf4\x87ީ\xf5\x92\x1dh%\xbb)8\xc9\x11\xf6\x00\xf8\xf1\x01\x0f\x18\nILK\x906v\xf4#\xed\xfb\xb3\xee\xfe\x06,;Ц6\x87\xa0N\x9a2\xcehv\xb7\x0f\x0e\b\xfe\xef\u007f\xcd\xfe\xeb\fOO\x91\xa7t#\x16\x85\x06\xe2xT\x89\xef\xaaBf\x02\x9d\x9e\x84q^\x16#\x9c\xae\x9f\x96?{\xfe5b\x8aI\xe2\xe0%-WZ\x90\xeb\xb9b\xa4A\xa3\x13\f^\xe41\xcd\xd9n5\x19\xf9\xae\xe9\x8aצNQ\x9dY'\xfa\xe6\xdd\xcd\x12\x96\x04\xfc\x91S\x04\xdc\x18\x1f\xa6!t\" \x06`b3\xe9\xf7%\x93\a\xf4\xef35\xbb\x02\x14\xd1fv;\xab\x9d\xd5\xcelά\xee9\x9c:jgf?gr\x9b\xf5p\xffx\x9f \x80\x0f|\x12\xfc $\b e\x12\x94\x1c\x12\x94Z\x14(\xc5\x14$w(ZrS\x90\xe8v+\x9bZ\xd9\x1c\xcf\xd6q\xf6M\xa2\xec\x1e\x9b\xee\xcd\xeaݙm?&s[\xf6\xe5t\x99S\x92Sj\x8e\xa79\x9c\xaf\xe3\xf7?\xad|\xda\xea\r\xf1\xf0\xc5>G\x0e\xcc\x06,\x10bDշ^\xa9\xf4\xaa^\xa9\xc7\xdd\x1b:l\x8a3\x8e\xbdNA\x9a`\xab5\v\x9c26\xb3\x01L\xf9pS\xf2\tAߧ/U\xeb\n\xc2֘\xb4\xbc\xb3\xb4'9\\\xb4\xa7Նt\xb8\x85\x10\xaf!\xdf\xf6\xf6\xfa\xb7\x1a\xfd\x1b\x81l\x00\x06\x85 PMR\xb4\x9a\x909n\x80\n\xcd`\x15\x12\x13(\xca\x10@\xd2 Hy)M\xd2dM\xca\r\x90\x1c5\xe9Ԥ\x13H'ґ\x9a\x1c\xf2mS<\xfa\xe8\xdbq&k\xbc)\\\xcf{;\xee1\xc5\xc3m\xf9\a\x9b8\xdb{\xe1\x8b\xd5X\x841\xdd-3ǚ\x90\x91)\x82B(\x84\x91,\xfb%\xf5\x93\x10\xb0\xb6\xb6\x8d\x04\xc4\v\x05\x05\xdd\xfd\xdbw\x9fo~\xbe\x98t\xed\xf0HW8l\x90\xd4Z\x11\tr\xa4\xe3\xbf\xff=e\xb3\x1a\xec\xdf1+\xe6\a\x05/Ɏ1W?ְr\xee\x12\x0e89PL\xc6\xd2\x01>uo9 \xc5\x181 tØ\xab\xc3uc\xa7\x9d\x91\xee\xc4@\xb3\xf9]K\x14\x10R\xef\u007fbN\xff\xbb\x92v\xfb\x93\xb4\xd4\x1a\xaa\xa8(\xb8\"\x8a\x83y뽻{\x1c\fc\xae\xff\x8f\xe6\xf3scz\xa6\x19&\xaep5\xa7\xe5\x04\xa1,j\xb3n \xa2kN\xc4!\x83.\x83n^\xf7\xf8Uu\x1f\x00@|\xfc\x18?v\xb5>\xf7\a\xb9\x1d\xb9\xdc\x1c\x91r\x18Ua\xdcHR \v\x1a\x8f\x10\xfa\xb9\xd7\xf8Ց\x00\x93\xf3I\rD\x89\xdfˋQ\xbf\xbd~p\xe9\n\x80܍;;\xb8n\xf9\xf9\x8dL\x18\x17$\xa1t\xf9\t:\thFCY\xa1\xed\xdeTO\xa0FN\x1dN~}\x17\xf11\"`\xb3\xa8\xfc\x9f\xd8a\xcf\a\xcb(\xcd?H \x11\x97\x96\x87\x1f\xc4\\\x96\xcd\xe5u\xca0\x13LԵ\xf5\xf1'\xb5\xed\xba\xbd\xbe͔PbnmO\xbf\x98\xeb\xb6\xdd\xfd\x8d\xbf\x02\x18Jl\x8b?\x02\x01\b\x9e\xe5s\xab\xe7\x05\x880,\x0e8\x8cx\xc9B\xf2\xfa\xf6\xbeB\x19\xc7\xe5\x91F\x89\x10\x14\x9f_\xdf\x1bRiZ\x1d\xf8\xff\xb7\xd4~e#\x15j\xb0\x11\xb1w\xfdhOc*&F6\f\xacYq\xc1\x92\x05{\x89}?\xc9\xf3>\xf7u\x1e\xfb\xb6.\xf34\x0e\xceh%\x05g\x94`\x04\xa7&\xd7\xe7 \xb8\xcb\x12)\xa9\xacR5\x18\xe5H\x8c}\xb1\xa7\xffˤ\xb0kܩ\xdb\x1c\x90'J\x99\xdeO\xbf\x00I\x88\xdb\x13\xb6\x9d_\xef\xb3\u007f\x05\x91qOb'\xd6Hǟ\x00BYEM\xa3\x03\x1c6\xc8v\x84\x815\xaa\x10NJ\r\xe5\x15\x01O\x88N\a\x1aF\vNx(1\x92:\x01\\\xba߫C\xe0k\x8ec\xa0b8\x05Q\xf4\t\x13d\xe1\x18[L\x14(el\x1c+2u-\xee\xd0a֘d\xa2\x8e5;\xa2N$\xd4\xf6\"\xa2H\xaa\x8f\x10\xabSF\xbao\xeb2i\xa8\"\x8a\xd9\\\xb3h\x047I\x8c\xf6\xa0\x10fN8\x80q\x97\x8cx\xea#v\n\xa56um\xef\t\xe0\x19\x9d\xb0`\xdbNM-J\x00\\\xf4\x10F\xb7\xc7r\xe9D\x02\x80\x1e\xb5Z\xd30\x93\a#'ꥈn\xec\x11\xd2GjL\x82چX\x14\x1bʌ\xa2A\xaa\x9d\xf1gYs\x99*\xb2Y\xca\xdc\a\xc7^ٵ\x98;\"\xd8\x1d$hb\u007f=\xb9\x16\x19ϛ\x13\x980\xdevH<\x97Vv\u007f\x81c\x9b_\x00\\Y\x8a\x03\xec\xa3\xe8w;dB\x16\x02\x83\x8b\x03N\x83\x843\x1b!$\xce\xe7\xe7\xb4\xe7\xe2\xdeI|P\x98 ~\x13&\x13\xe4\x03d\xc5.\xc8\x03\x1b\u0530\xe9\x02-a\a\xf3\xfaa\x19\t++\xc2\x13\x929\xba.mR\xf8\xe94\xe3cy\xaf\x9e\xb9#\x8bU\xd5\xc2FW\xee\bu\xbd\r\xdc\t\x17i/\U0001cbd4f~\x804\xdd\xf0l\x83\xeb\x0eXS\xf49Ä\x1b\xf71E\x9d\xf0\xbd3@\x90\xfd\xdak\x13\x88\xdc\x15@\x17'#\xa3\xbc\xb6c\xac\xbd\xd9n\xea\xa9 \xba\xf1\x15\xefS_;\xac%\xfb\xeeI\x8a\xd0\xc1+\xbb\xf8.\xf3L\x1a\xd8C\x02x\xb1\xeb\xee\x1e\x1e\xbe\xfaꆱw\t\xda\xcdVۂ\x80\x81\xba\xa8\xe1\xa4\xc0\xc3\xf9Exf~H`\xbd\xe90\x1f\xbc!d\x94\xe8@Q{Oh1\x89\x17\x17\xb1H\xc1\xb6Fë\xd5zs\x1a\x8d7\xf3݉\xb6\xb3Ɯt\x0frv\xcc\xe8\xa9\xd2k\x9d\xbb\x86heS3\xb7ۇv\x999\x84q|\xabO\x82\xef\x97K)\x95U\\\xf2\x96A\xd2%\xa3\xb9\xbb\x02\xc4o\x1e{l<\x86\xdbK\xb8\xff\xba\x9d͎\xa2\xa4\x8ei\xb3\x8f\xf1H\xebG\x80I\x85z\x9d=6\x9aWWo0\xeb\xd9\v|\x15\xde%A\xf7\x1ajdD)!\r\x80\xa9pw\xae\xc8\xee_\x82\xb3\xeb;\xb8\xf1\xa6\xdbc\x97D#\xe9\xffˁM\x90\xc0\xdeNz\x9c\xf2\x05\xb7\x04p\xb0^\x8fCDx\xde\xc2xj)\x845O\xc89\xfb\r\xa1`\xd1\xd2EDX\xeex\xf1\x8d ݒGU\xc8\xc0\xed˯\x0eę\xaa\x04\xa9\xef\xd6ډ\x9c.%\r\xb7\xbf\xb6Έ\xb1~\f\xe3\xf1\xfa=\xff\b\x1a\x16C\x13o\xa6)\rF\x847\xf3\xca\xe7$Z\xa4\xfd(\xb7g\xc1\xeboB\xad\xa7\r\xdbƜ\xc0@\xde\xe5&\xf2\xc3\xdae\xee{\x06\xea\xe2厣\xa0\bl\xa0\xb0f\x8a_\xc6Rx\x99N[\xa7]\f\xae\x9b\a8`-3\x99s\xb4\xa6\xc1\x92{\u007fPj\x01\xde\x19\xb8Wuc9\uf178\xae\xa9\x84\x1b[>\x1d\xea-\x9f.D\xa2\u070eY\xfa\x1f\xf7\x9b\x15\x0f\x80\x1ed\x87\f\xcf\xc2\xd8\a\xa2\xb2+\x18^{\x93\xae\xb9C\xee\xf7\x89\xb1m\xe0\xc4\xd9\xf0,\xa6\xb1@N<\xb2\x90\x1d\xda\xd9\xd0\xf8\xf2\x89\xaf\x1f\u007f\x0e.\x8d\x94V\xf1\xe6M\xf0\xda\x11S\xec+\xd3\\D\x9e+\xa2\xdaR\xa2|\xd16\xb5\v\xe2'q\\T\xe0\xdd\x02\xa6\x95\xf3\x1c\x1e9\x87D\x84\x06X<\u007f$\xedp\x89\x80\xde\a\"\xbb酦\x92\xfc$\x9bҷ\v\xde,\xf9p\x1f\xbbs\xf9\xa5T\xd3\xce\x1a\xdd\xfe\xafb\xbb\xff\xd4NkI\x91\x1e_\xe6\xa1`\xd5\xe6\nF\xe8\x88\x1f\xeaW\x93\x9fV\xff\x94%\xd9\xd1w\b\xad~\xa9\xa4\xc4DԐ\xd9\xc2\xcb\xdd*\xf3\xb3xi\xf2\x1e\xb8y[rZ\xaa\x87\x00\x99[S%\xb4G\x9b\xdc\x18s`F<ㅣ\x85\xb3\xac \xa2\xc1V\x8b+\xfe\xf3!+\xad\x96\xf7\xf5\x8a\xb8؍\x8b9y\x9fk\xc5\xc1fb\x9182\xde\x06s\xde}l;[)e$\xc4\xf8\x89T\x9d\x86\x96k\xad\x83\x92\xe0)\x9av\x8f\xb6\xa99\xac\x01\x84\xe3\x1b\xa7{\xd3u\x13\xf2u\x8ft\x8f\xc8\u07b3@E\xe3\xf4>|C\xf6\xda<\\4%\b\x97Rv\xe1\f\xa5\xb6\xe9\xe5\xc4\xe8\xaa\xda\xf4@\u05faC\xcc8\\\x91\xf8~)\x14#k|\xbe\xb9.a\xebo\xaa\xba\xda\x03\xba00G\x94q0\x1d\x14%\xf1\xfc\xf0\x13\xa1\x99hp\x8b\xa9\xba\rL\xff\x9c\xde\"\x8c+>\x8e\xec\xe6\xb5%\xaa\v^Mˊ\x98N\x9as\xd3\xc8\x06q\x8e\xb4=\x95\x12\xb0\x0f\xbe\xee\xe5䦆\xb0K\x114r\xe7-*\xef\xe7%\xe8\xdah#\xd7%;pP馔h\xd6C=\xf7\xce\xfa\xda\xda\r\x97\x1a\xe5&\x14)\xa9ba\x84\xc6KL\xf8@\xbf\xf9\x9e\xe4t\xba!\xa2~2\xedS]rYl\xbaZ6\xd03ўJ\xdeo\xb4\x98O\xa3V\xf5;\xb9h&gO5\x92RT\x88/}\xf9\xc1\xd2\xc6{\xae\xa5\xf2\x17\x17AZ\xd2&\x87\x19S\xf3\xe2\xd9t\xd8\xca\xf9\x9c\xcf\x03\vͯ\x01\xe9\xa2P\xea\xebC\xa1\xa4\x14\xa20\x13\b\xb4\xb6D,\xfbpbpз\xd4z)\xa7 ]\x80I\xf7>\x1a\x00\x0eQ\\Bl\xc1\"\xba\x97^3R>r\xfd*\xfb\xbb\x04C>\xc0\x1e\x1e\x83\xa7\xe1\x17xPU\xbaz\x1e\xad}Y\x11=\x02\x0f\xf5̕\x16\xbc}\xf5ж\xc7\x10\x9a\x19\n\xe7\r\x1c6-`/\"H\v\no\x85&\x92D\x97I0\xffE2Xa\x89\x95-\x1f\xa9{\x0e5\xc0\x81\x99<\r,}\x94\xd1\x13``6\xfa\xc7\xed\x18\x90ji\xa2\xe9\xd8im\x12'\xdcw\xac5\xfc\xdb\xfaRF,ч\x88%\x1eSY\x96\x84\xbb\xc6Wh\xa36L_i샣=\x9a\x9b\xbei1\xf13\xfeYI7N\xb8Cp\x8dI\xc9\xf0Ĕ\xbe\xc3\x12(\x0f\xa8r\xaf\xbe\xbd0\xab\xdd{j\x89\x19\xf7\xba\x85r\x8bK\xbc\x9e\x99\xe5Тo)l\xd9\xc4\xf4\x873na\xbfT1\u007f\\\xa7\xc3I\x19E(\xe9m\xbd\xf7\xb2\xbd߃\x9b\x93\xc2D\xf4l\xfa\xac\u007fe\xb3\xb3\xc7\xe6$Å\xdfwX\x9e\x88\xccU\xac\xfc(@\x95\x84\xae\xf7M\xf5a\"n\xac\x0e,\xe4*vG\xb3\x1d\x96\x1c\x89̨\x13x\xb9\x8a\xae>\x95G\xd9\fS\x82\x11\x83\x80\xee\xbdg\xc0̉\"\x94Q\xcbv\xa4b\x140*z\xdb\xc8PE\xf4y\xc1ɉ\x8c?7\xaf$\x13\v\xc1\x8e\xd8\xf0%\x9e\x1d\x89G\x87\xd2\xd1\xe4p\xc9dY\xc8&f\xe2\a!\xed\xfb\xc7a6\x94\x8e|\xa8\b)\xbf\x0e;u7#\xc23\xc94\x90mJij\xdb\xf8\no\xf7\xf6\x89O\xf8p\xadȁ\xa2v8j\xa0\xea\x99\xfcx(K\xcb/Z\xdcd\xbb\x03\x8a\x8fx\xc9Ń\xfdm7V\xd1_\\\xa7f\xd7L\xe57\fp\x9bX\xf3z\x16\x1e\xec\x85H7\xbe-\xab\x0e\x96\xb5,(1KHb\xade\x90\xa8,r-\x19\x1c\xa3\xa0\x11p\xa1L\xcb\xef\xc6\xed\xa03=\xe6T\x98\x02\xc62\xa9t\x912ټX\x96k:\xa9\xb4\xb5\xff\bZ\x805\xc0\xcfs\x05\x89\x0ep\x0e\x88\xd2SsT\xab\xb8\x05\x1a\xd5\xeb:.]\xb5\xb7D\"\x94@\xb0\xf5-\xb6E\xb7̑\x06!\x10\x94\x13A\x8d\xf0\x912\xbaɶ-\xf0F\x19}\xb1˒\x802Bǃ\x92\x8dQ\x1a\x99\xd5\x17\xe0\x05)t\xc5ç|\xda#4\x84|\xdc\\\xf7㨀\xf0\xc8`\xb7fc\x10,\xb6\x9f#\xd4\ag\x89\xe91:\xd9-\xd6\x16\xab\xa1\xb9ty\x17 \xdb]\xfb\x87\x98\xe0\xe42\xafZ~\x02\xb1\x84\x00.)\xe3\xe9\xae\xf3\xf4\xb3\xd7\x02nj\xe0\xd6\x1e\xb5\xa1\xdc%R\xa5K\x8d\x98\xab\xbf(y\x90\x02`\x918\x96\xb6C\x1a\xd7\xc7֍\xfa\xb7\xcb\xf7z\x93\xba\x1d\x8aK-N\x8e\f\x84\xf3\x01\x0e\xf5`^+\xa6\xf5\x8b\x9en\b\xa2\xa8\x8b3\xb9\xdbϴ\x18\xfe\x02\xe5\xf4\x80\x9d\x16\x95T\x81\xf23\x82tQ\xe1أ\xa9\x06\b4<>:J0È%\xe5ݑZab`\xe8\xbd\x03\xeavͬ\xfc\x86a\xf6T/Z\x01\x02\xfa\x14\x9caޝ\xc7ГIi\t\x9bW1\x90\x16\xfc\xf1\xfd\x83_\xa9\x90\x10>)\xc3\xfa\x97\xbeH\"\x94\x8a\xf9\xe3\xe9p\x92\xeb\v\x83|7m\x14F\xb5^Z\xcf\xcd~f\x8b\x11\x170J\xf1\xea^\x00\xc9I\x91\x17\xdc3V\xb9!\xe9\x18\xa5\xdc{\xd3<\xa5+\xe7O\x9f\x95\xdb\xd8\x1feB#\x95Bc\xd2\x1a\xd9\xc0\x02\xe8jL\\\x11\x12\xa3\xc4-\xbeZh\x95[\xd7\xfaI<\x8d\xaa\xfc\x0f\xf1\x84\x18q\xa8v\xde~\x96k]\x9bG\xc3\xce\xd5TD\xbf?S\xa9\xcb\xd9\xd6/\x1a\xc6-\xd4\xd7%ݒ\x89\x94\xd9\xe87\f\x88\xfew\xa6i|C\x16\xcbI\xa1\xc4q\xf1wc\xa8\x80W\x01\x9b\x14x\f\x9a\xb1 \xcf\f/7\x04\x81x\xac\x82HO/\xae\xe5\xb5\x1d\xf0o]\x91\x9e\x0f\x94G]\x8ay\x8f߃\xeb\xfc\x87\xfb#\x85\x87\x1f7\xa9\x8fb\xcd\xe3$\x93t\xc7\x1c\xaaR\xdb$ \x06\xbe\x98\xe9\u007f]\xe3\xb4a7\x1b\xcdF\xa3Ѯ\xaf\xb2\x8f,n!r\xcb\xdfI|2\xc0\x10\xbc\xe3\xb88\xea\x92x\xff6\xe7\x99gS\xa6h\xb1\t\xb2\x93R^^\x93D.\xf8x\x8aM\xd1MS?漞'G\xfa#\xfc~\xe1+\x9d\xac\xba\xc4\xec\bv4\x8ad!FyT\xdc9\xf1-\xb2fVa7h\xfbB\xae\xcb\x174\xfe\xab\x9f\x96\xe8\x17,\xa92\xbcƉ\xc4\xfd\x15&vTHMqp\xf04\x14?\x02R\\\xb4\xbd\xb2\xaa\xbeXa<\x91\xd84\x10\xee\x96\x1c@Mi\xacH\xd4D_\xbe\xe8\t\x9bE\x11g\xaa\xcfR\x89y\xb1M\x9a\xd3\xd1lT\xfeؠJݮ\r\xab\x96y\x0fc\xca\xce\"\x99HJ\xf4, 6\x8au\xf6/ڴ\x9b\xe2\x0e\xad\x9d\x04\xc0\x0f\x8b\x94\xe9\x89y\x8e\x00\x97V\xcb\xd9\xe6nJn۟H\\P\xc5R\xa3Bd|\xd3\x144\xb9_\xe8\x8e$k\xee\x9c\xcb\xc6\xc0\xc6.\xb9\x9aw\x12\xea\x96\xca\x1b\u0099\x14\x01I\xa0pS\xbd\xfd$\xe4\xfc\x1c\x96|}j\xce\xd6\xf49\xc8\xda\xe4\xa4\xe9\x13\xc3\xfe\x11\xa1m\x87|\x831\xd1ߘ\x9e\xb7\xb7\xfcn\xbe93\x839\xbe\x1f\x01\xeb\ueb10\xd45q\x02S\xfa|\x86\x9b\x9fxW\xed9\x13\xda\xdc\xec\xcd\xeaB\xb2\x96VZ!\xba\x99\xb8\xcbm\xa7K/\xfbLn;i\xab\xeeu\xb3\xed$\xe6\x15*\xcet3\x10\xd6Ͷ\x13\x8c\xd7@}\x00\x14\xb0\xa4\xb4B{\xf5Y\xef\xe2\xb8\xe4\x9fԑ\x94\x14z\xab2J\xe7u@\xdfa\xf7\x16\\\x19M\xfb\x89\x87\x0eR7o\xb3\xf3\x18dz\xe8\xa0\x15\xa8\xa0\x9be\xb3\xf27\xde/$4]^\x95\xc1\xbf2k\x8a\x1ch$\x8c\x13=\x1c%\x00\x89\xe51\xeeI\xe7B\xd2\u0603 \x83\xcfH|\b\x02\xf8N.[\xc9M\\\vL\x97\x8c\xfbb\xda\xed\xda\xe91Mg\xe6\xf2\x1a:\x9dNV._0\xb1\x00,\x9e+\x16\xe1,\xb8\xa4h\xddt7\xb4l8\x8ds~IV^\rN\xe5˼M\xf2\xb2\xc3\u007f\xf8ؑj\xe4\xdcك-\xa2\toܮůQ\xe4\xc1o\x10[m\u007f\x88\xa0j\xe9=r\x03\x9c\xfcm>\xf1~z4$M\x9a\xe1\x17\x1b}z \xd5\uf6c0s\x00\x8bh\"\"\x9e\x87\xecu7\xb7V{Rûݦ\x00\xb8O\x11-\x9e\x85D9V\xd6٥g\x86IʎK\xecLg۶B\x10\xffT\x0f\xa8\xf3P\xb5'\x87K\x17\xcf\xca̦\xef\n\x0eqW\x05\x84֒\xf33e\xb6\xb3\xa5\x12\x04\xffp\xe4\x86&\x90\x96\x88ے\x89\xe6L\x8b\x18hp\xb3\xaa\xa7\xd5N\x83aS\xae\xa3\fw\xf9\xa1\n&\x98\xd4\xe2\x85;e(\x87,-\x027v\xcax\xa3-\xbf\xdbw$W\xa9\x17\xcfnX\xf3U\x9f\x9e\x87\x85\xb8\x89\xea\xf7\xc6t8\x89\x9b\x11\xb5\x91\x99\x03Y\xe7\x11\x8a\xba?KM\x9fct\xbbY\u0603\xbep*Շ\x8e\xfa\x89\x05\x8b\xe2-\xed\x84\x1c\xee\xcbБfL\xac|\xc2[nL\x8a\xe7\x9c\r}4\x89{5\xd9\x18頠\xa33\u19cc\x1d\x15\v\x88n\x8a\xb0\x94$$,+\xa3DN\aԄ-H\xedV>\x98\xd7H\xa6\x8e\x98\xda\xf9Os\\\b\xb7\x05\xff\x95-\xd1;\xc0W6\x00N\xf8\x95M\x89\xdd8\xb2\x9dFi\x95\x91\xd4;\xbe\x8d\xa57\x19k\xf32\xb16%\x02֒\xcc\x0f\x1ca],:!\x8dʲڽE,\x1d\x9f\xde{U\x84\xfe\x01\vnaw\xbb\xb1\xf9\x85Ng\xa1\x86.\xad\xf2I\a9r:j\xa0\x84\x15\xff\x92\x8c\x1a\xb0\xabF\xedb\xacK\x85\xc7Ψf)*c\x96\xa6G5<\xf3\xccC\xa0\x98\x00\x9f\x95.g\xf4\x15]\x04\xa8\xeb\xafk\x96\x92\n\x19\xb6\xa5\x81\x17 A0\xe3\xbe-\xbe\xd3٣\x16\xa6\xa9v\u007f\x04\x86T \xb8\x05\x06\x0fd4K(\xa8\x16\xc5Yq`\xb2\xaa\x9b(u\xdd\xe5{,\xbd:0*$|2\xec\x0e\x83\x9a\x8b/\x04I\xba\xcb,\x93`E\xbc\x86\xe8\xd8\x14\xf1xP\x1b\xae\xb3#q\x84\xb0\xaf\xcf\xcc`\x00\x9b\xe0/\xeb:\xea\x80\xc8\xd2\xd3\xd6';\x8dىV\x06\x87\x11D)˴\f\xce\vr\xc9\xfc\xe3\x8f\xf689\xbew\xa2}[\x01\xfa\x86F\xac\x88\xcb\b\xeb\xa2\xf9ޜ\x17η\x0e\x9c\xbe\xa1\x1d+\xe5\xd2\u009ah\x9eKH\xde\\\xe0ǚU\x8a\x8e\x1d\xa8䬂J\xc0V$pUj\x99|c0\xcb\xee\xdc{\xaf\xde\xc7L\xf3\xebA\xab\xda?\xe8V\xe6=\xa74\x8d\xf2\xefS\xba\x19Ŵt`\xf5\xc5\xc6d\x99\xff\x89o\xfc\xd9d\xa5b\x06UP\x06\x94\x17\xcc\x02\xf0J\xa5x\x13\xd1g\xa4\xaeJR\xf8r\x9dO\x85\xb9\xcfs\t\xf3\x1d\xc6\xc1\x91\xa1\xda\x184Mw\x98\xa9\xdc\x1e\r\x0f\xe8\"\"\xf64\x142\xf7\xe1\xe8\xe0`M\xc4\x1a\xf1D\xba/N!\x89\xd5v\x823չ\xb7\xf2\x81\xe1.\x8c\x15f+\x93@xO\x97V\xc8q\xea\x9bj^\xd7Cߪ\xa9Km\xae\xf7\x9f\x11,\xe2\xb18H\x049\x8cZ\xa8\xac<&\xb8o\xb6\x85\x1f(\xd1@\xff\xb0k\xa9\xf1\x1e\xdf\xd6M5\x9b\xf3\x1f\x8d\xa1]\xb1M\x85\xb8U2\f=\x10vpB6DXj`\xa9r\xaa\xf2<\xf5w\x95\xc61\xe6\x99Y\xd0:\xd5 \xe7o\x91<\xbf\x009\xa2;\x8c\x01\x9d\xf8\x8eF\xc0\xd5\xfa\x93$\x1c;2֜\xd7j\xb4\xb1\x10\xfa\u07ba\xecx,\x16\x12\xcb\x1aʁ\x9dC\x04\xc5Rĉt\x18\x16\xb8\xb0\x12$\x83\x1cVJf\x1e\xc1f\x88\xc59\xc7)\x00\xafa\x999P\x89\xab&\xe0\xf8\xd1\xc56Oo\xbe\xd6\x03\x17l\xa9<\x9d\xd4\xf3\xe2\x02\x19\xf2\x19\xefds=#\x013\xc5s\x16\x8f\xb5P-\xd0bD\xa0\xd4\xfc\"\x8d\x0f\xec[:\xb0wɺ^j\xf9\x89Ӂ\xbb\xd0Qej`\x8c\x8b\x97Tq\x92\x05=\xa2\xfa\xb1\x94H&\xa3o\x8f\x1b\xa1\x1bkĉLD\xdeW\xa1O\xfb\x86\xc2\xf9\x94\xeb\xca*J3s[\x19\xce6\x9dj1\xf0@\xd9\xd8nr<\xaeξۇ\x86#\x89\xcd\xd2@\t\x880\xbf\x9bc\x06\t\xa2\x9d\x1f\x05\x99?ﵝ<2\x8aD\xd5Ӧ\t\xbf\xe8}\xaf\xb0Ts\xcd\xd9S\xce\xfd\xd0\"\xe2\vR\xcd\n\xae\x95\xa4.}\xdfoZ\xde\xcd\x18\xe3\x87\xf9Fo*\x98\x95\xa7ݗ\x87\xb6\xff\xb7\x96\xb5:\xdd\xf4\xd6\x1b\xc1\x93\xbc\xc17\xc9\xed\xf7H\xc2\xf2䍚\x0e\xa5x\xa1\xb4]\xc5\xdb\xc7a\x196\x1ev5\xed\x12R\xfd\xa0̾e1\x87\xed$XL\x85\x9b\xba\xc3\nJ\x89aa\x9a\x11\x13݆,\xc6\xf3섐\xcc\x1a\"3-\xcfG\xe4!\x1c˥8\xb3\xb7\xf28\n|\xe0T:S\xdeP\x93\x8c\x02\x1f\xb8\xb6\xf5\xf1p\x1cMR\xaeY\xdeb\xf4\xe6\xa5{\xef+\xbbO\xfdeۛ2\xf6\xf2\xd7g\x05\xa7\xa9\xd3u\xae\xe7\xf7V=\xfaU>-\xc5\x01kb6U\x9f\x12\x92\x92ЩpZ\xe2M\xbd\xd0O\xa8`\xff\xb2\xdc$W\xe8D\xc1y\x1b\x8e\x11\xb9\xf1A\u07fb\xa3[\xc04\x05\x8d\xfca\x91\xfcJ\u007f?\xaefD?=\x97\uf449d\xb0\xaf(KD䴱:\xe2\x9cD\x1e\x93/[\xe5#\xa2\u007f\xf5$A\f\xc5\xfb#KH.\x11:\x95\x9ex?%\xe6\xdbV\xf4r\xb7\x15@\x01[B$\xcc}\x9ec\xf1o\x18\xe1\x93\xdbS6`LPfM&ɔ\x80\x9bA<:\x8a\a\xaev\x90\x9eÚ\nQ\xd2~P\xdf\x1b\x10w\xa1\x92\xef[\xeb\xed+\b\xf7\x9e\x14\xad\x91\x86\x8f\xfb\x01`+j\xa3 V\xdf\xc7+\x8f\x9eR*\xe3\x01\xb6\xb5u\xa3l\u007f!\x14\x0e\xa3\xfe\xea|\xfe+'\xafKY\xfe6\x9b6\xb6\xcd_\x06\xeb\x96ud\xd2}_\x03\x87\xac\xdc[\xffyuۘ\x95j\x8e\xa5\x00\xb0\xbbo$\xc6\xe3Y=\xa0yjR\x9c\x11i)\x8b\x16\x99\x06b\x90ԋLaD(\xbdX\xfdU\xcawI\b\xabڻZ\x80\x16$\xf47\x02ڻ\xee9\x1a\xb9\xfa&\u007f\x99\xd64Z\xc3\xdd\xd6'\x8c\x93DF\x9f\xf5\xdd\x10[N]\xc5~\xe6d\x18D?V\xf0\xf6\x17Q\x95W\xa1\xcdͲ\x81}vS>\xc1N\x0e\x03m\xf7\xc9\xc3+\x03S\xdeq\xf0\xb8\x0eH\xb0\xffa\xff\xfa\xcaU!\xf7Β\xaf\xe6\x86\x1a\x17\x89\xdaWb_+\xa5\xab\x8d\x99\xe8U\xf4\xfeO]\x8a^\x1b\xbf\xec\b\xfcl5\a9\t@\xc5\xe41\xe6'\u007f\xeb\xe0\xd9A\x9f^\xfe\x83m\xec\xaa\x12\xfd\xc9\x11\xb2o\xb1\x12:\x9b\xc19\xb8ף\xa3s\x19\x0e\x9b-\x13\xdd\x00N:\x1a\xbb\x11\x98\x80tD\x01-\xc6zkS\xb7\xeaj\xb5a4\xed\x9frc\xb4\u007fz\x0fF\xfbۻ \u07bf\xe1\x84x\xff\xdav\x88\xf77[\x00\xbcäC8\x96#7\xb6p5\xdf+\xb3\x86\xb3 \x1c\xe2~\x1d*\x85bJJY\xdczֳw+\xfc\xb5\xcd\xd9\x02\xef\x10-\xc8\xeap\x99/L\xccL[cg\xd8\xf7\xd1\xcdn\xf4lc\xb8\x93a\xffP\x89\x86\xd4\xcbH\xabF\xe7\xbf\x02\xbb\xbe\x9b$}\xd29`\u007f\xa3\xa1\xcb\xd6\x18\xb0\x91\\\n\x82\xf4\x0f83\xe6\x12Ym\xf01b>\xbf~ƽJ\xae\xf9\u0602\xafϏ\xc9\xfcyBs=\"\x92\x86\xe8\xcc\xc3f\xed(zK\x89\x05\x1c\xf7M\u007f\xc5\"\x8d\x1a\bH`\xe5\xc6w\b\xb5c\xbdEd\x85\xea:b8\xae6(\x029\xb0\x18\x89<\xef\x10\xc9c\xffl\x8dݘ\x1e/\x85\xbd\x16\xfc\x10k\x9d\x9bg\xea\fG\xa4\xb4\xbd\x8c\x01\x91\xb0\xc9\xda\xe0^\x02ESE)5\xd6G\xeb_^\xbd\x8fk߇\v\xf2v\x89\xbf\xd5̚\xd3\x11}T3\xff;6\xf1\f Wv\x15TCP_\xa0\xf6\xd0k\xf3\xc2\xea\x8c._e\xbc\xe0єNJ\xd3L\x00{T\xc9!\xb3\x8a6\x93j>h\xf8\x9c0\xdd\f\xba#\xe7\x86\xdd\xd9[\xaf\xea㗚\xa9\xc0\x86\xccK\xc3\x01\xb1z\x93,\xfe!\xda\x133\x88\xa6\xd22\x98\xe7\x06\x81\xb6:6d>\x1d\xa5\x05himE\xd6\\\xcc=\xf0H\f\xba\xd4\x1cZ+{6\x9c\xac@W\xcaʯ&\x11lC'\x12\xc2,\x92\x10\x11\xd0rX \x14\x12\a!\x15\x1a8\x9f(\\\xe3̭2\x98-\xc1P8\x0eh\xe8\xef@\x0e\x92\x14C4\v\x9a\x8d<~\xb3\xa1\x06\xd9\xeeZ7j%)\fe\xfe\xb4\xc5\xebeF\xcb\xfcpZ\xea'15\xb1\v\xd3^6\x1aB\x83\xcd\x05\xc83\xb8nc\x99o#\x14~\xba\x88\xc2²q\x98\xafR\xdb@!ա\xf7\xd0 z\xc3^\xddKs]T\xde@\x83TN\xb3T \x85,S*@\x017\xd0\x13\xd9\x17C\xbe\xaf\x89ī\xdbɅ\x98\x0f\xf6\x93\x92L\x0e\x9d\xa8iQ\x86N\x95\x1c,\x84\xc4\t#:\xe5\xceRѪ\xbb\x88\xa5j\xf8\x92\x17\x179\x97\x05\x15\xe21\x80-\x82Y\x99\x97P\xc7N¿\x00\x8a\\&\xb9yL8\xafӹ\xcd\xf7\x89&0\xcbc\x92\xc1v\b\x14\xf0Ɖ\\\x8e\xc0\x8a\xa1\xf2J\xb5A\xca\xcd;\xa4\xf2Q;\x1c\x95]\x85\x89\xfdI\xb4M8\t\xd9s\xaf\x02\xaa\xd8\x14Mf\xf4?\u0530\a\x1c\xa1I\x12\x18\x9a\xb2r\x1b\xbbr!\xd2K\x869я8p\xd9}Q\xbf콍\x8b\xe7g\xfb-\x84*\x0fsm\xb5~\xc5X\x06\xd7P\x1a0d\xf8M^\b\xb5\xf0?D\xc5\x18dI\x82m<\x86\xa8p;\xa1\u007f\x06y\x8e\x06,\"ۦ\xa66\xad\xe4v\xcap\aT\\^\xcan\xf4\xdb\xf7\xbe\u007f\x053m\xa4>8\xa4eC\xae\xf1\xdcN}\x10\xad\xcd\xea\xedcà\xe6٭$s7ۼ\x13\xfa\x9c#յR\xa5{b\xba\xb94\xa6\xf7\xcbvM\x9dq\x84\xb3\x11\x83l)<\x8bV\x94{ě晐\xb12P\x99\x00\xfaT\x19\x80'\x1dD\xd8\f\nVt\xbb\x02\x90\xbc\xce\xf2\x15\x9d\x87oP\xadaU\x92\xc9\xe36`\x88\xa0\x01\xff\"\u0081\x81Qe\xef]k\x04a-\xdf^v\xf0O\xea\xf4\x86ճ\x86\xfd\xf8\xc4j\xfe\xdf\x12\x98ְr\xcd1\xe3f4cs\xba_%v%l\x93\xe3K\xdfZNi\x92+V\xf8\xee3\xdf'\xb7\xa4\xc4\xd4\xe0~\xe7\x94\xebN\x9bM\xe0G@H\xef\xe4\x1dB\xeeb+\xd3\xfd\xca\xee\xa7v\xddVFq@\x18\x9bݱuKZ\x9dh\xaap@\xec\xedE0\xf7\xf8\x81\xbf\xe4ua\x81\x97\xce\xf2SXd\x84\xee\x85U\xb8\x93\x98K}ԯ\xd28G\x81X\xc7K\x02\x19iI\x04\xac\x82\xed\xa3%\x9a\v\xc7\xfb\x83\x00\a\x19uR)\xb1E\x9e\xe0\x92I-\xa8ږ8\x9c\xc6|\x0e1\a\xd6\x12\xcbG\x12\x80Ξ\xe0\xe6f6\xebȀ\xee=!\x16K\xc0F6\x92Qf\x1e[X\xb1\x15\xd2\xda~\xc0\x10\xf4\x97_\x8f\xe0j\xa2\\^\xea͋^\x14k\x85\x94\x9a\x9d`\x93\x88\xfe\xf9D\xf8\xb5s\xf5\x05\x05\x06G]~\x96㤛y\x13\ao\x10\x02\x01\x8a}\x8e\u007f\xd1;+i%\x8b\b\x1aN}\x87Q\xbc\x9c0\xbf\xe5\xfeԥ\xedU\xbf\xc9u)M\xb6\xdd[\xc6Z`\"\x9f7\r\xb9\xe2\x1a\x0e?/[C\xe4{\xccl\xf1\x82)\xf2$\x18Mr\x89\xf5\xc0\x9a|^\xba\x04\x91\ta\x99\xbb\xe2\xb7\x10\x03\xfe\xa7:\x88\xa0\xcd\"\xe9֊\x9d\xdba\t\xc2l\x02\xf2>\x1b\xdeh\x00\xc7\xe1y\xa2\u007f\x80\x14a\xd1\xce{\x9e2>\xaf\xfeCP\xae\x89\x90\xb0L\xc5\x0f\x10 \x9aj?\xd1n\btg\xe5\x9e\xd8\xd3]\x03\xa6\x16\xe1S\x88\xb8\xf8\xf8{\xe1\xb5UӇ\x05\x91('\xb3\xb5b\xe7\xa3'f\x8f\xe6g0Ӄ\xdd\xea\x18\x95\xc4LPA\xa5Mtd\x15\a\xcc)\xe3\xb32ú\xe3Y!\xd6v\x00\x8e&`o\x85\xaf\xfe2\x12P[\v\x1b\x9daޔ\x84\xbb5\xfb\xc0\fS\x87|#+\x80\xb2\x017J\x05\xa4\x8a\n#\x1bȸ\xcc_\xab\xd5dU\xa9\xa46#V\x19D\xae\x86\xc0\x9bB\"K\x83\xf7\xd6|\xa2\x1a\xb8\xc0\xc1\x19\x16\x80)\x02o\x90\xd0\x10\xaatk\xfdl\x03\x9a\xe6\xc8,\xae\x14\xfbl\x11\xe8\xa1\xeb\x0f\xf3U\x1f\xec)ݹe\x985\x81\x15\x96O\x03\u007f\xa1\xa9\xa7\x04\x93\x93\xaf\x03\x89y\xb5UAt2\xd0_\xb7\xe0\xfd\xee\xf1\xd1\xee\x03\v\xf2n53e*\x83\x831\xbb\x93\x93v\xf4\x15\xb0\xb4\xde(K_H\xb5vV\xcbʉ3}\x12\a,\xd5\xc6A\xb4C\xe0Uƍ\u0602\x12\x94Cu\b\x99\xab\xc9t\x0e\xac\xf9i\xce-]\xb9`\xe6\x05\xce\xd6\xe9\xf9\x1b\xcc7\x84]R\xe6\x0f\r!zs\xb2N\xfb\x96t\xa3\x04\x8a\x91&\xbe\xc5̉̄k)\xbc\xceSL\xa5\xcd\xf4\x9b\x0f\x84̹\xaey\x117\x82\xaa$\xb4\xb0ϥDJ\xaeN\x1f\xcad\xe5\xec\"\x89\xd4\xf9\u007f9\x1c\xe9\n\xe631 I\xcd\x17\x97Z(^(\rlw6\r/\xf5@\x8eY\x8aB\x8e^\xde\xd8\xd9}\xb0OT~9c\xbec\xc2\xf2\x8e]\xf9\x9a\x95{\xe2)\xcb\xdd}\xee\xb9D8\xed$\x13{\x13\xfb\xf0\xde\x13\xc7yc\x96,\x12ʤ\x80{\xf6tA\xbaW3z\x10HI\xba\xabm\xc3\xf0D\xc64ܤU\x04\xfd\xdaT3d\xa6\x0fI\xd2\x0e\x9d\xf3D\x92)\r\x12\x8c\xe0I۬\x8d.\x01d\xeb~\xe9[\f-\xfbK\x96^2\x80Zc\f\x93\xda\n\xdd8\xfd\x83u\xbe,Y\xe9\xb4^\\\xd9_\xa6\xacԁ\xc1_\xf8+\xda\x17cJ\xa5\xda\x1c$\xa3\\2:ZW\xe6\f\xd5b\xd4B\xa0\xedw=\xd7\xda[1'N\x03\x9fYVz4\x93\x1e;\xb3\xfc(\x97fzN\xa7\xc4\u007f\xe0U\x81\xf3f(\u007fp֙\xe0!x\xd7#\x83\x97\xe0\xb6\xcfL\xa9=#\x16ŋT\xe5hn\x05\xd3b\x8b\xe4a˳\"\xd6\xc5,\xccT\xe2\\o\xd4!\x82\xf0@@sN%\xa6\xd6\x18|\n\x95\xc7\xe7t\xe8\xe4Xj\xbb\tj\x1b\xb3\xd3\t\xbfQo5\xba\xfd\x8a\x9d\x1a\x98\xb9\xb3\xedo\x8feF\x03)\x19o\x10\xf9\xf4\x81\x90 \xeb9˷\xcf:\xe1h*'cJ\xe5\xf5孏\x98\xbc[\xce\xd9{\x12Ȅ\x06Nf\xa5nz\x99]8F\x11\xbf/\xea\xa7\x1b|\x92\xba1\xcav\xed\f\xffg@\xd4J:\xb1Y\xcc\xefնNu\xda:\xa2d\xea\xe6hH\xac\xa2\xf0\xf6o\n\xa1\xf8\xbf\xbbt\xbcM\x90\xc6`\x84\x84R̍\xbfR\xf4\xf7i\xc1:|N\xdb_P\"\xa0\xa2\xfd\x88B@\xb0\xb9\xb4\xc8 m`a\x9e\xf5\x8b\xa2:M\xfd\v\x8b\xd0\x02\x12\tc2\xcbŨ<\xc8\x15\xa6\xfdؓ\xb4\x96U\b\x8fO\x8dS\x02\x92\\\x9d\x81\x00%a\\A\x05\xbap\xe7\xf4\f\xe4\xf8ꄯ\xf2\xb1\xbde\xc6\\\xe6\xc8A\x92\xac\xa9\xa9\x9b.̰{\xa7\xd6\xeb\xacw\x86ǿ~\xd1\xcd6\xff\x8e\xba\x99\xbf\x88\t\xf8\x1c;\bs2\x83\x14ŋ`\xf8\xb1\x85W\x8b`\xfdTyP\xf7g\xa8\x01ee0\x16\x87\xf7\f\x11\xed\xf400\xea}/ǔ\xbc\x8d;h[tG\xf9D\xbb5\xd6^E\xbf\xc6#\xe3h\xf7ȍ:f?\t\xfb\x05u3z0\xefڎ\xef$\xeaT\xa8\xa8\x9e^T\xcfAhz\x05\x12\x97\t\x97x\n\xe8I{\x0f\x81\xdd5\x1b\xa6\xe8\xce\xdd\xc0\x8c\x8b\xf8'\xe4r\xc2\xfc\x19\xa5K\n\x80\x9bz\x8eo l֢<\xba\x9e\xd5Nl\xb2\x8c\x9d\x10f\xa8\xa7M\u007f*\xcc~\xd0Uʏ\x87W\xf3\xda_\x9f\x04?\a\x96v\x1e;(A\x80\x19\x85\xa8ͺ\xdaR\xc3^\xff 3\xb7=6\xd26=2\xe6n\xeb~}c\xaf\xbd\x15\a\x90O7\x93X\f\x86\x95\xe0d\xba\xac\x01J\x19\xd6|\x8f\xdeLP\x9cޝ~\x0fͅ\xa9\xfa\xf18\x9a+QD\xec\xf4\xe0\\\xaf\xd4\xe6ҭ\víS\xc3\x17\\\xa7=\xf7U\xd9v\xcc\rM䅚\x1ec\"a\xfb\xabK;\xcfA\xae\x1c\x16=ԨĚ\xa9\x94\xb9\xd6k\x81\x01J\x84N\x80p\x9b\xe8M%AR`\xd1و;\xd8\xf9(\x13\xfb\xbd\x875\xc3\x10W\x9a\xbd\xdb=\xb5\b\x8b\x86Y \x9dg-\xe4^\bv4\x81\xd0X\u007f\xaeى\xfa\x85J\xd8@\xee\xd7=\xf8c\xc73\xc5\xea\xfc\xec}\xca*)\x12\bu\x92\xd6\xca\xffb\x1b\xbcT\xb9\x13F\x9a\x1b'\xd3|\xb9N3\x97\xc1\xb9\xe6E\xdf\xde\x00\xb2\xce9\x89\xbbڪ)1\x90\xd0!\x12G\xdb\x1a\xbd\xf7k8\x92\xad6\x94D\xef\n~H\xaf\xb8\xbdGp\xc0\x04%\xa8Fz3\xee2\xc1\xc4M\x1a\xdfJ\xa2aZ\xde\xd6?\xabc\x8d\xe0n0\x9e)?\x8bh\xe1\x04N\x17\x80\xc0u\x9e\xcf\x1f\x9a\x05\xb2\x1d\xfe\vm3\x1fH\x8e~\xb2\xc1\x1f\xdb\xca1rD\xfc'\xbd\xac\xd6\xd71\xfb\x9e\xe0\xc7\xd5\u007f\x91Kr\x9dt\x9bs\x01J\xd4J\x0fs\xbe\xa3\xd9\xf6\xb3\xa6\u007f\xbeָU\xd7\x05\xcc\xcf\xcd\xf5\x05\x10\x9e2\xb4\xf5\x14r^\xa0+hNzg\x96\xb1l0'\\\x1c/e\x91\xdbtXԐ\xd3v\x9dl \xc9j\xe7cm}!Q\xd6\x1dϼ\x8e\xe3t#\xd4\xe6z\x88\xb6#]\x16\xdb\xd5\xda\x1f\xa1\x1fϕ\xd7\xdeO\x9c\xd1ׇjE\xe1:\x93#\t\xf76\x81n:<\x91N\xe7\x10\xcd\xd1u\xc7i\xb1\xa6\x8d\xe1\x18\xc9{\x85z\xde\x18\x0f\xb5\xd71ʞ\xa4\xea\xfe\xe3\xa3\xebUV\xc9\xf2l\xfd\f+\xd1a\xc2N\xf0\xc2W\xab\xe4\x8d\xc9h\xbb\xcb)O\xa72ymEl٤\xafA\xd6\xd57\x1f\xa4\xa5\xabYQp\xf0\x15\xf6\x06\xb1fB\xac\x8a<8\x8a\x9f\x85\xbb;\x02\xc6\x1f\x05\x8f\xe5\xf4\x96\xf8'gKR5n\x99\xf6\xcc\x06\xe6\xbd\v\xc1T@\t\xaen\xbc*\xb6\x17\x83!=\x16a5\u007f\x89\x9e\xac\xa2\xa1\x83\x88\xb0Z~CW\x97\xd1P^DX-Xf\xa7j\xe8\xfcN\x80ű\x10\xbdq4\xffO\x12\x06\xc1I@\x15\xf9\xe8S\xd2\x12\xfa\xc0\xfb}\xf2Xh/\xed>\xdc,b\x96\xe3\xe7\xf389\xb5\xc9\xf4\xee-:G|\x05W\x05\x91\x92)\xdd\xdeb\xdf\x1f\xfbA\xc7\xea\xf85G\x93\xde<*ٕ\xdb\xda:ğ\xa3\x06!\x14]gj~\xabO\a\xdf&\xff\x8bU\x87N뢹8\xd7\xdb \xae\xf8\x94\xe5\x87\x13g\xf1\f]\a-W\x1aW\u007f(W\xec\x87NI\xbc3\xba\xc3\x1aN\xd2\xc6\x0egr\xe3\x9e3|\xb7\x92m\r\xf2m\x8d\xa0'=[n\x94\ud7acM,?\xe6\x8c$\xb0\b\xd1HD\xae\x93D\xb2-\xae\xdbO\x18?5u\bX\xad]˓\xec\x14\xd33\xfa\x12\x1f7\xf9>\xab\x17*\xe6\x87w\x80\x01g?\x9a\xa8\x95*!\x92\xe9\xf8\xfaJyT\xa2@\vU\xb3g\xce\xd3z\xc5\xd1I\xf1\xba\x95\xcf_\x17\xa4\x06\x857\xd2&\xf2\\t\x8c\x10\u007f\xf0H.\x1fY\xf1Z\xe6(4Y'\xebd\xc2\f\xd7T\x87\r\x91F\xb8\xd2s\xbc-\xecqy\xbaa\xad\x127\x1b\xd3\r[\x8d\x8467K&\xc3J\x88/$\xe0\xb1c/\xc3\xd4x\x8c\x10\xf7\xbd[\x17\xc4\x01\xa1\x80ᶏ\x0e;\u007f\xf7Ī\xa2z1\x1aFv\xf8\xa7]G\x84'ڏ\xeaQ\xafBSO\xc2\x03\xfb\x89\x0e\x95\xe5\xbb\xed\xe9\xfdІ$\xd0\x01\x13y\x99(\xde\x13\xf0TS\x93\xfc-\x18\x1e;\x96hűz\xbe\xcc\x11T\x9a\xc8%D\xe1\xa3\xd7ts\x04\xa0\x88\"\x89\x89=\xeagwU\x12\x81uD?b\xa1\x18$\x1a\x1eZ\x16r\xfc9\xe8\xf7G\xbc\xce\xeb<\x99\x8c&\xfcÑa<\xc5v5\x9f\x930\xd1]\x19f%S\x17\xf2\x89\b\x9ea\x1f\u007fn*\xf1\xd7\xeb؊\x9d\x9d\x1d\xb3oмb\xda\xce\xfd\x828pJ9\x9f\xc1\x82\xd8⠚\xc2'\x98-s\xce@\x86r\xd0\xf0넅\xbc\xa9T\xb0\xba\xa5AX\x81\xa4\x06I\f\xd1\\8m]{\x83Of\v\x95`#\x1c\xca\xd6\x13X\xb3T^f\xba\x195\xf7\xd4''\x1b\xd9\xec\xc4\xec\xd0\x18\x16\xf8W\xca2Ϸ v\xc5sE\xe2\\\u007f\x9e\xed\x88Q\x18s\xb5\x9e(\x99ː@A\xe8\x14jR\x14\x1e*Z\xe8\xfc\x19\xb0\xe5a\x91\x88̳\xe8\x1cSl\x01і\xa2R\x8c[\xcbܜd\xbc*)\x9dɩ\xbb\x9c\xc0\fP\xe4¢ĽHt\x18\xa3o\xfd\xbc5\x9c\xf48\x89\xc9.\x84\xc2]\xc0h\xcb\\s\xe0І؋\xe1\v\xda\x03\x10\xe6\xd7?\x18\xf5Vs\xf1\xd8\xe8h-U\x83'\x89#E\xf6g\xf2\x89\xbam]\xf4\xc42NjWl\x19\xf6rm\xa9Z\xcd\xe3\x12\x97\xa3\xc3\xc3#2\xe7\xf6BE\x1875^^\x87\xa4\x03a4\a\xda\x04\xc5wU\xa9\xedK\xcb'g?ge\x93\u007f\xc8\xdf\x13213\xce\xe6\xe7\xb8\xccǸ\x9bo`\xd4\xd7lKzP6^\x97 \x88$\xf7$9N\x8a\x90\x14\x8bWvg2\xf9H\x02Ϗ\x93\xaf\xe6CR\xefߜa7F\x0e\xa1/\xe3\xb9\xf13\xf1\\8\xad\xfb\xadF\x84\\\xb9/z\fP\xcc\xef/?\xfd\xbd\xec\x1e\xe8\a\xee\xa7\xe9\xf5{x\xd6\xe3Ӽ\xf7]\xaf\x0f\xb3\xbe\xbb\x00\xf9\x89\xeb\x17/\xb4\x17^9\xfa@7c\xa3\u007fޥ\x0e\x1aG\x1b^2\x9f\xe0\xe6_\x96\xc6\xc2Be\x9a;b\x96\xa2~\xf3փ)\xc7Ό2\xb3j\x80\x8b\xd0 \x0e\x95r\xf18]'\x877\xda\xf3\xb0\r\xf5\x8b\x89\xc9 b\x8cC\xdfh\xc7\xfaT\xe6\xc5d\x97\x87\ue635\f\xfd)\x04\xa6+\v\x92\x89\xc5\amD)\xb2\xf5\xd5.5\x871\xd1-\x14\x00\xae\xfc\x1b\xce|Yy\xf5\xf1\x92\xe0*\x12\x01\xb1\xbao\x8dڤ\x1c\xf2L\x13 \xa4\x06\xdf\xf24A她=\x02\n\xc4\xf1\xf6T\x83\x98\xb8@|\xccX$\xa6\x15i\x1an.K\xdcI|\xeeR\x84\x02\xa0\xf7@\xdfP\x82\x86\xfe\xe6@\x85\x91\xdcP\x8f\xe3\xbd\x1c*\xb1\x96\x1b\x8aa\xb2\x97\xc3\xf5\x04\xb6k@\f\xce۟\x8c\x0f\x95\u007f\xaf\xa3\x94\x97\xed=I\x9a\x84\t\xe0=\x9bl\x17\x9b\xc1\x01\xbb\x8e[\xbc\xa9\xbcג\"\xc4h\xecX0\x8fQҜ\bf\x01\xa7\xfb˒\xdc\xe2펖\xf7c\xdc\x1e<\x1d#9`|cO}$o\x01>e\xa9X<\x8c`,\xfao\xbe\x90\x11\xa9_\xb1\xe8K\x893\v\xe7\f\x8c\x8d\x8e\x83\x15p\x96{Y\x12\xb1\x05\x87\x95\xe1\x1eAn[\xed\x199\xabM\xdb\b\r\xa9T(!\"\xbe\xa8\x06?Z\xb0]\x03\x83i\x05E\xc4m\xb2\vĞ\xc2>\xd5'\x96\x86\x99\xe5{G\xc8t\x9d\x1a\xaf \xaa\xd7*\x11~\xa6\xfc\xeb\x9ay\xb9\x95\xeb`\x89'\xabA\xfb?٘#\x01\xfc\xd4)\x02\xb7\x10o\xc6($\xe2\xf5\xe3ȉەL\x9f\x8d\xd4\xfcvYO1o\x1d\xbc\x9c\xf3_<\xec/ǐ\xb8\x01M\xca(\xb9\x80\xb4\x14W\u007f\xe8\xaf藑Q\x91'^\xea\x1b#0\xfaM|\x973}x7t\x91\xc9<\x88\xcea\xfe\xd6@\xbe̻\x00\xcbH\x9dl\x8f1\xc7>\x81\xc0\x1e\x9f& .\x13\xd4m\xf3v\xa2\x9a!*\xe0\xf4)$\xf3z\x9f\xdcmr\xc7\xd8t\xbd\x85\xb4\x15(\x88:\x1e\xb0\xb7\x83G\x88\x1cG\x87beV\xa6w\xa2i$C\xbeO1\xf4\xf8\x10 \x90\xd0\xdbc\xe7Z\xdcZ\xec\x8e0\xcbG\xc6 \b7\x02\x01z@Jy\x96\xaf~\xc2\xe5p)g\x1f\xd4,g\xed\xd9Y\x1bL.$\xb9,\x1f\xab\x05\xf7 \x97\xc6-\xde<\xa0\u007fk\x17\xce\xf9\xd2\xf9{\xce\u007fy\xfcc*0\xae2\xc6/q1\xa7\xb5\xce\xe1\xf2\xbb\xc1\xab\xa2\x93\x12\xbfg\xc2\x0f\xeb\xba\x16\x81\x83\xe0\xe4K\x16\xbe\x95\xf1M&\xc0R<\xe8\x0e\xe5\xc77xC\xe6\x9ey[M\xf4\x96ʛ\r#ͺ\xf9\x00\x8e\xa3\xe7D\x18ya\xb9\xfe\xa93\\\xae\xa7wf\x9ewr\xc8\x11F\xd9ĸ\xbf\xb7M\x13\xb3]\v\\\xb3\xa8N\xf8\xd8\x1e\xb0s\xb1Wݍd\x9d<ӡ\xfb\xd2\x00\x83W\xe5\x00\xbc\x9d\b\xaa064\xdf\xfet\a\xd5ȴ\xef\xd0v\xf0Ȼ0>ԯ\f\xcc\x04\x88\xef\xd0; \x04\b\xbd\x93)f\xaf#\xaf*\t\xa22<\x02\xfb\x0eh\xfd\xcd \xf7\x1f~'B\x18\xc2w\xac\v\x92\x0f\xbam\xa2H/\xe2\x19\x9c\xbd\xd3\xec\xb7\x03\x90\xaf\xe1wqM\xb0\x1d\x0f\xf0\x14\xc9\xd8\xf6o\xeeg\f\x13\x10\x1bC)̵67\xdb#\xe5\x88B\xc6S\x90\xf8>_-\x15[\xcd\xc4L|R\xbeR\xcf\xf1\x90\xcb\xd1l\x14Q\x83}\xee\x1c\\T\xbeH)\n\x9f9Fa\xb1\xbb\"^\xe0b\xa6A:\x91ݳQ4\xb1\xbb' \xca=\xbdsO\t\x0f\xa1\x03\x10\xc3\xf1'\x83\x1b\x19@\x02.\x9a\xe8\xd9Y&8z\n\x8a,i7\x15\x1a\xb2\xb5\xa3\xea\xfd3y\xd8\xc1;\x8d\x81\xebU}p/\xdfI\x9f\f\x01\xeb\xff\vxV\xf9x\xd6\xdeil\xf8F\xbdZ\xc5\xeaf\x9b\xff\xcb\xf9hX\xdac\x87\x98\xd4\xec\x1e.b\f\xe8\xeaB*\xac|&\xbf\xe2\x8f|g\xab\xb7e/\xcak\xc8u\xbb\xfev\\_H\x87\xb6\x9e\x9eb\x82\xa0\f\a\xfad\xd9p\xe1G\x9b\xbe/\xebA\x9a}\xf3\xc0\b㬬'\xec\xf7xȜ\xaeՋ\xe1\xb9;\xd6E\xf0\xdd\xd8\xe9\n\xcb!W\xb8\xdc\xdf\xe8\x04\a\x80j\xcc\xcc{\xaa\xed\x9c\xd9ZI$\xdfz\xbe{O\xde\x14p\xaf\x1e;\xe7x\xa6\x12\xb0=\u05fa\x98q\xde{\xfd\xd3\xf5\xa0\xf5\xc95\xfal2\xb83O\x8e\f\xe5=\x01\x19\xf9@\xed\x13j\x86j#\f\x13\xf8GY\xbfT\x93n\xa1>\xf9&ެ\x0e\xaf\xcd#\x83\xcfCBϩ\xffzL\x1euy\xb5\xf9\xddl\u007fS\x1f\x02\xefa\xbda\x97\xa5\xee0\xc7LTv\x82\xc03\x96\xe2,\x8c2\n\xe5sdT\x01r\xe7U}E\xdd\x03\x95\x9c\xddl\x001\xe0\xb7z\xa2`X\x0fa*h{\x1f\x9aq\x1aiuU\xe3\\\xde\x1a\x16\xaa\"L\xfe\xbaд@\xf9T\x95\xd6X\xd9RU\x87\xbeF\x03g\xf6]s\xe5\xc4\xdd\x17E\xc1\xce\x14\xb35\xabV0\xdf\xcbX\xac\xd2\x16/\xc6\xefu\xeb\xb5\xc6k\xbaz\x85\x9dB\xf5\xbc'\aك\xc0J\xbax\x19\x1b\xa2\xcc\xe7\xdf\x1c\t\xe6Iz\xf3\xee\x01\x80\xd27\xfa\x8a\x91\xf5\x8d\x92\xd2Y\xfe\x86Ε\xed1t\xb4\xbf\xb6y\xaf\x88\xb7Κ_}\x81\xa1|\xb4xm\xe3[\x04\xc0x\x02J}z\xfcl\xf3\xc8\xfeD\x9b\xd7V\x97\xfb\x86r\xf3\xd7csdsq\xbav\xe5[\x91\xe3\xb7&\x11\x8e\x8e`\x9foU\xb6\u007f\xb8\xbel\xeb?\a<\x1cj\xdbC\xf4!\tOe\x12qB\x0e\x93\xb6=\x99J\xdc\\\x9c\x1e`\x9e\xc4Lr\xb1孈\xe1d1Mh\x1d\xf7o\xabw\xd1ѹKi\x06\xeaģ\xead\x8a\x95*;^\x18ҋ\xcb\x18\xbf$\xb5\xb5xH\xb1\xef\x18\xc7U\xb8\xb3U`]G\xb5kC\xadꆂ\xe6\xec\xf7\xb3\x03\x06\x9a\xb1\xfdO\x98\xedQS\x85C\x95\xe2w\x93o\x8f\x16\vg~\xe1\x1fyG8P\xef\x99{{H\xae\xbf.$\xf5\xfb\x17\xdf\x156\xc5!\x16\x11}\b\x1cd4,q\x1f>\xe4`\x16\x80\x04ll\xb5UMBR\x93\xb9Pe\x02\x862\xe6A\x8d1R\x84\xb9\xe2H\xfcq\xbc\xe1l\bB\x90Q\xbf\xa6\xa6$\xd2W\xa3%\x89\xc7b\xe2\xb7hB\x89\xb2\xf9\x0eÚV\x1c@(?\xfc\x1d\x1d\xb6\u007fF\xf7\b\x9eA\x98Q}dl\xed\xc5\xe0+\x8c\xe7\x9db\x8a\x9b\x10\xe1NIM\x03\x16\xc3dT\"+\x18\x0e\x82ƌ\xb9\xb0\x18o0\xed\xc5`\xc4\x1889\xc1\xfe\xd7\xcf\xfc\\|5 ޣ\xf4\xbbئ(\xc7\xfa\x93\xa0\x8b\x92\xd8y\v\xf1j\xa5q\x94\x19m(\xb2\xec\xf7\x80\xe6\xd3<\\G\x91\t\x15\xde2\xd7\a\xe9\xf1dT\x9e\x18\xf3P\x9c\x970\xaf\xf4\xe8$\x88\xa7\xb6n\xcf\xe5\x1f@\xa1\n\x02Ē!\x01\xd7X\f\xbf㺕\x9f\x96\x96\x1c\x8d\xd3N\xe9\x83\xc6\x19kճ\xadxiki\x90\xf6\xde\xf3\x9c\u007fݝͨћ\"0?\xce^2\xe5\xb6XF\xe7\x8d,{s\xc0\xe6r_e\x10@V\xae\xfa\x15\x92\xc1\xf1\x92y\x9fg\x88\x92\x14\xfe\x1a\x13\f\xceN\xca_\xe7i\xf4\b\x8e\x97\xfbw\x02q\xbd;X\xda\xc8\x1cED\x83\xa0\\\xa1\xadb1\x1a\x1eG\xa3\x92(\xb6\xa4\x10\x8d\x8aRs\xd7\xc0\x92\xaaT\xc5\xcb\xdd\xf4<\x1b\\ډQ\xfe\xf9\x91\x022tT\t\x83;\x97\x9f\v`\x92\xd5\xdc[\x1b\a\xd9,\xb0\xeaAk\xbe\xa3K\xa3\xeabDl#\xe3b8\xcd,]\x99i\\\xac\x9b\xb1\xfe|kC\x89\xd9\xe5\xd0xLq~r\x16\xdd\n\xd4Ά>|\x8bž\xbb\x0fB\x8a\xdc\xc3\xc9a\x9f\xe8b\xc4\xf7?a\xdf\x10\xf0\x80\x87a\x0eg3\xbc0\xa0\xe8\x0e\xd2\xe3(\tj\xea\xdc\"F\xb5A*\xed{ߣ\xcbd\xb4]ř+XH\xe6\x94z\xc0s\xff\xd9\xd6\xf7\v\xe5\vZ\xa9\x02S\xe9\xe2L\x1d\x0f\xe0\x0eu:\xa7\x99˅\xe1)\xd2Ҳ\xc0\xddn\xb8J\x1c\x8eEB\x0fnS\xbe\xf6\xec\x0f\xb4>Ħ\xf1\x02\x13\x93\xfa\xc2\xcd\tm\xfdh,\xf2R\xcd\xfb\xe7\xdd\xd2T\x8a~}\xe99,\t\x90/\x82\xa5\xa7\xbe\xe2\xfb\xb5\xaf.\xee\x84\x02\xe1\xfd\xaaH\x80~\x85!\xc5\xe0\x85\xcb`\xd2\xd7\x02E\xf9\xbb\x0f\xbc\x18x\x19\xfb\x14\xf8\x14O\xf9ۖ \xdb\x1bm\x04w\x01I\xb0l꧴ёUz\x9dz\xf6k*\xbd*|m\xe5\x99\xca\x02*\v.?\xfd\xf5\xf7~\xe5\xfc\xbe\r\xc8\xe5c\xeb\xf8\xb9\xc0\x02hp\xd7\xd3?e\xcdY\x97]\xb9*H|̛1\xcf\xf4\x91\xf9\xc8e?\xa9V;\tا\t\x0e2\x11\x9aPQV\x88\xbc\x92lW6m\x1c5O\x11\xa43\x1b'\x03\xdb^\xfd\xa2\xab\x1cx\x13\x12\xe0,\xa8ҹ\x1b\xb3a)T\xec\x99\xf3\xa5eU\xfb\xaes10\xab\xdb\xd9\x16\x84ft9\x17\x13\x80\xfc\x80\xc3\xfe\x1c\xfcT\xbb\xae{\xd2!\xb0\x8aL\xc0\xa7\xd1@\xefOL\x8e\x97\xd5tǽ!\xc9\x0e\xfa\xb9^\xe3L!t\xad\xe6i \xf6\xa4\x96^\xb8\xf9:C\x12\xf8\xccR\xee\xd6\t\x82\xbd\x99\xf0K\x9c\xfd\r\x12?2T\xc9\xeaYx\xff۩Fq#\x1d0\x85\x8a\xb0\n<\xf2\xbd\x16\xafhѭ\xce\xfa\x9a\xf5\xc3)\x99\x06\xf5\xae\x1bkes\xb9a\xbdT\x93l\xd5\xf1\rx\x83\xb5\xaa\xc9\xff\x019\xb4\xf1\xbd\xd2d\x8f\xc9%+\xfe\xb3b8X\xfdZ\xca \xeb\xc8;g\x9d\x03v8\fn\x177\x93ϻ\xd4\xd8a\x93\x80&\xbd^\x1c\x8a\xc1\xd4o\x9cb{w\tOO\xe1\x03\xfb\x157\xbfjϯ\xb7زΞ\xc0\x05\xc3,\xe9~\xa2\xf3WY\x16\xbe\xf0ػqÎz\x9d\x1b\xb0\x8e\xb3Voλ\xe9g\xc6'5\u008d\xf7(\xab\xea\"ե\f\xc3\n\xfeA\x96Ӄ\x06[\x9d:\x94\xd3P\xbf\xf1|\xb9Ӓ+>\xa4\xf2#\xd1\x062?$Mnd\xbdu\xea\xc0\xa8e\xd1S\x9fJ%\x9f\x8c\xad\xfe\x12e؞~\x9d\xfdU\x9fq\x97\xd5\xf1\x18\x9a\n\xbc\u07b3\xd9҈z\xd9\x05Rn\xe0п,7\x84\x05\x8b˱\xe8\xf7\x12\xb5\xf7\xd1\xc5\xc5>`\x17\xc5\x15\x06\n\xcd/\xebuF\x12g\x87\x87\x13Og)P\xe7\x95J\xf4\x85\\)X\x1b\xbf\x04k VF\"\xf1\xe8\x03\\t\xf6\xd7\xd8\xcar\xd2\x02#\xf2\xd8wE]\xb3s\x1a\xac:Y\xa0#n\x87\x9a8\xc1\x80\vLm\"6D\x1b\x8b\xda\n\x8e\x1cV\x00\x1bġ\xaeH`Q \u0be2\xaa\xe0\xa8ү\xee\xadQ\x17kG\f\xd3\xff]\x01\xf2<2\x92N\x88?\x9d\x91\xa4\xe0U\r\xe7\xd0&\xe4\x19\xf2|\x86a\x95\xb9\xbd\x02_G\u070f\xb1}\x9bdi\x9f!\x90:`Ⱦ\x05\xe5\x85\xd1\xc1\x1b\xa1\xf8\xf5[\x04\xed\\,Y\xa9\xc4]J\xb3\xba\xfe\x19\xe9Ϲߐ\x88\xac\xc4ì~\xbb\xb6\x97O\x10\x11\x93\x9e\x1c\xdeA%>\x9d\v\xb6\xf1\x99\x04]\xd5\xe4\x132P\x99l5p\xb8\xe0O\x93\xc3ѐ\b\xf6\x81[ʀ4O@\x9f¡\x11,\x00\xc7\x00Ҭ\x8a\x87\x83-\x83,\x19\x994\xbd\x1d\xecX7\x9f-#?\x903\x92\xb8\x04\u007f{\x1e\x1f\x8b\xfd\xa9\x16M·\xdfC\xbf\x8d1\xce8\xa3\x15a\xbd\xaf\x1eY)\xb3M\xbf\"k\xea\x13\xada\xe6_=4\xa7JqM\x85\xe5?\xa2\xccnh6\x8ek\x8a\x1dɜ\x98\x10\x9dP\xff\x1a \x10\t\x9a2\xa0;\x893\f\xb3g\x824\x01\x1eՍZЦө\xa7GZ\xeck(m\x8d\fp\xb6v\xab\xeb\xa6\friZ\x11F\xcd}\x8a\xb8\x8bi:\xc9/\xeb\xfb\x9a\x10\x1d\x8cczP\x9f\xc5uV\xc5Q9E\x8d\xd2&'\xcc/\xec\v\x87\x91v\xe5\x9c\xf2\xad\xf9\x04<\x802\x86\xdf\xf4ۊ\xde\xf6\x8c\x16\x85\xe9YQ)\x82j.\x1a\xcd\xf8HN\xac\xfb\xa2\xda\x1711\x99s\xcd\xd5ʗ\xad\xe9\x92\xe7؋\xe0{\xe6\r\x9d\xa5'|\xadk\x83\xaalT\xab%\xef1\xf2ꪋ\x1dC\xa5\xcf\xddg\xf6QUJ[\xee'\xf2\xc4U\xfaؔ\xfb̝\x97ֶ{\xbf81\xe9 \x1f\x8a\x8dr\xa5n\x9a\xef\xe2\x9aҹ\x85\x12\xcd}\x1d\xba\xce\n\x05:\x13\x11\x00,\xc4й\xdc\xf76\x1aX7\xa4\x9f\xae\xef\xacf\xac\xc1\x1ae\x9b'\x05\r\aNM\x19\xa1\x152p|\x824\xd9\xf4p6\x05\x90\xb6\x02Vn듁p&S=\xc8[- ߞ\xf1\xe0\xbf~\x9dNj\xc6I\x9e\xb0\x9cY\xf5/c`YAq6\x9a-\xfd\x8bY\xae30#V~\x1ah\as\x86\xfeEPT;\xa1u\x1d\x97\xf0b6\xd6\xf8\x86WD#\xc5\aN1o>\xc1\x19\xea)Θ\xa9\xffC\x1bx4\x8c$\xb5/j\bl1\xf7\ny\x97.\xd8/\x9b\xad\xf2,\x97\xee\xf2\x8dRr\xd7\xf9\xe3\x96\xd0\xf7[YE*G\x10Е\xe2Km/\xfd|7\xfd\xc7\xee\xfc\v\xef\xfc\xdfSI\xb8\xea\x82SƗ\xb8q\xa6F\xd5\xd7㍹\xf8\x8c\xa86\xfd\xcc\x15\x05:\x05c\xe6\xfaVs\a\xc2\v@\xd8\xeaw\x9a\x80+\xdak\xff1\x81\xc4c\xcd\x1c\xcf\xf5aí\xe2\xe9\xc9\xfe\xa4\xe1w\x1e0\v:Y5\xcdQ\xb4\"\n\xc0\x8a\xea\x9f+\x16g\"\x12%*\x1e\xa32\x1a\x01\xe9t\xcb\xf5\x9a`\x8dG\xa5\x90ݴ\xa5\r\xc0f:hN3\xec\x163\xc6\x16^\x05\x86~\x87yө\xdf\xf6\xe0)\x1c\xd2o)l*\xde\xee\x91H\xf0-\x1d\x96;\xfb\xc8\xf4\x03\x03+\xd9|\x91\x18\xd2+[\xa5\x8a-\xd9\xd8\x15ZG\xae\x13X\xf9f~\x8e\x12M\xc6e\x95b7\x0f5\xa4\xb7\xd3[\t\xdeHo\x16}p\x10\x03i8\u007f\xf1;\x1d`\u007f\x94$\x907\xbd\x98~\xefYw\xa24\xf7\xe5Ryp\x06J\x92s\x88\xa2\xaa\x03\x82\xbd\xe0\xc1\x87\x86\x02}\xd8!*Yf\xd7~\x91\xb0\xf1\xb0\xea\xa6W\xf9\x81]\xb4TKV\x18\xe00Fy\xf9\xdal\x83\x1b\x89$\"\x99\xcf\\\xd6\xf9\xc2A\x1a\xbb\x83E?\xfe\xa2\xd4\x04W\r,\xdd[b\xf2\x12\x1e0q\xf9\xe6\x10\xd3.\xfb|\x97\xccx\xb5Z\x1e\x8d/\xcaˁ\x04\xc1\x95\xff]\x92\xf0\xd5P*4\x1a\x03\x94$*(\x93\x94\xc1\x89\b\x19R7\xd1\x01\xb4L\xa0&\xbe\xa2\xe0\x12\xe5`go\x10Tܑ.\x19\xa2$\x9cV̇\x89h\x16\xb5U\xeeL\xf0Hn\xa8e\xbe\xfai_\xad\"\x81\x93\xd8\x03o߁\x00\xfd\x16\xb7e*mb\xee\x9d\xe4D2\x9a\xa3\x96u{\xf4\xf4\x1eݹш\r߶\\\x1b\x9f\xa8\x89\xefؿ\xe8\xa9\xec\x84\xd9\xedZ\xa7D\xc7ܚ\xc6\xf4\nv\xe8z\xfe\x0e1Ul\x87\x10\xe0Rl-wk2V\xf9x\xd9Ց;\x9d\u06004\xfd00\x85=ԑx\x8f~\u07bdګ\x03\x03\xd1\xd7\fo2\x02R\xdbm\u007fԔ\xb8\xd7=\u007f\xde\xf4_\u007f\x9d\xd1r\xd7\x1f\xfb\x96Z&\x96ן/\u007f\x1b߸\xa7\x9d\xaf\xa1\xab(\xe7\xcd[\xcd\xe1C{\xe8%b[f\x03\x85.\xe1\xcc\xaf\\l$}\xedV\x11\xb5\xf8\x82\xcb\xf7چ\x1fU\xf6\x9f\xc8\x1d*B3\xfdl\x94\x0e\x14RPf\xeb\t\xd1d\x03\xaf'\x0e\xbe\xfa\xcd\xd5\x0e\xde\xd6\x02GL\xee\xee\xe5\xdb\xd1\xc5c\x01[\xc3d\xfdN\n\x8d%C9\x8bX\xa5<\xfaQ\xed\xed^i\xf9\xbb\xda\xef\x8bp,U ȑ\x14\x17\v\x1fTÉ\xf6~\x91\xedU\xae2\x17('w|\xd6/\x9a\xabB3\x14\x00\xc2\xea\xb1\xd7\xe8\xe7J\b,\xbbt\n\xea\x1e\xdc\xf1\xacWgLN$\xf2 [\xc8V\xe3\xfc\x0e|\u07be\x99v\xc0h0X\x9dX\xfe\f\xe9\xec\x9a\xcf\xd0<\xdbj\x8eh\xe7\xf9\x9c\xb6\x19\x89j0\xd0\xce{rLNm\xb3\xad\xe6[[L\x1e\xf63S\xb1$Y\b\x83\x11\xf7\xa5\xf1ʈ\x13~\r߇\xa5\u007f\x92\x91K\x9e\xb0\xba\xad\xf1\x18\xdd!\xd5QE(؋\x9a\x93\x8b\xc3\xd9P:&\u007f\x97\xf9{\xafƼӬ4sœ\x89\x85WL3A\x8c6\x85R\r\x11iv-\x157\x05S\x10:\x9fL\xb13\xad\xb0e\x06\x9a\xf1\xee\xb9=^\xaa\x8b\x89\xaf\x19\xa2Ŧ4˳\xbf4\x06\xc2OC\xdf\xe9R~ܐ\x8c\x85NK0+c$&3\x96M\xb1\xfc\xd6\xe9u<:\xa5\"\x15Z\x93\x94\xe8\x00,\x9d\x8a\xc7n2N\x96\xc6\xd4\xceEG\x96\x10\xeb\xd1%Wթ!`\x10\xdd\x034ى\u0087\xfa\x1b\x0f\xba_\xda\xce\x1c`\xd5\xea\x80}\xb4.\xf1Kq\xdf\xf4\xc5~\x9bJ\xc7k\xa6\xa7t\xb9\xcak\xcd\xf6S\xc3y*\xcb\r\xb3\xca\xfb)\xf7I\x8c\xf9k$Q\ue18c\xde\xf6\x86r\xd5q3\x89T\x94\xb5\u007f)A\nRs\xfe\xc8=[D\xb8\nj9\x1cq\xaa\xef\xe2v\x1e\u007f\xcfC\xdcno\x03\xe2\x9dKR\x1e2\x86v\xdf)\xc6\xcd\xd41d\x9cc}D\x992k<9?\xc0]\x0e;\xc48\xfd\xa1\u007f\xfa\xbaBR)x\xf6ˣ;H\xd3i\xb4}{\xcd74\x9e\xcd\xca\x174Ϗ[\x16\xc4\v\f\xde:g\x9aV\a-}@\xb8 ݡ\x1a_׀JPz\x17\xa5\xb3\x8f\xfa\x87\x8d\x95X;\x97)aDJ\xcd?\xa5\x8f\x9c\\\x15#X\x92\xc1\xecr\xe9\x9a\xe7w\xf0m\xbe\xc9\xcd\xfeA\xf3Ў2\\\xa9\r\xdd=\x11\xe669j\x89R\xf0\vLm\x8a\xa1\x8b\x02.I\xc2eG\xe3\xb5\xfc\xa0R\xb0'\x9c\x88v\xf7$\x98\tP\xd0\x19>5h\f_\n\x80\xaa\x01c\xd5ҠW\xae?\xbc\x86+\xfa\xc2\xe0\x00\xf5\xff\xbc\xf7\xe3`ރχ\xb2#C\xbd\x80\x97\xcb\b\x18\xc5B\xea\x9b\xe9W'B\xab\xc3~\xb3\xab\x82\xcd\xfdc\xe1b\r\x00\x13\xd2\xfe\xef\xda5~}`\xf0\xd5A\xd6E(\x12(r\xa2\x1b{2me5\xfb\x14\nt>`v\xb3\xc3\x03\x03\xefd\x02,\fp*=\xaeϕƼ\x01\x18'\xd8\xe1\xb9\a o\x8e$ݥ\xaa;f\xf2`\xa2̢\xd8\xfct\xb1\xb9ɟJ\xaf$\xdf\xfb\xe3\xaaH\x1f\xfe\xe5Z\xe5\x00\x04\x12K\x95\xc3Ԋ\x83\xb1\x1c\xcfk\x03\xc0+\x10L\x01m\xed\xad\x14\xde\xdf\xefR2\x1e\xa4\xe5\xae1\xf4,\xb0q\xe1\xc7\xc3\xf5\x88\x95\x87F\x1e\xef\v\xc1\xa3p\x92̹-\x97\xbdJ%b\xc7\xeb\x1f\xa0\x95\xcf=g\xf5V\xf5\xa3\x8d^\x89y\x81\x90\xbd~\xcf\x17\xc3\u05fc\xf5\x150~-P\xc7\xcfת{\xfcƛB\xa2\xf8\xc62X\xb2Z\xda?\xeb\boG!x\xcdn.\xca\xdb}%\xae}O\x1bo\t_\xbe?b\xb8\x1bJ\xdc\x12\xe1\x89\xe7N\xbe\xf9v\x1b\xb2$bl;z\xe9\xce`\x86&K\xab\x87x^]\"\x11\x92\xe5\x15\xc3d\x98\x0f+\x11\xe4g\v\x01eI2\x80\xf9\xaf\x8b\x04\xf6 \xf2\x81\x14B#\xf0(ijNN>SwF\xc1\fW\x00\xd3\f\xa1|\x97\x03b\xb8\x18\t\xfe\x02\x88\xc0W\xf9oW^\\q\x13\x1a\x8f?\xbf\xa61>\x04B\x00L\xd0/=\xd1iR\xff\xdb,\xbe\xeb\xf8\xe0\xc8cykW\xbe\x18Z)\xc7BU\xbc\xa0\x8e\xd6kjy\xd5\x1b4X\xfe\xf5\xc7K\xc3\xe6,\r3\xf1\n\xeeF\x00\x02\xfb\xe5\xbc9\x18\xe2pK\xebu\x8e\xaf\xb0շ\x83\v\x97\x8c\xd9q\x90@\xf7\x9c\x98OAv\xfeyG4\xf0\xfa\x90\xcb\xde\xde.,m\xb9\xa3#D\"^\xccѣ\x87\x018l\xa4QZ\xf5\xa51\xf5\xf3\x82\xab\xd0C\x94\xae\x9f\xe8\\\xab4oJܨ\x8c\xe8힊\x0f\x95\xa6\xa0\x85\x1d\x93\xfddD6\xe7h[\xa6\xbc|\x1a\x99\xd7L\xd1\x1c]\xd5V\xf8~\x81.\x86\xd7:\xb6\xe9\x0e\x8c\xc6\x12\xcc\xd40z*\x05\x18\x1c\xfa\x19\x15\x9aHX\xd7,\x80Ͽ\xcf7\x9f\x91z\xae\xf6U\xf4QN\xbce.7$:\xba\x86\xc5.\xcd\xca0֣M\xbd\xe5j\xb9\x13\xeb9\xff\x17g\xaa\v{2ڬC\x8d\x1b\xfe\x1b\xabO\x19\xbd\xa2墸\xd3\xfb\xff\x90N٘\u007f\xc3@.\x8b\xd4W\xd41\x05D\xb1\az\x1c[\x10\xc1\xb0\xe2[\xb0M%V\xe65\xecr!4&U\x99r\xab\rs\xe2\xa07%y\u007f\x00\xe7N\xd9J(?\xa5nYm\x89\x1e\"T\x13\xfaC\x8dMmr\xfb.\x04\xee\x98ݴ{bSNT\x8c\x1d\xec]*\x19}\xe8\x92\x1bv`\xaa\xa4\x98\xfb\xa2\x951\xea^H\x9d\xe5\xee\x8b\xd3v\x93No\xeeUۆAS6W\x99Oىe\v[(\xda\xceB\x11\x03\xe5\xa2͝\x1e\x85to1bϫ\x15ZH\x82\xe7\xbc{\xd1\xc0\xf5\xa4~\xcbN\x80}V\x1dˋٹ\x00o\xb2\x92\x15<\x8b>#\xc7\xfd\xa2o\xaa\xf0\xee\xbeTFD\"\xef\x1b%7\xef3\xae\xac\xd7.\xf5(?\x15\xbef\xb7\x92\x83\x8a\xe5\xe6]\xdf\xd2\xf5`!\xf5\x9c\xc0\xb1\xfc\xc0\xbf\xbc1%U\xef\xf4qL:蜧\xa8ϸ|\x92\x04\xfb@8'\xf3\x17+\xae\xf5V\xa8\xb6W\x1eu۠\x82\x9d0\u007f\x8b\v\xcb} +T/\x89\xeeQn\xe9\x13\xa0\xe2l\x10\xea\x9e~\x86c\xbb\xf2{\x97p\xab\xfea\xed=\xa6\xe8\xa3V:#vm\xf8\xe9~\x90\xe2\xc81\xee\x81\xcf\xed\x90\xf6t\t0\x8dSPH\x81]\xb6/\xc8j\xe2g/!\xbb\x92\x88\x1b{/\x1b\xa3c \xe5j\x9d\xd0\xf7\xc9h\x91\x85\xe2[\xe3=\x92\x10U\xd5\xfa@ʍq\x8bIg6\xceM\x96\xad\xff\xfa\x1f\x97\x95mq\xe9\xfb%Y8\xec\xbedc\u007f\xd5`\"\x17\x8d\xdaX\x91t\xae\xa4\xe5\x01\xb3\x9d\x13\xa4\xaf>\x9d\x17\a\"\x03\xb7\xfb{\xe2\x85\xc5ri\xb8\xc5\x14\xe9P\x9dO?\xfb\xac0=\x86/\xbf9\xb3\xd2F\x01\xed\x13n\x1eV}\xa6OY[\x12՜\x0f\x1b\xbd\xb5\xaf\"I\xee\xd9\n\xe9{GEz\t`)Ӈr\xca\x12\xec\xc1\x1d\xb6OoK\xf1\xffY\x02꺧\xfeS\xef\xe9\xc7\x02\x954\x03;\xa0\xa5\xbb\x94\xbe\xeb\xb7\xd4\x1eL'\xf4\xb1\xb9\xa2>\xe1\xb0c\xe8\xc4\xe1\x92N@\x19\x95\xbd\xe0\xaa\xf18 \xe1\x17ʋ\x8a{삕z\x14b\xf6\x048\x05_x\bV\xe2\xd4\xf0\xd3\xdc\xda(\x1eX\"]Δ\xacěM6w\xfe,\xa4f\xe8gf\x94\xd3+͜)T\xaa\xd5J\x1bU\bt>\r-\xe8]z}\x03\x1b\x86o\xa3*\x91mG\aŶ\x1f\x961\x89S\xcd\x1d\x8c<\xbb\xb1\xba\xbb۵\xe5\x87\xfc\xb7&\xaa\x85\x15:\x17\x97\x99Q\x83z\xf1H\xed\xe1j\xba\xbdl\x1a\xa6j\xfe\xb9L\x01\xee\x1c\r\xd8F,\xfb\xff\xc1\xf0\xf8\x8fa\xe8Y\xaa\"'Lˬ\x86ɴ\xa5\xb2bJp{\xf6\xbc\x976\xadի\xe6\xa4\x0eh\x93\xe6\xd1]\x13\xbf\x8d\x10m\xaa\r\xfdE\xd2=\xae\v\xd2~\x92\xeaf\xa1\xbb\xda\x04Fv\x1c\x8a\xdf\xea\x87E\xbb`EWin\x16ux\xe08!GVY\xe7??7K^\xf6\x15+\x9b[2\xb7\x96\xdd%_\xacmw\xe4\xbas\xc3Z\xb5\xea\xe9MZ?\xdcv\xe2l\x9e\xb3\x939\xa3\xb9f\xa4\x88O\xca\f\xcf{\x1c\xf9\xb2\xaa,\xb3'9\xab/\x1b}\x15\x00\rT}\xe5\xcc\x1b\xeb\xca\xe76\xd9\xdeV\xebzô\xffvU\x12\xb9[\xe2\xd1dT\x1e,_u\xeaV\xca\xed\xa3\xe4E\xcd+B\x16:\x81x\xe2\xe1a\x8fY.L4\x8dr\xddP\xcb1\xf2\"\x11\xad\xa1n\xaf\xefj[)Xs\xd6\x1154\x8d\xf5\x01\xdb \xc94s\xe5S\xca6\xdd\xc1\xab\xa2\xf2\f{\x99(\x05,\x89kW\xaa\x87\x10\xfb\n\xab:\x1aDm\xaa3\xfc\x88\xb0\x8e/\n\xf0T\xc5*\xdd\x1f\xd7\x05\xa9z'\xa91\x1e\xb6o\xf1'3\xff\x18\xf8o\x8aw|Ћ\x14\xa5\xa9=\xcaY\x87<\x10\n\x04a\x9eD\xa8m\x82\x1e?F_\xa3Y3\xe7f\x02^\xb7L\x12\x95f\xebf'\x1a\x15@\xd4\x18&M7\xb7F0{\x82\x8c\xe7\x95\x12G\xa7\x8a\xb1T\xc8B\xc4\xd1\xce\xd3/\xaf\x1ff\xb8\xd5zqc\xf8].L.I\x11\xb2n^\x1e\xbd\xa4\xd9\xd2W\xa1k\x94\xd6(\xed\x10h\x1a\x8a\xddc\xa4!Ȝ\xfa\xeb\xae|\xe2\x8a%\xd8?%\xc0\xd0\\\xfd\x846\xdd\x15Q\xc6\xc0\xb4n*\xb9\x990\xc0\x02\xe4\xb3'\x18\xab\x19'\x8a\x8d\x8e\xd3W\xaehĩ\xe3\x9f=\xfb\x00\xeeŝL\x96\x1a\xdcCg\bR\x04\U0005b64c\x89\xa69V\xee\x94\xea玫؛A\xa5\x10ӚT\xbfQ\xf5\xaey\xcc\x05č&i\xfd٣h\xf5\x9c\xe3QJ,#\xf6|d驺\x05z\xcd\xca\xf1\xa2|yYH\xb4\xc8\xe7\xee\xd1{\xaaFI\x12%\x99\xacO\xd8\x11\xe8\x14\x82\x16RD\x92&\xd6k\xea'\xce\t\x17\xf5\x91(\xa8\xac\xfd\xf1k\xd5ͷ_\xdcu\xe1XT\x05\x81\xb04\x83J\xdd\x14o\xad\x81\xddtǠ\x80\xf5\x1d`\x12X\xb3\u007f\xe8\v\xec\xf3\x88l\x04\xda/\x84\xde-\xddԩ\xaa\xac\xae\xc1\x19\n\x14TBIj\xa2ԛ/\x03\x9d\n\x82\xf8J\xc0n0,\xa6ħXB\xc4\xf7\xddU\xba\x9eH\xd5h\x1d\xd7\x17Fe\xa8\x02%\f\xd66\x8e%\f\xd4/\x12\xc6\xc1\xb5\xc6\x02\x14:&zLl\xb1\x19dKT\xb5\xf4\n\xb1^\xbcGv͊\xa2\xca\x0fSA4\x8a:\xe4D\xc1\x04I\x81\x06\xf9\xde\x03\xafʯ\x91\xf0\xe8<\xb8\v\x96!.\x941?\x1enT\xe5\x9e\xe0\x19\xc8z\x1d\ahԓ尵\f\x9fZ\x88B\xe4\x18\xaa\xf2\xa9\x17\x96\xce\uf1efCn\x16\xd2\ue5f5\x1f\xf9\xeeI\x9d\x9e\x00\xf8\x8f\xb3\x89~\x03+\xdb\xefs\x02m\xa68\xb9T\u007f\xb0\xc5=f!c\xb7(\x9aK\x1bH\xf7\x8a\xea\x83S\xad\xcb\xe8H7!L\xf0S\xbf.D\xc4\x024\xe7\x8b$\xfe\xd9~]\xcb\xdaٴa\xbcG\xe9\x02\x9as\xafi\bK7\x90\xc0\xe0\"\u007fdϸ}\xbf\xac\x89\xb5\x9a|\x9f{\x9d\xa9\xd8ܰQ\x927\xder-\x0f\xca\x1dy\xa7\xfb\xc7\xe0\x88̂z\xab\x15RaV\xce]\bv4t\xbc\x96\x9e\xa0\x8f\x8b\xbf\xb0\x052\xfa\b\xed\xe4\x04\xfa\xc2-\xe6\xc7讨YD\x8eی\x19\xedS\xd8@\xaa%_\xd1B(F\xd6\x13\xe3\xddHke\u007f%&\x045\xfb\xd5='\xbc\x1bjF,\xa7\xf7\xfb\x98\xbaG\xf5\xf4oW\xf8\x109\xe8;\xfc(\xefڤ\x90\xc1\xf7X\xd03z`\xf7f\x9dM\x83\xd4<\xb5~\xdf1\xea\xcb\xf9bR\xf46t\xa6\xe8\x140l\xbdu\xd6F\x9a\xa9\xbeIj\x11˯\xfb\xe3\xcb\x1eJo\xab\x88I\xccq\xa8\xb9\xb6Ĵ\x10(\x85\x1b\xaec\u007f\x03ǘ\xc7U\xef\xc8@\xf4\xba\xab\xdb\xd1\x1dѢ#\x02e\xcd&\x9b\xb1V\x95\xb3\xf7\xa9\xcc\xf3y(\x18\xfa\t\xf2{̧Ku\xa4\xcf\xe1\x98WK\x13e\x01\x94\x90Z\n^>(wDI\xa6\x19\x92\xdb\x12\x15߹}x\xc8\xde\n\xfe\xdaƺ\xe25\xbcgY\x80G2\xa6\x1c2\x0f\xc8\xd3\xfb&\x8b\xf3\xfb\x9e\f\xd3sσ!q\x19\x80\xca\\\t\xa1\xc1\x9e\xbc\xac\x8c\x8e\x19C\xddP%U\x8b\rfb\xeb\x13\xf5\x05\xf7S\xb5\xaf\xe5\xda'\xb5H\x85Lbi\xcc,\x9cs\xb5\xe4F\x03\xc0\xb9\xf46\xe4\x04\xa6\xae7\u07fcD\xe4\n\xe6\xa6g\x1ḍoGa)j\xe8S-&\x9d>7\x94\xd2y\xc6\xcf\xe7\x15\x1eCCΖ\bi\xe2]\x00MR\x1c\x93\xa0\xbb\fA\xf1\x1a\x8f0\x99\xf0\f\rKf\x93\xb4F=z\v\x8c\xc6g\x04g\x8a\x03\xaftf\x9b7\x17Kx \x90[\xd0\x12\xe5\xab\x1f\fL^.[\xb3\xa6ԭ>\xf3Z\xd1\x01c\xfb\x197\xe4\x16\x13\a\x8d\x8536\xfe\x16c\x1e͗\x99\xd7q\xcc\a\xb2w\xac\xb9*CC\xf9V<\xb7\xfc\x0e])E\x8d\x1d\xc39\x9a\x9f)\xa8ϛ\xca0l\x94SM\xeb\x1f.$\xf4bAS\x98\xea\x96Hib\x13%z\xec\xb2qݓV\x10\x03\xdd\xcf\x1b\u07b7ʀ\x187\xe4\xf6+8\xe0\xfa{\n\\\xe2H\xa6A\xe1Z\x1e\x00#[\x978\xc4\x05\xa40\x9e*\xc6\f\xd1r\x1f[-\x9csw\x1bn\xdbxP+\ue528HEl\xfb\x19\x87\xe5Y./\xddk6w\x19Kb\xae?\xfb8\xd68G\xf6I\a\x01.\xdf\vu\xa1\x01\x96\xb7r\u07bc\x99l9\x8f\x0fEiޜ\xf8\x01\x12\xa2\x86\x99`\x86\"\x82ƃ\x9e\x91\x8fȇ\x9f˺\xf3\xf6&v\xa1\xccI\xcc\xdb\x04բu*J\\[\xd5^\x03en\x06\xf4Q\x05%j\t?{\xebnW+\x9b\x10\xb31\v\x82\xb2Z\x80\xd8\xdcC\xab\xf2\t\x16\xd2$\xaf\xd73\xf7\xaf!\xdb\xee6\xea\xf7\x95\xa3\xfe/\xa5SG\xc7 @\xa94Ό\x1d\x19E\xb8!\xc3R\x1ad\x9e\x1e8hg?\x83\xd3J~\x11\x8f\x10\xa2\xb2u?\vZi\xa1\xbfD\x18\x83\x874\xa3\xedK{j%\x18)\x88'\x19\xb7\x05x\x9a\xe9Ma\xfe\xffYvkEt\x82,l\xd6\x04\xc5\x01\xfd\x13c:\xc9\xc3w\xe1\x85Xk||2\xf3\x9c\x85\x12\xeb$\xc2.Ey\x86=\x1f\x06x\x92\xc7*-LM\x9a\xb9_\x16\xbe\xb6\xefxC\x83\xd3\xd3{\x05\xc0t\xd3\xe7\x884\x02.\x9f\xa6<\x19\xa0\x04P\xf0r\xf1͙\x99\xe1\x11s\xb91\xb9\xbc/\x9c\x16\xd5N\x1d8\xb0uu\xa2\xbd.ӿS\xaa_r\x84j\xab]\xb8\\\xad\xa5\x9aav^\x95\xe4\x1b\xa2\xa9\xe1s\xf6\xf3Q\x11\x88\x9e\fZŜ\xf5-\xc5\xd4D\x8c\x00u\xb5S\xdd\x0f\x18\x8dg\x8b6\x83\x84\x0f\x86\xb2{${\xe6\x16r\x0f\xa62\xda\xcf\xf0\x00\xfe5\xf3>\xb6\xf8\x1b\x85,\t\x93\x87h\x0fc\xa6\x1b\x16b\xb1J֊\xcf?${ou\x95o>ͨ\xfe\xa4vCl\xa1\x92(\xb6\xc2<\xdc/0\xe7x\xfb(\x0eD'\u007faԧ\xd8R\x990\xdc\xdf\"\xe0o@\x9a\x86\xa8\xa4>N\b\x9b9ߖQ\xb9]\xb6\xe2\xa8\x1a}\xb8\xb7\x003\x81(\x8b z\x1e^)(Үe\xb4\b}E1\x17\\\x04\x02\xdfp\x1a\x9dB\x80(y\xfb\x95f̷\x13\xc5H\xf0\xf1\xcf\xc8Y\x84\xc4/HI\xfe\x8d\x00;,\xff\xa7\x94\bq«=\x95\xa7\xfc\x04d\xd6\xc6\u007f&\x02\x11T\xa6\x04<\xe5\x8d\x16\x99)3\bSfV1\xf3\xe5ړ'\xac\xfd\xd4vh\x92\xca\xcaD\xe6\xf4\xa4\xfc\v\xeen\x86$4n\xab\xb5\xb7'\xdcr}b\x120\xef\xe4D\xdbxo\xfcV\xea\v\xc1\x03\xd0\xfcU\x9dJgI\x1f\x18N\xfe\x89\x9c\xa7}\x06\xb2\xd64\x83\xbb/\x12\xc1\x1b\xee\x8a|ߥ\\\x94\xec$M\x95\x8cy\x81\xbb\"\x99j\xa6}\x05j\x8f\xb9\x00\xe8\x91\xc3i\b\u007fb\xd3\xf9!\xd4\x0fNӽ\x10SB\xb6v\xf3C9\xaewp\x9d7}\xea\xca5\xb1\xfd\xf8\xac\x84\x1eq2\xe8Ѫ\xe0\xc6Ҵ\x00\xf7UÍ\xbb,\xeb\xd5鼁\x1bI\x9d\x16\xf5}\xff;\xed\xddY͜ȝ\x94DJm[\xf0\xf6\xe5\xd0O\xac\xadsޥ$Fl\xe5X\x8a\x8e~\xa6=/_\x18\xbb\xe1S\xe9L\xec\xb1\xec\x17J\xc4\xd3\xdd&\xa8\xc7^(\rqwv#\xeb\xe3\xbf\t\x1e\xef\ua48e\xfb\xff.\xd1P\xdf\xd9\xe5\x16:bB\xf8\xb1f\x1aV\x882q\xcbgn\x89ٙ\v\xaf\x8b\x05l8VӅ\xb8\xb4b\xd1\xe5\xb40\x17\x83aG-OTlO=A\x8cf\x93\xb1W\xecO\u05edOJ\x9f\xfe\x1d{\x9b\xd5̑Ͳ\xb9g\xc6\xf0 k\x19:\x87\xe1\xf9\xedI\xfe\xe73\xe4\xcf*z\x10\x15\xe6\x9bA$\x11\xff\x87\xf3\x95\xbd̊k\xbeP\r\xc9`\xe6\xe6\xb3n\xf5FGx)\xebG\xffRPE%\xbd5\xc4\\\xfd}\xb7\xae\xda\x12\xc0\xbc\xa93۵Ruu\x9b\xde\bW\xe7-\xcc\xe8\xf1\x1f\x99\xfe\x98\xdf\xfa2\xd4\x14\xd4\xe6\xfb\xb9\xfa\xf4\xa5G\x89\xa2\x12\xfe\xab\x0f\x9d\x92\x8b\xf4\x1a\x0e%v\xcdoM\xff\xdd\xcdk x\a\x86\xefB\xf8uF\x8e\xe9N7ׂkV)12\xf0dB!\b4\r\xf9\xe0\xae.\n\x92\x8aN\x91\x038O,f\xbd\xfa\xa7\x12\x9c\u007f2TiV\ru\x8b\xb1\xe4\xc4d\xdbL\xf2\xae\xedzy\xa7\xf9\x1b\xcau\x98g\xd1\xf0\u0092\xcc;\xa6\x19Ks\xdf'\x0f^\xa4\xa7\x12\xa0y+\x83\x1a7UUO\x9d\xa8\xfbB\x99\xf8ж\xea+\xad$\xb4%O\xbb9elե*\x91\xdac@\xaa\x89\x05F\x89\x04\xf5c6\x14gg\x05\xf4MU\u007f_\xd9~1f\x84\xa6v\xbdV\xbb5\r\x89\x10\xf3-V\r\x9b\xdc0\x1d\x8f\x18\xc1 \x17)_D\xf1{\xbd\xf3Գb1\x1b\x19\x96#Q|\xe6\x83k\x9e9=\xad?\x87\xf7\xe4Po\x99\xc1\x9ec\xd6s\xbb\x1f\x1f\x83$&\xf1\x16\x9d}\xd3BoWT\x87\xe2\"M\xc2\f\xa7\xbc=\xa0Dy$,I\x9c\xd7\bN\x01,چ\xb1\tw\x99\x03I\xcdx\xfbE\x8d\x8f\x11\xa76\x90\xbdx\xe0n\xa1C\xd4C\x1f-\xa1\xf8\x1c\x99,\x9dϕ\xd2\xda̲Y\r:\xddy\xa5~\xb1\xccʝ\xcb\x17،\xa8\x8e=Y\xa2\a\xc3\xe2\x9ec\xcf,Txe\xa1qU\xa2k\xe7\xe0\xdd*O\xeb\xe6Tq\xf4\\\xb1E\x1c\xd8\a\xac\x80*\x84\xe2/\x00ؒ/\x89\xaaNS\xe4\u007fU\x1ef:\xec\xf5\x89\x96b\x8d\xfc?\xd5ī\xa7H\xd2t\x03$ٶUfu\x87\x86dH\"\x85\x1a\xa4$\xb62kQ\f\xcc/\x8b\xad\xcfW\x17iX\xfb\xfe\xcd\x1aN\x1b\xee\xb6\xcex\r\x1c\xb0r6\xfd\x9c\xba_y{?2\xc2\x17ڽ\xcd\xf3C~{\x93\xee\xdau\xd58\xe5\x99\x1b|\x86\x0e܁\x1c\xb9Sf\x95\xe9+\xe3\xa2\xef{\x06\x96\xea3\x17\x980`\xbbw\x17bcC\xf3\xd5\x0f\x91Q\xd8\xf4+zƪ\\T\x9f\u007f-\x0f\x1c\xe9\x1f{\xf8]\xde\x02\xa3ξ6\xd5Ѯ\xc2c\x91?\xc28\x96Z~|\x82&\xc4e\x13\xf3\x1c\xaeD\x9d\x969qW\x932R,Y+\x96\xbd\x13\xb8y<`Ow\xefA\x9abz6|\xb6]\xdc:q\xa7\xe4Z\xdfO\x17\xf7V\xd6gM\xf1\xd2̥ic\xcckJ\xcb0\x05\xc0=,\x9e\xfa\x89\xf2\xcc\xd24\xda,am\"\xd3\x1d\x88\x1a\xa6\xf4RC#\xf8\xdb,c\xe1\ff\xa2\xac\x1a\xcaZ\x1e6RcG\xbdŢ:\xba)\x11\x1fe\x8c\t\t\xfd\x9a\xc2eI\x17\xbd\x16\x1b\xddr\x0f6.\xea\x10\xf4Z;\x97\xcdP\xb0+O\xd3)\x88\xd3$\x16\\\xc1wI\xa2V\xec\xc2(h\xef\xf6`z\xb4{%\xcffp\xba\xfbxl\t}\xe8\xa5\x1ao\x9f\xd1n\x1br\r\xb1\x957\x9a%ӧ\xff\x1c\xb8{\x9e\x1f\xaf\r\x9b\x13\xe1x\x03\xaam\xa1\x1d\xa7\x06\xbd1oВ\xb3\xf4i\x83\xf1q\x13\xb0\xe4 \x12J\xd6\xca\xdcO\x9a\xaf'V!\x89\x99\"\xb7\x12\xb0=\x89$\x15\n\rї4\x84\xc2\xf8KS\xba+\xea\x91\xc2\xca&Z\xdaۙ\x83\x91'\xa4憥Y\x8e\x0e\xe0\xd0^\xdb\x16\xb7\x05e\xbe\x05\x02\xcc\xe6~\xff\xff\xf7}\xe2\x96,\x85\xc2x'\"s\xa3o߮d\xb1\xc7\xfd\xb1\x1f\xa3߽}{.\b\xe7k\xe8\xc8\xc8TJY;ff\xea\x96\uf14e\xd7j\xa7KV\x92\xb8\x1c\xbcB\xef+\xd1\xf6j\xc5\xdc\x01\x1dqM\xaeWL\xaf\"\x9b\x1be\xf5/\x9d\u05f6\xbb\u07fbYf\x99\xfd\x8c\xf4xw\xa2I\xf5\xf2:k\xeb\x91I\xeb\xe8q.\x86\x87Dz\b\x9cdLWim\xee\xfc\xb8\xb3]\x1e\x00ɗ\xf5\xc2\xc7\xfb]\rf\xcf\xe2\xb8)\x82B\xe1\xea{l\xb2ֻ\xb7\xc1\x1d`\ue331\xcaj\xd6~\xa3ކ\xde\xe9\xaf;ā;~\xad7\xb1\xc5-zA\xc1\xef\xd8\xd7X\xc1'\xac\xce\x0etb\x9f\x8d\xd8\x1c\x83WO\xd5.\x98\xcb\x1f$\x00\xf4\x06GS0R\xc9\xe4\x13\x11a\xa1\x11#\xe5Q\xb8\xde\xfe\b\xfdP\xca\x1dO\xc9|\xdaP[\xaa\x9b\f\x86\xe3\xf9%`C\x12)c\xff\x9a\xc5\xc0\"\x17\xd6ͽdD1\xca\u007fxp_s*5\xc5ac<\x9bv\x1f\xfa\xc8P\v\x1f\xdb\xecc\x9bq`{D8\x86Shv\x10\x92\xec\x90i \xfb\xfa\xceW\x03\xd9\t\xa7\xf3w\xfapk\xee\xe0\xe6R\x12|\x18\xf6\xbd\x1aO\x9a2/n\xd0@\x926M\xe1\xb2\x00\xcdR\xe8իB|\xa9\x10\x98\\\x15Un\xa1\xa4\v^\xc3l\xafs\xdd\xc2\x05\xb4=\x10[{\xac\x97\x1e\xa5A\x03\xae\x05?\xb2\xf1\fzJ_\x10R6\x02\x04\xad\xfeSA\x83\xe5\xbf\xe3\t\xbf\x8c\xfa\x8f\xa0\xb5\xfco\x98\xa8\xffwn\xb6\x96\xfb~\xe1\xe1\x9eGK\x0f+\xf7(uhK\xb97\xd9\x03\x01\xfa\xe1\x14,\xb9\a\x06\x0f\xce\x16\xe7H\x81\f\xff⺔\xc7\xf9\xc8\x11\x87Q\xb8\xdb/\xb0\x9a,\xbf\xa7\xbfZ\x8b\xf4y\x92(NZ\xe8\xfd\x8c\xf6y\n\x88\x8b\xfb\xbaɧ\xb5\xb3\xe6\xf6e+u\xceh\xadC\xbe<\xc6/\xef,s\twy\xa8\xbf#\xf1j\xd7\xd8I\xe7\xf0\xc0\xa6诵\x9f{\xf1Ҏ\x12\xfe\xb4\xfa\xc9,ٿ\xf2%\ue943\xce`\x05S\"[;\xb4\xdd\xfd_~`\x1b!>\xec]\xfa\u070e\x13*\xce\xdat]8J\x99u\x1b\u05f7\x0f\xcduO\xc1\r\x89\xd5\x0eաH>\x88\x8a\bh\xefLkq7g\xe2\x12\xb8R2\x16\xf6,ʪ\x91\xba\x18Z]\xc6|\xa0\x90$\xacCZ\xa5\xac\xe4m\r\xb6\xd6\xee\xf4\xad\xc3\xf2q\xa2\x17\x03X\x01\xa7\x81\t\x9cLrS\xf9\x8f\xdfKb\x1f\x9f\xcc홞\xfe\x97\x12\xd3%H\xbe\x89\x85/\xba\xce\xcc\x1aw\x8d>\x0fG\x9b9\xc2(|\xf2v\xedv\x0f\xf3\xa0NnNvX\rN\nЀ`p\xbb\xd2\xc7\x0e\xc3\x19\xd1+\x03\xc9{(\xa4\xbbu\x03\\\x1f\x9c s\x04\x8c\xbbQ\xc8\xfa\xb3p\v\x87\x0eݨ3\xb9\x99q\xc5\\\x92\xf6͟\x9c\xe8$\x12\x19\xd1ﵧ\x8a;Q\xd8Sřz\xc1\x0e\x89[jl\t\x8a6n\x98 \x068\x85DT\xe4\x1b}\xb5\xe9\xb9㔨\xf6P\x8aE\x02\t%\x81\xbaBW\xf0\xfe\xafح\x16\x14\x8eY\xab\x1aw\x17\x85\xb7.\xc0\xed\x1d\xd1\xe2\xb4\xe5\x89!\xa1\x9c\xbd\xa7/\x14^\xb2mdSZ~j=\xb8*Qgd\xfd⨎\xd10t\xc3\xc6\x1c\xb1]\x86\x9f\x05\x05\xa2\x81\xc3q\x16\xc1-\xee.P\xa7JBp\x96\xea1\t\xe0ث\xe0\xc4at\xffl\x89/\xfa\x83\xf1y\xf2p\xd7\xf9q\xc6{~\xc7\xd1\xf8TOH\xd3\x05\x8c\xa66\xf7\x04\xd7\xfb\xb4\x1d\tu\x85N\xa2\xff\xa3wY\xb9|\xc3\xf6\nA\x98Vr\xcf\xecwD\bh4Kk\x96\x16\xa2\xf1\xc1+\r\xe1/\xbe@\r@\xd5\xc6O\x1e\x9c\xfb\a\xfd\x19\x94\xbeJ\xfc\xec\x01ZB1[\x87?l{\xf9JՊ\xfc\xa3\xad\x1bq\xa49Pv\xado\x00Y6\xc7CJ\xb0\x82\xba\xb8\x83\xf7\xa9\xfd\xcc\x0e\xd2\xc9\xe7$\xb5\xb7\x94H`7\x06Ei\x8d\xaf\xa8)*eK\xc1\xa3\u0602Y\b8\u007f\xa9\x97{V\xbb\xa2\xab)b\xa7\xd0\fpNv/A\xd9%\xe5\x82;\xddu\x1dh\x87(w̃\xbcl}\xa2*\xd14\xcby|uV:\a&\xe0*P;L\xf1\x18Q\xee\x99\xf3\xf3g*}O\xbe\xcdW;\x13xT\xbf!\xb8\xba\xd8\xf6F\x82[\f\xa5\xf9\xado\xe9\rl\x95\x88\xbe*\xfa\x1a\xb0\xa7\xb4\xc0K\x06\x01\x95\x84K\x87\xe2Uv\xb6ܼƌ٫NY4\x9b$Gd+\x843\x95$K\xc0VZ\xd1\x18\xbe\x0e\xb8F&\x11FuR\xf6\xa5j.GN\x9b\xacۖ\xca5ƴ\xca\bre\x19\x13vv\x16\x9f\x19v\xa5\xfc\xfa\x05Ȭ2M\xfa\xeaC[\xcc)\xcf\x18|\xc8\xdf\x01eGyb\x10\x18\xa7{\xf8)ڻ\x03\x8e\xbd\x90.\x15I{l\xda1\xa7\xa6\xfc\xa0C\xc0\x06\x97e\x85sZ\xe8t\x11\x8d\xc3h\xd1\xc6ɻ\x91Ræ\x01Gp\xc6\xc3\x157?\xbd\xb8(\xa7d\xb1\xc6W\x84^=\xb7\r\b\n\xa0\xc4\xd9&\xf5f\xf0V\x03\xbb\xf1͞\a\xb7iϟ\x12\\\x1b\xb4\x87\x91G\x17\xce\xf5\x9a6$\xde\x05\xb0$\x92\xb8uP=\ao\xe7u87\xbf\xd4\x1e\xbd\xec\x9d[\x9e%>`<\x15\x0e\x9e.\xf7\xcb$\xc7Mtӗ\xb6B)G\xaajS\xaeQ\xe3\xe6\xc6Ud\xfc`\x8e\xe8S\xb6\"\xb8\xa7\x1f3\xb7\x99\x1dɽ\x85}Mױ\xb3T\vth?\xf4\x177\x9f\xb1\x06\xed]\x9b\xe1\xd0\xf7\x84\xf2\x97i\xa2EH\xe5\x15\x89\x9fzş\xfd\xe5|\x15\xa7-\x9f\xc1\x19\x14\xd5td\x86\xa7\xbfۑ,\xfd:\xcbD\xcf\a\x9a\x1b\x92\xa9\x16\xd0j7l\xc1\xdd\x04D\x006٧\x17-\xfc\x86\x8f\x02\xb7\xd4\xc1+\xa7}ZU4\x9f^\xae\xe7xO\xb5ݼ\x9d\x9ff\xc5\xfc\xd8Q\x1eH\xf8\x1b\x14\x10\v\x8d\xc2\xeaU;\"I{\xf7)\x91\xdc1\x85\x04\x8dZ\xc0\xb0\xf8\x1a.\xf5\xd8\x17\xc5\a\xe1\x94\x12@\xf3\x88\x9b2\U000c45a9b\x03+q\xbaz\xf3V\xf0\x9b\v\x81s^\xc6>\x9f\x1f\x1e\xaf\x04\x02V[ŵ\xa5\xef\xc5-\x1f\x185\xcev\xbe\x80\xa1\xb4\xf1]蚮\x96\x97\xdac\xa6\xfb\"\xfc\x8d\"f\x88\xf9\xc4\\\xa5߬\xaf\xe3\x9c<\x8cۋcy\x1e\xad\x98#\xb6\xc5Qj\x9f6dr\u007f#\x01\xa7ȑ\xb3\x82\xde\x14J\xed\xcb4l\x12\x1a\xf2O\x16\x06\xee\xdf\xc6(y\x0e\x87\x16\xefN\xf5\xcd}$m\x8e\f[\x9a\x04-\xcb|\xf3\x93Ԉ*\xfd\x11\x1d\x94S\xf1\x8a\\\xf7ќ\x8d\xfe臉@\x12\xff\v\xcb@\n\xdd\xe0\xa4\b\xa8ie'\x9am\x82\x9f'q$\x9d\xb4\x12s'B\x03\x9a\u007f\x81\xc6\u0a7bA\xa9\xb9d\xf3)\xf6\xf0.\x06\x88*\t\xf9_y\xb6\x8e#z_\x17\x19Ы_\xee\x0f\xcf\xf1\xf4{\xbd\x13\xea_a\xac_=+䊒ӌϞ'P\xf4ܺw\rG\xd4J\xee\xd6l.\x8b\xba\xfdr\xa8q\xfbZ\xc8v\x1fD(\x9dDC\x19\x18G\x8f&\xe3C\xe9ر\xc3!\x11\xa1\xf2\x93\xaf=\x92ǣz4\x85\x82\x8av(\xa3$;\x03\xbc{\x06\x88\x1b2\x1a\x14\x14 @\x8fiǘ\xfcu\xdf\xee\apc\xd2E\xc3\x14\xec\n\x1a\thh\x00\ts\xe4\xcf>\r\x13\x81\xd6L\xb6^\xeb\xa2f\xefڻw\xbe\rTWޟ\xb6\xff\aR\xd9\r\xcc/_\xb9I\x1e\xaaĦ\xc4M'B\u007f.\x9e\xb4\xd8,P\x9a-\xe8\xfaH\xcaj)\xfd\xfe%P\u007f\xf9\xbd\xbe\xf4Dp2\xdb\xc8^\xed^w\x8d`K֫\x81K\xe8\x03Pa>ξ\ufae5jϨg\xea\xf8)\xfdKS\xfc\xd3ټ\x12\xeedGFYG\xcc$\x93\x15\xaa\x95\x15\xf8X`\x88\f7%\x92Ҁc\xb2K\x91\xdaQ\x16O\xb9\x1b\xc1\x8f\x81\"Bա\x1bB\x95'\xab\xe8\xb6^\x10.\xeb`\"\xf0\x86;\xcaG\u007f\xa2\x06\xd3\xff\x80\xc8leԒ\xadO^l\x89\x83:\x99Q\x19\xa1>\xec45e\x1b\x16\xf8\x1a=[7$z\xbd\xa7\x05\x83\xb4\u007f\f\xe1i\xbf\xe5F\xf0\\*B\xf4\x0e\x14'ǝ\xc6A\x96\f\x05ko\xde\x02\xb8\x90\xe7MFc\xbc\xc0\xdd\x10\xbe\x84\x85\xa7\x02\x173|\x80Ӭ%v\xf1\xa2>!\xd2\x1c\xb4\xaf]\xd8\u0080\xa5\x9f\xd8\xf6\x89'!\t\xf0\x1e\xef}:xi\x89\x17/\xeaxcR\xb1^\x01W\xa5\x8bI\xab\xf6\x86\xb6\xdf\xe1C\xfa\uf6e6\xdfz\xe4\xf3_`~c\xfe\xa2\x9aV\xa6\xefFvf\x8f]5On\x14\xfb\xacC\x82\xf2?\xc5\xddҷ\xba7\xac9\xa1\x9f']\xa6/g}\xa1\xe7\x82փi\x04\x81\xdeUIȃ\xa9\xaeO\x92t\x16\xda\xf0\xbe\xad̒\x06\xc2?\xcd\xd5k\x8c\xe7\xe7\x17\x02:\xd2\xc8\xd5\xd0[\xf9\xdc>TSi\xc3\xf4\xa1\x10\xa0\x04\x98\x9b\x9c\x1cE<7\xf7\x1aE-\xefN\tؐw;\xe7mD\b\x8d\xafu\xd6\xc7\xe4[\xc5\x1d\xea\xca\xc5\xd3\x06z\xc4+9\xaa\xc9g_P\x1aO$\x1f\xde\xcbUYN\x94\x81[\xbb#j\xad\xa2\xdc\xfb\x0fI&\xf5\xc3\xd33\x96\\e4n\x85\xcf\xd7\x11\x85)\x1dRvcx\xeb/\xf4V\xd2C\xc4?\xddK\xf5\x87\x9d\x89\x9bg{\x1fG\xb9\xfaX\xf9\x92\xb2\xb6\"b\x17\xac\xe3(\xe36\xce\v\xbcʛ\xbd|\xba\xa9\xf6\xf2\tR\xf0r\xd1I\x9c\xc9\xe0&\xc0-Nձ\xdc\xcf\xf9*\xa7?\x8e\x862BpEYP\v\xd1\x17[\x00\xa4\xdd.\xff\xa0\x85r?\xfdgO\xa3\x01h\x92\xbf/%l\xe4\xaf\xfdRO\xb8\x13E\xbc\r\xbaf\x1d N=d&\xfeu_qb\xc0?\fX°\x82\xdc\x13f\x04:\xd8\xccJ/\xac\v\x93}?(u\x8b6\xbe\x8b\xa3\xcfP\x98\"\xf8\xb3L~\xd7iV-\xdfg1\xed\xe8YB\x1cg\x82\x06\t\x14\x98\x1c\xdc\x18\x14\xfc\f\xfe\xec\xa4}\x17H\xa4K2\xa04\x05鵖r)\b\xa9ۡ\xc8#|ti\b\xeb@@\xa3\x1d\x86J\xe6R\x18[\xc5\x19\xc4k\rx\xa6\x93\xc9\x0f\xd8c\x02\x03E^\xf1\xe0\xec\x0e\xf2I2߸\xb0dVo\x95qP\xcd\x1f\x87\xb9kZa2\xdb\xd7H\x82/\x8e\x1b=(\xb8c[lW%i\xd6\x1b\xb8\x1f\xa3\xb7cX\x00\x82c\x88\x0f\xc1\xa3hP\xc6q\xb7\xd3\xe96\x89\x12\x19c\xfcM\xf2?\xbe\v}\x1fiSh\x87Rm\xd0\xe8]\x1e\xf9\xd0\x156;\xf4\xa8\x9f\x96\x8d\xda?'\xaf\xac\xf2\x04\x83B}g\xc5\xd9M\xabm\xf4\xeeǞ\xeb\xec\xcbCj,v\xb4\x9c\xcfԱ\xaf\xa0>\x89\xfa\xa7\x0f\x97G\xf0\xc0\x16\u007f\x92+zYl?G\xe8ܦ*{\x82\xb1\x12.\xecm7\xe4A\xc7T\xaa^1D\xe5\"\xa5;R\x8eUr\xf0\xa0\x10\x84\"bh\xf8\xa6\x0elqw$\x92\xb1\xd4/gy\xbeR\xbfmZp\x87%\x14\x8b0B\xce\x15ϝ#4\xffb\xc1\xe8\xe8\\q0n\xed\b\t\xeeN]M\x89<\xbeq\xeb\x88\xceN\x97\xd4\xf5{Ԉ\x86\xcdh\xcc@\xfe\xfc1?\xbb\xdb~\x8bt\xf9\xf2\xc0\xea\xc26͜\xd8\xda\xc1T\x9d\xb8k\xa7\x8e\xd5̆\x0f\x1eҙ\x19\x0f҇\xfb\\M\b\x00\xe5|\xc0t \x10\xd35O<4> J\x0e\xe7}\xbe\xde\x19,\xffQ\x1drQ*ͯ\xf6\x9bA\\\x15'\xf5)y\x05z\xd4'\x86\x1d\x13Kdخ\x06D\x8d\xf6Wdi\xbc@gzu'1\\\x15}\xbb^q\xc1\xe7\xcfI<\x06>e^\xd6h)\xc8Q*\x1e\xb9\xf4\x14lz\xad\u007fB\x80l?\vg\xdc\xf9\xb2\x01\xd4\xf7\x8a\x8b\xca\x03\xcdG\xd6\xeeZ\x9b\x1a\x1a\x82\xbe0`\x12\xb3\a\xe5~\xfb\xdd\a\xea\x939\xa3\xf7/ie+U\xb6r\xaf\x1fW\x97\xe9\xd1Ws6\n\x94g\xed*\x9dD}\xecz\x81yn+ህwUӋ։\xeb\xcdf\xa9\x14\x0fG\xbf\x03%!\xa9\xbb\x88L[#\xfe\x83\"\xd1h2\x99fmh\xff\xd2|Fqb}*\x95H\x88\b\xa9#z\x9c\xb4\xb1\x1fnV˴\x80\x99]\xf6xA \x981\x8d\xae\xa2\xa5m\x01\xb7\xa9\x1fk\xb1\n\tׂV\x12\x10|=\b\xc4@\xbb=\x85\xc1OB\a\xb0z\xc6P\xbcd\xf3\xc0\xc95Vrl$\x00\xbd\xa1\xd1ZՄ8\x90\xbb\x83\xb48^Ϗ\x98qp(:A6J5PY2\t\tèV\x1e\x99\xb5\x0e'G\x94\x89\xce\xccpe\xe6\u176d\\\xb6\xaahj\x93\x16\x1f\x1d\x0e\xa2\xd2p\xa11a\x84\x8e\xcaw\xc5ʓS\xb9A\x03\b$\x13\xd3|\xbdH\xc1\xf5E#7ч\xd5\xd2\xe0\xb4\xdc|\xfe\xd0p\xb2\xde\x1c*\xea\xca\xc4\n\x9b\a`\xe5D]Z\xf3\x94\x8cB-\x92\x80\\6\xcb\x13iW\x0fẍG\x8d\x04\xfa\x90\xfa\xfe\xef\x0eGG\x92\x10\xa0\u05ee~\x8dY\xbaJ\xa9\xbeT7Mq^\xc2\xe8\xba#\x820\x81\xa7\xe4\xd8õq\x87\xbe\x04\x1a\xf3\xd7\xcb\xeab\x8b0\x9aKVot\xf1[\r\x8a\x19Ֆm\x11\x0e^\xe7k \x17k\xb4\xba-d\xcbp\xdaݟ\u007f\xff\xaf^\fJ\xf4\xddd\xf63\xa2\xc7ݕF\x1a\x13\x8fF\xcfT\xe6Ϻۗ\x9d9o\x93\\S\xe3\x028\xe7\x03\x19\xd1qk\x10\xea\"\x81\x02σxL_:\xaf\xf8\x1cP\x9c\x8aLh\xc0\xa50!\xdc\xdeiˌ\x0e\xd4\x17{\xe8\xe88\x1b\xb5:\xb9\x9e\xf3zE\r\x04 \x18\xaeOy\xfa\xab\x8b/И\xe0l\r,)\xf3\xb4G\xbe\x86\xf2\xe7\x8d\xc5q\xce\xf2Q\xb6\x14\x98\x1bR\x19\xf3\x0e`\x81\xb0\\\x15\vJ\xf9>[\x8b\x1b\x00\x94\xa6\xa1ip&Հ@\xa1\xac\xf1\xad\x1a\xae\xb1\r\xae\xa9\x00$\xaf\x89\x05:\xc1\x10Q8\xb2\xa2\xa0Bt:@`{>\xbc\xa7\x85\x16'\xfba\xe7ޝu9\a\xe7\xe9\xfe\xf79\x10\xf0\x9e'\xa0\x01\b\xa9L\x1e\x12\xf9cи\xcađHh\x91\xf4d͞\xf2\x87\xeb\xe1YG\x8ff\x99\xa9\x01\x04\xb6\xab\xc1\x12\xd6\xdf/\x9f\tN\xe6\x02=\xf0\xf8Sf\xbb0T\xab;WJ&\xc3 \xc6I\x9c\v2\xb8\xb4\xf2\xfa\x02\xec31\x91\x00\xdbkÉr`\xc8\xd4}\xb2\x92A̶\xae\xfc\x99\xbe\xab\x13\x81\x83\xd4\xfc\xebd\b\x84\xbc\x94@\x1d\f\\q-\x10\x9e9(\xd6B\xec\xac,v\x11ѣ\xad\x12ALX\xc2q\xaaH[\xa9!\xc9f\xe4\x85-t|\xf8\xef\x9f\xd9\x04\x89n\xb9PΤR\x03^\xb0b\xc2\xec\xd5\xf8\xc3GO\x9ff\x85\x00=+\xa5\x8c\xa4\xe5h\xfe\xb4\xb0W\xf0D;Kf\xdex1\x82\xc8^\x17\vU\xab]\x923\xa0@j\xfcK8{V\xdb. \"k5\x02\x81\x0f\x1d\x11\xb0\xd1\xfeh\xa5G¾\xb5pC鹒\xb3*\xf96\x04\x06i\xaa\xd3S+п\xb8u4495\xeadj\x90+\f\x86\x9dKk\xb9\xd2Nq\xe9B\xa5\x19\x02\x05\x94M\xf0\x88\x13\x0e++?{\a\xc62\x13M\x83\x9bNJ\u007fV\xf1u\x10\xfc90\xd1$#dV\x9c/\xd5,)\x91\xcf\rAk0\x94Ƃ^\x1b\x8c\x87\x81\xf9F\x1c\x94ߛ\xcd\x05\xc0\xdc\xdcn\xb1\x02\x8b\xf7\xfb\xba\x94<%\xa2\x11\x9cJ\xad\xc0\x9c\xf7\x8cvq\x00$\x9c\x9b\xea\x1e\x9f\xc9\xe8\xafd\t@\xe4ww\xf5\xb8?\x9d\x04\xe5R\xc0\xfd\x18s\x90\nD1\xabF\x13-\xa0_\xf1E1}\xfdzc\xe3\x91\x16ƝZ\x8c\x19h\xd0\xf4[\xdc\x11\x1e\a\x94\xc6\xcf$\xc3\xfd\x9d&\x05\x00DWx\x18&fe\xc5%\xe9\xed ~)\t~\x8e\x12\x83XL\xb7t˛\xdd҅\x96\x8eJ\x06K\xdd//(\x97F[\f\x98KY=;\xca\x1f\xcaؕb\xff\xfa\x97\x83~$Vd\xb8]\x9a\xa28\xda\xdc|\xd4\xf7\x1a\x02\x81bJ\xd3\x16):v \xff\xfa\xa3\x183R\x86R\x97Q\xb4\x8f\x04}˺\xe4\u007fO\xed\f\xd6\tk\x06\xc5UP\xc4\xc1\x8b}\xb3\x9fSV\x95\xaf\xfd\f\xcc\u007fx\u007fs\x00Q\xcaro\xaf\xb1\x9f3\x1e\xa3\xffz\xe7\x902\x89F\x10\xa4\x8c\xd2\xfa'֯\xa3\xd8\xddnN?\xf0\x1e\xd7{\"]\xf51\x16B+\x1f\xc4յ\xa5\r\xe3\xb0;*\xab\n\x8a\xed\xd1eO]\xc2\xdd\xd6-\xce\xd2N~\xb5\xbf\xf82\xf5̜\xf2\xa3u%l\xc5(Z\xbe\xad\xbb\xa3\x9db\u007f\xa19M\x99h]Z\x1f\x0e3')\xa2\x149\xa0#\x87>\xcc*\xd7\x03\xe2\xa7\xfb%\xfb)\xb7V`\x10leY\x17\xee.5*\xd0\x0f\xd9\x0f\xa5D~\xea-\f\x89\xf6\ad5J\xe1\xc6Z\xf5!Q\x03\xb5\xb9Ӧ\xa7^f\x01P\x80\xa3/fj\xbe\v\x81T\xcaX\x91\x12\xa2\x04X&(f!\b\x88Ý^\x13\xf2\x98g/j<\t\xb3/\xda\xc7륃S'J֓5\xe1V^\t\xfe\x95\xfaߟ\xbf\x9e^\xc4\x19m\xbc{\xa0\x8f\x062\xbe\xac;\xa2\xa5\r0i7\x04$\x01\xe0\x0f\a\x16&⩵\xfeӵ\x8e\x8d\x8d\xab\x8fXEOS\xe8\x1f\xc0x\xc65\x0e\x1eDZ\xbdيt\"\x8e\x15h\xaa\x11\x88v\xe7\xaf_C\xda\x16\x83\xe5S\x95\x9b\xbd~A$\xba<\x86@\v\xd1\x01\xbc\xe5\x1ef\x8a\\;S\xcca\x8c)\x9a\xa66C\xd1\xd1_\x9d\xde\xdfΊ\fg0(4i-k\xc2\x13<\x05\n#5t\x8b\\CC\xa3\xab\x19h\xf5>\f;\x8f!`\xb6\b\x90\xa9\xa8\v 3\xaa\xf3-\xd7\x00\x056\x95ht\x0f\x89D]\x1b\xe9S\xb0eN\x87\xa8\xea\xeb\r\x8d}\x83}\x8d\x8d\x8b\xa8\xe6\"\xad\xde\xce\xcf\x13#Qn\x93\xb7\xb2\x16\xba`F:\x9f\xc3\x19\x10\x04>\x15\xa179$lV\xda\xcce~\xcc\xcb\xc7̈\x16J\x10a\xfa%\x93\x89q~\xd6ܣ\xb3˴\xaf\xa7^\x0fl\x87C\xb1\xf4\xb3\x03\rf+/\x0e\xae\v\xb9\xfe\xe1\xb4eBa\xbb\xe8\x13<\xed\xba'\xb4 \\*\x00F\xf3\x99C\xdb;\xad\x8d|\x1c\x84c\r\xb7\x86ڀ\x98N\xba\u007f\xf6f\xbe!\xe0\xff\xf9L2i~\x81<[\r\xc5\xd8\xc5\xedp\xeb\x84\b&\x9aѕA\xbekn\xeen\xba\x90r\xbe틧\xfd\xec\xe9\x1bn&\xbbf\x17\u007fv\x1cnjn\x94-\xcd\xe82\x1f\xdc5(!\xec\xd1\xf2\xa2\xf4\xd5\xdd\xc4rC~\x87\xe4\x8aD\x04\xb2\x97\xcd\"`\\T\x9f'j\t\xbe\xccP`\x920i\x1a\xdcO͚\xe7\x9dF\xeckrf\xeduə\xf7\xa2کj\\'\xaf\x1e3\x83!B\xbaIEl\xdfQ?\xa6\xf3m12\xc4pQ\xf5\xa5\xa5\xe2e\x8b>\x96\xe1R\xc7w\xe7تD\xe7.ۋ\xd0\xde\xe4\rXN#\xb1'N\xa2\xa4\xcajj\x01\xa2\x91о4\x17\xd5!\x06\x99\xb1tK_\xbd\xe2\x93\xcbf\xa5R\x80\xc0!@棼C\x12\x94J-\xa8\x12ja\xc9\x1eH*\xf6\xcd\f\xe3\xfb\x8d\x81\x9dN\xee\xcbp\xb4@w\x97V\xb4[;\xbb\xdd\r\xdd\xea➄s\xecq\xc2\xe5\xd1H\x8a\xa4l\x81\xb6ڜA\xbb?\xd4\xfey\xad\t\"\xbaj\xfd!\x80\xe4\x84\xd6<\u007f\xdcU\xb4?\xddh\xbd\xe5\xc0\xe5\u007f\xa6k\xe1\xa71\xb1\xa6oa\u07bb\xf8\xdb\xd6e\xe9\xfd8S\x80\x9c1\xf7Н䋄\xb6\x04\x8c!\xd3\xf3\xba\xe29\x93h\x85\xd8I\r\x18\x87\xd6B\x8e\xeb\n\a\x119K\xabo_(\x00[\x01f\x190\xb7\xb8\x88o!\xfc\v\x85\x92\xf931\x1d\x9eC\xb7\xbe\xc1;X\x0e\x96Ih$\xa5ɀ禹@\x84\xc5@0Wl\r\x1f\xdd\x11]\x86&)s6\xf0\xe0\xa84w\xf1\xa4Y\x903c.\xfc\xe3M\x02g\v^\xbc\x14\xc81\xd2\xc7\xe9\xb9O\xb3qs#Ms\xf1\x823ZNLMi\xf6}\xf0\xf0\xc6\r\xa19\x8d\u007fU\x82~\x87\xe8\xb3x~{\x16\xae$6\xba\b\x9c\xa8\x03F\xd5ɬQ\xafEi\xee2Wv\x86Y\x14F\xa6\fA\xdb\xe7\x9eV\x10l\xa8\v\x14\xb8\x06\xed\xd6\xe4\x04VDXer\xe2(\xb4\xc0\xb0Z\xbae\x9e\x92\xebͰ\x90\x163)\xdb\xca\\t\x00\x1a\x8a\xf95\\^\xe1\"r\xf2\x19Ш\xe7s\xb3\n\xdcw\xee\x1dP\xe45\x8e\xaaf7\xa1N\xdfK$f\xb3\xc8^q{\xb0\"L\x8d\x9d\xdc]\xaf\x88\x19z`@\xf8\x95DQh\x97\xcc\x04\xe66f\xb2\x9d\x16\x95\x1c~h\xabG\xa95\xc6uU\x047G\xe4\xf0\xed\xeb\xb8\xc4\x15~\xf7\n\xc1\xb8\xe3\xf5.\x88#3\xf1P\x13\v\x8e\xfaTV\xca!\xbc\x1fn\u007f\xac\xaf\xefژ\x05Pf6\xa0Չ>l\xdb6\t9@\xddҖ\xf7\xa6\x99\x1e\x8f\xa5\x02\xe05Ϛ62\xf2\xf9t@7\n\x9e\xe1L\x8e\xce2\t\x1d\xf6\xd7\x17 t\xfc\xf5\xed'ԯ\xc0bH\xca\xe4\xefԼ\x01\x88w\x12\xcb\xe6Wf\xf2\xf1\xb7Ɋ7=\xcc\xdb\xfc.=bx\r%\x05d?\r\xba\u007f\xc1\xee\x8da\xb3\xca\xcb \x929\xe0e\xffp\x90\xa7\x8b\xbdH\x8fҩ\fK\xc8\xe5\xf7\\\xf0\x90\xc5ۏ\xfb\x9d\x84\x9e\x84\x8c$\xa0\xb0\x98\xe3\x9bC%\x960\xa8\x96\x1c\xc1\xe6\r\xc9\xc6\xca\x05\xe6\x83\x01\x9d\xddntv\xa3\xbc:\x80\xb5M\xc8`᳑B\x84\x8d\xdbasp\x93&\v)\x02\"-\x12qc\x83\xa3\xaa\t\x9b\x93@\xa9I\xe2\xc7\xe8\xf3bk\xdc\xd9\x14\xb9\x9d\xa9\xcc\x053eP\x9c\x16F8\xdd\x01\x89ZmUL(\xd9\x11(qP05\xbf\x19n\x19'\xbc\xa5\xc1C\xf8\xc7\xc2V\x89\xb5\x8ai\xc0\xb5\xaa\x9b\xda\x12\x93\xa1\x8ej\x95\xd0\xf0ɿ\x04X?q\xe9g^:ӛ\xc0[[P\xb0V8\xa9\x9c\x19\xb2\v\xa1\x9f6\xa4\x00\xda=Iɉ(\b\xb5c\x06\xcdG\x96\x9a\x15\xdb@\xa9\x15\x17\xbd\xe0Lb!l\xb7l\x05\xdc\xc68߬Mv\xda\xf9\xfa\x9dvVb\xf5q\xdf~\x15\xdc\xd2\x12/\xa4\xda\xcd%\xc7Ii\x1f\x88\x85\xc0\xb6҂ϡ֣T\xf3\x9d=\xfa!B\xb3\x83\x04P\x06S\x06:\xa6m\x9du\xacv\x8b\xd0\x04\x05P\x04\x9f\xc8s\xcfϥ\xef;\xa7\xbf\x17\xa6\xcfZ\x04|s,\x16G\x85\x0f\xcb:\xe0\xc6pH\xf6\x8a\xafg\xd9\xe9V\x15u\x80\xa3\x17Z\bR>f\xe6\xcc@\x9d\xe2\x00e\x14⋮@F\xc3<6\xe3Ͳ\xe0.\x1d\x05\x93\xbaL\x81\r\xd6\x10/\x81)\x93X\x94\v\x043\"LN>\x94^\x82m\v\xd4\x14\x98w'\xd6\xc1\xe5\x15\x95\xa9>\xdb\xfa\xd4\x1b\\\xe3C<\xeb\xf1\x85C\xfdKb`\x9e(.\xf6\xeeu\xd6\xc1ְ\x9a\x81\xa5\xd6T\x9e\x18'\xc8 \x82o\xef\xd5\x06\xf3MG\xf4\x98{\x1dx\xb8$\nv\x06\xac\x1b\xfa9\xef\n\xab|\xe8\x9eF\xb0\x8d\xc9x\xcaʀa\x10@QI\xdb֧\xf3'\xed\u007f=\xcfz|Q\xf9o\xd8\xfc^B\xecf\xd3\xff\xa2,\xb3Zf\xfaW\xfa\x014\xe6\xa9#\x9d\b\a4\x93\xcey\x81I\xac\a\x95\x989#\xdb\xf45\f\x0eZڭ\x0eE\f\xa7\xd9\xe6\xc02\x1d\a\xe2\xb7p\x93'\xc6\xdb\x16B\x87\xa4~\xbb\xa5\xf6U\xb8j}\x15\x1aۣ\x10WwE\xfd`\xee\t\r\x11m\xf7'?\xe8\x16!\xac@ \x00\x80\x83C 2C\xd9\x1e\xf9\xd1\x00pc\xad\xc4\bl\x13ݻOš\xd8\x1f{(\xbeC2\x0e\xc9\xe0kC\x89\x83\xf1\xd1k\x81\xf6'\x8cU\x98\"\xae\x16\xe9C?\b\xbf\fT\xf2Q^\x90\xee\fڝ\xb8\xa4kK\xf1\xe6m\xc53\xce\xe9m\xec\xea$\xba\u06dd\x16\x81\x00\x8e\x1fͮ\xb0\xb4]\xe0\x89\xcc]9b\xf3\xb0\t\x88Jn\x12\x99)sn\x9ct_\xf2\xf2\x19\xeb_\x0fxEK\xad\x94D\x94\x06 \xa5\xbcB\t\x99$gY\x98A\xbfV>\x1fg$\x95%L\xd00L#\xee\xe3{\x1b&Ν\x98\x96Ft\x0fd\xeb\\\xc0\xa5P\x94\x13=\x9c\xd2\x1ba4\xe2\xca\r\x8f\x1f\x0f8\"\x9c<ܝ\x8a\x8bs\xfcL^^N\xdf\xdc\xf2Ec\x9c\xc7v\xb9\xac\xedH-_>\xe9\x97\xf2\xa7\xf1\u058b\xd8\xda\xf8\x02;|+\x87c\xa9\xc8!\x8b\xa9\x04\xbf\xb6\xbf\xde\xea\v8\xbe\x1fO/\xd2.规\xc1\xf7Jn\xc68\xbc&\xa8,\xec\x11\x81\x96%\xebs\xf3t\x90]6(\vk\a\x96H6\xf1\f\x89Fq#(ۉ[\x96y\x97\x8c\x8f\xa6{\xfb\xc10(\x93^\xe0\xca\vֿ\xc1b\xd6\xf8\xebף\xacŬ\x0e\x03\x83\x92\x80\xe4\x17\x14\x00\xdc\xda\v\x9d\x9d\xfd\xb4\x91&f\x86\xcezCqI\x89\xcf\x12\x10\x15\xdd<Μ$\x92\xab((h\\\xd2ED\xe9C\xd1\xf4\x1f\x01\x1d\x15\xad\xdd\x1c\xdc\xf3\xe9c_\xe8x\xf6/\xc1\x83E\x82.:\xe4\x1c\xfd\xfci^\xf8\xc6+\x8aΟ\x9e1\u007f\x18צ\xc9\xf3҂Ji4@`l\x87x\x10N\xefL$搘6\xc3\xd2T\x97\xaa\xc5\x12.\x9d\x96?\xd0\xea\x8f\xe4\x0f4\a]\f\x8dX\xa41h|}g8<1Ȥ<\v\xee@K\x02\x8d\x9a/\x16\xc7\xf5\xa2/\v\xe3\xa5\xd15\xedp\x01\xc8\u007fל\xcao\xeb\xe8\x91t\x92\xaep\x87\x10a j\xe9\xa5t\xe0bE\x91\x12\x9c\vE\xa9y\xf6\xb7&Ц4`د\x11\x89\xbd\xb5$\xd2L\x87\x04\x9d\xf9\"\xab\x85\u007f\xad\xe7\x83Jvi\xbe\f\xc1l\xee\x00j\xa3Z%=')\xbe\x968\x96\x18e\xe6\x88\x14\xc8\xe1`8\xfcT\xca\xe1\xc7\xec*\x8fM\xe78\xf5\x9b\xbb.\xac\x80\x87\xbb\x8d\xd6w\xb8~\x0f\xc9\xe2\xf5\\(H\x94t\xa4v\vr\xab\"jDo\xbdG\x10G\r\xe6\x98i\x03\xfe\xb2\x84l\x03He\x8c\x86%ia&9\xb3d\x89\xb6\xcf\x1cd>\xf3\xfc\x0e-i\r\xb7lM\x12\xee\xbeܰ\xd9\x16\xa1TA\xef\x94$\xb6\x9cVHG|\xe7\xb3\xec\n\x88\x17$\xc7\x0f\v\v\xea\xf9:\x1d\xc7\x121R\f\x15s\\\xf0Z \x14$\x91Pj\xd7ۇ\xbd\x8f]ً\xc6g\xd88`簆 \x16\xfbzߒ\xf2\xa4\xcbV\xd4X\x8f\x19\x15\xa3ݕx\xbartX/\xa0A\xd1p\xd72\xb4\x0f\b^[1~R{\xef\b뚬\x97\x19\xb2\xbcɇ\xa2:k\x0eC\x11U\x12'5n\x98\x90\x1c%\xa1'\xd7CX\x02P06G\x83ۮ\x91\xfbl[\xe9<\x96\x1bN\x83scOFeQ\xfa\xca-\x92gi$\xf3\x18RN\xe8\x13\xb2\xfdo\x197\xd2Wz\x9a\r_t\xba\xb9\"?\xeaz\x83\xf66\x8c\x97\x04\xbb\xcfy/H\x16\xa2}\xdc\x13\x1e\x92\xf1ё\x83\x02{qL\x81\x1d\x9c\xf1$\x92\xf2\r\n\xe7\x9c\xe0-\xc4\xc4\xf4a\xa1\x8f[\x8e\xfe\xf9st\v\xddnS\x8cn2\x8eğ\xe0@\xa1\u007f\x92\xee\x1aѷ\x8a\x8d\x0f\xbf\x0e\x0f\x8f\x8cxHNp\xc1\xa2\x89\xc7\xe3\xb5\xde\x10\x1e\xd22\xf1\xd0\xe3\b&\x04\xe1\xe9\v3\x03\t\xa7\xf1\x84\xf3\x91\xcd\xc0\xc6f\x8c\xf7x\xe3\x0f)\xe7\xfa\f\x11\x01WP'h\x827f\xf2>\x91\xda \x96\x02s!\xa8;\x15\xfcp\x81\xd5&Q\xfd\xb1\xb7\xcec\x0eN\x1f\x04>OgdH\xf7E\xde1u\t\x10{\x84\xcc^\xcbگ\xfcV\xe4}\xf1\xe8\xe32\xdb@\xe7J\xcaH\x05\x95S\xe1\x16\x1e\xf6\x14>!~\xf5\x16\x9bL\xe9^d\x1b\x10\t\x98\xe6r\xc0\xd25/\xe7\x1d\x90GyN\x0fW\xfe\b-\xf5`\x05\xa4\xb1\x1b\xe2\xe4ɚLJ\x03\x9e\x8b=\xa9\xd4(R\xa5V2\xc3ȏ\xecM;\xbe:\x8b-\xcf\xecA\b0<\x19Ȥ\tL\xc3\a1L~\x18.\x81\xac\x1c\xb5ܤ\x10\x89kg\xc7\xcfLinN\xf1d\x9b\x90\x8f\xf3\xbdu'\xad\xf2\xd2\xe3f]\xa1\x1e\xf1\xb5B\xfbs\x14L\xb7\xb7A\xc9\x015S\x87h\xd5K\xa3v\xe6\x9cvn-\xca_e\xbc9\x10e\xf5V\a\"m\x93\xaf\a\x89B\x12:\xefG\x03Ϋ\xbex\xd6c\xf5ZX\n\xae\xbe\xc9o\x1a\x1b\xe9\xday\xfe\xe5\xf9\x00\xf2\xc2H\x10KgT\x9c\x1c~cN\a¸\x17\xed\xe2\x00\x87OZK:\xdcb\xdcA\a\x80%9C\t]\x9d\xc3o\xf2\x15ʗ\x17\x98\xb9\xc8\xd5w\xdb1\x8d\xdd)\x1b(\xa3t\xb8\x98^\xb2?\xb1\x81u\x80Ʀ\x98\x03-\x14A\x01\x9d\xba\x8a9\xaf\x19\x8b\xa3\x00\xa7\xe99N\xd6ل\x1dL\xad\xf6\xc1\xbd#\xdaA2Yu\xda\xe9\xe1\xe1\xbd5\xc7\xc6/_\x1e\x1f=f\x12ql\x14\xca\xc7j\xf6\xc6\xe5އ\x88\xbf\x11\xbeˡ?u\xf6\xfdAr\xa9Z\x99\x9a\x16\xcd\x02\xd1]\xd3A\xebX \x14_\xd5v\xefM\x0f\xbc\x8f1V\x1c\x96\xbf&\x19P\\\xef\xea\x1d\xc56X\xa3\x932\xeb\xeb\x9dm7䥱[lҏ'\xbb\x1eA\xa9\xc9Q6R\xbb\vS\v\xedQ}\xeb딭S\x87\xece\u007f\x95\xec\xefS\x1c\\D-wLrTC]\xb9ӎorly\xbd݂X\xa5\xcd\xdbJ^fo\xee\xa3\f-\x8a\xe9\v\xf0˰\x87\x95(\x95X3\xd3R>\\\xd6#\xea\x96\t9\xe2\x16\x89VP饘QՐۑ\x1e,\x1ea\xf9e\xa4\xcf\xe4\xa6X\x9b#\xbf*\x85\xdf\xe7gV\xecTnq\xf9\x8f\xcdGL\x97(\x98\xc2Z)\xd3o\x84M\xf3\xc1i\x8e\xe5!#Z\xd1\x18\x04\xcaH\x05.\x83\xd0$\xf1\x89ɀW\xfa\xf5\xb4\xa0\xaf\\\xb0p\xa9\xb8\x15\xd0*ȶ\xf5\x8d\v\x17/\x0f\x94\x95.g\xbe\xd2y 9\x93\xefL2\x97\x81\x1ap\xa7(\xd1#Z-)i\x8e\xc1\xb8\xf3\xb5\xddj\xeb\xb4\xd2jԭ\x19=\x1f\x1a\xbc0b\x93\xf3\xf2\x1b`n\xa30\xe0a]\x9ck2\x93I)\xbaX\xedE\xdb8f\x96nD\xb1η\xbb%8\x92CS.\xdeo\xda\x15\x8bě\x18\xf6Ng\xdf'\u007fd\xddp\xad-\x9d\xd9J\x93=a\xba\x8a\xbdY\xabɹب\xa8\xfcNk\xb1Y\t\xa5\x91Ե=\x81\x9a\xd4\xc3\xe3\xf5\x17f\x85\xe7N\xa5\xac\xec\x03H\xce^\x95\xb9\x03\x9f\xce\x19\x9ff\xe3\xa8<\x96\x97\x1f\x89(|\xe2E\xd3\xe4(SL\xb5\xd7\\\xf9\x9f\x8a>\x9cu\xc24\x0fvdN\x97\xe9\xbe\xf5~\xb4HN\xf2\x00\xab[\xb1nD\xc4\xcc\xcaeh/ڈ(2\xa91\xa2he_ʔQnV=\x91C\xe4\xf6\xf0\x92\xa8\xf9H\xff\x1c\x1b\u007fE\x8d\xefg\x1bi~\xa7%\xaaB\xa5\xe315\xfe\xc6\xe0czŕ\vv\r\x81>a\xebY\x80\xf1%\xb1e\xbe&c!\xa0\x89\x15pIB\r\xcb8г]~A-l\xa164\xc31\xa5\x98\x92/\x15\xb0[\\\x12\\Z\b\fI\xf5\nT4\xd0\x1cW\xb9\xf9\xf0aa8'l\xfa\x88xRY\xac\xdfN\x92e\xfb\x00\xc6j3:\xdc\xed-\x06:G\x90\xdb6\x17\xe5\x19v\xd3\xe1ad$$`\x83M,ܔC\xf4\xf6\xbe\x04z\xf03\xb7!q\x861\x93\x98\xf7\x8f\xe0]Ӌ\xd9\x17\xdfn#x\x8e\xb5B\x0e\x8d\xca\xe7\xc6\xc0l]\xb8\xbeK\xc3^\xb7\x0ft\x0e\x95\xf4\xb9\xd6\xc2\x13_@Y\xd0\xfc\x17u\xec\x9cgS\xfa\xb5k\xae\xe7]\xd0\x02OƤ\x97&v:\xf5\x98\x1fN\x83\xdba\xfaL\x19\xd8\x11ewɋ\x9e\xf5-hY}:\x1e\xa8\xc1xi O\xb9\x05 \x95\x8ax|+^\x8bñ\xb2Cq\x01%\x84\u007f\x03\xe6\xb8]{[[\x1b\x1e\xd8q\"\x9a\t\xdcx@L\a\xd6upՔ\x1d\xd5\xc3j\xbb\xea\x83\v\v\xdc\xd6-\x01\xdd\xe8\xa3[=\xc9\u007f\x8b\xc0\xf5\x93ئ\xb2\\\f\xf1e\x89\x8bjq[\xfe%\xef\x1c\xb3^W\xa5\x87\x94\x1a\x19'\xe2Hj\xd3y\xc2c\xea\xf4%J8\x8a\x18Imx\x95\xc2\xe5=\xe8C/\xfa].&\xc1w4\xcdD\xde\xc3,Ƙ\x17\xce\x13\xca\x1c3\xf9\xb9\xea\x94\"\xb6z\x96\x14\x9f\x83`\xc5U\xa9\x90\x16\xea\xc1\r|M:\x1f3Qc!\x93_ǣ\xe5\xf1W(\x01\x18Wj\x87\x90\xd3\xf9q\xeb\xd6S\xf2#f(G4GޗI>\xb4\xa7\xd4\xe0\x85\xe4n\xd5ڄE\x92\x06\x0e\xfc٩\xff\xf7\x8d\xf2^\x84\x9b\x92\x80\xe6\x97˗\x8b\xdan\xf1HG[\xc7\x16M\x89'\xc9C\xd4&\x92Ǹ'o\xf8rUm\b\x05\x80\x1c\x8a\xc6\x11\xfb\xcdN\xcb\xcfݾ\u007fwJ\x01?\x89\x12\xe56\x97\\A<\x88\x8fN\xc1\xb6\xf7\x0eZK5\x12\xa2D\xc1)\x98\xfc\x85\xef\x1dHi=\x17\x82i\xd9qlS\x05\xce\xd5:\x9cB\x1a2\xb6&yY\x91\xed^\x1b\xd9\x06\x17bخu}\xe6\x10Y+l\u007fc\xfc\xbeZ\xdbmL\xc7\xd5%9\xa4\x15\xe3\xa6s\xc1\xc6̪Y\xefO\xf21\xe9ߺYD2\x0eL\xb6\n\xbf\xfd\xbfʢ%\xf8\xa2\xf5c\x15+7\x9d\aV\x94_.rsIq\rp\x1bש\xf0\xb9\xe5\xba >\x10\x04\xc9bG\xecNz\x95Ž2\xb2q\x96X\x93\xfdD\xf9I\xae\xd6a\x8a\xf6\x96\xda'H\xff\x10V\x83T\xa2\xad으\x99\x9f\x1f\x95E\xc9t\x8f|\xfa\xdaG\xb53\x96(\roOtrJl\x0f\x97\x12s\x02<\xe5;\xd5\xf2\xdc3)YQ\xf9\xe8\x81`gw\x878\x05\"o\xbd&\xef\xdf7>\x17\xeecѭ\x82\x88^\xa2\xf5@&\v\xe6\xd1t\xeaT\x93\a\x12}g\xbb\x1c\xb1$\x82}\x88\xec\xb00h\xbah\xbd\x13)\x88GT\xfa\x01\xbe\x00\xc7s\x94\xe3y4r\xec\xc7\x00\r \x14\x00\u007fo\xea\rM\xf2H;\vΦw\xea~|\xaa !(\xeb\xef\xf2\xf7\xcf\xf9\v\xf6\x86\xd9\xe0\xb6\x19\xf7ad\xd8\a\"\t\xb9\x91\v\xdb-sQg#\xe2,1M\xb0\x16\x9c|\xaf\xad/\xa9u\xcdh\xf6R\x94\xb1\xd3-\xc7.k$G\xf8K,݅1a\x15=a\xab\xfc\x8cYP\xc7A\xc6,q\x94%!\x11\xd6\xff\nON\x05\x15zvN6\xd7^\xa5\xc6\x03>\xf0\xeeƬA\xe9v\xdcJ\x87F\xf0ӽ\xcd)\xb0\xc9\n/\x9d\x99\x8aުl̒\xa9B3GM\x19\x9c\xaf'[\x18\x90\x1a,n\\\x16\xbe\xe7\x8c\\\x1dk\xdeѣ\rm1\x05\xa5hm\xb4o\xb5>!\xd3\x1a\xf4\xbb\xf0\xd5jM0C <\xa6\xe9\xe7\xff\xf3\a埵\x80\xb9ߎ\\\xbd\xbc\xbb\xbb\x91\xbe`K\u007f|\a_xN\xf4\x11\x11`ǀ\x9c\xb8\x9epW\x1d\x1dJ\f\xe8\fjHL\xf6M\x0f\xa9<\x94\xea_\x94\x92\x89=\a\xf9\u007f\x9f\xaa\x90C\x05\x14\xa8\x8a\x06M@\aWޅ\xce%ꉷ\x16\xb8\xfddž\x82\xf4\xe1\x93f\x14\x97\u007f\xa3\x8e%\xe4\xa7Mn\xd8p\xe6\xa1\vZ\x00\xd43\xfd@>'\xf6M\xbc\xf0d\r\xfeY\xba,B\x04T\xb3\x97u\xb1\xc2J\xf5:\xf9\x03\x1b\x83\xe6\xd8o>\xaf\xb5b^\x1dչ\xe1ȑ\x92ދGx\x8e\xba_W\xeb`\xcf\x04H\f\x04\x8f\x92\"=\xb4ϟ\xa3\xfe\x01z&=\xde\x05\b\x1c@\xfe%ӌH\xd9\xf3\xd8qi\x93x\x17\xb0DH\xbaXx\xcfjꄯK\x01 \x16|@\x00\x04QT\x16\xb0\xc6P\xa8\xe4+\a\x18\xe3:u\x1e\xee\xb2c\xdd}О\xbdT\xb2\x9b\xcb\v\xa1\xf0\x85B5\x8cڨ\xca\x0281\x82\xd6hȩ\xaa\xaa\x9c\xa7a\xb7\x99Fu\xf6XLc[\xa1nNרxtN\xdfD\x9bX\xd8\xc5*\x11N8\x04\x02\xfd\xf0\xc6\xdc\xe1\xc3s7\x1e\x02\x16\x89\x15|\xf8\xf6\x18\x86\xcd2\r\u007f\x90\x05R{>}78\xf8\xd8.\xc7\xe1\xb9G\x8e\x9d\x04\xd5y\x11Ղ\xb0\x9fOg\xc1#\xf8Q\x0e\x96\x91\x9aq\xf3'\xa0g\x12\n\xcff\x92\xaa\xb8\x12\xc2\a\x18K\xf8Y\x88\xb4`\xb29\x8fh\xf32\xea\u0084\xc96\xda\xfd$}\x93\x1e\xae\x0e\x1e \x97\x83(\xc3T?\xbb\xef\xb2\x18}A\xad`\xf7\x0f7\x1b\xd4\x058\x94\xe8\x80\x18L\x19HFR\x12\x03\x89G\x8a\n\vE\xfdFJ\bXw!S\xc3K\xd2r\x86\x1d\x8e\x00\x04\xde@EKa\xfa\xdc2\xcb\xf6'\xbe\xe9\xb1ʌ\x94%v[؟[7\xbe\x82\x1fS\xaeF\xb3j\xbc\x01\xe8j\x86\x14\x87[5\xe8h\xa1M\x06t,\xa1\xb9\xe1^\xff\xa1\xd2i#\xda\xe1Co\xaf\xb4\xceq§\xfbZ\xa7e\xe8\xe6\xf3\x9a\xbdt\xac\xbfe\xe3\x19Wi\xfe\x95\xb7\x87\xeep_\xd7t\xa8\xff^*>\xb2\xb8\xb1\xf9Vlh\xf1\xf9\x17Z\x9aQ\xa3jX\a\xa7\xcf\x1cB\xdf㨪\x829\xa9q\x027\xd6@\xf9\x19\xb1\x8b\x82\xaf\xb8'\xb4\x12\xd0\xed\x16\x1e\xe3\x9e\xe1\xfa\x1d\xab[=e\x1e\x1c\x89\xc4H+^ї\xba\xc5\xde\xeaa/\xf5G\x85\x136\x8cz\xd5<\xf06)yж\x87\xe5DH\xe4wF\xcb\xcf\xf3\xe3\x13v\xe5\xfa\xfa2nF\xbd)%\xc3d\xf8\xf3\xef\x03\xb9\xee.\x9d)\xe1\b\x14\xc6ەP6^÷r\t\x8d\xe3\x04{\xaah\xf7\xc8<\x8aL\xca?\xb3Ih.\xa7\xb7\x98\x8e\xb4dht[$\x9d\xe5\x1e\xe3\x16]\t\xec\xe2\xb2fŘ\xb09&4.\xda;\x00\xe6s;\x8fB\x8c\xaf\x95\xfd\xf6\n\x12\x9ak\xf6\xf5\x19\xdc\xe6\xf5\xf5\x95~\xcf>\xa8j)ϰy\"T\xcb㝼j\xbdMU\x1b\x81\x02\xe9d\u0382M\xbcݱ\xad\xb4[\xff\x84D\xf1g4\x0f{\x1a+\xe1ݝ\x1f\xa9\x8c\x02\xa1\x17:\xaa<\x839q\xa9\x02\xb7\x01\xfeA\xcf\u007f\x14\x02\x05\u007f\xa1\x15w\a\tL}\xbb\xc5A=£6\x13\x1b\xaf۠ev\xf8\xddAu\x11\x94+U\xfa_\xff\x1f\xf6Q\xde3f\xde?\x9f\xe4\xe2\x95\x1bR\xb7\\\x97\b0\x05R\xc6\x00\x18\u007f\r\xa4R^ \xf3,\xf7\x98\xebV\xd1w\x85\xdcW\xa2\x1b\x1d\x15\x82\u007f\xb2\xee2\xe2`A\t\x1f\xe5v\xa9G\xa9<9\v\x0f\x93\xca4nX;\xa1?\xbb\v\x89?\xf2\xa7\x1b*uV0\xfb\xab\xe4\xb4\xd3\xed\x03{[\x014\"\xae\x10\xc3\u0382,\xb6\x17\xc4\xee\x82\x15\x1aqӼ\xb1\xe7<\xec\xe7\x92RK\x9a+\x82\b\a\xdf\x1d\x86k5\xc8WxcF\xec\x84\xf0\x18P\bO\xfc\u007f\x1f=*\xc2\xf0\xa5;E\x12\xfb\x83\x05\x99\xd5\x18D\x83~\xbf\xcf:\x17\xd4\t\x92m\\A\xb6\xbep\xf8\xb2\xda\xfd\xcb\xeb\x19\\XX\xa7\bd\xb7\xff\xab\xf5+\xbfH\x0ek6\xfb\xffZb\xde\xec\xdfWsX\f\xe4\xac/\xd4\xcd\x03$_\xba\xadQ\x84\x13\x12\xf1\x84Z_\x97\xa9\xbdhh\x90L\xf5u|\xd7\xc6\x108\xf9\r\t\xc2\xd6\xe4Z\x94\xa6\xc2\xd4}\xf1IH\xc2:ƋoK}\xbb\x8c\n\xcca/-\xd5k\xa3\xf3xVq0\xc4\x02\xc2r\xca\xce\u007fLC\x90_\xe0\x84\b\x14D\x106h&軓S\xa5q}pߨ\xf2=\x9a\x18\xb8~38\xbe\x10\xa1\xf1^x\x8eSߡc\xbe\xa8\xd58Um\x11\xb1\xf7e~7\xb0\xb8\xb6\x1e\xf4\x99VUZ\xc7:\xf4vƯ\v\xe4[m\xe9>\x85\xbf\x13\x80?\xd3\r\xd1\b\xe0p\x1b}\xf4_\x06\xe1\xf9\x10gK\x06B\xdd\xf4\xa1\xfa\xc3_\n%\xeb_\xa4g=\xf7Ih|.ݥą\xf2\xfeV\x0e^1䓺0\t\"{\x93\x967\x86\x83m\x86s\xd09\xc8\x0fꛦ\xb3\xf4\xd1B\xe0\xf5\xecN\x9e\x94I\xc1\x13p\x87\xcci{\n]J\xac \xea\x10\xf6:M\xb8\xaa\xa5\xd2y\xe4%\x89\xc5u\x86\xe7\xd5\x06\x00\xbf\xfaG\xe6\x04\xcd\xffVց\xa1\x02\xb5\v\xe6\xd2\x01k\x02k\xb4\x14\xa4\x8d\x06\x8cpy\xe0\xa7\xe6\x81j\x06p:\x1a\x04G]\xafZ\xd0\xe8\xd8\xc8$\x120\n\x8b\xf4\xfa_\xeaN+M7\xfaY2\x18l\x15\n@\ax\x87\xea6\aq\x9d\xe1\t\xb7\x9d4\x9f\xd5\xdf59O\xd4Т\x9c}\x11T\x93\x90r\xfcf5\xfa\x9f2\xffk\x16 t\x01\xaa߲\xba}\xbbp\xc4U\\\xd2ur\xba\x9b\xb7\xb1sVl\xb8ת\x85a\x87\xf5\xbc\u07b2\x8e\r}Vm\xda\xf1\xc7~3\xffgm\x86\x8d\xcd,\x18\\7m}\x95-\x8e\xc1\x84*\xe3\x9a\x10,EH\x9bq\x03\xe7$Yx\xb8=\x0eE\x15\x98\xfc\xfe_V'\x9e\xf6C\xea\x19\xb2R\x99i\x87ND\xb5\xfa9\xf5\x03\x9d\x91/\x00\vC\x19b\xb2\xb3\xc1\xd8\xf8x\x9d\xa1@8`\xc12I̪,!\xf1\xd1\xc2\x03f݄\xb2nE\xf1\xf38\xdeb\xf1\xfa+\x12Q\x90\x942쪘\xeb\xbdCZ^?G\xf7\xf8Vf\xe2\xec\xf6砱\xb2\x04\xfb\x17(B\xeb\xe0Ie\xf3\xfc+\x14\x899\xad\x16\xee:\rA\f\x0e\v\xc3\xf5\x9c\xef\n\xff\xbcv\xa8\xa5\xd4\xd04\xd4RB\xb7H \xd7z\xe7ѳy\xec|\xffx\x1b\xbe\xae\x9c֣\xdbW?\x80E\x1b\xfb\x12\x1at\xb4\xd0FO\x0e\xcfܔ\xe1\x93c\x1e\xfb\x94=\xf5\x9a1E\xe5$V(T\xf3\x92\x9a\xd7\xc1}\v\xe6\xabrY\x18\x0e\xa3!H\x1chQ!.F/\rd\x10\x9e\xf6\xf4իG\xb4\x83\x9e0\xff\xef\xd4\xd1;j\x17\a86t\x1d\xfe\xc0\xc4\xea\xaa\xc5\x16\xae\xec\xd0\t8\xdc\xd5y\xe4\xf8\v\xdfQG\xb4\xfd/Z\xb5\x90a3\x06=\x06\n\xcb\xcf\xf4O\x81\xaa\x87\xc2_\xd5ؤJ\x9a\x99Pג\xa2I\xb1Rs\xa3Z=\x8e\x90|ڼA#\x91\x8c\xac\xac\x8c\xf0\x0e#\x91su\xeb\xee曻;.\xeb\xe9\xdd\x1a\x06\xbb\xfa.t\x8aש:\xeaK\x16IT'\x17\x816\x98\x1a\x95\xcam7\x98\xd2\"\xf2:\xef\x1a\xec\xe2\xbes\a\x03\xc5b\x12\xc7q\xd7yL\xe2@Z,Y\xaf\tbg\x98\x8e\xdd\xc5,\xc1\xfe\xbfn\x9f\x06\xfb\x89\x98{\x0eO\xb8;]\x93ɪ!_\xe3\"=c\x17\xf8Ӻ\x02\x86\x9a\x82dij\x9b2\xa4G\xecB\xbfX\xb5$\x80\xe3\xb5\xe0|\xa9\xab\x17\u007fi\xdb!\xb1\xa1\x82*nT\xee\x01%\x9b\x02\x13\xfb;\xcf\x15*\xea\xc5\xf6\xe4^3\xce/c\xed\xae\xb9E\xc0\x9f\x13s\x9f\b4\xf6\xbaC\x03wLj})\x19\xb1\xf9\xe2<(\x86\x9eYpHw\xe2\xdd\xf3W\x8b^\x92\xfdHL\x8c-\vv\xcb\xdbp\x84\xf9đ@\x01w\xde\xc4Пp\xc5̹\x9dU\xfaK\xb8\x97\xc0\xa1>1뷀\xf1\xc4L˾\xa9f\xe2\x040p\x89\xd0Ύ\x97\x1b=\xd4_\xeb\x8c\xf1\x9f!\v\t9\xfeq\xc6[\xba\xba\xc1ƭ\xae\xf9t\x84-c\\\r\xd5\t@\xd5q\xf1]\xb2\x92\xe0CAJ\xb4\xafp\xcdPao|\x1ey\xa9lN\xde\xea\x91{\x0fF\x86\xf3*3\xb3F\xd0\xf8\xcbxL\u007fTv\xa2\xb4\xd00ԛV,\x91\x90\xbb\xe4\xde\xfb\xf3\xd4jH\xf5A(\\\xc9\xf4\xd4x\xe2\a\xfa\xfb\x9f\xbe\axtP\xbd\r\xf5\xaf\xaaR\xa5^\xa9\xd7\xe5\xe5\x00S\xbf\xefh\"\x91H\xb0\xc6\xfdJn#_p\xbf.\xc2$\xad\xb2\x02\x19\x8ds2\xf0i\xa8\xf1\xfbB\xcc\xe6\xe6\xf1{T\xd1uZK\vt\\\xd4L\x1aI\x87\x19%\xbe\xed\xf1*\x9a\v\x8c\xbfP\xf8=\x16{\xf9b\xe0\"U\xb8Q\x87\"V\xd3R}\t>Z\x82\xd6\xf1\x8a\xd2\f\xa5\x81ŊN\xb1\xb3Vݮ\x02\xe9-\xfbJ\xc9\xech\x02\fσ\xe1\xcd\r\xc3^\xa9\xd9\xd5\xc1\f\x11\x8c;\x92\xa6FQ\xc3\xd4,*+\xe8\xad\"\xf5\"\xd500)\xb6:;:V\x94\xa7\x12P8*e(7\xd2Jl\x97\xbd\x8e\x8b\x9b0oHe^Ɗ\xe2\xe5y%\x81`\xbc\x93\x1d4\xa7\xc7Y\xd2[eX\x16}\xb26K\xfcJ\x05˩\x84\x91\x12\xcc\x00\x00^#<ɝ\xc9\b\xcfI\xdf_/\xee\xae23-@\xb1l\xb34\x96\xcb\xfb`\xca\xecP\xe2=\x01\xe6K&=.)\xe9\xcd՜XvL\xaa\x88\xc5f\xb1o\xd9\v\x9d\x8bBG]ޮ\x8d\x16\xd2+\x02\xf2\x8b\xe6\u0602Py\xb8\xd0I\x8en\xa9V`\xe6k-~S\x8c\xc5d\xd0\xed\x11d\xfd\x02\xd8cU\xb7\x97.\xdagƗ'\xdd 1N\x8a\xfd\xf5\xad0P!\xf4\x00\b\xa1ί\x82\x87H\x95\xed\xa8]Hf\xb0\x12\x9e\x0f[\xb4Z\xc2x\xcb\x1d\xe2\xc5\x05\\.\xc2 \x91\xe0\x80\xbd+\xa2\\_\x164\x13b\x98\xa6Ov\xaf\x1a\xff\x82\x8a\x92#\xbb\xae\xf6\xb1\x88\xc5v!\x82l\xcc\x04,\xd4x<\xec\x1aD\x13xIN\x02-F\x13\x82\xece,/\x89\\m\x82\xde\xd3d\xb4Py\x98\x12\xc4Ir\x86\x83ǐ&$\x8a\x11G\x1b\xbcK\xf1K\xb6\x16\x84և1\xc4q\x12\x97zG\x9f!\xaf\xa3\xb2\xb5A\x05\xed\xbb\xc0\x11\xb938\xad\x11̍\xcd\x0497U;ȴVe\xe6g \xb0\xe9\u074c\x1e\xbfL\xbb\xf8ΐo\x9ctp\x92R#\x05\x8e\xab\r\xeeA\xa7D\x88\x16\xa2\xc3䶅\x10\xa2)\xe8m\x83\"Ǜ\xf1\x19X!\x10\x0e-\xea\x97Μa\xbeR\x1e\x95\xaa\x82\xb9\x99_\xad\xf4\x91});\xcd;6\x13\xc5\xefП\xb2(\x8e\x8eo:֔\xfcqC^\xfd\xf9Ǖ\xed\xa9\xfb\xad۵\xe9\xadA=\x8ez\xf9\x1aO\xef\ab\xca\t\x85d\x84~\xf8\xca\xc5\xdb\xdb\xfb\xb6\x8d\xd7\xeehz\x97n/J~\x98ǪŤzS\xe8,J\x82\xa6J#2ŭ\xc3\xf3\x10i\v\xe1\xffZ~_\xa2{c\xbb\x8c\x1e]o\a\x96bR:\xf4v:\xeb\xa3\xe2\xf6?e?\ttZ]ָ\xdfՠ\xdfgժMk\x0e\xea\x16\x14&\x8ezz\x9fq\xb3\x1f\xe5%\xc3UCW\\Y\xdeڻes\xf5\xb6\x867iv\xa2\xe4\a\xb9\xacZ\x97d\xef\b\x1a\x14\x11\x9fT\xa9\x16V\xe6\xacQ\xccC\x8e\x1c$m\x04Čk\xc0i\f\xddw\xb4ƿ\x05\x12#\xf3\xe6\xaf;\x0f\xcd\xf8̋\xc9\t%y\xcbG\x1f\xad8@5:yq)\xb4\xa8\xac|⌬N\xdd\xe7=\xfd\xb4\xc6\xec\xc5\xddBց\xc5^\\\xfe\xa9S\xf98]\a\x02\xeb\xf5\xaa]\x9a?{\xbc\xa0rW\xf9\xb5\xf2\xd2[\u007f-\xec\xb9+W\x0f\x18\xa4q\xd9)^2\xd5\xf8\xdf\xfd\xc7-\xc8\xcc\x1bKK\xa0\x140g4\x89LҼ\xee&O\xf9\xb2SP\xbcd\xed\xe0\x02\x9dŞ-m\xb2\x15\x80\x05\xc7>\xf7\xb8\xdd\xf3\x80\x87n\xecx\x1b\xcaQyY崎\x00b\xe1\x1c\xe2\x89y\xa6C\x12Q\x9a\b\x9b\xce\xc7\xfaA\x00\xcf\x19\x93)\b\x98\x8fB\xcb\xebD`<`\x92\x88\xec\x99\xc1\xd7\x18\xb3\xb1\xb2\xf0\x05\xe9\xbf\xfe7\x9e\xc9\a\x91\xbb%f\"\xa5Y\x89\x16\x93\x15\x8d\xfb>\xb6\x92\xd9ШG]\xdcT}\xea_\xf3\xe2\xfa\x9d\xc3\xea\xc8T\x18\xc4,a\u007f\xd2\xec\xdf^&xԠ\xab\x91\xe7,v\xa54\x98EpW\xf0¶\x9f\xf2S\x84A\x14\xfdN\xefⅭ\bgj\xde)\xde\xc9\xec\xe2&\xaa\x8ad\x99\x00\f\xba5\v\xb84\xad\u007f\xe4\xfe(\xda\x04\b\xe7\xe4$\xc1\xfd\xe3sD\xe2Bݦx\x9d\xf0O\x9fh\x11\xaaXQ\x9f\xccL\xe2\xb2w\x98\x05\x8a`\xed\x1fq\x8en\x1dP\xee\x88sT\xa1\x17s\xdb\xd5'@\xc7Tz\xc0\xbd,\xed2\x1f\xcc\xe8J\xb5*njވ\xfb4_\x98}3\xb9\xb8\x17\x9d\x9c\xbbי\xc7j\xc5ҫ-\xab%i\xf9\xa8\xf2\xa5\xbd\xe9\n\x80\xf2\xb7\x01\xbd\xc2P\x92O\xf3\xa4F?\x8f\xadkjS\xdb#\xed\a\x04G\xfa'\xeb\xcap\x1b\xf61\xe6\x8e\x1d\xbdJ\xc3\x18m\xeab\x06\xda\xf6\xcd\xd5a[\xef2\xef\xb1\xe5?kKq\x01\x1c\xa7\xb2!\x8c\x88@-^Y97\xf7*\x9d\x96o0\xf0\x81\x91i\xc5M\xd2l\xe4=\xf5ߺ\xfc\xb6\xb4\xed\xaa\xbf\xa5\x92\xf6\xbe(\xe97g\xa9\xbc\xbf_\xab\xdfǙ\xc7\x04W\xe5أ\xa4\xd3..\xfb\x8d\n\x8c\x0ep\xcd\xdb\x1e\xe8k\xa4\x8c\x03\x9f\xae\v\xee#\x0f\xac\xf3\xf8\xf8\xc1c]\x06@\xe0\xf9\x03\ue5d2\x8dq\x03\x8bo\x9as\x16]\xacvK\x8e\xc0i]\xd3C\x15+\x1d\x9aK6\xd6\v-\xed/'S\xa2\xcb\xe8{V\xaa\xe1F#p\x05ƦuO&\xe1\xe5g\x1e\xf4z\x89\xa9u\xf2\xe0t\x92\xaaxeL\x94.\x8a\xa8v\xdes\xdcMf\xefџ@/\xe3\xce)\xf6u\x95\xb0\xef\xc8\x1bA\xe3)\x1b0!۽\xf8\x00)/Y\xb8\b\xa2\xc6_$mU?S\u007f^\x15\xde\tGq\xd1\x01\xda\xcb\x13\xc8Vċj.v\xdd\xd6\xf1UH\xa1\xf30\xc1\xcamǕ\xd6\xd8*3\x12\xa8\xbc\x87\xd0b\at3\x80\xa3\xda\xc9(\xe1\xcf$F#\xb1\xc4P\x83hzZ\x98\xb2\xb2o\x11\xb6\x14\xda\\\xa2\xc8d\xf9沠pm\x1cL\x91~\xf6L\fj\x0e\x13b\x10\xcbm\x10mK\xe5\xd0\xc7\t\xa8qsN\xf1\xb6\"Q_Qh9\xd1\t-\x91\x1b\xdb㳟CU\xcf\x03\x01џ\xfd\x8fO\xea=ކ\xf6y\xd45\xf1\x84\xd1\fYk\xc8\xed\xd4\x1f\x8a\xc3N.e\x1cu\x9bi\xad#u\xb9\xe5ڒࠠ\xb9\xad\x92p\xd5\f*\x93\xd8!\xa1\xf4C_\u07fb3\x8c\xd5Q\xdap\x83az\x04m\xa6g\x1a\xe7-\x96\x8c\x99\t\xb9-\xe5\x89\xf3\xf4\a\x00\x02k\n\v8\x89\xabZ\a\xc4\xc3莧\x16\x96YP\x94d\xcc\x1fM\xaa\x9c\xb1\xf1`TG\xbc\xb5\xd0\x1chѤ]:\xabd\xf8\xd4\xd0VN\xcdv\x02c\xaaW:w\x99\x13\xeb\x8d|kҁ.:ӫ\x1e\x8dO\xddڑs\x80w\x1c p\x00T\x12\xca\xd2\x1f\f\x80\xb6%z\u0381ه\xc1*\xec0)\xd8\f\xea\x1eA\a&3\xaf\x92\x13PPQ_i.\xde-Z\xe9!\xe1\x8d\xd1\xf6\xbd%\xd1Tt\xf6\xa8\xf8f3\xebk״\xde+\xb4\xf0\xb4\xfff\x83\xd0\xdd6\x8b\x9d\xe3\xb5\a\xa5\v\xab\xd56mP\xd0яH4\xb1ׇ\x18\x85\xc32\xfe\xd5\xfc\n\xb1umMCͥ\x06\xe7\xa1pm*Y˭\xab\x8b\xd29\x0e\x01\xc2_\xbb\x9d\xf2\xe2\x15J\x11[\xc4\xf3\xf3\xba.9\xb4\xd7&\xf3\xe1,r\x80H\xb8i߃8Ʌ\xa0\xefa\xc2\xcd\xd6\xc8\xdf\x19\x97[\xbfN\x1e\x98n\xb3\xfe<\x8eCrxL\xb5\xefr\xf9J2\xe2vc\x18\x14\xfe\xe4>x\xcd\t\xfc\x9c\xee\xd6\x11\xe4J\x1e\x82#u\xe3\xa4\a\xb7:nY\x93\x16\x9d\x98}\x1al\xf4z\xc2Ӯ\xb4\xe9^Y;\x9e\xb6\xe4\xb1z\xb4\xea\xb3\x17Ӊ\xac1\xc0`7z\x83v/\x9a\x98_眓\xb0\xca\x0e{\x90\xcf\x1b='T\x87 `Jټ]\x18\x02\xf8ȇU\xcb\x02)K{v\xfb[\xa5\x84\x14\xb0՝y\xac`\xd7-0-\xd3?\x9d\x9a\xc1^\x82\x9a\xff\xc7[\xc9m\x03\x0fSƐ\x1e\xc2=\xf9\x03O#_D\xad\xad\x9dq\xc8q\x1a\x8emR\x1f0\x0e\xcd\x1a\xc2\xd3)\x95\ni\xa2b\x11J\x9d\xb1}\xe7\xce\xed\xf8<\xddw\xf8o\xe2a\x81\x01\x196\xba[\x9e\xf6\x81\xbb^D\x85\xde\x1c\x84Zz`\xaf\xab\x9c\xe0̶.D\xe6K\xcf\xf2\xa7\u007f\xcd\x1a=b\xb1\x05\t\x9b\xc6\xe2\xeeb\x88\x00\xe4\x9dl\xad\u07b2w헂M\xe2\x18\x9a\xd3\x067d\x18ֆ\xa5\xa3\b\x85\x80\x15\x80\xed#wQ]!\xb0\xf6\xd8˘\x98\x14\xf3g1}BJ\xda9\x89\x86\xfa\xc4\xc2Ԏ\xf1I\xae\xf3=CVR\x8d\xb9%\xceL\xd5MU\xa2]C(\xf5+#O\xf71Q\xaedj\xca2\xbe\xb9~\x12&\xc7B'٩p\xbe\xd9c\xf0Q\xde\x1c4\xcc\x1b1#\xb0\x96\x9aq\x1dʸL\x8f\xc9̮\xaeL\x9b➒\x16\b\x9b\x86\x19\x0eGZt*j\x18\x96\x1eI\xb6`\xe8\x16\xdbQ\xb5\xa2\x8d/\xd0\x02HJe\u007f\xd6l\xb9\xe8\x87\xd2\x1f豎\x95\x9b\x94x[0\x94D\xa3\u058c1\xc2\xc0STK\x89af\xd4;\xa2\f\xf8\xd93`\x17L\x98\xb0}\xe4\x8d{اJ\x11&5\xb3\x80\xb1\xc4\xd9\xeaJ\x84^\xb7\xfc\xf5\xb4G\xbd\x8f\x86\xa1\x86\xeb&\xf5\xf6\x9ex\xad\xee\xb2%n\x86q##\xe9G\xb3\xa17\x96\xa4\xffp(/8\xf9\x84\x9d\xd7ʶJ\x1bGy\xd1\x1b\xbe\xf68\xd1?\x96\xa4\xff\xb0\xc8+>I\b\xb4\xa5\xae\xf8\x8f\x10克W\xe2\xbbT\xdcm\nAj\x98\xf7/b\x88\a\xa6\x88\xb3YFNG\xffu\x17c\xfe\x04\xf7\xb5\x8e\\\xae\xc1\x8b\x88\xcf:\xebi%\xba\x96\xe1fU,p\x17\xe6\x82I\xec\x8dp \xff\x96^y\xb6\xeb\x95\x1f\b\xf7B\xc0cx\xc22\x8a\xd0\xec\x1b\xf7\xca\x16\rVb\xe0\xa76N\x01\xbfd\v\xd6ٍәT\x80\xe4\xe6\x9dl\x14\xc6W\x86{tĈT{\xf0\x96\xe8S\x11\x1e/\xa5Q\x95Y\xfe\xa5K\xfd\x8e\x15\xd57\xb7\xe4#\x12\xae\xbbp\x16QcGo\x91\xde\xf0g\xfbQ\xa0\x80G?e<\x80\xf3\xb4\xe8\x05t\x19\x86\xfd\xe7J\xa0\xf8\xe9\xac8\xb73\xd7Y\xb5\xb5ި\xfcF^:\x9e̊\xe3|\xee\x8eʚ8`r}\xe0Q\xe7\xc1hF\xe94\xd5뢺j\"\xb3:k\xa22;k\xa3\xce.,\xef&\xfe\xd6z\xdbTIF\xb7Ty\xf8=\x9dK\x99\xc2;\xc2pr\x02$\xdcѲ\x808f_\x9b\x93TI\x1fV[\x85\x8a[\x01\xb2ź`\xf6\xc2\xe6.N\x0f0\xceU\xb8\xa9\xe38I\x00Y\x9e\x97\r\xc7D5\x0f\x957\xf6o-\n\x1c!\xf3mv9\xa9\x8f\x1c\\/\xb5KR\x99\x9d\xb1\xe2!\xfd\x1e\x8c\xff6\xff\x88\f\x81b\xe9\x1e\xc9\\\xb5+'I\xe7e/\xb1\x9da\xf6\xcaFz\x1bͷ\x10\xfb\xb5{\xed\x8b\xf3\xf0P|\xf3\xb5w\x8d\xc34ej-\xa5\xa0t\xc2۠^\xc2\\\xdfSK\xd7+'\xbcJ\xe6\xfbR\x9b\x82S\xf4\x8e\x00\x1df\x99\xf0\x0e\xc8\xe6\x82\x034\xbe\x96Ԗ+\xc6e\xf9\xd0\xc7\"Ӄ\xd6j\x1a\\\x91\xf3ʌ\xe0E\xcd.\x02\xc5>p\xb6\xe6\xed\x97!\xcd\\\xec\xbe\xf5B\xf5\xe0\xb8\xc3}vچN!\a\"f\xc5\xeb\xba\xe3R\x8b0r\xd6G\xc0\u07fb\xc0*\xb9\xd0\xfd\x1f \xad\xc6\xf6\x95\x8d/J\x95\xe4\xf3\xe26\x1b\x98M\x9a\xfe\xf1n\xff\xeb\xca~\x8b\xab}}\x18<\xf1\xed\x8e\x1do\x13\xe1\xb0\xe0\x98\xe7lϸ\xfbp\xef\xfc\xbdf%\xed\xde\xff\x10n~\xdd\xd8W\xd5X\xeeU\xe1\xbcl\x11A!\xb9ˍ!ӫ\xc2\xfd\xfd8\xebiD*\xb9z\x123\xc9\xd9@\xb8\x85EYo\xca\x05J\xd2N\xf1C8f\xa4\x04\xb7\x92,\x03\xe3R\x1d\x12\t\x9cƏ\x83m\xd6w\xf0\xacE\x1b\x0e\xc1\xf1(\xc9i\xfdwL\x8c\x05\xdfe\xee\xe37\xebxЬ\xbb\xf2\xd32\xed\xe7Lz\x00\xac B\xa2\b\xc1,\xe4'\x1a\\n@Oޤl\v\xef\xf7\xff\x18o\xe6s4PcX\xa1Y\xfb\x13\x96\xc5\xdf\xcf\xef\v\xe5\x11\x8f}t\xf2\xacp\x8f-\xb4\t\x89\x8eyC\x1c&\xea\x1f\x83z\xa5\xb1\xca\n\x0eZ`7\xa1)\xaaT)\xab0\xffjJ\xa2\xf9\xd8ׯ\x8f$7\n\xa0\xbf\x93\xa2\x80۷o\x12\xc1Uck\x97\xb1w\xf1\xd4Y;8\xa0\xb6>\xcc\xeb\x80\xf1+g\xd16w&$\x1d\xd1>ނu\xcb\xeb\xb6\xee\xfa>\x1b\xc2\n\xddVZ\xeb\xc1\x88J\xb4\x05\xa3\x91\x1a\xb4\xb8g\x82˿\xe5=\x8a\xfe\x83>O\x8b\x01\xe5i\xe9\xb6]@\x9c\xc9\x01\xff\xe5QY\xd6\xf7\x86\xf9\xa7\xf7\xd8O\xda\xe6\xda\xf2\xbf\xd2ƽ\fAI\xaeN%F(\x9d\xe0\x9a\x04Y\xfe9\xcc9\xa3\xdeJ\xd5C\b4\xceQ@J\xfd\xb8\xb69\xa0\xe1u\xae3p=\x05\x820A\xa3\x8a1\n\xb8\xe4,^\x19\xf5>\x05\x84(\xb5\xdaHR\xa9\xd4Bx\x8d\xb5Lԇ\x88j-\x18\xf0\xed\xefa\xdap3\xad\xff\xfb7ub\x03\xf0NV4|\a\x11u\x87\xa0砋ale\f\x8d\x9az\b\xa2\xf6\xa8J@\xea\xd55\xfa\xab\xe2y\xb8C\x17\a\x8dQ@RRq\x82O\xf9\xa7\xb0\x86¼\x85p\xc5\xde\x18\x85\xef1\x03\xccB\xb8\x8fj\xb0*\xbd\x0e\b\x19O\xf2\x80\xed|O\xb1\x0e\f\x14,\x82\xee\x02\x8a\xfd\x91\xee0\xc9߰\xafʹ\x02н\xf3\x88,\x1cu\ue240\xc3\xe8\x84\xfc\xc0\xc2\n\xb4Hs\xfe\x125\xbd\xdeIJ\xd9\xcaR\xa5\xd5\xea(\xa5\x87\xf3\xf5\x8d+\xa4\xd0F\xbbL\xc7\x1f?Fh#~J\x17\xf4\xf2\xbd1\x0f\xf5\x94\x96\x96\x02\x1c\v\x94\xb4\xa1\x10p)O\"\xcd-J\xc8\x12\xfdq\x10\r\x9b\x02Ƀ7\xc7u6\x95\xd7(ۄ\xa2\xbf\xf7\xab\xec\xff\xee\x96!P@\x81\xea\b>\x1aÁ1\x94\n\x00\xa4&\x14\x19'\x8es3\xadه\x86X,\xeb9Y\x83\x17|\xbfs\x1a\xab\xd3A\xc8CEvp\xc6|̺%\x14\x98\xb3\x043\xb87\x1f\u007f\x94_*xC\xeb\xe68\xcf\n<\xa3\"\x8c\x1f\x1b'\"G\xc1\xb5\xf1\xe7\xd2!\a\xdd£\xc4\x10\xa4\xe7V\xf5볩\xe0s\xc0&<6D-m\x9e\x8f\xc1\x9b\xa1\x8b\x0e\x81t\xaet\x9ez\xe8q5\xfe\xb7\"m\xf7\x8c\xaf\xbcJ\xeb\xdc\xec}_\xfc(^\x0e\xbdm\xed'V\xa0\xb3\x9b\x9bs\x12\xde\x02۴F\xf7>\x12\x0f}*s\xd6V\xc9\x15Ӈ\x03\x16\"\xb0\xa6\xa0\xcc\xf7m\xfc\xb7\xb7\xad\x06\xef\xfc\xfc\xa8\xd5\x16\xf4\xa99oq\xa8\xb9\xa7\xba\xd1\xf9{\xc1\x94o\xac\x90!\f<\x0e\xa2\u007f]w\a\xbf@a\x0e\xf0#a\x8c\xc4\xe9\xb9Y\xd7Y}i\xc1\xa2\x94\xc4|#\xd2r\xef\xd2\\\xf6\x06\xf2\x89\x97I\f\x02\x94_ߙ\x89W+\xdb\xcb\"푎\xff\xdcNܞ\x820\x97|\x97\xe7\xa79\xa78\xe8ֽ\n.\xc5yf\x90\xa4\xb8\b\xefn\xec\xfesˡ\x00\xe8b\x98\xbf\xce~\x1dp*5E#\x01\xf2\x05s\n\xcbvN\xde9>\xd0c\xc9\xe4\xe8\xb3QG\xd5!\xeb\x80Ú\xc7\x0f\x818\xfe\xfcЊ\x91y\xb36&\xaa\xca\f\xbd-2\xb3~Q\xfb\x96\xcb\x00\x81[\xf4aṖ\x98\xebо)5\xd5\x1f\xe3\xe3\xd9\xe9_[\x97\x91z\xef_i\x1e\xeft\xaa\xe5\xf3b(߭\x1e\x1aO\xa4\x8d=\xe8C/\xfa\xc9\xe0\x9c\f\xed\x0e\xb0\x19P4?\f\x0f9\xe6T\xcb,\x02\xee1\x00\xa2\xafլ\xd2\x14\x869\xd1\xcd\"\xf5f\xbd\xe0\xc9P\ueb26]S\xbb\xf5\xdb\x1fԜ\u007f(\x1f0v4\xfbs\xcfJ\asb\xb5\x99nQ\xb7{\xe9\xec\xfc\x06}\xcd\f#\xc1@\xa4\xfd\xf2\xf7\xeeɏ\xa0\xf1\x9f\x19\x98U\xd9\xc1\xfb\x13\xbd\xa6^\xbe\x9cR+\x18\x81/6\xf7'\n\x12\xa4\x97\x90\x19\x8b\x8b\x11\xc8Kh\xa7\xf7-\xed\xdfF\xf8s\x815\x93X\xfe\xb4ޖX\xfcyXQ\xf73\x88\xd5\xfe\a\xd2\xe9\r\x80\xb8\x9d\xedWK\xfd\x8a\xd4b\"\x8d\xa8&\xcbâ\xd1{\xd6[\xedm\x13\x96p\xdb\xda\x1aZ\xa2\xbe\xe2ֶ/ʲ\x96\xc3Z[\xcb\xdbZ-l$\xdeN\x8ae\x94WHW\x06\xcfM\xc8_\x18\xd1\nVӧ\xe4x\xe6s\x93䀱X\r)\xe4\xd6\x1c\x1f\x99o\xc1C&\xa96\xd9l\x98ktIp\x89\xa1]\x00.@?w\x1aS\xb9\x9e\x86h\x97s-\xe2\x86$\xe19\xec\xe8n\xb1P[\x03\xb6\x9f\xf8\xf5\xb0\x8ep\x83Y\x8fӲG\xe6\xf5\x1f:\xf5\xa5\xaf\xf5\xf5\x99E\xebt\xd1\xd7\xe7\xee\x03b&\xb8<\r\x98E\xe8_\xeb\xf1\xd1p\xd10Jtz\x1f\xc0X\f\xa7\xadB\xb4\xb2\xf5\xac.R\xf6\xed\xfa\xf5\n.E\xc2\xe2Ď\xa0\x94u-0OSBþ\x18m\t\xe2\xdb\xd5Ǣ\x9c\xa0\xf1\xe2\x93\xec\x1a\a]v\x94\x16\xdfd\x9d`\xb7\u007f\xcbÝX\x19\xffP\xff\xe0\x9c\xe2\xfa\x9b[\r\x17\x8c\xeaV\xeeC\xd34O\x10\x91\x8c\x91\xb5\x90\xbf\xf70&z\xcd\xcdu\xa0\xc04\xc6&\xd1\x10\xd4E\xa1ʙ't\xd9A\xee\xf6\xcdB\xc1\xb5%\xda+\x87DˎG\x1c\u007f~A\xedx\xd6\x1e\xf0\xbcCPKZ\xaa\x00\x97n\x16\xac\x9f\xe7\xbeRg\xbc\xbcx\xc2+\xce\xf4\x1bi|\x1b\xb8o\xf1ʜ\xe2\xf1\x928\xac\xb7o\x9c\x17qJ\xb3`\x03\x9c\x14\xeb\xfcG\x14\xdc\xe1~\f\x86\x89ɕo P\n\xe78\x10\xb0y\x0fuq\x82뢵\xd9\xc2\b\xcc\xfa\xd6𐠵\xfa\x99\xa7\x8d\x8d\x9f\x99Ռ=ƶ\x9f\x13\x9bT\xdc·n2p\xad\x12\xb9\xbfaA\x1d/\xe1F[\r]+p^\xb6\xb5F\xb5\x17\x9b\xc4(\xca\xf3\xfd\xc2?ɬ3gg\x01\xf3\xb3\xf5\xd9\x0e\x04\xecQ)\xb4\x01\xc3\xc4Ċ\xb5\x0eDLm4\xf7\x98G;\xbf?81\xd7[ѫ\xd4T\xd8> =\xb1Q8\x1a\xe3\x13\xaa)ʒ\xde5\xc1\xa8ck+gdR\xbe\xf6\x00\x86\x88\x1d\xc3\x12A|\x86v\xe4\xec\xfda\xea\xaekBcz\xff\xed\xe5[\x95\xe9\xc9C8\x94^'\xb3դ\x86\xd4\xcfO\a\x80S0\xb7\x83* )\x9b5r\x8f\xeb|\x9f\x80Ȥ\x8a\x93^\xcc?\xf8z}\xb7[\xf0\xa2\xc0\x81SW\aU\xf7\xbd\x1e\xf6\x1b\xb1\x04\xecT}\x1a\x81\x8d?L\xd7\xc0\xf6\xf9\x0eU\xcd^\xbb\xc0\x8c\xcd}\x18L\t\xd26h\xb88\xdb\r\xeeb\xe2\x8dǎEڰ\x02n\xbc/\x84M\x01\xd1\xd9A\x85\x0e\x04\xec6\xca\xe2\xeb\xfb\xb6\x936Mk\x14<\xe9\xccu9\x8do5)?q\xa9\t#\xc6019u\xa3A.\xcamX\x02\x16\xa9iȪ\xf2fg\xc6Q\u007f\x1a\x93\xb7\xbaWo\xf1\xfeg\xad@\xc6\xeb\x18u\xac;\xc3\t\xc9o\x17#\b\x96\xa5\xcc\xf5&\x8fo4\x8e\x11O\x91:on\xd3\xf4M^\xa9\x9d\xa2;>\x9e\xe7r\x820\xb6.'\x9a}\x17\xbc)X\xf5\xe4\f\"\xa29\x99\xbaO\xe7\f\xb0\x8a\x8b~\xa9.7@3\xbc\xb4\xf2\xf1\x9a\xbf_~I*\xfa\x8f\x95`\xfa\x85\x0e\xeb֣\xc1\xb1\x12q\xad\x14\xc1\xca^\fQ(T\x86\x95\xcf\x03\xd8\x04ߠ1\xf7``\x06\xc2\xf3w2\x8d\xbe\xde\xc6u\xad\xa4\xe0\xafՓ\x05\xaf\xd7\x05أ\b\xcb\xda\xc50\x06\x12\x8cF\xef\xb5(zc<\xb9\xc8mL\xa9hc\xf2\xf5-p\x13\x14\x86:\x92|m\x03\xe9\xde.Ǣ\xb9VfhJ\xe2\xeaM\xf8~\x9a \xed[е\xb4}\xfc\xf4r\x8a\xca2\x8b\x04\xb8~\xfc\xe8\xa0wzJ\x05\x90:Ս{\xe9s\t\x10\x9e3\x11\xf6\xf7xԺ\xd7,G\xb7 \x9dMKd\xbc\x9a\xb0v\x17%b\xed\xb1o\xbe\x83\u007f\a\xd6|\x02\xe0\xfc\xad\xdal6\xa5z\t^aCG;zVl\xb8\x0e |_\xf5\xc3\x0f\xa6\xfdm௷E\xa9ZQl\x9c\xeeZ\x1c\xeb\xee>g\xb7\xe9\x10sSo\x98\xac\xbfl\a\x9b\x03\x87\xf3P\x8f\xe4\xae\x1b8\xffC\xe84>@\x15\x9a\x8f\xf2\x80e1b\x14ς\x1f\xdc\x1d\x9c\xe0\t \x0e\xfe\xccz\xd0\xd7\xf7\xe0F\b]\xb55\xb6\x03Qƃ\x8c/Y\r\xe1vAfG\xdbW\x12J;\xff\xa8=\xdeyw\x16@\xbcR\xbf\xdb\xe5\xfeq\xba\x19\\\x03\x12kK0{2tv\xed0\x06=\"w\r0\u007f\xc4N\xde\x17\x94\x03\xf5\xbcr\r\xafD\xeen\xda\x06\x83J`3\xc47\xf9%/-\xc3*\x9dR\x9e\xee\x80.U+\xfc[l\xafQ\x9d\x867H\xc2\x16\u007f\xc1\xd7\xf30x\x1b\xf8/{dž\x01q\xb0\x90\xc18>6F\xb2\xbe\x0e'0*\bG\\\xf2Q\xdba\xd7$;\x03\x9eh\x89f\x14\x00EB\xd7\xfc\xa7\x99C\x12\xba\x96\x84\xb7-`\x190\x81\xdd\x01)\xf0\x8f\x83y\x94[hʑ\x91\xf6\x13\xbf\xc4V\xea\x95\nH2\x9epC\x8a\x19\xb4xQ\xb5P¥\xf0\xe89\x9a\x12>&zgိ\x8f*\x95+kɼ\x84'\xc5\x14\xbf\xcaW_\xa4~I\xf9\xb5\x8e\xc1Pg_\xf7\x10CO{b\xf1\xe2\xce̖\x89\xa3\xaaaշ\xf3\xb6N\xc9\xc8 \xf0\xd0\xf4\n\xa7\xfb~A'\x0e\x95/\x02I\xd9\xe5팟o\xb2\x99\xf5\xea\x1f\"\xa7\f\xdaܬ\x1a*0w\x02\xa7\xc1\xb9\xf3\xb0\x81\xeb\x8eK\x1a\xa3OLx\x8b\xfb\x89i1\xc0M*\u007fˀzܗ\xb1{\x99 \x9bm\xcdeJ\xba!,O'\xf6\xa8Z2N\x8am\x0e\xc2\x0f\x06\xe2:\xa8\xb4\x8eܢ*G\xc7`\xe0\xf4x]sҶ#fD\\\x98\x10\xfd\x01\xf2\xba\x15\xa3\xc4FI\x82\x9dHw\xf3\xed]\x12\xab\xaa\x00\x92I\v\xfb\xa2\x91?\xb87#\x15ȂU\x89.\xf15w5ɮ\xceR?7\xfb\xd6\x17\x90\x0f\xae\xe40\x1c\x91:\xbd3\xa9\xbfn\x13\x01p&9&\xe7Vup\xb0\x1d\xb4\xa4AFs\x90\x14\x9b\x8c\x1bUc;I}\xbb!\\\x8f\x18\xaeUv\xc2\x1b\xb4\xe5}\xa8\x84\x01b\x82\xbf\x0f\x99z:\xcd\xcd\xce9y\x1e\xdc! R\xd9\xd4\xd8\xd7ξ\x93\xee\x93\xde\xfc\xa9\xca\nN@)\x890ߗDd;(A\xb0Xr\xb4[B\xf9\x12N\xfea\x1d\x1f+\x96\xe3{\xc7\xcd?X\x81\x87\x13\xfe\xdf/\xa7\xaaJڽ՜v\xd6ݶ\xc36\xf6lҤg\x8c\xb4\x87O%\xba\xa5\xc1P\n(\xc5/V\xab\xcd \xeaj\x0e\x84\xfe>MT\x8d\xf2c74bɤ^\xec~^\xec()y\xc7\x14I\xbd\x8a\xc7\xd8Єe7a'x\x8cU$u8\x95\x91\xe6/\xa1\x9c\xe2\x9c\xf4N\xf2Ψ'\x16n\xba\xe0\xceh贑\x9e51\xdb\xe8\x19;\xbe^n4\x8b8\xeb\xbeߖS\xcdq\xcfF;\xe2 Jx\x0e\x89\xa4\xdc\xca\xf0]\xf0]\xe6\xe6\xfeY \xee\x1d\xd6MG-WM\xa8\xc6\xd5_\xc9\tK\x0f\xe3\xa6\xc7\xe9V\xa4gGg\x17\xc7\xe4\xe3\xd3>\x84\x95\xddW&\xfa\xc2\x19\x19i\xbd&\r\xfb\fəۣκ5\xcbX\x98n\xbc\x13\xd6\x17F>gla\xd1⧲\x8f0\xc3\xe6\x11\xc2x){\x93\xe5\x1b\xe28\xdc\xdc}>;|\xce\xc49\ti\xb8 7?\xc4\xc9kN\xc1\xbc\x1b\xce\xc1W\xb6\xbd\xa6\xe6\xff\x16\xe2\xb3\xfc \xf9\xd5A\xf2\xf2P\xf9Ej\xf6\x87p\xe5\xa6Y\xd2rҊ\xd2\x13\xf2\x1d\x92J\x16\xe1\x12p\x187\xc3~V\xa1\xbb\xda\xc0\xb78\xe0\xb4\xcbo\x9f?\x97\xa3\xda\xef\xbb\xcb\xd7\xfe\xeb \x87\xab\xda\xe7\xad\xfc3#JF\t;Sl6\x10QA\x80i\x12\xdd\u007f\xab\x04\xa4\xf1\x05C\xdf\x0f\xecf\u007fT0Y\xf2w\x1e\x02\xc2I\xfb\xf7\xb4+~\xd4\x1e\xb4[\x97\xb0kB\x1d\xb1\x05\xe2\x934\xd11L\xf9\xa8[\xa1*\xf3\xc6;/j\xd3\xfaL\x01AM0X\xe5}>\xfd\x10\xb1\xb9\xa4\xb2\xf5.\xe4tغu\x15\xc8\xc3t\x1fj\x8d\xb2\xc4iZ\x8d\xb8\xea6\xc4\xec\xa1)\xe3\x10\xb1\xa4u\x11\xec\x1ed\xf8\x9a\xf8n\xe3\xae\xfc\x04\xc0\xb9\x95\xab\xbf\x9e\u007f?\x94\xb4\xd9\xca\xca\x15\xee\n\x83|n4oZ\xbb\xf38H\xdb/\xa3\xd0h\xd5!\xab\xdd\x04\x06}\x83I>\xa9\xd7\x16\x1f\xde\xfc\xdfd\xfe\xe4\t\xe4\u007f_\xe3\x15\bY\xf63\xa3rD\x90wc6\xd3Z\xf9\xb5\xcfK\xe5\x05ج\xf8\xf7\xc6A\x1e\xbf;\xf8\x9fT\xc9\xf8\x9d\x05\x01 GX\x19Kb4\xeep\x00:I9\xe8\xebm\x8d\xca{#?{\xff\xc7X%\xf6\xa5C\xb0\x87KM;\xe1\x8c\xeb\xc2\x00E\x8d({vT\x126\vLa\x9bY}\xc6j\xe3O\x93\x8cѭT\xf6в\xbf`\x10u \xb1\xb9\x00\x84\x95\xed\xbb\xcb\x1fJ\xc4\xdaۃ\xf52f\x841\xf6\xdfD\x9a\xe9\xe3\xae/\x9fM\x1a\xfc\xe8R\x8d1\xb3Cb\x87\x16 @#\x0f\xc4^$yH\"\xb6c\x03\xe1%\x1b߀\x1b\xe4\xc0\x90\xe2.\x13Mt\xbe\xd8B\x9b\xc9l7 \xea\x94\xd5^\x84\xa7\xc8]]]\xbd*\x97\x02\xbf\b\x10\x18\x12e\xc2g^1:\x8e\xb3\tv\"t\xaa\xbc\xc52\xed\xe5=M@f]\xe7M\xba̟D_\x9c\xf1w`tј\xfc\xef\x02\x86\xc1\xff\xa6m\x9d\xac\xaa\x95\xc8u\x1eJw\xa5\"Bh\x9b\x96\x85\xb4O;\x93\x1b\x1b\xfcֽ\x04.\x84\x85w\x893,\xc3eJ\xfbVKm\x04\xc4C2LC\x14yӝO\xd8\a\x11L\xfd\x81U\x95{\xca/\\\"\x88\xe6\xf1\xefK\xb1\th\x81\x9e\x90\xaa\t\xbfbx\x1aZ\x88\xbf\xebLR\x12\xbe\x9a\xbai\xbdO\xc7(=\xee\xb6|\xd2\xed\xa4\xfc\xc7V}\x88\xba)\xf0\xb5\u05fe\x9d\xe0[[\x01\xe9\x1f\xdaP\xf6[\xcf\xf3\xee\xf1n\x1d\xcc\xf3\xe42\xec6Y\x17\x9dK\xaa\x95\t\xbfU\x18L\x13\x9a}\x03\x92W\x190$\u007fڃR:\xa0\xa7\f\xa5O\x00\xfd3Ij\xba(Β\x1fRօJ\x8d\x80\v\xf0\x91)\xa7\x9d\xd4\x16\xf9\xed\xb7\xa6\xb1\xb1\x05\xfb\x06H\x9bI\xfb\x83\xd9n\x9cS\xb7(\xcbg\x98K\xeap\v\xa5\xa8\xef2\x9b\\\x9f\x8f\xa6\x0eoN\xdd\xef\x81\x1dya軚\xf6\xaf\xc1\x9e8\x94'\xe4\x90\xdap\xb6\x0e\xb1%\x1b\u007f\xd7\x01K\xabEE\xa9gO\x18\xc5[:*\xcc\u05f8\x10\x00\xcf\x0fp\xba\x98ⳇ\x04W\xde\x1f\xde\xfa\xfc\x19\xc7\xc8F\xcb\xe4t\xf8\xb5!\x03W\xe5o\xe3\xf6ڧ\x82\"\xb2˲\"Cրo\x88\xc5o\xbe\xe5B\xadJ\xe6d\x86\x97;'K͒\xe0__\xf6\xfa\x9eh\xa1v\xea+\xdb\xf3\x93\x17\f\f\x81d\xc0\x81\x03\xb6\xe4\xc8ލ\x8a\x8b '\x01\u007f\x97\xac\x9c\x87\x92\x86V\x94\xaf\xe1\xb8m\xac\x19\xb3\x0e\xaaI.^\xc5˅\t\xc1\xbc\x1e8\xdf\xf0B\x9f\xe3\xafs\u007f\xadf\x89G0\xd8\xfe8\xe3ռ\x1a\xb2*ʮ \xbc\x99\x14꩐\xad\x11Tҕ\x84\xa3c\xbe\x1b\xb36\x88s~\xf8\a\xa0\xee\x02Jim\xb0\x17\x16\xe9\xb1\x16\xa4xY~\xad\xeaV\xd3)\x89I\xba\xb7ƛ\x15\xaf\xc0+\b\xd4\xe1\x1eh\x17\xfc\xf3\x81\xcaΜ\xc5;]\xf5\x9eE\x9e\xc4\xd0\x1cB\x01AА\x05Q\x99\x89l\"\x94U\xd5\xda\u007f\x86\xf0\xb5,\xdeC\xec)\xfe\x10\xe4'f\x9bC{\xdcKD\x86]\xdap#(\x1c\x05^\xf1\xce\xdf\x1e\x15\xba\xe5y\xf7\x0es=\xbc\x99\x18=U\xb9\xdcjo\x16n\xfe\x10\xf0lVe\x14\xf6u\xc9\xf8iJ+$\xcf\xdad\xc5U\xdd#\xba;\xf5\xb6\x05O\xeb\xed\x9c\n\t?9\xaf2\x9c\v\x95<\xd7;\xb2q>o\tT\xafr\xa4\x1ex&\xd6\n[\xb5\xbb'-\xd2x\xa6p\xa80j\xa7[\xf0;3\x0e\x9cIw\xe9\x8a\x0e\xbc\xb5\x806N?;\x9b\xb1\xa1\x11\xa9K\x06\x9a\xa3\x9a9YR2\xba\xf0v\xf1r\xf9D3\xef\xc4'\xfa\n\xc3\xf8\x99\x0fK\xb6gՂ?h?\xcbr_\xfa\xd4\xf8K&\f`t͡\U0005f789\xa8\xce\xedy7\x85\xd4&.\x9f>\xfdt\xf5\x01\xf4u\xe74\x98ߛ\xcd\x14G\xb7\n\xb9\xee\xdd:\xe8^\x16M\x8apv\x84\xefwڴ\xdcYz~\x1cڇձ\xf7M٪\xe5!\xc1RW\x9bd\xc5;\xb3#\xf4\xdf\t^\x83z\x1c\xd7ʈ\x83\xb4\xf0\xc5\x06Q\x15\xa9\xdb\ft\\\xa3Wy\x02\xbb\\\x14OJ\x1714\xbe\xc7:5\xd2\\\xb2\xfe\f\xf0\x97SXT\x85\xb7\xdd ݓ\x12\x1c\x9a\xf9g\xe7v\xb7\x1eV9\x8fUkX,m\xb6iM\xb2\\\xea\xe8\xb6\xfe\x0f\xc6\xee(n\x8e\x9e>E\x9dI\x0f\xa1 a\xbb\xb7\xefI\xe7i\x85_\x14\x1f\x93\xbd,\x83\x98\xda\xe2\xc7\xea\x1f(\xf7\r\x15;.s\x9e)\xb0=5\x9eA\x9eI\x9e\xe9(\xdc\xcbwX\xa1g\xa7}4Y\x93\x94\xb1\x91Dp\xc44\x97\xac{\x1a\xeajq(Q\n̷ZJ\xb2U\x8dZf\xb1K\xb1\xf5*\xc5x\x00C~p\"\xd2\x122\xaf\xacr\x83#\xeb$!\x0e\x8cJ\x1e\x86\x1d\xe4zZ\x05Y\xd1.\x0e\xa0^|\x12h\xd0\xfd}\xa0\x9d\xc8z\x8e\xc0\x1b\xb2Xa\xe3\x8e\x15I\xa7\x8b\xa8E\xaaXg\xd0t^4\xabR{\xfe\xb3f\x14\x1a\x8aL\xc9\x11y\xd3\u007fp\b\xd1ᚚ\xc9\x06\x001ި|\xb0O\a\r\xde\x142\xdb\xe05\xde\"\f\f\xf2t\xc9U\xe3\x92A\xe9ޗ\xf2\x95@\xf6\xff\x11u\xfb\x1bR\xe4\xa1\xfdP\x1a\x04N\xb6X\xc61\xa2ZN\x06\x81\xfe\xff/\xa8ܨ\xbfx\xa6\xf6\xfd\xaa\x95IQ\xaf×\a\x06\x96\xc3_\x03\x04\x8ey6\x90EK\xf8\xaa\xa1\xa5 /\xbc\xba\xa1\x11\xb5\xf7\xc7 cuD\x96o\xbf\xba\x807դ\xaf\t\xd0\xfc\a\xd6\x1d\xdb|2\xfc\xd0V\xe6\xfcC\xe5\v\xcef+H\x8c\xbd\n\xb5:`\xbew\x9f\xf9\x01i\xf2\xc4y\xdb\xff~wk\xb8\xe5\x93\xd6t@\xcb4OE],\xfb<\xbb\xfa\xff\xc9ͦ?\x0fs\xe6\x12\xa1b\x181-\xab\x84\r\xf2J\xbf\x92\xdf\xc3A\x9c\xb4\xa7\xa8\x8c\xd2\xf1\xfeA2\xe0\xd2-=\x86\xc9t\xed칙C\xc2õ̍\xe0\u007f:\xf0\xc0\x0f\n\xe9\x9dBa\xb3;\x05\xf5W\x17\xe9\x92CE\xa2Ξ\x16r\xff\xe5{\xe7`\xc9&\x89\xc4,\x1f'\xf4\xdbt\xff\xdd\xec\x15\x8e\x8a[8\xc1\x17q\xe1\x89u\xee\xf8\n-(\xc7J\xec]\xbb\x984\r\xa8\xda\xf3\x99\xb2\xebʹ5\xab\xe7\xf0ay\xfc\xb7\nhh\xfaY\xb1\xfd\x99\xb8.\xef\xfe\xcb4\x9d\aj&\xb0\xb6\x1a\x934\xdf\xf2\x82\xb6a\xf6\x1c\xa2\xf6\v\x83q\xcb'(\x9a\v\x855\xe0\x97\x15\x13\x1d\x84\xf2\xb8\x14s\x1a\x8aX\xc3G\xf4jWB\x99\xec\x86\xde~\xad\x92\x85\xc9cm\b۶\x18\x8c/\xfd\x99.\x016\x1d\xcaa\xff_\x1bA5\xbc\xfd\xfb+=d\xbc\xdc\xe3\f>Ĺ_.\x19\xee\xaah\xcf\xcf\xc8\xe88tB\xe1s\xb8\xe80\xc4\x0fHJ\xc6\x1f\x8al\x9c\xe1\xa1l[UH4\xf6v.\t\xbb\xca>]\xc6(\nk\x8c9.\xa0 U\x94A:,A-\x15\xac\xbf\xc6w\xe6\x85yʰ\x90҉\xcb\xf1V\xe0jVU\f\x9c^\xbe\x98\x81}\xb0|w\u007fTH\xc1Ә,\x1f\x03Aq\xc80;,\xf3ZD*\xae\xdc#{\x9f\xbc\xadl\xccH7\xe0\xd5b\x1eRX\xef0C\x81\xc7d\xcduBѢ\xf55\xd2d\xa8=\xcdV\xb0\\T=\x9bQ3\x00\x13\x8b7o\v\xedq\x13A̐A\xfb\x8c\xebO\xfc\xfc\x06l\xeeܿ\xa2\x9f\xe7!\xfb\xad{_uD\fG_\x93\xad\xcerk\xf6\xafߘT\x94^\x98\x90\xa2}W\xd0o)\x18.8\x1a\x98\x98\xac\xa5|gW\x0fP\x95Ce\xeeJ\x9f\xbd\xf6\x9cx\xee6N\xb2\xd3\xfe\xff\a\xdf\x1f(\xc3~v\a\xfc_\x99;\xa2Ξ\x0e\xaa\xfe\xe0S?\b\x8b\x99\x8bW#\x18M\xfc˿\xdf\xd7^\x8a\xdb\u007fS\xe9\xc8\x16\xa1\xcfmG\xff\r\x1bθJ\u007f\x9f\xedQ50\a\x06 \xe5\x99i\xba<\xa5&+\xae\xc8;\x17\x1e\x85\xf1V=\xf4K\xaerU\x84\xbc\n\x9c\x1fe\x0f\x93\xb6\x83\xa0\xe6\xc4#\xf6\x02\xa7,\xcb\x10t\xac\x9eF\xa4jë\xaa\xc2Γ\x1a\x98U\xb2\x04\xc9|N'uL\xa4\xe2\xc3\x1c\xa1\xd1x\xa5\x87&\x8a)\n\xa96wrroG\xe6\xa04\x01\x17\r\xb1\xbe\xdeL\xdbR\xb7\xba\tgn\x94\x88Za\x9f\xa3\xb9\xc0\x94#t+\x152\xe4>if!\b\u007f\x12ϥ\xbd\x1c\x11)Ǿ\xf9>0$&\xdb\xcb\x04q\xa4\xc0\xbc\xd8\xedqJY\\\x92\xa7\xdaI\x02\xd6S(\xa5ˤ7\xb8^\x1c+\x0f\xad'\xd5\xc0\xd6\x19\x83\xc4w\x94ٚ\xeaze\f\x02\x8d!\xf8e\x95\x86-\xcb\xe1\xcfݙ{\x98\x85a\xba\x05\x8ew\x1c\x03τ\xc4\xfc\x18 \xa4\xed\xbdK\x1c\"\xabJd\r\xc1\xe6\x1dLy\"F\x89\xcdջ\x0f\xe3P\x8c\x00\x1cn\x88)\x0f\x87ж\xf3\xdc\xf5\fw\x97-YU\xb8\xff6L\xfa8\"\xb8!ѡ\xff\x19\xde|\xceF\x15\xfcj=c\xf4\xe8Ƞ\xec\xc0\x80\xec\xe0\x81E\x9d\xed\xf6\xc8\xceR\xfa\xd0\xc3z!\xf9<\xabnU\x17<\xa4Qc\xaa\xe6\x8c\xe7\xf0\xda\xf0\xf7\xf7o+\xf1\xfc-`(|ɍ \x87\xc8\xee\xa1O,\xf0\x8at\x1c\v\x16cR҇\x13\x9fӆ\xae\x9e\x05\x8a/j\xe4n\xed@<\x97Q\xa0g\xd8\x1a\x9b\x18\xab\xf9\xf74\xf4\xfc6\x9f\xa1\x9fW=Z\x8dڒ\x929\x99\xae\x9d4cK\xa8\xb6\xd6&{\x9e\xdb\xde}\xee8#Z\xf3X\xf3\x1e\xedWU\x17U+\xe9\xfcQG\xce\xd1\xf9Q\xf3\xdc\xc6\xdf\xe43,\xe4\xeb/\xe0%\x8aEo\x9c\xa3\x02\x8e\xdf\xc3އ\x0e\x14ռ\xe8\x0e\xe7\xf4\x95d\xcd7z}\x04\r#\x1dO\xb7t{yD\"3\xe1\xac\v\xbb\xc2\xf4K\x9e\xced\xae\x95\xf0 {Cu7\xfd\x90'\xd2\r\x1aC)n\x840{\x1e\xcf4\xack\xa6\xad\x90(|\tu(5\xfd\x95u)\"\xeb|\xb6\x14V \xfe\x94Wr\x14\x9e\x9c\xf0e\xae\x14\xf1n\xdd\u007fn\x93\xde\xebXW\x84O\x1e\xa4{\x8f\x84\x92Bu\x99WU\x87\x06\x1f\xa9\x92,2L!\x8d(\x8bK}\xb8\xa2\xe4\x8a\xf6=\xef\xf3\xa3\x86\t\xb2[\xffMP)\xe2s2\xf1\xdbl\xa26%\xe0\x18j\r#\\J\u007fg1a^\x1c9Q\xec\x1a\x1f\x1e\x17.\x99\xfd\xd8F\xce/\n\xf6\ny|x\xa4\xe4\xf8&\x8e>z\xd4|%%N\xa9\x88{\x90\x069\xb4\xb5c\u05c9S'I\xe6#\xe6\xfa\xc0ܳ&\x91QF\xbe\xe5\x8cn\xb6๕\x92\x12\x19\xa1\f!\x1aJƄe\x03\x99e\x91o\x1c},\xdd\xd0X\xd6M0c\xec\u007f\x02s9]\xe9\x98\xc3e\x0308u\xf8x\xac\xe4\xe3\xc1\u07be\xfdB䦂\xc0\xe2@h~T$\xc5%\n?\xee\xcf-&\xec\xb9=\xa5\xdd\xc4Es\x9b\x02\xa6nϨ\xdb\xecf'$\x82\xf6Є`9\xe5\xcfw\xa7\xa3\xdf\xe5\xfbvȒ\x9cߖ\xd3\xd2\xe2$sNy\xb17zԯ\xe93.ɉA\xbb>\x85\xf2c\xbe\x9f\xf2\xb1,v\x99\xfcA\xe8\xe2\xc5?p-?\xda\xf5#\xfeG\xcev˧\xa6hm,\xdd\x14Qv\x96\xa6G\xa2=KԾ\t\x86\xffn\xbck@p*\x83;r\xf4\xdeQ\xfb\xfc\xb3w\x9cZ\xba*ړ\xf8Ǥ\xcd\xe6\xf4 \xfa3ν\x93եwR\xf2\x01-\x85`Qz\\\xefӧ\x8dv\xe9\x00\x81c\xf4\x8f<\x80s\b\x00\x89\xb8\xd0*)\u007f\xe2\xc6\xdf%m\xe7\xbfgNܦ\ueeadIy\xb2~#\xe7\xe5+U`\uedf9~\x82U\x8f\xce\xed\xf2\xaf獫l'\xe3\u007f-\aq\x12\xf4'\x12\x89\x84֣\xa2\xd5\x01\x8f\xdbh&ɚ\x02,\xd8B\xbfL\x13\xa4\a\xc0<\xafg\xe4MIM\u007f\t\x00٧\x00\xe5\xfb\x8e\x12\x18\b\xe1\xce\xc2@nf\xe0\x00\x86\\\xa0\xf8}\xc1\xb4d\x1e\x1co\x98\u0087\x89\x8c\xed\x8c[\x176[\xaeB$\xac\xba9-\xb7\x9eR]Ղ\x93\xe2\x06\x06T\xcd}\xedu\x12A$\x9b+\xc1eҢ\x144\xc6k\x00\xfa\xbb\x8ev'\xef\xea\xe9\xfc\x9f\x96^K\b\xce\xec\xd2\xca\x1c\x186\ra;8d-x+\xb5\xd5\xe1J\a_\x86u\x15_2\f\u03a2G\xaf\x01\a\xcar\x03e=\x1d\x9d?\xc0\xdc\xfb\xdb(\xb6\xfd\xfd\x03\x81\x8a\x13w\x87\x94\x1b//\x94(\xc7\x02_`\xbd5\xfaw\xce/\x9e/+:X}\xb7Z\xfcX\xd6\xc2.ruȐQ\x96\x80\x97\x81W&\xed\x03\xdceUs?\u007f\x81z\xf0\u007fN\x83\xd2|jj\x04\x1a_\xc8Mw31\x87\xe4\xc7\x11\x1f\x0f#q\x16J[u\xffWF\xf0x\xf9Ԏ\xb0}\b\a\xday}M\x85r\xbd.)r\xe8\xbe1+\x89\x1b\xb5\x17)\t\xf3\xa5Qn\xb5\"|D\x1f\xc2U\x17)^8s6\xdc\xfe\xed\f\xfdc\xab\xc4#\xfb\x92\x0f\xa8A\xec;}\x97/\v\xdf\n\xa3\xc2\t\xcf\x1b\xb9\xd2?\xef\x1b\xd6K\u007f\xe4\xf0\x80θĻ\xecG\x9f\x9f\xfaMg\xddi\xbd\xa0\x0f9^#0\xf3\xcf;؎\x97\x12Jb\x18\x8b\x8fꘙ\xd8\xda\xf6#\xb2<\x9f\xe8\xebM\xebz}\x1etum\xfe\xb8k\xfb\x8ep\x87\x96aS\x16\xac\x98\xae\x9e\xd3\x16 2\xf3p\x18.A^S1\x9e_.wG\x1fao%7\xae,SUW\xa9\x94Օ\n7\xe7md\xb4%E\xf6=,\xdbP\x85\xde\xea\xa9[Ұ\xd3劚\xaa\xf5\xedl\x8a\xed\xe7\xf1K\x90=3\xba>h:pZ7\u007fן\x1f\xbbg~\xff\xde#\xef\x8a\xd4;\x1cxD\xaft\xdb\xdfO\xbb\xa6\xfe|\xd9\xdetҺ}\xd4\xd5&Y9\xfd\xe7\xe7\x14\xbaƮpbuU[]\x90\x89\xf1\x98T\xba\xa2\xd8ι#\xc2\xe1\xaaU\xd6Fo\u007f~\xf9\x16y\xceե\xaa\xa5j\xd8\xcc`a\xee\xb2\xea\xe5\x85\xcb~\xaa.;\x15&\\UB\xc1D\xae\xc8\b\x19\xbd\x93<\xe1\xa2\x12\xf0\x03j\xc0\x9a\xc15y\xa4уo\xe5)]\xba\x8d\xef\xb1,\xbd\x84\xb6+\xe8]\xc7*\xd1D\x8c\xac89\xbbż\xe2\x9a\xf6\x15\xa6\xa0mS\x8a\xddT\xa5I\xcc\xf69⺹\x03\xe3\xec\xdb\"\xaa\xfe\xad\xc4_KKgh\xc5\xf0&\xc3\\^a=\xa4\v\x12X\x86\xa7\x1e\x10\xc6\xfd(\x89\x1cu`\xee\xb3\x1d\xa5mgO\x1b,\x8bӉ\x86\x02h}\x81\xfb\x92\xdey\xa8\x06$\x99\x03ے\x12\xa4$\f\xdfE\xc6\xfb[\xd3\xe9b\x92\xc7\xe6\f\xb3\\\x1dڊ\xc8xl~[\xc5\xf0\xbe\x00\xd1\xd3l:\xb2\x0e鈼\xf6,\xb5\x12\xb3\xdd\xcdg\x03\x9f\\j\x81\x1b\x11\xadgY\x13\xea\t\x8e\x88'\a\xb4\x1c\xe5&f)\xe1\x8bGL|\x9fƭ*\xe1\x87\x1cQ\xdb\xdcpr\xa5\xa3\x83~\xee\x1a;\xceZ\xf1\xb4\x92\u007f\xc3I]\xac\xdd\r!<\xf9aP\u007fB\xb7I\xee\xf3\x0eb\xb8CUxЏ\x1c\x0e\xf6\xfdEg\xff\xc6C\u007f\xff(\xa6<\x15\u007fg\xb7d\xef\xdb\xd7РrM{LWҮG\ah\x127\xfc9\xb3W\xf7Fɜ,sR\x06\x85\xcbߕzH7\xd2zϙ\xccFrcHK\xfc\xff\xf8\x1a\xdfo\x19S\xae\xe1\xe3Fa0\x19\xc3\x16\xadz\xb2\x81\x95h\xc7C\xaa\x1c\xce\xd7:+\x06/\xa1\x9d\xaf\xd5ҭ\xfd[-W\x98\xc0 p\x02\x94\x04\xc0\xd03\x14v\xe8\xed\\uq\xc7GG+ԛDX)\xdd\xe0\x9e\x03'\xd6\x06\xe3\xb7&M\xebu\x19Ɨ\xd3Û~E\xad\xbcވ\x8cW\u007f\x17p\xa7\xf6\xdb5\x02J\xd9pGՠ\xd3\xd2\xf4\xb40\xcc\xea\x8c_\xd5ԍ\xaa\x8e\x00\xdfqW\xffĘ\x94\x98\n\u007f]5\x98x\f\x92\x00\xc9\xf6\xa0\x9e\x16\xe0\xf91\xcbyu\xd2&\xe6\xa7\x0e\xaf8Hȏ'\x13\x9f\xfe;\xa4\xd2@\xbbq\xa2\xa6٘\xec\xee\v\xaf>\xc4\xea0S|\xdb_Ae\x91g\xae<2\xcc8\x10\xfd@\xad+\xe9\xb15\x94\t3\xfbgKp:\xd6\xe9\xf0\xacE\a\xeaL\xde\xffBv\xffK\xaf\xae\x8b\x89j\xfb:\xe2\xbd\xee*&z\x85\x94\xdd\xe0\xa9\xfa0\xe2\x0eV \v>\x0e\xa1\xcdG\xb4X\x1d\xfeCJ\xa3\xeaI\xf2O\xb2\xf7Er\xb2\x03\xb2\xf0\xe3\x10\x13W\xdf\xed\xc6\x02\xedb\x95$\x9fW+\xc2^j\x92ɒ\xac\xfb\xfb\xf6\xf5ϖ\xf6\x9e\x10\x88\x856\xe0\x1dH\xd3X#18\v\x8dˌ5\x98\x91\x15\xd6\x03\x14\x97ԋ\xa2\xf4\x96\xd9`\xa2֩\x8ewG\xaeU\x17\xca\x03,\xf0\xb7\x9f\xfe03\t\x8f\xa0\xab\xec\xab\xf4\xda\xe7̵1\v\xc1\xd0Q\x99&\xc8\x1e\xa2\x9cg;!\x8f\xd0]v\x9aX\xe6\xeb~0\x9ca\xf6\xb9\v\xb9\x9b\xc1\xd5\t\x8f\xf8\\\xbdM\x81\xb8\xfc\xa1\x86F4C&h\xe2\x99 \x8dV\xd4Ӿӗ|\x8e\xac\xae怙w9\xea\xa3}\xc1\x9c9\x8d/\xb5\xedH\x86\x14Y\xbc\xb4\xa5\x9a1\xea\xe6\x95˚\xb5W\x05\x85(\xd4u2ig\x16o\xd4}9\xa8~!V7\x1b\xd6;\x9d:H\xa9\t\xf3xǗ\xd7\x13~\b㲿\xa7\x8a\x0fv\x05W\xdcز\xfbj\xa1\xcb\r\xfbw\x8f$\x19\xe2\xc4kʪe\x9a\xbe\x881Z^\x9dW$S\xd7+ļњ,\xa9-\xab3\xad\xd6\a!\xeccm\xee\x99h\x16\xfc\xba9\x95\x8e\x9b\xa1%\x06 Q*;%\x81_\x96\x0f\xee\x00\xa88\x88FV(\xb3\xd5\xf8\x86\x9bs\xf8߷f\xcc8\x14d\xf5\x9b\x9d\x17\x9f\x10\x9cشgm5@@7V։\xb5\xc9!)\x91\xde\xc2^`\xac\xd6#m\x8c\x13܊\xa5\xbb\xbe\x87G\xb1k\x82!\xbd\x06\xe3\x06y\xc3u訦\x19\xb3\xe4\xd4(+\xcbq\xfe\xd1:\xde\u00ad\xd1D݉5/\x80\xcbb\x8d\xb3w\x19\xed\x9e\xeb\xf0\xf2\x89\xf9\xd4\xc8b+\x19\xedb\x0f\x16\x9f\xf8ᎁ\x9a\xed\xbb\xd76\xce}\xebH\xafЛ\x87m$\x9c\x9ate\xd61-\x1eě\n\xee\xfc\xb5\xbc\xbb\bG]i\xb9ܘ\xf0\xa8\x99\xe0\xb9$\xbb\xbaQ:n\x1apy\xeb\xfes\x86ǩ\x89\xe9B\xd9\xe0q8\xf9\xa6\u007fH\xafr-;\xa1-c\xffN\xbf*\uf68d\xa5\x12r\xb3J]\x15c\xc4\xf2\xf3\xe8\xfdG\xd6\x1bY\xf9\xce\xeducyUk\xdbu\f\xd4\xca\x18\xbfDQ\xa0\x1a)\x8d\x9f:4^\x9c\x9e\xadK<|\xe7XE\x95ޚ.\x14Hx\xa3r亞\xa9j\xc9\xf8Κơ\xf1\x86\x05\xfb\xe3-\x9b]\xfd\xc9eU6\xa5\xff\xa3x\xacbk\xae\x17\x13\xe4\x1e\xa0_lo\x9f\x18\xd3\u2c2fuv\xa6\xb8oL\x0e\x94zA+\xd4$^ҕ\\w\xea\x02%>\xea[\xa1P\xa0\x8fG<\xaa\x9a\x99\xa92\x1a\x95\xd3\xe2\xf6\x8f<\xbdU\xc7\xe4\xe5\x8e\xeew\xb0\x95\x9c\x98\xae+=ܧT\xf32bwݠwx\xb6\xbd\x9f\xf2\n\xc8ay\x99#G\xe5\xe5\xc1\xa8\xe7t\xc6s+\xc7s\xaa\xe4\x8a\xca\xca\xf1\x0f\x96[\xf2\xabU\xd1Y1\x8b\xcdn\x1e,\xa6,(\xa74\x9c\xf7c$\xa1U\xccS\x99\xeb9\x93\x91\x9dB\xe7\x8c%\xc5Z\xfdH\xab\\R\xe8\xb7\x15\u05ee\xf5\xc2\x19m\xe8YZ\x84,]\xe1KH\x92[\xdaE\xb7\x10ÿ\xc7\xe4/l;\xdff\xbd\xeb\x12\n\xe8\x9f$\x806\xa8\xc2![aB\x85r\xef\xeb\xd6d\a\xb7Z\xf5\f\x8c\xccV\xcfzoْ\x88\x04\x81n\xd0H\xef\xa5\xf6\xa5\x1dK\xb0V\x16U\x85%\xb6\xce\x0f\xd2\xc3)G\x92\x8eB\x99$\xbeE7\\f\xfcYֵT\xe4\xae\xed\xb8\xc7\n\xf5\x06Kg\xde\xdfɷ;\xa27\x1b\xef w\xaf\xa9Bh\xfe)\xf9k\x85\xcd\xcd4\xb2\x8d\x97\xff\xe9\\\xf3\xb3r<\xc2zu\xc1\xabt\xabS\xe5o\xd7\xf9?(\x18#\xad\b\"\xa4*G\x84\x99\f\xb6\x1d\xba\a\xeb\x0f\xa7\xaa\x19\x8bF\xa1\xacn\xe3D!\xea$\x01S\xabx8\x90\xa0;\xad\x8a\xc4\xcf;\xc5(\xba\x93\x00\xa5~\x1b\r\xaaWou\xba\\\x18\xcb\x1d\aHt\xda*GĞ\x0ev\xca:\xaa\xd3[\xe3\xbeL\xd7r\x98\xde-\xa0\xab\xa9y\xfcG\xd0m\nk\x83-6K\x17\xbf=\x829\x01\xd8D>\xb9Gk\xf6\xbe\xe2\x0e\x9baD\x18\xeel9\xe0\xab*K2\x83\xcd\x14\x8b\xedJ8Os\xfc\xd3\x1e\xbf\x8f\xb2\xf5P\"偙\x13\xf3bN\xdb%\xae\r\xbe\x16\x04p\xee\x06xc\xc8\xccN\x92&a\by\x8d{\u007fM\x8blƪ\a3\x1e#L\x8dmN̕&\xd5>\x18\xec\xf4\xb34w\x12\xcd\x10\xd8ՙި\xc3\x17\x86\x96\x18|3\x91\xe0\xe4\x96\xda}+\xade\xd5\xff}\x87\xe8\xfe\xa6\xe1\x8d\xf8\xfa_\x83\xc8\x10\xd7,\xbe,A\xcbL\xe8\xe3u\xb4[\x99\x9a\x9c\xf9\x1dϲQJ5\xda'z\x99\x95\x0f\x9a@Nԝ\xcfZ̉\xa7ED\xce@\xa3(PVdl\x93\xac\\8N\xe9&,\x9c\xb0)I]\xb6d\xab\xe6\xa4N\xf3\xfe\xcf\xdeY\x168+\xbbʞ\xea_\xbb\x06w\xa0\x04\xce\xfb\xec\xffu⥊\xec8\xd7#\xfb\xe4+\xf31\x02d\xed8s6\x81\x92\x03\xf5\x9eǬ\x1b}壯\f\x9f\xe2\xd1\xf4Uy\x8b\xf2fc\x90\xc1\x99\xb8+\xca\xd4\xfb!)\x8dȦ\xb3\xde1\x9b\xb7\x15\xbe[\xe7\xb2N\xeb\xb0\xf4\xea\xd7}3ǮIG\xac\xdbu]\x8e\xdbx~\xde^\x85ʔ\x984\n\x9d\x99\x9bqd\xe9\xe6\x98\x03\xb8[\x1e>\x94,{\xec\xae1#\xf1^3\xaa\xefID\xef\x9b\xeb=\xebq\a$\xb1%\xf2\xa0ɥ\xc2\xf3:A*\x81\xdeCg\n\vR\xc9\xc1\xc4@\f\x95B\x94\x86H\xfd\x8e\x98@\xe4!\x1eTn\xfd\x9b\x15\xdaw\xb6l\xe2\xcd˭\xf0\x15\xd8a\b\x14\xb1]\xee\xcd\xf3ɬ\xb2\xc3\x11\xf4\x03z5\x13\x9b\v\xb5\xd2\x18\xf1\b{z\xdf\x16\xc5\xf11\xd2\x04R&\x80\x8fl\x9e\\Wџ\x94\xfbg\x82\xf0\x98\x00\x92EIّt)\x87\x1e\xa2\b\x848\x90R\xa8Tp*\x03YM\x9bڋ\x9bFfR\xbe8V\x97Y\xc2bJir\x165Fč\tN4e\xacgH%\xa7<\x90ټ\xa5\r\x84\xbc\bn\x8aj\xccc*v\x84\x9d<᧼\x15 /\xef\xab\xe3\xe2U\xf6\xdbjao.lG\x05\x8b\xe5\x92vA\xb3vP\xc0\x02\xb2\xf2\x04ؠ\x84Z\xabj\xaa\x89\xfb\xea9\xb7IdA\xe0\xe7v\xeaƉ<\x9f\x8f\vjO\xef\xeb3\xb5\xafj\x1a\x0f\x895\xcfKh\xf4i\x03Mt|\xb2\x06\xa8\aen\xdf*=-A\x00B\x8a\xf3\x98\x05Q\xf5\xf8\x95\xf0\x1e\u05cd.|\xa7\"?\xa9\xe3Ïs\xb9\xee\x9d\xd8\\Z\xde\xe5\xfb\x1b%\xd2\xfe\x1bg\x92\xf3t2^L\x90#;K\x9e0>;\xb2\x1f\xc3\xce!\x90\x93\x12\xf9SSI\xd5\xc7\xfc\x04!!\xaf\xd5\aH\x87>\xa0S\xd5\x14\xce|\xbcB\xbeϵŵ\x1eQN\xaf\b,$\xab\x16,J\xef\xcb,\x01\xad\x9fy\xf3a\x8e>A\xa2\xf0\x02\xf7\"T\a\xe0S\xe8\x83M\x9d\xcf\xd6\x0eK\x96\xbe\xfe\xd1\xed\a\"\xc3I쫈\x9c+\xa9;;\xa5Ӽ\xe8\xa5[\xef\xe9\xe15\x90\xad*^\xe5\x9e1!\x89\xdd;\x00m\xc9--?wb^e\x99\xa2Ci\xe8O\x15{\xe5*\x82\x9d\x03\xd9N\xf8C/\xfa\x8d\xef.M\u007f\xe3s'\xf8\xce\v\x1f\xb5\f\xb6\xf4\xd0f+v\x9aS\xf8'\xeb̘\x88\f\x81\x02\nT\xebkO\xf4H\x8cL\x96\xc4T\xdapR\xa4\x8fs\x19\x87#2\x04\x1c\x94Y\xdf\xd6\x14@\xb02\xbc\xe6\x81N\xf76^T\x9a\xbf)u[\xcc\x15>4(n#\xe3\x11*w\x9f²Jb\x9e\xd2\xdd\xff\xae$Ȥ\x95\xd6F\x0f\xfaTxM3\x04\x13,\"&\r\xf4ܴy\xb6\xcfWm\x1b\xc2\x01\x02\xc7\xc0\x81\xce\f\xe7\xaa\xfek!o\xbf \xaa\x84\t\xe5\x16\xfa,\v\x12˒\xd2e\xbe\xaa\x8d\xac6\x99G\x8cG\\r]U2%\xb6\xe88\xccWH\xef\x85\xe5\xb0\nC\xfd\xd9\x1c\xa2\xc4Qo娣\x96)\xb3\x9f\xc0*\xe9[zb\xc32\xe5n\xa3\xae\xfc\xb5ʹ\xa8.CL?\x9b\xdcg\xfa\x9fl\xd32\xdb\\\xf5\x94#\xa7.W\x98\xaa\xf2Y`\xe9\x1d\x1eWG\x81\xc1>r8\xf4\x8e\xa6\x13\xeee1\x1b\x8a\xba\xcf\xfa\xeej\xae\xc9B\xf3\xcd\xe3\xfd\xf3\r\xff\xd5U\x95\x98\xbfq8\xa5`{\x1fl_d\x98\xe79)\\\xbe<\xad\xba\xfe\xb1r\xc1.-\x95\x0f\a^\x88\r\xa0BtR@\xe4\xbb͓\xc6f\x9d\x048\xf1w\xf1\xd1\x05\x01<_I\xc8\xee\x82\xc0\xad\x18\x05a\xce\xc0\xb7\xc2Ɵ\x10\x18̢\x04\xf8\xb3(\xc1\x81\x11C\x9bU\x82\x03\xdc/)\xab\\R\xd6\x0e~\xfb\xde\x1f\x82?~ۨ\nÿ\xb7dZ\f\xeb\xed\xabZەGƐ\x83\xde\x18\x11\x91\x80\xfbrg\xc2\x0f\xd9\xf1\xb7Jp_\xfd\"}\xfbIe\xcf\xf5g\xa6\xac\xba\xae\xbd̒\x166-\x17\x04G\xee;\x9b\xd1\xcb\xe2\x0eK\v\xc6>\xa9\x01$n\xdf\x1c\xde\xd6\xed\xf8\f\xca+\xff\xb2L\xc1[\x80\x91o\xdd\"\xa0N\x9f>\xf4\x89\x8d\xf1\xb6\xafe\xeb\xd0Y\x91f\x1a\x82\x9bC-\x9b\xbd\x02\\Qz\x84\xf4%\x81\xecse\xec\x1d\x1dg\xb4\xa7\x83\xac@\x9f\xb9%\xed\xa9\xf0\xf3\xf9\a \x16I\xf3\xc5\xfe\xb6^\u0604\xad\xbc\xcf\xfc\x8b\xd8\xf3\xb9*\xcdӬ\x88\x95\x1c\xe5\xec\x1eD\xe7\x80\x06\x98<\x92\xad\xc3\xf5\x8a\xe5!\xaa\xd80\xe9O!\r\xf4w!\xf5\x95\x86\xa9ޞ{\xfb\u007f\xc1\x1b\xc0\xbcD\xebS\x9a\xe3\xec\xd3r.\xa0\xfa~\xa7\xff\xfeB\xb6z\xe3\xe6+\x85\x1fB\x1a\xeamA\xea*\xf6+y\xbd\xaf\v\xfb\x1d\xd9(k\x00\xc3\xc8\x13\xf8\xf5w\xeb_\xed3d\xdc\x1f\xde\xe2\x16V\xae\xbby\xfe\xd4\xf94/ܺ\xc2\xdfY\xad\x80\x99hs\x92v\x84zJ\xde\x050\xefa\xe1\x14p6\x1b7\x9f\x9aX\xbd\xde6\xa4\x9e\xaf\xc5\t\x9e\xe9y\xc5n\x01\xceo\x15\xa3\xff\x9b}l\xa7\x86k\x01\xf2\x83\x8en\x9er7\nyyh\x10\xddD\xa5bK\xa5\xf4S\xebOR5p\xa58\x1f\xec\xa7.T\xaca[\f\xab\x91Y\xbbhKHCJ]c@\xb9/\xe5\x89s\x01-\x1d`ϼ\xb8\xa2\x8bE\xb6\x8ea\xa4Gk\xa6Yr\x9a\x01ʇ\x85K<\xf3E\xc3\xc1\be\x8e\x9bW\xf0V\x03\x90RP\xad\x85\xfct\xacG+$\xef\x8dд\xf7 \xb4\x8a\xf1\xe5R\xb0\x93b\xa0\xcd͇\x1eP\xe0\xc7TE[j҅\x8f\r\xde\x0e\xf4\xe8\xbd\x10\x18*\xb1\x85\xb5NU\xb6\xa6Z\x9a\xf2{\x01\xa6V<\xca\xd5\xf7\x8e\xf4\xb6\f\xad\x1cQ\xf1\xe6\xca\xfe\xe0\xad\xd8w\xfc*\x93?\x9bӃ7N\xea\x95\fs\xfbO\xa3\x82\x14\tj\x93$\x800`۱\xfb\xc1\x97/\x1c\x0e\x91N\x9cK\x1d\x9f]ϫ\x92]\riZ?;\x1a:w\x88\x81\xd9\xfe\x1f<\x82\xc6\xf4\x87\xa7\xf5\xd3\xfa7҆\xc3҇\x95\x1f\xbcߦ\xb4٨\x1fnV\xeewl\xe7}D\xc5\xc9A\x84%\xfcyv\x8f\x98\x04\x88+\x84w$,\xc6\xc8Xl\x1b\x0f>\xdd/j\xfd\x1d1\xc3'\x0f$Y\xa7\x10F\x9d\x97\x0f\xf5\\\xfc\x83(\b\xfd\xf8\xc8AЃ\xea]x\xef\xc1i\xf1Zk\x90\xb0\xe3$5\xa0\xec\x05U܈\x88?\x03Z\xaa\xb5N\xfe\x03:5\xdcZ\xbf\xbf\x01\x02C\xe6\x05'Z\xeaܤ\xca}\x1f\x14w\xa1\xa7\xda~HE\xe3\xde\x01\xadVN'\xf3O:\xa9R\xc5\xfd\x18\xa8|J%\xac\x12\x14ء\x18\x02\xcc\xd4C.^\xe0\xb9\xc7ڎ\xe5`\xcb\xdag͐(3!\xb6\x8fa\r\x8c[0ɘ\x0e\x10»\x00#\xa0\xa8c]j\xa1\xdb\x1b)\x98\x81`\x12\x1b\xef\xd2rsJ!\xa5*j\xb6\x05\x12\x13c\xf5\bf`\x14\x94\xbdo\xcb+\xe6\r\xae\xef\xed\x1d\x19\x19\x1b;mx\xa8\xbc\xb8x\xff\x81 \xb5\x1c2=\r}\bJKo\xab\x9b\x95\x19\ra\n\xe5\xa9\xeaXN\xe6\xba-\xe1\x04\xbeK\xba\x03;\x14xL@@\x1d\xc1\xb6\x89\x94a\x1d\x8b\xf0,\x04\xe2\x89\xc8\x11\xa8\xaa\xccu]\x1dϺ\xa9\x9dU,Y\xf6;I\xeda\xd8˯\xac%\x16y\xcb\xc2\\\t\x88\x1c\xc0#\xb92\"\xa0d\xb9\xc1\x11\x89aE\u07b5>P\x95~\xaf?nŠv]wZ\xc4\xef\xccY\u05ec\x02\xce\uf3b1\xb0\xf0\x80\xb7a)\x88\xe6\xde3\x9d3t2\xd0\xf1\xe3\xef\x0f\xf7\xadT\xfe\xfd۷MN\xef\xf86=\xed\x9c?Cݹ\xd3ސ\x81\ad\xff}1\xf0\x19y\"9\xf5gV\xe0\x15\x0e\xca˚!Z1\x03\xb1qz&\xdfW\xba\xb1w\x95\x8d-f\xa3R\x9c\b\x84C|K\x0f\xc2>\x1d\x0e\xc1\xfe\xa8'\xdfcw\x00A?`6$,\xd8|C\xc3kٝ\xed\xe40\xe9->\\\xf7#\xa8˽\xc8\xf7\xc2\xd5\xef\x9f\xf45K\x1c\xef\xb0Li\xd2Tom\xf1\xcc\\[کNJXu\x8e}ꕵ\aۡ\x18\x92x\xfd\xc6\xc3[@4\xabu\xab\t\xabg\x86\xf7\xf7\xf2\xfb\xa1\x00\xe2@\xc0\x1d\x8b\xfc+\xfa\"\x80\x05\x93R.\x13AS\x90T\x9b+\xae\a8S\a\x80\x99\xb13r\nP,qݕV^\x84f\x05\xba\x00\xdd\xd3b\x99\xf6ڝ]d|k\xb0\n\x1axtQ\v\xdcä=\xa2\x13:\xe2\b\x04qC/Ѿ\xdfK\xfa6\xe49@\xce\x11̦\xb4\xff8ۃ\x8d)\xaf\xe36\x06m\xd5k\x8fϋ\x1f\x85\x12z{\x89v\xfd\xb5\xb5\xc5C\x12\v\xeb\xedG\x13\xad\xfa\x1f\xd6v\xdb̠d\xf8\xbc\x85\rlC\x11\x88ȇ\xe7`\x97h\x16\x96\x95r\x80\xb1\xa4\xae\xfc\x00.\xbaS\xa7\x1eF\xdbm\xeeإ>2푈\xba\x95n\xfc\x99\\\x8fy\n\x96\xbc\xd93\xc3k\xd8\x1a\x9043b\x91?\xef\x82\xecs\xcdNj\x97\x86\xe4\xe9\x87\xfaT\x85\x88\x12\x99\xe6%\xd2a\xbf)\xb4\xf9\xf62\x9f\x10\xb2}\x1e7\n\xfd\xba\xea I\x94\x9d\xec\n}A6m\x85\"o'\x82iLI\x8c\x1d\x9eI\x0f5\xf9\xbcy\xe0\x97\xe3?\x00\x81\x84\x87\x81|\xaf\xd6Ue-\x87Ң\xcchb\xeb\xe7=Ϫ\x06\x13۱_\xd2\x02*'\x80{\x9d\x88\x10h\x9d\x1e3r\xbc\xea\xd0\a\xb3y\":\x96U@>\xe7q\xc2\xdb|J\xd9\xff!\xec\xf9\xb5\x80\x95\xf6\u05ce\xba\xef\x98\xed\xa7\xb472\x10ZΝ\xbc\xcd\t]\x82p\x1f\x1b%}\x05\x8e\x19\x80,r\t\xe4T\x0f\x83\x96\xe5āe\xb3u\xda1't\x0e\x84̖X\xfbm\xe4٩X$:Dl>\x80O\xc5\xf2\xea\xea\x05\x1e\xf3\xfe\xed\x85KX\x1d[\x92;\xb6\xf4\xe1\x844E\xcbh!\xc8BA\xad\xcb\xdfj\x17\xaf\x13Z\xc9<|:f\xb1\x1b\xa1\xa2\x03\xac^\x03\x8bO\x9b\xefh5\xad\x80\x01a\x95 \xf5\xf0\xfc\x80\x84\xaf\xf9K\xb2\x93\xa9\xbd\xe5\x84u\x1b\x90\x85\x9d\xa4/b\x03z\xact\x9a\x80w~\x9b8i$\xf9\xa8oo\xa3\xeft\xb2^\x043Q?r\xd5\xedLˊ\xcbf\xac\xf7o\xcb\xcd\bI\x0fn\xcf\xf5H\xd8\x15\x99\xcd\x1di\xd9qUgg\xea\x8d\xe5)Ӈ\xa6\x14i\x1e\xf5-\x1aa\xab\xfdui\xcc\xcb4,a{\x9e n\xbeY$\xb0\xb8\x9b\xf9H\xedkJ\x19c\xd4\xceJ\b\x018@\x89t1A\x92y\x8f\xea\xfb\xa58\xa3RQ\xce)(\xe7\r\xc1qr\xfe<\xb5\xc2\xe9\xab'T\xc4\xff\x942QUE\xbe\xf3T\x88\xa8\x87\x14\xbf\x17\xa2\fԫ\n\x9e\xe9\xd2*DWV-J(\xf2\xf4\xb8YWZ~]\xcf^\xd5\x05\xcco\x1fP\xe56{\n\x9e[\xa5\xc4\xe9=\x92\x05\xf2\x00\xdfʤ\xc3\x05Ɣڗ\x8b\xf2\x89>\xfa\xa2\x19\xf9\x82\x1d\xe1!\xc1\xfe\x88C\x05\xb0/\xe19\x17\xa0\x99\x86ky\xeey\x99r\xadL+>;\xa3\x9aʒ\xb1\x98\xaf\xb5[\xe3/\xf0\xb1\xf8\t\x05\xcff\xf7n\xeb\x90\x03\xda>\xd1O<\v\x831\xe8#\x14r\xc9\xcay\x17\xeaw\x85\x00\x1970\"\x01\xa2\x90\x13\xd8a\xc1\x1aYM\x80\xb80\u007fIb\xbe8H^-r\xe4i\xad\ra\f\x05\x9b\u07b4B\x8c\xe2\x90\x007\x91N9\xb3!\xb5\xf8gI 2\xeb\x83\x04iOB\x1f\xb9\xac\v\xba*{Ȫ!\xbd&\xbaF\xdc\x10s\xa8\xc1S\xa1\x9f\xef\xe1\xe8mt\xd3*V\xc6\xea\x91ch|\xb5\x92ʢ\x8c&\x10E=\xa3\xadE\x04\x96+\x82\xd3BJ\xa0&Q\"/q\xc2d\x91\xe5\"\x8b8Yn\xd9\xfd\xa3\xb6\x84\x80$\x9e:\x10\xef\xef\x19\xa4\x8aW\x06\xbb|\x0e\xa68\x9d\x8b\x9aa\xc1%\t\xe3F\x8e\x82\xe5\xa8\xeb\xd6\xee~\xbd\\\xd7\xda\xd8\xea\\\xe3 \xca\x04\xb0\x05\x81\a=\x0f\xf6\xe9\xa1w\xc0\x8e\x16帙\xe4\"\xaa\xe4i\xaa4\xe0\xc8}B\x95\xa9W3\x99߬\xee\xe3\xee[o4Yf\xb9\xcc\"\x8b\x1d\xfe\xd2\xd231\x03D\u007foڔ\xbd\xc0r\xc1]C\x83\xaa\x84pϼAyl\xb0\xa2k\xc97S L\xae\xcdj\xc1\xaa\r\xf5@\xd9>\xfd\xf9s\xfa%\xff\xf1\xea0\xdb)u\x11\xb5A\xba \xdd9\xfd\x88-^{\x1a#x\xf8/\xa1ަL[\x16`\xe20/\xad\x96(\x89\xdc?¨Y\xcd)\x86؛a\n\x8cwI{\xe2\xadd\xcddC\b1\xaf\x95\xb6\xd9\xdd\xf8\xedڐ\xdaG\xf0\x8cd\x85\x12j\x89\xbc<\x96\xe3\x80\xf1\x1a\xf2\xa4R\xaf\xeb0\xf0*eYC\xb1NsI(~.\xe4\xb8\x11D<\x81\x9fou\x0fwϪ/۟EP\x9bq\x02\xdc\xf7{\x82\v\xdbcۉX$6\x02\xe3\xe2\xeb\x1f\x13\xd0i\xdd\xe0\x8bE\x06\x00\xf3\xec\xf7\x98\x82<\xa8-\xb6\x8d\x80\xb5o\xe5mp\xefV\xf3\x17\x05tX\xd7\xfbb\xd1K\xbdͻ\xf9\x0e\x91\xa5\x17/\xd5mjh\xf5\xe8\xa8o\xa9\xe72,;W\x9é\xccx\xbfI\x96gƭ،90s\xd9\xf4Q\xf0\xa6N\x13O\xf2\f\xf7 \xa1H\x1eP\x04\xb21\xe8\x98\xfe'\xbc\x01gK\xa4,-\xc8\xde\xcc\"\xf8z2\xf1\xf3ט\xdam\xa5\xb4\x84q\x12\nZ\x89(Ez\x92QNe\x96sD\xa4\x12\x11\x1c\xab\xa3=Ն;\xec\a,c\xabP\x98_\"bpy\xb1\x1e\aI\fk<Ɖt\x92,_\x82\xf0B\xa5\xa6\x8e\xea-\xf7q\x92\x98\x97 \xa0\xecܐ.\x98_\xb6\x15\x06\xd3\xd6\xff\xafh\x8b\"{\xd8\x18\xf9g\xf2G\xdb\x11j\xae\xdd\xe7\x14\xe1y\x10\x06\xe1\xc2\x15\xad\x87;!X\x8c;\x8a\xc6\x1b\x83\xfc\x16C\nH\xa8\x92*g\xf6r-\x90\xfe;2I;\xb2\x81\xf0d\xe3\xfaT\x92\xd7X\xea\xc4%\x12\\\xddf\x17T\xac\xf7\a\x95\x9bǚRs\xa0\xdfm\xf9\x10\xc7-\xee/,\x8e\x1d\xcb\xc2;U\xb0\xbdU\xb2\xdb\xdf\xf9\xb1\x10\xc4v-{\x85\xa7\x93=\x95nO\t9\x82\x00\x9d\xf2k\x80\x1f\x11U\xae땐\x9d\xaa\xee\xe2\x93\x12\x1e\x04\xee\x8b\x12\xe1\xff(\xfan\x17dz\xb6Ii\xfe\x13\f\xfe\xc3P_\xed\xad\r\xa6k\xad\x90a\x8a\x15\xb76d>*;\x9f\xef\x02\tڻ\xeb{\x95V\xda\xe0\xd5\xfeq\xd0\xcdS\x82\a\xfd\x1b\xea\x87\x02[\x98B\xeeO\xefl]yW\x9e\xe9MRZ\xc1$.\xa9\xdd%\x98\x92\x9b\xf8\xaf\xa7qj\"\xb6̙\xb1\xdd.\xef\xdd9*\xed\xb7\xab\xa7\a\x14\xab\x9dH*\xee:\x9cH\xa8\xc9fc\xa1Ep\xdf\xe6R\xb5\x96o\xa5\xbe\xb9Q#\"h\xd5\xe2tL\xc2\xc9\\\x97V\x97\t\xb0\xa8\xc1Of\xf5\xda\xe2\xda\xcf\xc0\x94}\x05=Q]\xaf\x9aL\xbd\xa5\xf1\xbeH\xaf\x97|\x9b\xbf\xb9\xad_~\x99kϣ\x94\xc8\U0004f214\x94\uefeav\xeerți\x82&!\xaf*)\x81\xb3\b\x1drI\xf5\xec\xd2b@\xe5쪖%M5Нs\x93!N\x9b\xbd\xeb=\xd53h\xc4%`\x81\x1dU3\x06\xb2\x8e\x8f\xf5yV|\f\x8e\x8d\xe4p\x88\x0f\b\xd3k,6\xae\xd6խ\x8a]+{\x13\xf6\xf4\xc6EΗ\\\xc0\x13\xd4^\xd9\xd3\x04\xca\xd6\x03yn۔.*\x1dQz\x95MO\xb3\xf3տ\xff\xe9\x10D\xef\x11\xee\xdd'\xecT\x95\xffS\\\xa20\x98WU'5\xfb\x94\xbe:\x99#\xe1h΅A\x15%\xcaEZ\xb7ʜ5b\xb5Ҝ\xab\x146M.\xfb^q\xe7\xd5\xedӶ\xdaX\xd7\xdb(\x92\xa6\x021\x85\xa7\xd8]l\x87\xee\xd4(4\x17\x1c\xa2\xa7A\xd4\xe6\x98\xe2\x8dҢ\xedۋ\xc0\xc2\x02\x13\xadVXkv)^ۚ\xdcn6\xe3\xabe\xa5\bQ\xa2~\xee\x80q`\xeba4E\xa4\x9b\x95\xad\xd4\xdbl\x11\xd9Z{!\x9e\xb3\xce\xdee\xa7ٹ\x10\b\f\xc2R\xbb\x96fm\xa5\x84wš\x17|\xb5\xf8\xdaN\xf6w\x00da{%Q\xf4\tc\x9fy\xd8\xd1g\x91\xfdR\xb3\x9e\xa0\x9c\xc5A9z\xef\xa0X\xb5\aBN\x9e|5\xf9ّ\xb3\x11\x87O\x9c\xfb49_w\xec\x9c\xce9\xa5\xb5\x90\xa0\xaf\xbb\x10\x1c.\a\x99\xe8\xe5\xa2\xfff\xedo\xfa\xb1(\xfb\x1bD\xdf\xe6\x99\\\x13\x03\x1cEPl\x9d\x9c~\x8bP\xbc\x84ˢA\xab'\xa5\xf7Ǐm\x9d\xb2\xa4\xc3 \x10|\xc5\xd6)\xcc]ˍ\x83\xda1\x8f\xdf<|`){\xd9\xed\xf8y?\xcbJ;|Ɠ\xe5\x15=\xed\xd8\xc8\x04\u007fJ7\xb6\xb1M\xe5\xe5\xfdMA\xbe\xbd\xef~we\xfb\x82\xa4\x8dH\xf8\xadb^;+\xe6\xce4\xd8\xf7\x96\xf5T\x1b\xb3\xe2\x891\x1a纲ѳ\xea'ZNWR\xa8f\x10\xc3\x1dZ\xa6x\xa9\x92\rR\xb7\xcd\x1e\xaf}\x1e\x93\b\xcc\xf7\xd4\xcd\x1e\xabE\xd7ڢu^\xc0\xf7\xad}\xdb\r\x99\xac\xb0\x17\xff=ּ3\xe4\xb1CA\xeclC\\\xe3\xa3'E\x0eΩ)\xd7.\x8bb.-\xfa\xc7\xf7GB\xfc\xb4\xee\x9c\u0604\xf2\xeeHA|ZE\x87y\x8c˭\xd3y\xf1H\xe7\xdc:\xff\f\xfb$\x8d\x86\x13'\x8aX\x85\xf6v\x1f\xc93&\xbby\xf3\x02VQJ/\xb9\xb9\xff\x9aI^\xe9\xd3\xc5\xdb\t\xea'4Z\xef\xffY[\x19}>\xfcēn\x16\x9f\x9c\xd8\xeb\xc4ѭ\xe6\x19ţv\xe8\xab\xfeTo\xe4w(\xf2kxǂ\xd5 \xcf\xf2Կ\xad^gWzۼ\xb8r\xc61k\r}Pc\xf0.f\xfaŝ\xe9\xf6\x12\xfbL@\xe4\xb7^\x83-\xdd\xd07\xf0pj\x84o\xa9\xb1\xbb\x9crͤ\xf0\xfaDⶴ\vppKt\xf2\x81\xc2\x03r\x14\xfa\x8fU}\xca$gmJt\x90AP\x83\xb4\xc3v\xad\xdd\xcb\f\x1ch\x13*ٲ\xe5͛-\xf7\xb5\xfdZ\xd0v&\xc5dH\xabj|4\xb7P\xc6\x0e9\xa0\xf3\xfb\xb1\xde?]]\u007fz\x05w\x1b\x18\xdb\xee\x02 \x11\x00\x80\b\x1aw\xf8\xff\xa3L\x9b\xe1\x0f\a\x98\xc0\xdaz\xcd z\xc0\x85\xe9\x1e\xb8\xa0Щ!\xd5\xf8.\x05+',z\x9cb8\xfb\xee\b\x83\xa7\x0f*߮$\x8b\xde\xea\x86\xcejΆ,\x82\xb57\xeabC\xe6\x85\x01\x15\xe3\xeb\x92o\x9e/\xda\xf7]\xc1E\xach+\x1e\xba\x12\xb7#PN\xaa\x19\xc8:\r\x1f\xd2\xc7<\x9fD\xe2S\x10_S4\x10;\x0e\xce\xd6LG\x1f\xac\xae\x99\xdd\xef\xb3\xecV_\xfd!G\xb3\xa98\x97\x88ʜ%\xb0\xf7\x02\x1d\xadgq]\xb0wX\xb9\xdc\xc2\x1b\x18\x12\\z\v]\x88B\x97W\xb0\xfb\f\x87λ\xd7z\xfd\xecTS\xf9v\xa0\xf4l\xd3\xca\xf0\xf0\xca\x10\x85\x86V\xb8+#\xfa\x8aᡜ\xaa\xb5\xa7\xa5\x06\xb7\x02\xe6\x15\xfa\x1f\f\xf2L \xf4\x94\xbe\x15\xbeW\xff\xa7\xfe\xbaϛ=\xddu5\x0e\xd2f\x1e\x86]\xeaY:\xdd5tgq8hĢ)\xa3\xaa\xa1\xa8+\xa9\xdb<\x1e5d\xac\xb4P\xaf:9\xdb?tun$\xe1\xae{`\x1c\xe7\xfb\x1eY\xac\x10\xab\xb4?!\xc5&]ܳ\x92\xdfp\xa3a\x81\x86\xbbR\xb2\x1c<\xd4ұ\xa5nk}\xcbDpzawY\x81\xd6$\xd6z\x15\xfa:\xa1ߓ\x89H\x19z\xec\xe6\xd5\x11\x1b\x83\xef\xafdY\x9c\x10Gj\xb1a\xefr\xcd>\xf1\xef\xf7q\u0378E@\xca\xd8G\xe3\xac4\x8d\xde\x13\x9b\xbf\xda+\xee\x80\xfc\xd4\xdb\xed\x93\x02\xb7\xf35|\xa8\xd9\"\xc3E@\x9f\x9f\xe2\xe0\xcf\xe28\x1f\xfdx\x8fy>\xd7\xc1X\x03qI\xa7\xa63%\xe54&\x8d\x95\xc5Ueѣx\x8cޜ+\x1f\xd6\x1bV[\nW\xb8\x0e?\xd2$\xfeU\x8c\xa4\x8b\x997\xa9\x8a\xecH\x9d\x95\xec\x902\xb1ܘ\xeem\n\x87&\x1a\xe7\xae{}\xb43\x03\xf1}\x9d\xbd\xf7\x8c\xd7\xf5\xa2\x1d\x96`R\aU\x05\xce\xd5=}ii*\xf6\xa3\"Q:\xb3\xeb, !8\xa9\xf3\xa06\x8bܤP\xa5'\xe0T\x94s\xa4\xeb\xd6rvw\xa6\xac\x83M\x12\x00DKOx\xef\xdb\xc9inM\x82'\\W\xa7\xad\tmF\x93\x88\xd9f\x8aP\x82\xaaO\xc4\x1cV\xa6\r\t\xbb\xe6\\\x84\xb3\xd3\xca`\xbe\x0e\x95\xe3\x91\x13%~\xf2J\xc2\xf9JvCm\xa28\x8fk\x1dv9\xbd\x05E\x8a\xb7g\xddfv\x9eG١\xcew2\xef\xb10\xf1$\xdb-\xa7\\\xe6\xb4\xc6I\x98MD7\x9cO\x16ۺ\xd2\xe3\xadrU\xfa\f\xca\x14:Qڃ\x9b1<;\xd2\t-\xab\x98\xeb:\x18\xe1z\xeb\xaf\xfa^%\xf1q\x90\xbcB\xbeZK\x8aQD\xeb\xe8\xc6{\x05җ\x96x\xc7oe%\xb4*p\f\xd7\x0e\x167|\xb5-t<^\xddxأ\xd0bT\xfe\xed*n\f\x95\xe5}\xceۙo\xd0\xca˞\xd7(\xf3\xdd\x01ﴲ\x83\xa7\x04\xd7\xda\\\xb6\x9f\xa7^(\xef\x1eZn\xc4\xd13\xa0f\x82\xf1\xb1Z\xa4,2\xcb\xed\x87:\x83\xa7\xaf\xaa\"\xba\x17\xd0n\xbb@{\xf3\xb6\xd58,\xa6-\xa2^\xb8\x9dw\x12Q\xb3\xb7\x83R\x1e\xeb\x93\xe0\xed\xd0E~\xa7\u007f\xea\xeb\v\x05\xc0'>\xd1\x15@^U\xb6>\xff\x92\xddW5\v\x80\xc0%3#X\x895\xf4\x06\"߶縵\xe8mw\u007f\f\xae\xb7\xe8#,\xe8\u007f,\xb1C\xf58閅\x9dW\x8e\xcfO=Ļ\xe2\x86\x18\xdcH\xf7\x1b7\xeb\xe3=ζ\xc5\xcc\x1a:+\xd1\rᓞ(N\xe5\xac<\xcd\xc2n\"];٬\xe1D\n\n\n+\x87M}\x04\xb5Y`\xd6\xe7*L\x10\x97\xe7vl \x00\x8bq\xc1\xaa\x87\x9eZf\xa3\xfc\xb6u&\xad\xca-\u007f\x98\xa3A8\xb3M\xb2\xfb\xd4\xee\x80\xc0\x10\x1c\xb7\xe6\xea\xd6\xca6u\nt\x13\x102i{\xe65\xf0\x95\xe2\xfe\x04\xc6k\x10\xbe\x1c\xf7\xf9\r\t\xc1v@\xbe\xbe\xe5\xd9Jg\x1dv;1ph\xb7\x02\x04P\x02u\xda2[\xebp\x8c\a\xbfC\x91\x95Um\xa3\x97\n\xa9^H\x85\xbfn\xaa|:\xcc}\xe5\xea\xf4J\bt\xa0\x1e8\xdd\xe12E\x9e\xa4\xb0\x9el=\xebU-\xbbӭ}\xe8\xd5\xdb\x10\x930\x15\x13\xe4\xc4s\xa9\t.>Q\xfd\x16\xa0\xa6\x1a\xcfx\xa7\xa0T\xae\xe6\x19\x16a7$\xeem\x12\xfa}\x1c\x89;aÿ\xffmk.\xc44\xd3\x1e\xdc\xe77\xaa\xf1\xb6\x03\xb8Kt\u074b\x94B\xfb{\xfc\x10\xde\xcf\x1f\xf3\x9e\xb9Z=\xa3\x91\u007f\xfb+\xf8I\xa1\x17\xfa\xa6\xe1\xe4\x97\xf7w\xf4\xfd\xe9\x93oN\xa9.\xaf\x90R\xf1\"k\xaeO5h\xb2\xbc\x15a\xb9\xbdC\x95K\x900\x1bO\xaf\x8a\xfd\x1fP\xab$\x84/\xbb{q\xcbu[\xc1\x12\xd6\xc0_f\xeb_\".\x90w\xe4y$\xec8)\"oX\x88;3\xc04Z'\xe4\xf2\x93\xa2G&\x9e\xac\xf4o\xd9\xec5\x1b\xa0\xf2gȬ\t[\xe4푂p\xaex\xa3$~VlYy\xd2?A:\xa7O0O.?Iv\xc2{\x05\xb1\xd7~\fl\x96z]%\xf2\xbe\xe0x\x81\xf9դ\xae1\x9fG2\xf5\xb2\rͯ\x1e\xf74`\v1w\xf9\xa1\xb3\xb9\x0f^\xf8\x0e\xb1\"B\xf6~\xd9\xce<\u05cek\xd5h\xfa:\xa5\xfb\xbf&\xf59D\x83ɗ\x1f\xfc\xd9@\t\xf1\xba\x81I\xb8\xc8\xe24<\xecl\x9cC\"\xed`\xbf\xc86\xe7\xfc\xa5\xc1\xde7\x16Ћ\x95콀{\uf545\xed\xa7=V\x9f+\xaf\x95\r`\x97\xe1T\x03\xf8\u007f\x0fU\x100딎\xa0\xb1s*Oʏ\x1b\x12\xed\xbc\xb0tj\x8d\xe1\xd4y\xe82\x96Ϡ\x8a\xc2|*\x05(Tw\xd8l\xa9d\xb6\xc5b\xe2nQ/\xc8\xcb7Z[\x9bi}\x0f\x9ahím^\x89\x9bW\xa3L\xb6m\xa7?\xe4\x01,/okk\x02X\xc5Ft\x06\xbb\x15\x02\x87\xb6\x13\xbb\xb1+\x9d-\xcf\xe4{V\x9a\xaa\xbaX7\x8cNFd\f\xf7\x14\xfd\x17\xce39\xc4ȑ\x85V\xbd\xd1{\a\\\x8f\x14\xa8o\xcc\x14\xaco\x1f\xfd\xca\xfd\x977*\x0f\x1f:\xc4^\xcb.f\x9d\xe2=g\xf6\xa3\xad\n;:uP[\xb0u\x9d+\xcfZ\xea\xe5\aP\x04\xc9\xeeϸ\xe5u~({\x9c\xb9\xb4\xb7\xcb\xcd\xca\xfd\x9e\bR\xa4\xfc\xeeʑг%\xa4?\xceL\xd8\xe1'm\xa3O#\x8d\xc8\x00\x1b8\xb4x\n\x80\xf4\x0f$\x1aN>\xc0|\x92ߖ^\x1e\xb9\xaa\x1fy~r\a\xdb\x16\x89\x8f\u05eeۙ|\xd6,y-\xaen\xfb\xbfQ\x11\xe9\xa0ߖB\xd3N\xcf\"n\x0f\xf7\xfc\x06\x8d%;Ts\xd3\x03\x95\x11B֭f\xec =3\xe8EXX\x997\xa4W\x17\r\xf9\xc6s\x14\t\xec\x94\xff\x12\x98i*(*+\"AC.\xc2\xd5ڥ\x18\xed\xb8+\x9d:\x8f\x82\x9f\xd3WR^m\x91SQM\xc3\xc0\x9f\x18z+\x83\f.\xa5 \xeesS\xda\xe6\x10!\xdaF]\xfe\xfbbZxL\xb7}N\xc8\xe2N\x8f\n\x81\x01$\xeb\xd0pgv\x9d\x87E\x9e\f\xe9mA~D\xaf\x8c\x82Ph#\xe3\xa2.\xe40k\xb3\xc3\x0f\xc8㲧\xc4o\xe2\xb7n\x8d\u007f\xf3?\xef\xcd֭l\xff\x0f\x8d\x89/\x15Ox\xbf\xf9$]\x93\f\xd7L\xa2`\x1a.\\(\xa6P\x00\x82+:rj{\xd4x}cO\xfa\xee\xeb\xfd#V \xa2\x06\xfb\x1d̥)\x9d:\f\xcf\xeef\xa0\x9e\xa8(ý\xf2Q\x1e\xea\xf0 \x1c\xf4ǀ\xde*\xa9\xca[\xc3յ\x9f\x92\xac\xe1~\xc4-`h\xf8\xc01):\xbf\x88\xc3\x05\x86ҙ\x9c\x18\xb7\xc2n\x0f@-\xc8\xce݁\xda'>c\x13(\xb2\x9f\xf1\xef\xcf>,\xa6\xa9\xb1\x91U0\x8e.Q\x9f\xee\xaf\u007f\xee\xdb/\x8c\xa4sU*\xb6k\xa2ޑR1&&;{\x9c=<\xa4\x1e\tQ\x01\xa5\x16\xb5\x90dÅR\x15\x18%\xa4\x95\x1d\xa5\xb1R\xaf\t\xc0\xa4\xbd\xc5\xe2\xa7F@\"\x12\x89\xce\xf8z\x86\x86EG1\xe3M\xeb}<*:Q\xdf\x155\t\x83\xd5zW\x9a\xc1\xa3\v՟\xa8\x90\xf8D\x16\x8b\x0e\xd7Kj~\x1f\xdc\a_\xbe\xf0\xff\x1f\f\x1e\xf3\xcf\xff\f\x81\xc2[#\xa9\xd7\xc7\xcc\xe1\x10\xbcZ\x06\xb7\xee\xda/\xc0\x84\x109XMF\x9d\xa8ۇ{\x12\xe0\xc1\xdc7\xf2\xfe\x1e\x02ș\x90\xb1\x9cک\xe4\xf4\xcf\xe2\x1b\xb7+\x8a\x05h\x86\xb3\xc3\xc3\xffsDf!!/\xd7\xc5\xday\xc6\xd9\v{ܸ\xf4\xd0=\xf5\xeeg0<\x89\x15\xcc\xef)\xe58\xa04\xb0\aT\xecMʦzj\xb7^K\"\x19\xc3\u007f\x03\xe2$L\x9f+\xca\u070f\xbf!^\xa5\x86\\*\x92\xfcd%\\\xc1\xff%\x1e\xa0\x8aN\xb9\x18\xccs\xbb\xe4\xc6$\x84\xcd\xcb\xf8Z\x1b\x96\x94:˼\x18\x04\x8d\x86&\x85,\x13\xc0t\f'U\xdc}\x94~\xb4#\xce\xce\xe2\n\xbd\\\x11\xe8\xb2\xe9\x80\xf4ɝ\xb8\x8c/!-\xecmY\xc2V\xf3B-Ei8ɷ9\xac\xd0\xc92<\xc7\xc8S~N\tK۩\xc4p\xd3'\x87Â\xa0\x87\a\x80*\x91\x15֜\xd6wcWF\xdf\xf6c\xa7\x1e\xa8\x9eK?\xc2ZAJ\x10\xd9ƺ\xa5p7Է\xbc\xf3b \xd1i\x87\xf8\xf6\xcbKL\xd2`]\xc7\xebgɎp$l)\x87q\xfc\v\xb9\xa2\xc1\xb1ҍV\xb1B\x1f\xa6C\x8f*c\xef\x80\xfcK\xafirz\u007f!\x913\xe8ڇ\xb6\x1c\xb6\xb3|0\xe3\xdfF\xb3\x8a\r`\xf4\aZ\x9bB\x04\x99Q^\x9e\xf6z}\"!թM\x8f\xae\xf8r\"\v\xbf[\xde\x19R\xb2\x8c\x1a\xef\x91\xc0M?\xed\xc7\xf0\x0f\x86\xb8 \x13\xbd\x1f7\x96\xec\v\xe1\t\x87dLd\x1cH+X\xd3\xe9\xf7Tp\x9d\xbb\xb6\xf5\x97\x1f;\x9d\x8c\u07fbW\xb5\xcf\xcf\xdb3\x8f\x86k>j\xfa\xa7W]\xa0[\xf7\x05\x01\xfaт\x97QT~\xf8\a79\xb5E\x9d<\x9br\x05\x95\xa3\xa3jO\x02>\xc23\xafSѧ\x8aB0\x8fn+\xf9\x0f\\q\xc4\\Xh\x1d\xc0;ed\x91\x87\xe0I\xe6x\xf6\xe56\xe5>\xf1\xa7 \xa1\xa1XC\xa7\xfd\xa0V\x1dr\x01\x93pN\xa6F\xaf\x13\x95K\xef|99QP\xe7\x98\xf6\x1aba-\xfd~\n$\x15\x02\x91G\x16nX\x90\x80?:a.p\x01f.\x1f\x1e\x02\v!®C\xe1f\x88\x00\x84߄Z\x0f$\xf9\xdc\xef\x80\xfa\xbe\x17\n\xea\xe1\xd6ݞ\\؉j\xb6\xb4\xab\x8drv\xd2b\x9b1\xfa\xe4\xc0F4\v\n%B \x10\b\x1f\xb9B\rk\"\xbdr\xb2,\x1d$\xa7\xf4$\xec\xc9\xfd\\\x897K\x95\xad5\xdes\xf7\xf3n_\xc4\f\xbe\xd1+\xf5\xf5\xb1\xa3\x15v\xb5\xbd\xa7 \x8a\xf2P$\x92ϩ3\xcc/\xa1\xa5\x18x\xbe\x1d>J\x82\x86aw/\xcb\xf2T\xcei\xbbX\xea\x86F\x91N\xad\x87)@\x1f\xd7\xcc\x1e\x1eԅA\xfc\xa1\x02\xf5\xa4K$r>\xfaG\xd7nc\tQ\xeeR]\r\xa1\xbf]e\\\x15C \x10w\x10^\xeaʺ\xcd\x00\U000117afW6ު}LB|\xf9\xe8ұ\x99\xa8\xb361\xf3\x9dR\f\r\xb4\xd1pn=\x92\x87\f\x1d\fb\x10\x94\x1d>@k\x06\xb3\xfe\x16D\xb6R\xd7\xd7ƌB\f\xc0\xedM\x19Q\xfb\x81\x9b\x82n\x85h\xe0\xee\xa9\x1e5\xeb0\xad\x16qb9j\vC_\xc0~P\xeao\xd6\xf5\xf0a\xad\x99ʀ\xc01\xf0\x94>bש\x8a\x91\xd3\xdci\xd6v\x86\xff\x9b63\x19u_\b\x9c\xc9;fj\x1e\x03\xb8/1'y\xb0\x199\xb7D8\x9ba\xd1 \x05\xad\xban+\x16.Z\xc0\xf2\x18fq\xff\xb9>\xc1Z\x0e\xcc\xc3\xf3T\x90\x9a\x16Οά\x04\xf5s6\xa7\xea\xe9\xcb\x1a\r\xd7\xee\x1f\xed\xa0w\xa3V\f\x1f\xac@)\xf8\xc1\xea\b\x81\xf6\xe0w\x171\xa8\x11\xfe\xbb\xb3`\xd2h\xef\t\x03\xa6|Zw\xb2\x90\x8b\xaa\x86\xf7U\xb3\xffi\xf3\xb7\x0f\x1ea\xae\u007f{\xf8]\xe7\xb2\xfe\"\xaa\x97\x105\v\x88X\xf7 \xafM\xf7\xa1DXfl|6\xcfb\xa6\xc93\xcf\xd2Z\x1f=c\xa1d\xf8dž/\xc0\xe2bWO\xfc\xd0\xc5\xe2\xdag\x16\xc4L \x15\v\f\xd8Á^\xb0\f~Їo\x94;Lx\x9f\xd40e\xb7_\b\xcaZ\x9a\x92,\x99\x90\xbbCõݷ%\xf7\"\x98\xc4\b\x87\xb9\x11(\x1b{\xc1\x16\x9a\xcc>\xd4\xed9\x826\a?\xc2\xc1\x83\x04\xa5\x03\x98\xbc\x05\xfc\xfb\xef\x85\xe9C\x87\x8e`\x06\x19\x19/\x87\xa0\xc6}\xbdG\xd7(\x10\x01\x06?\x04\xa4\x00\x11\x94\f\x9aZi\xb4\x17\t\xb96\xfdm\xfd\xf2\xb9\tv{L\xaf\xc73\xecZ\xab[a\xa3\x90x\xb7\xca\xd9\xfa'\xb096\x12!\xa7\xb41\xb62\xb1\x17'\xe9p\xbd\xc0\xc8ͥ\xe6[\xa4˔\xc6\x1e)\xcd)\xb1L@ƙV~+r\x98\x9e\xae2\x9f\xd5ʑ\akk\x83\xb59\xf2\x03Z\xed\xe6\t0NG\xbb\x85\x86\xcb2\x835r\xd9aQJ\x16\v\x0e\xc3#\xce\xfd\u007f+\x8e\x16Z\xc1,\xaaO\xa8\xe9\xcfh\xedO\r\xe8:\xfa\x1a\xd6X\x15\a=`\xa7O\xbf\xe60\x88\xc1\f\x8e\x14ߋ\x1c\x1c\x8c\xbcW<\xf2N\x1d\xcc;\xc0\xca{[\xb3\xbe\x1e\x9c\xfc\x1c\xd3e0\xc5^\xb7G\xe7\xc8\xceݬ\xc0-{\f:\xbe&\x1cܖ\xf5V\xa1\x16\x19O\x1e=t]\x86\xf3\xbc\xb5\xc7\xd1\xf64ƏKF}1Q\xacW\x01P\xcay\xe2\x13@O\xa5~k\xf7\xf1\xa6[\xef+\x81\xb9c\x9f\x11\f\x04\xc0\x14D\x99\xc6\xca\xf7\xb7\xde@\xf9\x8dk,\xbf\x15UB\xd4#ű&\xd6rC\x8c\xb8e\xd6,\xe4/at[\x10XOd\xebԚ{-\xfe@\xf2a\v\xa4\x14\x19i` Q\xee\xbc/\xb0\r\xa2\x06\xa9B\x82X\xee\x18I\xf5HU\x88,}\xa3Ȥ]\xb4\vOy\xaa,\xae\xaa\xde\xed\xf4\xb9\x1btGd\b\x14\xb7\x8a\x9f.@\xe7\x87뾄\x8c\xac\x00\xf6}\xefۀ\xf9\xee\x1a\xc7\x0f9S\xadU\x12\xafW\x00\x81!O\xca\x1a\xa2ҕ\xa4\xe9`h\xc0\xba?\x9b/\x98=\x9f\xa4\xf3\n \xf0o\xc7\xf9\"\xf7\x99\x1a\x06\x8f:8\x82\xf8A6\x02VK\xc6#\xa6\x91X\xae\x1f\xb6\x88\xa0\x89Iq\xf4q\x8fK\x85\x8e\xed\xdcy,Ѹ\x83:^PAu\x10~\xdf\xdd\xf2[\xb0\x01\xb95\xa0\x80\xdf<\x8b`d\x91\x99l2u\xd8\xda\x1d\xffv\r6\x9d5b\xd2\xfd\v\x99ǭ\xad\xb0\x81K\xd3\xf7v\xeb\xfc\xed\xd1\x16\x8fo\v\x88\x80\x8a\xae\xcb\r\x9do\x13\xa3\x99\nIѐ\xa58\x10\x8a\xe8\x100\x8a\xe8\xc8M\x8c\xfc\xf9\xed\t\u007fS\u007f\xc9\xd8\x17\x12N\x1f\xf6\xfc\x05\x96\xd4&Q\xfd%\xc2\xc2\xd9\xf8\xb6\xb6x[\x1e\"\xba\xa5:\x86v\xcbE\bb\x0eJړ\xf50\x90\x94K\"\x90`\xe4G\u007f^\xba\xa4\xe0!\xf1ܾ\xf5\x143#G\xb2\xcc\xc7\xfd\x8bWT\xa0b\xf8Aý'\x9a\xf2\xf8\xef4\x14I\xce\xc3Io\xbe\xa15\xf5K@\xb3d)ƻ\xa2H9eW\x1a\x99`\x9c\xa3p\x92[\xcb\xf1':\xed\xf1q\xce\\}\xde\x01\x8e\xc74=\xee\xb0@D7\u007f\xe0Z\xc0\xf3\x13\x99w\xb6\x16Y5\xe5\xe6\x9e\xde\xe9\x1b0\x146\x93\xff\xbeӘ\xcd\xeaВ\x81 \xb4*)\x03\xb3\xe8\xec\x80\xf3z\xb7G\x16\xeaS<\x01.F9\"\xe7\xe0Ca\xce!z\x84\xae\xa3\x8a[\xbe~\xc5P>\x9a\x92ݴc\x03\x91\xd8ZB\xff\x8fb\xcc4l\x1e\x10\u0092ٟ\xe3\xdds\x9f\x9d\xeb\x9bԳܻY\x89\x16\xa7\x81j(J\x95\xb4՜\x1b\xb2:\x88qZo%9\" \x8c\x15\x9f\xc9\xe2\x85]c,:\xb7Zr\x15\xf4\xa0PA<\xd3\x05@p\x11\xc4/\x8e\"\xfb\x9c\xc6\xd4\r\x9f\x8fg\xcb]\xbf[u\x11\xb3o\xc5W\x9c(\xbeAǸ3aI\x83L\x1c/\xb1\b\x8f)^j\xc1\x8b_\x13\xd9\xees\x13\x93\xc7;\x91_\x13\"\xfe\x80\xad\xd5\x14K\x95Y\xb5\t\tm\x11Ą\x9a\"\xb8oj\xe9\xcd=1H\xf6\x9ef\xc6Τ;F \xcf\xd9\rU\\V>\xb3\xf0\x1f{\xc0\xc59Yc6J\x9c?x\xdèW\xf30M-\xab\xa57\xd2\x1a\x1fؙ\x9e\xa2\xeeHrV\xa82\n\xb7\x91\x14\x1dI\xea\xb4\xee<\xfb\xe0\b\xeb\xe2\xe6(\xb7\xdc\xe6\xb9\x15\x06\xed\x0f\x9c\r5uywjBt\x85\xcb\xff\xe5\x1c\x8a\x06A\x91\xb0\xaf֏o\x17\x0f\x86\xf5\\e\x1b3Y\xe1\x8e\xfa\xb5L\\\xeeʺkl#s\xffs\xd0\xcb\u007f\x94\x0e˯\xcc\x1b\x14G\x13\x0e\xe8b\xff/k\xe6\xd0\xc4BZ0\x96\xf2r\x15\xceD\xb9h\x85D\xd8\x1aq9\xe1\xfeW\xeb\xf3\x9f\xd2z\xb3C\x1d\x8c\x1d8 @\xac\xc9\x13\x00\xd3C\x17\xea\x054\x91\x84\xb6\xe2\x9c\xf1\x15\x8a.7\xa3\xc2U\x9b{_\xa7\\\xd1\x10\x80\x8f_}#!|z\x94(12\xb8O\x87\x8f\x9d\xaf\x04\xba\xb1d\xd9@\xfaC?\xf9x7\xee\vN.?y\x93jvGC\xf4\xfd\x02\xe5Ҍ\x8a\xb9\"\x05\xfbʚ\x14Y\xbclC\xaa`\xbd\x86\xc82\xeb'%\x12\xc6\xf7\xec\x80b[iܫ6\x87\x89\xe9hLF\x92\n\xad\x19HO]\xbd\xfe\x84\x86\xde\xe7\xa3\r\x8dM\x15\x9d\xe1\xee\"\xdb\xdcU\xed\xd21\x9fP\xe0\xd5\n\x0f[\x10\xf2\x1e\xb9\x8d9\xaf\xb2\xa4\xc8\x13\x06\xfb\xfd\x96\xd2\xc2X\xac\x9d\r\x14\xb9|U\uebf5\xea\xc3B\xd8\xf1\xb9\x1c\x89\xe9 S~z|.\xc24\xfc\xd3\xefTP\xbe\x83{.\xf5\xa5b9\x8ep\xdey\xcc-\xbe~\x00^z\xac\xb3\n\xfa\\\xfa\xd6@\x15J\xa8\xcaX`n\xeeb\x10DWpk\x0e9_c,\x1a:\xb12\xe3Ya\x01\x11\x88\xcaFμҦ\u05ed\x14b\xd41\xba\xfa\xf6DLc\xf6a\xf5u\"ҝT\xe9T\f\x937+ov\xfd\x04z\xa0\x1fӀƣ\f<\x8en\xcbsiDw\x1e١/\xb3ţ\a\xc3\xfa\x9b\xb1\xf0\xd5\x133mW.\xc9{2+\aا\xac\xee\xcbt\x92\x17b\xf0\x80\x95\xc5J\x9d\x82\x04\x96c\xd7\v\x04\"\xea\xbd\xcb\x059\v\xc5\xce\xc3\xe4ʓ\x19\x9b\xa2\xf3\v\xb9\xd38\xe3lɭ@\xb5\x9cѤ̤%\xae>i\xf0\xeb\x16\xfa\x8e\x05\xa7O\x17\xe0\xf4\x01\x02\xc7\xc0\x81\xde\xd9\xdf\x14\xf6~\x97\xd9}$\xb9\xe8\xfaf}e\xa6\xf3\xe7]\xa6Է\x0e\xbb\xef9\x93\xa49y2\xa96WL\xe2\xba\xff\xf8\xb7u\xe5S\vMv\xfa\x89\xc6\xdaq\xa1\xd29t\xd9)iG\u05c9\xe3\xe80\xa6\xce\xef\x876\xf8\xf2\xa5\xa7G\t-0I\xe5\x00#\xc8\x17\x19u\xe0\xc9\x131\x97\x8d}ŭ[c\xb4\x02\xc1\x93z\xa9\x94\xa16\x12WŁ!-pi?\x16K\xa1\xa4\xa4\x9c8\xfe'`\xb8PCrr\xbb\xf1\xec\x19\xd3\x13\xc7\xcfp\\\xfc\x8d\x9bB;\xf9k\x16\xc9\x03i\xfe\x85~8\xd4߯I\x88\x87{'\xd1D\x05\x89\xf1\x83\xd1\xf2ʪ\xf1\x9cJ\xe0\x13\"am@!\xafB\x95\xb6S҂\xb1\xb1\xfc \x8f?\x1f\x1f{\xbe\xe3\x1d\x01\xe6ł\x1ak}\xee\xa4Mq\xbaW\x85\xc5\xceW\xde,/\xbf\xf5\x1b\xa0R+O\xd8\xecC\xfd[\x12\xc6\xfc\x91Yw3|c\u007f\xf8\xcd\xc2\xfc\xe4k=}\vQ\xbe\xff\xb6\xdbc;Y\xa94\xc0\xe5\xe2\x19\xfb\xf6\xce\xcc\x15\x87\a\xfbed6n\xaa\u007f\x91\xed\x93\xfbگlc`\xe3\xd7,\xbdɩߤ@\x15\a\x0f7iM\x8f\x91=\x99\xcb\xe2Gs\x9e\xad4g\x03\xea\xe7\x85%\xd6rG\x8e\x06\xa6\xddp\xf4H\xea\xaaC\x1c\x03\b5p\xbe#\xb3\x82S/ڝ*\x91\xa6\xe4\tϓ]\x056\xf2\x0f\x83\x1f\x1c}\x17\xfcN\xe0x\xfe\x9c\xbc\xed\xbb\xa1\xcb\xf7\xbd\xbc\x8d\x8b\xcbEr\xaeP?Sr\xca\xeeb\xb7\xfd\x8fO\xd6\x1c{\x16Q\x80\xadp\x89\xc9\xd8h*L\xb5\xfe\xd4\x16\x0fb\xce\xfd\xef\x8e\xcc\xfcY\fS\xebn\xcb\r/\xfbBZ\xfc;\v}\xd6m~9a\xb94\xb2\x99\x1d\xac\xa2-\xc2h\xac[\x87\v\xb2\xd7\xf4\xe9͎\x1fϭ\x96J$\xc51\xb3\x05\x98\x00N\xc7&\xcd|'\xbbc\xc7䬥/ʺ\xe9\xe7\xfc&᧥\xb3,\xa7\x1a\xb9/\x9e94\xec\x9d\n\xe2\xb3g\x87\x91)\x19^D\x06\x14\x82\x0e\b\xc7/\xad\x15P\"\xb8܈Edӽ\v\x1f&\x1d\bS#\x96\xd5\x02pK\xa0\xc8\xef\x80D\x1e\x98\xdb\x01D\xfc\xa4\n\xfbȚ\v\xfc\xf0\xea\x1aM\x889B\xd6\xc54G\xe1\x1e\xf3e@\xf1f\x8e~\u07bb;\x03a~\xb7WOk\n\xd7CL\x01\xe8\xf1\x8e T\x86\xe7\x95|\xa0;\x96\xddv\xe8)\u2433aH\x16\x92\xb7\f\x96\xc0\xb9\xf0z\xae=lyN\xfa\x14\xa2S^\xfa\xeb\x06\xdfxG\x87\xe9\xaf0\x18\xaa\x05f\xdf\xc6x!e\xb8\x03Ƹ.\x9a9\x95\xa6\xc0\xe2\\(\n\a\xff(noAiO\xf9@ut:)\x93S\xd8P\xd6U6\xbf&*\xbd\xdf\xf6B\xf2v\xf5\xdd\xedp\fF~\xb3[\xc5\xc3\xc1\x1a\xba\xa3@\x0e\x8b\b\x87\xe1\x1c]\x1c\xdc\xcf\xedJ\x81\x15\x18\x98a0\xc8\xc8dT\xa5x͊Z\xadС\v\x8d\x98\xe4q\x1c0.\x8eW2v\xe1\xcd\xf7\xc21hd\x8d-CZ\xf1\xa4\xbfV\xd5A@\xb5G\x84ñ|g;\xee\xe5=\x19E\xd6\x184\xca'K<\xfc@\xad\xba|\b\x8b\x984^\x80q\t|\xe5\\\xe5\u007f\xfb\x86V\x15\x1f\xe2\xed\x1b\x9f1p\xa0\x0f%[\xc6#S\xd4\xef\xe0#\xecF\xe9\x8b\xfa\xe2\xf7\xcf\xd8#\xb2\xa8-\xa6C\xa4I\xf1\xda\xcc\xed̥\xbe+\\\x16),\xedWyy\xf2:#\xec\xdfs\xed\xf7Q\xa5\xbc\xa8\x98\xe5P^<\xf1\xf2\xdfE\xfe/\xebP\x98\x9e\xac\x94Ny\x87\x84\xba\xf3\x88\xffߞ\x92?)\x81\xe8e\xc0\xfdS\xfd\x92\u007fb:\tj\x1ew\xa5na\xa6\x8d\xd2\xee\\\xb8T\xc7\xf7]n>,\xb2\xe6Jz\xa3\xbb\x8dF \"穼\xa2ƹ0-\xbc\xc9\xe1h\x8b\x00\x87\x96\xfa\xcbq\xf3\xb4\xb3(B?\xd6\xe9\xe6Z\b{)\xb2\xb1\xcb6{\xb3o\xab\x8d\x9bݔ\xee\x98\xda2WC\xc1\x06\xddtˋ\x82\xddg\x825\xf3T8\xbe\xc3\xf6\x8e\xb0\xbe,+O\xcde0\x1bHU\xe0ܺ\a\xb7vRrA\xd6D\x8f\r\x99\xa76\x91\x86\x12\xdbř\xa9\xff!\x16\xe8\x02\x04\x86D)n:\xa9\x9fnc\t\xa5a\x8b\xea\xb5=2\xb6ݫ\xef\xea\x1dws9\xf4O\xddY\xd8V@^\x8d\xe3XI\xfb\x03{+\x8b\x12\xea\xfb\v\xd5#\x96\xe7b\x9f\xae\x9e\x89\xed\xb7\xaaW\xf5\x16\x1b\xa0y\x15+\x02@%\r\xb1\xaa0.\xb9{\xba'~{d\x84z\xd2r\xed\xd3/\x11\xddێl\xf3\u007f\x9e\xbf\xe5\x9dL\x8d\xfe\x18*b\xdb\xd9d\xd2_\a\xbd\xbf\xa0\x12\x9c\x0eEc\xbdf\xff\xd7\xee\xe1\x15a\x93\"\xc3sص\xe2-\t\xfb\x9dv\x05\x14\xe7$\x95\x0e95\x86]\xdc&,\xa7̋\xdfP\x17\xac\xcbL\xaeY\xe1\xdf$8\xf0\xc0\xa0>\xf6\xd2\x0f\xd1=\xf8\xc2[\xc7\xd6w\xdc<\x06*\tC\x18~\xce$\x02\\\x98\xa5\x9eY\xc9Y7\xff\x9bW$Y\xe1\x93\u007f\xb1\xac^\x90\x9cq\xe2F%E\x85\xd6\xd9\xd7A\xd3\x14W\x13\xb2Q\xa9\x147\xca{\xd5\xf0\xe8\xad\xd1EH2\x87C\x06\xe6)C\xda\x1b\x8eu͔\xbc\xe7\xfa\x12.w9A\xc5Y\x14ȓ\x92K\x9a\xb1\x12\xd6\xff\x81\x9c\xb8c\xea\xeb\x99\xeb\xc9\xe7\xe5d\n\xd1Ị\x97<\xe5\x1b\f\xf1\x8e\xd7\xe3\x1dw\x82\x94\x1aTPN\xe5\x90\xfd\bwb\xb2\x8f\xbbԡ\xbc\xa2\xb2\"~H\xa7\xd06\xc86\xca_\x02\x10\xde0wnDKAAN\x8e\x91\xdee9\xb8\xbe\xce\xd2\x18\xa9\xd3iFVg\x04\xb4?\xfc\xf8\xac\x0f\xc2#\xc0\xd1\xde|\x9f\xcf\xe7\xda\xe0ּ^\x0e2\xa5|\x88Ś{\xe8\x84A&\xf0X\x10\x84|\xb4\xe3\xac[QhY\x88^\xa1\x90\xcboG|\xbe\x9d\xe1#W*\x83\x8afe`-\xc6ޣ\xac\\\x06\a\x16\x00\x856\xc6i\xf5\x85˺\xaf.tu/^\xed\xb2\xd1\x1ey\xfc\xf9\xe0\xb5kA\xa8\x94\xf5\xed\xc9\x05\x02\x1e\x9f\xaf/\xe1˙\x82\xd45\x99\xecn\xd1nמz\xd7]1\xe7\xda\xdaZ[ϝom\x15V95\x0f˅\b_\xe16\xe3\x9c\te^\xe5^\xc1\xcf!M\xe5\xea\x1b\x19\x06\xcdM\xb1\xfd\xe9H\xa1\bчVx]m$\xef\xdaՏ\x91KJM\xcf\x0f4F-\xab\x97\x18oQ\xebC\x1b\x9d\xaa\xb6\xda2\xd1\xc7\xed\xb3\x06\xba3q/\x83T\x9f]\xbd)\xf1\x1d\x16<6.jxo\xbf/|CA^\xa6[cB\xea2\xa9\xe3|A\t\xb9{o\u007f\xd01\xad\x95K{\xf1\x062A\x15`O\xad\xf1\f\x1bF8\xbb\xc2;\xa7\xd5' \xbe\x8b9\x12\x04\x12ƀ@bR\xc3]\ue523ʷ\xd1q,V\xdao\x17\x9f<*\xf0\x92\xfa\xf8l\xbd\x11^\x94ܫ\xb5\x18QcT\xa4\x8a_\x14\x91\x145?$\xb3U\xd8\x100_9\u05ca f\xc9\xd1)\x16\xfc\x03\x1c\x86\x12C\xc2\xc5\x05ץ\x95\xb4)\xa7\x8c\v\xf3י\xe8\x84P\xa6[\"q,6\x99\x17\xc6\n\x16\xba\xa8\xdd\x84#\xcca\xc8\x00\xe6\xea\x9b\x00cd$\xa0\\\x1e\xc7ـ\x87\xee\x9d\xf8\xb5\xefݻ\xfa\x8a\xe1g\xe3\xb5y\xb4Z\xbag\x8b\xebv\x8cb\x9f\xbc\xf7Էaz\x028\x16\xa9{ț}\x0eBh\xd2A\xb7{mD\x03\xfe\x86\xae\x85\x85.\x83\x1c\xf4'*K\xb8\xdbO\x1bik;\xa2\x9dD \x96#\x99\x13\x81\x80\x9d\x1c\xae/\x00h\x90\x86\x90\xba;\x93@\x1a\xff\xe0±\r!\xf4\xdb+\xffګ\x0e\xcc-\xb2\x16c\x9ckn.\xfa\xcb\xefv\x19\x96$?:\x8b\uf266\x81\xefܗ\xdf\xc5\xc0\xfeb\xc7{\xdf\x13\xcdaz\x03\xc0K\xc0\xc3\xeaޣd\x99GkyVֶ\xbc\xc1\x85\xa7Z\xf9\xafͥ:\xb7\xcc'Z\x8e\x15sg\x9b.\x02\xbb\x01O\\\x17/+\xdfi\xfb.\x84\xa55j\xca>(\xa1\x8e\v=\x82\xff>\xf2\b\xcbv\x1e\n\xdb\xf4w=7\\\x834\xbe\x1f\xd9\xe0߈y\xf1\xfa~)\xd8\xc9q\x19NK\x01\x02\x17\x02s\xa9s~\xf29\u007f<\xa2\xd8\vk\r\x9c\xe0\xb7{d\x01\x86\xa6\xdf\xd6o\xf9Þ;\x9f\xb5\xc7Z荄\xb0\x04\xe6A\xc4R\x894\xa7vríḾ\x96Ѳ\xf9\x12ʀ\x9e\x97\x8b&\xf2_>\xb5p9U\xc7F(#eI\x94|\x95K!\xba\xda\xe1В\x93l0\xa8\xa436\xb1\xd9n\xc7LG\x97e*6Ne\r/ˌ\x1a\xedԎ\xd7Ūjj՚\xe3w\xfa\xb4\xad\xf3e\xf5\xc57r|т\x90\xe0\x84\x94\xe4֔\x94\xd6\xe4\xe4\x04\x99\xa8讞\xec\xdd\r\x83A\xea\x9aZ\xcdS\xaaCr\n֔B\xe3I\x9b\xb2nt\x87\xda\xd6~\xb5-\xcd#Z\xe3V\xbb\u007f\xbb\xda\xc8v\xfa\xd6\x1d\x1bL\xb2\xacB\x01\x1br\xf9\xa7\"9ŗ5\x9e\xd8\xc39\xe0\x1e\x808V\x06\xbe\xea\xb8x\xac\ah\xea_d^\xcb:\x93|xmW\x01(\x9f\xb7~\xab\xdf\r\xfaM\xeay\x81+\xa5)#\x12%ʂ\xb5\x99\x1fu\xfd\xaa\x85\x9d\x82~ޯ\xbe\x16\xfb\x87щ\x8b*\xb7\xf4\xa4\xb7\xc5K\x13\xa3\x94X\x8e\x83\xaf\xef<\xf8\xcf\xd1g\xab\xfb7\x00|`\x10\x80\xcd\xda\xd6z\x12\xb0\xc6H0\x95\x1c\xb4\xcfikY\x98=2\xc7\x16\x16\xe4\xe1\xef\xfb\xe5n\r_\xfb\xd7u\xffX\xbf\xfeGWVҹ\x8e\x8e\xb3\x81Y]/K\x06\xf68[\x84\xe6\xc0\xeb4XL\xef\xfd\xf0\xfb\x87{\xa2\xc0J.\xfe\x17\xca\x14.\n5|E\xbc\xcf^]sҝc\x9dC\x11~\xe9\xe1\x1b\a\xd8\x12L@\xfe!=\xe1I\xa5\x14\x17u\u007fz\xeam\x0e\x9aʐ^\xbd\xdbIU:\x94\x10\x80\xe9\x98d\xff\x8d\xc3\u074c\x12a\x0e?a2h\x02/\x90\xb0\xc4i\xeey\xc5;\xd8\xd7n\x06Q\xba\x89\xf8\xe7o \xd8\uf413(\x8b\xfe\x81\xf9\xd1\x1b&\v\x9f=X;-\xd9?\x8fvkC\xca)\xfc\x9f\x9d\v\x1bfm9\xd9\xdcҟE\xf3\x95\xecf^\x1d\x1a\xa2\xf0\x85-MזJ\xcb\xe7=\xee4o,q\x97˒\xa1i^\x81X\\lX\u07b3\xdcۓ\x86\x91\x97\x97\x0f{-:\u007f\xae\x9d\xb2\xe5\xc3\xfb\xed\xfd\xe7V{\x14\xe2\x0f\xda??\xf5&\xdc\x0e\xf3*_i\xf8\xf0\xaf\x92]\xa2Ţ@\xb7\x90\xc1\xe3T~\x11\xdc9\x19{\xcc\xec\x1dU\xb4p\xad\xfcM\xfd\xd9X\x1dא\xa1\x05j\xfa\xc4\xc9S雩W::\xef\xd1@V\x14\x93Vپ\xaf\xaa=-\xbd\xbd}_e\xfb\x9b\xe3y\x0e\x03{\x8aĎ\x9d^\xbfg\x1e\xd4if\xe7h\xe8j\xa2r\x0f\x96Ԯ\f\x9d\xf2\xd70(\x89\xc7w\x1490\xb3\x8e\xa4{\xe6T\xd6,OT\xe1<~\r\x8a\x8a\xc8\f\x11\x12\x8e>ϷX\x18VX\x15\xd0\x17\x9d\x18\xb08\xbc\xb3^tΪ\xac\xf1\xbc\x99\xc4/\xad\x98\xa4\xa7\x86y\n\xb7F\x1e&\xc0\x91$ZL\xc4\xed\x03\xa4\xe4ȏ!D\b\xe2\xe6\xc6\a\xcaHn˃8\xe1m\xb1\xc9\x1e\x12\xb7\xd6\xe8L\xba\x90\xf9\xb7:\x8fd\xedJ\x04'\xaa!\x06c\\?\xd3<ƶ}\xc4\x1c\xbf\x8e@}\xe1\xdf\x1d\xce\x00\xde\xc9\xda\xce\xe6\xd1݁\n\"\x02'\xe1||\xcb2\xf9_}\xb0\xf8W\t3:\x98\xe4\xeb\xa9\a\xa0}6)X\xb4.\xb8邈\x97I\x93\x02\x9f\xabe\x8cm\x06ś\xcd\x00[\xd0:ޝ\x17\xb7\xe6r\x88m\xac\x8cL#hd \x98\x96c^o\xa5\x80\x11\xa6\x00\xa0;\xd16\xe1\xc0\xe1\x8aa\xd4\xf8!m\xac\xf7\x18\xb5\xd3L\xdaS\x89\x85\x1d\xe3\n>\x96n\xc4\xcaN-\xba\xe6\xf0\x00j'\xdc9\x18BP\xf9B\xdf\xdf\"7\xd5%\x1c\"\xa6\xcc\xcfJ\x9f<\xf4\x8b\x93\xe1\x0e\x05\x14Z\xa7\xaf\xdf)\x8c\n}\xa7\x06B\t\xe2[\x01S\xfd\x84\x8a\xf9\xf4gԓd%\x81\x91\xa3\x1c7\r\xd9O\xb2\vM\xa0\x10\x14mf\xf1\x9bZ\x8ddQ?\xc1\xf2\xa78k\x94\x9e\xd0\xe7\r\xb0\xb38V\xe2\x80\x1a\xd0jW\xbb\xbb{z\xda\x00\n\x935\x1b\xb9zՄ\x91\x94\xf1\xff\u007fff2!\x0f\x83]\xf3J\xc5\x187\xba\xfc\x97\xed\xe53\xc6\xdf\x01\x02Cƅ2P\a\xb7\xef\xf4\xd6,\xa8Mw\x88\x8fǹ\x9f\xd7\xd6*)\xa9\xa95H\xd8\xe9\xf9\xf3\x18\xa0\xc0%\x01 s\x829ҏt\xeeI\xf1T\vH\xe6\xc9'\x05\b\x89\x0e~\x1c\xa3\x06ic\x87\xddK\x01\x16\xdb\x1c\"\xba~X\xb0\xeb=~KH\xa0^\xe9!O\xfc\x00\x04\x19q&\xfe\n\xe4\"\x8a\x1a^\xae\xf8\xf2\u007fS9c*l`t\xc9\xea\x8112\xba2\xcaQ\x85d\x16\xf9\f@\x1a\xc0\xbf\xd9Z1\xd0N\x96\xff\xa3[\n:\xfe\xa8\x90\xacH\\\xc1\xcct܆\xd0\x02\xe3\x1a\xe8\x83Ce\x97S\xacS\xf0R|D\x16\xcb\x0e\x15\xe2\x90XECyd\xe9\x83hp\xe19@\x06\x00<(\xf9+\xf9\xf3\xdf\xf8\xdd\xc8$̙4\xa6\xc0\xc5;.\x199댋)5\x99\xf7d\xa7e\x19\xa5s\u05f7z$\x01\xbf\xb2\xdf\xfeU\x9b\xd7f\x1f\xea\xdd\xd0\xd2{\u007f\xfe\xe5<&\xddv\b\xd2$\x94\b\xa2\xe9b\xf2)K\xbf\x81\vW\xf3\x89\xe4T\xff\xb1\xcc\xf2\xdf\x12\x12R\xba8Y\xc1j\x93\xa5\xf9'\xa9\xbc?\u007fK^GW\x81\xd8{\x98o\x0e%8\xee\xf3\x8c\xf9\xd5dw\xb5\a\xa3\xb2\xc3\u007f\xb5\xcdJ\xeb\a\x06g\xdcM\xfcz\t3.\x9c\x8a7S\xcd[\xfd^\xa8n\x87?\xc1ԣ\x03\xd0\x01\x8al\xbe\xde\xcdC9\xa0Xd\xbf\x13\xd2C?\x1c\x04\x92\xcb5{/\xf6\xc2\xed\x95\xcc\xec{/\xee\xdb\xd5{\xc2 \xc3\x162D{D\ru\xe7wo\x8c\xe9\xaf\xc5\xea\xff̧\x0f\xe0\x1b\x82\x90\r\xf4\x81\xfc\u007fC\x1cj\x9bc\x86\xeb\x94\xf9\xd8T\xdc#Ț\f\xdb\x13\x06\xbd\xae\xeby+L\x91\xf3@w1\xc8\xf0\xfd\xe9\xd1\xf5\x9dc\xc0@\xcf]\xdd\xe9?\xec\xa5|\xfe\x9d\xc3K\f\xf6\x8b9\xaf\x83d\xccX\xb1\x83\x89\xdb\xdbe,r\x8c\xf7\xba755\x85\xe7\xcf뼼\xd0ِ\x98\xd1\xd7\\\\5A\xb3\xd4\xeb\t\xde7\x8a\t\x81[\xf3\xcdB\xfe~\xb8\xb5\xc1\xd1b\xe9\x05\x8ds\x1c\xcf^w\xf9E\x1e)`sOrя)eަ\x05lCZ\xdc@Kg\xfe\xb1\x9eߝ\x9d\xbfz\x8e\xe6/mi\xb1M)\x1b\xba|\x19D\x11\xdfR\x9dѿ\x93\xaf=\xa5\xa8\xca/\xec\x0e\xfc|\xba\x04\xc7pzW\xa4PC<\xc1\xfcx\xd9u\x1f=(9\x96\x16m8m؊\xb7-LW\xae\xb0.n:\xb1Z}w杠6\xba\nw\xe0\x82$\"\x9d\x05\xd9O5\xa6\xf0t\x885\xff\xbe\xe9\x8c\xc0\xe5Nց\xf4;&̢\xed\xa5\x03 '|^0\xdf\xfc\xea\f\xd5\xf5R\xab.\xf2T(|$p\x82\xf9Ȳ\x9b\x18\xa7\xcb!\xbe\x85M:\xc0\rtoTĦK\xfe\x99\x94MH'\x82\xd2\x1d\x93\xba\x95\xe9O\x8a\x8b|2\xb56N\xaf5\xef\x89k 1J-\xd91\x11\xeaYYs\xf5\xba\x1dViU\xdb8o\x18\xf9\x04\xc2fYp\xc9s\x1b\xb0*\x95l\t\xc9/\xd6Evs2J\xaa\xe2/\x80?\x1d|\xb0\xb7Ÿ\x83F\xa4b-\xd1VAcF\xef\xeb:\xa2\xd4\xc1\xccl\xeal\xcd\xef{类\x13\xfb\x15.K\xf4\xf9\xbeM(\x186MY\x17W\xbf\xd5,3\xba\x1e\xabw\f\x97\x97\x97Ec©\x19Q\x9d\xe1\xc1\x8b\xec\x1b<\n\x91\xa9\xd8CT?\xdfl\xfc7UZ\xb6\xdf\x1c\xf7\xad\x8a*\xd1\x1a\xcc{\x04E\x8d\xf2ipCT\xb44\xbec)f\xd9(1/\x06\xf6\bZ\x11,\xf1O\xa0\xa2\x10,\v\xbc\xc8T\x9aeE\xd6\xfb\xc6\x16C\x95\xfa\xd0kؖ\x12\x1c\xf7\xcd\x12K\xfc,\xf1\x0eKH:\xa7&\xc8\xf0#\x1bH\xf7\xb1\x00\xe9D5mrH\xaf\xf1\xc1\xe3?3\xb1Q\xdfF\"\xad\xbf\xbcD\xd3Љ\x8f\xa4\xc26\xd8\xf1\x8aŷP\xcf>\xb8\xdf\xe2\t!\xbc\x15Uq\x86u\xf2.\xef\xddf\xdcc\xe7^\xe4\xb4t\xdd\xef\xc0\x80X\xac\\ZZ\xe3J\xb3\xb09\x00V]\xadбو+\x0f|\xf3f\xef\xe4q\x81,\xc4\xe7ҏ\xf1\xe5A\xae_/儘\xe5(#\xeb :\x94Γ\x89\x95k\x80Q\xdcn\xcf\xcb~C\xa1\n\x99\x9b\x9b\x9a\x16<\xafϳM\xf7f\x8d\x81ɥ\xa6$\x04<;\x13\x85\xe5\xeb\x94\x0ee\x8f\xa2\xe4\xceڤ1\x18\x1d%\x89\x89i\xcb\xf3\xd1EU\x0eg\xf1q*;\xf3\x8fR\xe6\xe61=X\x8e\xc3hW`\x87VU\xd8r7\xb7\xef\xce.Y\x12\"\xceq\xf7\xa6\x02y\xcdW\xb3(\x9f\x03M\xac\xee&\x9f\xfeq\xb4\xfeψ\xf7\x97\ab\xf2\xbe\xfe\x15)\xffc\x0f\x80\xb6\xf2\xd6\xd5Anj\xdeI\xdbW4y\xa5\x1a\x99t\aҝ\xd71\xa8\xda\xecQ\xca\x16\x02܃\x8a\u007f\xecj\xf6\t6\x03\xcb\x1c\x8c\xf7W!h\xeed7\x17\x177\xf2\x8b\"N\xb8\xbc\xaf˴\xf8\xf4\x8e:\xeeC\xf1M\\\x00t\x84\xbbi1r\xb1\xa8[\x1e?Ѓo\xcc{\xe3\x8dTEz\xbdr\xb2\t\xe36\xab\x17\xe3k?Z\xba\xfc\xacQ[\xbb\xeb\xdf7\xcf/\x8c\x88\xc0\x8a\x19\xc8V\xff{.\xd7\b=ծ\xdc\"\xb2\x15+\x9b\xaa\xf6\xd39=\xeb K\xd3Le,`S\xe9\f\xb2w\xcd9oW͡ɓ\xfcl\xc6\xda\n\x1d\xb8\x19_\xd4\xd2G\x97׆aR\x920\xba\x98e\xc3\xe2\xc9\xd2\x1a_ǁ\x1fu\xf6\x89\xb6\x035\x05\x93\xcbX2\x85\xeck\x9e>\x16\b\xa6\x99\xd3[\xb7:\u007f\x82\x05\x12\xfek\xe1ї/7:\xf3YÒ\x94\xf4\xf4+W.1Ad\xd6\x0fe;\xc1f\xed\xf3\x9d4\xf6\xb8\x89\xad\x8dY.\x94\xca\xdb\xe6H:\xa6\xe8\x01^\x9e\xc3\xca\xcaθ`\"\x1a<\x9dH\xe4\xa7\xfcW\x9f\xdd\xf6G!\x97u\xb8M\xc7,\x19\x1d\xea\xa6Z@L\x14T7\xddcC\x83\xc2\xdd\x12\xafގ\x86\xc0\x92\n\xb9\x1e\xde>\xd1\x1c7%1\xb5\xb0$E5\x94\x9a:D\x96kP\xa9\xbc\xe0\x8d\x85\x8c2r\xa2\x13@\x88\xa6\x83\xd8\xfb5\u007f\x85\x13\xb6\xfd\xaa\x92ݕ+\x8aZ\x85\xfa\x98\x12\xabf}\xa4\xcaG\xc6\r\v7\x9b\x9a\xe2\x8cR\x1d=\xb94GOb\xfa\xe7T˷\xb2\n\u007f\xb9\xe3ώ\x93\a#_\xfbw\xab\fTaҳ\xa6j\xfa\xa6\xa3t\xbd\xc3[\x9a\xcc\xfd\x8c\xc9\xfaH\xbf\t\x81-\x04ys\x89\xee\xe2G\xb0d\x18\xc8\x13h\x99Au.Z\x9154N^\xbe\x03\xb2\xfa\xeb\xeb\xb3R\xe1Ӳ\x13G\xdb2Qё\xf5\xfa\\I\x16\x87\x98\x1f\xbd\xde>\x19\xf3\x8e]z\x1cP\xcf\xc5\xe0\xd7=\xe8>';\xb4\xbdr\x9b\xcb\xea\x98?\xbe8D\xc5x[k5j\x934I\b\xbaT\xa7U\t\xb3W\xeb0\xb0*\xab\xa3\xa7\xaa\x16hڬ\xd8Fg\xa5\xfdLRg\xfaX,\xcd\xc7\xdccA\x8c!\x8a\xef\xec\xe6*\xfc\xec}%\x93\xe4\vs\x15\xf7Y|\xfa{\x04\xc8F\xbb\xdd\xeb\xe7+\x91\xfc\xceu]\xf8$\xd8_oI\xacr\x12+\asź\x19\xfdv8\xbd\x98\uee68s\xbb\xe7\u007f\x8f\x96R\x82\xa8\xdc?,%\x18_\x8a\xb9'N,\x17\x838+ \xcb\xd9\x04\xb1kħ\xf1F\xdfgd/$[\x865\x97\x0e'\x9c\xaeZ\xceǡ\x1e)\x95\x9b\xb4\x1aA\xe2{P\x93\xa0\xe8\r{\xad2d\xfe\xd6fܥ\xe9\xb7C(\xa8\x83\xbfQU\x99g1\xcer\xf9\\;\xe2H\xf9\x8b\bb\xbe\xcd\x15b\xd7\v\aτ\xf4\x85\xff\x1f\xae\xe0\x1e\x94\xa3e+lI\x8f\"\xdc\"\xf7Ӝ\xa4\x95\r\xac\u007f.\xbc?\b\x93\xa9>ik\xed\xe7\xd1\xe5V2Y\xd6r\x14.\x8f\xc26\xe9ы\xcf<\x1a\xdcOF}K\xdf\xe5lc\xc6+$\xa7#˧\b{ɘ\n6S\xb09Ґu\xb4\xd3\xe6\xe1d\x84\xe9\xd1`\xfb\xee\xe9*\xb4\x12ٕ\x04X\xcf\xec\xb9\xd55\xdc=\xfa\xfce\xe7\xe8\xf4\xbf\x12ou7~\xff4\xd4-\xd2x\xfd\xc8f\xb9\xcb&\x9f|ۼc\xe5\xad\xff\xa3\xb7;¼\xa5,\xbbZ\xed\x9c_ݥ\xc3&k㯩\xc2\xfd\xe9\xed\v\\&\xf5\xafcwF\xf0\b\x91c\x16렮7\xea\x1e\x87ؔ\xfe\xfc\xceWK\xc5\xf7\x8b]\xda}Q\x81Y\xa7:\xd2\xdcH\f\x12A=r/KuWT\xd2\x167\xfd\xb2\xccVoi\xa5\x01\xb0\x9e\xf9\xe0\xad\xcc\xed;\xe4\aՍ\x8c\xbd\x1c\x18+\xac\x19ݖO?e\x93\xbe\x8f\xbf\xea\xcam\x8b+\xd79W\x96\xa7\xff*\x863\xad\x8b\xd5\x06M\xaa\x93u=\x02\x17\x9b\xbb-\xf8ZR)\xc2\xc7\xe7\xc0\x86\x88Q\x89v!E\x10\xa0Qa\xb8(9\x97\x15P+Bv\xc7{@\xd4\x05E\x1c\x125\x96*\x13q\xad]?\xac\xd3\x1f\xff\xc9\xcfvS\x92\xd8\x0e\x89!W㐸\xc47\x19\x14g!\xdaN\x8c\x82\xe7£Ir\xb8\x86WO\xb0\xe6\xbc\xc7\x04ԇd\x16mb\x83\xae\x92W\xd0B\xbb\x94\xbeM\xc4!\xe3\xb8\xfd\xf5*I\x98\xb0>\x05t\xd33\xe79\xa1 \xf33\xf7\xe8D\xa0\xd6˓\xb5\u007f\x98\x1e\x1c\x86ʬ\b\xef\xdf\xea\x06\x1e\xa3\x83\xd1\xe0y\x02\xec*\x1f{+\f\xeeI\x19\xf4fD$\x025w\xbf\b\x18\x94\xa0\xa2[E\x06\x8bG\x13\xa6e\x93\x86L\xdfe\xbeur\x80H\xf2\xe0\xba\x0f\xc9\xe7\x021\x8c\x9d\x11\xb4\x1b\x95\x1f\xbcT\xff~Χ\x1dtWyw\xb3$vsj\x18\x12\xacf2(\xfdd\xe8\xdb\xefF\xd7g]kSz!~\xa0']\x1e:4\x05`\x04\x89lyi1\x9fYʸ\x80\xc07y\xf3\b\xadT\xe1\xa3\xc4)\x12IJ\xd1\xf2\x9bu\x8b\xcd \x96\xb2\xa5\xbe^\xc4\xc2\x03ճ\x12\x83ķ\x98'^D\xa1\x1f\xe7v\xd2\xd4\xd0\xd1\xf7\x83\xd3IwN{+$>\xc7|\f\xf2\xd4ؿ\xf3z\xecFd\xf9\x17\xde\x19\x9c\xdea\f\xed\x1e\xba\x91\xcc\xe6\xa2\x04O\xbc\xdfbDL\x1f\xd1{̬\xf7\xb5o\xc0\xbe\x9d<5|\xffʐ\x96\x80-DI\x9f\xa0ߚk\xf9\xad\xd7y\xeb\xb5BoW\xc5+\xf7o\x95\xcb\xc9^\xe8\xc4'^N?\xf1\xc1\xe8 \x16=8\\|7rp0\xe2~Iq\xc0\v\x87X\xbc\xf6\x8a\x9a\xec\xaa\xfa\xb3\xa3\xca3\xad\nX\x94\x9e\xdadyz\xc0\xacl\x99\xc9\xc90\xadE\x18\x98\vp)\xf5\xdbK\x15\x8cd\xad\x1e\xcaBĔ,\x8bD\xe5K\x84\xa1\vΞk\x83\xb9\xfdm\xff\xf1\xee?^$\x87\ffRd9M\"Q\xa8\xc8%\xf8\xeb\xa7ƨѣf\xf4H\xaa\xc7ç\x87]\xe99_R\xdc\xf9U\x9b\xb0Aq\xf3}<\xdc\xd8\xf9\x84\xd6=\x80^\xf1\xc6F-ڋ\xd4V\x9a\xbb\xf2\xbc\x06욽Vq\xbe*ĝ\xaa/\u007fs\xdc\x00r\x94\x9a\xe7\xfc\xdd\a\x0f\xa4\xb0\xeb\xcd\x19u!`D\xeb\xdc\xde\xf2[I\xebw\xf8=)\tEk\x8av\xde\x1a\xab\xd6kȿgou\xfdS\x94,`\xf9\xe7\xeb\xd1*\x0e糣:\x88\vg<\x84N\xb7\xa3\x89\x91Ͼ${֩ڗm\x98\xbeߕ\x9d˻:7m\xcaL̝VP\xa8\t\x89\xf9\x0f\x84Zo\x9dx\xe3\x86\xf4\\\xd9b'C\xf8\xdaL}zq!=\x15Ew\xa2\nh8\xaa\x98\x93t\x8a\x92[\xc1F3Xc\x84\xd5\xe1Xru\xf0.\xbd$\x04K|\xd83\x8ab\x93\xd38\xa5\xf5\x99r\x05\xa5ҋ\xab\xfd\xdb?M\x1czbި\xaaA\x1f\xe3ԧ?\xcak+Q\xb3\x19\xea\x10=\x8aJZ;T\xf8gr\xf9\xbf]M\x1a\x13{C\xd4}BK\xc4\xd4\x15&0\x9f\x8cF~~\xa2Y\xeb\xe3:\x8dP]\x9a\\\xc8\xe4\nB\xb6\x8c\x92T\xa4*&\xb1\xfd,F\x1f\x9fu\x04\xf4U\xb7y\x97\xa6\xe3`H\x81\xfdn\xb3\rn\x1e\xb1\x9a\r\vF\xfe\xe3\xc0|\xcaK\x8fln\x86\xd1x\xc0\x8a\x19\\.\xe5\x8d\xf0\x98\xdeH|\xae\xc3\xd2Im\x8e,\xc5i]\xb3&\x1a\xa7\x01+C\x8a\xb99\xf3\xf8\xa7\x1bD\x0eZ\x89\x86\xe8\x817\x83+\xe6\xfbg\xfd\x8f\x90\xc7Ds\xc1\xee>\x9c\xa9\x85\xf0\x01\x9e\x04\x86\x8a\xe4\xb3\xd6\fmb\x98\u007f|{\xec\x86{q\x80Ouye\xe2\x87ڬ(+7\x04\xdf\xe4oʈz0'\xf0#2\xb1VQ\a\xb2\x9e\xd8Ǘ\x14M\x86E\xb3\xaf}\x9e\n\x1c\x1f\xab\x87LK\xef4\xd4\b\xd6~\xf6I\x89:\x9dֲnj5'J\xd0e9wse>{hP\x99\x8ag\x8d\x8b\x16\x94,\xab\x88f!\xa6k\xe5\xcb\xd8土^\xd8\xc2Ɔ\x8c\xe8l|\xc0w\xfcu|Ñ߬\xba\xc9\x1b\xa6\xa6D\x91Q\x93x\x053Ck\xdfp\x16)\xbb\x9c\xf3e\x0e\xaf\x9e\x8dC>\xa8\xe5Ԟ$\x1e\xda2f=\xe1\xe4\xfc\xe6\xf1:H\xca\xfah5ڢ\b\x12\xa1\xfahF\xec\xfc\x9c\xe1L\xb6,@\x98\xbe:\x9c\x90\x9f\xa3\xb2\x18E\x98\xb2~7\x81\xe6BV?Q#\x91\x98\xbc3QA\xe6.јڬ\x90\xeexW\xeduj\xcdT\x03\x82a7\x1c`N\xba\"\xa3*\x8ckKbY\xc0\xcbJD\x1c\xb5:\n\x9e\x89\x14,T\xfa\xb3\xbf\xce3sq\xc8%̓!L\x8eo\f\x04\x12oP\x8cM\xbcZ~8_\x1eBU\xeb\x9eh\xbd2|\xa5\xf5H\x14@\x95\x87\x84\xf3\xbd\xf2m\xe2\xadEj]<\x14\xaf\xd6m\x1f\xc8\x18\xee\xbb\twFɇ\xbb|\xea![\xa3\xca$\xac\x05\xe6Q\x8b\xa5#\xcfz\xf5\x96\x98\xeb\x00T\xde\x1a֞N\xe8\xca6\x12\x84\t\t\xef讎\xa1H\x0f\x1dNb!\x1bb'\x16r\xc8V\xe1\xca\xc5!R\x05\x95n\x1e\xaf&>w\xbe\x89\xddw\xfe\xac\xbb\xda\x1e\x98\xb8\xaa)\xa4rR\x19`\xf2><\\\xba\xe7|\xf1\xa6a\x00\x91 \t\xc1\x10\x90+\x8f\x8eQ\u007f۹o\xa3\xee\xf0\xbe=\u007f\x02b$Jh\x93\x99ܒ\"A丄\xa3uu?\xf9\x04\x04\\\x1e\xef\x9e\xc4hG!\xee7\x15\xca˽&K>\xaa\xaep50\xabE\x99\xab*\xe5\xd4\xda~#>ĤR\x94>p8%\xdf\x1dq\xfc\x9b{\xff\xcd}\xcb#\v\xbb\xf2p\x87\x89\xd3\xc4q\x93Ϳ\xc6fOG[pVa\xa0\xe6r\x11N\xe0v\xc8\xff\n@`H\x94r\xear\xb7\x9dUHk\x9aέ|z\xac\x98g,t\xff\xf0Q\xb2\xf0\xe0\xecͭ\xe8Nb\xfc\a\x0e\xb4)\xe5\xedY\x18\xc40G\xdf}ws=\x97\u007f?\x111\xfd]\x06\xf8Ο\x1e.:\xe7\xd3\xe6\xd1X\f\x01\x89\xefӻ$\xa3\xcc\x1cV\xb7ލځsw\xd7\x05/\x8c\xe2@\xad@\x01\x05\xea\xee\xde{W,}v✥\"Ըz\xd0\x03\xf4\xd4\xd6EI\x1f\aIK\x90\x1dU\xed\x00\x81ŏIe\x9bP\x00\x91`\x89\x9bfq\x984ꒀ\xd9y]%]\xf0\xba \x9a\b-\x1c\"Փ9\x11\xe1s\x87\xe6z\x10\x18Ri\x11\x95 \r٪\x1fӍ럤1\x13\x8c!\xa4Sj\xf13\r\xf7\xc7^\xac\xa7-S`Y9\x00\x04\x84\x9c\x1f\xb1\x04\x80%̥ʒ\x81>\xa22\x97.\xbe-}\xb7pѷ\xe9\xf37\xf7\xb9^\x16\xe6-R\xb8\xd52\xe9U\xef\xb3[\xe2\xf2\xf7\x0eKV\x8f\x1f^\xb5\xb6\x8f\xbbj\xf1\xd0]\x12\xeeN牅\x1e\x81a\x8e\xc6\"}\xfa\xb6\xba-\xe9\xec|\xf6\xb2\xfa\xb2\xba k\x1f\xdd2a\xfa\x02^\xa6\xa0\x9e\x94!b)-D\xb4\xd2\x15*5\x0f\xcf7ho\xd9Ѡ\xfb\xe8\x82J\xfe\xf2\xd2?\\ζn<\x1a\xf4o\xff\xf1Q\x9b\xfe\xb40^\xa606\x9e%\x06g\xf2\x15>)\xc0f\xde\xc7U\xcc*7\x05\xdd\xc2\xc7U\xe8\xfd\x9c\xff'\xb9\u007f\x88M$+\xeb\xcf\xfd\xc66_7\tԤ\xa0\xfa\x1fY\xd5\a|j\xf5\xf4\xf3\x8c\xc1ip\xfa\xffUzǵA\x90\xdb\x13\xaa\xc8\xfb\xcf\xd6\xf2\x8f\xb4\x0e[\xd2\f\f\x93\x92.\x10`\b\xf4{\ff\xbb\"[ꨃ\xa3\xf6\x9c\xdfH17\xd60\x83\xaeu eeɲH\xb9k.\x92\xbe\xc2a0<\xd1bGQ\xd0Ji\x99%\xb9\x91_\xca+!\xd7\xd3\xe8}W\xf7jۑu(Gkf\xe2\xdcEsF\x98/\xa3r\xd9\x01yy\xc5#\x8aX\u007f5\xdaF\x99\xcf\x13H\xe2Ʈ5\x10\xfb\x9f\x1aY\xcbe\x99\xea8<\xf21\x1eg휨\x1a\x98}fP\xab}\xd5,-\xa6^_\x8aJ\xda\xc6\x1eϷ&}$\xf1\xdb6\xc7vƸ\xdb\xee\xa4\x02\xb1\xffe\xd7\xfe\xd6\xc4o\x910\xaf\x8b\x1e?\xeb\x1f\n\x01{\xd4d\u0096\xe1\"\x00\xe2\xf6+\x06\x95\x14=\x99\xf8\x92\xbe*\xa7\xdac\x8c\x14y\xaa\xe2xy\xcbZ%\xad=vS#C\xc6\xe99\np\"8*\xec^\x1dZx\xc4\xdd7S\xd6͊;\xcf\xd9\xc5\xfas\xbc\xb9\xb8_\"\x95̯i\xbf\xd7#'\xc9+*\xc7q2\x1a\x13I\x05\xd2\x1e\x94yl%\v\x97\x8aE\x8e\xb8\xa4\xa3^[Ɖ\xf8\x857\xb08A\xac-\x02\xd3\x164\x1c\xf3㋲\xfc.\xab\xf8A\xd3u\x1eF\xea\x8dEOZ\x9aa\xde\x18;R3G\x05\xd5F\xe7\xe4\xc6\x18\x18\xe9~\x14\x03#\x91\u009e\x18\xe8\x89T\xba]\\{jg\xa1W\xf4\x8c\x0fX\a\xb3\b~\xf6<\f\x9bpDm\xb1E\xcaݭ\xe2\xf4\xedQ\x86\x1a\x8eG\xbd\fC\x04\x1b\x0f\xf2\xf0\x88\xf8\xe7=p\x89$sC\xabT\"\xbb\x91\x8cY\x1f\xb4uG?\xdc\xd61zˠx\xab\xfci\x01\xb5v\x915:\xe8h\xac`\xd2\b\x87亟#\x9f*\x1d\x90\x90\x91\x9a\x8c,\xf7\xba\xa3\x18\xeb\x92f\x06\x10\xf8#\x15>3e\xb3Tu\xed\x93\xd4u+(\xef\x81l\x85:\xd3\xcb*o\xd8w\xc6\xe4\xd0\xfe\x03\xfaQ\x93\xfb\xe5ʑ\x8f\xd3GwE\xbf\x02\xad8\xf8\x85\xf1\xb0w\xae\x9b\xaf\xbfU\x95\xb2՛\xfcn\xeb\xa7\x0fK\x8c-\xb7 \xdb\v͎K\xa1M\xed\xb2\xe3r\x869\xbf]\xaday\xfa\xb6+\xf4\xd02\xb6\xb6\xdep+ҹ\xee\x1f\xac\xba\xa8x\xa4\x97?\xe4_Q{\xf8\x8c(Ƕ\x0e;\u007f\n\xdd-\x17!\x98\xe41FR\x1b9n\xff\x14f\x8b\f\xf7!\xadК\xda\xc7\x0f\x9a\xaa\x11\xeb\x91?n\xeb\xf8\b\xe6\x8c\n\x00 c\x03D$=K\x8e\xb6n,P\x89Yg\xfe\xcb\x1axq\xcfͩ\xd1'C\xf1\xd0\x06 \n\xde}\xd6G\xe1%3Cg\xadQ\xf9Ӝc\x0e$\xd6n\xf7%lcf\xe8\xacUˌ\xa0N\xea\xb7\x0e^\xf6ޤ\x1e\xba\b\xa3M\x86-\xee'KV\xbcϚ\xcd9\xb8y\x91\xf3e\xf2z\xb1bQ\x03\xa6\xbeȵ\xa1\x10\xb3ƏxT\xe3R\xd0Q\xa6\x97\xa65~\r^\x9d\x8du9g\x11\xe6\xf03\xff\x1cf \xcc{\x89\xae&#T\x8a\x88u\xd3H\x9d\u007f\x048%\x15\xf8\xa6\xdd2t\xf2):\xf5N#\xe3\x87s\x9a??%\x92\xeb\xa8?05\xa5\x12\xa7\xb6\xd2љ\xb4T*\xad\x03R\xbb\x03\xacg\xd3)Sאy\x1a\"҇SAܻ\xca錪\xaf\x17)q\xfe\xf7\xa5R\xd3K=W\x10\x97H\xc4\x12\x90\x9d=\xb0\xbc.(<\xbf\xd4\xcb>L}\xff,\xce\x197\xf0汫\xcdƎ\x1a\x97\xb8P\xa7\x9e\x9f \u007fs\xed+\x1e\xe6fI\x02\xbd\xd0X\\h\x96\x8f\x9e;s\xc6b)\xf4\xbd.V\x00\xe1\xaf\xd3Ħ,\xec\xd5|pU\xf7\xfc\x99\xe9YY\xb5\x18\r\xb5\xae}\xd20ӐT\xa4z\x16\xfb\xadq\xdaM\x9eeRp\f\xfc\v\x11\xc0\xcf\x16-N\x02S\\ \xe0\xc0.\xe3]\xf0\v\x93\xed\xf9H\x87d\x8fv\a\xc7i\xdfdK9}\xefdqz\x81\x0f\xe2\xe2K\xca\x105\xf3nX e\x87\xe7\x10\xfc5bF\xbf\xa0\xc16\xa9ʍm\x87C\xca\xd4@;\xe5?\xb7{\uf22eR,l\xb0=\xde\xfa\x9a\x86p\xc4\xfde\x99\xf0\x88(\xef\x16\xafFM-\xdf\xd7c\x16\xc4<\xbb:\vG\xc8Н\x1bn\xc8\xd1喊\x05\xde\xe6\x14\xdb\xdc&\x18R\xc6aRV\xce\xd5z\x14*/\x83ҴT\x99#\xf3\x9cH6\b\xac\x80\xf1\xa1\xecv\xd9\xf4\xad\xb4\xdb#\xca\x0fI\xdd(\xd7\xe1\xdb\xe9V!QҠ\x84\xcd\x18G\xe7\xf0\u007f\xe9߄\x9d\x04\x17+x\xc4m2k3\xa8\xa6\x03\x18\xbb\xe1zU\xe635հ\xa7\x03\x85\xf7\xb22o\x1a\x99~Gq\x88\xebr\x94v \x0f\x04\xc1\xb3\xbe\x82\xf3\x0f*\xe3\r\xa5\xb5[Ւ\xe1C\xea\xac[~:\xebm&\x95\xdd$\xde\a4ij\xa5\xefB8\xaf4|\x97\xba\xfa؍pH\xdc\xe6r\x9f\x1b\xd7\xd5+ƺQ)\xa9\xda\xfb\u0602\x99I\xde\n\xf2\xc9\xd0g\xb2H\xa5S\a\xcb\xea\xaeba-ui-\x81\x1f\xc6l\xff\xa1\xdb\xf4\xf8/о\xd00\xa6\\M\xcb}K\xf8?\xe4FdD\x93\x96{=\xc8{<\aԍ\x1f\u007f\xe5\xef\b\x8a^Ѡ\x92\xef\x8c;\xf0\x8a\x15\xf7|x\xbb\u074b\t\x97\x1a\xf2\xf9]\x1d94j\xfb\xcc\xdc\x1b\x11F\x11a\xfa\xa1f\xdf|\x12\xc6l\\\x16\x1b\xbcQ\xb3!\x8er5\xb9\xf43L\xdd\x1fc\x1b6\x9a?a\xe3a\xf6\xb9\xc35\xdfc\x8d\xcdG|\xaf-\xf8\x01\xc7\xc0\x87\xd9ls^\xd7\xf3\xab\xc48\x9a%\xcb\x176u\xe0\x9bO\x86\xe79\xe3Q\xb8\xbeǟ\v\x97\x8enXIx\xaf\xfd\x8d\xf24paܽ\x1af\xbdζ\xdd\xf6K~\xca?\x1c+2yI\x05b)\xa2\xb1;\xe6(\xf9\x1a\xe5J\xfc\x91\x8eΕ\xd0FH\xba\xea\x91\xf8\xf1\xce\xd8+\xe0\x84*1&\"ɰ\xe1\xe1ɍ\xac\xb0\xddP\x02\xc6a\xce%'o\x06\x91f?\xbd\x1c\x95\x84cO\xcaO\xc1K\v\xe4\xec\x1d\xdf\xc28\x9cVz\xea\xecM\x95\x8cé\x91cg\x88\xce֧\x13\xf5\x1c6Y_}\xf7\t\xdb\x0eo\xfc\x94m\xbc\xf3\xff+zgT|\xee\x85VQ?'\xa9\xf5\x11\x8e\xe9\x99\"\x91x\xa6\x18\x17\xe4R\x8f;gO^\xd4L\xdb\xc48;\xd4\xdeq\xc6\xdc\xdea\xb0\x87ߘl\xadLb\x8cL\\\xfaWw\xc8>k\xb0\xf9\x86~[gwk\xe3\xf1\x05:\xdb\xd1>\x042}Z\x8bB\x9f{\x9d\xa3W\x13\n,\xf2\x91w\xbd&\xdaS\xae k\xd7\xcb\x16\x17a@\x96Ը\xf3?\xb96>3\xa3\xa1\xb6\x91n=)?{\xc02\xf8\xdc\x01\xa5\x84\xca\xee\xf0\xf4\x86\x9a\xc6H2\x1d,\v)q\x93\xc2H\b`\f\xfa\xbeޕ\xba3jkTĞB\x19\x1e\xfa\x98\xc8?\x92\x12\xdeQm$%\xdc)\xfa\x90\x94\xf4\xe1}bU\xdaq_\xe5\xb1c\xbeqY\t-\x84\x1b\xd7\xd4\xcb\x13\b_\xcc1Ӂ\xbe)j\xd6?\x15\xa8\xa7\x87E=7>\xa7\xe3-9\xe46\xe5l\x9f\x90\x04\x93.\xaa\x9b s\xf1\x96\x82x\"\xe1h\xe0\x96\x82\x8dc\xbe\xb7\xb8[\xc0\xcfy\x9e\xbb7\x87?\xacN\r-\xfe\x16\xb1\x80\xd5\x12\xb4\x18\xa2 T\xe4\xf1\x10K\xcd\xf8\xd2\xc5\x05\x82\xf4\xf77\xf7\x049\xe5|\xb1Ѱx\x18z\x94j\xd2gmh\x1c\xe4I\xf7n\xb7H\xdfo\x92g)\xeb\x88v\x87\xaa\xd9~\xda\x16\xf5\xef\xb3\x1b\xeb\rC\xff;\x10L\x9aJq\xed\x9d\x1au\v\xf3\x9b\xd2p\xaf\x05\xfdmW\xe7<\x15\xf7\xb6\xb3˗=\x17l+(\x84lCP\xfc\xf1\x19\x9em-\x97[I\xb3H\xf7HK(\x85\x93|LQk\xe0g\x0f\x81ª?C\xf8E\x11Bx\xb8\xbf}QN\xe0\"\xcd\xf1;\xb6\xb0FNU\xb1\x8acE\x0f\xec\xa9\\k5E\xe1G\nн\xc8\x12^Jv\xd8<\x84+\x97\xa7Dk\xbd\v\x85\xcfr\xaeK\xecC\xadN\r\u007f\xbdw¹*\xae{\x8c\xf1\xc1\u007f\xc2\xf6\xb8\xabϚ\xf1\xa9>\xe8\x06\x16\x8dj\xa1\xe3h\xf8\xffÉ\xbdW~\u007f{\xaf|\xf4k\x9bÿ\xab\xcf$\x06a\xff=\xb9\xb1\xfe\xc8\xe3g\xf51\xd9i\x0fz\xe7\xdd\xc0\x83f҆M\xac\x8bm\xb3\xa5\x06 \x01\xeb\f\xf0\xd1\x1fz`\xd2\xfb\xac0\x1aX\x10\xff*\xb4\xcb+G\xe3\u007f\xa8n\x1a\xd1\xd1 ?J\x0f\x1d\f\xeb>\x03\xc8\x06\x00[St\x81d\xb0>)\x17\x8d\x12\x03`zdM\x1f\x91\xb8\xb4+\xc89\x82\xc1\xae,Z', į>\x19\x10cu}n\xc0\xaamĐ\xd8N\xe9\x90=\x99z8\x01$\x11R\x02գ\xcc3\xf2c\f\xb1\xa8\x171\x01ME\x10\xac\xc4K\xa4Y\xbd$\xb7\xb6\x8d\x8b\xa3\xd3\xf0\x86\xd8\x04\xa1\xd4\r5\xea\n\xe4]\x1cY^=\x15xܠ\xe6\x88KHUNy\x18\x8f\x9c\xaa\x88xU\xb4\xc1\xf6\x04q\x9a\xe6Y\xc9\x02\xc8\xf8d*\xd5gg\xebm\x02nL\x15\xb8%\xae\x83r\x16䰼!\xda@\x94\xd4Z\"\x13\xc6\xf2\x9c[\x1e\"(\xf2͘pf\xea\xcfk\xae\x96\x1b\"v\x87\x82\xe0\x1b$\x0e\xbeρ9&\u007fL\x9bI\xb4Q\x1c\xa1\x91\xef\xe0V\xfc:\xbe\xbd\xb2WIZ\xd4k\x8a7\xe6\x02\xe3TT\xbe!\xccX\x9b52Q\xa9\xa8\xdcI\xc1\xe9\xc1e(\x8bZ\x84\x05\xa6\x86P\x9b\xf8\x04\x15\nb\xa7\xc5}LL\xddϰ\xdf:\xd6.'\xaf\xcf\x02\x81\x18T\x12/\f\x89k\x88S\x16-\x8b>\xaa\xc1\x9cl\xac\x91T\x12\xd1\x12\xc75\xd1}T\x04\xd7r\x03\x05\x8a\xea#\xc4e\xe4(\xa7\xfcS\x9cG\x8f\x9c:\x16\xae'W\x11m\x9aP \x008\xf9\xe1\x9foV\x95V\xc7\xf5\xbf\xd0\x1d\x1a\xee\x8e7S\u007f*\xaa\x8a\x02\x176⋫\x83\x92-\x82\xff\xa87k\xc3I\xe05P|-\xe7w\xd1\x0f\x98\x85\xe0S\x9cX\xaa\xd1\xc9\xed\xbd\xe8-\x12g\xa4\xd5\xf2\v`(\b\xdaT\xac\x8fzI\u007f(\x13j\x12\xdbaZ\x92c^\x94w.\x99\x968\xaf\x9a\x14g-\xc9fV\x99\xc2\xf6\xac]hl\xf63.yO\x85u\x1c\xe22&\xf6\xda\xdb\xf7\xae\x17\xba\xa5\a8EAD|L|Z\xda3\xb8ɡ\xa5\xd0\xd12\xd6]\xe9ۑ\xf55\xecKqO\x9f[\xa1شܵ,\x04\x1fՄ>\xddk*\x99\xd5\xc4j\xd6\x1e\xb4\x0esέ\x9a\t*\x8d\xdeѮ|\\\xed\x0fA[\n\x96\xc7T\xef\xae\xcb\x05\v\x89\xa9O\xcc\xdd=5\xae@'\xfd\x0f\xe1\xd2\xd6z\x9c\xe6\x02=]Z(C\x1bG\x06E\xe9\xdff\x11M\xb6\xed8\x1d\x94G\xf2\x83W\x87\xc9P+q\xb1NE\x80\xb7m\xefF06\xe38Z:\x12b7\xb9\xcf\xc5-\x8c\x1aЬ\x9b\xb4%\u007f\xc6{\x98\xcdCh\xc7\x19\xb0\xa3\xef\x841\x9d\xf7^t\xc5\xdem,R\xac\xa9\x1f\\\x8f\x05\xe8H\xe2\fT\x01\xa3Z#x\xb0㮽\x89\x97\xc8`\xdf\xecY\xb3'\xee\xdc\xf7\xb2}?\xb1\xbc\xf6\x9e\x18}\x01\xa3\xeciou8\xccK\xd8\xd6P1\xeb\xc2\xf2\b\xbb\xbd㥙夆C\xb2\xb9\xca\x00\x9a\x1e\xbf\xed\xe2\xdb\xeb\xb0\xc0\x92Z\x91\"\xb38\x06\x8d\xb3\xac\xa7\xd6\xd8@x\xd7\n\x18µ-\xcf``\x9cPj\x8c}6Ll\x97R\x9a\xf9\xfb\xf4U\\\xee\xfb\x836[\f\xcd\xd1CZ\xad\xb7\x9f\xbb\x88N\xdc\"\x1d\xf4\xc8*Y\xb3\xd1\x1b\xf5=\x1e\x1d3C\x93Ⱦ3\xc5\xf3\xf4\x96ڣ\x81\xddx~\xaf\xd0\x12\xfb,c\x1fe\x1b\xbdG\a\x8a\x9e\x14\v;\x97,5\xceR>U\xb3w\xe6\x886Լ\xb4SAR7|\x04aq\xf7\xe9u\x04\x87\xf0^\xd8ځ\x18;V\xb2`ۼ<\xae\xaeV\x91\xf6\xbd\xf1\x92\xef\xa0V\xd3HɪE-\xea3\xe2\x12\x8ft9Ʌh\x96\x11\x86G\xeb;\xc6\xe1\x9a~\x19\x13V\xe8n:\x97\x98\x84\x99{\xd8~۔x\xfd\b9:\xd67N\xdb\xfb+m1\xdd\xde\xd6\xe3f75d\x19G\x17r\xcf\xc7z\xd9\xef\x97ZFݬ(:\xdb\xdf%\xb7P\x9f\x16\n9\xf2\xbb\xa8G\xac\x86a\x9cxLI\xe0\x03rl2}\x89\xd1\xda>\x16M\xacn?\xd6\xcfK\xfbwE/\xd9\x13\x92:T\xe3@\xd7\x02\xbfY_\xb7\xc7\xef\x93a\xee\xee\xef^O\x00\xfa\x05ME^3\xa0\t\xbf\x88\x8f\x98O\xa7\x90\\\x10\xb8\xd0\x03\x81\x93\x9c\xc0\x81\x97s\n\r_\xe6\f^\x9c\xc99\x1c$-\x17\xf0\x91\x91Q\xe6\x0e\xad\xc95\x8c\xa5y\xb9\x0e'\xad\xcbm\xb0\xd3\x0fs\a\x12\xe9\xc9\xe7\xbaс\r\x02\xc3c\xdcv\xe1V \xe5\x04I\xa8\x89\xb4\xc2߇\x9c!\x13?\xe6\x1cI\x84\xe6\x02\xd9$7\xcaܡ\xea\\ód[\xae#\x85\xae\xcbmH\xa0\xe1܁\xce\xf4\xb3\xff\xeeF\u007f\xc6\xde&8\x1c\xef$\x10*\xb5\xa4\xb0\x00\xf6p\xca\xd6w,意\xechi\x1bḩt\xdf-\x06,6\x11\xc3\x00i0\xb2\xaa\x0eI\x1c\xe9^\xaf,`\x8fŚ\x067\xa4\xf0{~\xaa5Q\xfcR\v]\x81\x88\xfa5\x9dj\x81\x9d^\x1dF\xe5i\xb5T\\?8E|ӕ\x89\xb1_\x93e\xd5\xefoH{U\x8e\x8fĠ\xfd\xa7T\xe9&L\xa1-3\xe0QW\xcdn\xbd\x92Ԥ\x02\x11u\x05\xfe\xeb\xb5\a\xab\x8eM\xb5\xfe\x91\x88\xbf\xfa*\nۥ\xb7\xa3\xaa\ue8b6\xabD\xdc\xd6+\x1e\x88%\xbbj;\xe8b\xe0ͮ\xa0\a' Y\x0f\xb2>\r(؟\x964\x8e\xee\v\x17w\xf3]|\x17\xf4\x1f\xf8\xac/\x99\xc2\xfb\x86JW#Ȥ\x00\xc6\xf5Zca7\xc4\xc1\x9e\x88\x92\xbbB'8:{\xde} \x91\xdaN\x1d\xec\xf5$\x828\xa5o\x92\x98\x13Q|W\x81\xbf\x9e\xfc \xd0mOnL\xb7\x14)\xf8\x8cQ^!\x1dW\x9c\xb0CM8\x87}:N\x8fhۑc&4ٝq\xb6o\x90\u007f\xbf\xa6_\xee\xd6@\x96xމ\x1b\x01\xfbɐ\xbb\xc55\x05\xb2\xef\x86\xc8\xda\rQ\xb7+\x14\x96\x06t\xef*\\\xda\x01\xc1]\x03\x8bw\t\xd4\xfaC!\xc3W\xd1\xc3^\"\x80yw\xc6\xden\xfe\xd0\xf2\a\x85\xc2\xe6\x97\x11e\xec\xab/\xeb\xf8\xdcR\xaa=\x98`\xbf\x1a\xb6\xee*\xa5\xe2\x865b\xfdJ\xae\x04\xd1\xf7\x92\x9dz\xaf\x03MwZ\xaa\x81\xf8\x1eN\th\xdd\xc1\f\xfeP\b\x0eQ\x997\u007f\u07b4\x14\xd6\xe1\x16\x84-\xbd␜\xa1E\xd2\xdfg\xf6\xbc\x8f\x9c\x01\xd9C\xa529\xca\xf2*X\xdf\xdd\u007f\x13\xc6\xf7\xeeYK\xb8Uk\xc4&\x05D\xf2\x0f\x03\x8d\xed\b\\\xcc4\x9e\xaa\x80\xfc]\xcd\aa\u007fw\x8f-\x9e\x0e5\xc4&_kD\xf0\x89@\xc6;\x83\x8d\xafI1f\xb5ͫ\xb3{\xceC\x8a[ŏY}E\xa9\x03\x81x\x15d\xf5S\xcf9ɇ\x88\xdc\xfd@\xf4~\xb2\xba$\x1e\xef\x97`\x83K\xfc\xdcP\xb8\xa3\xf3\x05\x98K}\xc8\xf4\x92\xca=\x05\x92wv\x17\x8d\xd5\xfeZR\n?P\xba\xa9h{\xa7%\xb0\x9e\xbfZdϙ\xe6'\x1f\xb6bi\xa6\x11\x01\x83ys-KhO\x94ü\x9e\xf6\x1a\x00\xd5\x17.\xfc\xe6 [\u007f4/%0y\x95]\xd4|\x14\xe1\x1f(\x85\x94珫D\x9d\xf7\xce\x05Bˀ(\x9eD\x8d\xd3\x15뺹\xf2\x1d\"\xf1c\xc5\xe5\x9ffw\x86\x888\xb1\xb5Ng\xa2P\x17\x94m\xfb\x91\x1c\x87zd\xeeo\f*Ģj6h\xe9\x89n\xcei[\x01\xd0}\xd7iY\nL\xe8ٱ\xf1E\x8ef\xfc9\xdd\xf3\x1aeF\xba8\xe3\xa3d\xfdǣ\x93\xd7O\xf3\xa2k\x9f@\x97p\x94\xc2\xed\xeb#\x1dB\\\xfb\x19\xa9\xe4'\x02Mo\x06\xfe=\xb4)\x05\xa7\ruĐE\xbdB>:\xea\xcd\xfa6Qlo\x85\x9b\xaa\xcc\x15\x946\xb5\xf4\x90]\xa7Z* \xa4)\xe4\r˸k\xc9\x01\x11ֿ\xf8\x90\xf5\xc1\xe9 \xdd/\x86d?6\x1c\xee\rQ\xd7\x1b\xd2\xc87D\x90\u007f\xd6x\xaa\xf6\xe3\xe3'ey:\xf3\xca\x1fK\xfd\xef\xba\x15CaM\x81۽\xd5T&\xfduf\xcf\xebT\x81\xc9\x04\xe3\xccx_\x81\xaf\xbe\x9a\x17\xbaW\xfeD\xc5){5\xeaPJ7\x9bA\xb6\x05\x86\xcc\xef\xb7\f\x832\x83\xbawW\x96q\x94\xfbo-C\xb4\xefg*\x93\xd2\xdf\xd4\xd9t\x1be\xff\r\xf4\x97\x8a\xd7\xc4j\v^\"\xdd~\xef4\xe8{;fo-\xbdW\xf2?\x83\x93*w\xa3W\xe41\xb8{\xc5\xcb\x12\xf3|\xd5\xc4\xf6\xf1k\xa9.Q\xb8Z\"\xc6\xfc\nX\xf2-\xf4\x92\xe8J\xc8\xfe\x92/~\xad\x19\xe6\xcf\f\x98\xfd\x0f\xdc۵\x8fdp\xb8\x91;\xf1\x00\xe2}\x9e\x03\x00\x00\x00\vWAD\xf4|Qķ\x8d\xe6~\xda\xfa\x8a\x94\x86\x0e\x85\x8aX\x9b\xb1\xbbC\x02\xde\xed\xfc\xf8\xde\xce\xef}\xc2\xf3\xdf\x14\xa0\xa2\xe5\x03\xd7\xef\xcf\x19\x856c\x0e\x00T\xc4\xda\xcc;k\xad\xdd\xf6\x9b#7.{7c\xae\xea\xa28\x9c\x04T\xc4\xda\xfc\xdd\xd3\xfd_\x9b\xe3\xfc\xcc4\x80\x8aX\x9b\xb1;B\x02*bm\xc6\xee\x8c\xe9#\"\"\"*\xa5\x94RJ)EDDDD\xc4\xcc\xcc\xcc̛?9\xaa\xa77\xcd\xd6\xc7t3Zk\xadg\x81\x13\x11\x11\x11\x11\x11с\xa8hz\xf6\x8a\xbf\x1c\xfd\xb7\x8c\xfet&ޯw.\x8e\xc3\xe1Y\x9bN\xf9ˋվ\x19\xbbgH@E\xac\xcd\xd8\x1d!\x01\x15\xb16\x8f\x8d\xf6\xf5\x16~\x19b\x95rݴ\xc1\x9f\xc8z\xdb\xc9]DDDDDDDfffffffVUUUUUUU\xb3i\xba\xba{z\xfb\xa6\x93\x9c\u007f\x846\xbdNd\xad\x01\x00"), } fileb := &embedded.EmbeddedFile{ Filename: "assets/.gitignore", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1549601873, 0), Content: string(""), } filec := &embedded.EmbeddedFile{ Filename: "assets/.npmignore", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1549601873, 0), Content: string(""), } filed := &embedded.EmbeddedFile{ Filename: "b06871f281fee6b241d60582ae9369b9.ttf", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969057, 0), - Content: string("\x00\x01\x00\x00\x00\r\x00\x80\x00\x03\x00PFFTMk\xbeG\xb9\x00\x02\x86\x90\x00\x00\x00\x1cGDEF\x02\xf0\x00\x04\x00\x02\x86p\x00\x00\x00 OS/2\x882z@\x00\x00\x01X\x00\x00\x00`cmap\n\xbf:\u007f\x00\x00\f\xa8\x00\x00\x02\xf2gasp\xff\xff\x00\x03\x00\x02\x86h\x00\x00\x00\bglyf\x8f\xf7\xaeM\x00\x00\x1a\xac\x00\x02L\xbchead\x10\x89\xe5-\x00\x00\x00\xdc\x00\x00\x006hhea\x0f\x03\n\xb5\x00\x00\x01\x14\x00\x00\x00$hmtxEy\x18\x85\x00\x00\x01\xb8\x00\x00\n\xf0loca\x02\xf5\xa2\\\x00\x00\x0f\x9c\x00\x00\v\x10maxp\x03,\x02\x1c\x00\x00\x018\x00\x00\x00 name㗋\xac\x00\x02gh\x00\x00\x04\x86post\xaf\x8f\x9b\xa1\x00\x02k\xf0\x00\x00\x1au\x00\x01\x00\x00\x00\x04\x01ː\xcfxY_\x0f<\xf5\x00\v\a\x00\x00\x00\x00\x00\xd43\xcd2\x00\x00\x00\x00\xd43\xcd2\xff\xff\xff\x00\t\x01\x06\x00\x00\x00\x00\b\x00\x02\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x06\x00\xff\x00\x00\x00\t\x00\xff\xff\xff\xff\t\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xb5\x00\x01\x00\x00\x02\xc3\x02\x19\x00'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x01\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x03\x06i\x01\x90\x00\x05\x00\x00\x04\x8c\x043\x00\x00\x00\x86\x04\x8c\x043\x00\x00\x02s\x00\x00\x01\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00pyrs\x00@\x00 \xf5\x00\x06\x00\xff\x00\x00\x00\x06\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x01\x03\x80\x00p\x00\x00\x00\x00\x02U\x00\x00\x01\xc0\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00]\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\x05\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00y\x05\x80\x00n\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x1a\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x002\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x04\x80\x00\x00\a\x00\x00@\x06\x80\x00\x00\x03\x00\x00\x00\x04\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\n\x05\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00z\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x06\x02\x00\x01\x05\x00\x00\x9a\x05\x00\x00Z\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00@\x06\x00\x00\x00\x06\x80\x005\x06\x80\x005\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\r\x05\x80\x00\x00\x05\x80\x00\x00\x06\x80\x00z\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x10\x05\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00Z\a\x00\x00Z\a\x80\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x03\x80\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00,\x04\x00\x00_\x06\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x15\a\x00\x00\x00\x05\x80\x00\x05\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x10\a\x80\x00\x00\x06\x80\x00s\a\x00\x00\x01\a\x00\x00\x00\x05\x80\x00\x04\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x0f\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x1b\a\x00\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\a\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x02\x80\x00@\x02\x80\x00\x00\x06\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00(\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x03\x80\x00\x01\a\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00@\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x80\x00@\a\x00\x00\x00\a\x80\x00\x00\x06\x80\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00-\x04\x00\x00\r\x04\x80\x00M\x04\x80\x00M\x02\x80\x00-\x02\x80\x00\r\x04\x80\x00M\x04\x80\x00M\a\x80\x00\x00\a\x80\x00\x00\x04\x80\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00@\x06\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\a\x00\x00@\a\x00\x00@\x06\x80\x00\r\a\x80\x00-\a\x00\x00\x00\x06\x80\x00\x02\x05\x80\x00\x02\x06\x80\x00\x00\x04\x00\x00\x00\x06\x80\x00\x00\x04\x00\x00`\x02\x80\x00\x00\x02\x80\x00b\x06\x00\x00\x05\x06\x00\x00\x05\a\x80\x00\x01\x06\x80\x00\x00\x04\x80\x00\x00\x05\x80\x00\r\x05\x00\x00\x00\x06\x80\x00\x00\x05\x80\x00\x03\x06\x80\x00$\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\f\a\x00\x00\x00\x04\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x01\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x006\x06\x00\x00\x00\x05\x80\x00\x00\x04\x00\x00\x03\x04\x00\x00\x03\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x004\x03\x82\x00\x00\x04\x03\x00\x04\x05\x00\x00\x00\a\x00\x00\x00\x05\x00\x008\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\"\x06\x80\x00\"\a\x00\x00\"\a\x00\x00\"\x06\x00\x00\"\x06\x00\x00\"\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x1b\x05\x80\x00\x05\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00D\x06\x00\x00\x00\x03\x00\x00\x03\x03\x00\x00\x03\a\x00\x00@\a\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00,\x06\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\a\x00\x00,\x06\x00\x00\x00\a\x00\x00@\x06\x80\x00 \a\x80\xff\xff\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x00\x00\x15\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\x05\x80\x00\x00\b\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00m\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\xf6\x00)\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00@\x06\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x10\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00 \x06\x00\x00\x00\x04\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00'\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x13\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00D\x06\x00\x00\x00\x05\x00\x009\a\x00\x00\x12\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00>\x05\x00\x00\x18\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x19\a\x00\x00d\x06\x00\x00Y\b\x00\x00\x00\b\x00\x00*\a\x00\x00\x00\x06\x00\x00\t\a\x00\x00'\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x0e\b\x00\x00\x0e\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x05\x00\x00\v\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x13\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x00\x00\x02\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x02\a\x80\x00\x01\b\x00\x00\x06\x06\x00\x00\x00\x05\x00\x00\x02\b\x00\x00\x04\x05\x00\x00\x00\x05\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\xf8\x00T\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\xb5\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\x05\x00\x00f\x06\x00\x00\x00\x06\xb8\x00\x00\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x16\x06\x00\x00\x0e\a\x00\x00\x1d\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00%\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00R\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00E\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00$\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00!\x06\x00\x00k\x04\x00\x00(\x06\x00\x00\x00\a\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00D\x06\x00\x00\x00\x05\x80\x00'\t\x00\x00\x03\x05\x80\x00\x00\b\x80\x00\x00\a\x00\x00\x00\t\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\x05\xff\x00%\x06\x80\x00\x01\a\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x0f\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00%\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x15\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x1d\t\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x01\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x02\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x80\x000\a\x00\x00%\x06\x00\x00\x00\x06\x80\x00/\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00&\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x00\x01\xec\x00\x03\x00\x01\x00\x00\x00\x1c\x00\x04\x01\xd0\x00\x00\x00p\x00@\x00\x05\x000\x00 \x00\xa9\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x0e\xf0\x1e\xf0>\xf0N\xf0^\xf0n\xf0~\xf0\x8e\xf0\x9e\xf0\xae\xf0\xb2\xf0\xce\xf0\xde\xf0\xee\xf0\xfe\xf1\x0e\xf1\x1e\xf1.\xf1>\xf1N\xf1^\xf1n\xf1~\xf1\x8e\xf1\x9e\xf1\xae\xf1\xbe\xf1\xce\xf1\xde\xf1\xee\xf1\xfe\xf2\x0e\xf2\x1e\xf2>\xf2N\xf2^\xf2n\xf2~\xf2\x8e\xf2\x9e\xf2\xae\xf2\xbe\xf2\xce\xf2\xde\xf2\xee\xf5\x00\xff\xff\x00\x00\x00 \x00\xa8\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x00\xf0\x10\xf0!\xf0@\xf0P\xf0`\xf0p\xf0\x80\xf0\x90\xf0\xa0\xf0\xb0\xf0\xc0\xf0\xd0\xf0\xe0\xf0\xf0\xf1\x00\xf1\x10\xf1 \xf10\xf1@\xf1P\xf1`\xf1p\xf1\x80\xf1\x90\xf1\xa0\xf1\xb0\xf1\xc0\xf1\xd0\xf1\xe0\xf1\xf0\xf2\x00\xf2\x10\xf2!\xf2@\xf2P\xf2`\xf2p\xf2\x80\xf2\x90\xf2\xa0\xf2\xb0\xf2\xc0\xf2\xd0\xf2\xe0\xf5\x00\xff\xff\xff\xe3\xff\\\xffX\xffS\xffB\xff1\xde\xe8\xdd\xedݬ\x10\r\x10\f\x10\n\x10\t\x10\b\x10\a\x10\x06\x10\x05\x10\x04\x10\x03\x10\x02\x0f\xf5\x0f\xf4\x0f\xf3\x0f\xf2\x0f\xf1\x0f\xf0\x0f\xef\x0f\xee\x0f\xed\x0f\xec\x0f\xeb\x0f\xea\x0f\xe9\x0f\xe8\x0f\xe7\x0f\xe6\x0f\xe5\x0f\xe4\x0f\xe3\x0f\xe2\x0f\xe1\x0f\xe0\x0f\xde\x0f\xdd\x0f\xdc\x0f\xdb\x0f\xda\x0f\xd9\x0f\xd8\x0f\xd7\x0f\xd6\x0f\xd5\x0f\xd4\x0f\xd3\r\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x05\n\a\x04\f\b\t\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00\x90\x00\x00\x01\x14\x00\x00\x01\x98\x00\x00\x02t\x00\x00\x02\xd0\x00\x00\x03L\x00\x00\x03\xf0\x00\x00\x04T\x00\x00\x06$\x00\x00\x06\xe0\x00\x00\bl\x00\x00\tx\x00\x00\t\xd0\x00\x00\nT\x00\x00\v(\x00\x00\v\xd4\x00\x00\f\x84\x00\x00\rd\x00\x00\x0e\xa8\x00\x00\x0f\xd4\x00\x00\x10\x84\x00\x00\x11\x00\x00\x00\x11\x9c\x00\x00\x12l\x00\x00\x13,\x00\x00\x13\xd8\x00\x00\x14\x80\x00\x00\x14\xfc\x00\x00\x15\x90\x00\x00\x164\x00\x00\x17\x10\x00\x00\x18d\x00\x00\x18\xcc\x00\x00\x19p\x00\x00\x1aH\x00\x00\x1a\x94\x00\x00\x1b$\x00\x00\x1cd\x00\x00\x1d,\x00\x00\x1e\b\x00\x00\x1et\x00\x00\x1f(\x00\x00 \x8c\x00\x00 \xf0\x00\x00!\xa0\x00\x00\"0\x00\x00# \x00\x00$,\x00\x00$\xe0\x00\x00&D\x00\x00'\xe4\x00\x00(\x9c\x00\x00)T\x00\x00*\b\x00\x00*\xbc\x00\x00,\x10\x00\x00,\xf4\x00\x00-\xd8\x00\x00.@\x00\x00.\xd8\x00\x00/`\x00\x00/\xbc\x00\x000\x14\x00\x000\xa4\x00\x001\x94\x00\x002\x90\x00\x003d\x00\x0044\x00\x004\x94\x00\x005 \x00\x005\x80\x00\x005\xb8\x00\x006 \x00\x006\\\x00\x006\xbc\x00\x007H\x00\x007\xa8\x00\x008\f\x00\x008`\x00\x008\xb4\x00\x009L\x00\x009\xb4\x00\x00:h\x00\x00:\xec\x00\x00;\xc0\x00\x00<\x00\x00>\xe4\x00\x00?h\x00\x00?\xd8\x00\x00@H\x00\x00@\xbc\x00\x00A0\x00\x00A\xb8\x00\x00BX\x00\x00B\xf8\x00\x00Cd\x00\x00C\x9c\x00\x00DL\x00\x00D\xe4\x00\x00E\xb8\x00\x00F\x9c\x00\x00G0\x00\x00G\xdc\x00\x00H\xec\x00\x00I\x8c\x00\x00J8\x00\x00K\xac\x00\x00L\xe4\x00\x00Md\x00\x00N,\x00\x00N\x80\x00\x00N\xd4\x00\x00O\xb0\x00\x00P`\x00\x00P\xa8\x00\x00Q4\x00\x00Q\xa0\x00\x00R\f\x00\x00Rl\x00\x00S,\x00\x00S\x98\x00\x00T`\x00\x00U0\x00\x00W\xf0\x00\x00X\xdc\x00\x00Z\b\x00\x00[@\x00\x00[\x8c\x00\x00\\<\x00\x00\\\xf8\x00\x00]\x98\x00\x00^(\x00\x00^\xe4\x00\x00_\xa0\x00\x00`p\x00\x00b,\x00\x00b\xf4\x00\x00d\x04\x00\x00d\xec\x00\x00eP\x00\x00e\xd0\x00\x00f\xc4\x00\x00g`\x00\x00g\xa8\x00\x00iL\x00\x00i\xc0\x00\x00jD\x00\x00k\f\x00\x00k\xd4\x00\x00l\x80\x00\x00m@\x00\x00n,\x00\x00oL\x00\x00p\x84\x00\x00q\xa4\x00\x00r\xdc\x00\x00sx\x00\x00t\x10\x00\x00t\xa8\x00\x00uD\x00\x00{`\x00\x00|\x00\x00\x00|\xbc\x00\x00}\x10\x00\x00}\xa4\x00\x00~\x88\x00\x00\u007f\x94\x00\x00\x80\xbc\x00\x00\x81\x18\x00\x00\x81\x8c\x00\x00\x83H\x00\x00\x84\x14\x00\x00\x84\xd4\x00\x00\x85\xa8\x00\x00\x85\xe4\x00\x00\x86l\x00\x00\x87@\x00\x00\x88\x98\x00\x00\x89\xc0\x00\x00\x8b\x10\x00\x00\x8c\xc8\x00\x00\x8d\x8c\x00\x00\x8el\x00\x00\x8fH\x00\x00\x90 \x00\x00\x90\xc0\x00\x00\x91T\x00\x00\x92\f\x00\x00\x92H\x00\x00\x92\x84\x00\x00\x92\xc0\x00\x00\x92\xfc\x00\x00\x93`\x00\x00\x93\xc8\x00\x00\x94\x04\x00\x00\x94@\x00\x00\x94\xf0\x00\x00\x95\x80\x00\x00\x96$\x00\x00\x97\\\x00\x00\x98X\x00\x00\x99\x1c\x00\x00\x9aD\x00\x00\x9a\xb8\x00\x00\x9b\x98\x00\x00\x9c\xa0\x00\x00\x9dT\x00\x00\x9eX\x00\x00\x9e\xf8\x00\x00\x9f\x9c\x00\x00\xa0D\x00\x00\xa1P\x00\x00\xa2,\x00\x00\xa2\xa4\x00\x00\xa38\x00\x00\xa3\xa8\x00\x00\xa4d\x00\x00\xa5\\\x00\x00\xa8\x90\x00\x00\xab\b\x00\x00\xac\x1c\x00\x00\xac\xec\x00\x00\xad\x90\x00\x00\xad\xe8\x00\x00\xae\x80\x00\x00\xaf\x18\x00\x00\xaf\xb0\x00\x00\xb0H\x00\x00\xb0\xe0\x00\x00\xb1x\x00\x00\xb1\xcc\x00\x00\xb2 \x00\x00\xb2t\x00\x00\xb2\xc8\x00\x00\xb3X\x00\x00\xb3\xf4\x00\x00\xb4p\x00\x00\xb5\x00\x00\x00\xb5d\x00\x00\xb6\x1c\x00\x00\xb6\xd4\x00\x00\xb7\xb4\x00\x00\xb7\xf0\x00\x00\xb8x\x00\x00\xb9t\x00\x00\xb9\xf8\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xbb\xa8\x00\x00\xbc\x84\x00\x00\xbd@\x00\x00\xbe\x04\x00\x00\xbf\xc8\x00\x00\xc0\xc4\x00\x00\xc2\f\x00\x00\u008c\x00\x00\xc3\\\x00\x00\xc4 \x00\x00ļ\x00\x00\xc5\x10\x00\x00Ÿ\x00\x00Ɣ\x00\x00\xc80\x00\x00\xc8\xe0\x00\x00\xc9d\x00\x00\xc9\xcc\x00\x00ʨ\x00\x00ˀ\x00\x00\xcb\xe0\x00\x00\xcc\xf4\x00\x00͔\x00\x00\xcex\x00\x00\xce\xe8\x00\x00ϰ\x00\x00Ќ\x00\x00\xd1,\x00\x00ш\x00\x00\xd2\b\x00\x00҈\x00\x00\xd3\f\x00\x00ӌ\x00\x00\xd3\xec\x00\x00\xd48\x00\x00\xd5,\x00\x00՜\x00\x00\xd6`\x00\x00\xd6\xe8\x00\x00\xd7l\x00\x00\xd8H\x00\x00ش\x00\x00\xd9`\x00\x00\xd9\xc4\x00\x00\xdaT\x00\x00ڸ\x00\x00\xdb\x18\x00\x00۔\x00\x00\xdc@\x00\x00\xdc\xc8\x00\x00\xddl\x00\x00\xdd\xf0\x00\x00ބ\x00\x00\xdf\x18\x00\x00߬\x00\x00\xe0\xbc\x00\x00\xe1l\x00\x00\xe2p\x00\x00\xe3 \x00\x00\xe3\xe4\x00\x00\xe4\x80\x00\x00\xe5\xc8\x00\x00\xe6\xc0\x00\x00\xe7\x18\x00\x00\xe7\xec\x00\x00\xe8\xe4\x00\x00\xe9\xd8\x00\x00\xea\xd8\x00\x00\xeb\xd8\x00\x00\xec\xd4\x00\x00\xed\xd0\x00\x00\xee\xdc\x00\x00\xef\xe4\x00\x00\xf2\x04\x00\x00\xf3\xf4\x00\x00\xf4\x80\x00\x00\xf54\x00\x00\xf6\x10\x00\x00\xf6\x9c\x00\x00\xf7\x18\x00\x00\xf8X\x00\x00\xf8\xc0\x00\x00\xf9$\x00\x00\xfal\x00\x00\xfb\xbc\x00\x00\xfc(\x00\x00\xfc\xb8\x00\x00\xfd\f\x00\x00\xfd`\x00\x00\xfd\xb4\x00\x00\xfe\b\x00\x00\xfe\xb8\x00\x00\xff\b\x00\x01\x00\x14\x00\x01\x05\xb4\x00\x01\x06\xf4\x00\x01\a\xf8\x00\x01\b\xd0\x00\x01\td\x00\x01\n\x10\x00\x01\n\x98\x00\x01\v\x18\x00\x01\f\x04\x00\x01\f\xa4\x00\x01\r,\x00\x01\x0e\x00\x00\x01\x0f\x88\x00\x01\x11,\x00\x01\x11\xa0\x00\x01\x12\xcc\x00\x01\x138\x00\x01\x13\xe4\x00\x01\x14\x90\x00\x01\x15(\x00\x01\x15\xa4\x00\x01\x16X\x00\x01\x16\xfc\x00\x01\x17\xc0\x00\x01\x18\x84\x00\x01\x19x\x00\x01\x1a|\x00\x01\x1bT\x00\x01\x1c\xd4\x00\x01\x1d@\x00\x01\x1d\xd4\x00\x01\x1e\x90\x00\x01\x1f\x04\x00\x01\x1f|\x00\x01 \xa4\x00\x01!\xc0\x00\x01\"x\x00\x01#\b\x00\x01#l\x00\x01$\x04\x00\x01$\xcc\x00\x01'h\x00\x01(\xe8\x00\x01*L\x00\x01,T\x00\x01.L\x00\x011t\x00\x011\xf4\x00\x012\xe0\x00\x0130\x00\x013\xb0\x00\x014\xa8\x00\x015t\x00\x016T\x00\x017$\x00\x018\f\x00\x019H\x00\x01:\x10\x00\x01:\xf0\x00\x01;\x90\x00\x01<\x84\x00\x01<\xd8\x00\x01?X\x00\x01@\x1c\x00\x01A\xc0\x00\x01B\xc8\x00\x01C\xc8\x00\x01D\x9c\x00\x01EH\x00\x01FH\x00\x01Gp\x00\x01HH\x00\x01Ix\x00\x01J \x00\x01J\xe4\x00\x01K\xd4\x00\x01L\xa0\x00\x01M\x18\x00\x01N@\x00\x01P@\x00\x01Q\xa0\x00\x01R\xe0\x00\x01SD\x00\x01T \x00\x01UL\x00\x01V`\x00\x01V\xd4\x00\x01WX\x00\x01X4\x00\x01X\xa0\x00\x01Z\x04\x00\x01Z\x88\x00\x01[d\x00\x01[\xe0\x00\x01\\|\x00\x01]\xd8\x00\x01^\xa0\x00\x01`\x94\x00\x01aH\x00\x01a\xbc\x00\x01b\xf0\x00\x01cX\x00\x01d\xac\x00\x01et\x00\x01fh\x00\x01g\xdc\x00\x01h\xb4\x00\x01i\\\x00\x01jx\x00\x01n\x84\x00\x01p@\x00\x01s\xe0\x00\x01v\x10\x00\x01w\xc8\x00\x01x\x90\x00\x01y\x88\x00\x01z\x8c\x00\x01{h\x00\x01|\x8c\x00\x01}\x1c\x00\x01}\xa4\x00\x01\u007f\\\x00\x01\u007f\x98\x00\x01\u007f\xf8\x00\x01\x80l\x00\x01\x81t\x00\x01\x82\x90\x00\x01\x834\x00\x01\x83\xa4\x00\x01\x84\xc8\x00\x01\x85\xb0\x00\x01\x86\xa4\x00\x01\x88t\x00\x01\x89\x8c\x00\x01\x8a8\x00\x01\x8b8\x00\x01\x8b\xa0\x00\x01\x8eL\x00\x01\x8e\xa8\x00\x01\x8fT\x00\x01\x90\x10\x00\x01\x91\x14\x00\x01\x93\x90\x00\x01\x94\x14\x00\x01\x95\x04\x00\x01\x95\xfc\x00\x01\x96\xf8\x00\x01\x97\xa0\x00\x01\x99|\x00\x01\x9a\xc8\x00\x01\x9c\x10\x00\x01\x9d\b\x00\x01\x9d\xd8\x00\x01\x9e|\x00\x01\x9f\x18\x00\x01\x9f\xe8\x00\x01\xa0\xc4\x00\x01\xa2\f\x00\x01\xa34\x00\x01\xa4x\x00\x01\xa5\xb0\x00\x01\xa6\x80\x00\x01\xa7L\x00\x01\xa8\x1c\x00\x01\xa8\x90\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa9X\x00\x01\xaa(\x00\x01\xab \x00\x01\xab\xcc\x00\x01\xac\xac\x00\x01\xad\xa8\x00\x01\xae \x00\x01\xae\x88\x00\x01\xaf\x04\x00\x01\xaf\xa8\x00\x01\xb0@\x00\x01\xb0\x88\x00\x01\xb6\xbc\x00\x01\xb7l\x00\x01\xb8\xe0\x00\x01\xb9t\x00\x01\xba\x04\x00\x01\xba\x94\x00\x01\xbb$\x00\x01\xbb\xa4\x00\x01\xbc\b\x00\x01\xbcx\x00\x01\xbdL\x00\x01\xbeL\x00\x01\xbe\xa4\x00\x01\xbf \x00\x01\xc0H\x00\x01\xc1\x18\x00\x01\xc1\xc4\x00\x01\xc3\x04\x00\x01\xc3\xe4\x00\x01Ġ\x00\x01\xc5T\x00\x01\xc6(\x00\x01\xc6\xec\x00\x01\xc8\f\x00\x01\xc9\f\x00\x01ʈ\x00\x01ˠ\x00\x01\xcc\xf8\x00\x01\xce\x1c\x00\x01ϔ\x00\x01\xd0l\x00\x01\xd1d\x00\x01\xd2\xdc\x00\x01\xd3P\x00\x01\xd3\xf8\x00\x01Մ\x00\x01\xd6x\x00\x01\xd7p\x00\x01\xd7\xfc\x00\x01\xd8\xf4\x00\x01ڬ\x00\x01\xdbT\x00\x01\xdcT\x00\x01\xdd\f\x00\x01\xdd\xf0\x00\x01ވ\x00\x01\xdfL\x00\x01\xe1\x80\x00\x01\xe2\xf8\x00\x01\xe4\x18\x00\x01\xe5\f\x00\x01\xe6<\x00\x01\xe7H\x00\x01\xe7\xa8\x00\x01\xe8$\x00\x01\xe8\xd4\x00\x01\xe9l\x00\x01\xea\x1c\x00\x01\xea\xd4\x00\x01\xeb\xe4\x00\x01\xec4\x00\x01\xec\xb8\x00\x01\xec\xf4\x00\x01\xed\xf0\x00\x01\xef\b\x00\x01\xef\xa4\x00\x01\xf0\x04\x00\x01\xf0\xcc\x00\x01\xf1 \x00\x01\xf2P\x00\x01\xf3l\x00\x01\xf3\xe8\x00\x01\xf5\f\x00\x01\xf6,\x00\x01\xf6\xc0\x00\x01\xf7x\x00\x01\xf7\xe0\x00\x01\xf8p\x00\x01\xf9,\x00\x01\xfax\x00\x01\xfbt\x00\x01\xfc\f\x00\x01\xfcd\x00\x01\xfd\f\x00\x01\xfd\x8c\x00\x01\xfe4\x00\x01\xff\b\x00\x01\xff\xd0\x00\x02\x014\x00\x02\x02\x1c\x00\x02\x03,\x00\x02\x04h\x00\x02\x05\xd4\x00\x02\aP\x00\x02\t4\x00\x02\n\xd4\x00\x02\f\xe0\x00\x02\r\xf0\x00\x02\x0f\x18\x00\x02\x104\x00\x02\x11\xe4\x00\x02\x13<\x00\x02\x14,\x00\x02\x15,\x00\x02\x164\x00\x02\x170\x00\x02\x188\x00\x02\x19$\x00\x02\x1a\x88\x00\x02\x1b8\x00\x02\x1d\xb4\x00\x02\x1eT\x00\x02\x1e\xcc\x00\x02 |\x00\x02!h\x00\x02\"\xac\x00\x02$L\x00\x02%0\x00\x02&H\x00\x02'\x88\x00\x02(\xf4\x00\x02)\x8c\x00\x02*0\x00\x02*\xdc\x00\x02+\x94\x00\x02,\xdc\x00\x02.$\x00\x02.\xec\x00\x020\xec\x00\x021\x84\x00\x022@\x00\x022\xfc\x00\x023\xb8\x00\x024t\x00\x025$\x00\x026\xf4\x00\x029 \x00\x02:\x8c\x00\x02:\xd4\x00\x02;\f\x00\x02;\x88\x00\x02<(\x00\x02<\xd8\x00\x02=4\x00\x02?\xb8\x00\x02@\x98\x00\x02A\xe0\x00\x02C\xa0\x00\x02D\xfc\x00\x02F\x98\x00\x02H`\x00\x02H\xf4\x00\x02I\xcc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02\x00p\x00\x00\x03\x10\x06\x00\x00\x03\x00\a\x00\x007!\x11!\x03\x11!\x11\xe0\x01\xc0\xfe@p\x02\xa0p\x05 \xfap\x06\x00\xfa\x00\x00\x00\x00\x00\x01\x00]\xff\x00\x06\xa3\x05\x80\x00\x1d\x00\x00\x01\x14\a\x01\x11!2\x16\x14\x06#!\"&463!\x11\x01&54>\x013!2\x1e\x01\x06\xa3+\xfd\x88\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfd\x88+$(\x17\x05\x80\x17($\x05F#+\xfd\x88\xfd\x00&4&&4&\x03\x00\x02x+#\x17\x1b\b\b\x1b\x00\x00\x01\x00\x00\xff\x00\x06\x00\x05\x80\x00+\x00\x00\x01\x11\x14\x0e\x02\".\x024>\x0232\x17\x11\x05\x11\x14\x0e\x02\".\x024>\x0232\x17\x11467\x01632\x16\x06\x00DhgZghDDhg-iW\xfd\x00DhgZghDDhg-iW&\x1e\x03@\f\x10(8\x05 \xfb\xa02N+\x15\x15+NdN+\x15'\x02\x19\xed\xfd;2N+\x15\x15+NdN+\x15'\x03\xc7\x1f3\n\x01\x00\x048\x00\x02\x00\x00\xff\x00\x06\x80\x05\x80\x00\a\x00!\x00\x00\x00\x10\x00 \x00\x10\x00 \x01\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x16\x04\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aL46$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W%\x02\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x804L&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9%\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00=\x00M\x00\x00%\x11\x06\a\x04\a\x0e\x02+\x02\".\x01'&%&'\x11\x14\x163!26\x11<\x02.\x03#!\"\x06\x15\x14\x17\x16\x17\x1e\x04;\x022>\x03767>\x017\x11\x14\x06#!\"&5\x11463!2\x16\x06\x80 %\xfe\xf4\x9e3@m0\x01\x010m@3\x9e\xfe\xf4% \x13\r\x05\xc0\r\x13\x01\x05\x06\f\b\xfa@\r\x13\x93\xc1\xd0\x06:\"7.\x14\x01\x01\x14.7\":\x06\xd0\xc16]\x80^B\xfa@B^^B\x05\xc0B^ \x03\x00$\x1e΄+0110+\x84\xce\x1e$\xfd\x00\r\x13\x13\x04(\x02\x12\t\x11\b\n\x05\x13\r\xa8t\x98\xa5\x051\x1a%\x12\x12%\x1a1\x05\xa5\x98+\x91`\xfb\xc0B^^B\x04@B^^\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x00\x00\x04\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x15\x14\a\x01\x03\x9a4\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\xe5\xfd\x91\x80\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\xdc\xdd\xe5\xfd\xa8\x00\x00\x01\x00\x00\xff\xad\x06\x80\x05\xe0\x00\"\x00\x00\x01\x14\a\x01\x13\x16\x15\x14\x06#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x06\x80\x1a\xfe\x95V\x01\x15\x14\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x03y\x16\x1a\xfe\x9e\xfe\f\a\r\x15\x1d\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x00\x00\x02\x00\x00\xff\xad\x06\x80\x05\xe0\x00\t\x00+\x00\x00\t\x01%\v\x01\x05\x01\x03%\x05\x01\x14\a\x01\x13\x16\x15\x14#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x04q\x012\xfeZ\xbd\xbd\xfeZ\x012I\x01z\x01y\x01\xc7\x1a\xfe\x95V\x01)\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x02\x14\x01)>\x01~\xfe\x82>\xfe\xd7\xfe[\xc7\xc7\x03\n\x16\x1a\xfe\x9e\xfe\f\a\r2\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x15\x00\x1d\x00\x00%\x14\x06#!\"&54>\x033\x16 72\x1e\x03\x00\x10\x06 &\x106 \x05\x00}X\xfc\xaaX}\x11.GuL\x83\x01l\x83LuG.\x11\xff\x00\xe1\xfe\xc2\xe1\xe1\x01>\x89m\x9c\x9cmU\x97\x99mE\x80\x80Em\x99\x97\x03\xc1\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\v\x00\x00\xff\x00\a\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x0554&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x01267\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\x00&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\xfc\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x05\x80&\x1a\x80\x1a&&\x1a\x80\x1a&\xfe\x80&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x80^B\xf9\xc0B^^B\x06@B^@\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xfd\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\x04\x9a\x80\x1a&&\x1a\x80\x1a&&\xfb\x9a\x80\x1a&&\x1a\x80\x1a&&\x03\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\xfe\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xba\xfa\xc0B^^B\x05@B^^\x00\x04\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x03\x00L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x03\x80L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x02\x00\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\xfc\xcc\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(8\xfb\x008(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(88(\xfc@(88(\x03\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x00\x01\x00y\x00\x0e\x06\x87\x04\xb2\x00\x16\x00\x00\x00\x14\a\x01\a\x06\"/\x01\x01&4?\x0162\x17\t\x0162\x1f\x01\x06\x87\x1c\xfd,\x88\x1cP\x1c\x88\xfe\x96\x1c\x1c\x88\x1cP\x1c\x01&\x02\x90\x1cP\x1c\x88\x03\xf2P\x1c\xfd,\x88\x1c\x1c\x88\x01j\x1cP\x1c\x88\x1c\x1c\xfe\xd9\x02\x91\x1c\x1c\x88\x00\x01\x00n\xff\xee\x05\x12\x04\x92\x00#\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\a\t\x01\x05\x12\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x1cP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\xfeP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\x1c\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00#\x00+\x00D\x00\x00\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01546;\x012\x16\x1d\x0132\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x0f\x00\x17\x000\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xfd\xc0\r\x13\x13\r\x02@\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\x13\r@\r\x13\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x06\x00\x00)\x005\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x1276\x16\x17\x16\x06\a\x0e\x01\x15\x14\x1e\x022>\x0254&'.\x017>\x01\x17\x16\x12\x01\x11\x14\x06\"&5\x11462\x16\x06\x00z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\xa1\x92+i\x1f \x0f*bkQ\x8a\xbdн\x8aQkb*\x0f \x1fj*\x92\xa1\xfd\x80LhLLhL\x02\x80\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\xb6\x01Bm \x0e+*i J\xd6yh\xbd\x8aQQ\x8a\xbdhy\xd6J i*+\x0e m\xfe\xbe\x02J\xfd\x804LL4\x02\x804LL\x00\x00\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x00\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12`\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12r\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\xf2\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x01r\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x12\x01\xf2\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00n\x00\x00\x004&\"\x06\x14\x162\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x04\x00\x96Ԗ\x96\xd4\x02\x96\x10\f\xb9\x13\x14#H\n\t\x1b\x90\x16\f\x0e\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8d\n\x0f\x0e\v~'\a\b\x0fH\x12\x1b\x0e\xb7\r\x10\x10\v\xba\x0e\x19(C\n\t\x1a\x91\x16\r\r\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8e\t\x0f\r\f\x81$\a\b\x0fH\x12\x1a\x0f\xb7\r\x10\x02\x16Ԗ\x96Ԗ\x01m\xde\f\x16\x02\x1c6%2X\f\x1a\n%\x8e\tl\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\vr6\n\r\f\v\x15[\x1921\x1b\x02\x15\r\xde\f\x16\x02\x1c..9Q\f\f\n\r$\x8f\nk\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\nw3\b\x0e\f\v\x15[\x1920\x1c\x02\x15\x00\x00\x06\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00;\x00C\x00g\x00\x00\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x13\x11!\x11\x14\x1e\x013!2>\x01\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\xfc\x80\x0e\x0f\x03\x03@\x03\x0f\x0e\xfd`\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\x03 \xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\xfd\x1e\x03\xb4\xfcL\x16%\x11\x11%\x04Ju\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x00\x00\x00\x02\x00\x1a\x00\x00\x06f\x05\x03\x00\x13\x005\x00\x00\x01\x11\x14\x06#!\x11!\x11!\"&5\x11465\t\x01\x167\a\x06\a#\"'\t\x01\x06'&/\x01&67\x0162\x1f\x01546;\x012\x16\x15\x11\x17\x1e\x01\x05\x80&\x1a\xfe\x80\xff\x00\xfe\x80\x1a&\x01\x02?\x02?\x01\xdf>\b\r\x03\r\b\xfdL\xfdL\f\f\r\b>\b\x02\n\x02\xcf X \xf4\x12\x0e\xc0\x0e\x12\xdb\n\x02\x02 \xfe \x1a&\x01\x80\xfe\x80&\x1a\x01\xe0\x01\x04\x01\x01\xda\xfe&\x02AJ\t\x02\a\x02A\xfd\xbf\b\x01\x02\tJ\n\x1b\b\x02W\x1a\x1a\xcc\xc3\x0e\x12\x12\x0e\xfeh\xb6\b\x1b\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\xe0\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\xfd\xfe\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x002\x00\x00\aN\x05\x00\x00\x11\x00C\x00\x00\x015\x03.\x01+\x01\"\x06\a\x03\x15\x06\x16;\x0126\x01\x14#!26'\x03.\x01#!\"\x06\a\x03\x06\x163!\"547\x01>\x013!\"\x06\x0f\x01\x06\x16;\x0126/\x01.\x01#!2\x16\x17\x01\x16\x04W\x18\x01\x14\r\xba\r\x14\x01\x18\x01\x12\f\xf4\f\x12\x02\xf6.\xfd@\r\x12\x01\x14\x01\x14\r\xfe\xf0\r\x14\x01\x14\x01\x12\r\xfd@.\x1a\x01\xa1\b$\x14\x01S\r\x14\x01\x0f\x01\x12\r\xa6\r\x12\x01\x0f\x01\x14\r\x01S\x14$\b\x01\xa1\x1a\x02\x1c\x04\x01@\r\x13\x13\r\xfe\xc0\x04\f\x10\x10\xfe9I\x13\r\x01\x00\r\x13\x13\r\xff\x00\r\x13I6>\x04\x14\x13\x1c\x13\r\xc0\x0e\x12\x12\x0e\xc0\r\x13\x1c\x13\xfb\xec>\x00\x04\x00\x00\x00\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00%\x00=\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x17\x162?\x01!2\x16\x01\x16\a\x01\x06\"'\x01&763!\x11463!2\x16\x15\x11!2\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01ч:\x9c:\x88\x01\xd0(8\xfe\xbb\x11\x1f\xfe@\x126\x12\xfe@\x1f\x11\x11*\x01\x00&\x1a\x01\x00\x1a&\x01\x00*\xa64&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(8\x8888\x888\x02\x11)\x1d\xfe@\x13\x13\x01\xc0\x1d)'\x01\xc0\x1a&&\x1a\xfe@\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x14\a\x01\x06\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04`\n\xfe\xc1\v\x18\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\xcc\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02`\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\x022\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x0162\x17\x01\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04^\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\n\x01?\v\x18\v\x01@\x0f\xd2\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x94\x14\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e\f\f\x01?\t\t\xfe\xc0\x10\x01\xf9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\r\x00#\x00\x00\x01!.\x01'\x03!\x03\x0e\x01\a!\x17!%\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x03\xff\x01<\x01\x03\x01\xd4\xfd<\xd4\x01\x03\x01\x01<_\x01@\x02`&\x1a\xfa\x80\x1a&\x19\xee\n5\x1a\x03@\x1a5\n\xee\x19\x02@\x03\v\x02\x01\xf0\xfe\x10\x03\v\x02\xc0\xa2\xfe\x1e\x1a&&\x1a\x01\xe2>=\x02(\x19\"\"\x19\xfd\xd8=\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00'\x00\x00\x00\x14\a\x01\x06#\"'&5\x11476\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xa0 \xfd\xe0\x0f\x11\x10\x10 !\x1f\x02 \xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xa5J\x12\xfe\xc0\t\b\x13%\x02\x80%\x13\x12\x13\xfe\xc0\xcb\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x003\x00\x00\x01\x11\x14\x06#!\"'&?\x01&#\"\x0e\x02\x14\x1e\x023267672\x1f\x01\x1e\x01\a\x06\x04#\"$&\x02\x10\x126$32\x04\x1776\x17\x16\x06\x00&\x1a\xfe@*\x11\x11\x1f\x8a\x94\xc9h\xbd\x8aQQ\x8a\xbdhw\xd4I\a\x10\x0f\n\x89\t\x01\bm\xfeʬ\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x93\x01\x13k\x82\x1d)'\x05\x00\xfe@\x1a&('\x1e\x8a\x89Q\x8a\xbdн\x8aQh_\n\x02\t\x8a\b\x19\n\x84\x91z\xce\x01\x1c\x018\x01\x1c\xcezoe\x81\x1f\x11\x11\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00G\x00\x00\x01\x14\a\x02\x00!\"$'\a\x06\"&5\x11463!2\x16\x14\x0f\x01\x1e\x013267676;\x012\x16\x13\x11\x14\x06#!\"&4?\x01&#\"\x06\a\x06\a\x06+\x01\"&=\x01\x12\x00!2\x04\x17762\x16\x05\xe7\x01@\xfeh\xfe\xee\x92\xfe\xefk\x81\x134&&\x1a\x01\xc0\x1a&\x13\x89G\xb4a\x86\xe8F\v*\b\x16\xc0\r\x13\x19&\x1a\xfe@\x1a&\x13\x8a\x94Ɇ\xe8F\v*\b\x16\xc7\r\x13A\x01\x9a\x01\x13\x92\x01\x14k\x82\x134&\x01\xe0\x05\x02\xfe\xf4\xfe\xb3nf\x81\x13&\x1a\x01\xc0\x1a&&4\x13\x89BH\x82r\x11d\x17\x13\x03\x13\xfe@\x1a&&4\x13\x8a\x89\x82r\x11d\x17\x13\r\a\x01\f\x01Moe\x81\x13&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x04\x80\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x80\x13\r\xfa@\r\x13\x13\r\x05\xc0\r\x13\x80^B\xfa@B^^B\x05\xc0B^\x01`@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd3\x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x00\x02\x00\x00\x00\x00\x04\x80\x05\x80\x00\a\x00\x1f\x00\x00\x01!54&\"\x06\x15\x01\x11\x14\x06#!\"&5\x1146;\x0154\x00 \x00\x1d\x0132\x16\x01@\x02\x00\x96Ԗ\x03@8(\xfc@(88( \x01\b\x01p\x01\b (8\x03\x00\xc0j\x96\x96j\xfe\xe0\xfd\xc0(88(\x02@(8\xc0\xb8\x01\b\xfe\xf8\xb8\xc08\x00\x00\x02\x00@\xff\x80\a\x00\x05\x80\x00\x11\x007\x00\x00\x01\x14\a\x11\x14\x06+\x01\"&5\x11&5462\x16\x05\x11\x14\x06\a\x06#\".\x02#\"\x05\x06#\"&5\x114767632\x16\x17\x1632>\x0232\x16\x01@@\x13\r@\r\x13@KjK\x05\xc0\x19\x1bך=}\\\x8bI\xc0\xfe\xf0\x11\x10\x1a&\x1f\x15:\xec\xb9k\xba~&26\u007f]S\r\x1a&\x05\x00H&\xfb\x0e\r\x13\x13\r\x04\xf2&H5KKu\xfd\x05\x19\x1b\x0et,4,\x92\t&\x1a\x02\xe6 \x17\x0e\x1dx:;\x13*4*&\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00K\x00\x00\x01\x14\x0f\x02\x0e\x01#\x15\x14\x06+\x01\"&5\x1146;\x012\x16\x1d\x012\x16\x177654\x02$ \x04\x02\x15\x14\x1f\x01>\x013546;\x012\x16\x15\x11\x14\x06+\x01\"&=\x01\"&/\x02&54\x126$ \x04\x16\x12\x06\x80<\x14\xb9\x16\x89X\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12Gv\"D\x1d\xb0\xfe\xd7\xfe\xb2\xfeװ\x1dD\"vG\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12X\x89\x16\xb9\x14<\x86\xe0\x014\x01L\x014\xe0\x86\x02\x8a\xa6\x941!Sk \x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e G<\f_b\x94\x01\x06\x9c\x9c\xfe\xfa\x94b_\f\x034.\x0354632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b\x00\x00\x00\x00\x04\x00\x00\xff\xb9\x06\x80\x05G\x00\x13\x00-\x00I\x00k\x00\x00\x01\x11\x14\x06\"'\x01!\"&5\x11463!\x0162\x16\x00\x14\x06\a\x06#\"&54>\x034.\x0354632\x17\x16\x04\x10\x02\a\x06#\"&54767>\x014&'&'&54632\x17\x16\x04\x10\x02\a\x06#\"&547>\x017676\x12\x10\x02'&'.\x01'&54632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x01U\xaa\x8c\r\f\x1b&'8\x14JSSJ\x148'&\x1a\r\r\x8c\x01\xaa\xfe\xd3\r\r\x1a&'\a\x1f\a.${\x8a\x8a{$.\a\x1f\a'&\x1a\r\r\xd3\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b7\xfe\xce\xfe\xfd;\x05&\x1a'\x14\x1d\x0f6\xa3\xb8\xa36\x0f\x1d\x14'\x1a&\x05;\xb6\xfe4\xfe\u007f[\x05&\x1a$\x17\x04\r\x04\x19\x1a[\x01\x10\x012\x01\x10[\x1a\x19\x04\r\x04\x17$\x1a&\x05[\x00\f\x00\x00\x00\x00\x05\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00/\x003\x007\x00\x00\x01\x15#5\x13\x15#5!\x15#5\x01!\x11!\x11!\x11!\x01!\x11!\x01\x11!\x11\x01\x15#5!\x15#5\x13\x11!5#\x11#\x11!\x1535\x01\x11!\x11!\x11!\x11\x01\x80\x80\x80\x80\x03\x80\x80\xfc\x80\x01\x80\xfe\x80\x01\x80\xfe\x80\x03\x00\x01\x80\xfe\x80\xff\x00\xfd\x80\x04\x80\x80\x01\x80\x80\x80\xfe\x80\x80\x80\x01\x80\x80\xfd\x80\xfd\x80\x05\x80\xfd\x80\x01\x80\x80\x80\x03\x00\x80\x80\x80\x80\xfc\x01\x01\u007f\x01\x80\x01\x80\xfe\x80\x01\x80\xfd\x80\xfd\x80\x02\x80\xfe\x00\x80\x80\x80\x80\x02\x00\xfe\x80\x80\xfe\x80\x02\x80\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x80\x02\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00;\x00?\x00\x003#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113???? ^\x1f\x1f\x9d\x1f\x1f\x9d>>~\x1f\x1f?\x1f\x1f?\x1f\x1f\x9d??\x9d??~??~??^??\xbd^^? ^??\x05\x80\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x80\x05\x80\x00\x00\x00\x02\x00\x00\xff\x95\x05\xeb\x05\x80\x00\a\x00\x1d\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'\x00\x00\x00\x00\x03\x00\x00\xff\x95\ak\x05\x80\x00\a\x00\x1d\x005\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x05\x14\a\x01\x06#\"&'\x01654'\x01.\x01#32\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x01\x80%\xfe\x15'4$.\x1e\x01\xd6%%\xfd5&\x805\xe05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'45%\xfe\x14%\x1c\x1f\x01\xd6%54'\x02\xca&55&\xfd6'\x00\x03\x00\n\xff\x80\x06y\x05\x80\x00T\x00d\x00t\x00\x00\x01\x16\a\x01\x0e\x01#!\"&'&74676&7>\x027>\x0176&7>\x017>\x0176&7>\x017>\x0176&7>\x027>\x06\x17\a63!2\x16\a\x01\x0e\x01#!\"\a\x06\x17\x163!267\x016'\x16\x05\x06\x163!26?\x016&#!\"\x06\a\x03\x06\x163!26?\x016&#!\"\x06\a\x06g(\x16\xfe\xed\x13sA\xfceM\x8f\x1c\x18\x16\x06\x01\x01\b\x01\x02\f\x15\x06\x17,\b\x03\x05\x02\x03\x1c\x03\x15*\x04\x01\a\x04\x04$\x04\x13/\x04\x01\b\x02\x02\x0e\x16\x06\b\x11\r\x13\x14!'\x1c\x01&\r\x02\xf9JP\x16\xfe\xee$G]\xfc\x9b\x1b\v\v\n\x18x\x03\x9b\x1d6\b\x01,\a\x02&\xfb\xed\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04h\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04\x04\"9H\xfcv@WkNC<\x04.\x0e\b\x1b\x06\v\x14\x1b\n&k&\n(\b\v\"\x06$p\"\t.\x05\r#\x05\x1au&\b#\t\b\x14\x1a\b\f%!'\x19\x16\x01\x06\x03\tpJ\xfcvwE\x0f\x10\x1bF\x1f\x1a\x03\xdb\x16#\x0f\x1e\r\x13\x13\r@\r\x13\x13\r\xfe\xc0\r\x13\x13\r@\r\x13\x13\r\x00\x00\x01\x00\x00\xff\x97\x05\x00\x05\x80\x00\x1c\x00\x00\x012\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x8c\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x80\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x80\x00\x03\x00\f\x00\x14\x00<\x00\x00)\x01\x11!\x11!\x11#\"&=\x01!\x004&\"\x06\x14\x1627\x11\x14\x06+\x01\x15\x14\x06#!\"&=\x01#\"&5\x1146;\x01\x11463!2\x16\x1f\x01\x1e\x01\x15\x1132\x16\x01\x80\x03\x80\xfc\x80\x03\x80\xa0(8\xfd\x80\x04\x80&4&&4\xa6\x13\r\xe08(\xfc@(8\xe0\r\x13qO@8(\x02\xa0(`\x1c\x98\x1c(@Oq\x01\x00\x01\x80\x01\x808(\xa0\xfd&4&&4&@\xfe`\r\x13\xa0(88(\xa0\x13\r\x01\xa0Oq\x02 (8(\x1c\x98\x1c`(\xff\x00q\x00\x03\x00\x00\xff\x80\a\x80\x06\x00\x00\a\x00!\x00)\x00\x00\x002\x16\x14\x06\"&4\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x017>\x013!2\x16\x1f\x01\x00 \x00\x10\x00 \x00\x10\x03I\uea69\xee\xa9\x03\xe0j\x96\x96j\xfa\x80j\x96\x96j\xe03\x13e5\x02\x005e\x133\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03`\xa9\uea69\xee\x02I\x96j\xfc\x80j\x96\x96j\x03\x80j\x96\x881GG1\x88\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x80\x05\x80\x00\a\x00P\x00\x00\x01\x032\x16327&\x017>\x047\x13\x01;\x01\x16\x17\x13\x16\x12\x17\x1e\x01\x17\x16\x17\x1e\x01\x17\x16\x15\x14\x06\x15\"&#\"\x04\a4?\x012>\x0554.\x01'%\x06\x02\x15\x14\x1e\x033\x16\x15\x14\a\"&#\"\x06#\x06\x02ժ!\xcf9\x13&W\xfc\xca\x02\x17B03&\f\xed\x01\x18K5\b\x03\xcd!\x92)\x0fV\x1d\x14\x0f\x13\x8a\x0f\x06\x01?\xfe@L\xfe\xea'\x04\x83\x01\x17\b\x15\t\r\x05>R\x01\xfe>\x1ae\x1c;&L\x03\x01\x02:\xe9:\b%\x03P\x03\xd1\xfe>\x04\x02\xfd\xfcvO\a\v\n\x13'\x1f\x02h\x02\xd4\x0e\a\xfe N\xfe\x99_\"\xdd:-\f\x0f\x1d\x06&\x13\x05\x11\x04\x10\x0e\x01+#\x1c\x05\x02\a\x06\n\f\b\x10\xa1\xc2\x03\x02:\xfe\xed\x19\x16\x1f\x12\t\b\x13'\t\x12\x14\b\x0e\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\x15\x00+\x00a\x00\x00%\x163 \x114'.\x04#\"\a\x14\x06\x15\x14\x06\x1e\x01\x03\x1632>\x0254.\x02#\"\a\x14\x16\x15\x14\x06\x15\x14\x017>\x017>\x04<\x015\x10'.\x04/\x016$32\x1632\x1e\x03\x15\x14\x0e\x03\a\x1e\x01\x15\x14\x0e\x03#\"&#\"\x04\x02+JB\x01x)\x1bEB_I:I\x1c\x01\x02\x01\b\x06*CRzb3:dtB2P\b\x01\xfd\xe4\x02\x0f\x8c$\a\v\x06\x05\x01\x16\x04$5.3\x05\x04b\x01\xe4\x83\x17Z\x17F\x85|\\8!-T>5\x9a\xcdFu\x9f\xa8\\,\xb0,j\xfen\x0f \x01OrB,\x027676\x1a\x01'5.\x02'7\x1e\x0232>\x017\x06\a\x0e\x01\a\x0e\x03\a\x06\x02\a\x0e\x03\x1f\x01\x16\x17\x06\a\"\x06#\"&#&#\"\x06\x11\x16OA\x1b\x1c\r\x01zj\x01\x18=N\x13\x13!\xae}:0e\x8d\x1c\x05\x0e\x1e\x8f%\b\f\x06\t\x02\x1by\x11\x02\x16\x12\x0e\x01\x01\x11\xa8\x03\r\v+\v\x1dt\x1c\x8aD3\xb8~U\a\x13\x13\x0e#B\a\x024\x02\v#\x19\r\v\x05\x03g\x02\t\x05\x05\t\x02'2\n%\x0f\x13/!:\r\x94\xfd\xe1T\tbRU\x0f\x12\x04\x1b,7\x03\x14\x02\x12\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\xfa\x05\x80\x00\x1b\x00}\x00\x00%2\x16\x0f\x01\x06\"/\x01&6;\x01\x11#\"&?\x0162\x1f\x01\x16\x06+\x01\x11\x01\x17\x1632632\x163!2\x16>\x02?\x012\x163\x16\x15\x14\a\x06\a&'.\x02'.\x03\x06#\"&\"\x06\a\x06\x17\x14\x12\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x0276\x114\x02=\x01464.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x06\xd0!\x12\x14~\x14:\x14~\x14\x12!PP!\x12\x14~\x14:\x14~\x14\x12!P\xf9\xd16\f\xc7,\xb0,$\x8f$\x01%\x06\x1e\v\x15\x0e\b*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\r\x01\x06\f\x13\a\x1d\x02\x11c2N \t\x01\x04\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\x13\x06\x01\x02\x04\x03\v\x97!x\x14\x13\x1e!\x1a*\x0e\x80%\x1a\xa2\x1a\x1a\xa2\x1a%\x04\x00%\x1a\xa2\x1a\x1a\xa2\x1a%\xfc\x00\x04\xff\x1b\x05\x04\x01\x01\x01\x05\r\v\x01\x01p\xe0P\x1d\x0e\x04,T\tNE\x01\b\t\x03\x02\x01\x01\x04\x04Q7^\xfd\xb4\xa1\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e*\x01Ue\x01\x94eu\x02\x1b\x17\x1c\x14\x04\f\x18\x0e\rwg\x02\x1a\x12\x01\u007f\x00\x00\x02\x00\x00\xff\x03\x06\x00\x05\x80\x00a\x00\x95\x00\x00\x13\x17\x1632632$\x04\x17\x16?\x012\x163\x16\x15\x14\a\x06\a&'.\x025&'&#\"&\"\x06\a\x06\x1f\x015\x14\x1e\x01\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x027>\x024&54&54>\x01.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x012\x1e\x02\x17\x16\x14\a\x0e\x03#\".\x01465!\x14\x16\x14\x0e\x01#\".\x02'&47>\x0332\x1e\x01\x14\x06\x15!4&4>\x01Q6\f\xc7,\xb0,F\x01a\x01\x00w!\x17*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\x0e\n\x11\x05=\x1e~Pl*\t\x01\x01\x02\x01\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\a\t\x03\x01\x05\x01\x01\x01\x05\x04\v\x97)\xf4\x10\x13\x1e!\x1a*\x0e\x05\x1e\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\xfc\x00\x03\x05\x0f\r\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\x04\x00\x03\x05\x0f\x05\u007f\x1b\x05\x04\x02\x01\x04\x01 \x01\x01p\xe0P\x1d\x0e\x04,T\tMF\x01\r\x06\x02\x02\x04\x05Q7\x9847ƢH\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e\x10t\xaf\x87\xac\x03\a\x1d\b\aJHQ6\x05\f\x1b\v\fwh\x02\x1a\x12\x01\u007f\xfa\xff',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01\x00&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\xfe\x80&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xfe\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xfa\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xe0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x04s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80\x13\r\x0e\t\xfe\xe0\t\t\x01 \t\x0e\r\x13\x05\x80\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x03\xe0\xfd\xc0\r\x13\t\x01 \t\x1c\t\x01 \t\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x00\x14\a\x01\x06#\"&5\x114632\x17\t\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01`\t\xfe\xe0\t\x0e\r\x13\x13\r\x0e\t\x01 \x05\xa9\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x02\xce\x1c\t\xfe\xe0\t\x13\r\x02@\r\x13\t\xfe\xe0\xfe\t\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x01\x00\x00\x00\x00\a\x00\x05\x00\x00\x1f\x00\x00\x01\x11\x14\a\x06#\"'\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x01632\x17\x16\a\x00'\r\f\x1b\x12\xfem\xa9w\xfd@w\xa9\xa9w\x02\xc0w\xa9\x01\x93\x12\x1b\f\r'\x04\xa0\xfb\xc0*\x11\x05\x13\x01\x93\xa6w\xa9\xa9w\x02\xc0w\xa9\xa9w\xa5\x01\x92\x13\x05\x11\x00\x00\x00\x00\x04\x00\x00\xff\x80\a\x80\x05\x80\x00\a\x00\x0e\x00\x1e\x00.\x00\x00\x00\x14\x06\"&462\x01\x11!5\x01\x17\t\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\x80p\xa0pp\xa0\x04p\xfa\x80\x01@\xa0\x02\x00\x02\x00\xf9\xc0\r\x13\x13\r\x06@\r\x13\x13\x93^B\xf9\xc0B^^B\x06@B^\x04\x10\xa0pp\xa0p\xfd\xc0\xfe@\xc0\x01@\xa0\x02\x00\x01 \x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13 \xfb@B^^B\x04\xc0B^^\x00\x04\x00\x00\xff\x80\x05\xeb\x05k\x00\x06\x00\x14\x00\x19\x00%\x00\x00!7'\a\x153\x15\x014#\"\a\x01\x06\x15\x14327\x016'\t\x01!\x11\x01\x14\x0f\x01\x017632\x1f\x01\x16\x01k[\xeb[\x80\x02v\x16\n\a\xfd\xe2\a\x16\n\a\x02\x1e\a6\x01\xa0\xfc\xc0\xfe`\x05\xeb%\xa6\xfe`\xa6$65&\xeb%[\xeb[k\x80\x03\xa0\x16\a\xfd\xe2\a\n\x16\a\x02\x1e\a\xca\xfe`\xfc\xc0\x01\xa0\x02\xe05%\xa6\x01\xa0\xa5&&\xea'\x00\x00\x02\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x17\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x0e\x01\"&'\x01&54\x00 \x00\x03\x00\x96Ԗ\x96\xd4\x01\x96!\xfe\x94\x10?H?\x0f\xfe\x93!\x01,\x01\xa8\x01,\x03\x16Ԗ\x96Ԗ\x01\x00mF\xfc\xfa!&&!\x03\x06Fm\xd4\x01,\xfe\xd4\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x00%\x11\"\x0e\x01\x10\x1e\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\x94\xfa\x92\x92\xfa\x03\x94\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a`\x04@\x92\xfa\xfe\xd8\xfa\x92\x02\xf1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x05\xc0\x00\x15\x00-\x00\x00\x014'.\x03'&\"\a\x0e\x03\a\x06\x15\x14\x1626%\x14\x00 \x00547>\x037>\x012\x16\x17\x1e\x03\x17\x16\x02\x00\x14\x01\x1d\x16\x1c\a\x04\"\x04\a\x1c\x16\x1d\x01\x14KjK\x02\x00\xfe\xd4\xfeX\xfe\xd4Q\x06qYn\x1c\t243\b\x1cnYq\x06Q\x01\x80$!\x01+!7\x17\x10\x10\x177!+\x01!$5KK\xb5\xd4\xfe\xd4\x01,ԑ\x82\t\xa3\x8b\xd9]\x1e\"\"\x1e]ً\xa3\t\u007f\x00\x05\x00\x00\x00\x00\x06\xf8\x05\x80\x00\x06\x00\x0e\x009\x00>\x00H\x00\x00\x017'\a\x153\x15\x00&\a\x01\x06\x167\x01\x13\x15\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x016\x16\x03\t\x01!\x11\x01\a\x01762\x1f\x01\x16\x14\x03xt\x98t`\x02\x00 \x11\xfe\xa2\x11 \x11\x01^Q\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\x0e\x12\x17\x16\xfc\xc0B^^B\x03@B^\t@\x0f(`\x01 \xfd`\xfe\xe0\x04\\\\\xfe\xe0\\\x1cP\x1c\x98\x1c\x01`t\x98t8`\x02\xc0 \x11\xfe\xa2\x11 \x11\x01^\xfdϾw\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\x0e\x06\x06^B\xfc\xc0B^^B~\r\t@\x0f\x10\x02\xcd\xfe\xe0\xfd`\x01 \x02\x1c\\\x01 \\\x1c\x1c\x98\x1cP\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x06\x00\x00+\x00Z\x00\x00\x01\x11\x14\x06#!\"&5\x11463!12\x16\x15\x14\a\x06\a\x06+\x01\"\x06\x15\x11\x14\x163!26=\x0147676\x17\x16\x13\x01\x06#\"'&=\x01# \a\x06\x13\x16\a\x06#\"'.\x0454>\a;\x01547632\x17\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x00\xff\r\x13\x1aM8\n\x06pB^^B\x03@B^\x12\x1c\x1a\x10\x13\x15\xed\xfe\x80\x12\x1b\f\r'\xa0\xfe\xbdsw-\x03\x17\b\x04\x10\n\n\x169*#\a\x15#;No\x8a\xb5j\xa0'\r\f\x1a\x13\x01\x80\x13\x02#\xfe\xfdw\xa9\xa9w\x03@w\xa9\x13\r\x1b\x05\x1a\"\x04^B\xfc\xc0B^^B\xd6\x13\n\r\x18\x10\b\t\x01\xdc\xfe\x80\x13\x05\x11*\xc0\x83\x89\xfe\xb0\x17\v\x02\r\x0e\"g`\x8481T`PSA:'\x16\xc0*\x11\x05\x13\xfe\x80\x134\x00\x00\x02\x00\x00\x00\x00\x06\u007f\x05\x80\x00/\x00D\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06#\"'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x01632\x17\x16\x13\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\n\r\x03\x06\x17\x16\xfc\xc0B^^B\x03@B^\t@\n\r\x06\x06\x14\xe7\xfc\xd2\x18B\x18\xfeR\x18\x18n\x18B\x18\x01\a\x02\x87\x18B\x18n\x18\x02^\xfe\xc2w\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\n\x02\x06^B\xfc\xc0B^^B\xfe\r\t@\n\x03\b\x01\xd4\xfc\xd2\x18\x18\x01\xae\x18B\x18n\x18\x18\xfe\xf9\x02\x87\x18\x18n\x18B\x00\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00C\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!\x11#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x11!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x13\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x03\xd3\x13\x1a\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x016\x16\x15\x1167\x06\xd3\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x01\x00z\xff\x80\x06\x80\x05\x80\x00\x19\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&47\x016\x16\x15\x1167\x06S\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\x13\x13\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x00\x01\x00\x00\xff|\x05\u007f\x05\x84\x00\v\x00\x00\t\x01\x06&5\x1146\x17\x01\x16\x14\x05h\xfa\xd0\x17!!\x17\x050\x17\x02a\xfd\x1e\r\x14\x1a\x05\xc0\x1a\x14\r\xfd\x1e\r$\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\xfc\x80&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x06\x05\x80\x00\x19\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x14\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\x13\x13\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\x134\x13\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\x00\x00\x00\x02\x00\x01\x00\x00\x06\x01\x05\x06\x00\v\x00\x1b\x00\x00\x13\x0162\x17\x01\x16\x06#!\"&\x01!\"&5\x11463!2\x16\x15\x11\x14\x06\x0e\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfa@\x1a\f\x05\xc6\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x02-\x02\xc6\x13\x13\xfd:\x13\x1a\x1a\xfd\xe6&\x1a\x01\x00\x1a&&\x1a\xff\x00\x1a&\x00\x00\x00\x00\x01\x00\x9a\xff\x9a\x04\xa6\x05\xe6\x00\x14\x00\x00\t\x02\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\x04\x93\xfd\xed\x02\x13\x13\x13\xa6\x134\x13\xfd\x1a\x13\x13\x02\xe6\x134\x13\xa6\x13\x04\xd3\xfd\xed\xfd\xed\x134\x13\xa6\x13\x13\x02\xe6\x134\x13\x02\xe6\x13\x13\xa6\x134\x00\x00\x00\x00\x01\x00Z\xff\x9a\x04f\x05\xe6\x00\x14\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x04S\xfd\x1a\x134\x13\xa6\x13\x13\x02\x13\xfd\xed\x13\x13\xa6\x134\x13\x02\xe6\x13\x02\x93\xfd\x1a\x13\x13\xa6\x134\x13\x02\x13\x02\x13\x134\x13\xa6\x13\x13\xfd\x1a\x134\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x1a\x80\x1a&\x01\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\x01\x00\x1a&&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&&\x1a\x80\x1a&&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00+\x007\x00\x00\x014/\x017654/\x01&#\"\x0f\x01'&#\"\x0f\x01\x06\x15\x14\x1f\x01\a\x06\x15\x14\x1f\x01\x1632?\x01\x17\x1632?\x016\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04}\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x01\x83\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x9e\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x01\xce\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00#\x00\x00\x014/\x01&\"\a\x01'&\"\x0f\x01\x06\x15\x14\x17\x01\x16327\x01>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x134\x13\xfeh\xe2\x134\x13[\x12\x12\x01j\x13\x1a\x1b\x13\x02\x1f\x12\xfc\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\"\x1c\x12Z\x13\x13\xfei\xe2\x13\x13Z\x12\x1c\x1b\x12\xfe\x96\x13\x13\x02\x1f\x12J\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00:\x00F\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x014.\x01#\"\a\x06\x1f\x01\x1632767632\x16\x15\x14\x06\a\x0e\x01\x1d\x01\x14\x16;\x01265467>\x04$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x00o\xa6W\xf3\x80\x0f\x17\x84\a\f\x10\t5!\"40K(0?i\x12\x0e\xc0\x0e\x12+! \":\x1f\x19\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\xaeX\x96R\xd5\x18\x12d\x06\fD\x18\x184!&.\x16\x1cuC$\x0e\x12\x12\x0e\x13=\x13\x12\x151/J=\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00.\x00:\x00\x00%54&+\x01\x114&#!\"\x06\x1d\x01\x14\x16;\x01\x11#\"\x06\x1d\x01\x14\x163!26\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x12\x0e`\x12\x0e\xfe\xc0\x0e\x12\x12\x0e``\x0e\x12\x12\x0e\x01\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xa0\x0e\x12\x02\x00\x0e\x12\x12\x0e\xa0\x0e\x12\xfe\xc0\x12\x0e\xa0\x0e\x12\x12\x03\x8e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\xc1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00/\x00_\x00\x00\x01#\"&=\x0146;\x01.\x01'\x15\x14\x06+\x01\"&=\x01\x0e\x01\a32\x16\x1d\x01\x14\x06+\x01\x1e\x01\x17546;\x012\x16\x1d\x01>\x01\x01\x15\x14\x06+\x01\x0e\x01\a\x15\x14\x06+\x01\"&=\x01.\x01'#\"&=\x0146;\x01>\x017546;\x012\x16\x1d\x01\x1e\x01\x1732\x16\x04\xadm\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1\x01s&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&\x02\x00&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1\x01,\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00;\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x146\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04I\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n͒\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01ɒ\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\x19\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\t\x01\x06\"'\x01&4?\x0162\x1f\x01\x0162\x1f\x01\x16\x14\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x93\xfeZ\x134\x13\xfe\xda\x13\x13f\x134\x13\x93\x01\x13\x134\x13f\x13z\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xd3\xfeZ\x13\x13\x01&\x134\x13f\x13\x13\x93\x01\x13\x13\x13f\x134\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x85\x00\t\x00\x12\x00\"\x00\x00\x014'\x01\x1632>\x02\x05\x01&#\"\x0e\x01\x15\x14\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05 W\xfd\x0e\x89\xa0oɒV\xfc\x19\x02\U000c7954\xfa\x92\x05 z\xcd\xfe\xe3\xfe\xc8\xfe\xe3\xcdzz\xcd\x01\x1d\x018\x01\x1d\xcd\x02\x83\xa1\x86\xfd\x0fYW\x92˼\x02\xf2[\x92\xfc\x94\xa2\x01?\xfe\xc6\xfe\xe2\xcezz\xce\x01\x1e\x01:\x01\x1d\xcezz\xce\x00\x00\x01\x00@\xff5\x06\x00\x05K\x00 \x00\x00\x01\x15\x14\x06#!\x01\x16\x14\x0f\x01\x06#\"'\x01&547\x01632\x1f\x01\x16\x14\a\x01!2\x16\x06\x00A4\xfd@\x01%&&K%54'\xfdu%%\x02\x8b&54&K&&\xfe\xdb\x02\xc04A\x02\x80\x805K\xfe\xda$l$L%%\x02\x8c%54'\x02\x8a&&J&j&\xfe\xdbK\x00\x00\x01\x00\x00\xff5\x05\xc0\x05K\x00 \x00\x00\x01\x14\a\x01\x06#\"/\x01&47\x01!\"&=\x01463!\x01&4?\x01632\x17\x01\x16\x05\xc0%\xfdu'43'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%\x02@6%\xfdu%%K&j&\x01%K5\x805K\x01&$l$K&&\xfdu#\x00\x00\x01\x005\xff\x80\x06K\x05@\x00!\x00\x00\x01\x14\x0f\x01\x06#\"'\x01\x11\x14\x06+\x01\"&5\x11\x01\x06\"/\x01&547\x01632\x17\x01\x16\x06K%K&56$\xfe\xdaK5\x805K\xfe\xda$l$K&&\x02\x8b#76%\x02\x8b%\x0253'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%%\xfdu'\x00\x00\x00\x00\x01\x005\xff\xb5\x06K\x05\x80\x00\"\x00\x00\x01\x14\a\x01\x06#\"'\x01&54?\x01632\x17\x01\x1146;\x012\x16\x15\x11\x01632\x1f\x01\x16\x06K%\xfdu'45%\xfdu&&J'45%\x01&L4\x804L\x01&%54'K%\x02\xc05%\xfdt%%\x02\x8c$65&K%%\xfe\xda\x02\xc04LL4\xfd@\x01&%%K'\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x00\x14\a\x01\x06\"&5\x11#\"\x0e\x05\x15\x14\x17\x14\x16\x15\x14\x06#\"'.\x02'\x02547\x12!3\x11462\x17\x01\a\x00\x13\xfe\x00\x134&\xe0b\x9b\x99qb>#\x05\x05\x11\x0f\x10\f\a\f\x0f\x03\u007f5\xa2\x02\xc9\xe0&4\x13\x02\x00\x03\x9a4\x13\xfe\x00\x13&\x1a\x01\x00\f\x1f6Uu\xa0e7D\x06#\t\x0f\x14\x11\t\x1a\"\a\x01\x1d\xa6dž\x01\x93\x01\x00\x1a&\x13\xfe\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00/\x00\x00\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x03\x17&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x01\xed\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x03I\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x00\x00\x00\x00\x02\x00\r\xff\x8d\x05\xf3\x05s\x00\x17\x00/\x00\x00\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x03\x00&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x02@\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x02\x93\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x00\x00\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x05\x808(\xfe`8(\xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(8\x03 \xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(88(\xfe`8\x00\x00\x00\x00\x01\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x05\x808(\xfb@(88(\x04\xc0(8\x03 \xc0(88(\xc0(88\x00\x00\x01\x00z\xff\x80\x06\x06\x05\x80\x005\x00\x00\x01\x1e\x01\x0f\x01\x0e\x01'%\x11\x14\x06+\x01\"&5\x11\x05\x06&/\x01&67-\x01.\x01?\x01>\x01\x17\x05\x1146;\x012\x16\x15\x11%6\x16\x1f\x01\x16\x06\a\x05\x05\xca.\x1b\x1a@\x1ag.\xfe\xf6L4\x804L\xfe\xf6.g\x1a@\x1a\x1b.\x01\n\xfe\xf6.\x1b\x1a@\x1ag.\x01\nL4\x804L\x01\n.g\x1a@\x1a\x1b.\xfe\xf6\x01\xe6\x1ag.n.\x1b\x1a\x99\xfe\xcd4LL4\x013\x99\x1a\x1b.n.g\x1a\x9a\x9a\x1ag.n.\x1b\x1a\x99\x0134LL4\xfe͙\x1a\x1b.n.g\x1a\x9a\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00-\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x02\xb2\x12\r\xc0\r\x14\x14\r\xc0\r\x12\x02\x12\n\n\x0e\xdc\x0e\n\n\x11\x14\x0e\xb9\x0e\x13\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xef\xbe\x0e\x13\x14\r\xbe\r\x14\x13\x01f\x02m\f\x06\b\b\x06\f\xfd\x93\n\x0f\x0f\x00\x00\x00\x04\x00\x00\x00\x00\x06\x00\x05@\x00\r\x00\x16\x00\x1f\x00J\x00\x00%5\x115!\x15\x11\x15\x14\x16;\x0126\x013'&#\"\x06\x14\x16$4&#\"\x0f\x0132\x05\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!\"&4632\x1f\x017632\x16\x14\x06#!2\x16\x03\xa0\xfe\xc0$\x1c\xc0\x1c$\xfe8\xc3~\x1a+(88\x02\xd88(+\x1a}\xc2(\x01\xb0\x12\x0e`8(\xfb\xc0(8`\x0e\x12\x12\x0e\x01\xb8]\x83\x83]k=\x80\x80=k]\x83\x83]\x01\xb8\x0e\x12\xb48\x01\xd4\xc0\xc0\xfe,8\x19\x1b\x1b\x03e\xa1\x1f8P88P8\x1f\xa1\xa0\xfe\xc0\x0e\x12\xfe`(88(\x01\xa0\x12\x0e\x01@\x0e\x12\x83\xba\x83M\xa5\xa5M\x83\xba\x83\x12\x00\x02\x00\x00\x00\x00\a\x00\x05\x80\x00\x15\x00N\x00\x00\x004&#\"\x04\x06\a\x06\x15\x14\x16327>\x0176$32\x01\x14\a\x06\x00\a\x06#\"'.\x01#\"\x0e\x02#\"&'.\x0354>\x0254&'&54>\x027>\x047>\x0432\x1e\x02\x05\x00&\x1a\xac\xfe\xdc\xe3z\x13&\x1a\x18\x15\x1b^\x14\x89\x01\a\xb6\x1a\x02&\x14.\xfe\xeb\xdb\xd6\xe0\x94\x8a\x0f\x92\x17\x10/+>\x1d+)\x19\x02\b\x03\x03>J>\x1c\x02\tW\x97\xbem7\xb4\xb3\xb2\x95'\n'\x14\"'\x18'? \x10\x03&4&c\xa9\x87\x15\x18\x1a&\x13\x18^\x13|h\x01\x06_b\xe0\xfe\xc2ml/\x05J@L@#*\x04\x0e\x06\r\a#M6:\x13\x04D\n35sҟw$\x12\x0f\x03\t'%\n'\x11\x17\t\\\x84t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x003\x00\x00\x05\x15\x14\x06#!\"&=\x01463!2\x16\x01\x14\x0e\x05\x15\x14\x17'\x17.\x0454>\x0554'\x17'\x1e\x04\x05\x80\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xff\x001O``O1C\x04\x01Z\x8c\x89Z71O``O1B\x03\x01Z\x8c\x89Z7\xa0@\r\x13\x13\r@\r\x13\x13\x04\x13N\x84]SHH[3`\x80\x01\x01)Tt\x81\xacbN\x84]SHH[3^\x82\x01\x01)Tt\x81\xac\x00\x00\x00\x00\x03\x00\x00\x00\x00\a\x00\x04\x80\x00\x11\x00!\x001\x00\x00\x01&'\x16\x15\x14\x00 \x00547\x06\a\x16\x04 $\x004&#\"\x06\x15\x14\x162654632\x00\x14\a\x06\x00 \x00'&476\x00 \x00\x17\x06\x80\x98\xe5=\xfe\xf9\xfe\x8e\xfe\xf9=嘅\x01\x91\x01\xd4\x01\x91\xfd\xb5\x1c\x14}\xb3\x1c(\x1czV\x14\x03l\x14\x8c\xfe'\xfd\xf2\xfe'\x8c\x14\x14\x8c\x01\xd9\x02\x0e\x01ٌ\x02@\xecuhy\xb9\xfe\xf9\x01\a\xb9yhu\xec\xcd\xf3\xf3\x029(\x1c\xb3}\x14\x1c\x1c\x14Vz\xfe\xd2D#\xe6\xfe\xeb\x01\x16\xe5#D#\xe5\x01\x16\xfe\xea\xe5\x00\x05\x00\x00\xff\xa0\a\x00\x04\xe0\x00\t\x00\x19\x00=\x00C\x00U\x00\x00%7.\x01547\x06\a\x12\x004&#\"\x06\x15\x14\x162654632%\x14\a\x06\x00\x0f\x01\x06#\"'&547.\x01'&476\x00!2\x177632\x1e\x03\x17\x16\x13\x14\x06\a\x01\x16\x04\x14\a\x06\a\x06\x04#76$7&'7\x1e\x01\x17\x02+NWb=嘧\x02\x89\x1c\x14}\xb3\x1c(\x1czV\x14\x01\x87\x01j\xfe\\i1\n\x12\fz\x10,\x8f\xf1X\x14\x14\x99\x01\xc6\x01\rY[6\n\x12\x05\x1a$\x1e!\x03\x10%\x9e\x82\x01\x18\b\x01\xc0\x14'F\x96\xfeu\xdeJ\xd4\x01iys\xa7?_\xaf9ɍ?\xc0kyhu\xec\xfe\xfe\x02n(\x1c\xb3}\x14\x1c\x1c\x14Vz\xef\a\x02\xbd\xfd\f\xbcY\x10F\n\x12\fKA؉\x1fL\x1f\xeb\x01\x10\x11a\x10\f\x13\x12\x13\x02\n\xfe0\x8b\xe52\x01\xf6-\x84F\"@Q\xac\xbe\x84\x12\uef33sp@\xb2_\x00\x00\x00\x00\x03\x00\x10\xff\x80\x06\xf0\x06\x00\x00\x0f\x00!\x003\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x03\x01\x16\a\x0e\x01#!\"&'&7\x01>\x012\x16\x04\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x12\n\r\v\xdc\v\r\n\x11\x14\x0e\xb9\x0e\x13\r\x03\x00#%\x11;\"\xfa\x00\";\x11%#\x03\x00\x11\x01\x05`,@L\xa1\xa0\x05\x11\x80\a\f\x04\x03\x0f\x06\xfe\xe9\xfe\xfd5\x05\r`\t\x0e\x02\x0f\t\xbd\xfc\v\x02\x01\n`\t\x0e\x06\x02\xc2\x01\x03\xfe\x04\x0e\x03\x02\v\x80\x0e\x10\x02\x99\xa0L\xc0\x05`4\xc0L\xa1\xfdH\x13\x0e`\x06\x01\x03\r\x01\xfc\xfe\xfd\xc2\x11\x0e`\t\x02\v\xfc\xbd\a\x10\r\fa\t\x015\x01\x03\x01\x17\b\x10\x10\v\x80\r\x05\x9f\xa0L@\x00\x0f\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x003\x007\x00;\x00?\x00O\x00s\x00\x00\x17!\x11!\x01!\x11!%!\x11!\x01!\x11!%!\x11!\x01!\x11!\x01!\x11!\x01!\x11!%!\x11!\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!\x11!%!\x11!\x01!\x11!7\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x02\xe0\x01@\xfe\xc0\xfe\x80\x01@\xfe\xc0\x03\x00\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\xfe\xa0\x13\r@\r\x13\x13\r@\r\x13\x02\xe0\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\x01\x80\x01 \xfe\xe0 \x13\r@\r\x13\x13\r@\r\x13\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x01 \xfe\xe0\x01 @\x01@\xfe\xc0\x01@@\x01 \xfc\x00\x01 \x01\xc0\x01 \xfc\x00\x01 @\x01@\x02 \x01 \r\x13\x13\r\xfe\xe0\r\x13\x13\xfc\xad\x01@@\x01 \xfe\xe0\x01 \xc0\x01 \r\x13\x13\r\xfe\xe0\r\x13\x13M\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x03\x00\x00\xff\xa0\a\x00\x05\xe0\x00\x12\x007\x00q\x00\x00\x01\x06\a.\x04+\x01\"&=\x0146;\x012\x00\x14\a\x01\x06#\"&=\x01\"\x0e\x01.\x06'67\x1e\x043!54632\x17\x01\x12\x14\a\x01\x06#\"&=\x01!\"\x0e\x02\a\x06\a\x0e\x06+\x01\"&=\x0146;\x012>\x02767>\x063!54632\x17\x01\x02\x9amBZxPV3!\x12\x0e\xc0\x0e\x12\x1emBZxPV3!\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x05\x00\x00&\x00\x00\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'5&6&>\x027>\x057&\x0254>\x01$32\x04\a\x00\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x11\x1b\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\xb6\xf4\x01\x9c\x03.\xfe\xa4\xfe٫\b\xafC\x0e\b\x02\x16\x12\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xace\xab\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x02\x04 $\x02=\x01463!2\x16\x1d\x01\x14\x1e\x032>\x03=\x01463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xc5\xfe\xa1\xfeH\xfe\xa1\xc5&\x1a\x01\x80\x1a&/\x027\x03#\"&463!2\x1e\x04\x17!2\x16\x02\x80LhLLh\x03\xccLhLLh\xcc!\x18\xfb\xec\r\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x10\x10\x1b\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0e\f\x04\a\x01\x04\xb1\x1a&4hLLhLLhLLhL\x03\xc0\xfe\x00\x18%\x03z<\n\x100&4&&\x1a\v)\x1f1\x05\x037&4&\r\x12\x1f\x15&\a&\x00\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00\x14\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\x03\xa0\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x00\x02\x00\x00\x00\x00\aW\x05\x80\x00\x13\x00*\x00\x00\x01\x14\a\x01\x0e\x01#!\"&547\x01>\x013!2\x16\x01\x15!\"\x06\a\x01\a4&5\x11463!2\x16\x1d\x01!2\x16\aW\x1f\xfe\xb0+\x9bB\xfb\xc0\"5\x1f\x01P+\x9bB\x04@\"5\xfe\xa9\xfc\xc0^\xce=\xfe\xaf\x05\x01\x84\\\x01@\\\x84\x02 \\\x84\x02H\x1f#\xfet3G\x1a\x1e\x1f#\x01\x8c3G\x1a\x01:\xa0_H\xfet\x06\x04\x11\x04\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x01\x00@\xff\x00\x02\xc0\x06\x00\x00\x1f\x00\x00\x00\x14\x06+\x01\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11#\"&47\x0162\x17\x01\x02\xc0&\x1a\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x04\xda4&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x13\x13\xff\x00\x00\x00\x00\x01\x00\x00\x01@\a\x00\x03\xc0\x00\x1f\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x80\x1a&\x13\xff\x00\x00\x00\x00\x05\x00\x00\xff\x80\b\x00\x05\x80\x00\x03\x00\a\x00\r\x00\x11\x00\x15\x00\x00\x01\x11!\x11\x01\x11!\x11\x01\x15!\x113\x11\x01\x11!\x11\x01\x11!\x11\x02\x80\xff\x00\x02\x80\xff\x00\x05\x00\xf8\x00\x80\x05\x00\xff\x00\x02\x80\xff\x00\x02\x80\xfe\x00\x02\x00\x02\x00\xfc\x00\x04\x00\xfb\x80\x80\x06\x00\xfa\x80\x03\x80\xfd\x00\x03\x00\x01\x80\xfb\x80\x04\x80\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x000\x00@\x00\x00\x01\x06\a67\x06\a&#\"\x06\x15\x14\x17.\x01'\x06\x15\x14\x17&'\x15\x14\x16\x17\x06#\"'\x1e\x01\x17\x06#\"'\x1632>\x0354'6\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x008AD\x19AE=\\W{\x05\x81\xe2O\x1d[/5dI\x1d\x16\r\x1a\x15kDt\x91\x1a\x18\x94\xaepČe1\x01?\x01*\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x9e\x19\t(M&\rB{W\x1d\x13\ata28r=\x01\x19\x02Ku\x0e\b\x04?R\x01Z\x03^Gw\x9b\xa9T\x12\t-\x01\x02\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x04\xe0w\xa9\xa9w\xbc\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd\xecw\xa9\xa9w\x05\x80\xa9w\xfc@w\xa9\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad\xa9w\x03\xc0w\xa9\x00\x00\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x17\x00\x1b\x00#\x00'\x00.\x00>\x00\x00\x004&#\"\x06\x15\x14\x1626546326\x14\x06\"&462\x01!5!\x00\x10& \x06\x10\x16 \x01!5!\x03!=\x01!\a!%\x11\x14\x06#!\"&5\x11463!2\x16\x03\xa0\x12\x0eB^\x12\x1c\x128(\x0e\xf2\x96Ԗ\x96\xd4\xfc\x96\x06\x00\xfa\x00\x04\x80\xe1\xfe\xc2\xe1\xe1\x01>\xfc\xe1\x01\x80\xfe\x80\x80\x06\x00\xfc\xc4@\xfd|\x06\x80K5\xfa\x005KK5\x06\x005K\x02\xb2\x1c\x12^B\x0e\x12\x12\x0e(8\bԖ\x96Ԗ\xfc\u0080\x01\x1f\x01>\xe1\xe1\xfe\xc2\xe1\x04\x02\x80\xfe\xc0v\x8a\x80\x80\xfb\x005KK5\x05\x005KK\x00\x02\x00\x00\xffH\x06\x93\x05\x80\x00\x15\x00G\x00\x00\x004&\"\x06\x15\x14\x17&#\"\x06\x14\x162654'\x1632\x01\x14\x06#\".\x02'\a\x17\x16\x15\x14\x06#\"'\x01\x06#\"&54\x12$32\x16\x15\x14\a\x017.\x0354632\x17\x1e\x04\x03@p\xa0p\x13)*Ppp\xa0p\x13)*P\x03\xc3b\x11\t'\"+\x03`\xdc\x1cN*(\x1c\xfda\xb0\xbd\xa3;\x012\xa0\xa3̓\x01c`\x03.\" b\x11\r\n\x06PTY9\x03\xb0\xa0ppP*)\x13p\xa0ppP*)\x13\xfe\x00\x11b \".\x03`\xdc\x1c(*N\x1c\x02\x9f\x83ͣ\xa0\x012\xbeͣ\xbd\xb0\xfe\x9d`\x03+\"'\t\x11b\n\x06MRZB\x00\x00\x00\x00\x06\x00\x00\xff\x0f\a\x80\x05\xf0\x00\a\x00\x11\x00\x1b\x00\u007f\x00\xbd\x00\xfb\x00\x00\x004&\"\x06\x14\x162\x014&\"\x06\x15\x14\x1626\x114&\"\x06\x15\x14\x1626\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x15\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x01\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x11\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x03\x80\x96Ԗ\x96\xd4\x03\x96LhLKjKLhLKjK\xfe\x80\x0e\t\x9b\v\x15\"8\a\a\x17w\x13\v\ns%(\v\f\a\x17\xba\v\x12\x01\x17\")v\a\r\v\n\x90\a\n>\x10\x17\f\x98\n\x0e\x0e\t\x9b\v\x15\"8\a\a\x16x\x13\v\ns\"+\v\f\a\x17\xba\v\x12\x01\x17\")v\b\f\v\n\x90\a\f<\x0f\x17\v\x98\n\x0e\x02\x80\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x02\x16Ԗ\x96Ԗ\xff\x004LL45KK\x0454LL45KK\xfe\x90\xb9\n\x13\x01\x18#)0C\v\t\f\a\x1ew\aZ\x13\fl/\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\t\n\x0eN\x16,&\x18\x01\x11\v\xb9\n\x13\x01\x18#)0C\v\t\f\b\x1ev\aZ\x12\x0el.\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\b\v\x10L\x160\"\x17\x02\x11\xfd\xe0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x03\xf0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00%\x00O\x00\x00\x00\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546$ \x04\x01\x14\x06\a\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x05\x80\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x01E\x01~\x01E\x02<\x8e|\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x03\x8b\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b쉉\xfd\x89x\xd1H\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6\x00\x00\x03\x00\x00\xff\x80\x06\x00\x06\x00\x00\a\x00<\x00m\x00\x00$4&\"\x06\x14\x162\x014&#!4654&#\x0e\x02\a\x06\a\x0e\x06+\x01\x1132\x1e\x04\x17\x16;\x01254'>\x014'654&'>\x017\x14\a\x16\x15\x14\a\x16\x15\x14\a\x16\x06+\x02\"&'&#!\"&5\x11463!6767>\x027632\x1e\x01\x15\x14\a32\x16\x01\x00&4&&4\x04\xa6N2\xfe\xa0`@`\x1a\x18%)\x167\x04&\x19,$)'\x10 \r%\x1d/\x170\x05Ӄy\xc0\x05\x1e#\x125\x14\x0f +\x801\t&\x03<\x01\xac\x8d$]`\xbb{t\x16\xfe\xe05KK5\x01\x12$e:1\x18\x17&+'3T\x86F0\xb0h\x98\xa64&&4&\x02\x803M:\xcb;b^\x1av\x85+\x17D\x052 5#$\x12\xfd\x80\x06\a\x0f\b\x11\x02I\xa7\x1a\x1e\x10IJ 2E\x19=\x11\x01\\$YJ!$MC\x15\x16eM\x8b\xa1-+(K5\x02\x805K\x18\x83K5\x19y\x84*%A\x8au]c\x98\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x05\x80\x00\a\x00>\x00q\x00\x00\x004&\"\x06\x14\x162\x014&'>\x0154'654&'654&+\x01\"\a\x0e\x05+\x01\x1132\x1e\x05\x17\x16\x17\x1e\x02\x172654&5!267\x14\x06+\x01\x16\x15\x14\a\x0e\x01#\"'.\x03'&'&'!\"&5\x11463!27>\x01;\x012\x16\a\x15\x16\x15\x14\a\x16\x15\x14\a\x16\x01\x00&4&&4\x04\xa6+ \x0f\x145\x12#\x1e\x05bW\x80\x83\xd3\x050\x17/\x1d%\r \x10')$,\x19&\x047\x16)%\x18\x1a`@`\x01`2N\x80\x98h\xb00##\x86T3'\"(\v\x18\x130;e$\xfe\xee5KK5\x01 \x16t\x80\xbeip\x8c\xad\x01<\x03&\t1\x04&4&&4&\xfe\x00#\\\x01\x11=\x19E2\x1f&%I\x10\x1e\x1aURI\x02\x11\b\x0f\a\x06\xfd\x80\x12$#5 2\x05D\x17+\x85v\x1a^b;\xcb:M2g\x98c]vDEA%!bSV\x152M\x83\x18K5\x02\x805K(,,\x9e\x89\x05Me\x16\x15CM$!I\x00\x00\x00\x01\x00\x00\xff\xad\x03@\x05\xe0\x00\x12\x00\x00\x01\x11\x05\x06#\"&547\x13\x01&547%\x136\x03@\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13\x05\xe0\xfa\xc5\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7)\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x009\x00\x00\x014.\x03\"\x0e\x02\a\x06\"'.\x03\"\x0e\x03\x15\x14\x17\t\x0167\x14\a\x01\x06\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x06\x80+C`\\hxeH\x18\x12>\x12\x18Hexh\\`C+\xbb\x02E\x02D\xbc\x80\xe5\xfd\x91\x124\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\x03\xacQ|I.\x103MC\x1c\x16\x16\x1cCM3\x10.I|Q\xa8\xbb\xfd\xd0\x02/\xbc\xa8\xdd\xe5\xfd\xa8\x12\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06 \x05\x00\x00(\x00@\x00\x00%\x14\x16\x0e\x02#!\"&5\x11463!2\x16\x15\x14\x16\x0e\x02#!\"\x06\x15\x11\x14\x163!:\x02\x1e\x03\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\x01\x02\x80\x02\x01\x05\x0f\r\xfe\xc0w\xa9\xa9w\x01@\r\x13\x02\x01\x05\x0f\r\xfe\xc0B^^B\x01 \x01\x14\x06\x11\x06\n\x04\x03\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 `\x04 \x15\x1a\r\xa9w\x02\xc0w\xa9\x13\r\x04 \x15\x1a\r^B\xfd@B^\x02\x04\a\v\x0224\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x0f\x00%\x005\x00\x0073\x11#7.\x01\"\x06\x15\x14\x16;\x0126\x013\x114&#\"\a35#\x16\x033\x1147>\x0132\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\xed\xe7\xe7\xf6\x01FtIG9\x01;H\x02I\xe7\x92x\x88I\x02\xe7\x03\x03\xe7\a\x0f<,t\x01ԩw\xfc@w\xa9\xa9w\x03\xc0w\xa9z\x02\xb6\xd64DD43EE\xfc\xa7\x01\x8e\x9a\x9eueB\xfd\x8c\x01\x84&\x12#1\x9d\x02s\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x00\x04\x80\x05\x80\x00\v\x00.\x00\x00\x01\x114&\"\x06\x15\x11\x14\x1626\x01\x14\x06#!\x03\x0e\x01+\x01\"'\x03!\"&5463\x11\"&463!2\x16\x14\x06#\x112\x16\x01\xe0\x12\x1c\x12\x12\x1c\x12\x02\xa0&\x1a\xfeS3\x02\x11\f\x01\x1b\x05L\xfel\x1a&\x9dc4LL4\x02\x804LL4c\x9d\x02\xa0\x01\xc0\x0e\x12\x12\x0e\xfe@\x0e\x12\x12\xfe\xae\x1a&\xfe\x1d\f\x11\x1b\x01\xe5&\x1a{\xc5\x02\x00LhLLhL\xfe\x00\xc5\x00\x00\x00\x02\x00\x00\x00\x00\a\x00\x06\x00\x00'\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x14\x06#!\"\x06\x15\x11\x14\x163!265\x1146;\x012\x16\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x02\xc0\x0e\x12\x12\x0e\xfd@B^^B\x03@B^\x12\x0e@\x0e\x12\x01\x80&4\x13\xb0\xfdt\n\x1a\nr\n\n\x02\x8c\xb0\x13&\x1a\x02\x00\x1a&\x02`\xfe\xc0w\xa9\xa9w\x03@w\xa9\x12\x0e@\x0e\x12^B\xfc\xc0B^^B\x01@\x0e\x12\x12\x03R\xfe\x00\x1a&\x13\xb0\xfdt\n\nr\n\x1a\n\x02\x8c\xb0\x134&&\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\x17\x00@\x00\x00\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\t\x01\x11\x14\x06#!\"&54&>\x023!265\x114&#!*\x02.\x0354&>\x023!2\x16\x04\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 \x01s\xa9w\xfe\xc0\r\x13\x02\x01\x05\x0f\r\x01@B^^B\xfe\xe0\x01\x14\x06\x11\x06\n\x04\x02\x01\x05\x0f\r\x01@w\xa9\x02\x9a4\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x013\xfd@w\xa9\x13\r\x04 \x15\x1a\r^B\x02\xc0B^\x02\x04\a\v\b\x04 \x15\x1a\r\xa9\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00I\x00\x00\x01&5!\x15\x14\x16%5!\x14\a>\x017\x15\x14\x0e\x02\a\x06\a\x0e\x01\x15\x14\x1632\x16\x1d\x01\x14\x06#!\"&=\x014632654&'&'.\x03=\x01463!5463!2\x16\x1d\x01!2\x16\x01\xcaJ\xff\x00\xbd\x04\xc3\xff\x00J\x8d\xbd\x80S\x8d\xcdq*5&\x1d=CKu\x12\x0e\xfc\xc0\x0e\x12uKC=\x1d&5*q͍S8(\x01 ^B\x02@B^\x01 (8\x02\x8d\xa2\xd1`N\xa8\xf6`Ѣ\x1d\xa8\u0380G\x90tO\x056)\"M36J[E@\x0e\x12\x12\x0e@E[J63M\")6\x05Ot\x90G\x80(8`B^^B`8\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00,\x002\x00\x81\x00\x91\x00\x00\x016'&\a\x06\x17\x16'&\a\x06\x17\x1676'6'&\a\x06\x17\x16\x176&'&\x06\x17\x16\x176'&\a\x06\x17\x1e\x014#\"\x147&\x06\x17\x166\x014\x00 \x00\x15\x14\x12\x17\x16654'\x0e\x02.\x01'&'.\x03632\x1e\x01\x17\x1e\x0126767.\x03547&76\x16\x1f\x0162\x17>\x02\x17\x16\a\x16\x15\x14\x0e\x03\a\x16\x15\x14\x06\x15\x14\x1676\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\a\x04\a\t\x05\x04\a\t\x17\x05\a\x06\x06\a\x05\x06/\x02\a\a\x01\x03\a\b\x16\x02\x01\x03\x06\b\x05\x06[\x02\v\t\x04\x02\v\t.\f\n=\x02\x16\x02\x02\x14\x02\x82\xfe\xd4\xfeX\xfe\xd4Ě\x12\x11\x01\x06\x134,+\b\x17\"\x02\x05\v\x03\v\x0e\x06\x12*\f\x10+, \x0e\a\x1a1JH'5\x18\x1d\x13G\x19\x1a:\x8c:\v#L\x13\x1d\x185\x1c+@=&#\x01\x11\x12\x9a\xc4\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01P\x06\a\a\x05\x06\a\a.\a\x03\x04\b\b\x03\x041\x04\x04\x02\x04\x05\x03\x02\x13\x01\a\x02\a\b\a\x06G\a\x04\x03\a\a\x04\x03\x04\x10\x10\x0f\a\x04\a\b\x04\x01E\xd4\x01,\xfe\xd4ԧ\xfe\xf54\x03\x10\f4+\x01\x03\x01\t\x1f\x1a;\x0f\x01\x05\v\b\a\x04\x1b\x16\x1c\x1c\a\x06/\x16\x06\x195cFO:>J\x06\x1b\x10\x10\x11\x11\a\x16\x1e\x06J>:O9W5$\x10\x04\x1f@(b\x02\f\x10\x034\x01\v\x02\x87\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x04\x00\x00\xff\x80\x06\x80\x05\xc0\x00\a\x00\x0f\x00'\x00?\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x1e\x013!267!2\x16\x01\x06#!\x11\x14\x06#!\"&5\x11!\"'&7\x0162\x17\x01\x16\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01\xab\x15c=\x01\x00=c\x15\x01\xab(8\xfe\xbb\x11*\xff\x00&\x1a\xff\x00\x1a&\xff\x00*\x11\x11\x1f\x01\xc0\x126\x12\x01\xc0\x1f&4&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(88HH88\x02`(\xfe@\x1a&&\x1a\x01\xc0('\x1e\x01\xc0\x13\x13\xfe@\x1e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x05\xff\x05\x80\x001\x00c\x00\x00\x014&'.\x0254654'&#\"\x06#\"&#\"\x0e\x01\a\x06\a\x0e\x02\x15\x14\x16\x15\x14\x06\x14\x1632632\x16327>\x01\x127\x14\x02\x06\a\x06#\"&#\"\x06#\"&54654&54>\x02767632\x1632632\x16\x15\x14\x06\x15\x14\x1e\x02\x17\x1e\x01\x05\u007f\x0e\v\f\n\b\n\n\x04\t\x13N\x14<\xe8;+gC8\x89A`\u007f1\x19\x16\x18\x16\x18a\x199\xe19\xb5g\x81\xd5w\x80\x8c\xfc\x9b|\xca9\xe28\x18a\x19Ie\x16\x19$I\x80VN\x9a\xc2z<\xe7:\x13L\x14QJ\n\x04\x03\f\x02\x10\x12\x02\xc6,\x8b\x1b\x1e\x1c-\x1a\x17[\x16%\x12\x01\t0\x17\x18\x1661I\xe9\xef\x81(\xa0)\x17W,\x1d\x16\x1f$-\xd7\x01\x14\x8b\xa5\xfe\xbb\xfb7,\x1d\x1doI\x18X\x17(\xa1)o\xd5ζA;=N0\neT\x17Z\x17\r\x18\t \x04(\x9d\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00O\x00\x00\x01\x14\x06\a\x06\a\x06#\".\x03'&'&\x00'&'.\x0454767>\x0132\x17\x16\x17\x1e\x02\x17\x1e\x02\x15\x14\x0e\x02\x15\x14\x1e\x02\x17\x1e\x01\x17\x1e\x0332>\x0232\x1e\x01\x17\x1e\x02\x17\x16\x17\x16\x05\x80\x14\v\x15e^\\\x1b4?\x1fP\tbM\u007f\xfe\xeeO0#\x03\x1e\v\x12\a382\x19W\x1b\x0e\a\x12#\v& \x0f\x03\x1d\x0e9C9\n\a\x15\x01Lĉ\x02\"\x0e\x1b\t\x1282<\x14\x0e\x1d*\x04\x199F\x13F\x06\x03\x01(\x1bW\x19283\a\x12\v\x1e\x03#0O\x01\x12\u007fMb\tP\x1f?4\x1b\\^e\x15\v\x14\x03\x06F\x13F9\x19\x04*\x1d\x0e\x14<28\x12\t\x1b\x0e\"\x02\x89\xc4L\x01\x15\a\n9C9\x0e\x1d\x03\x0f &\v#\x12\a\x00\x00\x00\x02\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00\x00\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x04`\xfc\xc0B^^B\x03@B^^ީw\xfc\xc0w\xa9\xa9w\x03@w\xa9\x05\x00^B\xfc\xc0B^^B\x03@B^\xa0\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x02\x00\x00\xff\x97\x05\x00\x05\x80\x00\x06\x00#\x00\x00\x01!\x11\x017\x17\x01\x132\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x80\xfc\x00\x01\xa7YY\x01\xa7\f\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x00\xfb&\x01\x96UU\xfej\x05Z\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00W\x00\x00\x014.\x04'.\x02#\"\x0e\x02#\".\x02'.\x01'.\x0354>\x0254.\x01'.\x05#\"\a\x0e\x01\x15\x14\x1e\x04\x17\x16\x00\x17\x1e\x0532676\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x04 1.-\x06\x05\x1c\x16\n\x0f+$)\r\a\x13\f\x16\x03c\x8e8\x02\r\x06\a)1)\n\x14\x03\x03\x18\x1a\x1b\x17\n\v05.D\x05\x05\r\a\x12\x02<\x019\xa4\x060\x12)\x19$\x109\x93\x15\x16\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01W\v\n\x17\x1b\x1a\x18\x03\x03\x14\n)1)\a\x06\r\x027\x8fc\x03\x16\f\x13\a\r)$+\x0f\n\x16\x1c\x05\x06-.1 \x04\x16\x15\x939\x10$\x19)\x120\x06\xa4\xfe\xc7<\x02\x12\a\r\x05\x05D.5\x039\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00,\x00\x00\x06T\x05\x00\x001\x00\x00\x01\x06\a\x16\x15\x14\x02\x0e\x01\x04# '\x16327.\x01'\x16327.\x01=\x01\x16\x17.\x01547\x16\x04\x17&54632\x1767\x06\a6\x06TC_\x01L\x9b\xd6\xfeҬ\xfe\xf1\xe1#+\xe1\xb0i\xa6\x1f!\x1c+*p\x93DNBN,y\x01[\xc6\b\xbd\x86\x8c`m`%i]\x04hbE\x0e\x1c\x82\xfe\xfd\xee\xb7m\x91\x04\x8a\x02}a\x05\v\x17\xb1u\x04&\x03,\x8eSXK\x95\xb3\n&$\x86\xbdf\x159s?\n\x00\x00\x00\x01\x00_\xff\x80\x03\xbf\x06\x00\x00\x14\x00\x00\x01\x11#\"\x06\x1d\x01!\x03#\x11!\x11#\x11!54632\x03\xbf\x9dV<\x01%'\xfe\xfe\xce\xff\x00\xffЭ\x93\x05\xf4\xfe\xf8HH\xbd\xfe\xd8\xfd\t\x02\xf7\x01(ں\xcd\x00\x00\x00\b\x00\x00\xff\xa7\x06\x00\x05\x80\x00T\x00\\\x00d\x00k\x00s\x00z\x00\x82\x00\x88\x00\x00\x00 \x04\x12\x15\x14\x00\a\x06&54654'>\x0454'6'&\x06\x0f\x01&\"\a.\x02\a\x06\x17\x06\x15\x14\x1e\x03\x17\x06\a\x0e\x01\"&'.\x01/\x01\"\x06\x1e\x01\x1f\x01\x1e\x01\x1f\x01\x1e\x03?\x01\x14\x16\x15\x14\x06'&\x0054\x12\x136'&\a\x06\x17\x16\x176'&\a\x06\x17\x16\x176'&\a\x06\x16\x176'&\a\x06\x17\x16\x176'&\x06\x17\x1674\a\"\x15\x14727&\a\x06\x166\x02/\x01\xa2\x01a\xce\xfe\xdb\xe8\x1b\x1a\x0149[aA)O%-\x1cj'&]\xc6]\x105r\x1c-%O)@a[9'\n\x150BA\x17\x13;\x14\x14\x15\x10\x06\f\a\a\x16+\n\n\r>HC\x16\x17\x01\x1a\x1b\xe8\xfe\xdb\xceU\x03\n\n\x03\x03\n\t#\a\t\n\x06\a\t\n$\t\t\b\t\t\x122\b\f\f\b\t\r\fA\x03\x10\x0f\b\x11\x0fC\x11\x10\x11\x10:\x02\x10\x10\x04 \x05\x80\xce\xfe\x9f\xd1\xfb\xfeoM\x05\x18\x12\x03\x93=a-\x06\x186O\x83UwW[q\t(\x18\x18\x1a\x1a\v -\tq[WwU\x82P6\x18\x06$C\n\n+) (\x04\x03\t\x0e\x0e\x05\x05\n8\x17\x17&/\r\x01\x04\x04&e\x04\x12\x18\x05M\x01\x91\xfb\xd1\x01a\xfc\u007f\a\x05\x03\x05\a\x05\x06\x1a\x05\v\t\x06\x05\v\n&\a\f\r\a\x05\x1a$\b\v\f\t\b\v\f\x10\v\x05\x04\x16\x04\x06\a\r\x02\v\r\x02\x15\v\x02\x03\x18\b\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00%\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&\"\x06\x1d\x0132\x16\x15\x11\x14\x06#!\"&5\x11463!54\x00 \x00\x06\x80&\x1a@\x1a&\x96Ԗ`(88(\xfc@(88(\x02\xa0\x01\a\x01r\x01\a\x03\xc0\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xc08(\xfd\xc0(88(\x02@(8\xc0\xb9\x01\a\xfe\xf9\x00\x00\x00\x05\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x00\x19\x00#\x00'\x00+\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x15\"\x06\x1d\x01!54&#\x11265\x11!\x11\x14\x16375!\x1535!\x15\x06\xe0B^^B\xf9\xc0B^^B\r\x13\x06\x80\x13\r\r\x13\xf9\x80\x13\r`\x01\x00\x80\x01\x80\x05\x80^B\xfb@B^^B\x04\xc0B^\x80\x13\r\xe0\xe0\r\x13\xfb\x00\x13\r\x02`\xfd\xa0\r\x13\x80\x80\x80\x80\x80\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\a\x00!\x00=\x00\x00\x00\x14\x06\"&462\x01\x16\a\x06+\x01\"&'&\x00'.\x01=\x01476;\x01\x16\x04\x17\x16\x12\x05\x16\a\x06+\x01\"&'&\x02\x00$'.\x01=\x01476;\x01\f\x01\x17\x16\x12\x01\x80p\xa0pp\xa0\x02p\x02\x13\x12\x1d\x87\x19$\x02\x16\xfe\xbb\xe5\x19!\x15\x11\x1a\x05\xa0\x01$qr\x87\x02\r\x02\x14\x12\x1c\x8f\x1a%\x01\f\xb2\xfe\xe3\xfe}\xd7\x19#\x14\x12\x1a\x03\x01\x06\x01ߺ\xbb\xd6\x01\x10\xa0pp\xa0p\xfe\xc5\x1c\x14\x15!\x19\xe5\x01E\x16\x02$\x19\x87\x1d\x12\x11\r\x87rq\xfeܢ\x1b\x14\x14#\x19\xd7\x01\x83\x01\x1d\xb2\r\x01%\x19\x8f\x1c\x12\x12\rֻ\xba\xfe!\x00\x05\x00\x00\x00\x00\x06\x00\x05\x00\x00\a\x00\x0f\x00\x1f\x00)\x00?\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x17\x114&#!\"\x06\x15\x11\x14\x163!26\x01!\x03.\x01#!\"\x06\a\x01\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x04\x10/B//B\x01//B//B\x9f\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfb2\x04\x9c\x9d\x04\x18\x0e\xfc\xf2\x0e\x18\x04\x04\xb1^B\xfb@B^\x10\xc5\x11\\7\x03\x0e7\\\x11\xc5\x10\x01aB//B//B//B/\xf0\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x01\xed\x01\xe2\r\x11\x11\r\xfd~\xfe\xc0B^^B\x01@\x192\x02^5BB5\xfd\xa22\x00\x02\x00\x00\xff\x83\a\x00\x05\x80\x00.\x004\x00\x00\x012\x16\x14\x06#\x11\x14\x06#\x00%\x0e\x01\x16\x17\x0e\x01\x1e\x02\x17\x0e\x01&'.\x0467#\"&=\x01463! \x012\x16\x15\x03\x11\x00\x05\x11\x04\x06\x805KK5L4\xfe_\xfeu:B\x04&\x14\x06\x121/&\x1d\xa5\xac.\a-\x13\x1b\x03\n\x11zB^^B\x01\xe0\x01\xb3\x01\xcd4L\x80\xfev\xfe\x8a\x01y\x03\x80KjK\xfe\x804L\x01[!\x13^k'!A3;)\x1e:2\x1b*\x17\x81\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\xfdv\x05\x14\xfe\xf60Z\x99\xba\x99Z0\x04\xc0L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x010\x01,\x02\x143lb??bl3\xfd\xec\xfe\xd44Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x00\x01\x00\x02\xff\x80\x05\xfe\x05}\x00I\x00\x00\x01\x17\x16\a\x06\x0f\x01\x17\x16\a\x06/\x01\a\x06\a\x06#\"/\x01\a\x06'&/\x01\a\x06'&?\x01'&'&?\x01'&76?\x01'&76\x1f\x017676\x1f\x0176\x17\x16\x1f\x0176\x17\x16\x0f\x01\x17\x16\x17\x16\a\x05`\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n)\f\a\x1f\x14\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x8a\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n))\x1d\x87\x87\x1d))\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x02\x80\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\x02\x16\x8a\x8a\x1e\n\v)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc)\n\f\x1f\x8b\x8b\x1e\v\n)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x005\x00h\x00\x00$4&\"\x06\x14\x162\x014&#!4>\x0254&#\"\a\x06\a\x06\a\x06\a\x06+\x01\x1132\x1e\x013254'>\x014'654&'!267\x14\x06+\x01\x06\a\x16\x15\x14\a\x16\x06#\"'&#!\"&5\x11463!2>\x05767>\x0432\x16\x15\x14\a!2\x16\x01\x00&4&&4\x05\xa6N2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5Q\xbd\x05\x1e#\x125\x14\x0f\x01K4L\x80\x97i\xa9\x04!\x03<\x01\xac\x8d\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\xa64&&4&\x02\x803M\x1495S+C=\x8b,\x15@QQ\x199\xfd\x80@@\xa7\x1a\x1e\x10IJ 2E\x19=\x11L5i\x98>9\x15\x16eM\x8b\xa1E;K5\x02\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x005\x00=\x00q\x00\x00%3\x11#\".\x02'&'&'&'.\x04#\"\x06\x15\x14\x1e\x02\x15!\"\x06\x15\x14\x163!\x0e\x01\x15\x14\x17\x06\x14\x16\x17\x06\x15\x14\x1632>\x01$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"\a\x06#\"&?\x01&547&'#\"&5463!&54632\x1e\x03\x17\x16\x17\x1e\x063!2\x16\x05` #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K\x0f\x145\x12#\x1e\x04aWTƾ\x01h&4&&4\xa6K5\xfe\xe0;\xa4\xbe\u007f\x8e\xb0\x01\x01=\x03!\x04\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5K\x80\x02\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L\x11=\x19E2 JI\x10\x18 UR@@&4&&4&\x02\x80\xfd\x805K;E\x9b\x8c\x05Lf\x16\x159>\x98ig\x98R\x157J\x03\x1c\x0f\x1c\x11\x13\tK\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x005\x00h\x00\x00\x044&\"\x06\x14\x162\x134#\"\a.\x01\"\a&#\"\x06\a\x114&#\"\x06\x15\x11\".\x02#\"\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x16\x1d\x01!54>\x017\x14\a\x06\x15\x11\x14\x06#!\"&5\x114.\x05'&'.\x0454632\x17\x114632\x16\x1d\x01\x16\x17632\x176\x16\x05\x00&4&&4\xa6\xa7\x1a\x1e\x10IJ 2E\x19=\x11L43M\x1495S+C=\x8b,\x15@QQ\x199\x02\x80@@\x80E;K5\xfd\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98gi\x98>9\x15\x16eM\x8b\xa1Z4&&4&\x03<\xbd\x05\x1e#\x125\x14\x0f\x01K4LN2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5V\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\x97i\xa9\x04!\x03<\x01\xac\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x004\x00<\x00p\x00\x00\x014.\x01=\x01!\x15\x14\x0e\x02\a\x06\a\x06\a\x06\a\x0e\x04\x15\x14\x1632>\x023\x11\x14\x163265\x11\x16327\x16267\x16326\x024&\"\x06\x14\x162\x01\x14\x06/\x01\x06#\"'\x06\a\x15\x14\x06#\"&5\x11\x06#\"&54>\x03767>\x065\x11463!2\x16\x15\x11\x14\x17\x16\x05\x80@@\xfd\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L.9E2 JI\x10\x18 UR\x80&4&&4\x01&\x9b\x8c\x05Lf\x16\x156A\x98ig\x986Jy\x87#@>R\x157J\x03\x1c\x0f\x1c\x11\x13\tK5\x02\x805K;E\x02@TƾH #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K#5\x12#\x1e\x04a\x03=4&&4&\xfdD\x8e\xb0\x01\x01=\x03\x1e\a\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5KK5\xfe\xe0;\xa4\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x0154&#!764/\x01&\"\a\x01\a\x06\x14\x1f\x01\x01\x162?\x0164/\x01!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x00&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x126\x12[\x12\x12\xbd\x01\xf6\x1a&\x01\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\xbd\x134\x13[\x12\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01\x01&\"\x0f\x01\x06\x14\x1f\x01!\"\x06\x1d\x01\x14\x163!\a\x06\x14\x1f\x01\x1627\x017$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x05\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\x126\x12\x01j[\x01\r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02e6\x12[\x01j\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\xfe\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004'\x01'&\"\x0f\x01\x01\x06\x14\x1f\x01\x162?\x01\x11\x14\x16;\x01265\x11\x17\x162?\x01$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02f6\x12\x01j[\x12\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\xfd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01&\"\x0f\x01\x114&+\x01\"\x06\x15\x11'&\"\x0f\x01\x06\x14\x17\x01\x17\x162?\x01\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\x126\x12[\x01j\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02d6\x12[\x12\x12\xbd\x01\xf6\x1a&&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x00\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x01\xd8\x02\x18\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x01\x0e\x01\a2>\x01767676\x17&67>\x01?\x01\x06&'\x14\a4&\x06'.\x02'.\x01'.\x03\"\x0e\x01#&\x0e\x02\a\x0e\x01\a6'&\a6&'3.\x02'.\x01\a\x06\x1e\x01\x15\x16\x06\x15\x14\x16\a\x0e\x01\a\x06\x16\x17\x16\x0e\x02\x0f\x01\x06&'&'&\a&'&\a6'&\a>\x01567>\x02#\x167>\x0176\x1e\x013\x166'\x16'&'&\a\x06\x17&\x0e\x01'.\x01'\"\a6&'6'.\x01\a\x0e\x01\x1e\x02\x17\x16\a\x0e\x02\a\x06\x16\a.\x01'\x16/\x01\"\x06&'&76\x17.\x01'\x06\a\x167>\x0176\x177\x16\x17&\a\x06\a\x16\a.\x02'\"\a\x06\a\x16\x17\x1e\x027\x16\a6\x17\x16\x17\x16\a.\x01\a\x06\x167\"\x06\x14\a\x17\x06\x167\x06\x17\x16\x17\x1e\x02\x17\x1e\x01\x17\x06\x16\a\"\x06#\x1e\x01\x17\x1e\x0276'&'.\x01'2\x1e\x02\a\x06\x1e\x02\x17\x1e\x01#2\x16\x17\x1e\x01\x17\x1e\x03\x17\x1e\x01\x17\x162676\x16\x17\x167\x06\x1e\x02\x17\x1e\x01\x1767\x06\x16765\x06'4.\x026326&'.\x01'\x06&'\x14\x06\x15\"'>\x017>\x03&\a\x06\a\x0e\x02\a\x06&'.\x0154>\x01'>\x017>\x01\x1667&'&#\x166\x17\x1674&7\x167\x1e\x01\x17\x1e\x0267\x16\x17\x16\x17\x16>\x01&/\x0145'.\x0167>\x0276'27\".\x01#6'>\x017\x1676'>\x017\x16647>\x01?\x016#\x1676'6&'6\x1676'&\x0367.\x01'&'6.\x02'.\x03\x06#\a\x0e\x03\x17&'.\x02\x06\a\x0e\x01\a&6'&\x0e\x04\a\x0e\x01\a.\x015\x1e\x01\x17\x16\a\x06\a\x06\x17\x14\x06\x17\x14\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03D\x02\x0f\x06\x02\x05\x05\x01\x06\x10\x0e&\"\x11\x02\x17\x03\x03\x18\x03\x02\f\v\x01\x06\t\x0e\x02\n\n\x06\x01\x02\x0f\x02\x01\x03\x03\x05\x06\b\a\x01\x03\x06\x03\x06\x02\x03\v\x03\x0f\x10\n\x06\t\x03\a\x05\x01\x0f\x14\x03\b4\a\x05\x01\a\x01\r\x1c\x04\x03\x1a\x03\x05\a\a\x02\x01\x06\x05\x04\x03\v\x13\x04\a\t\x17\x06\x05$\x19!\x06\x06\a\f\x03\x02\x03\t\x01\f\a\x03#\x0f\x05\r\x04\t\n\x13\x05\x0e\x03\t\f\t\x04\x04\f\x0f\b\n\x01\x11\x10\b\x01\t\x05\b\b\x03\x1c\n\x13\x1b\a\x1b\x06\x05\x01\v\n\r\x02\x0e\x06\x02\r\n\x01\x03\x06\x05\x05\b\x03\a \n\x04\x18\x11\x05\x04\x04\x01\x03\x04\x0e\x03.0\x06\x06\x05\x10\x02\"\b\x05\x0e\x06\a\x17\x14\x02\a\x02\x04\x0f\x0e\b\x10\x06\x92Y\a\x05\x04\x02\x03\n\t\x06\x01+\x13\x02\x03\r\x01\x10\x01\x03\a\a\a\x05\x01\x02\x03\x11\r\r!\x06\x02\x03\x12\f\x04\x04\f\b\x02\x17\x01\x01\x03\x01\x03\x19\x03\x01\x02\x04\x06\x02\x1a\x0f\x02\x03\x05\x02\x02\b\t\x06\x01\x03\n\x0e\x14\x02\x06\x10\b\t\x16\x06\x05\x06\x02\x02\r\f\x14\x03\x05\x1b\b\n\f\x11\x05\x0f\x1c\a$\x13\x02\x05\v\a\x02\x05\x1a\x05\x06\x01\x03\x14\b\x0e\x1f\x12\x05\x03\x02\x02\x04\t\x02\x06\x01\x01\x14\x02\x05\x16\x05\x03\r\x02\x01\x03\x02\x01\t\x06\x02\v\f\x13\a\x01\x04\x06\x06\a\"\a\r\x13\x05\x01\x06\x03\f\x04\x02\x05\x04\x04\x01\x01\x03\x03\x01\a+\x06\x0f\a\x05\x02\x05\x18\x03\x19\x05\x03\b\x03\a\x05\n\x02\v\b\a\b\x01\x01\x01\x01\x01\x0f\a\n\n\x01\x0e\x11\x04\x15\x06\a\x04\x01\b\a\x01\t\a\x05\x05\x05\t\f\b\a\x05\x1f\x03\a\x02\x03\x04\x16\x02\x11\x03\x03\x12\r\n\x10\x03\f\t\x03\x11\x02\x0f\x16\x11\xbdΑ\x03\x13\x03\x12\x06\x01\a\t\x10\x03\x02\n\x04\v\x06\a\x03\x03\x05\x06\x02\x01\x15\x0f\x05\f\t\v\x06\x05\x02\x01\a\x0e\x05\x03\x0f\t\x0e\x04\r\x02\x03\x06\x02\x02\x13\x02\x04\x03\a\x13\x1b\x02\x04\x10\x10\x01\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfe\xc5\x01\x11\x01\n\f\x01\a\b\x06\x06\b\x13\x02\x16\x01\x02\x05\x05\x16\x01\x10\r\x02\x06\a\x02\x04\x01\x03\t\x18\x03\x05\f\x04\x02\a\x06\x05\n\n\x02\x01\x01\x05\x01\x02\x02\x01\x05\x06\x04\x01\x04\x10\x06\x04\t\b\x02\x05\t\x04\x06\t\x13\x03\x06\x0e\x05\a\x11\r\b\x10\x04\b\x15\x06\x02\x04\x05\x03\x02\x02\x05\x16\x0f\x19\x05\b\t\r\r\t\x05\x01\x0e\x0f\x03\x06\x17\x02\r\n\x01\x0f\f\x04\x0f\x05\x18\x05\x06\x01\n\x01\x18\b\x01\x12\a\x02\x04\t\x04\x04\x01\x17\f\v\x01\x19\x01\x0f\b\x0e\x01\f\x0f\x04\x02\x05\a\t\a\x04\x04\x01\n\x04\x01\x05\x04\x02\x04\x14\x04\x05\x19\x04\t\x03\x01\x04\x02\a\b\f\x04\x02\x03\r\x02\x0f\x1a\x01\x02\x02\t\x01\x0e\a\x05\x10\t\x04\x03\x06\x06\f\x06\x03\x0e\b\x01\x01P\x8e\a\x01\x01\x10\x06\x06\b\v\x01\x1c\x11\x04\v\a\x02\x0e\x03\x05\x1b\x01 '\x04\x01\f-\x03\x03(\b\x01\x02\v\t\x06\x05#\x06\x06\x1c\t\x02\a\x0e\x06\x03\x0e\b\x02\x14*\x19\x04\x05\x15\x04\x03\x04\x04\x01\a\x15\x10\x16\x02\x06\x1b\x15\t\b$\x06\a\r\x06\n\x02\x02\x11\x03\x04\x05\x01\x02\"\x04\x13\b\x01\r\x12\v\x03\x06\x12\x06\x04\x05\b\x18\x02\x03\x1d\x0f!\x01\t\b\t\x06\a\x12\x04\b\x18\x03\t\x02\b\x01\t\x02\x01\x03\x1d\b\x04\x10\r\f\a\x01\x01\x13\x03\x0f\b\x03\x03\x02\x04\b*\x10\n!\x11\x10\x02\x0f\x03\x01\x01\x01\x04\x04\x01\x02\x03\x03\t\x06\v\r\x01\x11\x05\x1b\x12\x03\x04\x03\x02\a\x02\x03\x05\x0e\n(\x04\x03\x02\x11\v\a\b\t\t\b\x03\x12\x13\t\x01\x05\b\x04\x13\x10\t\x06\x04\x05\v\x03\x10\x02\f\n\b\b\a\a\x06\x02\b\x10\x04\x05\b\x01\v\x04\x02\r\v\t\x06\a\x02\x01\x01\x02\n\x06\x05\xfc\x82$\x99\x03\x03\x02\a\x01\a\f\x06\n\x02\x02\b\x03\x06\x02\x01\x01\x03\x03\x03\x01\x11\x05\x01\t\x05\x02\x06\x05\x14\x03\x05\x19\x06\x06\x03\x06\v\x02\t\x03\x04\x10\x03\x04\x05\x03\n2\r\x1f\x11\x19\x0f\x16\x04\a\x1b\b\x06\x00\x00\x03\x00\x15\xff\x15\x06~\x05\x80\x00\a\x00\x15\x00/\x00\x00$4&\"\x06\x14\x162\t\x01\x06#\"/\x01&547\x01\x1e\x01\x01\x14\a\x0e\x01#\"\x00\x10\x0032\x16\x17\x16\x14\a\x05\x15\x17>\x0232\x16\x01\x80&4&&4\x02\xaa\xfdV%54'j&&\x02\xa9'\x97\x02\xdc\x17/덹\xfe\xf9\x01\a\xb9:\u007f,\x10\x10\xfe\xdb\xc1\x05\x94{\t\x0f\x11&4&&4&\x01\xe4\xfdV%%l$65&\x02\xa9b\x97\x01\x8c'C\x86\xa7\x01\a\x01r\x01\a!\x1e\v\"\v\xa9\xe0k\x03[G\x14\x00\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x1b\x00+\x00;\x00\x00%!5!\x01!5!\x01!5!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x04\x00\x02\x80\xfd\x80\xfe\x80\x04\x00\xfc\x00\x02\x80\x01\x80\xfe\x80\x02\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\x80\x80\x01\x80\x80\x01\x80\x80\xfc@\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x01\x00\x05\xff\x80\x05{\x05\x00\x00\x15\x00\x00\x01\x16\a\x01\x11\x14\a\x06#\"'\x01&5\x11\x01&763!2\x05{\x11\x1f\xfe\x13'\r\f\x1b\x12\xff\x00\x13\xfe\x13\x1f\x11\x11*\x05\x00*\x04\xd9)\x1d\xfe\x13\xfd\x1a*\x11\x05\x13\x01\x00\x13\x1a\x01\xe6\x01\xed\x1d)'\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x06\x00\x00\x03\x00\x17\x00\x1b\x00/\x00\x00\x01!5!\x01\x11\x14\x06#!\"&5\x11!\x15\x14\x163!26=\x01#\x15!5\x01\x11!\x11463!5463!2\x16\x1d\x01!2\x16\x02\x80\x02\x00\xfe\x00\x04\x80^B\xfa@B^\x02\xa0&\x1a\x01@\x1a&`\xff\x00\x04\x00\xf9\x00^B\x01`8(\x02@(8\x01`B^\x05\x00\x80\xfd\x00\xfe B^^B\x01\xe0\xa0\x1a&&\x1a\xa0\x80\x80\x01\xe0\xfe\x80\x01\x80B^\xa0(88(\xa0^\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00\x00\t\x0276\x17\x16\x15\x11\x14\x06#!\"'&?\x01\t\x01\x17\x16\a\x06#!\"&5\x11476\x1f\x01\t\x01\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\t\x01'&763!2\x16\x15\x11\x14\a\x06#\"'\x05\x03\xfe\x9d\x01c\x90\x1d)'&\x1a\xfe@*\x11\x11\x1f\x90\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x13\x1a\f\f(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x1f\x11\x11*\x01\xc0\x1a&'\r\f\x1a\x13\x03\xe3\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x13\x05\x11*\x01\xc0\x1a&('\x1e\x90\xfe\x9d\x01c\x90\x1e'(&\x1a\xfe@*\x11\x05\x13\x00\x00\x06\x00\x00\xff\x00\a\x80\x06\x00\x00\x11\x001\x009\x00A\x00S\x00[\x00\x00\x01\x06\a#\"&5\x1032\x1e\x01327\x06\x15\x14\x01\x14\x06#!\"&54>\x0532\x1e\x022>\x0232\x1e\x05\x00\x14\x06\"&462\x00\x10\x06 &\x106 \x01\x14\x06+\x01&'654'\x1632>\x0132\x02\x14\x06\"&462\x02Q\xa2g\x86Rp|\x06Kx;CB\x05\x04\x80\x92y\xfc\x96y\x92\a\x15 6Fe=\nBP\x86\x88\x86PB\n=eF6 \x15\a\xfc\x00\x96Ԗ\x96\xd4\x03V\xe1\xfe\xc2\xe1\xe1\x01>\x03!pR\x86g\xa2Q\x05BC;xK\x06|\x80\x96Ԗ\x96\xd4\x02\x80\x05{QN\x01a*+\x17%\x1d\x8b\xfd\x0ex\x8b\x8bx5eud_C(+5++5+(C_due\x052Ԗ\x96Ԗ\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\xfd\x9fNQ{\x05u\x8b\x1d%\x17+*\x01jԖ\x96Ԗ\x00\x00\x00\x00\x03\x00\x10\xff\x90\x06p\x05\xf0\x00!\x00C\x00i\x00\x00\x014/\x01&#\"\a\x1e\x04\x15\x14\x06#\".\x03'\x06\x15\x14\x1f\x01\x1632?\x016\x014/\x01&#\"\x0f\x01\x06\x15\x14\x1f\x01\x16327.\x0454632\x1e\x03\x176\x00\x14\x0f\x01\x06#\"/\x01&547'\x06#\"/\x01&4?\x01632\x1f\x01\x16\x15\x14\a\x17632\x1f\x01\x05\xb0\x1c\xd0\x1c(*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x1c\xce\x1b)(\x1c\x93\x1c\xfdA\x1c\xce\x1c('\x1d\x93\x1c\x1c\xd0\x1b)*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x03\u007fU\x93SxyS\xceSXXVzxT\xd0TU\x93SxyS\xceSXXVzxT\xd0\x01@(\x1c\xd0\x1c \x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f*(\x1c\xcf\x1b\x1a\x92\x1c\x02\xe8(\x1c\xcf\x1c\x1b\x92\x1c'(\x1c\xd0\x1b\x1f\x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f\xfd\xe1\xf0S\x92SU\xcfSx{VXXT\xd0T\xf0S\x92SU\xcfSx{VXXT\xd0\x00\x01\x00\x00\x00\x00\a\x80\x05\x80\x00\x1b\x00\x00\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\a\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8et\x02\x01,Ԟ\x01\x01;F`j\x96)\x81\xa8\x01\x80\x9f\xe1\x01\a\xb9\x84\xdb6\x1c\x0f\xd4\x01,\xb0\x8e>\x96jK?\x1e\xd1\x00\x02\x00s\xff\x80\x06\r\x05\x80\x00\x17\x00!\x00\x00%\x16\x06#!\"&7\x01\x11#\"&463!2\x16\x14\x06+\x01\x11\x05\x01!\x01'5\x11#\x11\x15\x05\xf78Ej\xfb\x80jE8\x01\xf7@\x1a&&\x1a\x02\x00\x1a&&\x1a@\xfe\xec\xfe\xf0\x02\xc8\xfe\xf0\x14\x80XY\u007f\u007fY\x03\x19\x01\x8f&4&&4&\xfeqD\xfeS\x01\xad\x1f%\x01\x8f\xfeq%\x00\x00\x00\x00\a\x00\x01\xff\x80\a\x00\x05\x00\x00\a\x00N\x00\\\x00j\x00x\x00\x86\x00\x8c\x00\x00\x002\x16\x14\x06\"&4\x05\x01\x16\a\x06\x0f\x01\x06#\"'\x01\a\x06\a\x16\a\x0e\x01\a\x06#\"'&7>\x017632\x176?\x01'&'\x06#\"'.\x01'&67632\x17\x1e\x01\x17\x16\a\x16\x1f\x01\x01632\x1f\x01\x16\x17\x16\a\x056&'&#\"\a\x06\x16\x17\x1632\x03>\x01'&#\"\a\x0e\x01\x17\x1632\x01\x1754?\x01'\a\x0e\x01\a\x0e\x01\a\x1f\x01\x01'\x01\x15\a\x17\x16\x17\x1e\x01\x1f\x01\x017\x01\a\x06\a\x03\xa64&&4&\x01l\x01\xfb\x1c\x03\x05\x1e\x80\r\x10\x11\x0e\xfdNn\b\x04\x0e\x04\abS\x84\x91\x88VZ\v\abR\x84\x92SD\t\rzz\r\tDS\x92\x84Rb\a\x05)+U\x89\x91\x84Sb\a\x04\x0e\x04\bn\x02\xb2\x0e\x11\x10\r\x80\x1e\x05\x03\x1c\xfb\\.2Q\\dJ'.2Q\\dJ.Q2.'Jd\\Q2.'Jd\x01\x0e`!\x0eO\x1a\x03\x0e\x05\x02\x04\x01\xd7`\x02\xe0\x80\xfd\x00\xa0\t\x02\x05\x04\x0e\x04\x1a\x03`\x80\xfd\xf8\xb1\x02\v\x02\x80&4&&4\x1a\xfer\x14$#\x10@\a\b\x01\x83B\x04\x0110M\x8d5TNT{L\x8e5T\x1f\r\tII\t\r\x1fT5\x8eL;l'OT4\x8eM01\x01\x04B\x01\x83\b\a@\x10#$\x14\x8a*\x843;$*\x843;\xfd;3\x84*$;3\x84*$\x02\xa0:\v$\x14\b/\x1a\x03\x10\x04\x02\x03\x01\xe9 \x02@@\xfeQq`\b\x02\x04\x04\x10\x04\x1a\xfe\xc0@\x01\x98\x8a\x03\x04\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00\"\x00%\x003\x00<\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11!\"&5\x11467\x01>\x013!2\x16\x15\x1163\a\x01!\t\x01!\x13\x01\x11!\x11\x14\x06#!\x11!\x1146\x01\x11!\x11\x14\x06#!\x11\x06\xa0(88(\xfc@(8\xfd\xe0(8(\x1c\x01\x98\x1c`(\x01\xa0(8D<\x80\xfe\xd5\x01+\xfd\x80\xfe\xd5\x01+\xc4\x01<\xfe\x808(\xfe`\x02\x00(\x03\xd8\xfe\x808(\xfe`\x04\x808(\xfb@(88(\x01 8(\x02\xa0(`\x1c\x01\x98\x1c(8(\xfe\xb8(\xd5\xfe\xd5\x02\xab\xfe\xd5\xfe\xa4\x01<\x01\xa0\xfe`(8\xfd\x80\x01\x00(`\xfc\xf8\x04\x80\xfe`(8\xfd\x80\x00\x00\x00\x01\x00\x04\xff\x84\x05|\x05|\x00?\x00\x00%\x14\x06#\"'\x01&54632\x17\x01\x16\x15\x14\x06#\"'\x01&#\"\x06\x15\x14\x17\x01\x1632654'\x01&#\"\x06\x15\x14\x17\x01\x16\x15\x14\x06#\"'\x01&54632\x17\x01\x16\x05|\x9eu\x87d\xfc\xf7qܟ\x9es\x02]\n=\x10\r\n\xfd\xa2Ofj\x92L\x03\b?R@T?\xfd\xbb\x1a\"\x1d&\x19\x01\x9a\n>\x10\f\n\xfef?rRX=\x02Ed\x97u\x9ed\x03\bs\x9c\x9f\xdeq\xfd\xa2\n\f\x10=\n\x02_M\x96jiL\xfc\xf7?T@R?\x02E\x18&\x1d \x1b\xfef\n\f\x10>\n\x01\x9a=XRr?\xfd\xbbb\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00!\x001\x00E\x00\x00)\x01\x11!\x013\x114&'\x01.\x01#\x11\x14\x06#!\"&5\x11#\x113\x11463!2\x16\x15\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x05\x11\x14\x06#!\"&5\x11463!2\x16\x17\x01\x1e\x01\x01\x80\x03\x00\xfd\x00\x03\x80\x80\x14\n\xfe\xe7\n0\x0f8(\xfd\xc0(8\x80\x808(\x03@(8\xfe\x80\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x808(\xfa\xc0(88(\x03\xa0(`\x1c\x01\x18\x1c(\x01\x80\xfe\x80\x03\x80\x0e1\n\x01\x19\n\x14\xfe`(88(\x01\xa0\xfb\x00\x01\xa0(88(\x02\x00\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x13\xfc`(88(\x05@(8(\x1c\xfe\xe8\x1c`\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x04`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x05\x00\x00\x0f\x00\x1f\x00/\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x00\x06\x00\x00\xff\xc0\a\x00\x05@\x00\a\x00\x0f\x00\x1f\x00'\x007\x00G\x00\x00$\x14\x06\"&462\x12\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x00\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80p\xa0pp\xa0pp\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfa\x80p\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13Рpp\xa0p\x01\x90\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x03\xe3\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x06\x00\x0f\xff\x00\a\x00\x05\xf7\x00\x1e\x00<\x00L\x00\\\x00l\x00|\x00\x00\x05\x14\x06#\"'7\x1632654\a'>\x0275\"\x06#\x15#5!\x15\a\x1e\x01\x13\x15!&54>\x0354&#\"\a'>\x0132\x16\x15\x14\x0e\x02\a35\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15!5346=\x01#\x06\a'73\x11\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01}mQjB919\x1d+i\x1a\b1$\x13\x10A\x10j\x01M_3<\x02\xfe\x96\x06/BB/\x1d\x19.#U\x18_:IdDRE\x01\u007f\x05\xea\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\xfa\x80\xfe\xb1k\x01\x02\b*G\x88j\x05\xec\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13TP\\BX-\x1d\x1c@\b8\nC)\x12\x01\x025\x98Xs\fJ\x02@\x9f$\x123T4+,\x17\x19\x1b:;39SG2S.7\x19<\xfe\xc1\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x03vcc)\xa1)\f\x11%L\u007f\xfel\xfe}\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x005\x00e\x00\x00\x012\x16\x1d\x01\x14\x06#!\"&=\x01463%&'&5476!2\x17\x16\x17\x16\x17\x16\x15\x14\x0f\x01/\x01&'&#\"\a\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x03!\x16\x15\x14\a\x06\a\x06\a\x06\a\x06#\"/\x01&'&=\x014'&?\x0157\x1e\x02\x17\x16\x17\x16\x17\x1632767654'&\x06\xe0\x0e\x12\x12\x0e\xf9@\x0e\x12\x12\x0e\x01\xc3\x1c\x170\x86\x85\x01\x042uBo\n\v\x0e\x05\fT\x0e25XzrDCBB\xd5Eh:%\xec\x01\x9b\a)\x170%HPIP{rQ\x8c9\x0f\b\x02\x01\x01\x02f\x0f\x1e\x0f\x05#-+>;I@KM-/Q\"\x02\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12@#-bZ\xb5\x80\u007f\x13\f$&P{<\x12\x1b\x03\x06\x02\x958[;:XICC>\x14.\x1c\x18\xff\x00'5oe80#.0\x12\x15\x17(\x10\f\b\x0e\rl0\x1e&%,\x02\"J&\b9%$\x15\x16\x1b\x1a<=DTI\x1d\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00c\x00s\x00\x00\x13&/\x01632\x17\x163276727\a\x17\x15\x06#\"\a\x06\x15\x14\x16\x15\x17\x13\x16\x17\x16\x17\x16327676767654.\x01/\x01&'&\x0f\x01'73\x17\x167\x17\x16\x15\x14\a\x06\a\x06\a\x06\x15\x14\x16\x15\x16\x13\x16\a\x06\a\x06\a\x06\a\x06#\"'&'&'&5\x114'&\x0154&#!\"\x06\x1d\x01\x14\x163!260%\b\x03\r\x1b<4\x84\"VRt\x1e8\x1e\x01\x02<@<\x13\r\x01\x01\x0e\x06-#=XYhW8+0\x11$\x11\x15\a\x0f\x06\x04\x05\x13\"+d\x0e\x02T\xcdLx\x12\x06\x04-'I\x06\x0f\x03\b\x0e\x06\x15\x0f\x1a&JKkm\x92\xa7uw<=\x16\x10\x11\x19\x05V\x12\x0e\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x05!\x02\x02X\x01\x04\a\x03\x04\x01\x02\x0e@\t\t\x19\x0ev\r'\x06\xe5\xfe\xe8|N;!/\x1c\x12!$\x1c8:I\x9cOb\x93V;C\x15#\x01\x02\x03V\n\x03\r\x02&\r\a\x18\f\x01\v\x06\x0f\x1a\a(\v\x13\xfe\x87\xc3mL.A:9 !./KLwP\x9d\x01M\xbc\x19$\xfa\x82@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\n\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%54&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x80^B\xfa\xc0B^^B\x05@B^\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01N\xfb\xc0B^^B\x04@B^^\x00\x00\x00\x06\x00\x1b\xff\x9b\x06\x80\x06\x00\x00\x03\x00\x13\x00\x1b\x00#\x00+\x003\x00\x00\t\x01'\x01$\x14\a\x01\x06\"/\x01&47\x0162\x1f\x01%\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x04\xa6\x01%k\xfe\xdb\x02*\x12\xfa\xfa\x126\x12\xc6\x12\x12\x05\x06\x126\x12\xc6\xfa\xcbbb\x1e\x1ebb\x1e\x01|\xc4\xc4<<\xc4\xc4<\x03\xdebb\x1e\x1ebb\x1e\xfd\x9ebb\x1e\x1ebb\x1e\x03\xbb\x01%k\xfe\xdb\xd56\x12\xfa\xfa\x12\x12\xc6\x126\x12\x05\x06\x12\x12Ƒ\x1e\x1ebb\x1e\x1eb\xfe\xfc<<\xc4\xc4<<\xc4\xfd^\x1e\x1ebb\x1e\x1eb\x02\x1e\x1e\x1ebb\x1e\x1eb\x00\x00\x00\x04\x00@\xff\x80\a\x00\x05\x00\x00\a\x00\x10\x00\x18\x00M\x00\x00$4&\"\x06\x14\x162\x01!\x11#\"\x0f\x01\x06\x15\x004&\"\x06\x14\x162\x01\x11\x14\x0e\x04&#\x14\x06\"&5!\x14\x06\"&5#\"\x06.\x045463\x114&>\x03?\x01>\x01;\x015463!2\x16\x02\x80LhLLh\xfe\xcc\x01\x80\x9e\r\t\xc3\t\x05\x00LhLLh\x01L\b\x13\x0e!\f'\x03\x96Ԗ\xfe\x80\x96Ԗ@\x03'\f!\x0e\x13\b&\x1a\x01\x01\x04\t\x13\r\xc6\x13?\x1b\xa0&\x1a\x04\x00\x1a&LhLLhL\x02\x80\x01\x00\t\xc3\t\r\xfd\xaehLLhL\x04\xc0\xfc\x00\x0f\x17\x0e\t\x03\x01\x01j\x96\x96jj\x96\x96j\x01\x01\x03\t\x0e\x17\x0f\x1a&\x01@\b6\x16/\x1b\"\r\xc6\x13\x1a\xc0\x1a&&\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00J\x00\x00\x00\x10\x02\x04#\"'6767\x1e\x0132>\x0154.\x01#\"\x0e\x03\x15\x14\x16\x17\x167>\x0176'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17&\x0254\x12$ \x04\x06\x00\xce\xfe\x9f\xd1ok;\x13\t-\x14j=y\xbehw\xe2\x8ei\xb6\u007f[+PM\x1e\b\x02\f\x02\x06\x113ѩ\x97\xa9\x89k=J\x0e\b%\x1762>V\x19c\x11\x04\xce\xfe\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce ]G\"\xb1'9\x89\xf0\x96r\xc8~:`}\x86Ch\x9e \f \a0\x06\x17\x14=Z\x97٤\x83\xaa\xeeW=#uY\x1f2BrUI1\xfe^Fk[\x01|\xe9\xd1\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00L\x00\x00\x012\x16\x15\x11\x14\x06#!6767\x1e\x0132\x1254.\x02#\"\x0e\x03\x15\x14\x16\x17\x1667676'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17#\"&5\x11463\x04\xe0w\xa9\xa9w\xfd+U\x17\t,\x15i<\xb5\xe5F{\xb6jh\xb5}Z+OM\r\x15\x04\n\x05\x06\x112ϧ\x95\xa7\x87jX\x96բ\x81\xa8\xecW<\"uW\x1f1AqSH1\xfebd\x9a\xa9w\x03\xc0w\xa9\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1b\x00'\x007\x00\x00\x014'!\x153\x0e\x03#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x95\x06\xfe\x96\xd9\x03\x1b0U6c\x8c\x8cc\\=hl\x95\xa0\xe0ࠥ\xcb\x01Ymmnnnn\x01\x12\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02w\x1a&\x84\x1846#\x8eȎ;ed\xe1\xfe\xc2\xe1\xd2wnnnnn\x02\x85\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x02\x00\x00\xff\xa3\t\x00\x05]\x00#\x00/\x00\x00\x01\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x14\x1e\x0132>\x037!5!\x16%\x15#\x15#5#5353\x15\x05\x9d\xae\xfe\xbeЕ\xfe\xf0\xc4tt\xc4\x01\x10\x95\x01\x1e\xcd\xc7u\xaf{\xd1zz\xd1{S\x8bZC\x1f\x06\xfe`\x02\xb4\f\x03c\xd1\xd2\xd1\xd1\xd2\x02o\xd0\xfe\xbb\xb7t\xc4\x01\x10\x01*\x01\x10\xc4t\xc0\xbfq|\xd5\xfc\xd5|.EXN#\xfc??\xd2\xd1\xd1\xd2\xd1\xd1\x00\x00\x00\x04\x00\x00\x00\x00\a\x80\x05\x00\x00\f\x00\x1c\x00,\x00<\x00\x00\x01!5#\x11#\a\x17673\x11#$\x14\x0e\x02\".\x024>\x022\x1e\x01\x01\x11\"&5!\x14\x06#\x112\x16\x15!46\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x00\x01\x80\x80r\x94M*\r\x02\x80\x02\x00*M~\x96~M**M~\x96~M\x02*j\x96\xfb\x80\x96jj\x96\x04\x80\x96\xea&\x1a\xf9\x00\x1a&&\x1a\a\x00\x1a&\x01\x80`\x01\xc0\x89P%\x14\xfe\xe0挐|NN|\x90\x8c\x90|NN|\xfe*\x02\x00\x96jj\x96\xfe\x00\x96jj\x96\x03@\xfb\x80\x1a&&\x1a\x04\x80\x1a&&\x00\x00\x01\x00\x00\x01@\x04\x00\x03\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x03Z4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x01\x00\x04\x00\x03@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00@\x00\x80\x02\x80\x04\x80\x00\r\x00\x00\x01\x11\x14\x06\"'\x01&47\x0162\x16\x02\x80&4\x13\xfe@\x13\x13\x01\xc0\x134&\x04@\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x13&\x00\x00\x00\x01\x00\x00\x00\x80\x02@\x04\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"&5\x11462\x17\x01\x02@\x13\xfe@\x134&&4\x13\x01\xc0\x02\x9a4\x13\xfe@\x13&\x1a\x03\x80\x1a&\x13\xfe@\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00\x1d\x00\x003!\x11!\x11\x14\x16%\x11!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\xa0\x02`\xfd\x80\x13\x05m\xfd\x80\x02`\r\x13\x80^B\xfa\xc0B^^B\x05@B^\x04\x80\xfb\xa0\r\x13 \x04`\xfb\x80\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\xc0\x04\x00\x05@\x00\r\x00\x1b\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x12\x14\x06#!\"&47\x0162\x17\x01\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a&&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00\x00\xff\xc0\x04\x00\x02\x00\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x03\x00\x04\x00\x05@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x03Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00:\x00\x00\x01\x11\x14\x06#!\"&5\x11\x16\x17\x04\x17\x1e\x02;\x022>\x0176%6\x13\x14\x06\a\x00\a\x0e\x04+\x02\".\x03'&$'.\x015463!2\x16\a\x00^B\xfa@B^,9\x01j\x879Gv3\x01\x013vG9\xaa\x01H9+bI\xfe\x88\\\nA+=6\x17\x01\x01\x176=+A\n[\xfe\xaa\">nSM\x05\xc0A_\x03:\xfc\xe6B^^B\x03\x1a1&\xf6c*/11/*{\xde'\x01VO\x903\xfe\xfb@\a/\x1d$\x12\x12$\x1d/\a@\xed\x18*\x93?Nh^\x00\x03\x00\x00\xff\xb0\x06\x00\x05l\x00\x03\x00\x0f\x00+\x00\x00\x01\x11!\x11\x01\x16\x06+\x01\"&5462\x16\x01\x11!\x114&#\"\x06\a\x06\x15\x11!\x12\x10/\x01!\x15#>\x0332\x16\x01]\xfe\xb6\x01_\x01gT\x02Rdg\xa6d\x04\x8f\xfe\xb7QV?U\x15\v\xfe\xb7\x02\x01\x01\x01I\x02\x14*Gg?\xab\xd0\x03\x8f\xfc!\x03\xdf\x012IbbIJaa\xfc\xdd\xfd\xc8\x02\x12iwE3\x1e3\xfd\xd7\x01\x8f\x01\xf000\x90 08\x1f\xe3\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eoz\xce\x00\x01\x00(\xff\x15\x06\xeb\x05\xd8\x00q\x00\x00!\x14\x0f\x01\x06#\"'\x01&547\x01\a\x06\"'\x1e\x06\x15\x14\a\x0e\x05#\"'\x01&54>\x047632\x1e\x05\x17&47\x0162\x17.\x06547>\x0532\x17\x01\x16\x15\x14\x0e\x04\a\x06#\".\x05'\x16\x14\x0f\x01\x01632\x17\x01\x16\x06\xeb%k'45%\xfe\x95&+\xff\x00~\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\xfeh\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e\x01\\\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\x01\x98\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e~\x01\x00+54'\x01k%5%l%%\x01l$65+\x01\x00~\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\x01\x98\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e\x01\\\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\xfeh\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e~\xff\x00+%\xfe\x95'\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x00\x00\a\x00\x0f\x00!\x00)\x001\x009\x00K\x00\x00\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x136.\x01\x06\a\x03\x0e\x01\a\x06\x1e\x01676&$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x044&\"\x06\x14\x162\x01\x10\a\x06#!\"'&\x114\x126$ \x04\x16\x12\x01\x80KjKKj\x01\vKjKKj\x01\xf7e\x06\x1b2.\ae<^\x10\x14P\x9a\x8a\x14\x10,\x02bKjKKj\xfd\xcbKjKKj\x02\vKjKKj\x01\x8b\x8d\x13#\xfa\x86#\x13\x8d\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x01KjKKjK\x02\vjKKjK\xfe\x9f\x01~\x1a-\x0e\x1b\x1a\xfe\x82\x05M\x027>\x057&\x0254\x12$ \x04\x04L\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\xf0\x01\x9c\x01\xe8\x01\x9c\x04\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xc7\xfe\xa4\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\xae\x01'\xab\xab\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x14\x00:\x00d\x00\x00\x00 \x04\x06\x15\x14\x16\x1f\x01\a6?\x01\x17\x1632$64&$ \x04\x16\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546\x01\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x15\x14\x06\x03Y\xfe\xce\xfe\xf6\x9dj`a#\"\x1c,5NK\x99\x01\n\x9d\x9d\xfd\x9e\x01~\x01E\xbc\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x05:\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x8e\x04\x80h\xb2fR\x9888T\x14\x13\x1f\n\x0eh\xb2̲\xe8\x89\xec\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b\xec\xfb\xf8\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6{x\xd1\x00\x01\x00\x01\xff\x00\x03|\x05\x80\x00!\x00\x00\x01\x16\a\x01\x06#\"'.\x017\x13\x05\x06#\"'&7\x13>\x013!2\x16\x15\x14\a\x03%632\x03u\x12\v\xfd\xe4\r\x1d\x04\n\x11\x11\x04\xc5\xfej\x04\b\x12\r\x12\x05\xc9\x04\x18\x10\x01H\x13\x1a\x05\xab\x01\x8c\b\x04\x13\x03\xca\x14\x18\xfb{\x19\x02\x05\x1c\x10\x03(e\x01\v\x0f\x18\x039\x0e\x12\x19\x11\b\n\xfe1b\x02\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00U\x00\x00\x01\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015463!5#\"&5\x11463!2\x16\x15\x11\x14\x06+\x01\x15!2\x16\x1d\x0132\x16\a\x008(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`L4\x02\x00`(88(\x01@(88(`\x02\x004L`(8\x01 \xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc04L\xc08(\x01@(88(\xfe\xc0(8\xc0L4\xc08\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\xc0\x00\x13\x00O\x00Y\x00\x00\x01\x11\x14\x06\"&5462\x16\x15\x14\x16265\x1162\x05\x14\x06#\"'.\x01#\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01#\"\x06\a\x06#\"&5476\x00$32\x04\x1e\x01\x17\x16\x01\x15&\"\a5462\x16\x03\x80\x98И&4&NdN!>\x03!\x13\r\v\f1X:Dx+\a\x15\x04\v\x11\x12\v\x04\x15\a+w\x88w+\a\x15\x04\v\x12\x11\v\x04\x15\a+xD:X1\f\v\r\x13\x01-\x00\xff\x01U\xbe\x8c\x01\r\xe0\xa5!\x01\xfd\x00*,*&4&\x02\xc4\xfd\xbch\x98\x98h\x1a&&\x1a2NN2\x02D\v&\r\x13\n..J<\n$\x06\x11\x11\x06$\n\x01767\x14\a\x0e\x02\a\x16\x15\x14\a\x16\x15\x14\a\x16\x15\x14\x06#\x0e\x01\"&'\"&547&547&547.\x02'&54>\x022\x1e\x02\x02\xe0\x13\x1a\x13l4\r\x13\x13\r2cK\xa0Eo\x87\x8a\x87oED\n)\n\x80\r\xe4\r\x80\n)\nD\x80g-;<\x04/\x19\x19-\r?.\x14P^P\x14.?\r-\x19\x19/\x04<;-gY\x91\xb7\xbe\xb7\x91Y\x03\xc0\r\x13\x13\r.2\x13\x1a\x13 L4H|O--O|HeO\v,\v\x99\x91\x91\x99\v,\vOe\x9bq1Ls2\x1c6%\x1b\x1b%4\x1d\x17\x18.2,44,2.\x18\x17\x1d4%\x1b\x1b%6\x1c2sL1q\x9bc\xabqAAq\xab\x00\x02\x00\x00\xff\xa0\a\x00\x04\xe0\x00\x1a\x004\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&547\x01632\x16\x1d\x01!2\x16\x10\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\a\x00\x13\r\xfa\xa0\x13\r\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x05`\r\x13\t\xfe\xc0\t\x0e\r\x13\xfa\xa0\r\x13\x13\r\x05`\x12\x0e\f\f\x01?\x01`\xc0\r\x13\xc0\r\x13\n\x01@\t\r\x0e\t\x01@\t\x13\r\xc0\x13\x02!\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014&+\x01\x114&+\x01\"\x06\x15\x11#\"\x06\x15\x14\x17\x01\x1627\x016\x05\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\t\x01`\t\x1c\t\x01_\n\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02`\x0e\x12\x01`\r\x13\x13\r\xfe\xa0\x13\r\x0e\t\xfe\xa0\t\t\x01_\fԟ\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014'\x01&\"\a\x01\x06\x15\x14\x16;\x01\x11\x14\x16;\x01265\x11326\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\t\xfe\xa0\t\x1c\t\xfe\xa1\n\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02\xa0\x0e\t\x01`\t\t\xfe\xa1\f\f\x0e\x12\xfe\xa0\r\x13\x13\r\x01`\x13\xfe\xed\x9f\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x00\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00X\x00`\x00\x00$\x14\x06\"&462\x05\x14\x06#!\"&54>\x037\x06\x1d\x01\x0e\x01\x15\x14\x162654&'547\x16 7\x16\x1d\x01\"\x06\x1d\x01\x06\x15\x14\x162654'5462\x16\x1d\x01\x06\x15\x14\x162654'54&'46.\x02'\x1e\x04\x00\x10\x06 &\x106 \x01\x80&4&&4\x04&\x92y\xfc\x96y\x92\v%:hD\x16:Fp\xa0pG9\x19\x84\x01F\x84\x19j\x96 8P8 LhL 8P8 E;\x01\x01\x04\n\bDh:%\v\xfe\xc0\xe1\xfe\xc2\xe1\xe1\x01>\xda4&&4&}y\x8a\x8ayD~\x96s[\x0f4D\xcb\x14d=PppP=d\x14\xcb>\x1fhh\x1f>@\x96jY\x1d*(88(*\x1dY4LL4Y\x1d*(88(*\x1dYDw\"\nA\x1f4*\x13\x0f[s\x96~\x03\xd8\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x02\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00M\x00\x00\x004&\"\x06\x14\x1627\x14\x06\a\x11\x14\x04 $=\x01.\x015\x114632\x17>\x0132\x16\x14\x06#\"'\x11\x14\x16 65\x11\x06#\"&4632\x16\x17632\x16\x15\x11\x14\x06\a\x15\x14\x16 65\x11.\x015462\x16\x05\x00&4&&4\xa6G9\xfe\xf9\xfe\x8e\xfe\xf9\xa4\xdc&\x1a\x06\n\x11<#5KK5!\x1f\xbc\x01\b\xbc\x1f!5KK5#<\x11\n\x06\x1a&ܤ\xbc\x01\b\xbc9Gp\xa0p\x03&4&&4&@>b\x15\xfeu\x9f\xe1ោ\x14ؐ\x02\x00\x1a&\x02\x1e$KjK\x12\xfenj\x96\x96j\x01\x92\x12KjK$\x1e\x02&\x1a\xfe\x00\x90\xd8\x14\x84j\x96\x96j\x01\x8b\x15b>Ppp\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\r\x00\x1b\x00%\x00\x00\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x02\x80\x02\x00\xfe\x00\xfe\xa0@\\\x84\x84\\\x04\xa0\xfc\x00\x808(\x02@(8\x02\x00\x84\\@@\\\x84\x04\x80\x80\x80\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x02\x00@\xff\x00\x06\xc0\x06\x00\x00\v\x003\x00\x00\x044#\"&54\"\x15\x14\x163\x01\x14\x06#!\x14\x06\"&5!\"&5>\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\x03@L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x0104Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x03\x00\x00\xff\x80\a@\x05\x00\x00\a\x00\x0f\x00\"\x00\x00\x004&+\x01\x1132\x01!\x14\x06#!\"&\x00\x10\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x06\x80pP@@P\xf9\xf0\a\x00\x96j\xfb\x00j\x96\a@\xe1\x9f@\x84\\\xfd@\\\x84&\x1a\x04\x80\x9f\x030\xa0p\xfe\x80\xfd\xc0j\x96\x96\x04\t\xfe\xc2\xe1 \\\x84\x84\\\x02\xe0\x1a&\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00-\x00B\x00\x00\x01\x11\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015\x11462\x16\x15\x11\x14\x16265\x11462\x16\x15\x11\x14\x16265\x11462\x16\x05\x11\x14\x06+\x01\"&5\x11#\"&5\x11463!2\x16\x02\x80G9L4\x804L9G&4&&4&&4&&4&&4&\x03\x00L4\x804L\xe0\r\x13\xbc\x84\x01\x00\x1a&\x05\xc0\xfd\x80=d\x14\xfc\xf54LL4\x03\v\x14d=\x02\x80\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xf9\xc04LL4\x02\x00\x13\r\x03 \x84\xbc&\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01463!2\x16\x1d\x01\x14\x06#!\"&5\x052\x16\x1d\x01\x14\x06#!\"&=\x01463\x012\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\x00\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x02\xe0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03`\x0e\x12\x12\x0e@\x0e\x12\x12\x0e\xa0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xff\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01-\x01=\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x11!5463!2\x16\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xfb\x80\x01\x80\x13\r\x01@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfa\x93\x06\x00\xfa\x00\xe0\r\x13\x13\r\x05`\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x00\r\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xb7\x00\xdb\x00\xf5\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x15\x14\x06#!\"&=\x01!\x11!5463!2\x16\x15\x19\x014&+\x01\"\x06\x1d\x01#54&+\x01\"\x06\x15\x11\x14\x16;\x0126=\x013\x15\x14\x16;\x0126%\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x15\x11!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xff\x008(\xfe@(8\xff\x00\x01\x80\x13\r\x01@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x01@8(\x01\xc0(8\x01@\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfc\x93\x04\x80 (88( \xfb\x80\xe0\r\x13\x13\r\x03\xc0\x01@\r\x13\x13\r``\r\x13\x13\r\xfe\xc0\r\x13\x13\r``\r\x13\x13-\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01 (88(\xfe\xe0&\x00\x05\x00@\xff\x80\a\x80\x05\x80\x00\a\x00\x10\x00\x18\x00<\x00c\x00\x00$4&\"\x06\x14\x162\x01!\x11#\x06\x0f\x01\x06\a\x004&\"\x06\x14\x162\x1354&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01\x11\x14\x06+\x01\x14\x06\"&5!\x14\x06\"&5#\"&463\x1146?\x01>\x01;\x01\x11463!2\x16\x02\x80KjKKj\xfe\xcb\x01\x80\x9e\x0e\b\xc3\a\x02\x05\x00KjKKj\xcb\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x01\x00&\x1a\xc0\x96Ԗ\xfe\x80\x96Ԗ\x80\x1a&&\x1a\x1a\x13\xc6\x13@\x1a\xa0&\x1a\x04\x80\x1a&KjKKjK\x02\x80\x01\x00\x02\a\xc3\f\n\xfd\xadjKKjK\x03 \xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02.\xfb\x80\x1a&j\x96\x96jj\x96\x96j&4&\x01\xa0\x1a@\x13\xc6\x13\x1a\x01@\x1a&&\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x001\x00?\x00I\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x05\x00\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\xfd\x80\x02\x00\xfe\x00\xfe\x80 \\\x84\x84\\\x04\xc0\xfb\xc0\xa08(\x02@(8\x02\x00\x84\\ \\\x84\x01\xa0\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02\ue000\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x00\x00\x00\x01\x00\x00\x00\x00\a\x80\x04\x80\x00:\x00\x00\x01\x06\r\x01\a#\x0132\x16\x14\x06+\x0353\x11#\a#'53535'575#5#573\x173\x11#5;\x022\x16\x14\x06+\x01\x013\x17\x05\x1e\x01\x17\a\x80\x01\xfe\xe1\xfe\xa0\xe0@\xfe\xdbE\x1a&&\x1a`\xa0@@\xa0\xc0` \x80\xc0\xc0\x80 `\xc0\xa0@@\xa0`\x1a&&\x1aE\x01%@\xe0\x01`\x80\x90\b\x02@ @ @\xfe\xa0\t\x0e\t \x01\xa0\xe0 \xc0 \b\x18\x80\x18\b \xc0 \xe0\x01\xa0 \t\x0e\t\xfe\xa0@ \x1c0\n\x00\x00\x00\x02\x00@\x00\x00\x06\x80\x05\x80\x00\x06\x00\x18\x00\x00\x01\x11!\x11\x14\x163\x01\x15!57#\"&5\x11'7!7!\x17\a\x11\x02\x80\xff\x00K5\x04\x80\xfb\x80\x80\x80\x9f\xe1@ \x01\xe0 \x03\xc0 @\x02\x80\x01\x80\xff\x005K\xfe@\xc0\xc0\xc0\xe1\x9f\x01@@\x80\x80\xc0 \xfc\xe0\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00%\x114&+\x01\"\x06\x15\x11!\x114&+\x01\"\x06\x15\x11\x14\x16;\x01265\x11!\x11\x14\x16;\x0126\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\x80\x1a&\xfe\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x02\x00&\x1a\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xc0\x03\x80\x1a&&\x1a\xfe\xc0\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfe\xc0\x1a&&\x03\xba\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x1a\x80\x1a&\x01@\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&\x01@\x1a&&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00-\x00M\x03\xf3\x043\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x04\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x02s\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\x01\x8a\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\xad\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\x00\x00\x00\x02\x00\r\x00M\x03\xd3\x043\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x04\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x01\x8a\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x02\x00M\x00\x8d\x043\x04S\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x12\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\xed\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x01v\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x02\x00M\x00\xad\x043\x04s\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x12\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x02\xad\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x01v\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x01\x00-\x00M\x02s\x043\x00\x14\x00\x00\x00\x14\a\t\x01\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x02s\n\xfew\x01\x89\n\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\x03\xed\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\x00\x00\x00\x01\x00\r\x00M\x02S\x043\x00\x14\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x00\x01\x00M\x01\r\x043\x03S\x00\x14\x00\x00\x00\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\x01m\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x01\x00M\x01-\x043\x03s\x00\x14\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x03-\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x06\x00\x00\x0f\x00/\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x14\x1e\x01\x15\x14\x06#!\"&54>\x015!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd\xe0 &\x1a\xfe\x00\x1a& \xfd\xe0B^^B\x06@B^\x02 \x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x03M\xfb\xc0B^%Q=\r\x1a&&\x1a\x0e\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x94\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x04\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x05\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x03\x00pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x03\x80pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x02@\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8p\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x05\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x03\x00Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x03\x80Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x04\xc0\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80PppP\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80Ppp\x00\x00\x00\x00\b\x00@\xff@\x06\xc0\x06\x00\x00\t\x00\x11\x00\x19\x00#\x00+\x003\x00;\x00G\x00\x00$\x14\x06#\"&5462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&462\x16\x00\x14\x06\"&462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&54632\x16\x02\x0eK54LKj\x02=KjKKj\xfd\x8bKjKKj\x04\xfdL45KKjK\xfc<^\x84^^\x84\x04\xf0KjKKj\xfd\xcbp\xa0pp\xa0\x02\x82\x84\\]\x83\x83]\\\x84\xc3jKL45K\xfe\xe7jKKjK\x02ujKKjK\xfd\x8e4LKjKK\x03\xf1\x84^^\x84^\xfd\xa3jKKjK\x02\x90\xa0pp\xa0p\xfer]\x83\x83]\\\x84\x84\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x00\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x06\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x01\x14\x03\x0e\x02\a\x06#\"&5465654.\x05+\x01\x11\x14\x06\"'\x01&47\x0162\x16\x15\x113 \x13\x16\a\x00\u007f\x03\x0f\f\a\f\x10\x0f\x11\x05\x05#>bq\x99\x9bb\xe0&4\x13\xfe\x00\x13\x13\x02\x00\x134&\xe0\x02ɢ5\x01\xa0\xa6\xfe\xe3\a\"\x1a\t\x11\x14\x0f\t#\x06D7e\xa0uU6\x1f\f\xff\x00\x1a&\x13\x02\x00\x134\x13\x02\x00\x13&\x1a\xff\x00\xfem\x86\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\v\x00\x17\x001\x00X\x00\x00\x00\x14\x0e\x01\".\x014>\x012\x16\x04\x14\x0e\x01\".\x014>\x012\x16\x174&#\"\a\x06\"'&#\"\x06\x15\x14\x1e\x03;\x012>\x03\x13\x14\a\x0e\x04#\".\x04'&547&5472\x16\x17632\x17>\x013\x16\x15\x14\a\x16\x02\x80\x19=T=\x19\x19=T=\x02\x99\x19=T=\x19\x19=T=\xb9\x8av)\x9aG\xacG\x98+v\x8a@b\x92\x86R\xa8R\x86\x92b@\xe0=&\x87\x93\xc1\x96\\N\x80\xa7\x8a\x88j!>\x88\x1b3l\xa4k\x93\xa2\x94\x84i\xa4k3\x1b\x88\x01hPTDDTPTDDTPTDDTPTDD|x\xa8\x15\v\v\x15\xa8xX\x83K-\x0e\x0e-K\x83\x01\b\xcf|Mp<#\t\x06\x13)>dA{\xd0\xed\x9fRXtfOT# RNftWQ\xa0\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00\x17\x00,\x00\x00%\x114&#!\"&=\x014&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x008(\xfd@(88(\xfe\xc0(88(\x04\xc0(8\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\xe0\x02\xc0(88(@(88(\xfc@(88\x02\xe8\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x03\x00\x00\x00\x00\au\x05\x80\x00\x11\x00'\x00E\x00\x00\x014#!\"\x06\a\x01\x06\x15\x143!267\x016%!54&#!\"&=\x014&#!\"\x06\x15\x11\x01>\x01\x05\x14\a\x01\x0e\x01#!\"&5\x11463!2\x16\x1d\x01!2\x16\x1d\x0132\x16\x17\x16\x06\xf55\xfb\xc0([\x1a\xfe\xda\x125\x04@(\\\x19\x01&\x12\xfb\x8b\x03\x008(\xfd\xc0(88(\xfe\xc0(8\x01\x00,\x90\x059.\xfe\xd9+\x92C\xfb\xc0\\\x84\x84\\\x01@\\\x84\x02 \\\x84\xc06Z\x16\x0f\x02]#+\x1f\xfe\x95\x18\x10#,\x1f\x01k\x16\xb4\xa0(88(@(88(\xfc\xab\x01;5E\xa3>:\xfe\x955E\x84\\\x03\xc0\\\x84\x84\\ \x84\\\xa01. \x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x0e\x01\"&'&676\x16\x17\x1e\x01267>\x01\x1e\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n%\xca\xfe\xca%\b\x18\x1a\x19/\b\x19\x87\xa8\x87\x19\b02\x18\xfe\nKjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcdy\x94\x94y\x19/\b\b\x18\x1aPccP\x1a\x18\x10/\x01\xcfjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x16\x0e\x01&'.\x01\"\x06\a\x0e\x01'.\x017>\x012\x16\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n\b\x1820\b\x19\x87\xa8\x87\x19\b/\x19\x1a\x18\b%\xca\xfe\xca\xfe7KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x013\x19/\x10\x18\x1aPccP\x1a\x18\b\b/\x19y\x94\x94\x02\tjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x13\x00\x1b\x00+\x007\x00\x00\x00\x14\x06#!\"&463!2\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a\xfe&KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xda4&&4&\x01\xb5jKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\x00\x00\a\x80\x04\x00\x00#\x00+\x003\x00C\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x044&\"\x06\x14\x162\x004&\"\x06\x14\x162$\x10\x00#\"'#\x06#\"\x00\x10\x003!2\x03@\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x02@KjKKj\x01KKjKKj\x01K\xfe\xd4\xd4\xc0\x92ܒ\xc0\xd4\xfe\xd4\x01,\xd4\x03\x80\xd4\x01\xc0\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12gjKKjK\x01KjKKjK\xd4\xfeX\xfeԀ\x80\x01,\x01\xa8\x01,\x00\x00\x00\x0f\x00\x00\x00\x00\a\x80\x04\x80\x00\v\x00\x17\x00#\x00/\x00;\x00G\x00S\x00_\x00k\x00w\x00\x83\x00\x8f\x00\x9f\x00\xa3\x00\xb3\x00\x00\x01\x15\x14+\x01\"=\x014;\x0127\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14#!\"=\x0143!2%\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x05\x15\x14+\x01\"=\x014;\x012\x05\x11\x14+\x01\"=\x014;\x0154;\x012\x13\x11!\x11\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x10`\x10\x10`\x10\x80\x10\xe0\x10\x10\xe0\x10\x80\x10`\x10\x10`\x10\x04\x00\x10\xfc\xa0\x10\x10\x03`\x10\xfd\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\xfe\x00\x10`\x10\x10`\x10\x01\x00\x10`\x10\x10`\x10\x01\x00\x10\xe0\x10\x10p\x10`\x10\x80\xf9\x80\a\x00K5\xf9\x805KK5\x06\x805K\x01p`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfd\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\x01\xf0`\x10\x10`\x10\x10`\x10\x10`\x10\x10\xfe\xa0\x10\x10`\x10\xf0\x10\xfd\x00\x03\x80\xfc\x80\x03\x80\xfc\x805KK5\x03\x805KK\x00\x00\x00\x00\x03\x00@\xff\x80\a\x00\x05\x80\x00\x16\x00*\x00V\x00\x00\x01\x11\x06#\"'.\x01#\"\a\x11632\x1e\x02\x1f\x01\x1632\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x06\x80\xa9\x89R?d\xa8^\xad\xe6\xf5\xbc7ac77\x1c,9x\xfbm#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x01\xeb\x02h[ 17\u007f\xfd\xa9q\x0f%\x19\x1b\x0e\x16\x03q#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x00\x06\x00@\xff\x80\a\x00\x05\x80\x00\x05\x00\v\x00*\x002\x00F\x00r\x00\x00\x015\x06\a\x156\x135\x06\a\x156\x015\x06'5&'.\t#\"\a\x1532\x16\x17\x16\x17\x15\x1632\x135\x06#\"'\x15\x16\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x03@\xb5\xcbͳ\xac\xd4\xd7\x03\xe9\xeb\x95\x14\x13\x058\r2\x13.\x1a,#,\x16\x17\x1a\x13f\xb5k\x13\x14*1x\xad\xa9\x89-!\x94\xfb\xac#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x02\x18\xc0\x10e\xb9`\x01\xb0\xc5\bv\xbdo\xfe8\xb8t-\xe0\x06\t\x03\x1c\x06\x18\a\x13\x06\v\x04\x04\x03\xde:5\t\x06\xbc\x11\x02\a\xbd[\b\xc4*\x01\xee#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x02\x00\r\x00\x00\x06\x80\x043\x00\x14\x00$\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x01\x15\x14\x06#!\"&=\x01463!2\x16\x02I\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x04-\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x02)\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\xfe-@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x00\x03\x00-\xff\x93\aS\x04\xed\x00\x14\x00$\x009\x00\x00%\a\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x16\x14\t\x01\x0e\x01/\x01.\x017\x01>\x01\x1f\x01\x1e\x01\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x02i2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\x02E\xfe\x8b\x04\x17\f>\r\r\x04\x01u\x04\x17\f>\r\r\x02\x8d\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x892\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\x04!\xfa\xf5\r\r\x04\x11\x04\x17\r\x05\v\r\r\x04\x11\x04\x17\xfdh\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\xbb\x00\x15\x00;\x00\x00\x01\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x1d\x01\x01\x06\x14\x17\x01\x14\x0e\x03\a\x06#\"'&7\x12'.\x01'\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x15\x11\x04\x17\x16\x02\x80'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\xfes\x13\x13\x06\r\"+5\x1c\x06\b\x14\x06\x03\x19\x02+\x95@ա'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\x01\x9b\xbc\xa9\x01\xc6F*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*E\xfer\x134\x13\xfeM:\x97}}8\f\x11\x01\b\x1a\x01\x90\xa5GO\r\xfb*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*\xfe\xfa\x1c\xc1\xad\x00\x00\x00\x00\x02\x00\x02\xff\xad\x06~\x05\xe0\x00\n\x00(\x00\x00\x01-\x01/\x01\x03\x11\x17\x05\x03'\t\x01\x13\x16\x06#\"'%\x05\x06#\"&7\x13\x01&67%\x13632\x17\x13\x05\x1e\x01\x04\xa2\x01\x01\xfe\x9cB\x1e\x9f;\x01><\f\x01\xf5\xfe\x95V\x05\x16\x17\x11\x17\xfe?\xfe?\x17\x11\x17\x16\x05V\xfe\x94 \x12-\x01\xf6\xe1\x14\x1d\x1c\x15\xe1\x01\xf6-\x12\x02C\xfa4\n<\x01B\xfc=\x1f\xa8\x01cB\x015\xfe\x9e\xfe\f!%\f\xec\xec\f%!\x01\xf4\x01b 7\aI\x01\xc7))\xfe9I\a7\x00\x00\x00\x01\x00\x02\xff\x80\x05\x80\x05\x00\x00\x16\x00\x00\t\x01\x06#\"'.\x015\x11!\".\x0167\x01632\x17\x1e\x01\x05y\xfd\x80\x11(\x05\n\x16\x1b\xfd\xc0\x16#\n\x12\x14\x05\x00\r\x10\x1b\x12\x0f\a\x04\xa3\xfb\x00#\x02\x05#\x16\x02@\x1b,(\n\x02\x80\a\x13\x0e)\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x02\x00\x05\x008\x00\x00\x01!\x11\t\x01!\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\"&5\x11#\"&=\x0146;\x01546;\x012\x16\x1d\x01!762\x17\x16\x14\x0f\x01\x1132\x16\x02-\x02S\xfd\x80\x02S\xfd\xad\x04\x80\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xfc\xa0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\x03S\xf6\n\x1a\n\t\t\xf7\xe0\x0e\x12\x01\x00\x02S\xfd\xda\x02S\xfd`\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x03`\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xf7\t\t\n\x1a\n\xf6\xfc\xad\x12\x00\x00\x00\x04\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00K\x00\x00$4&\"\x06\x14\x162\x124&\"\x06\x14\x162\x044&\"\x06\x14\x1627\x14\x06\a\x02\a\x06\a\x0e\x01\x1d\x01\x1e\x01\x15\x14\x06\"&5467\x11.\x015462\x16\x15\x14\x06\a\x1167>\x055.\x015462\x16\x01 8P88P88P88P\x02\xb88P88P\x984,\x02\xe0C\x88\x80S,4p\xa0p4,,4p\xa0p4,6d7AL*'\x11,4p\xa0p\x18P88P8\x04\xb8P88P8HP88P8`4Y\x19\xfe\xe1\u007f&+(>E\x1a\x19Y4PppP4Y\x19\x034\x19Y4PppP4Y\x19\xfe\x0f\x1a\x1f\x11\x19%*\x0154&#\"\a\x06\a\x06#\"/\x01.\x017\x12!2\x1e\x02\x02\xc0\x18\x10\xf0\x10\x18\x18\x10\xf0\x10\x18\x01<\x1f'G,')7\x18\x10\xf0\x0f\x15\x82N;2]=A+#H\r\x12\f\r\xa4\r\x05\b\xa0\x010P\xa2\x82R\x01\x18\xf0\x10\x18\x18\x10\xf0\x10\x18\x18\x02H6^;<\x1b\x16\x17T\x19\x11\x1f%\x13-S\x93#\x1b:/*@\x1d\x19Z\x10\b}\n\x1e\r\x01\n>h\x97\x00\x00\x00\x02\x00\x00\x00\x00\x02\x80\x05\x80\x00\x1e\x00.\x00\x00%\x15\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x01463!2\x16\x15\x1132\x16\x03\x15\x14\x06#!\"&=\x01463!2\x16\x02\x80&\x1a\xfe\x00\x1a&&\x1a@@\x1a&&\x1a\x01\x80\x1a&@\x1a&\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\xfd\xc0&\x04f\xc0\x1a&&\x1a\xc0\x1a&&\x00\x00\x02\x00b\x00\x00\x02\x1e\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x03\x0e\x01#!\"&'\x03&63!2\x16\x02\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x1e\x1c\x01'\x1a\xff\x00\x1a'\x01\x1c\x01%\x1a\x01@\x1a%\x01 \xe0\x1a&&\x1a\xe0\x1a&&\x04\x06\xfd\x00\x1a&&\x1a\x03\x00\x1a&&\x00\x02\x00\x05\x00\x00\x05\xfe\x05k\x00%\x00J\x00\x00%\x15#/\x01&'#\x0e\x02\a\x06\x0f\x01!53\x13\x03#5!\x17\x16\x17\x16\x1736?\x02!\x15#\x03\x13\x01\x15!'&54>\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x04\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xea\xfd\xfe\x03\x044NZN4;)3.\x0e\x16i\x1a%Sin\x881KXL7\x03觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\x02\xa7\xce\x1b\x1c\x12@jC?.>!&1'\v\x1b\\%\x1dAwc8^;:+\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x03\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xec\xfd\xfe\x04\x034NZN4;)3.\x0e\x16i\x1a%Pln\x88EcdJ\x04觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\xd9\xce\x1b-\x01@jC?.>!&1'\v\x1b\\%\x1dAwcBiC:D'P\x00\x00\x00\x02\x00\x01\x00\x00\a\u007f\x05\x00\x00\x03\x00\x17\x00\x00%\x01!\t\x01\x16\x06\a\x01\x06#!\"&'&67\x0163!2\x16\x03\x80\x01P\xfd\x00\xfe\xb0\x06\xf5\x0f\v\x19\xfc\x80&:\xfd\x00&?\x10\x0f\v\x19\x03\x80&:\x03\x00&?\x80\x01\x80\xfe\x80\x045\"K\x1c\xfc\x00,)\"\"K\x1c\x04\x00,)\x00\x00\x01\x00\x00\xff\xdc\x06\x80\x06\x00\x00h\x00\x00\x01\x14\x06#\".\x02#\"\x15\x14\x16\a\x15\"\a\x0e\x02#\"&54>\x0254&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06#\"'.\x01/\x01\"'\"5\x11\x1e\x02\x17\x16327654.\x0254632\x16\x15\x14\x0e\x02\x15\x14\x163267\x15\x0e\x02\a\x06\x15\x14\x17\x1632>\x0232\x16\x06\x80YO)I-D%n \x01\x16\v\"\u007fh.=T#)#lQTv\x1e%\x1e.%P_\x96\t%\t\r\x01\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1evUPl#)#T=@\xe8/\x01\x05\x05\x01\x18#,-\x1691P+R[\x01\xb6Ql#)#|'\x98'\x05\x01\x03\x11\n59%D-I)OY[R+P19\x16-,#\x18\x02\x04\x02\x02\x01\x01\x04\x00\x01\x05\x05\x01\x18#,-\x1691P+R[YO)I-D%95\x1e\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1ev\x00\x00\x02\x00\x00\xff\x80\x04\x80\x06\x00\x00'\x003\x00\x00\x01\x15\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&\x00=\x01462\x16\x1d\x01\x14\x00 \x00=\x01462\x16\x01\x11\x14\x06 &5\x1146 \x16\x04\x80\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00\xd9\xfe\xd9&4&\x01\a\x01r\x01\a&4&\xff\x00\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x03@\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\x18\x01G݀\x1a&&\x1a\x80\xb9\xfe\xf9\x01\a\xb9\x80\x1a&&\x01f\xfe\x00\x84\xbc\xbc\x84\x02\x00\x84\xbc\xbc\x00\x03\x00\r\xff\x80\x05s\x06\x00\x00\v\x00C\x00K\x00\x00\x01\a&=\x01462\x16\x1d\x01\x14\t\x01\x15\x14\x06#\"'\a\x1632\x00=\x01462\x16\x1d\x01\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&'\a\x06\"/\x01&47\x0162\x1f\x01\x16\x14%\x01\x114632\x16\x01\x0fe*&4&\x04i\xfe\x97\xbc\x8476`al\xb9\x01\a&4&\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00}n\xfe\n\x1a\nR\n\n\x04\xd2\n\x1a\nR\n\xfez\xfd\x93\xbc\x84f\xa5\x02Oego\x80\x1a&&\x1a\x805\x02\x1e\xfe\x97\x80\x84\xbc\x13`3\x01\a\xb9\x80\x1a&&\x1a\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\rD\xfe\n\nR\n\x1a\n\x04\xd2\n\nR\n\x1az\xfd\x93\x02\x00\x84\xbcv\x00\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x06\x00\"\x00\x00\x01\x11!\x11676\x13\x11\x14\x0e\x05\a\x06\"'.\x065\x11463!2\x16\x04@\xfe@w^\xeb\xc0Cc\x89t~5\x10\f\x1c\f\x105~t\x89cC&\x1a\x04\x80\x1a&\x02@\x02\x80\xfb\x8f?J\xb8\x03\xb0\xfd\x00V\xa9\x83|RI\x1a\a\x06\x06\a\x1aIR|\x83\xa9V\x03\x00\x1a&&\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\x13\x00#\x00G\x00\x00\x17!\x11!%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x05\x80\xfa\x80\x01\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x04\x00\xc0\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12\x0e\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12N\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x02\x00\x03\xff\x80\x05\x80\x05\xe0\x00\a\x00L\x00\x00\x004&\"\x06\x14\x162%\x11\x14\a\x06#\"'%.\x015!\x15\x1e\x01\x15\x11\x14\x06#!\"&5\x114675#\"\x0e\x03\a\x06#\"'.\x017>\x047&5462\x16\x15\x14\a!467%632\x17\x16\x02\x00&4&&4\x03\xa6\f\b\f\x04\x03\xfe@\v\x0e\xff\x00o\x91&\x1a\xfe\x00\x1a&}c ;pG=\x14\x04\x11(\x10\r\x17\x11\f\x05\x138Ai8\x19^\x84^\x0e\x01.\x0e\v\x01\xc0\x03\x04\f\b\f\x05&4&&4&`\xfe\xc0\x10\t\a\x01`\x02\x12\vf\x17\xb0s\xfc\xe0\x1a&&\x1a\x03 j\xa9\x1eo/;J!\b#\a\f2\x18\n KAE\x12*,B^^B!\x1f\v\x12\x02`\x01\a\t\x00\x00\x02\x00$\xff \x06\x80\x05\x80\x00\a\x00-\x00\x00\x004&\"\x06\x14\x162\x01\x14\x02\a\x06\a\x03\x06\a\x05\x06#\"/\x01&7\x13\x01\x05\x06#\"/\x01&7\x1367%676$!2\x16\x05\xa08P88P\x01\x18\x97\xb2Qr\x14\x02\x0e\xfe\x80\a\t\f\v@\r\x05U\xfe\xe7\xfe\xec\x03\x06\x0e\t@\x11\f\xe0\n\x10\x01{`P\xbc\x01T\x01\x05\x0e\x14\x04\x18P88P8\x01\x80\xf9\xfe\x95\xb3P`\xfe\x85\x10\n\xe0\x04\t@\x0e\x12\x01\x14\x01\x19U\x01\t@\x13\x14\x01\x80\x0e\x02\x14rQ\xbb\x8e\x13\x00\x00\x00\x01\x00\x00\x00\x00\x06\xd1\x05\x00\x00\x16\x00\x00\x01\x03!\x136'&+\x01\x03!\x13!\x03!\x13\x03!2\x16\x17\x1e\x01\x06Ѥ\xfe\xb2\xb2\r\x1c\x1b8\xa9\xcc\xfe\xb2\xcc\xfe\xe2\xcc\xfe\xb2̙\x04\xfce\xb1;<*\x02\xfb\xfd\x05\x03@8 !\xfcG\x03\xb9\xfcG\x03\xb9\x01GQII\xbf\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%764'\t\x0164/\x01&\"\a\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x8df\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x13\x01\xc6\x134\x02\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8df\x134\x13\x013\x013\x134\x13f\x13\x13\xfe:\x134\x13\xfe:\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164'\x01&\"\x0f\x01\x06\x14\x17\t\x01\x06\x14\x1f\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xcd\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x13f\x134\x03F\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8d\x01\xc6\x134\x13\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00\x01764'\x01&\"\a\x01\x06\x14\x1f\x01\x1627\t\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x8df\x13\x13\xfe:\x134\x13\xfe:\x13\x13f\x134\x13\x013\x013\x134\x01\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x8df\x134\x13\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x01\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164/\x01&\"\a\t\x01&\"\x0f\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03-\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x13\x01\xc6\x134\x02\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xed\x01\xc6\x134\x13f\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x02w\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff@\x05\x80\x05\x80\x00\x11\x00\x16\x00\x00\x017!\x13!\x0f\x01/\x01#\x13\x0535%\x13!'\x01!\x03\x05%\x04j\x10\xfc\x8c/\x02d\x16\xc5\xc4\r\xaf\x16\x01j\x04\x01g2\xfd|\x0f\xfe8\x05\x80\x80\xfd\xbe\xfd\xc2\x03\xab\xaf\xfd\xea\xe455\x8c\xfe\xead\x01c\x02 \xb5\x01\xd5\xfab\xa2\xa2\x00\x00\x00\x01\x00\f\xff@\x06\xf4\x05\x80\x00\x0f\x00\x00\x01!\t\x02\x13!\a\x05%\x13!\x13!7!\x01\x13\x05\xe1\xfe\xf6\xfc\xdc\xfdFG\x01)\x1d\x01\xa6\x01\xe6D\xfbH:\x04\xb9&\xfbH\x05\x80\xfa\xcb\xfe\xf5\x01\v\x01d\x93\xa1\xa1\x01S\x01)\xbf\x00\x00\x00\x02\x00\x00\xff\x10\a\x00\x06\x00\x00\a\x00U\x00\x00\x004&\"\x06\x14\x162\x01\x11\x14\a\x06#\"/\x01\x06\x04 $'\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\x1e\x01\x17\x11#\"&=\x0146;\x015.\x015462\x16\x15\x14\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x11>\x017'&763!2\x16\x03\xc0&4&&4\x03f\x14\b\x04\f\v]w\xfeq\xfe4\xfeqw]\t\x0e\x04\b\x14\x12\x0e\x01`\x16\b\b\x0fdC\xf5\x95\xc0\x1a&&\x1a\xc0:F\x96ԖF:\xc0\x1a&&\x1a\xc0\x95\xf5Cd\x0f\b\b\x16\x01`\x0e\x12\x04\xe64&&4&\xfc\xa0\xfe\xa0\x16\b\x02\t]\x8f\xa7\xa7\x8f]\t\x02\b\x16\x01`\x0e\x12\x14\x13\x10d[}\x14\x02\x87&\x1a\x80\x1a&\xa3\"uFj\x96\x96jFu\"\xa3&\x1a\x80\x1a&\xfdy\x14}[d\x10\x13\x14\x12\x00\x01\x00\x00\x00\x00\x04\x80\x06\x00\x00#\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x01\x114\x00 \x00\x15\x14\x06+\x01\"&54&\"\x06\x15\x11\x04 (88(\xfc@(88( \x01\a\x01r\x01\a&\x1a@\x1a&\x96Ԗ\x03\x008(\xfd\xc0(88(\x02@(8\x01@\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1aj\x96\x96j\xfe\xc0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00'\x003\x00\x00\x00\x14\x06\"&462\x00\x10& \x06\x10\x16 \x00\x10\x00 \x00\x10\x00 \x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4\x01\x16\xe1\xfe\xc2\xe1\xe1\x01>\x01a\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8\x01\xacf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\xfea\x01>\xe1\xe1\xfe\xc2\xe1\x02T\xfeX\xfe\xd4\x01,\x01\xa8\x01,\xfd~\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x03 \xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88\x00\x00\x00\x00\x03\x00\x00\x00\x00\x01\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x1b\x005\x00E\x00\x00$4&\"\x06\x14\x162%&\x00'&\x06\x1d\x01\x14\x16\x17\x1e\x01\x17\x1e\x01;\x0126%&\x02.\x01$'&\a\x06\x1d\x01\x14\x16\x17\x16\x04\x12\x17\x1e\x01;\x01276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00KjKKj\x01\xaa\r\xfe\xb9\xe9\x0e\x14\x11\r\x9a\xdc\v\x01\x12\r\x80\r\x14\x01\u007f\x05f\xb1\xe9\xfe\xe1\x9a\x0e\t\n\x12\r\xcc\x01\\\xd1\a\x01\x12\r\x80\r\n\v\x01\x1f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xcbjKKjK\"\xe9\x01G\r\x01\x14\r\x80\r\x12\x01\vܚ\r\x11\x14\r\x9a\x01\x1f\xe9\xb1f\x05\x01\n\n\r\x80\r\x12\x01\a\xd1\xfe\xa4\xcc\r\x12\n\t\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0164'\x01&\a\x06\x15\x11\x14\x17\x16327\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03\xb2 \xfd\xe0\x1f! \x10\x10\x11\x0f\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfd\x97\x12J\x12\x01@\x13\x12\x13%\xfd\x80%\x13\b\t\x00\x03\x006\xff5\x06\xcb\x05\xca\x00\x03\x00\x13\x00/\x00\x00\t\x0564'\x01&\"\a\x01\x06\x14\x17\x01\x162\t\x01\x06\"/\x0164&\"\a'&47\x0162\x1f\x01\x06\x14\x1627\x17\x16\x14\x04\x00\x01<\xfd\xc4\xfe\xc4\x01i\x02j\x13\x13\xfe\x96\x126\x12\xfd\x96\x13\x13\x01j\x126\x03\x8b\xfcu%k%~8p\xa08}%%\x03\x8b%k%}8p\xa08~%\x04<\xfe\xc4\xfd\xc4\x01<\xfei\x02j\x134\x13\x01j\x12\x12\xfd\x96\x134\x13\xfe\x96\x12\x02\x8f\xfct%%~8\xa0p8~%k%\x03\x8a%%}8\xa0p8}%k\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&&\x1a\x80\x1a&&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x03@\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x01\x00\x03\x00\x00\x03\xfa\x05\u007f\x00\x1c\x00\x00\x01\x06+\x01\x11\x14\x06#!\"'&?\x0163!\x11#\"'&7\x0162\x17\x01\x16\x03\xfa\x12(\xc0\x12\x0e\xfd@\x15\b\b\f\xa0\t\x10\x01@\xc0(\x12\x11\x1a\x01@\x12>\x12\x01@\x1b\x03\xa5%\xfc\xa0\x0e\x12\x12\x14\x0f\xc0\v\x02\x80%%\x1f\x01\x80\x16\x16\xfe\x80 \x00\x00\x00\x01\x00\x03\xff\x80\x03\xfa\x05\x00\x00\x1b\x00\x00\x13!2\x16\x15\x1132\x16\a\x01\x06\"'\x01&76;\x01\x11!\"/\x01&76 \x02\xc0\r\x13\xc0($\x1b\xfe\xc0\x12>\x12\xfe\xc0\x1a\x11\x12(\xc0\xfe\xc0\x0e\v\xa0\r\t\t\x05\x00\x13\x0e\xfc\xa1J \xfe\x80\x16\x16\x01\x80\x1f&%\x02\x80\v\xc0\x0e\x14\x13\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00$\x00\x00%\x0164/\x01&\"\a\x01'&\"\x0f\x01\x06\x14\x17\x01\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad\x02f\x13\x13f\x134\x13\xfe-\xd3\x134\x13f\x13\x13\x01f\x134\x03f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xed\x02f\x134\x13f\x13\x13\xfe-\xd3\x13\x13f\x134\x13\xfe\x9a\x13\x03\x86\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x06\x00\x10\x00\x15\x00\x1f\x00/\x00\x00\x01\x17\a#5#5\x01\x16\a\x01\x06'&7\x016\t\x03\x11\x01764/\x01&\"\x0f\x01%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x94\x9848`\x01\xd2\x0e\x11\xfe\xdd\x11\r\x0e\x11\x01#\x11\xfe\xfb\x02 \xfe\xe0\xfd\xe0\x03\x80\\\x1c\x1c\x98\x1cP\x1c\\\x02\xa0\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xac\x984`8\x01\xba\r\x11\xfe\xdd\x11\x0e\r\x11\x01#\x11\xfd@\x02 \x01 \xfd\xe0\xfe\xe0\x02`\\\x1cP\x1c\x98\x1c\x1c\\`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00)\x00\x00\x01\x114&#!\"\a\x06\x1f\x01\x01\x06\x14\x1f\x01\x1627\x01\x17\x163276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe *\x11\x11\x1f\x90\xfd\xea\x13\x13f\x134\x13\x02\x16\x90\x12\x1b\f\r'\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02`\x01\xe0\x1a&')\x1d\x90\xfd\xea\x134\x13f\x13\x13\x02\x16\x90\x13\x05\x11\x02*\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00\t\x0164'\x01&\a\x06\x1d\x01\"\x0e\x05\x15\x14\x17\x163276'\x027>\x013\x15\x14\x17\x1632\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xed\x01`\x13\x13\xfe\xa0\x1e'(w\u0083a8!\n\xa7\v\x0e\a\x06\x16\x03,j.\xa8\x8c(\f\f\x1a\x02&\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xb3\x01`\x134\x13\x01`\x1f\x11\x11*\xa0'?_`ze<\xb5\xdf\f\x03\t\x18\x01bw4/\xa0*\x11\x05\x02\xc0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\x06\x00\x12\x00\x1e\x00\x00\x01-\x01\x01\x11\x01\x11\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\x80\x01\x00\xff\x00\x01\x80\xfe\x00\x03 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xc0\x80\x80\x01O\xfd\xe2\xff\x00\x02\x1e\xfe\xdd\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x16\a\x01\x06\"'\x01&763!2\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x12\x17\xfe\xc0\x13B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x98\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03]#\x1f\xfe@\x1b\x1b\x01\xc0\x1f##\xfd \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x06#!\"'&7\x0162\x17\x01\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x11(\xfd\x80(\x11\x12\x17\x01@\x13B\x13\x01@\x17u\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xa3###\x1f\x01\xc0\x1b\x1b\xfe@\x1f\xfe\xda\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x00\x14\a\x01\x06'&5\x11476\x17\x01\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04@\x1b\xfe@\x1f####\x1f\x01\xc0\xdb\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\xa1B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x11\x12\x17\xfe\xc0\xfd\xec\x03\xc0\x0e\x12\x12\x0e\xfc@\x0e\x12\x12\x03\xce\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x00\x00\x00\x03\xf3\x05\x80\x00`\x00\x00%\x17\x16\x06\x0f\x01\x0e\a#\"\x00'#\"&=\x0146;\x01&7#\"&=\x0146;\x016\x0032\x17\x16\x17\x16\x0f\x01\x0e\x01/\x01.\x05#\"\x06\a!2\x17\x16\x0f\x01\x06#!\x06\x17!2\x17\x16\x0f\x01\x0e\x01#!\x1e\x0132>\x04?\x016\x17\x16\x03\xd0#\x03\f\v\x05\x04\r\x13\x18\x1b!\"'\x13\xea\xfe\xa2?_\r\x13\x13\rB\x02\x03C\x0e\x12\x12\x0ebC\x01a\xe0f\\\v\t\x06\x03+\x03\x16\r\x04\x04\x0f\x14\x19\x1b\x1f\x0e~\xc82\x01\xd4\x10\t\n\x03\x18\x05\x1b\xfe\x18\x03\x03\x01\xcb\x0f\n\t\x03\x18\x02\x12\v\xfe}0\xcb\u007f\x12$\x1f\x1c\x15\x10\x04\x05\r\r\f\xe5\x9f\f\x15\x04\x01\x02\x03\x06\x05\x05\x05\x04\x02\x01\x05\xdd\x13\rq\r\x1390\x12\x0er\x0e\x12\xd2\x01\x00\x17\x03\f\v\r\x9f\r\r\x04\x01\x01\x03\x04\x03\x03\x02\x80p\f\f\x0er\x1a%D\f\f\x0fp\v\x0fu\x89\x03\x04\x05\x05\x04\x01\x02\x05\a\a\x00\x00\x01\x00\x00\x00\x00\x03\xfc\x05\x80\x00?\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x0146;\x0154632\x17\x1e\x01\x0f\x01\x06\a\x06'.\x02#\"\x06\x1d\x01!2\x16\x1d\x01\x14\x06#!\x11!546;\x012\x16\x03\xfc\x12\x0e\xfcD\x0e\x12\x13\ra_\x0e\x12\x12\x0e_\xf7\xbf\xb9\x96\t\x02\bg\t\r\r\n\x05*`-Uh\x011\r\x13\x13\r\xfe\xcf\x01\x9e\x12\x0e\xa2\x0e\x12\x01\x8f\xfe\x91\x0e\x12\x12\x0e\x96\r\x13\x01\u007f\x13\r\x83\x0e\x12߫\xde}\b\x19\n\u007f\v\x01\x02\t\x05\x1c$^L\xd7\x12\x0e\x83\r\x13\xfe\x85\xb5\r\x13\x13\x00\x00\x00\x01\x004\xff\x00\x03\xd2\x06\x00\x00b\x00\x00\x01\x14\x06\a\x15\x14\x06+\x01\"&=\x01.\x04'&?\x01676\x170\x17\x16\x17\x1632654.\x03'.\b5467546;\x012\x16\x1d\x01\x1e\x04\x17\x16\x0f\x01\x06\a\x06'.\x04#\"\x06\x15\x14\x1e\x04\x17\x1e\x06\x03\xd2ǟ\x12\x0e\x87\r\x13B{PD\x19\x05\x11\x0fg\a\x10\x0f\t\x02q\x82%%Q{\x1e%P46'-N/B).\x19\x11ĝ\x13\r\x87\x0e\x129kC<\x12\x06\x11\fQ\b\x0f\x0e\r\x03\x177>W*_x\x11*%K./58`7E%\x1a\x01_\x99\xdd\x1a\xaf\x0e\x12\x13\r\xaf\t,-3\x18\x06\x15\x14\x87\n\x02\x02\v\x02c\x1a\bVO\x1c2\")\x17\x15\x10\x12#\x1b,)9;J)\x8a\xd0\x1e\xb4\r\x13\x12\x0e\xb0\x06\"!*\x10\x06\x12\x14\x92\x0f\x01\x03\n\x03\x12#\x1d\x17VD\x1a,'\x1b#\x13\x12\x14\x17/&>AX\x00\x01\x00\x00\x00\x00\x03\x82\x05\x80\x00>\x00\x00\x01\x15\x14\x06+\x01\x0e\x01\a\x16\x01\x16\a\x06+\x01\"'\x00'&=\x0146;\x01267!\"&=\x01463!&+\x01\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01\x16\x1732\x16\x03\x82\x12\x0e\xa8\x17Ԫ\xa7\x01$\x0e\n\b\x15\xc3\x10\t\xfe\xce\xc0\t\x13\rp\x84\xa1\x16\xfeU\x0e\x12\x12\x0e\x01\x9d9ӑ\r\x13\x12\x0e\x03@\x0e\x12\x12\x0e\xe9/\x11\xab\x0e\x12\x04*f\x0e\x12\x90\xb4\x14\xb2\xfe\x9a\x10\x12\x12\f\x01o\xcc\t\r\u007f\r\x13VR\x12\x0ef\x0e\x12q\x13\r\x85\x0e\x12\x12\x0ef\x0e\x12=S\x12\x00\x01\x00\x04\x00\x00\x03\xff\x05\x80\x00E\x00\x00!#\"&5\x11!\"&=\x01463!5!\"&=\x0146;\x01\x01&76;\x012\x17\x13\x16\x17>\x017\x136;\x012\x17\x16\a\x0132\x16\x1d\x01\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x11\x14\x06\x02[\xac\r\x13\xfe\xe0\r\x13\x13\r\x01 \xfe\xe0\r\x13\x13\r\xd6\xfe\xbf\b\b\n\x12\xc2\x13\n\xd7\x13%\n)\a\xbf\b\x15\xbf\x11\n\t\b\xfe\xc7\xd7\r\x13\x13\r\xfe\xde\x01\"\r\x13\x13\r\xfe\xde\x13\x12\x0e\x01J\x12\x0eg\r\x13U\x12\x0eh\r\x13\x02B\x10\x10\x10\x12\xfeW&W\x18X\x11\x01\xa4\x13\x10\x0e\x11\xfd\xbd\x13\rh\x0e\x12U\x13\rg\x0e\x12\xfe\xb6\r\x13\x00\x02\x00\x00\x00\x00\x05\x00\x05\x80\x00\a\x008\x00\x00\x004&#!\x11!2\x00\x10\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015#\"&=\x0146;\x01\x11463!2\x04\x13\x82j\xfe\xc0\x01@j\x01o\xfd\xc8\xfe\xac\x01\xf9\x0e\x12\x12\x0e\xfe\a\x13\r\xa7\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x02\x1b\xc8\x03g\xc8|\xfe@\x01\xa1\xfe~\xf4v\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12v\x12\x0e\x95\r\x13\x02u\x0e\x12\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\b\x00\f\x00\x10\x00\x19\x00\x1d\x00n\x00\x00\x01\x13#\x13\x16\x14\x1746\x137!\x17!3'#\x01\x13#\x13\x14\x16\x1746\x137!\x17\x05\x15\x14\x06+\x01\x03\x06+\x01\"'\x03#\x03\x06+\x01\"&'\x03#\"&=\x0146;\x01'#\"&=\x0146;\x01\x03&76;\x012\x17\x13!\x136;\x012\x17\x13!\x136;\x012\x17\x16\a\x0332\x16\x1d\x01\x14\x06+\x01\a32\x16\x02\x02Q\x9fK\x01\x01\x01t#\xfe\xdc \x01\xa1\x8b#F\x01\x9fN\xa2Q\x01\x01\x01o!\xfe\xd7\"\x02\x80\x12\x0eդ\a\x18\x9f\x18\a\xa6ѧ\a\x18\x9f\v\x11\x02\xa0\xd0\x0e\x12\x12\x0e\xaf!\x8e\x0e\x12\x12\x0emY\x05\n\n\x10\x89\x1a\x05Z\x01ga\a\x18~\x18\ab\x01m]\x05\x1a\x89\x10\n\n\x05[o\x0e\x12\x12\x0e\x91\"\xb3\x0e\x12\x01U\x01+\xfe\xd4\x01\x04\x01\x01\x05\x01\xac\x80\x80\x80\xfd\xd4\x01,\xfe\xd5\x01\x05\x01\x01\x04\x01\xad\x80\x80 @\x0e\x12\xfd\x98\x18\x18\x02h\xfd\x98\x18\x0e\n\x02h\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x01X\x0f\r\f\x18\xfe\x98\x01h\x18\x18\xfe\x98\x01h\x18\f\r\x0f\xfe\xa8\x12\x0e@\x0e\x12\x80\x12\x00\x00\x03\x008\xff\x00\x04\xe8\x05\x80\x003\x00H\x00\\\x00\x00\x01\x16\a\x1e\x01\a\x0e\x04\a\x15#5\"'\x15#\x11\"&+\x017327\x113&#\x11&+\x015\x172753\x156353\x15\x1e\x03\x034.\x04\"\x06#\x112\x162>\x06\x034.\x04\x0e\x01#\x112\x16>\x06\x04\x8f\x12\x95ut\r\a3Nt\u007fR\x9aP*\x9a\x12H\x13\xc8\x1fo2\b\x10\x06\n\rLo\xd4@!\x9aR(\x9aOzh=\xd1\x1e,GID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xee\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x1e\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xdf?jJrL6V\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x127>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x02/rr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x00\x00\x00\x00\x04\x00\"\xff\x00\x05\xce\x06\x00\x00\n\x00$\x007\x00V\x00\x00\x014&#\"\x06\x14\x16326\x01\x14\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x05\x15!53\x1146=\x01#\a\x06\x0f\x01'73\x11\x13\x14\x0e\x03#\"'&'7\x16\x17\x163267#\x0e\x01#\"&54632\x16\x05BX;4>ID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xd0\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xc3\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x04\xdf?jJrL6\xfb\xaa\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x12\xfcrr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x053>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x00\x00\x03\x00\x00\xff\x80\x06@\x05\x80\x00\v\x00\x1b\x00\\\x00\x00%4&#\"\x06\x15\x14\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x14\a\x16\x15\x16\a\x16\a\x06\a\x16\a\x06\a+\x02\".\x01'&'.\x015\x11467>\x01767>\x027>\x027632\x1e\x05\x15\x14\x0e\x01\a\x0e\x02\a!2\x16\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04\xa07\x0f\x03.\x11\x11\x0f'\t:@\x85$L\x11B\x9cWM{#\x1a&$\x19\x18h1D!\x12\x1a\t\t\a\v\x1c\x14\x13\x1a.I/!\x0f\t\x01\x13\x13\x12\x03\x0e\b\x04\x01\x15Nr\xc0\x1a&&\x1a\x1b%%\x02\x1b\xfd\x80\x1a&&\x1a\x02\x80\x1a&&\x1aV?, L=8=9%pEL\x02\x1f\x1b\x1a+\x01\x01%\x1a\x02\x81\x19%\x02\x02r@W!\x12<%*',<\x14\x13\x15\x1f2(<\x1e\x18&L,\"\x06\x18\x14\x0er\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06@\x05\x00\x00\v\x00\x1b\x00\\\x00\x00\x01\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26%\x16\x15\x0e\x01#!\x1e\x02\x17\x1e\x02\x15\x14\x0e\x05#\"'.\x02'.\x02'&'.\x01'.\x015\x1146767>\x02;\x03\x16\x17\x16\a\x16\x17\x16\a\x16\a\x14\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04i7\x01qN\xfe\xeb\x04\b\x0e\x03\x12\x12\x14\x01\t\x0f!/I.\x1a\x13\x14\x1c\v\a\t\t\x1a\x12!D1h\x18\x19$&\x1a#{MW\x9cB\x11L$\x85@:\t'\x0f\x11\x11.\x03\x03\xc0\x1a&&\x1a\x1b%%\xfd\xe5\x02\x80\x1a&&\x1a\xfd\x80\x1a&&\xaf=XNr\x0e\x14\x18\x06%(M&\x18\x1e<(2\x1f\x15\x13\x14<,'*%<\x12!W@r\x02\x02%\x19\x02\x81\x1a%\x01\x01+\x1a\x1b\x1f\x02LEp%9=8=L \x00\x00\f\x00\x00\xff\x80\x06\x00\x05\x80\x00\t\x00\x0f\x00\x17\x00+\x00=\x00\\\x00d\x00\u007f\x00\x8c\x00\x9e\x00\xb2\x00\xc2\x00\x00%54#\"\a\x15\x16327354\"\x15%\x15#\x11#\x11#5\x05\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x05\x15\x14\a\x06#\"'\x15#\x113\x15632\x17\x16\x17\x15\x14\a\x06\a\x06#\"'&=\x014762\x17\x16\x1d\x01#\x15\x143274645\x01\x15\x14\"=\x0142\x014'.\x01'&! \a\x0e\x01\a\x06\x15\x14\x17\x1e\x01\x17\x16 7>\x0176\x01\x13#\a'#\x1e\x01\x17\x16\x17\x153%54'&#\"\a\x06\x1d\x01\x14\x17\x163276\x173\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x97\x1d\x11\x10\x10\x11\x1d\xb8BB\xfd\xc5PJN\x01\xb1C'%!\t\x06B\x01\x01\x0e\x14\x16\x01?\a\f)#!CC $)\f\a\xfb\x02\x03\f\x1b54\x1d\x15\x14\x1df\x1b\x15\x85\"\x18\x06\x01\xfe\x81@@\x02\x15\x13\nB+\x88\xfe\xec\xfe\xed\x88,A\n\x14\x14\nA+\x89\x02&\x89+A\n\x14\xfd\rZK35N\a \b#\vJ\x01!\x15\x1d13\x1b\x15\x15\x1b31\x1d\x15\xb5CC\x16\x14\x0f\x01\x01C\x06\v $)\x01\xf7\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xe9\x9d2\x10\xe0\x10\xab\"33\xe8F\xfeY\x01\xa7F~\xfe\x91(-\x1c\x11%\x01\"\xfe\xf2\x18\x02\x0f\x1f\x01\x18o\x924\x15*)$\x01\xed\xa1(*\x15\xb6\t\x1d\x0e\x16\x12(&\x1b;\x81;\x1b&&\x1d9LA3\x1a\x01\f\x15\v\x038\x9c33\x9c4\xfd\x03\xb1S,;\x05\x0f\x0f\x05;,W\xad\xb0T+<\x05\x0f\x0f\x05<+T\x03;\x01(\xc3\xc3\x17\\\x17g7\xc9x\x82:\x1d&&\x1d:\x82:\x1d&&\x1b<\x01r\xfe\xe5\x1f\x10\x02\x18\x01\x10\xfe\xdb%\x12\x1b-\x01\b\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\v\x00\x1b\xff\x00\x05\xe5\x06\x00\x00\t\x00\x0f\x00\x17\x00+\x00=\x00[\x00c\x00}\x00\x89\x00\x9b\x00\xaf\x00\x00\x01\x15\x14#\"'\x11632\x05\x15#542%35!\x153\x113!3\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327%54'&#\"\a5#\x1135\x163276%5#\x14\a\x06#\"=\x01354'&#\"\a\x06\x1d\x01\x14\x17\x16327676\x0154\"\x1d\x01\x142\x01\x14\a\x0e\x01\a\x06 '.\x01'&547>\x0176 \x17\x1e\x01\x17\x16\x013\x03\x11#\x11&'&'3\x13\x05\x15\x14\a\x06#\"'&=\x0147632\x17\x16%\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x03\xcb'\x17\x16\x16\x17'\x01RZZ\xfc:k\xfe\xc8id\x01 YY\x1e\x1b\x12\x03\x01Y\b\f.06\x01\xad\t\x1162+YY-06\x11\t\x01R[\x02\a!.\xb3\x1b'CD'\x1c\x1d'EH$\x12\x03\x02\xfd\xa0VV\x02\xcf\x1a\x0eX:\xb8\xfd\x1a\xb8:Y\r\x1a\x1a\x0eX;\xb7\x02\xe6\xb8:Y\r\x1a\xfc\x1afyd\x0e/%\x1cjG\x01\xb6\x1c&DC&\x1c\x1c&CD&\x1c\x01O[52.\r\b[\x01\x03\x12\x1b\x1e\x01$\xd3C\x16\x01-\x16D..D\x96^^\xfd\xc7\x01\xee\xfe\x86*\x15\x03 \x01l\xfey1\x18%=^\xc5I\x1a86\xd9\xfdi077\x1bS\r3\n$EWgO%33%O\xadO%35\x1b\x1b\t\x03\xc2\xd2EE\xd2F\xfdW\xeat;P\x06\x15\x15\x06P;p\xee\xeat;P\a\x14\x14\aP;p\x04\x0e\xfeq\xfe\xf1\x01\x0fJ\x8agT\xfe\xf9F\xafQ%33&P\xafP%33%R\xfe\r7>%\x183\x01\x8a\xfe\x91!\x02\x16+\x01}\x00\x00\x02\x00\x05\xff\x80\x05{\x05\xf6\x00\x13\x00'\x00\x00\x01\x06\x03\x06+\x01\"&7\x132'\x03&76;\x012\x17\x01\x16\a\x01\x15\x01\x16\a\x06+\x01\"'\x016\x016;\x012\x02U\n\xf7\x1b&\xef\x15\x14\n\xfd\x01\x01\xa1\f\v\t\x17\xef(\x1a\x03\xca\v\v\xfd\xf0\x01P\v\n\n\x16\xef*\x18\xfe\xad\x12\x02\x01\x19'\xf1\x16\x03e\x12\xfeJ.\"\x13\x01\xc0\x01\x01\x17\x16\x0f\x0f-\x01d\x10\x15\xfcZ\x01\xfd\x99\x14\x11\x0f-\x02n \x03\x8e-\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x13\x00'\x007\x00\x00\x014'&+\x01\"\a\x06\x1f\x01\x15\x03\x06\x17\x16;\x0127\x01&+\x01\"\a\x01\x16\x01\x16;\x01276'\x015\x016\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad~\x15\x1f\xb8\x12\b\a\b}\xc4\t\t\b\x10\xb9\x1f\x13\x037\a\x11\xbb\x1e\x13\xfee\x01\x01\x05\x14 \xb8\x12\a\b\t\xfe\xfc\x01\x99\b۩w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x03\x01\xdd\"\v\f\x11\xd8\x01\xfe\xa6\x0e\x0e\r$\x03Q\f#\xfd'\x02\xfe!#\f\r\x0f\x01\xdc\x01\x02\xd3\x10\x88\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\x00\n\a\x00\x04\xf6\x00\x02\x00I\x00\x00\x01-\x01\x132\x04\x1f\x012\x1e\x05\x17\x1e\x02\x17\x1e\x01\x17\x1d\x01\x16\a\x0e\x01\x0f\x01\x0e\x06#\x06!&$/\x02.\x02'.\x02'.\x01'=\x01&7>\x01?\x01>\x0636\x02\xc7\x01\xe4\xfe\x1c\xb9\xa8\x019II\x01 \x0e!\x18 \x1e\x0e\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0f\x1f\x01\xfb\xfe\x88\xcf\xfe\xcf01$$%A\x18\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0e \x01\xfb\x01\x98\xfa\xfd\x01g\t\x05\x04\x03\x03\x06\n\x10\x17\x0f\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x0f\n\x06\x03\x03\x13\x02\t\x03\x04\x04\x05\n \x19\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x10\n\x06\x03\x03\x12\x00\x00\x05\x00@\xff\x80\x06\xc0\x05\x8a\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00\x00\t\x04\x15\x01\x15'\a5\x015\x17\x015\x177\x15\t\f\x01\x92\x01\xee\xfe\xaa\xfe\x16\x05,\xfe\x16\x01\x01\xfe\x17\x93\x01V\x01\x01\x01W\xfdQ\x01V\xfe\x12\xfe\xae\x05.\x01R\xfe\x17\xfe\xa9\x01W\x01\xe9\xfe\xae\xfe\x12\x03=\xfe\xcf\xfe\xe3\x01?\xfe\xe4l\xfe\xdb\x01\x01\x01\x01\x01%l`\x01\x1c\x02\x01\x01\x02\xfe\xe4\x04\xd8\xfe\xe3\xfe\xd0\x01\x0e\xfe\xf2\xfe\xf1\xfe\xc1\x01\x1d\x03~\xfe\xc1\xfe\xf2\x010\x00\x06\x00\v\xff\x00\x05\xf5\x06\x00\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x00\x05!\x11#\x11!\x11#%7\x05\a\x017\x01\a\x017\x01\a\x03\x01\a\t\x015!\x15\x05\t\xfb\xa2\xa0\x05\x9e\xa0\xfcR!\x03\x0f!\xfdXC\x02\xd5C\xfd\xf4f\x02ff\xd9\x01݀\xfe#\xfd\xb2\x03 `\x01\xe0\xfd\x80\x02\x80,\x9d\xa5\x9c\x02\x1a\x92\xfe\xad\x91\x02\xb6{\xfd\xff{\x03{\xfd\u007f`\x02\x81\xfa\xa1\x9f\x9f\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00O\x00g\x00\x00\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 $\x14\x06\"&462$\"&\x0e\x02\a\x0e\x01\a\x0e\x03\x16\x14\x06\x1e\x02\x17\x1e\x01\x17\x1e\x0362\x16>\x027>\x017>\x03&46.\x02'.\x01'.\x03\x00\x10\a\x0e\x01\a\x06 '.\x01'&\x107>\x0176 \x17\x1e\x01\x17\x04\x00\x96Ԗ\x96\xd4\x01 \xe6\xfe\xb8\xe6\xe6\x01H\x01R6L66L\xfeG\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x02n\x05\n\xe4\xd0X\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x02\x16Ԗ\x96Ԗ\x01\xa4\xfe\xb8\xe6\xe6\x01H\xe66L66L6\x80\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\xfen\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x05\x05\n\xe4\xd0\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x17\x00\x1f\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x01\x9a|\xb0||\xb0\x02\xb0|\xb0||\xb0\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfc\xa8\xb0||\xb0||\xb0||\xb0|\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x15\x00\x00\x01\x13!\x053\t\x0137!\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\xc9\xfen\x026^\xfe5\xfe5^h\x02\n\x01\xfb\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\x92\xfe\xce\xe0\x02\xb3\xfdM\xa0\x011\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xffP\x05\x81\x05\xa3\x00\n\x00\x16\x00*\x00C\x00g\x00\x00\x01\x16\x06'.\x01676\x1e\x01\x17.\x01\a\x0e\x01\x17\x1e\x017>\x01\x13.\x02'$\x05\x0e\x02\a\x1e\x02\x17\x167>\x02\x13\x0e\x03\a\x0e\x01&'.\x03'&'?\x01\x16 7\x1e\x01\x06\x13\x06\x03\x0e\x02\a\x06%&'.\x04'.\x03'>\x04767$\x05\x16\x17\x1e\x01\x03/\bu5'\x1d\x1c&$I7o\x0e\xc6b?K\x03\x04\x93\\[z\xe4\x14H,1\xfe\xdd\xfe\xed+.@\x12\x1e\\7<\xe4\xdc?5\\V\b\x0f\r,$V\xcf\xc5g.GR@\x14\x19 \x06\x12\xdf\x027\xe0\x15\x06\x10\xb5\x1aU\x05,+!\xfc\xfe\x9a\xf8\x92\x0f\x15\r\x05\a\x02\t#\x15\x1a\t\x03\x1d\"8$\x1e}\xbc\x01{\x01)\x9b<\x10\x01\x02\xa5?L \x11RR\x11\x12\f;\x11kr,\x1cyE[\x80\b\b\x98\x02z\x1b#\t\b/1\a\n\"\x1a\x1c#\t\a\x1d\x1c\b\b#\xfc\x12\x1aeCI\x140/\x03\x11\b\x14\"5#`\xc4\x10\t\x94\x94\x06\"8\x03\xb8\xa7\xfe\x18\x1e4\x1c\x11~&\x1bp\f\x1d)\x1b4\t2\xc8{\xacH\x1a-\x1e\x1e\x0f\v.\x12%W.L\x14>\x00\x06\x00\x00\xff\x80\x06\x00\x05\x80\x00\b\x00\x13\x00'\x00:\x00Y\x00i\x00\x00\x014&\a\x06\x16\x17\x1667\x16\x0e\x01&'&676\x16\x13\x0e\x02\a\x06'.\x02'>\x0276\x17\x1e\x02\x1346&'\x06 '\x0f\x01\x16\x17\x16\x17\x167>\x02\x136'&'&\x05\x06\a\x0e\x02\a\x1e\x02\x17\x1e\x03\x17\x16\x17\x047>\x027\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03PR$+\x01+'TJ\bX\x84j\x03\x027-F\x8f\xb6\x14C',\x9b\xa9,&C\x15\r.\"\x1e\xc6\xd2!$28\v\x05\x0f\xa1\xfeh\xa2\f\x05\x1a\x0f/\x9d\xf9\xb3\"\x1e\x0f\x87\t\x11+p\xd8\xfe\xf1\x84^&+3\x04\b\x16$\x06\x01\b\x06\x12\ri\xb3\x01\x03\xb5\x18\x1f\x1f\x040\x01(\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x9a+.\x16\x14i\x12\x176=Bn\f\\C1X\x14\x1fR\x01:\x15\x1a\x06\x05\x14\x14\x06\a\x19\x14\x13\x18\a\x05#\"\x05\a\x19\xfd\x03\a'\x19\x04jj\x06\f\x9a8Q\x1b.c\x13Aj\x02\xc75\x167!?\x1b\f\"\x0f\x140\x1eD\x8c\xca$\x054\x14\"\vP\x14\x1c[\r\x14&\x15\x01\v\x012\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00D\xff\x80\x04\x00\x06\x00\x00\"\x00\x00%\x17\x0e\x01\a\x06.\x035\x11#5>\x047>\x01;\x01\x11!\x15!\x11\x14\x1e\x0276\x03\xb0P\x17\xb0Yh\xadpN!\xa8HrD0\x14\x05\x01\a\x04\xf4\x01M\xfe\xb2\r C0N\xcf\xed#>\x01\x028\\xx:\x02 \xd7\x1aW]oW-\x05\a\xfeX\xfc\xfd\xfa\x1e45\x1e\x01\x02\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00/\x00\x00%'\x06#\x06.\x025\x11!5!\x11#\"\a\x0e\x03\a\x153\x11\x14\x1e\x027>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04p>,;$4\x19\n\x01\x01\xff\x00\xbc\b\x01\x05\x195eD\x82+W\x9bcE\x87\x01\xa2\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9K\xb7\x16\x01\x17()\x17\x01\x8e\xc2\x01F\n,VhV\x19\xa5\xfe^9tjA\x02\x010\x04/\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x03\xff@\x02\xfd\x06\x00\x00\x17\x00\x00\x00\x16\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x113\x02\xf5\x10\r\xfe\xa2\n\r\x0e\n\xfe\x9d\r\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x01\x00&\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x12\x0e\xfb \x00\x00\x00\x01\x00\x03\xff\x00\x02\xfd\x05\xc0\x00\x17\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&7\x01632\x17\x01\x16\x02\xfd\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01c\r\x04\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\n\xfe\x80\x10\x00\x00\x00\x00\x01\x00@\x01\x03\a\x00\x03\xfd\x00\x17\x00\x00\x01\x15\x14\x06#!\x15\x14\x06'\x01&547\x016\x17\x16\x1d\x01!2\x16\a\x00\x12\x0e\xfb &\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x02\xe0\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01b\x0e\b\t\x14\xe0\x12\x00\x00\x00\x01\x00\x00\x01\x03\x06\xc0\x03\xfd\x00\x17\x00\x00\x01\x14\a\x01\x06'&=\x01!\"&=\x01463!546\x17\x01\x16\x06\xc0\n\xfe\x80\x10\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\x02\x83\x0e\n\xfe\x9e\x0e\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\xfe\xa2\n\x00\x00\x00\x02\x00\x00\xff\x80\x05q\x06\x00\x00&\x008\x00\x00\x01\x06\a\x06#\"'&#\"\a\x06#\"\x03\x02547632\x17\x16327632\x17\x16\x17\x06\a\x06\x15\x14\x16\x01\x14\a\x06\a\x06\a\x06\a6767\x1e\x01\x17\x14\x16\x05q'T\x81\x801[VA=QQ3\x98\x95\x93qq\xabHih\"-bfGw^44O#A\x8a\xfe\xe1\x1d\x1e?66%C\x03KJ\xb0\x01\x03\x01\x01\x01A}}\xc4 !\"\x01\x03\x01\x05\xf2䒐\x1e\x1e\"\"A$@C3^q|\xc6\x04z=KK?6\x12\v\x06\x95lk)\x03\x10\x03\x04\f\x00\x00\x04\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\x01\x11%\x11\x01\x11!\x11\x01\x11%\x11\x01\x11!\x11\x02\xaa\xfdV\x02\xaa\xfdV\x06\x80\xfcu\x03\x8b\xfcu\x02\x12\xfdu^\x02-\x02\xe7\xfdm\x025\xfdw\xfc\xee}\x02\x95\x03n\xfc\xe6\x02\x9d\x00\x00\x00\x06\x00\x00\xff\x00\x05\x80\x05~\x00\a\x00\x0f\x00\x1c\x007\x00M\x00[\x00\x00\x00264&\"\x06\x14\x04264&\"\x06\x14\x052\x16\x15\x11\x14\x06\"&5\x1146\x05\x11\x14\x06+\x01\x15\x14\x06\"&=\x01#\x15\x14\x06#\"&5'#\"&5\x11\x01\x1e\x01\x15!467'&76\x1f\x0162\x1776\x17\x16\a\x01\x11\x14\x06#\"&5\x114632\x16\x01\xdd \x17\x17 \x16\x01\xbc \x16\x16 \x17\xfc\xfb*<;V<<\x04O@-K\x03<\x01&\x014'>\x03&4.\x02'.\x01'\x16\x17\x16\a\x06\a\x06.\x01'.\x04'.\x03'&6&'.\x01'.\x01676\x16\a\x06\x167645.\x03'\x06\x17\x14#.\x01\x06'6&'&\x06\a\x06\x1e\x017676\a\"&'&6\x172\x16\x06\a\x06\a\x0e\x01\a\x0e\x01\x17\x1e\x03\x17\x167>\x0376\x17\x1e\x01\x06\a\x0e\x01\a\x06\a\x06'&\x17\x16\x17\x167>\x05\x16\x17\x14\x0e\x05\a\x0e\x02'&'&\a\x06\x15\x14\x0e\x02\x17\x0e\x01\a\x06\x16\a\x06'&'&76\a\x06\a\x06\x17\x1e\x01\x17\x1e\x01\x17\x1e\x01\x06\a\x1e\x02\x156'.\x027>\x01\x17\x167676\x17\x16\a\x06\a\x06\x16\x17>\x0176&6763>\x01\x16\x016&'&\x15\x16\x172\a\x0632\x05.\x02'.\x04\a\x06\x16\x17\x166'4.\x01\a\"\x06\x16\x17\x16\x17\x147674.\x01'&#\x0e\x01\x16\a\x0e\x02\x17\x16>\x017626\x01\x1e\x02\x0e\x05\a\x0e\x01\a\x0e\x01'.\x03'&#\"\x06\a\x0e\x03'.\x01'.\x04'&676.\x0167>\x017>\x015\x16\a\x06'&\a\x06\x17\x1e\x03\a\x14\x06\x17\x16\x17\x1e\x01\x17\x1e\x027>\x02.\x01'&'&\a\x06'&7>\x027>\x03767&'&67636\x16\x17\x1e\x01\a\x06\x17\x16\x17\x1e\x01\x17\x16\x0e\x01\a\x0e\x03'.\x04'&\x0e\x01\x17\x16\a\x06\x1667>\x017>\x01.\x01'.\x0167\x1e\x05\x02\x97\v\t\x04\x05\x13\x05\\\x04\x0f\n\x18\b\x03\xfe\x9b\x04\x04\x05\x03\x03\a\n\t\x04\x11\x04\x01\x02\x02\x01\x02\x03U7\x04\a\x03\x03\x02\a\x01\t\x01\nJ#\x18!W!\v'\x1f\x0f\x01\v\t\x15\x12\r\r\x01\x0e\"\x19\x16\x04\x04\x14\v'\x0f;\x06\b\x06\x16\x19%\x1c\n\v\x12\x15\r\x05\x11\x19\x16\x10k\x12\x01\t)\x19\x03\x01\"\x1c\x1b\x1d\x02\x01\t\x11\a\n\x06\x04\v\a\x11\x01\x01\x14\x18\x11\x14\x01\x01\x16\t\b'\x01\r\x05\n\x0e\x16\n\x1b\x16/7\x02*\x1b \x05\t\v\x05\x03\t\f\x14I\t,\x1a\x196\n\x01\x01\x10\x19*\x11&\"!\x1b\x16\r\x02\x02\x06\x06\v\a\r\x03\x1cO6\x16\x15*\x16\x03\x01\x1e\x1d\r\x12\x17O\b\x02\x01\x06\b\x15 \x04\x02\x06\x04\x05\x02\x02$.\x05(\x04\x14\xa8\t\x10\x03\x1f\x1e\b*\x0e.'\x04\r\x06\x01\x03\x14\n.x\x85,\x17\v\f\x02\x01\x16\t\x06\x15\x03\x17\x02\x02\x11\x02\x16\x0f$\x01CN\xfd\xa1\x03\v\x06\t\x02\x03\n\x03\x03\v\x03\x01\xa3\x02\t\x11\x06\x05\t\x05\x06\x02\x03\x0e*\x12\t\v\xb4\n\f\x03\x06\x04\x04\x03\x0e\x04\b\x026\x05\r\x03\x0f\t\t\x05\x03\x02\x01\n\x02\x04\x04\b\x0e\b\x01\x10\x0e\x027\x14\x16\x02\a\x18\x17%\x1a&\b&_\x1c\x11f&\x12\x17\n\"\x1e,V\x13L\x14,G$3\x1c\x1d\xa4@\x13@$+\x18\x05\n\"\x01\x01\n\n\x01\n\x0eV\x11\x1e\x18\x155 3\"\t\r\x12\x02\f\x05\x04\x01\"\x03\x03\"\x14\x81#\x18dA\x17++\x03\x12\x14\ny0D-\v\x04\x03\x01\x01\x12\x1e\a\b%\x16&\x14n\x0e\f\x04\x024P'A5j$9E\x05\x05#\"c7Y\x0f\b\x06\x12\v\n\x1b\x1b6\"\x12\x1b\x12\t\x0e\x02\x16&\x12\x10\x14\x13\n8Z(;=I50\v' !!\x03\x0e\x01\x0e\x0f\x1a\x10\x1b\x04e\x01\x13\x01\x06\f\x03\x0e\x01\x0f\x03\v\r\x06\xfeR\x01\b\x11\x05\x05\b\v\x01\x01\x10\n\x03\b\x04\x05\x03\x03\x02\xfe\x9a\x12\x18\x0f\x19\x1b\x10\x1d\n\"\a+\x050n\x14\x14?\xa2t(\x02\x04-z.'<\x1f\x12\f\x01>R\x1e$\x16\x15A\"\b\x03\x1e\x01\x0124\x01\x03B\x19\x13\x0f\a\x04@\x05\x1e(\x15\t\x03\b~\x0f\t\x03\x04\a9B\x01\x019\x1f\x0f,\x1f\x02\x03\v\t\x01\x1d\x13\x16\x1e\x01*$\x04\x0f\x0e\f\x17\x01\x0e\x1a\x05\b\x17\x0f\v\x01\x02\x11\x01\f\t\x11\t\x0e\x06\x03\v\r\x03\x06\x1f\x04\x13\x04\x05\a\x02\x04\x04\x0f\x17\x01\x01\f\x10\x13\x0f\t\x04\t\x02\x05\x05\x04\x06\x03\a\x01\x0e<\x1a\f\v>\x1f\t\x03\a\x19?0D\x1d\x06\xa89\x12f\b\x18\x15\x1f?\x1c\x1c\x13\x01\x01\x04Ae\f \x04\x17\x87\t\x0f.(\x03\x0f;1.\x18D\b\x10\b\x02\x05\t\a4\x10\x0fH&\b\x06.\x19C\x17\x1d\x01\x13t \x15iY\x1a\x12% \v\x03*\x11\x1a\x02\x02\t\x05\x01\x0f\x14\xc2\b\a\x03\x04\x03\n\x06\a\x01\x02\x107\x04\x01\x12\xe0\v\x11\b\x01\x04\x04\x01\x04\x1b\x03\x05\x02\xea\x02\x06\b\x02\x0f\x01\r\r\x06\x04\r\x05\x06\x03\x06\f\x03\x01\x04\xfa\xc8\f\x19\x17\x16\x16\x11\x14\r\x12\x04\x13J\x1b\x10\a\x12\t\x1d\x16\x11\x01\x01\x03\x01\x01\x1c \x19\x01\x01<\r\x04\v\a\f\x11\v\x17W\v\x100%$\t\f\x04\n\x12\"\"I!\x14\x05\x03\r\x0f*\x06\x18\f\x16\v\x0fD\x0e\x11\t\x06\x19\b\x06 \x0e\x03\x06,4A'\x11\xbe4J\"\t\x18\x10\x16\x1d.0\x12\x15f6D\x14\x8f4p\xc6Z{+\x15\x01\x1d\x1b*\x9fD_wqi;\xd0W1G(\x02\x02\"%\x1e\x01\x01\b\x13\f\x1d\x05%\x0eT7F}AG\x05!1#\x19\x12% \x19\v\vJG\f\x1f3\x1e\x1b\v\x0f\x00\b\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00 \x00'\x00.\x002\x00>\x00V\x00b\x00\x00%&\x03#\a\x0e\x04\a'\x1632\x03&'\x04!\x06\x15\x14\x16\x17>\x03?\x01>\x01'&'\x0e\x01\a \x05&\a\x16\x17>\x01\x01\"\a6\x05&#\"\a\x16\x17>\x04\x13&'\a\x0e\x04\a\x16\x17\x1e\x01\x17>\x012\x1e\x04\x176\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00*b\x02\x02\x106\x94~\x88#\x0f\xb8\xea\x84=\x15 \xfe\xc9\xfe\x96\x01XP2\x93\x8a{&%\x04\x12gx|\x8a\xc0 \x01.\x03\xdc\xd2\xc7W)o\x94\xfc\xf1\x01\x01\x01\x02O\xb9\xf8LO\x83sEzG<\x0f\xe4\x03\x92\x01\t\x14CK}E\x19\x13\x02\t\x03$MFD<5+\x1e\nz\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a$\xf1\x01\x01\x01\x06\x15MW\x8eM\v\x96\x02\x931>]\a\x0e|\xe1YY\x9b^D\x0e\r\x01\x05\xd6եA\xf2\x97\xef<\x1f\xef\xe6K\xe5\x03m\x01\x01\x91\xa4\x13\xaa\xd4\x1aE6<\x15\xfe\"\xe8\xb2\x01\f\x19@9I\x1c5*\x05\x18\x05\x05\x04\x03\x05\x06\a\x05\x02\xc8\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00>\x00^\x00\x00\x014.\x03/\x01.\x045432\x1e\x0332654.\x01#\"\x0e\x02\x15\x14\x1e\x02\x1f\x01\x16\x17\x16\x15\x14\x06#\".\x03#\"\x06\x15\x14\x1632>\x02\x05\x14\x06#\"'\x06#\"$&\x02547&54632\x17632\x04\x16\x12\x15\x14\a\x16\x04\x95':XM1h\x1e\x1c*\x12\x0f\x90+D($,\x1a/9p\xac`D\x80oC&JV<\x92Z\x16 PA3Q1*2\x1d23\xf4\xa9I\x86oB\x01kែhMI\x8f\xfe\xfb\xbdo\x10PែhMI\x8f\x01\x05\xbdo\x10P\x01\xd92S6,\x18\v\x18\a\a\x10\x10\x1a\x11M\x18!\"\x18@-7Y.\x1f?oI=[<%\x0e$\x16\x0e\x14('3 -- <-\\\x83%Fu\x90\x9f\xe1P\x10o\xbd\x01\x05\x8fIMh\x82\x9f\xe1P\x10o\xbd\xfe\xfb\x8fIMh\x00\x00\x00\x03\x00,\xff\x80\x04\xcb\x06\x00\x00#\x00?\x00D\x00\x00\x0176&#!\"\x06\x15\x11\x147\x01>\x01;\x01267676&#!\"&=\x01463!267\x06\n\x01\a\x0e\x04#!\"\a\x06\x01\x0e\x01'&5\x11463!2\x16\a\x036\x1a\x01\x03\xe8%\x05\x1c\x15\xfd8\x17\x1f\x06\x01#\x17\x1e!\xef\x16\x1e\x03\x18\r\x04\x1f\x15\xfe\xda\x1d&&\x1d\x01Z\x12\"\xe6\x0fM>\x04\x06\x06\x16\x1b2!\xfe\xf1\r\t\b\xfe^\x16I\f7LR\x03x_@\x16\x9e\x04>M\x04N\xc2\x17\"\"\x14\xfb\xb3\a\x06\x01`\x1a\x0f\x1d\x0f\x82=\x15&&\x1d*\x1d%\x1b\xeeI\xfe}\xfe\xc7\x11\x16\x15,\x16\x14\n\t\xfe\x1b\x19\a\t\x16L\x05\x827_jj\xfc\xea\x11\x019\x01\x83\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00%\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\xc0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\x02\xa0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\xa0&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x04\x00\x0e\x12\x12\x0e\xfc\x00\x0e\x12\x12\x01\x8e\x02\x80\x0e\x12\x12\x0e\xfd\x80\x0e\x12\x12\x03\x0e\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x00\x05\xe0\x001\x009\x00\x00\x01\x14\x06#\"'\x03#\x15\x13\x16\x15\x14\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x135#\x03\x06#\"&547\x0163!2\x17\x01\x16\x00\x14\x06\"&462\x05\x008(3\x1d\xe3-\xf7\t&\x1a\xc0B.\xa0.B\xc0\x1a&\t\xf7-\xe3\x1d3(8\x10\x01\x00Ig\x01\x80gI\x01\x00\x10\xfe`\x83\xba\x83\x83\xba\x01\xe0(8+\x01U\x84\xfee\x0f\x12\x1a&\xfe\xf0.BB.\x01\x10&\x1a\x12\x0f\x01\x9b\x84\xfe\xab+8(\x1d\x18\x01\x80kk\xfe\x80\x18\x03`\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x00\x04\x00\x05\xe0\x00%\x00-\x00\x00\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11463!2\x16\x00\x14\x06\"&462\x04\x008P8@B\\B@B\\B@8P8pP\x02\x80Pp\xfe\xe0\x83\xba\x83\x83\xba\x03@\xfe`(88(\x01`\xfcp.BB.\x01\xd0\xfe0.BB.\x03\x90\xfe\xa0(88(\x01\xa0Ppp\x01ͺ\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00!\x00\x00%\x01>\x01&'&\x0e\x01\a\x06#\"'.\x02\a\x0e\x01\x16\x17$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x05\x01^\x10\x11\x1d/(V=\x18$<;$\x18=V).\x1d\x11\x10\x04X\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xea\x01\xd9\x16J`\x1f\x1a\x01\"\x1c((\x1c\"\x01\x1a\x1f`J\x16\x8e\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00,\xff\x00\x06\xd4\x05\xff\x00\x0f\x00I\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01%\x06\a\x05\x11\x14\a\x06'%\a\x06\"/\x01\x05\x06'&5\x11%&'&?\x01'&767%\x11476\x17\x05762\x1f\x01%6\x17\x16\x15\x11\x05\x16\x17\x16\x0f\x01\x17\x16\x05\xc0[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01o\x04\x10\xfe\xdc\r\x0f\x0e\xfeܴ\n \n\xb4\xfe\xdc\x0e\x0f\r\xfe\xdc\x10\x04\x05\t\xb4\xb4\t\x05\x04\x10\x01$\r\x0f\x0e\x01$\xb4\t\"\t\xb4\x01$\x0e\x0f\r\x01$\x10\x04\x05\t\xb4\xb4\t\x02\v\xea՛[[\x9b\xd5\xea՛[[\x9b5\x0f\x05`\xfe\xce\x10\n\n\x06^\xf8\r\r\xf8^\x06\n\n\x10\x012`\x05\x0f\x11\f\xf8\xf8\r\x10\x0f\x05`\x012\x10\n\n\x06^\xf8\f\f\xf8^\x06\n\n\x10\xfe\xce`\x05\x0f\x10\r\xf8\xf8\f\x00\x02\x00\x00\xff\x80\x05\xbe\x05\u007f\x00\x12\x001\x00\x00%\x06#\"$\x02547\x06\x02\x15\x14\x1e\x0232$%\x06\x04#\"$&\x0254\x126$76\x17\x16\a\x0e\x01\x15\x14\x1e\x013276\x17\x1e\x01\x04\xee68\xb6\xfeʴh\xc9\xfff\xab킐\x01\x03\x01&^\xfe\x85\xe0\x9c\xfe\xe4\xcezs\xc5\x01\x12\x99,\x11\x12!V[\x92\xfa\x94vn)\x1f\x0e\a\xe9\t\xb4\x016\xb6\xc0\xa5<\xfe\xaeׂ\xed\xabf{\xc3\xcb\xf3z\xce\x01\x1c\x9c\x99\x01\x17\xcc}\x06\x02))\x1fN\xcfs\x94\xfa\x923\x12\x1f\x0e(\x00\x03\x00@\xff\x80\x06\xc0\x05\x80\x00\v\x00\x1b\x00+\x00\x00\x004&#!\"\x06\x14\x163!2\x01\x11\x14\x06#!\"&5\x11463!2\x16\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04@&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a\x02f&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&@&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\x02\xa64&&4&\x01\x00\xfc@\x1a&&\x1a\x03\xc0\x1a&&\x01\xa6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x02\x00 \xff\xa0\x06`\x05\xc0\x00B\x00H\x00\x00\x00\x14\x06+\x01\x14\a\x17\x16\x14\a\x06\"/\x01\x0e\x04#\x11#\x11\".\x02/\x01\a\x06#\"'.\x01?\x01&5#\"&46;\x01\x11'&462\x1f\x01!762\x16\x14\x0f\x01\x1132\x01!46 \x16\x06`&\x1a\xe0C\xd0\x13\x13\x126\x12\xc6\x05\x14@Bb0\x803eI;\x0e\x0f\xb7\x14\x1c\x18\x13\x13\x03\x11\xca:\xe0\x1a&&\x1a\xe0\xad\x13&4\x13\xad\x03L\xad\x134&\x13\xad\xe0\x1a\xfeF\xfd\x80\xbb\x01\n\xbb\x02Z4&\xabw\xd1\x134\x13\x13\x13\xc5\x05\x10) \x1a\x03\x80\xfc\x80\x1b''\r\x0e\xcf\x15\x10\x125\x14\xe3r\xa0&4&\x01&\xad\x134&\x13\xad\xad\x13&4\x13\xad\xfe\xda\x02\x00\x85\xbb\xbb\x00\x00\x01\xff\xff\x00\x01\a}\x04G\x00\x85\x00\x00\x01\x16\a\x06\a\x0e\x02\x1e\x02\x17\x16\x17\x16\x17\x1e\x02\x0e\x01#\x05\x06&/\x01.\x03\a\x0e\x04\x17\x14\x06\x0f\x01\x06\a#\x06.\x02/\x01.\x03\x02'&4?\x0163%\x1e\x01\x1f\x01\x16\x17\x1e\x01\x1f\x01\x1e\x0327>\x04'.\x01/\x01&'&7676\x17\x16\x17\x1e\x03\x14\x0e\x01\x15\x14\x06\x1e\x02\x17\x1e\x01>\x02767>\x01?\x01>\x02\x17%6\x16\x17\a}\x17\xad\x18)(\x1e\x1f\a\x13.\"\x04\x01\x8d2\x03\a\a\b*&\xff\x00\x18@\x14\x14\x1eP9A\x18\x03\n\x18\x13\x0f\x01\a\x04\x04\x12#sG\x96q]\x18\x19\n#lh\x8d<\x06\x03\x04\x0f*\x01\x12\f\x16\x05\x05\x10\b\x144\x0f\x10\x1d6+(\x1c\r\x02\x06\x12\t\n\x05\x02\x0e\a\x06\x19<\r\x12\x10\x165\xbaR5\x14\x1b\x0e\a\x02\x03\x02\x01\x06\x11\x0e\b\x12\"*>%\"/\x1f\t\x02\x04\x1a+[>hy\n\x0f\x03\x03\x01\x03\x03\x01\x02\x05\x0f\t\x00\a\x00\x00\xff\xaa\x06\xf7\x05K\x00\n\x00\x15\x00!\x00/\x00U\x00i\x00\u007f\x00\x00%6&'&\x06\a\x06\x1e\x01676&'&\x06\a\x06\x17\x166\x17\x0e\x01'.\x017>\x01\x17\x1e\x01%.\x01$\a\x06\x04\x17\x1e\x01\x0476$%\x14\x0e\x02\x04 $.\x0154\x1276$\x17\x16\a\x06\x1e\x016?\x0162\x17\x16\a\x0e\x01\x1e\x01\x17\x1e\x02\x02\x1e\x01\a\x0e\x01'.\x0176&\a\x06&'&676%\x1e\x01\a\x0e\x01.\x0176&'.\x01\a\x06.\x01676\x16\x02\xa3\x15\x14#\"N\x15\x16\x12DQt\b\t\r\x0e\x1d\a\x11\x1e\x0e\x1e\xb5-\xe2okQ//\xd1jo_\x01\v\t\xa0\xfe\xff\x92\xdf\xfe\xdb\x0e\t\xa0\x01\x01\x92\xdf\x01%\x01&J\x90\xc1\xfe\xfd\xfe\xe6\xfe\xf4Ղ\x8b\x80\xa9\x01YJA-\x04\x06\x0e\x0f\x06\x06\x8b\xd6.--\x02\x05\x0e\n\f9\\DtT\x19\x13\b+\x17\x17\x16\a\x14X?\x18*\x04\x05\x1a\x18<\x01UW3'\t26\x1a\b\x1c$>>\xacW\x1c0\f\x1f\x1c{\xf2\xfc\"F\x0f\x0e\x1a!\"E \x1b\x9b\r\x1b\x05\x05\v\r\x1f\x0e\x05\v^f`$\"\xb9_]\\\x1b\x1d\xb5<`\x94F\x0e\x17\xed\x92`\x94F\x0e\x17\xed\x8eD\x8f\x83h>Cw\xb7ls\x01\x04\x80\xa9\x86J@\x91\x0e\f\x02\x03\x02\x02;=?s\r\x0e\v\x04\x04\x12:i\x02_^{8\x17\x16\a\b+\x17?`\r\x05\x1a\x18\x18)\x05\rO`\xfds\x1b\x1a\x122\x1bR\xb4DE5\x12\x06\x1f8/\x06\x1aK\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05r\x00\t\x00\x13\x00\x1d\x00\x00\x05\x06#\"'>\x017\x1e\x01\x01\x11\x14\x02\a&\x114\x12$\x01\x10\a&\x025\x11\x16\x04\x12\x04m\xab\xc5ī\x8a\xc3\"#\xc3\xfe\x9b\xfd̵\xa7\x01$\x045\xb5\xcc\xfd\xb3\x01$\xa7\"^^W\xf8\x90\x90\xf8\x05=\xfe\x1b\xfc\xfeac\xd7\x01\x18\xbb\x01E\xd6\xfd*\xfe\xe8\xd7c\x01\x9f\xfc\x01\xe5\x1e\xd6\xfe\xbb\x00\x00\x00\x01\x00\x00\xff\x00\x05z\x06\x00\x00k\x00\x00\x01\x0e\x03.\x03/\x01\x06\x00\a\"&4636$7\x0e\x02.\x03'>\x01\x1e\x02\x1767\x0e\x02.\x05'>\x01\x1e\x05\x1f\x0165.\x0567\x1e\x04\x0e\x02\x0f\x01\x16\x14\a>\x05\x16\x17\x0e\x06&/\x01\x06\a>\x05\x16\x05z X^hc^O<\x10\x11q\xfe\x9f\xd0\x13\x1a\x1a\x13\xad\x01+f$H^XbVS!rȇr?\x195\x1a\a\x16GD_RV@-\x06F\u007fbV=3!\x16\x05\x04\f\b\x1bG84\x0e&3Im<$\x05\x06\x14\x12\b\a\x01\x01\x03\x0e/6X_\x81D\x02'=NUTL;\x11\x11\x172\x06\x18KPwt\x8e\x01\xb1Pt= \x03\x0e\x1e\x19\n\n\xe4\xfe\xf9\x01\x1a&\x19\x01ռ\x0e\x12\b\r,J~S/\x14#NL,\x83\xa0\x01\x03\x02\x03\x11\x1d8JsF\x1c\x11\x13);??1\x0f\x10zI\x06\x14EJpq\x8dD\x19IPZXSF6\x0f\x0f\x04\\\x1a\a\x17?5:\x1f\x02\x17N\u007fR=\x1e\x12\x01\x03\x03\x03\x93\x88\a\x17;.&\x021\x00\x04\x00\x15\xff\x00\x04\xeb\x05\x00\x00\f\x00\x10\x00\x14\x00\x1e\x00\x00\x01\x15\x14\x06+\x01\x01\x11!\"&=\x01\x01\x15!\x11\x01\x15!\x11%\x15!5463!2\x16\x04\xebsQ9\xfe\xfc\xfd\xefQs\x04\xd6\xfb*\x04\xd6\xfb*\x04\xd6\xfb*sQ\x03NQs\x01\x1bBUw\xfe\xf3\x01\rwUB\x01F\xff\x00\xff\x01H\xff\x00\xff\x8cCCTww\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x00\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\t\xfe\xc0\t\x0e\r\x13\xfe\xa0\r\x13\x13\r\x01`\x12\x0e\f\f\x01?\xa9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x8e\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\xab\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&47\x01632\x16\x1d\x01!2\x16\x12\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\x13\r\xfe\xa0\x12\x0e\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x01`\r\x13\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xe0\xc0\r\x13\xc0\x0e\x12\n\x01?\t\x1c\t\x01@\t\x13\r\xc0\x13\xfe\xff\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00&\x1a\x14\x11\xfe@\x1b\x1b\x01\xc0\x11\x14\x1a&\x01\x00\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xc0\xfd\x80\x1a&\f\x01@\x13B\x13\x01@\f&\xfc\xc6\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x1f\x00\x00\x00\x14\x06\"&462\x12 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4*\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\x01 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06]\x05\xe0\x00\x15\x006\x00\x00\x01\x17\x06\x04#\"$\x0254\x127\x17\x0e\x01\x15\x14\x0032>\x01%\x17\x05\x06#\"'\x03!\"&'\x03&7>\x0132\x16\x15\x14\x06'\x13!\x15!\x17!2\x17\x13\x03\xfff:\xfeл\x9c\xfe\xf7\x9bѪ\x11z\x92\x01\a\xb9~\xd5u\x02\x1b:\xff\x00\r\x10(\x11\xef\xfe(\x18%\x03`\x02\b\x0eV6B^hD%\x01\xa7\xfei\x10\x01\xc7(\x11\xe4\x01]̳ޛ\x01\t\x9c\xb5\x01*>\x836߅\xb9\xfe\xf9\x82\xdd\x1ar\x80\a#\x01\xdd!\x18\x03\v\x11\x193?^BEa\a\xfe߀\x80#\xfe9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x016'&\x03632\a\x0e\x01#\"'&'&\a\x06\a\x0e\x01\a\x17632\x17\x1e\x01\x17\x1632\x13\x12\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\f\n\xab\xe7Q,&U\v\x04\x8c#+'\r \x1e\x82;i\x1bl\x1b4L\v92\x0f<\x0fD`\x9d\xe2\xdc\xfa\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x82\xd8\x06\b\xfe\xf3\x13`9ܩ6ɽ\f\a]\x18`\x18C4\xb37\xdb7\xb3\x01&\x01\x1b\x01\u007f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x01\x00\x00\x00\x00\x04\x80\x05\x80\x00D\x00\x00\x01\x14\x02\x04+\x01\"&5\x11\a\x06#\"'&=\x014?\x015\a\x06#\"'&=\x014?\x01546;\x012\x16\x1d\x01%6\x16\x1d\x01\x14\a\x05\x15%6\x16\x1d\x01\x14\a\x05\x116\x00546;\x012\x16\x04\x80\xbd\xfe\xbc\xbf\xa0\x0e\x12\xd7\x03\x06\n\t\r\x17\xe9\xd7\x03\x06\n\t\r\x17\xe9\x12\x0e\xa0\x0e\x12\x01w\x0f\x1a\x17\xfew\x01w\x0f\x1a\x17\xfew\xbc\x01\x04\x12\x0e\xa0\x0e\x12\x02\xc0\xbf\xfe\xbc\xbd\x12\x0e\x02cB\x01\x06\n\x10\x80\x17\bG]B\x01\x06\n\x10\x80\x17\bG\xfa\x0e\x12\x12\x0e\xb5t\x05\x14\x10\x80\x17\by]t\x05\x14\x10\x80\x17\by\xfe\x19\r\x01\x14\xbe\x0e\x12\x12\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfe\xa0\x12\x0e@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x80\x05\x00\x00'\x00/\x00?\x00P\x00\x00\x01\x06+\x015#\"&547.\x01467&546;\x01532\x17!\x1e\x01\x17\x1e\x02\x14\x0e\x01\a\x0e\x01\a7\x16\x14\a\x1764'\x01!\x06\a\"\x06\x0f\x01\x01\x0e\x01+\x01\x0332\x03#\x1332\x16\x17\x01\x1e\x043\x05!&\x02ln\x9e\x80@\r\x13\a:MM:\a\x13\r@\x80\x9en\x04Y*\x81\x10Yz--zY\x10\x81*\x0655QDD\xfbU\x03\xf7\xd9\xef9p\x1b\x1c\xfe\xe0\x1aY-`]\x1d\x9d\x9d\x1d]`.X\x1a\x01 \x04\x0e/2I$\x01\xc8\xfc\tt\x01\xa0@@/!\x18\x19\x02\x11\x18\x11\x02\x19\x18!/@@\a\x16\x03\x0f3,$,3\x0f\x03\x16\a\xfc$p$\x1e0\x940\xfe\xd6&*0\x18\x18\xfe\xe0\x1a&\x01\xd0\x01\xe0\x01\xd0&\x1a\xfe\xe0\x04\r!\x19\x15P@\x00\x02\x00\x00\xff\x80\x06\x80\x06\x00\x00R\x00V\x00\x00\x012\x16\x15\x14\x0f\x01\x17\x16\x15\x14\x06#\"&/\x01\x05\x17\x16\x15\x14\x06#\"&/\x01\a\x06#\"&546?\x01\x03\a\x06#\"&546?\x01'&54632\x16\x1f\x01%'&54632\x16\x1f\x017632\x16\x15\x14\x06\x0f\x01\x1376\x01%\x03\x05\x05\xef>S]\xac8\aT;/M\x0f7\xfe\xca7\bT\x057%>\x01\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x03\xe0\x1f!\"\xc55bBBb/\xbe/\f*\n8(\x03@(87)\xfc\xc0(8=%/\xb5'\x03\x1c\x0e\x1c\x13\x18\x15\x14\x15\x18\x13\x1c\x0e\x1c\x03\x01\v#?\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfb\xe0\x01\xb4#\x14\x16~$EE y \b&\b\xfeL(88\x02e):8(%O\x19 r\x1a\x02\x13\t\x11\t\n\x05\x05\n\t\x11\t\x13\x02\xae\x17O\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x05\x00?\x00G\x00Q\x00a\x00q\x00\x00\x1347\x01&\x02\x01\x14\x0e\x03\a\x03\x0167>\x01&\x0f\x01&'&\x0e\x01\x1e\x01\x1f\x01\x13\x03\x0167>\x01&\x0f\x01\"$32\x04\x17#\"\x06\x15\x14\x1e\x06\x17\x16\x05\x13\x16\x17\x06#\"'\x01\x16\x15\x14\x02\a\x13654\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x00 $6\x12\x10\x02&$ \x04\x06\x02\x10\x12\x16\u007fC\x01o\xc4\xee\x05\b\x05\x0f\b\x1b\x04L\xfe\xea.*\x13\x0e\x13\x13\xcdK\u007f\f\x11\x06\x03\x0f\fPx\xa8\xfe\xe8.*\x13\x0e\x13\x13\xcd\a \ni\x01SƓ\x01\vi\n7J\x04\x04\f\x06\x12\a\x16\x03?\xfe\x06\xed\x01\x04~\x81pi\x03{_Я\xeb;\xfc\xa2\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01U\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3刈\xe5\x02\x80\xa3\x96\xfc\x13_\x01t\x01\b\x13'<\x1cZ\r\xff\x00\x03:\x03\x05\x02!\x1d\x01\n\x01\t\x01\f\x12\x13\x0e\x01\b\xfe\xb8\xfe\b\x03@\x03\x05\x02!\x1d\x01\n\x01\xa0\xbbj`Q7\f\x18\x13\x1b\x0f\x1e\f$\x05k\xd3\xfdy\x06\x05, \x04R\xae\xc3\xd1\xfe\x9ff\x02\xa6\xa9k*\x024\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xf9\xb7\x88\xe5\x01=\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3\xe5\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x06\x00\x00\x12\x00\x1b\x00\x00\x01\x11\x05&$&546$7\x15\x06\x04\x15\x14\x04\x17\x11\x01\x13%7&'5\x04\x17\x04>\xfe\xf0\xe4\xfe\x8c\xd6\xc9\x01]\xd9\xd9\xfe\xe9\x015\xea\x03\xad%\xfd\xf3\x93w\xa1\x01\x15\xcc\x06\x00\xfa\x00\x80\x14\xa4\xfd\x92\x8c\xf7\xa4\x1a\xac&\xe0\x8f\x98\xe6\x1e\x05P\xfe?\xfezrSF\x1d\xac!|\x00\x00\x00\x03\x00\x00\xff\x00\a\x80\x06\x00\x00\f\x00&\x000\x00\x00\t\x01\x15#\x14\x06#!\"&5#5\x01!\x113\x11!\x113\x11!\x113\x11!\x1132\x16\x1d\x01!546;\x01\x052\x16\x1d\x01!5463\x03\xc0\x03\xc0\x80)\x1c\xfa\n\x1c)\x80\x01\x00\x01\x00\x80\x01\x00\x80\x01\x00\x80\x01\x00;\x1c)\xf9\x80)\x1c;\x06;\x1c)\xf8\x80)\x1c\x06\x00\xfe\x80\x80\x1a&&\x1a\x80\xff\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00&\x1a@@\x1a&\xc0&\x1a\x80\x80\x1a&\x00\x00\x02\x00\x00\xff\x80\t\x00\x05\x80\x00\r\x006\x00\x00\x01\x13\x16\x06\x04 $&7\x13\x05\x1627\x00\x14\a\x01\x06\"'%\x0e\x01\a\x16\x15\x14\a\x13\x16\a\x06+\x01\"'&7\x13&54767%&47\x0162\x17\x01\x06\xee\x12\x04\xac\xfe\xd6\xfe\xa4\xfe֬\x04\x12\x02>\x164\x16\x04P\x16\xfb\xa0\x04\f\x04\xfdt+8\x06?::\x02\n\t\x0f\xc0\x0f\t\n\x02::A\vW\xfe\xb3\x16\x16\x04`\x04\f\x04\x04`\x02\xbc\xfe\xc4EvEEvE\x01<\xb5\a\a\x02\x10.\b\xfe\xa0\x01\x01\xce\"\x9be$IE&\xfeO\x0e\v\v\v\v\x0e\x01\xb1&EI&\xcf{h\b.\b\x01`\x01\x01\xfe\xa0\x00\x01\x00m\xff\x80\x05\x93\x06\x00\x00\"\x00\x00\x01\x13&#\"\a\x13&\x00\x02'\x16327\x1e\x01\x12\x17>\x037\x163271\x0e\x03\a\x06\x03[\r>+)@\r(\xfe\xff\xb0]:2,C?\x8d\xc1*%\x91Zx/658:\x1c@#N\n\x92\x02C\xfd=\v\v\x02\xc3E\x01\xc5\x01(\x8b\x0f\x0fo\xed\xfe\xc4E=\xe9\x93\xcdW\x0e\x0e'c:\x86\x11\xf8\x00\x00\x01\x00\x00\xff\x80\x05\xe1\x05\x80\x00#\x00\x00\x01!\x16\x15\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x10\x1e\x0132>\x037!\x03\x00\x02\xd5\f\xb6\xfe\xafڝ\xfe\xe4\xceyy\xce\x01\x1c\x9d\x01,\xd7\xd1{\xb7\x81ۀ\x80ہW\x92^F!\x06\xfeL\x02\xeeC=\xd9\xfe\xab\xc0y\xce\x01\x1c\x01:\x01\x1c\xcey\xc9\xc9w\x82\xdf\xfe\xf8߂0H\\R%\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x19\x00\"\x00N\x00^\x00\x00\x01\x16\a\x06 '&762\x17\x1632762$\x14\x06\"&5462\x05\x14\x06\"&462\x1674&\"\a&'\x13\x17\x14\x16264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x0432$54'>\x01$\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04G\x10\x10>\xfe\xee>\x10\x10\x06\x12\x060yx1\x06\x12\xfe\xd34J55J\x01\xbf5J44J5\xfbFd$\x82\xb5?\xc84J55%6\x1a\xdd\x13\x06E\xb4\x81#42F%\x1f\x06\x01\x18\xc5\xc6\x01\x18\a\x1e$\x01f\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01q\x10\x0f>>\x0f\x10\x06\x0611\x06\xd4J44%&4Z%44J54R1F$Z\x06\x01\x1b-%45J521\x05\x15\xfe\xc8\aZ%F1#:\x0f\x1b\x1d\x8e\xcaʎ \x19\x0f9\xbb\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x19\x00#\x00Q\x00a\x00\x00\x01\x16\a\x06\"'&762\x17\x162762%\x14\x06\"&5462\x16\x05\x14\x06\"&5462\x1674&#\"\a&'7\x17\x1e\x013264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x1632654'>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xab\r\r5\xec5\r\r\x05\x10\x05*\xce*\x05\x10\xfe\xfe.>.-@-\x01R.>.-@-\xd7<+*\x1fq\x9a6\xab\x01-\x1f -- 0\x15\xbd\x11\x04<\x9ao\x1e,+< \x1a\x05\xf0\xa9\xaa\xf0\x06\x19\x1f\x013\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x97\r\r55\r\r\x06\x06**\x06\x96\x1f..\x1f -- \x1f..\x1f --G*<\x1fN\x04\xf3' ,-@-+*\x05\x12\xfe\xf4\x06M <*\x1e2\r\x19\x17z\xad\xadz\x19\x18\r1\x01\xe4\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x000\x00<\x00\x00\x01754&\"\x06\x15\x11\x14\x06\"&=\x01#\x15\x14\x163265\x114632\x16\x1d\x01\x055#\x15\x14\x06#\"&=\x01\a'\x15\x14\x1626\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03bZt\xa0t\x1c&\x1b\x97sRQs\x1b\x14\x13\x1b\x01\x89\x96\x1b\x14\x13\x1bZOpoO\xfe\xe5\x14\x1b\x1b\x14xzRrqP\x01\x18\x13\x1c\x1c\x136\xdfz~\x14\x1b\x1c\x13{\x1a\x1c{Prr\x01\xad\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\xa3\a\x80\x05]\x00\x1e\x000\x00\x00\x0154&\"\x06\x15\x11\x14\x06#\"&5\x11!\x11\x14\x16265\x114632\x16\x1d\x01\a\x05!\x11\x14\x06#\"&5\x11\x177\x11\x14\x16265\x04&\x02'&\a\x0e\x01#\".\x01'&'\x04#\"&5467%&4>\x037>\x0132\x16\x17632\x16\x15\x14\x06\x0f\x02\x06\x1632654.\x02547'654'632\x1e\x05\x177\x0e\x03\x177.\a'.\x02*\x01#\"\a>\x057\x1e\x02?\x01\x15\x1767>\b?\x01\x06\a\x0e\x01\a\x0e\x02\a\x1e\x01\x15\x14\x03>\x0132\x1e\x03\x17\x06#\"'\x017\x17\a\x01\x16\x15\x14\x0e\x03\a'>\x023\x01\a'>\x0132\x133\x17\a\x015\x15\x0f\x01?\x02\x04\xc6K\x89cgA+![,7*\x14\x15\n\x18\f2\x03(-#\x01=\x05\x11\a\x0e\x06\n\a\t\x04\a\x0f\x1a\x12/\x0e~[\x10(D?\x1dG\b\f \x16\f\x16\xf7|\x1c,)\x19\"\x0e#\v+\b\a\x02)O\xfc\xb4\x0e8,\x11\x03+\xf7'\xb96\t\x1b\x1d\x17\x19\x02y{=@\xfe\xf90mI\x01\xa1\x03#938\x04\a\x15OA\x1c\xfeE`\x06\n-\f\x13\xd3\x1f\n)\x03y\x01\x02\x01\x02\x01\x02_\x03/FwaH8j7=\x1e7?\x10%\x9c\xad\xbc\x95a\x02\x04\x05\t\x05%\a\x1d\f\x1e\x19%\x16!\x1a?)L\x0f\x01\x15\n\x10\x1fJ\x16\r9=\x15\x02\x1a5]~\x99\x14\x04\x1ap\x16\x10\x0f\x17\x03j\x0e\x16\r\n\x04\x05\x02\x01\r \x11%\x16\x11\x0f\x16\x03(\x10\x1a\xb7\xa01$\"\x03\x14\x18\x10\x12\x13,I\x1a \x10\x03\x0e\r$\x1f@\x1c\x19((\x02\v\x0f\xd6\x05\x15\b\x0f\x06\n\x05\x05\x02\x03\x04\x01+\x1e!\x1a.\x1bS\t\t-\x1c\x01\x01L\x01__\x15$'\x17-\x119\x13L\x0f\t5V\xa5\xc6+\x03\t\n\t\x136\a\v\xfcT\x1a+\x1f6.8\x05-\v\x03$\f\xb10\xfe\xd0\x0f\x01\a\x0f\v\b\a\x01+\x02\r\a\x02t\x14\x11\x01\f\xfd|S\f\x061\x01\x01\x05\x02\x03\x04\x01\x00\x00\x04\x00\x00\xff\x12\x06\x00\x05\xee\x00\x17\x006\x00]\x00\x83\x00\x00\x05&\a\x0e\x01#\"'&#\"\a\x0e\x01\x17\x1e\x0167>\x0276'&'&#\"\a\x06\a\x06\x17\x1667>\a32\x1e\x01\x17\x1e\x0176\x014.\x02#\"\x0e\x01#\x06.\x03\a\x0e\x01\a\x06\x17\x1e\x0132>\x02\x17\x1e\x03\x17\x1667>\x017\x14\x02\x06\x04 $&\x0254>\x057>\x037>\x017\x16\x17\x1e\x01\x17\x1e\x06\x04\x8f\x05\x13\x1erJ\x81@\x05\b\v\x0f\a\x01\b\"kb2)W+\a\f,\x13\x14\x175/\x18\x1d1\x1a\x0e\t\x11\x17\x03\x0f\x06\x0e\t\x10\x0e\x13\v\x1b#\v\b\n\x05\n\x17\x01Z\n\x17-\x1e!\x80\x82$\x1bIOXp7s\xa4\x02\x02L\x1dCF9\x96vz \x1aNAG\x14#/ \x1c\x1d5|\xd0\xfe\xeb\xfe\xd0\xfe\xe6Հ';RKR/\x13\x0eJ#=\x1e$,\b\x819,\xac+\x15$UCS7'2\x13\x0e\x16\"1\x04\f\x06\x14\n \x1c\x03\x03\x04!\x1b\a\f\x84/\x0e\x0f\n\f,\x18\x14\b\a\x14\x02\r\x04\n\x04\x06\x03\x02\x0f\x0e\x0f\x11\x06\x04\f\x01/\x16--\x1cST\x01(::(\x01\x01\x9bep4\x14\x11AM@\x01\x01=I>\x01\x03\".)xΤ\xfe\xe7\xbfls\xc7\x01\x1c\xa0Y\xa7|qK@\x1d\n\b%\x14(\x18\x1cYQ\x9b&\x1dN\x1b\r\x18EHv~\xab\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00<\x00Z\x00x\x00\x00\x01\x0f\x02\x0e\x01'\x0e\x01#\"&5467&6?\x01\x17\a\x06\x14\x17\x162?\x03\x03\x17\a'&\"\x06\x14\x1f\x03\a/\x02.\x017.\x0154632\x16\x176\x16\x01\x14\x06#\"&'\x06&/\x017\x17\x16264/\x037\x1f\x02\x1e\x01\a\x1e\x01\x03\x14\x06\a\x16\x06\x0f\x01'764&\"\x0f\x03'?\x02>\x01\x17>\x0132\x16\x04.\xa0\x97\x1eA\xadU\x10pIUxYE\x16.A\f\x97\v%%%h%\x1e\x97\xa1\xbe\f\x98\f%hJ%\x1d\x98\xa0\x97\xa1\x97\x1eD,\x1bFZxULs\fT\xab\x03gxUJr\x0eV\xbbD\v\x97\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1d@/\x15Le\x02fL\x1a.C\f\x97\f%Jh%\x1e\x98\xa0\x98\xa1\x98\x1dC\xb8V\vsNUx\x01Ϡ\x98\x1e@.\x15FZyUHp\x10V\xaeA\f\x98\v%h&%%\x1e\x98\xa0\x02\x12\f\x98\f%Ji%\x1d\x98\xa0\x98\xa0\x98\x1eC\xb9W\x0fpIUybJ\x14/\xfb\x95Uy^G\x1c,D\f\x98\f%Jh%\x1e\x98\xa0\x98\xa0\x98\x1e@\xadU\vs\x04\x17Mt\vU\xb7C\f\x98\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1eC-\x1aKfy\x00\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00E\x00X\x00[\x00_\x00g\x00j\x00\x89\x00\xa3\x00\x00\x01\x06&/\x01&'.\x01'\x06\a\x06\a\x0e\x01'67>\x017>\x017&\a\x0e\x02\a\x06\x14\a\x06\a\x06'&'&'>\x0176763>\x017>\x02\x17\x16\a\x14\x0e\x01\a\x06\a\x17\x1e\x01\x17\x1e\x01\x03\x16\a\x06\a\x06#&'&'7\x1e\x0167672\x05\x17'\x01%\x11\x05\x01\x17\x03'\x03\x177\x17\x01\x05\x11\x01\x17\a'\x06\a\x06+\x01\"&'&54632\x1e\x01\x17\x1e\x013267>\x027\x01\x11%\x06\x04#\"'4'\x11676767\x11\x052,\x0132\x15\x11\x02\x8e\x01\x17\x14\x14,+\aD\x04CCQ\x18\x04\x1f\x03\x06L\x15\x81\x0e\x11D\x02\bf\b'\x1e\x02\x02\x01\x05\x1a\x17\x18\x12\n\x04\x01\x06%\v:/d\x02\nB\v\t\x19\x04\x04\x02\x03\x19\x1c\x03\x194@\f}\x05\x04\r\xcf\x03\a\f&\x1e\x1e\x1a\x17\x0e\x04\x01\x03!\x140$\x13\x11\x02\xbe?\x8b\xfb\xf8\x02\xb6\xfdJ\x04\xd9f\xb5d\xd8f-\xd3\xfe.\x02=\xfe\xfa\x9e6(\x82\x92:!TO\xf1?\b\n\b\x04\x1c!\x04I\xadG_\x90U\x0f\x1f%\n\x01\x95\xfc\xfa\x0e\xfd.\a\r\x05\x01\x03\x01\x05\x0fk*\x02.\x02\x01=\x01;\x04\x14\x01\xca\x03\a\b\t\x14\x1d\x055\x02gN_\x0f\x02\x04\x02\x04X\x18\xb6\x1b\x1e\x89\t\x01\"\x02\v\b\x01\x02\x11\x01\n\x05\a\a\x04\x11\x06\x11\x02\x06\x03\x10\x10#\x02#\x04\x03\n\x01\x01\f\x15\x0229\x052Q\x1c\x064\x02\x011\x01\xe0\x0f\r\x17\x0f\f\x03\x17\x0f\x1a\x03\x03\x04\x04\x0e\f\x02\x92\xe3*\xfd\x99\xe8\x04\b\xe9\xfd6\x1f\x02\x91\x1f\xfd\xe8\x1fnA\x03;\xb8\x01|\xfa\x11\r\xa0BS\x19\fN.\a\t\b\v\x0f\x12\x02%1\x1d$\a\x11\x15\x06\x04\x80\xfb\xc9\xf6\x06\xf3\r\x01\x02\x046\t\x01\x06\x05$\x0e\x01\x80\xc6nk\x15\xfe^\x00\f\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00'\x007\x00G\x00W\x00g\x00w\x00\x87\x00\x97\x00\xa7\x00\xb7\x00\xc0\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11463\x05\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x1f\x01\x1e\x01\x15\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x13\x11#\"&=\x01!\x11\x01 B^^B\x80B^^B\x05\xe0:F\x96j\xfc\xa0B^8(\x02\xa0(`\x1c\x98\x1c(\xfd \x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12`\xa0(8\xfd\x80\x04\x80^B\xfb\xc0B^^B\x04@B^\xa3\"vE\xfd\x00j\x96^B\x06\x00(8(\x1c\x98\x1c`(\xfb\x80\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x8e\x01\x008(\xa0\xfe\x00\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01/\x01?\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x05@\x1a&&\x1a\xfb\x00\x1a&&\x1a\x01\xc0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x06\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xb2@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfb\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x02\x00@\xff\x10\x04\xc0\x05`\x00\x1f\x00'\x00\x00\t\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11\x01&4762\x1f\x01!762\x17\x16\x14$\x14\x06\"&462\x04\xa4\xfe\xdcB\\B@B\\B\xfe\xdc\x1c\x1c\x1dO\x1c\xe4\x01p\xe4\x1cP\x1c\x1c\xfe\xa0\x83\xba\x83\x83\xba\x03\xdc\xfe\xdc\xfc\xc8.BB.\x01\x80\xfe\x80.BB.\x038\x01$\x1cP\x1c\x1c\x1c\xe4\xe4\x1c\x1c\x1dO広\x83\xba\x83\x00\x05\x00\x00\xff\x80\x06\x80\x05\x80\x00\x0f\x00\x1d\x003\x00C\x00Q\x00\x00\x01\x14\x0e\x01#\".\x0154>\x0132\x1e\x01\x01\x14\x06#\".\x0154632\x1e\x01\x052\x04\x12\x15\x14\x0e\x02#\"&#\"\x06#\"54>\x02%\".\x0154>\x0132\x1e\x01\x15\x14\x0e\x01%2\x16\x15\x14\x0e\x01#\"&54>\x01\x03\f&X=L|<&X=M{<\xfe\xaaTML\x83FTML\x83F\x01\x8av\x01\x12\xb8\"?B+D\xef?B\xfdJ\xb7p\xa7\xd0\x01H=X&<{M=X&<|\x01dMTF\x83LMTF\x83\x04(\x012\x1e\x01\x02\xc0r_-\x02$\x1a\xc0\x1a$\x02-_rU\x96\xaa\x96U\x03\xf0\x91\xc5%\xfc\xcb\x1a&&\x1a\x035%ő\x80\xf3\x9d\x9d\xf3\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\x1f\x00\x00\x05\x01\x11\x05'-\x01\r\x01\x11\x14\x06\a\x01\x06\"'\x01.\x015\x11467\x0162\x17\x01\x1e\x01\x03\x80\x02\x80\xfd\x80@\x02\xba\xfdF\xfdF\x05\xfa$\x1f\xfd@\x1cB\x1c\xfd@\x1f$.&\x02\xc0\x16,\x16\x02\xc0&.]\x01]\x02|\xe9q\xfe\xfe\xfe\x02\xfd\x00#<\x11\xfe\x80\x10\x10\x01\x80\x11<#\x03\x00(B\x0e\x01\x00\b\b\xff\x00\x0eB\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00B\x00\x00\x05%\x11\x05'-\x01\x05\x01%\x11\x05'-\x01\x05'%\x11\x05'-\x01\x05\x01\x11\x14\x06\a\x05\x06\"'%&'\x06\a\x05\x06\"'%.\x015\x11467%\x11467%62\x17\x05\x1e\x01\x15\x11\x05\x1e\x01\x02\x80\x01\x80\xfe\x80@\x01\x94\xfel\xfel\x05\xd4\x01\x80\xfe\x80@\x01\x94\xfel\xfel,\x01\x80\xfe\x80@\x01\xb9\xfeG\xfeG\x05\xf9&!\xfe@\x19@\x19\xfe@\x04\x03\x02\x05\xfe@\x19@\x19\xfe@!&+#\x01\xb2+#\x01\xc0\x176\x17\x01\xc0#+\x01\xb2$*`\xc0\x01:\xa4p\xad\xad\xad\xfd\x8d\xc0\x01:\xa4p\xad\xad\xadx\xa5\x01\n\xa4p\xbd\xbd\xbd\xfd=\xfe`$>\x10\xe0\x0e\x0e\xe0\x02\x02\x02\x02\xe0\x0e\x0e\xe0\x10>$\x01\xa0&@\x10\xba\x01\x90&@\x10\xc0\n\n\xc0\x10@&\xfep\xba\x10@\x00\x00\x06\x00\x00\xff\xfe\b\x00\x05\x02\x00\x03\x00\t\x00\x1f\x00&\x00.\x00A\x00\x00\x01!\x15!\x03\"\x06\a!&\x032673\x02!\"\x0254\x0032\x1e\x01\x15\x14\a!\x14\x16%!254#!5!2654#!%!2\x1e\x02\x15\x14\a\x1e\x01\x15\x14\x0e\x03#!\a8\xfe\x01\x01\xff\xfcZp\x06\x01\x98\x12\xa6?v\x11\xddd\xfe\xb9\xd6\xfd\x01\x05Ί\xcde\x02\xfdns\xfb6\x01(\xcd\xc7\xfe\xd2\x01\x19N[\xbe\xfe\xfc\xfe\xeb\x02RW\x88u?\xacrt1Sr\x80F\xfd\x9d\x04\xad|\xfe\xd2iZ\xc3\xfd\xb7@7\xfe\xcd\x01\b\xd7\xd0\x01\x13\x88މ\x11\x1eoy2\xa7\xb4\xbeIM\x90\xd7\x1cC~[\xb5R \xa6yK{T:\x1a\x00\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1e\x00%\x00,\x00A\x00G\x00K\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x13!\x11!2654'654.\x02\x03#532\x15\x14\x03#532\x15\x14\x05\"&5!654&#\"\x06\x15\x14\x16327#\x0e\x01\x032\x17#>\x01\x03!\x15!\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\xd3\xfe\x8d\x01~u\xa0\x8fk'JTM\xb0\xa3wa\xb9\xbd|\x02\nDH\x01\x9b\x01\x95\x81\x80\xa4\x9e\x86\xcd>\x8a\vI1q\v\xfe\x04Fj\x01?\xfe\xc1\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfe\x91\xfc\xedsq\x9e*4p9O*\x11\xfe¸Z^\xfe\xb1\xd9qh LE\n\x14\x84\xb1\xac\x82\x87\xa4\xbf\"(\x01nz8B\x01\nM\x00\x00\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x00\x1b\x00'\x00?\x00\x00\x00\x14\x06\"&462\x004&#\"\a\x17\x1e\x01\a\x0e\x01'.\x01'\x1e\x0132\x014&#\"\x06\x15\x14\x163267\x14\x00#\x01\x0e\x01#\"&/\x01\x11\x05632\x17\x016\x0032\x00\x06.\x8fʏ\x8f\xca\xfd\x8d\x92h\x1b\x1bhMA\x1f\x1f\x98L\x15R\x14 vGh\x03г~\u007f\xb3\xb3\u007f~\xb3\x96\xfe\xf5\xbc\xfeK\f\u0084y\xba\x19\xe6\x01\x85O^\r\x16\x01\x1c\x02\x01\v\xbb\xbc\x01\v\x04\x1fʏ\x8fʏ\xfb\xbeВ\x06*\x1f\x97LM@\x1f\b!\b\xfeשw\x03\xc0w\xa9\xf7\x8eȍ\x8dde\x8d\x03)\xa0qrOPq\xfeȦs:0\x14\x14\x183=\x027\x16\x1b\x01'\x0e\x03\x0f\x01\x03.\x01?\x0167'\x01\x03\x0e\x01\x0f\x01\x06\a\x17\x03\x13\x17\x1667\x01\x06\x03%'\x13>\x01\x17\x1e\x05\x01\x13\x16\x06\a\x0e\x05\a&\x03%'7\x03%7.\x03/\x01\x056\x16\x1f\x01\x16\x03D\x0f\x02\xfe\\$>\x10\v\a\x0f\t\"\x02N,\xb4\x93?a0\x1f\x03\x04\xbe\x11\x02\a\b#O\x8c\x06\x80\xbc\f1\x13\x12G\x94\b\xe6\xd3\a\xaa\xe29\xfd'/\xda\xfe\xc3\x13\xe1\x14P(\x181#0\x180\x02\x97\xd4\x12\v\x16\r($=!F\v\"\xe7\x019|\x8e\xdc\xfe]\x97\"RE<\x11\x11\x01\x95\x1f6\f\v'\x01o\xfe\x90\x16\x1d\x039%\x1b8J$\\\a\f\x02:\xfe\x85\\H\x91iT\x15\x15\x01e\x1a<\x11\x12?}V\xfd\xea\xfe\x99\x1d#\x03\x04\a\x05\xa4\x01o\x01j\xad\x10\x16\x16\x03\xb2?\xfe\x8c\xbb\f\x01d\x1f\x1c\x04\x02\x14\x16,\x196\xfe\xc5\xfe\x95%N#\x14\"\x16\x16\n\x12\x03H\x01l\xc3\xedS\xfe\x8b\x14VY\x9a]C\r\r\x01\x03\x1b\x0f\x0f=\x00\x00\x04\x00\x00\xff@\b\x00\x05\x80\x00\a\x00\x11\x00\x19\x00C\x00\x00\x004&\"\x06\x14\x162\x13!\x03.\x01#!\"\x06\a\x004&\"\x06\x14\x162\x13\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x013!2\x16\x17\x1332\x16\x01\xe0^\x84^^\x84\x82\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x05\x03^\x84^^\x84\xfe\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x03\x00b\xa2\x17i\x1c]\x83\x01~\x84^^\x84^\x01\xe0\x01e\b\x13\x13\b\xfd\x19\x84^^\x84^\x01\x00\xfe\x80\x0e\x12\x80PppP\x80\x80PppP\x80\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\u007f^\xfe]\x83\x00\x04\x00\x00\xff\x00\b\x00\x06\x00\x003\x00;\x00E\x00M\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x01;\x015463!2\x16\x1d\x0132\x16\x17\x13\x00264&\"\x06\x14\x01!\x03.\x01#!\"\x06\a\x00264&\"\x06\x14\a ]\x83\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x80\x12\x0e\x01\xc0\x0e\x12\x80b\xa2\x17i\xf9\xfa\x84^^\x84^\x01d\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x04!\x84^^\x84^\x02\x80\x83]\xfe\x80\x0e\x12@PppP@@PppP@\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\xe0\x0e\x12\x12\x0e\xe0\u007f^\xfe]\xfe ^\x84^^\x84\x01\x82\x01e\b\x13\x13\b\xfc\xbb^\x84^^\x84\x00\x01\x00 \xff\x00\x05\xe0\x06\x00\x003\x00\x00$\x14\x06#!\x1e\x01\x15\x14\x06#!\"&5467!\"&47\x01#\"&47\x01#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x01\x16\x14\x06+\x01\x01\x05\xe0&\x1a\xfe2\x01\n$\x19\xfe\xc0\x19$\n\x01\xfe2\x1a&\x13\x01\x92\xe5\x1a&\x13\x01\x92\xc5\x1a&\x13\x01\x80\x134\x13\x01\x80\x13&\x1a\xc5\x01\x92\x13&\x1a\xe5\x01\x92Z4&\x11\x8d&\x19##\x19&\x8d\x11&4\x13\x01\x93&4\x13\x01\x93&4\x13\x01\x80\x13\x13\xfe\x80\x134&\xfem\x134&\xfem\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00+\x00D\x00P\x00\x00\x014'&#\"\a\x06\x15\x14\x16327632\x17\x1632674'&!\"\a\x06\x15\x14\x1632763 \x17\x16326\x134'&$#\"\a\x0e\x01\x15\x14\x16327632\x04\x17\x1632>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x04g\x1e\xc1\xfe\x85\x9a*\x1b\x16\x05 \x84o\xe2\xab\x13\x0e\x13\x1c`#\xed\xfeə\x960#\x19\a\x1ez\x81\x01\x17\xd1\x18\x0e\x19#l(~\xfe\xb2\xb0̠\x17\x1f)\x1f\v\x1d\x85\xae\x9f\x01-g\x15\x13\x1d+\xcd\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01F \x13s\"\t+\x14\x1d\b\x1bg\v\x1b\xec(\x15\x8d*\r3\x19#\b!|\r#\x01\x11/\x17IK/\a%\x1e\x1f*\b%D=\f)[\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x04\x00\x06\x00\x00\x13\x00\x00\t\x01\x17!\x11!\a\x03\a!\x11\x01'!\x11!7\x137!\x04\x00\xfe\xd1\x18\x01\x17\xfe\x05,\x8e\x1e\xfe\xd3\x01/\x18\xfe\xe9\x01\xfb,\x8e\x1e\x01-\x04\xd1\xfd\xba\x1f\xfea\x1e\xfe\xef\x1e\x01/\x02G\x1e\x01\x9f\x1e\x01\x11\x1e\x00\x00\x00\x11\x00\x00\x00\x8c\t\x00\x04t\x00\x0e\x00%\x00/\x00;\x00<\x00H\x00T\x00b\x00c\x00q\x00\u007f\x00\x8d\x00\x90\x00\x9e\x00\xac\x00\xc0\x00\xd4\x00\x00%7\x03.\x01#\"\x06\x15\x03\x17\x1e\x0132%7\x034'&\"\a\x06\x15\a\x03\x14\x17\x15\x14\x17\x1632765\x01\x17\a\x06\"/\x017627\x17\a\x06#\"5'7432\x01\x03\x17\a\x14#\"/\x017632\x1f\x01\a\x06#\"5'7432\x1f\x01\a\x06#\"&5'74632\t\x01\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x06#\"/\x01\x134632\x16\x019\x01\x03\x13\a\x14\x06\"&/\x01\x13462\x16\x17\x13\a\x14\x06\"&/\x01\x13>\x012\x16\x13\a1\x14\x06\"&/\x02\x13567632\x17\x16\x17\x01\x14\x06#!.\x015\x1147632\x00\x17632\x16\x03\x10\x10\x10\x01\r\n\t\x0e\x0e\x0e\x01\r\t\x16\x01*\v\f\r\b\x10\b\r\x01\n\v\x06\t\x0e\v\t\t\xfb\xec\x14\x14\x02\x0e\x02\x11\x11\x02\x0eX\x1a\x1a\x02\b\t\x17\x17\t\b\x01\x1a\xbc\x19\x19\v\n\x02\x15\x15\x02\n\v^\x17\x17\x02\f\r\x15\x15\r\f`\x15\x15\x02\x0e\x06\t\x14\x14\t\x06\x0e\x01\x81\xfe\xdf\x15\x15\n\a\x10\x02\x12\x12\x02\x10\a\n^\x13\x13\v\b\x12\x02\x10\x10\x02\x12\b\vb\x12\x12\x02\x14\x13\x02\x10\x10\r\b\t\f\x01\x89\xc6\x0f\x0f\x0f\x14\x0e\x01\x0e\x0e\x0f\x14\x0fc\x0e\x0e\x10\x16\x10\x01\f\f\x01\x10\x16\x0f\xd5\x0e\x12\x1a\x12\x01\x06\x06\f\x02\n\t\v\b\a\x0e\x02\x04f\xa6u\xfc\xee\r\x12\x1cU`\xc3\x01\x1e\x1159u\xa6\xa4\xf1\x02\v\n\x0e\x0e\n\xfd\xf5\xf1\n\r4\xd3\x02J\x10\b\x05\x05\b\x10\x06\xfd\xbd\x01\xeb\x01\n\a\v\t\a\r\x01l\x80~\t\t~\x80\tF\xcf\xcb\t\n\xca\xcf\t\xfe2\x01\xeb\xf5\xed\v\v\xed\xf5\f\x05\xfc\xf4\r\r\xf4\xfc\r\x1f\xea\xf6\x10\t\a\xf6\xea\x06\t\xfe\x16\x02m\xfe\x84\xf6\a\v\x12\xf6\x01|\x12\vO\xfe,\xf4\b\v\x13\xf4\x01\xd4\x13\v \xfe\x06\xf2\x15\x15\xf2\x01\xfa\t\r\r\xfd\x11\x02\xea\xfe\x02\xef\n\x0f\x0e\v\xef\x01\xfe\v\x0e\x0e\x1e\xfe\x14\xec\v\x10\x10\v\xec\x01\xec\f\x10\x10\xfe\b\xe7\r\x12\x12\rru\x02|\x03\x0f\t\a\x05\b\x12\xfd\x94u\xa5\x02\x12\r\x03\x83\x17\n\"\xfe\xf9\xc0\x16\xa6\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\r\x00\x1b\x00)\x009\x00\x00\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 \x04\x16\x1d\x01\x14\x06\x04 $&=\x0146\x02\x13\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\xb9\x01\xa0\x01b\xce\xce\xfe\x9e\xfe`\xfe\x9e\xce\xce\x03\x00VT\xaaEvEEvE\xaaT\xfc\xaaVT\xaaEvEEvE\xaaT\x01*VT\xaaEvEEvE\xaaT\x04*EvE\x80EvEEvE\x80Ev\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00^\x00c\x00t\x00\u007f\x00\x87\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x17632\x17\x16\a\x14\x06\a\x15\x06#\"&'\x06\a\x02#\"/\x01&'&7>\x0176\x17\x16\x156767.\x0176;\x022\x17\x16\a\x06\a\x16\x1d\x01\x06\a\x16\x0167\x0e\x01\x01\x06\x17674767&5&5&'\x14\a\x0367.\x01'&'\x06\a\x06\x05&#\x163274\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\xfe!3;:\x93\x1e\x10\x0e\x02\x01\x06A0\x86?ݫ\x99Y\x0f\r\x18\x01\x05\n\x04\t^U\x0e\t\x0247D$\x18\r\r\v\x1f\x15\x01\x17\f\x12\t\x02\x02\x01\x02\f7\xfe\x1b4U3I\x01\x81\x0f\r\x01\x06\a\x01\x03\x01\x01\x01\f\x01|\x87\x95\x02\x16\x05L3\x1b8\x1e\x02w\x18tL0\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x02Q\x1a\x1e\a1\x16\x1e\x01\x02\x01\x01&(!\x18;\xfe\xfa\a\f\x01\x04\n\x1a(g-\t\x0f\x02\x02Up\x88~R\x9b2(\x0f\x15/\x06\x02\x03\x05\x1e{E\xa4\xfe\x1b\x18\x86(X\x03z*Z\a%\x03(\x04\x04\x01\x01\x02\x01\x16\x0e\x01\x01\xfdi6\x1b\x01\x11\x05CmVo8\v\x18\x1c\x01\x01\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00T\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x13\x153\x133\x1367653\x17\x1e\x01\x17\x133\x1335!\x153\x03\x06\x0f\x01#4.\x015.\x01'\x03#\x03\x0e\x01\x0f\x01#'&'\x0335\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00iF\xa4\x9f\x80\a\x03\x02\x04\x03\x01\x05\x03\x80\x9f\xa4F\xfe\xd4Zc\x05\x02\x02\x04\x01\x02\x01\x06\x02\x90r\x90\x02\x05\x01\x04\x04\x02\x02\x05cZ\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80k\xfdk\x01\xe5\x14\x1a\x10\b\x18\x03\"\t\xfe\x1b\x02\x95kk\xfeJ\x14\x1a\x15\x03\a\t\x02\x05 \t\x02!\xfd\xdf\t\x1f\x06\x15\x15\x1a\x14\x01\xb6k\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#7>\x02;\x01\x16\x17\x1e\x02\x1f\x01#\x15!5#\x03\x1335!\x153\a\x0e\x01\x0f\x01#&'&/\x0135!\x153\x13\x03\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01-\x01\x19Kg\x05\n\x05\x01\x02\x01\x04\x02\x05\a\x03kL\x01#D\xc0\xc3C\xfe\xe9Jg\x04\f\x03\x02\x02\x01\x04\x06\vjL\xfe\xdeD\xbd\xc2\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa1\a\x13\b\x04\x06\x04\a\t\x04\xa1jj\x01\x11\x01\x1akk\x9f\a\x13\x04\x03\x04\x06\v\f\x9fkk\xfe\xf0\xfe\xe5\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x008\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#5327>\x0154&'&#!\x153\x11\x01#\x1132\x17\x16\x15\x14\a\x06\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01 \x01G]\x89L*COJ?0R\xfe\x90\\\x01\x05wx4\x1f8>\x1f\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa7\x0f\x17\x80RQx\x1b\x13k\xfd\xd5\x01\x18\x01\f\x12!RY\x1f\x0f\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00*\x002\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x11!57\x17\x01\x04\"&462\x16\x14\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x80\xfc\x00\xc0\x80\x01\x80\xfeP\xa0pp\xa0p\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x01\xc0\xfe\xc0\xc0\xc0\x80\x01\x80\x80p\xa0pp\xa0\x00\x00\t\x00\x00\xff\x00\x06\x00\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00#\x00*\x007\x00J\x00R\x00\x00\x015#\x15\x055#\x1d\x015#\x15\x055#\x15\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11#\x15#5!\x11\x01\x13\x16\x15\x14\x06\"&5476\x1353\x1532\x16\x02264&\"\x06\x14\x02\x80\x80\x01\x00\x80\x80\x01\x00\x80\x03<\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\x80\x80\xfe\x00\x02\x8dk\b\x91ޑ\b\x15c\x80O\x16\"\xbcjKKjK\x04\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\x80\x80\xfa\x00\x02\xd1\xfe\xa3\x1b\x19SmmS\x19\x1b?\x01M\x80\x80\x1a\xfe\x1a&4&&4\x00\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x009\x00L\x00^\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x15\x11\x14\a\x06#\"/\x01#\"&=\x0146;\x0176\x01276\x10'.\x01\a\x0e\x01\x17\x16\x10\a\x06\x16\x17\x16'2764'.\x01\x0e\x01\x17\x16\x14\a\x06\x16\x17\x16\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\xec\x14\x14\b\x04\f\v\xa6\x83\x0e\x12\x12\x0e\x83\xa6\x10\x01\xb4\x1f\x13\x81\x81\x106\x14\x15\x05\x11dd\x11\x05\x15\x12\xbd\x1b\x14WW\x126&\x02\x1344\x13\x02\x13\x14\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03.\b\x16\xfd\xe0\x16\b\x02\t\xa7\x12\x0e\xc0\x0e\x12\xa7\x0f\xfdG\x18\x9f\x01\x98\x9f\x15\x06\x11\x115\x15{\xfe\xc2{\x155\x10\x0f\x94\x14]\xfc]\x13\x02$5\x149\x949\x145\x12\x11\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x16\x15\x11\x14\a\x06#\"'\x015\x01632\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\x804LL4\xfe\x804LL4\x03l\x14\x14\b\x04\x0e\t\xfe\xf7\x01\t\t\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80L4\xfe\x804LL4\x01\x804L\x02\b\x16\xfd\xc0\x16\b\x02\t\x01\nZ\x01\n\t\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x007\x00K\x00[\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01>\x01\x1f\x01\x1e\x01\x0f\x01\x17\x16\x06\x0f\x01\x06&'\x03&7!\x16\a\x03\x0e\x01/\x01.\x01?\x01'&6?\x016\x16\x17\x01.\x017\x13>\x01\x1f\x01\x1e\x01\a\x03\x0e\x01'\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01`\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xe2\x0e\x0e\x04\x04\x0e\x0e\xe2\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xfev\r\x0f\x02\x8a\x02\x16\r?\r\x0f\x02\x8a\x02\x16\r\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\x01-\x13\x13\x13\x13\xfe\xd3\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\xfd\x06\x02\x16\r\x03?\r\x0f\x02\n\x02\x16\r\xfc\xc1\r\x0f\x02\x00\x01\x00'\xff\x97\x05\xd9\x06\x00\x006\x00\x00\x01\x15\x06#\x06\x02\x06\a\x06'.\x04\n\x01'!\x16\x1a\x01\x16\x1767&\x0254632\x16\x15\x14\a\x0e\x01\".\x01'654&#\"\x06\x15\x14\x1632\x05\xd9eaAɢ/PR\x1cAids`W\x1b\x01\x1b\x1aXyzO\xa9v\x8e\xa2д\xb2\xbe:\a\x19C;A\x12\x1f:25@Ң>\x02\xc5\xc6\x17\x88\xfe\xf2\xa1\x1a-0\x115r\x8f\xe1\x01\a\x01n\xcf\xda\xfe\x97\xfe\xef\xc6`\xa9\xedH\x01(\xb9\xc0\xf5\xd3\xc0\x9f\u007f\x01\x04\f' gQWZc[\xba\xd7\x00\x00\b\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x06\x00\n\x00\x0e\x00\x12\x00\x15\x00\x19\x00-\x00\x00\x13\x01\x11%\x057'\t\x01%\x05'-\x01\x05'%\x11\t\x01\x17\x11\x05%\x01\x11\x05\x11\x14\a\x01\x06\"'\x01&5\x1147\x0162\x17\x01\x16\xd8\x02[\xfe\xb2\xfe\xb5\xc1\xc1\x033\x02[\xfe\xf3\xfe\xb2M\x01\x10\xfe\xf0\xfe\xf0\x8b\x01N\xfd\xa5\x04\xcd\xc1\xfe\xb5\x01\r\xfd\xa5\x033\"\xfc\xcd\x15,\x15\xfc\xcd\"\"\x033\x15,\x15\x033\"\x01o\xfen\x01g\xdf$\x81\x81\xfc\xdc\x01\x92\xb4߆\xb6\xb6\xb6]\xdf\x01g\xfen\xfe\xef\x81\x01\x02$\xb4\x01\x92\xfe\x99+\xfd\xde)\x17\xfd\xde\r\r\x02\"\x17)\x02\")\x17\x02\"\r\r\xfd\xde\x17\x00\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05x\x00#\x00W\x00\x00\x01\x1e\x01\x15\x14\x06#\"&#!+\x02.\x015467&54632\x176$32\x04\x12\x15\x14\x06\x01\x14\x16327.\x01'\x06#\"&54632\x1e\x0532654&#\"\a\x17632\x16\x15\x14\x06#\".\x05#\"\x06\a\bo\x89\xec\xa7\x04\x0f\x03\xfbG\x01\x02\x05\xaa\xecn\\\f\xa4u_MK\x01'\xb3\xa6\x01\x18\xa3\x01\xfą|\x89g\x10?\fCM7MM5,QAAIQqAy\xa7\xa8{\x8fb]BL4PJ9+OABIRo?z\xaa\x02\xfc.\xc7z\xa4\xe9\x01\n\xe7\xa5n\xba6'+s\xa2:\x9a\xbc\xa1\xfe\xec\xa3\x06\x18\xfe\xf0z\x8ec\x14I\x0eAC65D*DRRD*\x8fwy\x8eal@B39E*DRRD*\x8d\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00\x00\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \a\x1762\x177\x017&47'\x06\x10\x00 7'\x06\"'\a\x12 6\x10& \x06\x10\x05\x176\x10'\a\x16\x14\x02\xca\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x02\xc0\xfe\x84\xab\xc2R\xaaR\xc2\xfb\xf1\xc2\x1c\x1c\xc2Z\x02B\x01|\xab\xc2R\xaaR\xc2\xca\x01>\xe1\xe1\xfe\xc2\xe1\x03d\xc2ZZ\xc2\x1c\x06\x00\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x0eZ\xc2\x1c\x1c\xc2\xfb\xf1\xc2R\xaaR«\xfe\x84\xfd\xbeZ\xc2\x1c\x1c\xc2\x01&\xe1\x01>\xe1\xe1\xfe\xc2\b«\x01|\xab\xc2R\xaa\x00\x01\x00 \xff \x06\xe0\x05\xd7\x00!\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x12$7\x15\x06\x00\x15\x14\x1e\x02 >\x0254\x00'5\x16\x04\x12\x06\xe0\x89\xe7\xfe\xc0\xfe\xa0\xfe\xc0\xe7\x89\xc2\x01P\xce\xdd\xfe\xddf\xab\xed\x01\x04\xed\xabf\xfe\xdd\xdd\xce\x01P\xc2\x02\x80\xb0\xfe\xc0牉\xe7\x01@\xb0\xd5\x01s\xf0\x1f\xe4-\xfe\xa0\xe6\x82\xed\xabff\xab\xed\x82\xe6\x01`-\xe4\x1f\xf0\xfe\x8d\x00\x00\x01\x00\x13\xff\x00\x06\xee\x06\x00\x00c\x00\x00\x136\x12721\x14\a\x0e\x04\x1e\x01\x17\x1e\x01>\x01?\x01>\x01.\x01/\x01.\x03/\x017\x1e\x01\x1f\x016&/\x017\x17\x0e\x01\x0f\x01>\x01?\x01\x17\x0e\x01\x0f\x01\x0e\x01\x16\x17\x1e\x01>\x01?\x01>\x02.\x04/\x01&3\x161\x1e\b\x17\x12\x02\x04#\"$&\x02\x13\b\xd8\xc5\x05\x01\b(@8!\x05IH2hM>\x10\x10'\x1c\x0f\x1b\r\x0e\n)-*\x0e\rh'N\x14\x13\x01'\x15\x14\xa1\xa0!'\x03\x04\x16O\x1c\x1cg,R\x13\x13\x1f\"\x14/!YQG\x16\x15\x0154'6\x133&5\x1147#\x16\x15\x11\x14\x055\x06#\"=\x0132\x1635#47#\x16\x1d\x01#\x15632\x163\x15#\x15\x14\x1e\x0332\x014&\"\x06\x15\x14\x1626%\x11\x14\x06#!\"&5\x11463!2\x16\x02F]kbf$JMM$&\xa6N92Z2\x1d\b\x02\a\x18\x06\x15&`\x06\xe3\x06\xab\x0f9\x0eUW=\xfd\xf0N9:PO;:\x16dhe\x03\\=R\x91\x87\x01\xcd\xca\f\n+)\u007f\xb3\x17\b&'\x1f)\x17\x15\x1e-S9\xfe\xd0\x199kJ\xa5<\x04)Um\x1c\x04\x18\xa9Q\x8b\xb9/\xfc\xbe-Y\x02a^\"![\xfd\x9bY\xb1\xc4'(<`X;\x01_\x04\x02\x06\xbeL6#)|\xbe\x04\xfe\x93\x83\x04\x0etWW:;X\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02שw\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x03\x8a\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x009\xff\x00\x04\xc7\x06\x00\x00\x1d\x00I\x00\x00\x00\x14\x06#\"'\x06\a\x02\x13\x16\x06\a#\"&'&>\x03767&5462\x04\x10\x02\x04#\"'.\x017>\x01\x17\x1632>\x024.\x02\"\x0e\x02\x15\x14\x17\x16\x0e\x01&'&54>\x0232\x04\x03JrO<3>5\xf7-\x01\x1b\x15\x05\x14\x1e\x02\x0e\x15&FD(=G\x10q\xa0\x01\xee\x9c\xfe\xf3\x9e@C\x15\x17\x05\x05$\x1539a\xb2\x80LL\x80\xb2²\x80L4\n\r&)\n@]\x9c\xd8v\x9e\x01\r\x04\x14\xa0q#CO\xfe\x8d\xfe\x18\x16!\x02\x1b\x14~\U000ffd42\x0172765'.\x01/\x01\"\a\x0e\x01\a#\"&'&5\x10\x01\x0e\b\x16\r\x01\x11\x0e\xb9}\x8b\xb9\x85\x851R<2\"\x1f\x14\f\x017\x12\x03\x04MW'$\t\x15\x11\x15\v\x10\x01\x01\x02\x05;I\x14S7\b\x02\x04\x05@\xee5sQ@\x0f\b\x0e@\b)\xadR#DvTA\x14\x1f\v;\x14\x04\n\x02\x020x\r\x05\x04\b\x12I)\x01\x04\x04\x03\x17\x02\xda\x13!\x14:\x10\x16>\f\x8b\x01+\x03\x14)C\x04\t\x016.\x01\x13\x00\x00\x00\x00\x06\x00\x00\xff>\b\x00\x05\xc2\x00\n\x00\x16\x00!\x00-\x00I\x00[\x00\x00\x004&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x024&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x01&#\"\x04\x02\x15\x14\x17\x06#\".\x03'\a7$\x114\x12$32\x04\x16\x01\x14\x06\a\x17'\x06#\"$&\x106$32\x04\x16\x02D2)+BB+)\x03\x193(\x1b--\x1b(3\xec1)+BB+)\x02\xac4'\x1b--\x1b'4\xfe\xf6\x1f'\xa9\xfe\xe4\xa3\x17#!\x1a0>\x1bR\t\xfdH\xfe\xde\xc3\x01MŰ\x019\xd3\x02o\x89u7ǖD\xa9\xfe䣣\x01\x1c\xa9\xa1\x01\x1c\xab\x04\nR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xefR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xaa\x04\x9a\xfe\xf9\x9cNJ\x03\x03\n\x04\x11\x02\u007f\xda\xcb\x01\x1f\xa9\x01\x1c\xa3\x84\xe9\xfd?u\xd5W\xb5m%\x8d\xf2\x01\x1e\xf2\x8d\x8d\xf3\x00\x01\x00\x00\xff\x00\x06\xff\x06\x00\x00\x1e\x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x03\x06#\"'.\x015\x11\t\x01%&'&7\x01632\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfe;\xf2\x12\x1f\r\t\x13\x17\x03`\xfb\xd3\xfeu%\x03\x02\"\x06\x80\x0f\x11\x14\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xb9\xfe\xd9\x17\x04\a!\x14\x01]\x04#\xfcc\xa2\x0e)(\x13\x03\xc0\t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\xff\x05\xf7\x00\x1a\x00 \x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x01\x06#\"'.\x015\x11%&'&7\x016\x01\x13\x01\x05\t\x01\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfd\xf1\xfe\xd6\x12\x1d\x0e\t\x13\x16\xfe(%\x03\x03#\x06\x80#\xfe\xcb\xdd\xfaf\x01P\x03_\xfe\"\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xd7\xfe\xb9\x15\x04\a!\x14\x01\xc4\xc1\x0e)'\x14\x03\xc0\x15\xfa\x0e\x05+\xfcʼn\x02\u007f\xfc\xe3\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00I\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x05\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\xfd\xfa\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eozΘ\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x00 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x82\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x05\x00f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00>\xff\x80\x06\xc2\x05\x80\x00\x85\x00\x00\x05\"&#\"\x06#\"&54>\x02765\x034'&#!\"\a\x06\x15\x03\x14\x17\x1e\x03\x15\x14\x06#\"&#\"\x06#\"&54>\x02765'\x1146.\x04'.\x01\"&54632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x163!2765\x134'.\x0254632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x1e\x03\x15\x14\x06\x06\x92,\xb1-,\xb0,\x18\x1a\",:\x10!\x01\x01\r%\xfd]&\r\x01\x01%\x10@2(\x19\x18/\xb9.+\xaa*\x17\x19\x1f)6\x0f!\x01\x01\x01\x02\x05\b\x0e\t\x0f<.$\x18\x18.\xb9.*\xa9*\x19\x19\"+8\x0f#\x01\x01\r\x1a\x02\xbb\x19\r\x01\x01#\x12Q3\x19\x19,\xb0,+\xac+\x19\x19#-:\x0f#\x01\"\x10\x19$$\x19\x01\xf0\f/:yu\x8e\xa6xv)%$\x00\t\x00\x00\xff\x80\x06\x00\x05\x00\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00/\x00?\x00C\x00G\x00\x00%\x15!5%2\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15!5\x13\x15#5\x01\x15!5\x032\x16\x15\x11\x14\x06#!\"&5\x11463\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x15#5\x13\x15!5\x01`\xfe\xa0\x02\xc0\x1a&&\x1a\xff\x00\x1a&&\x1a\x01\xa0\xfc\xa0\xe0\xe0\x06\x00\xfd \xe0\x1a&&\x1a\xff\x00\x1a&&\x1a\x03\x80\x1a&&\x1a\xff\x00\x1a&&\x1a\x02@\xe0\xe0\xfc\xa0\x80\x80\x80\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x01\x80\x80\x80\x02\x00\x80\x80\xfc\x00\x80\x80\x04\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xfe\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x80\x80\x80\x02\x00\x80\x80\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x00\x00\x012\x16\x10\x06 &547%\x06#\"&\x10632\x17%&546 \x16\x10\x06#\"'\x05\x16\x14\a\x056\x04\xc0\x85\xbb\xbb\xfe\xf6\xbb\x02\xfe\x98\\~\x85\xbb\xbb\x85~\\\x01h\x02\xbb\x01\n\xbb\xbb\x85~\\\xfe\x98\x02\x02\x01h\\\x02\x00\xbb\xfe\xf6\xbb\xbb\x85\f\x16\xb4V\xbb\x01\n\xbbV\xb4\x16\f\x85\xbb\xbb\xfe\xf6\xbbV\xb4\x16\x18\x16\xb4V\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00$4&#\"\a'64'7\x163264&\"\x06\x15\x14\x17\a&#\"\x06\x14\x16327\x17\x06\x15\x14\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00}XT=\xf1\x02\x02\xf1=TX}}\xb0~\x02\xf1>SX}}XS>\xf1\x02~\xb0\x01}\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfd\xb0~:x\x10\x0e\x10x:~\xb0}}X\a\x10x9}\xb0}9x\x10\aX}\x03\xe0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\a\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00/\x00>\x00L\x00X\x00d\x00s\x00\x00\x00.\x01\a\x0e\x01\a\x06\x16\x17\x16327>\x0176\x01\x17\a\x17\x16\x14\x0f\x01\x16\x15\x14\x02\x06\x04 $&\x02\x10\x126$32\x17762\x1f\x01\x13\x06#\"/\x01&4762\x1f\x01\x16\x14\x17\x06\"/\x01&4762\x1f\x01\x16\x146\x14\x06+\x01\"&46;\x012'\x15\x14\x06\"&=\x01462\x16\x17\a\x06#\"'&4?\x0162\x17\x16\x14\x02E\x140\x19l\xa6,\n\x14\x19\r\v*\x12\"\x81T\x19\x03\xb8.\xf4D\x13\x13@Yo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x8f\xb6\xa1@\x135\x13D\xfb\n\f\r\n[\t\t\n\x1a\nZ\n\xdc\v\x18\vZ\n\n\t\x1b\t[\t \x12\x0e`\x0e\x12\x12\x0e`\x0e\xae\x12\x1c\x12\x12\x1c\x12\x97[\n\f\r\n\n\nZ\n\x1a\n\t\x03\x9a2\x14\n,\xa6l\x190\n\x05(T\x81\"\v\x01\xad.\xf3D\x135\x13@\xa1\xb6\x8f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoY@\x13\x13D\x01,\n\nZ\n\x1a\n\t\t[\t\x1b\xef\t\t[\t\x1b\t\n\nZ\n\x1a\xbb\x1c\x12\x12\x1c\x12\xa0`\x0e\x12\x12\x0e`\x0e\x12\x12EZ\n\n\t\x1b\t[\t\t\n\x1a\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x04\x00\x14\x005\x00\x00\x01%\x05\x03!\x02 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x016=\x01\a'\x13\x17&'\x17\x05%7\x06\a7\x13\a'\x15\x14\x177\x05\x13\a\x1627'\x13%\x02a\x01\x1f\x01\x1fm\xfe\x9d\x05\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x04m\x95f\xf0?\x86\x96\xef5\xfe\xe1\xfe\xe15\uf587>\xf0f\x95\x1e\x01F\x8btu\xf6ut\x8b\x01F\x02\xd0\xd0\xd0\xfe\xb0\x04\x80\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xfbH\xcb\xfb\x03Y\xe0\x01C\f\xceL|\x9f\x9f|L\xce\f\xfe\xbd\xe0Y\x03\xfb˄(\xfe\xd6E''E\x01*(\x00\x00\x00\f\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00I\x00Y\x00i\x00y\x00\x89\x00\xa2\x00\xb2\x00\xbc\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\"&=\x01!\x15\x14\x06#\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15!54\x05\x04\x1d\x01!54>\x04$ \x04\x1e\x04\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06#!\"&=\x01\x01\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xfd\xc2\x1c&\x02\x02&\x1b\x02\xff\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\xfd\xfe\xfe\x82\xfe\x82\xfd\xfe\x113P\x8d\xb3\x01\r\x01>\x01\f\xb4\x8dP3\x11\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12&\x1b\xfe\x80\x1b&\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x92&\x1b\x81\x81\x1b&\xfd\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8a\r\nh\x02\x01e\n\r\x114LKM:%%:MKL4\xfeW\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01T\x81\x1b&&\x1b\x81\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x14\x00%\x00/\x009\x00\x00\x01\x11\x14\x06#\x11\x14\x06#!\"&5\x11\x1363!\x11!\x11\x01\x11\x14\x06#!\"&5\x11\"&5\x11!2\x17\x01\x15!5463!2\x16\x05\x15!5463!2\x16\x02\xc0&\x1a&\x1a\xfe\x00\x1a&\xf9\a\x18\x02\xe8\xff\x00\x04\x00&\x1a\xfe\x00\x1a&\x1a&\x01\xa8\x18\a\xfc\xd9\xfe\xa0\x12\x0e\x01 \x0e\x12\x02\xa0\xfe\xa0\x12\x0e\x01 \x0e\x12\x04\xc0\xfd\x00\x1a&\xfd\xc0\x1a&&\x1a\x02\x00\x03i\x17\xfd@\x02\xc0\xfc\x80\xfe\x00\x1a&&\x1a\x02@&\x1a\x03\x00\x17\x017\xe0\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00\x00\x01\x16\x14\a\x01\x17\a\x06\x04'\x01#5\x01&\x12?\x01\x17\x0162\x16\x14\a\x01\x17\x0162\x06\xdb%%\xfeo\x96\xa0\xa3\xfe;\xb9\xfe\x96\xb5\x01j|/\xa3\xa0\x96\x01\x90&jJ%\xfep\xea\x01\x91&j\x04;&i&\xfep\x96\xa0\xa3/|\xfe\x96\xb5\x01j\xb9\x01ţ\xa0\x96\x01\x91%Jk%\xfeo\xea\x01\x90%\x00\x00\x00\x04\x00\x19\xff\f\x06\xe7\x06\x00\x00\t\x00\x15\x00:\x00g\x00\x00\x01\x14\x06\"&5462\x16\x05\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x1e\x052636\x17\x16\x17\x16\x176\x172\x1e\x02>\x057\x06\a\x12\a\x06\a\x06'&7\x035.\x01'\x03\x16\a\x06'&'&\x13&'&6\x17\x1e\x01\x17\x11463!2\x16\x15\x1176\x16\x03i\u007f\xb2\u007f\u007f\xb2\u007f\x01\xf6~ZY\u007f\u007fYZ~\xe1@O\xfb\xa8S;+[G[3Y\x1cU\x02D\x1b\x06\x04\x1a#\ao\x05?\x17D&G3I=J\xc6y\xfbTkBuhNV\x04\x01\b!\a\x01\x04WOhuAiS\xfby\x19*'\x04\x0f\x03^C\x04\xe9C^\x15'*\x03\x1cSwwSTvvTSwwSTvv\xfe\xf8\x02\x9bWID\\\xfd_\x17\"\x16\x0f\a\x01\x04\x01\x1c\x06\x03\x19\x1a[\x04\x03\x01\x01\x03\x06\v\x10\x17\x1f\x18\x95g\xfe\xe3\xb4q# /3q\x01F\x01\x02\b\x01\xfe\xaer2/ $r\xb4\x01\x1bg\x95%4\x1b\x02\n\x03\x02\xb6HffH\xfdJ\x0f\x1b4\x00\x00\x04\x00d\xff\x80\x06\x9c\x06\x00\x00\x03\x00\a\x00\x0f\x00\x19\x00\x00\x01\x11#\x11!\x11#\x11\x137\x11!\x11!\x157\x01\x11\x01!\a#5!\x11\x13\x03\x80\x91\x02\x1f\x91\x91\xfd\xfbV\x01F\xd9\x03\x1c\xfeN\xfe\xba\xd9\xd9\xferm\x04N\xfeN\x01\xb2\xfeN\x01\xb2\xfd\b\xfe\x03\x1b\xfb\xe7\xd9\xd9\x04\xaa\xfc\v\xfeN\xd9\xd9\x04\x86\x01!\x00\x00\x00\x00\x05\x00Y\xff\x01\x05\xaa\x05\xfd\x00\x16\x00+\x00?\x00N\x00e\x00\x00%\x15\x02\a\x06\a\x06&'&'&7>\x01727>\x01\x17\x1e\x01'\x06\x0f\x01\x04#&'&'&>\x01\x172\x17\x16\x1f\x01\x1e\x01\x01\x0e\x01\a\x06'&\x03'&676\x17\x16\x17\x1e\x01\x17\x16\x01\x16\a\x06'\x01&76$\x17\x16\x17\x16\x12\x05\x16\a\x06\x05\x06\a7\x06&'&767>\x0176\x17\x1e\x01\x17\x03\x05\x01\x05\f'6\xff#\r\x04\x01\x05\x04<\x97\x01;\x0f1\x19\x18\x1b\x96\x031x\xfe\xed\x11#\x13\f\x05\b\x12*#\r\xbdG,T\x17\x19\x039\a\xa93%\x1a\x0e\xaa/\x0e\x05\x11#0\x01v\xcbN\b\x1c\xfdZ\x05;:8\xfe\x86\b\x1b)\x01M:(\t\x03&\x02\x9b\x03\x1d\x0f\xfe\xc6C\x18\x01\x17.\x0e\x1e\x1e\x01J}2\t\x1c%0\x96\x06\xd9\u007f\xfe\xdc\r \b\t^*\x0f\x15\f\x0e\nJ\xb3F\x13\v\t\n&\xe47\x0f'X\x02\"\x192L\xb5D\x02M\x1d\x12\"\t+\xfe\xbc6\xd6\x14\x0e\x15\n\x01\x15M\x152\x15+\x11\x01'B\x1b\a\x16\x02Qf\x14\x11X\x02V#\x1b+]\x0f\n#\x12\xfd\xc1\xc8'\x14\nL\x0f\b\x02\x06\x14\x16/(\x01e\xabB\x06\x13\x11\x17\xdd9\x00\x00\x00\n\x00\x00\x00\x00\b\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00#\x00,\x008\x00\x00\x01!\x11!\x13\x15!5\x01\x11!\x11\x01\x15!5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x11#\x11\x14\x1626%\x11!\x11\x14\a!26\x13\x11\x14\x06#!\"&5\x11!5\x04\x00\xfe\x80\x01\x80\x80\xfd\x80\x02\x80\xfd\x80\x05\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\xfc\x00\x80&4&\x06\x80\xfa\x00\v\x05\xcb\x1a&\x80pP\xf9\x80Pp\x01\x00\x04\x00\xfe\x80\xff\x00\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\xfc@\x03\xc0\xfc@\x1a&&\x1a\x04@\xfb\xc0!\x1f&\x04\xda\xfb@PppP\x04@\x80\x00\x04\x00*\x00\r\a\xd6\x05\x80\x00\t\x00\x1f\x009\x00Q\x00\x00$\"&5462\x16\x15\x147\".\x01\"\x0e\x01#\"&547>\x012\x16\x17\x16\x15\x14\x06\x01\"'.\x01#\"\x0e\x03#\"&5476$ \x04\x17\x16\x15\x14\x06\x13\"'&$ \x04\a\x06#\"&5476$ \x04\x17\x16\x15\x14\x06\x04\x14(\x92}R}h\x02L\u007f\x82\u007fK\x03\x12\x97\nN\xec\xe6\xecN\n\x97\x00\xff\v\f\x88\xe8\x98U\xab\u007fd:\x02\x11\x96\n\x84\x01x\x01\x80\x01x\x84\n\x96\xfe\v\v\xb3\xfe\u007f\xfe8\xfe\u007f\xb3\v\v\x11\x97\n\xbb\x02\x04\x02\x1a\x02\x04\xbb\n\x97\r\x93\x14 ,, \x14|2222\x96\x12\r\nMXXM\n\r\x12\x96\x01\x10\bic,>>,\x96\x12\f\n\x84\x92\x92\x84\n\f\x12\x96\x01\x0f\t\x9d\x9f\x9f\x9d\t\x96\x12\r\n\xba\xcc̺\n\r\x12\x96\x00\x00\r\x00\x00\xff\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00?\x00K\x00S\x00c\x00k\x00{\x00\x00\x044&\"\x06\x14\x162$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x114&\"\x06\x15\x11\x14\x1626\x004&\"\x06\x14\x162\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x104&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80KjKKj\x01\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\x03KLhLLhL\xfe\x80KjKKj\x01\xcb&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&KjKKj\xcbL4\xfa\x804LL4\x05\x804L5jKKjKKjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\xfd\x80\x01\x804LL4\xfe\x804LL\x02\xffjKKjK\x01\xc0\x01\x00\x1a&&\x1a\xff\x00\x1a&&\xfe\xa5jKKjK\x03\x00\xfa\x004LL4\x06\x004LL\x00\x02\x00\t\xff\x00\x05\xef\x06\x00\x00'\x00E\x00\x00\x01\x16\a\x02!#\"\x06\x0f\x01\x03\a\x0e\x01+\x01\"&7>\x0376;\x01\x167676767>\x01\x16\x17\x16'\x14\a\x06\a\x06\a\x14#'\"\a\x06\x03\x06#!\"&7\x13>\x013!2\x16\x17\x1e\x01\x05\xef\x12\x16W\xfe\",\x19&\x05\x047\x02\x05'\x19\xfb\x15\x18\x03\t#\x12$\t\x05&\x83\x85g\xafpf5\x18\v\x01\x03\x04\x04O\x99.P\xdeq\x8bZZd\x12\x02S\x01\v\xfe\xd9\x16\x1d\x03\xe8\x05-\x1d\x02V\"\u007f0kq\x03zTx\xfeD!\x1a\x13\xfe\xa6\x0f\x1a!\x1e\x158\xe0p\xdf8%\x02\x17'i_\x97F?\x06\x03\x01\x03;\xb3k\x81\xe9R(\x02\x01\x01`\b\xfd\xf6\n!\x16\x05\xbf\x1d&\x1a\x13)\xa4\x00\x00\x04\x00'\xff\x00\a\x00\x06\x00\x00\n\x00\x12\x00\x19\x00(\x00\x00\x012\x17\x00\x13!\x02\x03&63\x01\x06\a\x02\x0367\x12\x13\x12\x00\x13!\x02\t\x01\x10\x03\x02\x01\x02\x03&63!2\x16\x17\x12\x01\xb9!\x13\x01\n`\xfeB\u007f\xf0\f\x12\x14\x03\xa41LO\xb1(\x04\xd3\xe1\xeb\x01+#\xfe=)\xfe\x00\x04heC\xfe\xdc\x19Q\x04\x13\x10\x01g\x15#\x05s\x03`\x1a\xfe\x94\xfef\x01\xb9\x014\x10#\xfe\x9b\xc7\xc2\x016\x01\x1c\xdd\xe4\xfe\xac\x01\x8f\xfe\xbc\xfd\x13\xfeq\x02\x99\x03'\xfd\xc0\xfeX\xfe|\x020\x02\v\x01-\x01\x1b\x10\x19\x1a\x14\xfeg\x00\a\x00\x00\xff\x80\t\x00\x05\x80\x00\b\x00\x0f\x00\x18\x00\x1c\x00>\x00I\x00Y\x00\x00\x01#6?\x01>\x017\x17\x05\x03&#!\a\x04%\x03'.\x01'\x133\x01\x033\x13#\x05&#\"\x06\a\x06\x17\x1e\x01\x15\x14\x06#\"/\x01\a\x163\x16674'.\x0154636\x1f\x01%#\"\a\x03373\x16\x173\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\xb7\x8a\x0e4\x03\x04\f\x03\f\xfa\x82:\v@\xfe\xf4\x02\x017\x01\x0f\xa2\x11\x1avH\x87\xaf\x01\x05%\xa6h\xa6\x02\x98EP{\x9c\x01\x01\x920&<'VF\x16\x17Jo\x82\x9d\x02\x8c1,1.F6\x0f\x01\xc0\x80A\x16\xf6\xae#\xd4\x05\x0f\x9a\x80L4\xf8\x004LL4\b\x004L\x02\"%\x8e\t\n \n7x\x01'6\rO\\\xfeJYFw\x1d\xfe\x02\x02\x81\xfd~\x02\x82\x10\x1bv^fH\x17$\x15\x1e !\v\x90\"\x01xdjD\x19\"\x15\x16!\x01\x19\b\x9b6\xfd\xb4`\x16J\x03\xc2\xfb\x004LL4\x05\x004LL\x00\x18\x00\x00\xff\x80\t\x00\x05\x80\x00\x11\x00\x19\x00+\x003\x00@\x00G\x00X\x00c\x00g\x00q\x00z\x00\x9c\x00\xb8\x00\xc7\x00\xe5\x00\xf9\x01\v\x01\x19\x01-\x01<\x01J\x01X\x01{\x01\x8b\x00\x00\x01&#\"\x0e\x02\x15\x14\x1e\x02327&\x02\x127\x06\x02\x12\x176\x12\x02'\x16\x12\x02\a\x1632>\x0254.\x02#\"\x0135#\x153\x15;\x025#\a'#\x1535\x1737\x03\x15+\x015;\x01\x153'23764/\x01\"+\x01\x15353$4632\x16\x15\x14\x06#\"$2\x17#\x04462\x16\x15\x14\x06#\"6462\x16\x15\x14\x06\"\x17\"'\"&5&547476125632\x17\x161\x17\x15\x16\x15\a\x1c\x01#\a\x06#\x06%354&'\"\a&#\"\a5#\x1535432\x1d\x0135432\x15\x173=\x01#\x15&#\"\x06\x14\x1632?\x014/\x01&5432\x177&#\"\x06\x15\x14\x1f\x01\x16\x15\x14#\"'\a\x16326\x17'\x06#\"=\x0135#5#\x15#\x153\x15\x14327\"\x06\x15\x14\x16327'\x06#\"'354&3\"\a5#\x1535432\x177&\x16\x14\x16327'\x06'\"&4632\x177&#\"\x173=\x01#\x15&#\"\x06\x14\x1632?\x01\"\a5#\x1535432\x177&\x173=\x01#\x15&\"\x06\x14\x1632?\x01\a\"#\x06\a\x06\x15\x06\x15\x14\x17\x14\x17\x1e\x013274?\x0167654'&'4/\x01\"&\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04_\x80\x99g\xbd\x88QQ\x88\xbch\x99\x80\x83^_\xa3~\\[\u007f\u007f[\\]\x82_^\x83\x80\x99h\xbc\x88QQ\x88\xbdg\x99\x02e\a\x11\a\x03\x1d\x04\x05\x06\x06\x05\x03\x06\x04\x05\b\x02\x03\x03\x02\x03\x04\x01\x01\x01\x01\x01\x01\x02\x01\x06\x03\x01\xfb\x16\x16\x13\x12\x16\x16\x12\x13\x01\xa5<\x05F\x01\x87\x16$\x17\x16\x13\x12\xfa\x17$\x17\x17$\x87\x02\x02\x01\x04\x01\x01\x02\x01\x02\x02\x02\x03\x01\x04\x02\x01\x01\x01\x01\x02\x02\x01\xfa\xbc\x1e\x1d\x19 \x0f\x0e\x1f\x18\x0f\x1e\x1e!\x1e\x1d!\x1e\xa6\x1d\x1d\x11\x1a\x1d&&\x1d\x1c\x0f\xb2/\x0e\x17\x19\x17\x14\f\x16!\x1a\x1e/\r\x18\x1f\x19\x14\r\x19!\x1d!\x82\b\r\r\x1300\x1e\x1c\x1c/\x15e\x1d&'\x1e!\x16\x0e\x12\x15\"\ae$\x83\x17\f\x1e\x1e\x1d\n\b\t\t\x12'!\x1d\x13\x0e\x12\x11\x12\x17\x17\x12\x13\x10\x0e\x14\x1c!\xce\x1e\x1e\x0f\x1b\x1d''\x1d\x1c\x0e\x85\x17\f\x1d\x1d\x1d\n\b\t\b\u007f\x1d\x1d\x0f8''\x1c\x1d\x0eN\x02\x02\x01\x02\x02\x03\x01\x01\x03\x02\x04\x03\x04\x02\x02\x02\x01\x02\x01\x01\x01\x02\x02\x02\x01\x04\x01gL4\xf8\x004LL4\b\x004L\x04\xabUQ\x88\xbcgh\xbc\x88QUk\x01=\x01(\x14\x18\"\x06\x02\x04\n\x0f\v\x18\x0e\x18\x14!\x06\x02\x04\n\x11\x0e\x17\x11\x18\x0e\x19\a\x16=\x1b))\x1b=2\x8e(\x1f '\x13\x16\x0f!\f '\x14\x10\x87L#\x04\x1c\x04(>(\x10\x18\r\x01\x18&\x18\f\x18\x10\x8bDC\x10\x14(>(\x14z\x14\x10\x87L#\x04\x1c\x04\x8bDzG\x14)<)\x14\x03\x01\x01\x02\x01\x03\x02\x04\x03\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x03\x02\x03\x04\x02\x01\x03\x01\x01\x01\x01\x04\xe5\xfb\x004LL4\x05\x004LL\x00\x00\f\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x11\x00\x1b\x00\x1f\x00B\x00W\x00b\x00j\x00q\x00}\x00\x8a\x00\x9a\x00\x00\x01\x14\a\x06+\x01532\x17\x16%\x14+\x01532\x054&+\x01\x113276\x173\x11#\x054&'.\x0154632\x177&#\"\x06\x15\x14\x16\x17\x16\x17\x16\x15\x14\x06#\"'\a\x16326\x055\x06#\"&54632\x175&#\"\x06\x14\x1632\x01\x11\x0e\x01\f\x02\x05!26\x004&\"\x06\x14\x162%\x13#\a'#\x13735#535#535#\x013'654&+\x01\x11353\x01\x11\x14\x06#!\"&5\x11463!2\x16\x019$\x1d<\x11\x11=\x1c$\x06\xf0@\x13\x14?\xf9SdO__J-<\x1eAA\x01@)7\x1d\x15\x1b\x15\x1d\x18\")9,<$.%\b\x13\x1c\x160\x17*,G3@\x01\x16%)1??.+&((JgfJ*\x04\xf7A\x9f\xfe\xc4\xfe\xa9\xfe\x14\xfe\xfe\x06!\x1a&\xfc\xadj\x96jj\x96\x01\x02\x90GZYG\x8eиwssw\xb8\x01\x87PiL>8aA\t\x01!M7\xf8\b7MM7\a\xf87M\x02\xf73!\x1a\xdc\x1b\x1f\r4erJ]\xfe\xb3&3Y\x01M\xe8(,\x14\n\x12\x0e\x10\x15\x1b,%7(#)\x10\r\x06\f\x16\x14\x1b,(@=)M%A20C&M\x14e\x92e\xfd\xb7\x02\x0f(X\x92\x81\x8c0&\x02Ėjj\x96j\b\x01V\xe0\xe0\xfe\xaa\t8Z8J9\xfe\xb3\x8c\x10N/4\xfe\xb3\x85\x02$\xfb\f8NN8\x04\xf48NN\x00\x00\x00\x00\x12\x00\x00\xff\x80\t\x00\x05\x80\x00\x02\x00\v\x00\x0e\x00\x15\x00\x1c\x00#\x00&\x00:\x00O\x00[\x00\xce\x00\xe2\x00\xf9\x01\x05\x01\t\x01$\x01?\x01b\x00\x00\x133'\x017'#\x153\x15#\x15%\x175\x174+\x01\x1532%4+\x01\x1532\x014+\x01\x1532\x053'%\x11#5\a#'\x15#'#\a#\x133\x13\x113\x177\x01\x14\x0e\x04\"&#\x15#'\a!\x11!\x17732%\x15#\x113\x15#\x153\x15#\x15\x01\x15\x14\x06#!\"&5\x11373\x1735\x1737\x15!572\x1d\x01!5\x1e\x026373\x1735\x173\x11#\x15'#\x15'#\"\a5#\x15&#!\a'#\x15'#\a\x11463!2\x16\x15\x11#\"\a5#\"\a5!\x15&+\x01\x15&+\x01\a'!\x11!7\x1735327\x153532\x16\x1d\x01!27\x1532%\x14\x06\a\x1e\x01\x1d\x01#54&+\x01\x15#\x1132\x16\x01\x14\x06\a\x1e\x01\x1d\x01#46.\x03+\x01\x15#\x11\x172\x16\x01\x15#\x113\x15#\x153\x15#\x15\x01\x11#\x11\x01\x14+\x0153254&\".\x01546;\x01\x15#\"\x15\x14\x166\x1e\x017\x15\x06+\x0153254&\x06.\x02546;\x01\x15#\"\x15\x14\x1e\x01\x03\x11#'\x15#'#\a#\"54;\x01\x15\"&\x0e\x04\x15\x14\x16;\x0173\x13\x113\x175wY-\x02AJF\xa3\x8e\x8e\x01=c\xbd(TS)\x01!*RQ+\xfe\xea*RQ+\x01\xcbY,\xfc\x16B^9^\x84\x19\x87\x19Ft`njUM\x02\x98\v\x11\x1c\x18'\x18)\t~PS\xff\x00\x01\x04PR\xcfm\xfe\xdd\xd9٘\x94\x94\x05\xd4M7\xf8\b7Mo\x197\x19\xda\x13q\x14\x02\x1d\n\n\x01\x17\x17@)U\t\x198\x19\xe3\"\xb6\xb4\x19\xb9\x17\xf9E(\xac\x181\xfd\x8c++\xc6\x16\xa9NM7\a\xf87Mx3\x1e\xb17\x17\xfe\xc4\x1f8\xd1\x17D\xea62\xfe\xa3\x01W74\xd3\x15;\x1f\xae\b\b\x04\x02\x119\x1f\xa8<\xfd-\x18\x16\x19\x12A\x18\"EA\x9a0:\xfe\xeb\x19\x15\x1a\x11A\x01\x01\x05\f\x17\x12F@\x991:\x02\x11\xd8ؗ\x94\x94\xfe\xedB\x02\xf7f~~\"\"12\"4(\x82w$#11#\xef\x18@}}!\x19%+%\x195(\x81v$:O\x94\\z\x84\x1a\x86\x19K\x81\x85?\a*\x0f\x1f\f\x11\x06\x1b$\x1d\\amcr\x03Vl\xfd\x86OO176Nn\xd9\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x06\x15\x14;\x012\x004&+\x01\"\x0f\x01'&+\x01\"\x06\x15\x14\x1e\x01\x17\x06\x15\x14;\x0127\x01%4&+\x01\"\a\x03\x06\x16;\x012?\x01>\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x14\x06\x15\x14;\x012\x1354+\x01\"\a\x03\a\x14\x16;\x0127\x01\x0e\x01#\a76;\x012\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xe93%\x1d#2%\x1c%\x03\x11,, \x11\x02\v\x12\x16\x1a\x18\x01_3$\x1d$2%\x1c%\xfa\xa8M>\xa0\x13\x02A\x01\b\x06L\x14\x02\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1bDHeE:\x1c<\x12\x04\rE\x13\x01\xc2\b\x05M\v\aj,\x05\x11K\x05\b'-\x01R\rM\v\a\x00\xff\x01~M>\x9f\x14\x02A\x01\b\x06R\f\x04\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1aEHeE:\x1d<\x11\x04\rE\x13\xdd\rJ\v\x02A\x01\b\x06B\x13\x02\xf9I\x05*'!\x11\x02\v\x13($\arL4\xf8\x004LL4\b\x004L\x02v%1 \x1c%3!x*\x1e\x01k\v\x04\x15\xa9$2 \x1c%3!\x8e;5\x13\xfeh\x06\n\x13n\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\f\t\x10\x01\x15\n\t\n\x9c\x96\x10\t\x05\x02r\x84\x04p\b\r\n\x01p8;5\x13\xfeh\x06\n\rt\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\x01\x10\x04\x10\x01\xac\x01\x0e\v\xfe`\x02\x05\t\x13\x01\x13#\x16\x01k\v\x17\x01\xdf\xfb\x004LL4\x05\x004LL\x00\x00\x00\n\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x0f\x002\x00H\x00W\x00[\x00l\x00t\x00\x8b\x00\x9b\x00\x00\x01\x14\a\x06#\"'5632\x05#632\x054&'.\x015432\x177&#\"\a\x06\x15\x14\x16\x17\x1e\x01\x15\x14#\"&'\a\x163276\x017#5\x0f\x033\x15\x14\x17\x163275\x06#\"=\x01\x055&#\"\x06\a'#\x113\x11632\x133\x11#\x054'&#\"\a'#\x1175\x163276\x004&\"\x06\x14\x162\x014'&#\"\x06\x15\x14\x17\x16327'\x06#\"'&'36\x13\x11\x14\x06#!\"&5\x11463!2\x16\x06=\x15\x13!\x17\x12\x1d\x1c9\x01\xb6n\x0623\xf9\xecBD$ &:B\x12CRM.0AC'\x1f0\x1dR\x1f\x12H`Q03\x01'\x13`\x81\x12.\x11>,&I / \f*\x01\x89\x0f\r /\n\n\x83\x96\x1a8\x10/\x96\x96\x02n-(G@5\b\x84\x96$ S3=\xfe,.B..B\x03\xb002^`o?7je;\x109G+\x14\x17\x05\xf8\x02\x80L4\xf8\x004LL4\b\x004L\x02yE%#\t\xe0\x1eVb\xe9;A\x19\r\x16\x0e\x1a!p &'F:A\x18\x0e\x17\x10\x1f\x19\x12q)%)\x01#o\x87\x15r\bg\xdbT$\x1e\vv\a2\xc5\x19\x8b\x03 \x1e8\xfe)\x012\x1f\xfe\xaf\x01\xd7\xdez948/\xfd{\x19\x97\v8A\x01\xc4B..B/\xfe\xebq?@\x84r\x80<7(g\x1f\x13\x13/\x0e\x02\xb1\xfb\x004LL4\x05\x004LL\x00\x00\x03\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x17\x00?\x00\x00\x01\x12\x17\x14\x06#!\x14\x06\"&'\x0524#\"&54\"\x15\x14\x16\x01\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x17\x06\x16=\xedL4\xfe@\x96ԕ\x01\x01\x00\x10\x10;U g\x043\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\b\x02\xac\xfe\x9c\xc84Lj\x96\x95j\xaf U;\x10\x10Ig\x06@\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\n\x00\x00\x00\x00\x04\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x16\x00&\x00N\x00\x00\x044#\"&54\"\x15\x14\x163\t\x01.\x01#\"\x0e\x02\x15\x10\x01\x14\x06#!\x14\x06\"&'7!&\x037\x12\x01\x17\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x04\x10\x10;U gI\xfd\xf7\x03m*\xb5\x85]\x99Z0\x04\xc0L4\xfe@\x96ԕ\x01\x95\x02\xf5\xa6=o=\x01CT\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\xb0 U;\x10\x10Ig\x01\xeb\x02\xf8Xu?bl3\xfe\x80\xfe@4Lj\x96\x95j\x81\xbb\x01\x10a\xfe\x9c\x04\xa8`\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\x00\x00\x00\x00\x05\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x007\x00[\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd\xe0\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\xa0\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x03\xeeu\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00,\x00<\x00H\x00\x00\x01\x15\x14\x0e\x02#\"\x0054\x0032\x1e\x03\x1d\x01\x14+\x01\"=\x014&#\"\x06\x15\x14\x16326=\x0146;\x012\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04~Isy9\xcd\xfe\xed\x01\x10\xcb\"SgR8\x10v\x10\x83H\x8c\xb1\xb7\x8eD\x8c\t\x06w\x06\n\xfc\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcem2N+\x16\x01\x16\xcf\xcb\x01\x10\t\x1b)H-m\x10\x10F+1\xb7\x92\x97\xc50*F\a\t\t\x03+f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00b\x00\x00\x014&#\"\x0e\x02\x15\x14\x1632>\x01\x05\x14\x0e\x02\a\"\x06#\"'&'\x0e\x01#\"&54\x12632\x16\x17?\x01>\x01;\x012\x17\x16\a\x03\x06\x15\x14\x163>\x045\x10\x00!\"\x0e\x02\x10\x1e\x023276\x16\x1f\x01\x16\a\x06\a\x0e\x01#\"$&\x02\x10\x126$3 \x00\x03\xcck^?zb=ka`\xa0U\x024J{\x8cK\x06\x13\a_/\x1c\x054\x9f^\xa1\xb1\x84\xe2\x85W\x88&\x02\v\x01\t\x05v\x05\b\x05\x02x\x05\x19 \x1c:XB0\xfe\xa4\xfe܂\xed\xabff\xab\xed\x82\xe4\xb1\v\x1a\b)\b\x01\x02\nf\xfb\x85\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x01X\x01\xa8\x02\xf9lz=l\xa6apz\x85\xc7\x11o\xacb3\x02\x015!2BX\xbf\xae\x9d\x01\n\x9bG@\x138\x06\f\v\x05\v\xfd\x9a\x18\x18'\x1a\x01\t'=vN\x01$\x01\\f\xab\xed\xfe\xfc\xed\xabf\x90\t\x02\v1\f\f\r\tSZz\xce\x01\x1c\x018\x01\x1c\xcez\xfeX\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x00(\x00\x00\x00\x16\x10\x0f\x01\x17\x16\x14\x0f\x01\x06\"/\x01\x01\x06+\x01\x05'\x13547\x01'&4?\x0162\x1f\x0176\t\x01'\x01\x15\x06D\xbc^\xe1h\n\n\xd2\n\x1a\ni\xfd\xa5%5\xcb\xff\x00@\x80%\x02[i\n\n\xd2\n\x1a\nh\xdf]\xfc\xc5\x02@\xc0\xfd\xc0\x06\x00\xbc\xfe\xf7]\xdfh\n\x1a\n\xd2\n\ni\xfd\xa5%\x80@\x01\x00\xcb5%\x02[i\n\x1a\n\xd2\n\nh\xe1^\xfa@\x02@\xc0\xfd\xc0\xc0\x00\x02\x00\x00\xff\x00\x06\xfe\x06\x00\x00\x10\x00)\x00\x00\x012\x16\x15\x14\a\x00\a\x06#\"&547\x016\x01\x1e\x01\x1f\x01\x16\x00#\".\x025\x1e\x03327>\x04\x06OFi-\xfe\xb4\x85ay~\xb5\\\x02~;\xfc\xba'\x87S\x01\x04\xfe\xf5\xd7{\xbes:\aD8>\x0f)\x0e\x19AJfh\x06\x00]F?X\xfd\x8b{[\xb9\u007f\x80T\x02C6\xfb\xf6Ll\x16G\xd5\xfe\xf4]\xa2\xccv\x052'\"%B];$\x0f\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%\x11!\x112>\x017>\x0132\x1e\x01\x17\x1e\x0232>\x017>\x0232\x16\x17\x1e\x022>\x017>\x0132\x16\x17\x1e\x02\x13\x15\".\x01'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x01#546;\x01\x11!\x11!\x11!\x11!\x11!\x1132\x16\x01\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\a\x00\xf9\x00-P&\x1c\x1e+#\x18(\x16\x16\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&PZP&\x1c\x1e+#\"+\x1e\x1c&P-\x18(\x16\x16\x1d$P-.P$\x1d\x16\x16(\x18#+\x1e\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&P-.P$\x1d\x1e+#pP@\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00@Pp\xfb\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x80\xfe\x80\x01\x80\x1c\x1b\x18\x1b\x16\x0e\x10\x13\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1b\x18\x1b\x16\x16\x1b\x18\x1b\x1c\x01@\xc0\x0e\x10\x13\x19\x1a\x1c\x1c\x1a\x19\x13\x10\x0e\x16\x1b\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1a\x19\x1b\x16\xc0Pp\x01\xc0\xfe@\x01\xc0\xfe@\x01\xc0\xfe@p\x03\x10MSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\v\x00\x00!\x15!\x113\x11\t\x01!\x11\t\x01\b\x00\xf8\x00\x80\x06\x00\x01\x00\xf9\x80\x01\xc0\x02@\x80\x06\x00\xfa\x80\x04\x00\xfc\x80\x02@\x02@\xfd\xc0\x00\x00\x00\x03\x00\x00\xff\x80\x06\xc0\x06\x00\x00\v\x00\x10\x00\x16\x00\x00\t\x01\x06\x04#\"$\x02\x10\x12$3\x13!\x14\x02\a\x13!\x112\x04\x12\x03\x00\x02\"j\xfe\xe5\x9d\xd1\xfe\x9f\xce\xce\x01aѻ\x03\x05xl\xa4\xfd\x00\xd1\x01a\xce\x02\x86\xfd\xdelx\xce\x01a\x01\xa2\x01a\xce\xfd\x00\x9d\xfe\xe5j\x02\xa2\x03\x00\xce\xfe\x9f\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\x1f\x00\x00!\x15!\x113\x11\x01\x11\x14\x06/\x01\x01\x06\"/\x01\x01'\x0162\x1f\x01\x01'&63!2\x16\b\x00\xf8\x00\x80\a\x00'\x10y\xfd\x87\n\x1a\n\xe9\xfe`\xc0\x02I\n\x1a\n\xe9\x01\xd0y\x10\x11\x15\x01\xb3\x0e\x12\x80\x06\x00\xfa\x80\x04\xe0\xfeM\x15\x11\x10y\xfd\x87\n\n\xe9\xfe`\xc0\x02I\n\n\xe9\x01\xd0y\x10'\x12\x00\x00\x01\x00\x00\x00\x00\a\x00\x04W\x00`\x00\x00\x01\x14\x17\x1e\x03\x17\x04\x15\x14\x06#\".\x06'.\x03#\"\x0e\x01\x15\x14\x1632767\x17\x06\a\x17\x06!\"&\x0254>\x0232\x1e\x06\x17\x1632654.\x06'&546\x17\x1e\x01\x17#\x1e\x02\x17\a&'5&#\"\x06\x05\f\n\n\x1e4$%\x01Eӕ;iNL29\x1e1\v ;XxR`\xaef՝\xb1Q8\x1bT\x0f\x1d\x01\x83\xfe\xff\x93\xf5\x88W\x91\xc7iW\x90gW:;*:\x1a`\x89Qs&?RWXJ8\v\x03\xafoNU0\x01\f\x16\x1e\x04\x81\x1a\x1c\x17J1F\x03@\x06#\x1d)\x1b\r\n[\xf1\x92\xc1%6_P\u007fO\x86\x1cQiX(o\xb2`\xa0\xef_?5\x98\"$\x01\x98\x9e\x01\x01\x92iʗ\\&>bd\x86s\x926\xc8aP*< \x1f\x17-;iF\x10\x11n\xa4\x04\x03\x17*\v\x1b-\x05c1\x15\x01\x15B\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00W\x00g\x00\x00\x014'.\x02'4.\x0154632\x17#\x16\x177&'.\x01#\"\x06\x15\x14\x17\x1e\x01\x17\x1e\x03\x1d\x01\x16\x06#\"'.\x05#\"\x0e\x01\x17\x15\x1e\x0232767'\x0e\x01#\"&54632\x16\x17\x1e\a326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x98\xea#$(\t\x04\x021$6\x11\x01\x14\x13]'\n!E3P|\x02\x10ad\x1d(2\x1b\x01S;aF\x179'EO\x80Se\xb6j\x03\x04]\xaem\xba]\x14\v<*rYs\x98\xa4hpt.\b#\x16)$78L*k\x98h\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xe4\xadB\n\r%\x1c\x02\r\v\x02$/\x0f\x0f$G6\n\x1d\x14sP\a\x10`X\x1d\b\x0f\x1c)\x1a\x05:F\x90/\x95fwH1p\xb8d\x01l\xb6qn\x1b\x18mPH\xaeui\xa8kw\x15_:[9D'\x1b\x8b\x02\xe5\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x0f\x00\x1f\x003\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01$4.\x02#!\x16\x12\x10\x02\a!2>\x01\x12\x10\x0e\x02#!\".\x02\x10>\x023!2\x1e\x01\x04\x80Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x03QQ\x8a\xbdh\xfe~w\x8b\x8bw\x01\x82h\xbd\x8a\xd1f\xab\xed\x82\xfd\x00\x82\xed\xabff\xab\xed\x82\x03\x00\x82\xed\xab\x02\x18н\x8aQQ\x8a\xbdн\x8aQQ\x8a\xbdн\x8aQZ\xfe\xf4\xfe\xcc\xfe\xf4ZQ\x8a\x01\xa7\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05\x00\x00\x13\x00#\x00\x00\x18\x01>\x023!2\x1e\x02\x10\x0e\x02#!\".\x01\x042>\x024.\x02\"\x0e\x02\x14\x1e\x01f\xab\xed\x82\x03\x00\x82\xed\xabff\xab\xed\x82\xfd\x00\x82\xed\xab\x04\xb2н\x8aQQ\x8a\xbdн\x8aQQ\x8a\x01\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x91Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x00\x00\x05\x00\x00\x00\x00\t\x00\x05\x00\x00\x0e\x00\x12\x00\x18\x00,\x00\\\x00\x00\x01!\"&?\x01&#\"\x06\x10\x16326'3&'\x05\x01!\a\x16\x17\x04\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\x16 \x00\x10\x00 \x005467'\x01\x06+\x01\x0e\x01#\"\x00\x10\x0032\x177#\"&463!\x15!'#\"&463!2\x17\x01632\x02\xfa\xfe\xc6(#\x18\xbcAH\x84\xbc\xbc\x84s\xb0\xa3\xba\x129\x01q\x01 \xfe ci\x15\x05\x05\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\xbc\x01\b\x01<\xfe\xf9\xfe\x8e\xfe\xf9OFA\xfe\x9f\x12!\xc5\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9re\x89\xe0\x1a&&\x1a\x01\x80\x01\xb3U\xde\x1a&&\x1a\x01\x00!\x14\x01\v[e\xb9\x01\x80F \xfb\x1f\xbc\xfe\xf8\xbc\x91\xefU?\x94\x01\x80\x84g\x95\xc4\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\xbc\x01\xf9\xfe\x8e\xfe\xf9\x01\a\xb9a\xad?b\xfe+\x1a\xa4\xdc\x01\a\x01r\x01\a7\xb7&4&\x80\x80&4&\x1c\xfep,\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x00\x0f\x00\x1f\x00+\x00K\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x03.\x01#!\"\x06\a\x03\x06\x163!26\x024&#!\"\x06\x14\x163!2\x01\x11#\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\x1147\x13>\x01$ \x04\x16\x17\x13\x16\x01\x80KjKKj\x04KKjKKj\x1dH\x05#\x17\xfcj\x17#\x05H\x05&\x1e\x04&\x1e&\xe7\x1c\x14\xfd\x80\x14\x1c\x1c\x14\x02\x80\x14\x01\xac\x80KjK\xfd\x00KjK\x80\x19g\t\xb1\x01\x1b\x01V\x01\x1b\xb1\ti\x17\x01\vjKKjKKjKKjK\x02\f\x01\x80\x17\x1d\x1d\x17\xfe\x80\x1e..\x02n(\x1c\x1c(\x1c\xfd[\xfd\xa5\x805KK5\x80\x805KK5\x80\x02[po\x01\xc6Nv<\x02\x01\x14\x06+\x01\x16\x15\x14\x02\x06\x04#\"\x00'#\"&546;\x01&54\x126$32\x00\x1732\x16\x05\xb72$\xfdB$22$\x02\xbe$\x01\b\x17\xfc*$22$\x03\x8cX\xfeڭ\xb1\xfeӯ\x17\x03\xd6$22$\xfctX\x01'\xad\x84\xf2\xaeh\x01s2$\x83\x11\x83\xdc\xfeϧ\xf6\xfekc\xbd$22$\x84\x11\x83\xdc\x011\xa8\xf5\x01\x95c\xbc$2\x02\xe3F33F3VVT2#$2\x8f\xa8\xaf\xfeԱVT2#$2\x8f\xa8g\xaf\xf1\x01\x84#2UU\xa7\xfe\xcf݃\x01\n\xd92$#2UU\xa7\x011݃\xfe\xf6\xd92\x00\x00\x06\x00\v\xff\x00\x04\xf5\x06\x00\x00\a\x00\x0f\x00\x1b\x00,\x00u\x00\xa3\x00\x00\x01\x03\x17\x1254#\"\x01\x16\x1767.\x02\x01\x14\x13632\x17\x03&#\"\x06\x03\x14\x1e\x0132654'.\x03#\"\x06\x03\x14\x17\x1e\x013276\x114.\x01'&$#\"\a\x06\x15\x14\x1e\x047232\x17\x16\x17\x06\a\x06\a\x0e\x01\x15\x14\x16\x15\a\x06\x15&'\x06#\x16\x15\x14\x06#\"&547\x16\x17\x1632654&#\"\x06\a467&54632\x17\x0254632\x13\x16\x17>\x0532\x16\x15\x14\x03\x1e\x03\x15\x14\x02\x0e\x01#\"'&\x02\x03\xb9ru\xa5&9\xfe\x8c\x1e\x03%\"\f*#\xfe͟\x11 \x0fO%GR\x9f=O&\x0e^\xaa\xfc\x98op\x95\xda\x04\x86\xfe\xb8\x15\x01\xc3C8\xfcpP\b*\x19\x02\a\a\x03\x85b\xfeY\n\x05\x01_\xdc#\xfc\xf5$\xa6\x8c\x1a\x0e\x18N Pb@6\xfe\x9d)?\x91\xa4\xaa\xa9\x01\x02+0L\x1215\v\x05\x1e\"4\x1c\x13\x04\x04\x02\x13\x13$\x1c\x1a\x16\x18.\x88E\x1fs\x1e\f\f\x02\n\xce\x02\a\x0e5I\x9cQ\"!@\fh\x11\f\"\xdeY7e|\x1aJ\x1e>z\x0f\x01\xceiPe\xfd\xbb\x11\x06\x10\u007fn\x91eHbIl\xfeF\x0f>^]@\x96\xfe\xfc\xben*9\x01\r\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x00\x05\x80\x00\x1a\x006\x00[\x00_\x00\x00\x013\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x0232%3\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x02326%4&'.\x02'&! \a\x0e\x02\a\x0e\x01\x15\x14\x16\x17\x1e\x02\x17\x16\x04! 7>\x027>\x01\x13\x11!\x11\x03\x11\xcf\x0e\xa9\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcb\x05=39?\n\x1a6'_\x02\xd6\xce\x0e\xa8\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcc\x04>29?\n\x1a5'17\x01m\x1f-\x06\x0f\x1c\x02V\xfd\x9d\xfd\x8fU\x05\x19\x11\x06-\x1e\x1e-\x06\x12\x17\x06,\x01\x87\x01\x13\x02bW\x05\x18\x11\x05.\x1e\xc0\xf8\x00\x02\x10\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$\x8b\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$L\xb6\xcf\xc8=\b\f\x12\x02??\x04\x0f\r\b<\xc7\xd1\xd0\xc7=\b\x0e\x0e\x05! A\x04\x0e\x0e\t<\xc6\x03\xcb\xfa\x00\x06\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x05`\x05\x80\x00\x1d\x00;\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&#!\x11\x14\x06+\x01\"&5\x11463!2\x1e\x01\x01\x11\x14\x0e\x01#!\"&5\x1146;\x012\x16\x15\x11!265\x1146;\x012\x16\x03\xe0\x12\x0e\xa0\x0e\x12\xa0p\xfe\xf0\x12\x0e\xa0\x0e\x12\x12\x0e\x01Ї\xe4\x85\x01\x80\x85\xe4\x87\xfe0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x10p\xa0\x12\x0e\xa0\x0e\x12\x03\x90\xfe\x10\x0e\x12\x12\x0e\x01\xf0p\xa0\xfb\x80\x0e\x12\x12\x0e\x05@\x0e\x12\x85\xe4\x01I\xfc\x90\x87\xe4\x85\x12\x0e\x03\xc0\x0e\x12\x12\x0e\xfd\x00\xa0p\x03p\x0e\x12\x12\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00S\x00c\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x0554&+\x01\"\a&+\x01\"\x06\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012%54&#!\"\x06\x15\x11\x14;\x012=\x01\x16;\x0126\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x1f\x1b\x18\xca\x18\x1c\x1c\x18\xca\x18\x1b\xfe\x16A5\x85D\x1c\x1cD\x825A\x157\x16\x1b\x19^\x18\x1c\x156\x16\x1c\x18a\x18\x1b\x167\x15\x02MB5\xfe\xf85B\x167\x15\x1f?\xbf5B~\x88`\xfb\xd0`\x88\x88`\x040`\x88\x02\xb6r\x18\x1c\x1c\x18r\x18\x1c\x1c\xfe\xfa5A44A5\xfa\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16v\x9a5AA5\xfef\x15\x15\xb4*A\x02\x9d\xfb\xd0`\x88\x88`\x040`\x88\x88\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x19\x00\x00\x01!\x1b\x01!\x01!\x01!\t\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x93\xfeړ\xe9\x017\xfe\xbc\xfeH\xfe\xbc\x017\x01\u007f\x02j\xaav\xfc@v\xaa\xaav\x03\xc0v\xaa\x01\xc2\x02'\xfc\x97\x04\x00\xfc\x00\x01:\x02\xa6\xfc@v\xaa\xaav\x03\xc0v\xaa\xaa\x00\x00\x00\x00\x17\x00\x00\xff\x00\b\x00\x06\x00\x00M\x00U\x00a\x00h\x00m\x00r\x00x\x00\u007f\x00\x84\x00\x89\x00\x91\x00\x96\x00\x9c\x00\xa0\x00\xa4\x00\xa7\x00\xaa\x00\xaf\x00\xb8\x00\xbb\x00\xbe\x00\xc1\x00\xcb\x00\x00\x01\x14\x06\a\x03\x16\x15\x14\x06\a\x03\x16\x15\x14\x06#\"'!\x06\"'!\x06#\"&547\x03.\x01547\x03.\x015467\x134&547\x13&54632\x17!62\x17!632\x16\x15\x14\a\x13\x1e\x01\x15\x14\a\x13\x1e\x01\x01!\x01#\x01!62\x01\x16\x15\x14\a\x13\x177\x11'\x06\a\x01!\x17%!\x06\"\x0167'\a#7\x03\x01\x17\x017\x13!\x016\x053\x01!\x11\x17\x16\x03!7\x01\x0f\x0135\a\x16\x11\x14\x16\x15\x14\a\x17\x117\x11\x17\x01/\x01\a\x117'\x06%#\x05\x17\x15\t\x02%'\x11\x05\a3\x01\x17\x13/\x02&=\x01\x03&'\t\x025\x03\x13#\x13\x01\a?\x01\x13&547\v\x01\x176\b\x00\x1a\x14\xcd\x03\x19\x14\xc1\x03!\x18\x19\x10\xfep\x114\x11\xfeq\x11\x1a\x17\"\x04\xc1\x14\x19\x03\xce\x14\x19\x1b\x14\xc7\x01\"\xd1\x04\"\x17\x1a\x12\x01\x8c\x106\x10\x01\x8e\x12\x1a\x17\"\x04\xcf\x17 \a\xbb\x13\x19\xfc'\x01\x85\xfe\xaa\x8f\xfe\xaa\x01h\x12*\xfc[\x01\x02\xd0\x0f\xbc\xbb\r\x10\x02\xa8\xfe|\xbe\x02*\xfe\xe8\x10,\x02\xaf\x01\x04@\x11\x1e\x16\xfc\xfe\xd8?\x01w\x10A\xfeU\x01M\b\xfcp\x05\x01V\xfe\x8b\x04\x0e\x12\x01\x92@\xfe˝\xc1\xa3\xa8\x04\x01\b\xab\x1e\x99\x01)\xdf\xdf\x04Ϳ\x06\x03w\x10\xfd\x93\xd5\xfe\xd7\x017\x01(\xfd{\x88\x01\xe6*U\x01%\xee\x84\x03\x01\x16\b\xd8\x05\b\xfeK\x016\xfc\xc0\xa3\xa3\xa3\xa3\x04=0\x82(\xcf\x02\x03\xab\x81M\x05\x02\x81\x15\x1f\x04\xfe\x9c\t\t\x14\x1f\x04\xfe\xaf\b\b\x17\"\x12\x14\x14\x14!\x18\b\f\x01O\x04\x1f\x14\t\t\x01d\x05\x1f\x14\x15\x1f\x04\x01X\x01\x04\x01$\x0f\x01k\n\b\x18!\x15\x15\x15\x15!\x18\x06\f\xfe\x9a\x01!\x16\r\x0e\xfe\xbc\x04\x1f\xfc\xcd\x01b\xfe\x9e\x10\x03\x1c\x04\t\n\x05\xfe\x98\x06\xc7\x01[\xc2\b\x02\x01\xc0\xc8\xc8\x10\xfbT\x06\x05DOi\x01\n\xfe\xcd@\xfe\x90\x1c\x016\xfe\xa9\x04\x0f\x01b\xfe\xb1\x06\x05\x01xB\x01A\xa6ݽ\xb1\b\x035\x01\x02\x01\x10\r\xb1\x01\r\v\xfeɝ\x01:\xec\xde\b\xfe\xf8J\xc9\x02\f\xe0\xe1+\xfe\xc5\xfe\xc1\x013\x0f\x8d\xfe\xe4\xdd,\x01\x88\xfb\x02p\x05\x01\x15\r\x10\x02\x01x\x01\x04\xfe1\xfe\xb9\x01\xf6\xdf\xfe\xe6\xfc\x89\xfe\xe5\x01\x1b\xe3\xe3F\x01i\n\x04\x01\x0f\x01(\xfd\x9cR\x03\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\r\x00\x1b\x00\x00\x11463!\x01\x11\x14\x06#!\"&5%'\x114&#!\"\x06\x15\x11\x14\x163\xb7\x83\x02\xe6\x01`\xb7\x83\xfc\xf4\x83\xb7\x04а@.\xfe\x1c.@A-\x03X\x83\xbf\x01f\xfaB\x84\xbe\xbe\x84$\xb4\x01\xa9.BB.\xfe\x14.C\x00\x00\x04\x00\x00\xff\x83\x06\x00\x05}\x00\n\x00\x14\x00\x1e\x00)\x00\x00\x01\x04\x00\x03&54\x12$32\x05\x16\x17\x04\x00\x03&'\x12\x00\x01\x12\x00%\x16\x17\x04\x00\x03&\x05&'\x06\a6\x007\x06\a\x16\x03\xa6\xfe\xc3\xfe\"w\x14\xcd\x01`\xd0R\x01d]G\xfe{\xfd\xc5o]>p\x026\xfe\xa3s\x02\x11\x01c(\x0e\xfe\xdc\xfe@wg\x03\xcf\xc1\xae\x87\x9bm\x01J\xcc\x15PA\x05jy\xfe\x1d\xfe\xc1YW\xd0\x01a͊AZq\xfd\xc1\xfe{HZ\x01\x82\x02:\xfb<\x01d\x02\x14v\\gx\xfe>\xfe\xdb\x0e\x142AT\x17\xcd\x01Kn\x98\x84\xaf\x00\x00\x03\x00\x00\xff\x80\b\x00\x04\xf7\x00\x16\x00+\x00;\x00\x00\x01\x13\"'&#\"\a&#\"\a\x06+\x01\x136!2\x1763 \x012\x16\x17\x03&#\"\a&#\"\a\x03>\x0232\x1767\x03\x06\a&#\"\a\x03>\x0132\x176\x17\ae\x9b\x83~\xc8\xc1└\xe2\xc1Ȁ|\x05\x9b\xe0\x01\x02隚\xe9\x01\x02\xfe\xf1\x81Ν|\xab\xc5\xe0\x96\x96\xe0ū|iy\xb0Zʬ\xac\xf27Ӕ\x98ް\xa0r|\xd1uѥ\xac\xca\x04x\xfb\b9[\x94\x94[9\x04\xf8\u007fjj\xfb\xa69A\x03\xfdN\x8d\x8dN\xfc\x03+,#ll\"\x03\x8b\x04\x97\x9bB\xfcS32fk\x05\x00\x00\x05\x00\x00\xff\xa5\b\x00\x05[\x00\x0f\x00\x1f\x00/\x00?\x00\\\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x14\x06#!\"&5467&54632\x176$32\x1e\x01\x15\x14\a\x1e\x01\x05\xdc\x1e\x14]\x14\x1e\x1e\x14]\x14\x1e\xfe\xe4\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\x05\x88\xec\xa6\xfb$\xa6\xec~i\n\xa1qfN-\x01*\xbd\x95\xfc\x93\x0e\x87\xac\xa5\x02\xdd\x15\x1e\x1e\x15\xfd#\x14\x1e\x1e\x14\x02\x13\x14\x1e\x1e\x14\xfd\xed\x14\x1e\x1e\x14\x01\xad\x14\x1e\x1e\x14\xfeS\x14\x1e\x1e\x14\x01j\x14\x1e\x1e\x14\xfe\x96\x14\x1e\x1e\xa6\xa6\xec\xec\xa6t\xc52\"'q\xa1C\xb7\xea\x93\xfc\x95B8!\xdb\x00\x00\x00'\x00\x00\xff>\x06\x00\x06\x00\x00\x04\x00\t\x00\r\x00\x11\x00\x15\x00\x19\x00\x1d\x00!\x00%\x00)\x00-\x001\x005\x009\x00=\x00A\x00E\x00I\x00M\x00Q\x00U\x00Y\x00]\x00a\x00g\x00k\x00o\x00s\x00w\x00{\x00\u007f\x00\x85\x00\x89\x00\x8d\x00\x91\x00\x95\x00\x99\x00\xa5\x00\xd5\x00\x00\x11!\x11\t\x01%\x11!\x11\t\x015!\x15\x13\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x177\x17\a\x177\x17\a\x177\x17\a\x177\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a\x01\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x01\x15#53\x157\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x175#53\x15\a53\x15\a53\x15\a53\x15\a53\x15\a53\x15%\"&54632\x16\x15\x14\x06\x01\x14\x1e\x026\x16\x15\x14#\"'#\a\x1632>\x0254.\x01\x06&54>\x0132\x16\x1737.\x06#\"\x0e\x02\x06\x00\xfc\xf8\xfd\b\x05\x9c\xfa\xc8\x02\x95\x02\xa3\xfa\xc8Q%%%%%%%%%?\x0fi\x0f\x1f\x0fi\x0f\x1e\x0fi\x0f\x1f\x0fh\x0fOi\x0fixi\x0fiyi\x0fixi\x0fi\xfcAr\x01\x14s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\x01\x14r\xfb\xb8%s\xa2s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\xf0Ns%%%%%%%%%%\xfd\x88\x81\xb8\xb8\x81\x82\xb7\xb7\xfe\xd9'\x0232\x16\x15\x14\a\x06\x04#\".\x0154\x0032\x1e\x0532654&#\"\x06#\"&54654&#\"\x0e\x02#\"&547>\x0132\x16\x15\x14\a6\x05\x96\x01\x04\x94\xd2ڞU\x9azrhgrx\x98S\x9a\xc3Пd\xd8U\x05 \x1c\b\x0e\x15\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x04\xc0&\x1a\x80&4&\x80\x1a&&\x1a\x80&4&\x80\x1a\xfd\xe6KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x80\x1a&&\x1a\x80&4&\x80\x1a&&\x1a\x80\xfd5jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\x17\x00\x1f\x00'\x00S\x00\x00\x004&\"\x0f\x01\x114&\"\x06\x15\x11'&\"\x06\x14\x17\x01\x1627\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x13\x11\x14\x06\a\x05\x1e\x02\x15\x14\a!2\x16\x14\x06#!\"&54>\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x05\x00&4\x13\x93&4&\x93\x134&\x13\x01\x00\x134\x13\x01\x00\xfd\x93KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x13\x92\x01%\x1a&&\x1a\xfeے\x13&4\x13\xff\x00\x13\x13\x01\x00\xfd\"jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x00\x05\x80\x00\x02\x00\x05\x00\t\x00\f\x00\x10\x00\x14\x00&\x00\x00\x13\t\x03!'\x13!\t\x02!%!\x03!\x01!\x01!%\x01\x16\x06\a\x01\x06\"'\x01.\x017\x0163!2\xd4\x02o\xfe\xd4\x01\xe9\x01]\xfdF\x89\xcc\xfe\xfa\xfe\xe0\x03\xfd\x02o\xfe\xbd\xfc\xc2\x02\xaa\xcc\xfe\xee\x02o\x01Z\xfe\xe0\xfe\xfa\x01Y\x01\x80\x0e\x02\x10\xfc@\x12:\x12\xfc@\x10\x02\x0e\x01\x80\x12!\x04\x80!\x03\x00\xfdg\x02\x99\xfc\xfc\x03\x04\x80\x01\x80\xfe\x80\xfc\xe7\x02\x99\x80\x01\x80\xfe\x80\x01\x80f\xfe\x00\x12/\x11\xfc\x00\x14\x14\x04\x00\x11/\x12\x02\x00\x1a\x00\x03\x00\x13\xff\x00\a\xed\x06\x00\x00I\x00\x97\x00\xa0\x00\x00\x0562\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x017\x17762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01%\x06\"/\x017\x17762\x1f\x017\x11\x03&6?\x01\x1135!5!\x15!\x153\x11\x17\x1e\x01\a\x03\x11762\x1f\x01762\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\x01\x15%\x055#5!\x15\a\x13\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13\x80ZSS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\xfa-\x134\x13\x80ZSS\x134\x13S@\xd2\x11\x14\x1e\xb1\x80\x01\x00\x01\x00\x01\x00\x80\xb1\x1e\x14\x11\xd2\x13\x134\x13SS\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\x01@\x01\x80\x01\x80\x80\xfe\x00\x13\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13Sy\x13\x13\x80ZRR\x13\x13R@\x01%\x01:\x1a=\n:\x01+\x80\x80\x80\x80\xfe\xd5:\n=\x1a\xfe\xc6\xfe\xdb\x12\x13\x13RR\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13S\x04\x1a\x80\x80\x80\x80\x80\x80\x00\x00\x00\x04\x00\x00\xff\x80\x05\x80\x06\x00\x00\x03\x00\a\x00C\x00v\x00\x00!\x13/\x01\x01\x13\x0f\x01\x01&'&#\"\a\x06\"'&#\"\a\x06\a\x16\x17\x1e\x01\x17\x1e\t32>\x03;\x012\x1e\x0332>\b7>\x0176\x01\x14\x06#!\"&54>\x037'3&547&547>\x017632\x162632\x17\x1e\x01\x17\x16\x15\x14\a\x16\a3\a\x1e\x03\x02@``\x80\x01\x80\x80\x80`\x01\x00\x02\x02\nVFa\a\x1c\aaFV\n\x02\x02\x02\x02\x02\v\x02\x02\v\x03\f\x05\r\v\x11\x12\x17\r$.\x13\n\r\v\f\v\r\n\x13.$\r\x17\x12\x11\v\r\x05\f\x03\v\x02\x02\v\x02\x02\x01\xa2\x92y\xfc\x96y\x92\t\x1d.Q5Z\xd6\x16\x02\xc2\xd2\x11E$ ,\x1el\x90*%>>%*\x90>*98(QO\xe1!\u007f\xa0\x8f\x00\x03\x00\x00\x00\x00\b\xfd\x05\x00\x00L\x00\\\x00p\x00\x00\x01\x16\x0e\x02'.\x01'&67'\x0e\x01\x15\x14\x06#!#\x0e\x01#\"\x00\x10\x0032\x177&+\x01\"&46;\x012\x1e\x02\x17!3'#\"&7>\x01;\x012\x1f\x0176;\x012\x16\x1d\x01\x14\x06+\x01\x176\x17\x1e\x01\x01267!\"'&7\x13&#\"\x06\x10\x16(\x016\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\b\xfd\fD\x82\xbbg\xa1\xed\x10\fOOG`n%\x1b\xff\x00E\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9LL\x18{\xb5@\x1a&&\x1a\x80N\x86c,\x1d\x02\x00sU\xde\x1e&\x05\x04&\x18\xfd!\x14Fr\x13\x1be\x1a&&\x1a\xb3s\x83\x90\x8f\xca\xf8\xd4s\xb0\x17\xfe\xc6#\x14\x12\x11\x93/,\x84\xbc\xbc\x05\x80\x01\b\xbc\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\x01\xf4g\xbf\x88L\a\v\xe4\xa0o\xc7GkP\xe4\x82\x1b'\xa4\xdc\x01\a\x01r\x01\a\x1b-n&4&\x1b2\x1d\x16\x80-\x1e\x17\x1e\x1cir\x13&\x1a\x80\x1a&\xac?\x1b\x1a\xd9\xfd\xfb\x91o\x1f \x1f\x01\x15\r\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\x00\x00\x03\x00\x00\xff\x00\x05\x80\x05\xe0\x005\x00O\x00W\x00\x00!\x14\x0e\x02 .\x0254>\x0276\x16\x17\x16\x06\a\x0e\x04\a\x1e\x042>\x037.\x04'.\x017>\x01\x17\x1e\x03\x01\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!2\x16\x02\x14\x06\"&462\x05\x80{\xcd\xf5\xfe\xfa\xf5\xcd{BtxG\x1a,\x04\x05\x1f\x1a:`9(\x0f\x01\x030b\x82\xbfԿ\x82b0\x03\x01\x0f(9`:\x1a\x1f\x05\x04,\x1aGxtB\xfe\x80&\x1a@&\x1a\xff\x00\x1a&@\x1a&K5\x01\x805K`\x83\xba\x83\x83\xba?e=\x1f\x1f=e?1O6#\f\x05\x1f\x1a\x1a,\x04\n\x1b\x18\x17\x10\x04\v\x1f#\x1e\x14\x14\x1e$\x1f\f\x04\x0e\x18\x17\x1b\n\x04,\x1a\x1a\x1f\x05\f#6O\x03O\xfe\x80\x1a&\xfe\x80\x1a&&\x1a\x01\x80&\x1a\x01\x805KK\x01\xa8\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1b\x00?\x00\x00\x01!\x0e\x01\x0f\x01\x01\x06\"'\x01&'!267\x1b\x01\x1e\x013267\x13\x17\x16\x01\x14\a!'.\x01\a\x06\a\v\x01.\x01\"\x06\a\x03!&54632\x1e\x02\x17>\x0332\x16\x05\x00\x011\x05\n\x04\x03\xfd\x91\x124\x12\xfd\x90\x05\x10\x01q\x16#\x05F\xbe\x06\"\x16\x15\"\x06\x928\x12\x02'g\xfe\x8fo\b#\x13-\v\x81\xc4\x06#,\"\x05t\xfeYg\xfe\xe0>\x81oP$$Po\x81>\xe0\xfe\x02\x00\x06\t\x03\x04\xfd\xa8\x12\x12\x02Z\x02\x12\x1b\x15\x01\x19\xfde\x14\x1a\x1a\x14\x01\xe5p#\x01\xac\x91\x9b\xdd\x11\x14\x02\x05)\xfeR\x02\xae\x14\x1a\x1b\x15\xfe0\x9b\x91\xdc\xf8+I@$$@I+\xf8\x00\x00\x02\x00\x02\xff\x00\x04\x80\x05\xfc\x00+\x003\x00\x00\x01\x14\x00\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x027>\x0276\x04\x12$\x10\x00 \x00\x10\x00 \x04\x80\xfe\xd9\xd9\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\v\x8bᅪ\x01*\xae\xfc\x00\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x03\xc0\xdd\xfe\xb9\x18\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\x86\xe6\x92\x0f\x13\x92\xfe\xea\x12\xfe\x8e\xfe\xf9\x01\a\x01r\x01\a\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00'\x00/\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x01\x16\x15\x14\x0e\x02\".\x024>\x0232\x17\x01!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12\xfe\x82~[\x9b\xd5\xea՛[[\x9b\xd5u˜\x01~\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\xfe\x81\x9c\xcbu՛[[\x9b\xd5\xea՛[~\x01~\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00=\x00E\x00\x00\x01\x16\x12\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x0054\x127&'&6;\x012\x17\x1e\x012676;\x012\x16\a\x06\x00 \x00\x10\x00 \x00\x10\x03>\x91\xb1\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfeٱ\x91\xa5?\x06\x13\x11E\x15\b,\xc0\xec\xc0,\b\x1d=\x11\x13\x06?\xfd\xa4\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x04\xc4H\xfe\xeb\xa7\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01Gݧ\x01\x15H`\xb1\x10\x1b\x14j\x82\x82j\x14\x1b\x10\xb1\xfb\xdc\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x02\x00\x02\xff\x00\x05\x80\x06\x00\x00B\x00J\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x16\x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x04\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x95\xf3\x82\f\x10\x01 \xcbv\xdcX\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x10\xae\x01\x11\x9b\xcc\x01+\x17\x0eBF\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x06\x80\x06\x00\x00k\x00s\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x00547'\a\x0e\x01/\x01.\x01?\x01'\x15\x14\x06+\x01\"&5\x11463!2\x16\x1d\x01\x14\x06+\x01\x177>\x01\x1f\x01\x1e\x01\x0f\x01\x176 \x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x05\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfe\xd9~4e\t\x1a\n0\n\x01\tio\x12\x0e@\x0e\x12&\x1a\x01 \x0e\x12\x12\x0e\x85jV\t\x1a\n0\n\x01\tZ9\x9e\x01\x92\x9e\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01G\xddɞ5o\n\x01\b,\b\x1b\nsp\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12k^\n\x01\b,\b\x1b\nc8~~\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x05\x00\x02\xff\x00\x06\xfe\x05\xfd\x008\x00>\x00K\x00R\x00_\x00\x00\x01\x16\x02\x06\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x0276\x0076\x176\x17\x16\x00\x016\x10'\x06\x10\x0327&547&#\"\x00\x10\x00\x01\x11&'\x06\a\x11\x012\x00\x10\x00#\"\a\x16\x15\x14\a\x16\x06\xfe\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xfe\x00\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\x11\x01'\xcdΫ\xab\xce\xcd\x01'\xfc\x93\x80\x80\x80\xc0sg\x9a\x9ags\xb9\xfe\xf9\x01\a\x02\xf9\x89ww\x89\x02@\xb9\x01\a\xfe\xf9\xb9sg\x9a\x9ag\x03\xef\x9b\xfe\xee\xae\x10\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\xce\x01-\x13\x15ss\x15\x13\xfe\xd3\xfdʃ\x01l\x83\x83\xfe\x94\xfe\xf69\xa5\xe2\xe0\xa79\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x80\x01\x04\x0fOO\x0f\xfe\xfc\x01\x80\x01\a\x01r\x01\a9\xa7\xe0\xe2\xa59\x00\x00\x04\x00\x01\xff\x06\a\x80\x06\x00\x00F\x00P\x00^\x00l\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06$'.\x037>\x0276\x16\x17%#\"&=\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x17\x16\x17%#\"&5\x014'\x0e\x01\x15\x14\x17>\x01%\x14\x16\x17&54\x007.\x01#\"\x00\x012\x0054&'\x16\x15\x14\x00\a\x1e\x01\x06\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16\x1f\xfe\xf2\xb7\xd2\xfe\xa3CuГP\b\t\x8a\xe2\x87v\xdbY\x00\xff\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe;\"\xb6\x92\x00\xff\x86\x0e\x12\xfe\x00\x04\xa2\xda\x04\xa2\xda\xfc\x80ޥ\x03\x01\x0e\xcb5݇\xb9\xfe\xf9\x03\xc0\xb9\x01\aޥ\x03\xfe\xf2\xcb5\xdd\x04`\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue036\xfe\xfc\x1a\x1dڿ\x06g\xa3\xdew\x87\xea\x95\x0f\x0eBF\xfe\x12\x0e@\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xffJ_\ts\xfe\x12\x0e\xfe\xa0\x14&\x19\xfa\xa7\x14&\x19\xfa\xa7\xa8\xfc\x17\x1d\x1e\xd2\x01?%x\x92\xfe\xf9\xfc\a\x01\a\xb9\xa8\xfc\x17\x1c\x1f\xd2\xfe\xc1%x\x92\x00\x04\x00\x06\xff\x00\b\x00\x06\x00\x00J\x00P\x00\\\x00h\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06'\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x17632\x17%#\"&5\x016\x10'\x06\x10\x00\x10\x00327&\x107&#\"\x012\x00\x10\x00#\"\a\x16\x10\a\x16\x06\x80\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16 \xfe\xf7\xb5ߺu\x8b`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x9b\xf9}\x17\x19\x01\r\xbaຒ\xaeɞ\x00\xff\x86\x0e\x12\xfd\x00\x80\x80\x80\xfd\x80\x01\a\xb9ue\x9a\x9aeu\xb9\x039\xb9\x01\a\xfe\xf9\xb9ue\x9a\x9ae\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue034\xfe\xfc\x1b\"|N\x0f\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x11\xb9\x01\"\xa2\xbb\x01\x0f\x1d\"|a~\xfe\x12\x0e\xfb\xe7\x83\x01l\x83\x83\xfe\x94\x01o\xfe\x8e\xfe\xf99\xa7\x01\xc0\xa79\xfc\x80\x01\a\x01r\x01\a9\xa7\xfe@\xa79\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00;\x00C\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\a\x17\x16\x14\x0f\x01\x06\"/\x01\a\x16\x15\x14\x0e\x02\".\x024>\x0232\x177'&4?\x0162\x1f\x017!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12Ռ\t\t.\t\x1a\n\x8cN~[\x9b\xd5\xea՛[[\x9b\xd5u˜N\xac\t\t.\t\x1a\n\xac\xd5\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\u058c\n\x1a\t.\t\t\x8dO\x9c\xcbu՛[[\x9b\xd5\xea՛[~N\xac\n\x1a\t.\t\t\xac\xd5\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x02\xff\x04\x04\x80\x06\x00\x009\x00A\x00\x00\x01\x16\x00\x15\x14\x02\x04'.\x02'&\x12675#\"&=\x0146;\x015\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14\x0f\x01\x06\"/\x01\x1532\x16\x1d\x01\x14\x06+\x01\x02 \x00\x10\x00 \x00\x10\x02\x80\xd9\x01'\xae\xfe֪\x85\xe1\x8b\v\f\x81\xf3\x96\xa0\x0e\x12\x12\x0e\xa0\\\n\x1a\t.\t\t\xca\x134\x13\xca\t\t.\t\x1a\n\\\xa0\x0e\x12\x12\x0e\xa0\xf9\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03|\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\xa5\\\t\t.\t\x1a\n\xc9\x13\x13\xc9\n\x1a\t.\t\t\\\xa5\x12\x0e@\x0e\x12\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x04\x00\x00\a\x80\x04~\x009\x00A\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01!\x15\x14\x06+\x01\"&=\x01#\x06\x00#\"$\x027>\x0276\x04\x16\x173546;\x012\x16\x1d\x01!'&4?\x0162\x17\x00 \x00\x10\x00 \x00\x10\am\x13\x13\xfe\xda\t\x1b\t-\n\n\xb9\xfe\xda\x12\x0e@\x0e\x12\x84\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\x01&\xb9\n\n-\t\x1b\t\xfb@\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x02m\x134\x13\xfe\xda\n\n-\t\x1b\t\xb9\xe0\x0e\x12\x12\x0e\xe0\xd9\xfeٮ\x01*\xaa\x85\xe1\x8b\v\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\xb9\t\x1b\t-\n\n\xfc\xed\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00\x17\x00\x1f\x00\x00\x01\x14\x00\a\x11\x14\x06+\x01\"&5\x11&\x0054>\x022\x1e\x02\x00 \x00\x10\x00 \x00\x10\x04\x80\xfe\xd9\xd9\x12\x0e@\x0e\x12\xd9\xfe\xd9[\x9b\xd5\xea՛[\xfd\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03\xc0\xdd\xfe\xb9\x18\xfd\x9c\x0e\x12\x12\x0e\x02d\x18\x01G\xddu՛[[\x9b\xd5\xfd\xcb\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\x00\x00\x04\x80\x04\x80\x00\a\x00\x17\x00\x00\x00\x10\x00 \x00\x10\x00 \x00\x14\x0e\x02\".\x024>\x022\x1e\x01\x04\x00\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x01\x87[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x025\xea՛[[\x9b\xd5\xea՛[[\x9b\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06#!\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x05\xab#22#\xfey\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd!#22#\x05\x802#\xfa\xaa#2\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad2#\x05V#2\x00\x00\x00\x01\x00\x00\xff\x80\x05\x00\x06\x00\x00L\x00\x00\x114>\x0332\x04\x16\x15\x14\x0e\x03#\"&'\x0e\x06\x0f\x01'&546\x127&54632\x16\x15\x14\x06\x15\x14\x1632>\x0454&#\"\x00\x15\x14\x1e\x02\x15\x14\x06#\"'.\x03K\x84\xac\xc6g\x9e\x01\x10\xaa&Rv\xacgD\x86\x1d\n$\v\x1e\x16*2%\x0e\t\x0f+Z\a hP=DXZ@7^?1\x1b\r۰\xc8\xfe\xf4\x19\x1d\x19\x1e\x16\x02\x0f3O+\x16\x03\xabl\xbf\x8eh4\x85\xfe\xa0`\xb8\xaa\x81M@8'\x93+c+RI2\x05\n\x9d\x1f\\\xe5\x01Z\x1eAhS\x92Q>B\xfa>?S2Vhui/\xad\xc1\xfe\xfd\xc7,R0+\t\x1cZ\x03\x0fRkm\x00\x00\x00\x00\x03\x00\x00\xffz\x06\x00\x05\x86\x00+\x00>\x00Q\x00\x00\x002\x16\x17\x16\x15\x14\a\x0e\x01#\"'.\x01'&7567632\x1632\x16\x17\x1e\x01\x15\x14\x06\x15\x14\x17\x16\x17\x16\x17\x1632\x032>\x024.\x02\"\x0e\x02\x15\x14\x17\a7\x16\x12 \x04\x16\x12\x10\x02\x06\x04#\"'\x05\x13&54\x126\x03\xcc\x1a\xa9\x05\x02\x11\x10n/9\x85b\x90LH\x01\x03G\x18\x1c\x06\x18\a\x13\x0f\b\b2E\x05\"D8_\f\n\x0fp\u007f\xe9\xa8dd\xa8\xe9\xfe\xe9\xa8dxO\xf2\x9e\"\x012\x01\x17\xcaxx\xca\xfe\xe9\x99ê\xfe_\x88lx\xca\x022X\t\x05\n!+'5>-\x92pkW\b[C\x16\x03\r\x15\x14\x88\a\x15I\n\a\bI@50\a\xfeOd\xa8\xe9\xfe\xe9\xa8dd\xa8\xe9\u007f˥\xe9Mh\x05fx\xca\xfe\xe9\xfe\xce\xfe\xe9\xcax^\x86\x01\x95\xb2ә\x01\x17\xca\x00\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\x0f\x00\x13\x00\x1b\x00#\x00'\x00+\x00/\x00\x007!5!\x11!5!\x004&\"\x06\x14\x162\x01!5!\x004&\"\x06\x14\x162\x124&\"\x06\x14\x162\x13\x11!\x11\x01\x11!\x11\x01\x11!\x11\x80\x04\x00\xfc\x00\x04\x00\xfc\x00\x06 8P88P\xfa\x18\x04\x00\xfc\x00\x06 8P88P88P88P\x98\xf9\x00\a\x00\xf9\x00\a\x00\xf9\x00\x80\x80\x01\x80\x80\xfd\x98P88P8\x04 \x80\xfd\x98P88P8\x028P88P8\xfd \xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x00\x00\x03\x00\x00\xff\x80\b\x00\x05\x80\x00\a\x00+\x00N\x00\x00\x00 &\x106 \x16\x10\x01!2\x16\x1d\x01\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x01\x14\x163!\x15\x06#!\"&54>\x0532\x17\x1e\x01267632\x17#\"\x06\x15\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02@\x01`\r\x13\x13\r\xfe\xa0\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\xfd L4\x01\x00Dg\xfc\x96y\x92\a\x15 6Fe=\x13\x14O\x97\xb2\x97O\x14\x13\x84U\xdf4L\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfe\x9f\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\x01`\r\x13\x13\r\xfd\xc04L\xee2\x8ay5eud_C(\x11====\x11`L4\x00\x00\x00\x03\x00\x00\xff\x80\a\xf7\x05\x80\x00\a\x003\x00V\x00\x00\x00 &\x106 \x16\x10\x01\x17\x16\x15\x14\x0f\x01\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&54?\x01632\x1f\x017632\x1f\x01\x16\x15\x14\a\x05\a\x06\x15\x14\x1f\x01\x06#!\"&54>\x0532\x17\x16 7632\x17\x0e\x01\x15\x14\x17\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02\xb5\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xfd\x15\xb5%%S\x15\x17\xfc\x96y\x92\a\x15 6Fe=\x13\x14\x9a\x01J\x9a\x14\x13\x1c\x1d\x1c\x1a%\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfd\xdf\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xb5%65%S\x03\x8ay5eud_C(\x11zz\x11\x06\x1b.!6%\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x12\x00\x1a\x00$\x00\x00\x01!2\x16\x15\x11!\x11!\x11!\x1146;\x012\x16\x15\x004&\"\x06\x14\x162!54&#!\"\x06\x15\x11\x01\x00\x06\xc0\x1a&\xff\x00\xfa\x00\xff\x00&\x1a\x80\x1a&\x02@\x96Ԗ\x96\xd4\x05V\xe1\x9f\xfd@\x1a&\x02\x00&\x1a\xfe@\x01\x00\xff\x00\x04\xc0\x1a&&\x1a\xfe\x16Ԗ\x96Ԗ@\x9f\xe1&\x1a\xfe\x80\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00\x16\x00\x19\x00\x00\x01\x033\x15!\a!\x15!\t\x01!5!'!53\x03!\x01!\t\x01\x13#\x06\x00\xc0\xc0\xfe\xee7\x01I\xfee\xfe\x9b\xfe\x9b\xfee\x01I7\xfe\xee\xc0\xc0\x01\x00\x01C\x01z\x01C\xfe\x00l\xd8\x06\x00\xfe@\xc0\x80\xc0\xfc\xc0\x03@\xc0\x80\xc0\x01\xc0\xfd\x00\x03\x00\xfb@\x01\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x12264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xf0\xa0pp\xa0p\x03\x00\xfb\x80\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xc0p\xa0pp\xa0\x01\xd0\x02\x00\xfe\x00\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00+\x00/\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x02264&\"\x06\x14\x01\x11!\x11\x00264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xe2\x84^^\x84^\x02@\xfd\xe0\x03\xfe\x84^^\x84^\x01@\xfd\xc0\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\xfd\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\x00\x00\x00\x00\x04\x00\x00\xff\x8a\a\x00\x05v\x00\x12\x00\x15\x00\x1c\x00(\x00\x00\x01\x11\x14\x06#\"'%.\x015\x114632\x17\x01\x16\x17\t\x02\x11\x14\x06\"'%\x01\x14\x00\a\t\x01632\x17\x01\x16\x02U\x19\x18\x11\x10\xfe/\x15\x1d\x14\x13\x0e\x1e\x01\xff\x03@\x02\x16\xfd\xea\x04k\x1c0\x17\xfeG\x02\x19\xfd\xff,\xfez\x01D\x11#\x0e\f\x02\x1d\x04\x04[\xfbk\x19#\b\xe9\n/\x17\x04t\x14\x1c\x0f\xff\x00\x03g\xfc\x9e\x01\n\x02F\xfb\xe2\x19\x1f\r\xdc\x03\xe5\x03\xfc\xbfG\x02z\x02\x0f\x1c\x06\xfe\xf2\x02\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x0f\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11!\x11\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02\xd7\xfa\x00\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x04\xaa\xfa\x00\x06\x00\x00\x00\x18\x00T\xff\x06\b\xa4\x05\xff\x00\v\x00\x17\x00#\x00/\x00D\x00M\x00\xfc\x01\x06\x01\x12\x01\x1b\x01%\x012\x01<\x01G\x01Q\x01^\x01l\x01w\x01\xb3\x01\xc2\x01\xd9\x01\xe9\x01\xfe\x02\r\x00\x00\x05\x0e\x01\a\x06&'&676\x16\x05\x1e\x01\x17\x16676&'&\x067\x1e\x01\x17\x16654&'&\x06\x05\x0e\x01\a\x06&54676\x16\x013\"\a\x1e\x01\x15\x14\x06#\"'\x06\x15\x14\x163264&7.\x01\a>\x02\x1e\x01\x01\x16\a\x16\x15\x16\x0e\x01\a\x06&'\x04%\x0e\x01'.\x01767&76\x1767&76\x1767476\x176\x17\x16\x175\"'.\x01'&767>\x02\x16\x173\x16\x17\x16\x17>\x017&'&'47.\x01'.\x017676\x16\x17\x14\x1e\x03\x17\x16767&\a76767.\x04'$\x01\x16\x17\x1673>\x03?\x01>\x01\x17\x16\x17\x16\x06\a\x0e\x01\a\x15\x06\a\x06\a\x1e\x01\x1767673>\x01\x1e\x01\x17\x16\x17\x16\a\x0e\x01\a\x06#\x14\a676\x176\x17\x16\x15\x16\x176\x17\x16\a\x16\x176\x01\x14\a\x16\x176&'&\x06\a\x1e\x01\a6767.\x01'\x06\a\"'\x16\x17276&\x0567&54&\a\x0e\x01\x17\x16\x17&671&'\x0e\x01\a\x16\x1767\x06\x0f\x015\x06\x17\x16\x05\x1e\x01\x17\x1e\x017>\x017&\x00\"\x06\x15\x14\x162654\x03&\a5\x06\x16\x17\x1e\x017>\x01&\x05>\x01&'5\x06#\x0e\x01\x16\x17\x1e\x01%\x06\x16\x17\x1667>\x017\x06\a\x16\a\x16\x04\x176$7&74>\x01=\x01\x15.\x01'\x06\a\x06'&'&'\x0e\b#\x06'\x0e\x03\a\x06#\x06'\x06'&'&'&'\x06\a\x16\x0365.\x01'&\x0e\x01\x17\x1e\x01\x17\x1667\x16\x1767.\x01'\x06\a\x14\x06\x15\x16\a\x06\a\x06\a#\x06\x17\x16\x17\x04%&'\x06\a\x06'&'\x06\a#\x152%6767\a65&'&'&7&5&'\x06\a\x16\x056.\x01\a\x0e\x01\a\x14\x17\x1e\x017>\x01\x01\xde\b&\x12\x195\x02\x01R\x1b\x17\x16\x054\a&\x13\x195\x01\x02S\x1b\x16\x169\rW\"-J\x870(/\xfar\rV\"-J\x870(.\x02\xc9\x01)#\x1b\"6&4\x1c\x05pOPpp\xe0c\xf3|\x1bo}vQ\x02\xf2\b\x13\a\x01[\x8060X\x16\xfdQ\xfd\xc4\x17W1V\xbb\x01\x02\x05\x13\b\x06\x19\x0e\x1b\a\t\v\x1c\x1d\x1e\r\x17\x1c#\x1a\x12\x14\v\a5X\v\t\t\x0fN\x02\"&\x1c\x05\r.\x0e\x03\x02\n)\n\x0f\x0f\x17D\x01>q\x1c \x15\b\x10J\x17:\x03\x03\x02\x04\a\x05\x1b102(z/=f\x91\x89\x14*4!>\f\x02S\x015b!\x11%\n\x19\x12\x05\x12\x03\x04\x01\x05\x01\v\x06(\x03\x06\x04\x02!\x1f$p8~5\x10\x17\x1d\x01\x1a\x10\x18\x0e\x03\x0e\x02.\x1c\x04\x12.:5I\r\b\x0f\r\b\x0e\x03~\xfe\xf7T\x8a\n\x13\x03\x0e\x18\x0f\x0e\x0e\x1c\x18\x114~9p# !\x02\n\x02)\x05\f\x01\x05\x01\x05\x03\x12\x05\x12\x18\b&\x11 ?()5F\t\x021\x18\x0f\x04\a\x05\x1c\f\t\x1c\x10\x12\r\t\n\x1c\x1e\x15\b\x03\xaf\x1d\x19 d%{\x1d\x13\x04v*\x85:\r \x0e\x0e@e\x10\x0f\n\x01s|\x03D\x861d \x19\x1d\x12\x04\x13\x1d{\x8b\x1f\x0e:\x85*\x06\x0f\x10dA\x11A|o\x04\x0e\x13\x01Yk\x03'&\x8d\x13\x12\a\b\x14\x83<\x02\x02\x83\xa5tu\xa5\xa5ut\xfe&\x02\x02\x01\x1bv\a\x0e\x01\v\x03HC\xba\x04XX\x13\x01\x03\x14TR\x05\x0f\x02\xc8;w\x19\b\x06\x12\x10\x94\x1d\x02\x82\x17\r\x8d\xc671\u0099\r\x15\x02\x03\x03\x01\x01\x01\x02\a\x01Z*&'\x06\b\r1\x05\b\x06\x05\x03\x02\x02\x01\x01\t\x14\x11\x13\v\x03\x02\x01\x119?\t\b.\r\r\x1d$\x06\x04\x02\xfd\x84\x0e\x10Gv\v\f5k65P\x02\x02<\xdc?8q=4\x88a\x04\t\x01\x06\x02\x12\x13\x17\v\r\vSC\"\xcd\x15\x15\x931#\x16\x03\x03\x15\x1c<\x80\x01/6B&!\x01ML\b\x11\t\x18\x14\x12\x04\x05\x04\b\xbe^;\x8c6k5\f\vwF\x10\x0e1<\x02\x02P\x00\x00\x03\x00\x00\xffC\t\x01\x05\xbd\x00\a\x00\x0f\x00;\x00\x00$\x14\x06\"&462\x04\x14\x06\"&462\x01\x1e\x05\f\x0132\x1e\x04\x0e\x03\a\x06\a>\x05.\x03\a\x06$.\a\x05\xf4`\x88aa\x88\xfdsa\x88``\x88\xfdZ9k\x87\x89\xc3\xcd\x01'\x019؋ӗa-\x03*Gl|M\xb9e\x1d_]`F&\fO\x9a\xfe\xb1\xa8\xfe\xdcܽ\x82sDD!/+\x88``\x88aa\x88``\x88a\x051\x0154&'\"&#!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\x9f\x1f\x17\b\n\x99\x99\n\b\x17\r\x1e\x17\x03\f\x8b\x8b\x03\v\x01\x17\xfbi\xe4LCly5\x88)*\x01H\x02\xcacelzzlec0h\x1c\x1c\u007f\xb7b,,b\xb7\u007fe\x03IVB9@RB\x03\x12\x05\xfe9\x01\xebJ_\x80L4\xf8\x004LL4\b\x004L\x0244%\x05\x02\x8c\x02\x05\xaf2\"\x04\x01\x81\x01\x04\xe0\x014\xfe\xcc:I;p\x0f\x10\x01\x01!q4\a\bb\xbab\b\a3p\f\x0f\x02\x02\x06(P`t`P(\x06\x04\x8e6E\x05\x03\bC.7B\x03\x01\xfe\x02I\x036\xfb\x004LL4\x05\x004LL\x00\x00\x05\x00\x00\xff\x80\t\x00\x05\x80\x00\x05\x00\v\x00\x1a\x00.\x00>\x00\x00\x01\x11\x0e\x01\x14\x16$4&'\x116\x00\x10\x02\x04#\".\x0254\x12$ \x04\x014.\x02#!\"\x04\x02\x15\x14\x12\x043!2>\x02\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03Zj\x84\x84\x02b\x84jj\x01[\x9d\xfe\xf2\x9fwٝ]\x9d\x01\x0e\x01>\x01\x0e\x02\x1co\xb8\xf3\x83\xfeӰ\xfeٯ\xae\x01*\xae\x01-\x81\xf5\xb8o\x01XL4\xf8\x004LL4\b\x004L\x01'\x02\xb5)\xbd꽽\xea\xbd)\xfdJ)\x01\xd1\xfe\xc2\xfe\xf2\x9d]\x9d\xd9w\x9f\x01\x0e\x9d\x9d\xfeL\x8b\xf5\xa6`\xa2\xfeֺ\xab\xfe۪e\xa9\xec\x03\x06\xfb\x004LL4\x05\x004LL\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x1f\x00;\x00\x00\x05\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15#54&#!\"\x06\x15\x11\x14\x16;\x01\x15#\"&5\x11463!2\x16\x06\x80\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x80^B\xfb\xc0B^^B\x04@B^\xfe\x80\x80\x13\r\xfb\xc0\r\x13\x13\r\xa0\xa0B^^B\x04@B^`\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x01>\xa0\xa0\r\x13\x13\r\xfb\xc0\r\x13\x80^B\x04@B^^\x00\x00\x06\x00\x00\xff\x00\b\x80\x06\x00\x00\x02\x00\x05\x005\x00=\x00U\x00m\x00\x00\t\x01!\t\x01!\x01\x0e\x01\a\x11!2\x16\x1d\x01\x14\x06#!\"&=\x01463!\x11.\x01'!\"&=\x01463!>\x012\x16\x17!2\x16\x1d\x01\x14\x06#\x04264&\"\x06\x14\x01\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x05\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x06\xc0\xfe\x80\x03\x00\xf9\x80\xfe\x80\x03\x00\x01\xb5\x0e?(\x02`\x0e\x12\x12\x0e\xfa\xc0\x0e\x12\x12\x0e\x02`(?\x0e\xfe\x15\x0e\x12\x12\x0e\x01\xeb\x15b|b\x15\x01\xeb\x0e\x12\x12\x0e\xfd?B//B/\x04\x90]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\xfb\x00]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\x04@\xfd@\x02\xc0\xfd@\x03\x80(?\x0e\xfa\xf5\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x05\v\x0e?(\x12\x0e@\x0e\x129GG9\x12\x0e@\x0e\x12\x10/B//B\xfcaItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\vItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00M\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x0e\x03\x15!4.\x02'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13M\x90sF\x04\x00Fs\x90M\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00?\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x114.\x02'#\x0e\x03\x15\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00\t\x03\xee\tDq\x8cL\xe6L\x8cqD\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12B>=\xfaC\x82\xef\xb1\u007f\x1f\x1f\u007f\xb1\xef\x82\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00;\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x03.\x01'#\x0e\x01\a\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00U\x03VU96\xb7g\xe6g\xb76\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12β\xb2\xfc\x0e\x8d\xc9**ɍ\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00G\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x06\a!&'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13\x89k\x02\xbck\x89\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a3\x91\x913\a!(!\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x0f\x009\x00I\x00\x00\x052\x16\x1d\x01\x14\x06#!\"&=\x014637>\b7.\b'!\x0e\b\a\x1e\b\x17\x132\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xe0\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0eb\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03\x04\xfc\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03b\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e@\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12@7hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh77hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh7\x06\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x00\x00A\x00j\x00\x00\x01\"\x06\x1d\x01#54&#\"\x06\x15\x11'54&#\"\x06\x1d\x01\x14\x17\x01\x16\x15\x14\x163!26=\x0147\x136=\x014&#\"\x06\x1d\x01#54&'&#\"\x06\x1d\x01#54&'&'2\x17632\x16\x17632\x16\x1d\x01\x14\a\x03\x06\x15\x14\x06#!\"&5\x01&=\x014632\x17>\x0132\x176\x03\x005K @0.B @0.B#\x016'&\x1a\x02\x80\x1a&\nl\n@0.B 2'\x0e\t.B A2\x05\bTA9B;h\"\x1b d\x8c\rm\x06pP\xfd\x80Tl\xfe\xccL\x8dc\v\x05\x06\x8b_4.H\x04\x80K5\x80]0CB.\xfeS\x1e\xac0CB.\xe0/#\xfe\xd8'?\x1a&&\x1a\x19)$\x01\xb4$)\xf60CB. }(A\b\x02B.\x80z3M\x05\x01\x802\"61\a\x8fd\xf639\xfeL\x18/PpuT\x01(If\xe0c\x8d\x01_\x82\x15E\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06`\x06\x00\x001\x00X\x00\x00\x00\"\x06\x15\x11#\x114&\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x1365\x114&\"\x06\x15\x11#\x114&\"\x06\x15\x11#\x114&2\x16\x17632\x16\x1d\x016\x16\x15\x11\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x114632\x176\x03\x9e\\B B\\B\x9a&@5K\x1a\x01\x80&@\x02\xb0\"6\aL\x05B\\B B\\B \xb4\x88s\x1f\x13\x17c\x8di\x97\bL\x0e}Q\xfdP\x01\x03%&#\"\x06\x15\x14\x16\x17\x05\x15!\"\x06\x14\x163!754?\x01\x0327%>\x015\x114&#!\a\x06\x15\x11\x14\x1626=\x013\x15\x14\a\x1e\x01\x15\x14\x06\a\x05\x041\xb1\xa3?\x17>I\x05\xfe\xfbj\x96\x96jq,J[\x96j.-\x02t\x01\x91j\x96lV\xfe\xad\\\x8f\x9b\xa3\x1e$B.\x1a\x14\x01R1?\x01@B.\x1a\x14\xfe\xde\x1c\x12+\x10\x10?2\x14\x12\x01`\x1e$\xe8\xfdv\x18\x165K-%\x02\x0e\xfd\x805KK5\x02\x17\xe9.olRI\x01S+6K5\xfë$B\\B 94E.&\xfeʀ\x8d15\x05\x1euE&\n\x96Ԗ\x11\x1c\x83Pj\x96\x11\xef\x96j\xfddX\x8b\x15U\x17\x02\xc7GJ\x0e7!.B\n\x9a\nP2\xff\x00.B\n\x84\r\b\x1a\x15%\x162@\t\xa0\x0e7\x03\x11\xf8\bK5(B\x0e\xc8@KjKj\xc6?+f\xfc\x00\x13U\vE,\x02\x9c5K~!1\xfe\xd8.>F.\xd0\xd0F,\bQ5*H\x11\x8d\x00\x00\x00\x00\x02\x00\x00\xff\x00\b\x00\x06\x00\x00$\x00b\x00\x00\x012\x16\x17\x01\x16\x15\x11\x14\x06#!\"&=\x01%!\"&=\x01463!7!\"&'&=\x01463\x01\x114'\x01&#!\"\x06\x15\x14\x1e\x01\x17>\x013!\x15!\"\x06\x15\x14\x17\x1e\x013!32\x16\x15\x14\x0f\x01\x0e\x01#!\"\x06\x1d\x01\x14\x163!2\x17\x05\x1e\x01\x1d\x01\x14\x163!26\x04\u007f=n$\x02\x0132\x16\x17\x1b\x01>\x0132\x16\x17\x1e\x01\x15\x14\a\x03>\x0532\x16\x15\x14\x06\a\x01\x06#\x03\"\x06\a\x03#\x03.\x01#\"\x06\x15\x14\x17\x13#\x03.\x01#\"\x06\x15\x14\x17\x13\x1e\x01\x17\x13\x1e\x013!27\x01654&#\"\a\x0554\x1a\x017654&#\"\x06\a\x03#\x13654&\x01\xcbMy\x13e\r\x05t\a|]\x11\x83WS\x82\x14Sg\x14\x82SY\x85\x0e\\x\a{\n7\x160\"1\x19i\x9692\xfe\x05DU1&=\t\xa4\u007f\x91\t=&0@\x03\x84\x1ac\t>&/B\x03t\a\x04\bd\b4!\x02\xb6*\"\x01\xfb8K4+\"\xfe\xcd@H\x03\x04@/'=\tt\x1a\x96\x03?\xff\x00_K\x01\x9193-\x16\x01\xdd\x1b\x1e]\x88\nUlgQ\xfe\xa4\x01\xacQgsW\n\x8a]\x18#\xfe\x00\a+\x10\x1e\v\v\x94i>p&\xfe\x843\x06\x800&\xfdV\x02Z&0B/\x0f\r\xfd\xdd\x01\x98%3B.\x0e\f\xfe\"\x1ct\x1e\xfeo )\x1a\x01{+C4I\x1a\xe6\xe3\x04\x01\f\x01(\r\x12\v/D0&\xfe\x1e\x02p\x0e\x0e0D\x00\x05\x00\x00\xff\x00\x06\x80\x06\x00\x003\x00[\x00_\x00c\x00g\x00\x00\x01\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x136=\x014&\"\x06\x15#54&#\"\x06\x1d\x01#54&#\"\x06\x1d\x01#\x114&'2\x16\x1d\x01632\x17632\x17632\x16\x1d\x01\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x1146\x13\x11#\x11!\x11#\x11!\x11#\x11\x02\x805K\x97)B4J\x1a\x01\x80&@\x02\xce\x16#\x05\\\x188P8 @0.B J65K J6k\x95\x16\ncJ/4qG\x1b\x1d^\x82\x1c\\\x10hB\xfd2.\xfe\xd81!~K5\x03y\x17?\xa3\xb1^\\\xfe\xadVl\x96j\x01\x91\x02t-.j\x96[J,qj\x96\x96j\xfe\xfb\x05I7$\x1e\xa3\x9b?1\x01R\x14\x1a.B\x87\x10\x10+\x12\x1c\xfe\xde\x14\x1a.B$\x1e\x01`\x12\x142?\x01g\x16\x18\xfdvEo.\xe9\x02\x175KK5\xfd\x80\x02\x0e%-K\xfa\xeb6+\x01SIR[\xfe\xca&.E49 B\\B$\x88\xfe\xcc5K\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\xb4\x04\x00\x00\x19\x00G\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!2\x16\x05\x13\x16\a\x06+\x01\"&'\v\x01\x06+\x01\"'\v\x01\x0e\x01+\x01\"'&5\x13>\x01;\x012\x17\x13\x16\x17>\x017\x136;\x012\x16\x03Y\x13\r\xfe\xd6\x12\r\x87\r\x13\xfe\xd7\r\x13\x12\x0e\x03\x19\r\x13\x04\x0eM\x01\t\n\r\x86\f\x12\x01.\xbd\b\x15x\x14\t\xbc-\x01\x12\f\x87\r\n\tN\x01\x12\f\x8e\x14\t\xdc\n\n\x03\r\x04\xdd\t\x14\x8d\r\x12\x03\xe0u\r\x12\xfc\xd4\r\x13\x12\x0e\x03,\x12\ru\x0e\x12\x13\n\xfc?\r\v\n\x11\f\x02L\xfeW\x13\x13\x01\xab\xfd\xb2\f\x11\n\n\x0e\x03\xc1\f\x11\x13\xfd\xf8\x18\x1b\a#\t\x02\b\x13\x11\x00\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\t\x00*\x00:\x00J\x00\x00\x014'&+\x01\x11326\x17\x13\x16\a\x06+\x01\"'\x03#\x11\x14\x06+\x01\"&5\x11463!2\x17\x1e\x01\x15\x14\x06\a\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\x12UbUI\x06-\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\x01ڎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03AX!\x12\xfe\xe7J\xd9\xfe\x8b\x11\x0e\x10\x11\x01m\xfe\xa2\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x18\x1f\x9cf\\\x93$\n\x036u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\xfeK\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00[\x00k\x00{\x00\x00\x01276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16!276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x02]\x99h\x0e\v-\x06\x12\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x94\xc4\xc2\x03\f\x99h\x0e\n-\b\x11\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x93\xc5\xc2'\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\xfd\xa4\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01/h\x12\x12R\r\x04\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbfh\x12\x12R\x0e\x03\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbf\x041u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\x01\x15\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x00\x00\x02\x00@\xff\xe0\a\xc0\x05 \x00\v\x00\x17\x00\x00\t\x04\x17\a'\t\x017\t\x03'7\x17\t\x01\a\x01\a\x01\x02\xe0\x01\x80\xfe\x80\xfd`\x02\xa0\xa8`H\xfe \x01\xe0\xc1\xfe\xdf\x02\xa0\x02\xa0\xfd`\xa8`H\x01\xe0\xfe \xc1\x01!`\xfe\x80\x02\xe0\xfe\x80\xfe\x80\x02\xa0\x02\xa0\xa8`H\xfe \xfe \xc1\x01\x1f\x02\xa0\xfd`\xfd`\xa8`H\x01\xe0\x01\xe0\xc1\xfe\xe1`\x01\x80\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00\x17\x00'\x00\x00%\t\x01\a\x17\a\t\x01\x177'\t\x057'7\t\x01'\a\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x02\xcd\x01\x0f\xfe\xe9X\xc0`\xfe\xe9\x01\x17(W\u007f\xfe:\x03,\x01\xc6\xfe:\xfe\xf1\x01\x17X\xc0`\x01\x17\xfe\xe9(W\x03L\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xb6\x01\x0f\x01\x17X\xbf`\x01\x17\x01\x17(W\x80\xfe:\xfeB\x01\xc6\x01\xc6\xfe\xf1\xfe\xe9X\xbf`\xfe\xe9\xfe\xe9(X\x01\xf9\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\n\x00\x00\xff\xdc\t\x00\x05$\x00\v\x00\x13\x00\x1c\x00%\x00/\x009\x00E\x00S\x00[\x00\x80\x00\x00\x01\x14\x06#\"&54632\x16$\x14\x06\"&462\x054&\"\x06\x14\x1626$4&#\"\x06\x14\x162%\x14\x06#\"&462\x16$\x14\x06#\"&4632\x00\x10\x00#\"\x0e\x01\x14\x1e\x0132\x01&! \a2\x1e\x02\x154>\x02\x00\x10\x00 \x00\x10\x00 \x13!\x0e\x01\a\x16\x15\x14\x02\x04#\"&'\x06\a.\x01'\x0e\x01#\"$\x02547.\x01'!6$32\x04\x02\x8b7&'77'&7\x04\x827N77N\xfc'q\xa0qq\xa0q\x04\x81qPOrq\xa0\xfcE\xa3st\xa3\xa4\xe6\xa3\x04\x82\xa3ts\xa3\xa3st\xfc\xdf\xfe\xf1\xbf}\xd4||\xd4}\xbf\x03\xab\xfe\xfe\xd2\xfe\xc1\xfeuԙ[W\x95\xce\x02Q\xfe\xf2\xfe\x82\xfe\xf1\x01\x0f\x01~\x04\x01\u007f,>\tn\x9a\xfe\xf8\x9b\x85\xe8P/R\vU P酛\xfe\xf8\x9an\t>,\x01m\x95\x01\x9c\xe2\xe0\x01\x8a\x02\x1b'77'&77\x02N77N6^Orq\xa0qq\x01\xa0qq\xa0q\xc0t\xa3\xa4棣\x01棣\xe6\xa3\xfe(\x01~\x01\x0f|\xd5\xfa\xd5|\x04\von[\x9a\xd4usј^\xfd\a\x01~\x01\x0f\xfe\xf1\xfe\x82\xfe\xf1\x04\x043\u007f3\x97\xba\x9c\xfe\xf8\x99pc8{\x16y%cq\x99\x01\b\x9c\xba\x973\u007f3dqp\x00\x03\x00f\xff\x00\x04\x9a\x06\x00\x00\t\x00\x13\x00L\x00\x00\x00 \x0054\x00 \x00\x15\x14\x00\"\x06\x15\x14\x162654\x01\x1e\x01\x0e\x02\a\x06\a\x17\x01\x16\x14\x0f\x01\x06\"'&'\x01\x06\"/\x01&47\x017&'.\x0367>\x02\x16\x17\x1e\x04326?\x01>\x01\x1e\x01\x03<\xfe\x88\xfe\xf6\x01\n\x01x\x01\n\xfe\x96\xb8\x83\x83\xb8\x83\x01,\r\x04\r(-'s\xc8I\x01\v\x1e\x1e\f\x1fV\x1fC\xc8\xfe\xf5\x1fV\x1e\f\x1f\x1f\x01\vH\xcbr'-(\r\x04\r\n$0@!\x05\x14BHp9[\xa6%&!@0$\x02u\x01\n\xbb\xbc\x01\n\xfe\xf6\xbc\xbb\x01\x9b\x83]\\\x83\x83\\]\xfd\xa7\x1b-$)!\x19I\x15H\xfe\xf5\x1fV\x1e\r\x1e\x1eD\xc8\xfe\xf4\x1e\x1e\r\x1eV\x1f\x01\vH\x15I\x19!)$-\x1b\x14\x1e\x0e\x12\x1a\x04\x0e#\x1a\x163\x19\x19\x1a\x12\x0e\x1e\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x006\x00>\x00N\x00\x00\x00\x14\x06\"&462\x01.\x01\x06\a\x0e\x02\"&/\x01.\x01\x06\a\x06\x16\x17\x16\x17\a\x06\a\x06\x14\x1f\x01\x162?\x01\x16\x17\x162?\x0164/\x0267>\x01\x02\x10& \x06\x10\x16 \x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9f]\x84]]\x84\x013\n$;\x1f\n&|\x82v\x1b\x1b\x1f;$\n\x16(CS\x8f3\x8e1\x16\x16\t\x16=\x16\xbfrM\x16=\x16\t\x16\x16\xbf4\x8dTC(G\xbe\xfe\xf4\xbe\xbe\x01\f\x02z\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfe\x84]]\x84]\xfd\xf6\x14\x18\x05\x19\b\x18($\x12\x12\x19\x05\x18\x14-;,5\x0e4\x8e0\x16=\x16\t\x16\x16\xbfsL\x16\x16\t\x16=\x16\xbe4\x0e5,;\x01\x12\x01\f\xbe\xbe\xfe\xf4\xbe\x01\xe8\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\xb8\x05\x80\x00\x12\x00(\x00\x00\x012\x16\x15\x11\x14\x02\x06\x04#\"$&\x025\x11463\x0127\x01654&#\"\a\t\x01&#\"\x06\x15\x14\x17\x01\x16\x06\x1dAZ\x88\xe5\xfe\xc1\xaf\xb0\xfe\xc1\xe6\x88\\@\x02\xc1/#\x01\x94%E1/#\xfe\xbd\xfe\xbd#.1E$\x01\x95!\x05\x80[A\xfd\xf9\xb0\xfe\xc0懇\xe6\x01@\xb0\x02\a@\\\xfb\xd8!\x01\x84#21E!\xfe\xca\x016!E13\"\xfe|!\x00\x00\x00\x01\x00\x00\xff\x98\t\x00\x05g\x00L\x00\x00\x05\x01\x06\x00\a\x06&5&\x00'.\x02#4&5!\x15\x0e\x02\x17\x16\x00\x176\x127&\x02'&'5\x05\x15\x0e\x01\x17\x1e\x01\x17676&'6452>\x013\x15\x0e\x01\a\x03\x16\x12\x17\x01.\x02'5\x05\x17\a\x06\a\x00\a\x05\xd6\xfe\xd9\x19\xfe\xf5A\x015R\xfe\xa5V\x15[t,\x01\x02G'Q4\x10\x1a\x01}-\x1f\xda\x16\x13\xd6\x1d&\xa3\x02\x01r!\xd5\r\xe5\a\x01\xb9\x0eG;\x1a\x01\xcc\x01\x01\x8b>\xfd\xf2!g\x02\xb71\xfd\xff\x85\x01\x01\x01\xc1\x03\x14\xca2sV\x05&\b2\x02\x1c:#;\xfc\x90d=\x01\x9b*'\x01\xe45E\x022\x01/\x02..F\xefD֕71\x02\a$\x06\x01\x011\x02>2\xfeF!\xfd\xfe\x11\x03\xf9&1\x0e\x012\x04\x02,\x04\x8d\xfb@K\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x18\x00r\x00\x82\x00\x92\x00\x00\x01\x14\x06#\"&5462\x16\x17\x01\x0e\x04\a\x01>\x04%\x14\a.\x02#\"\x15\x14\x17\x0e\x01\a'&#\"\x06\x1f\x01\x06#\"'>\x0254#\"\x0e\x01\a.\x01'7654&\x0f\x01&547\x1e\x023254&/\x01>\x017\x17\x16326/\x01632\x17\x06\x15\x14327\x1e\x01\x17\a\x06\x15\x14\x16?\x01\x1e\x01\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb5!\x19\x1a&\"2&\x0f\x01^\tu\x86\x8b_\x03\xfe\xa3\ax\x84\x8c^\x02\x8ah\x03\x1c\x19\x04\r;J݃\x10\x01\x0e\x05\x06\x01\x10HJǭ\x01\x18\x13\r\x06\x16\x17\x02q\x9e\x1fE\n\v\x05D\x0em\x02!\x1b\x04\r\x19\x14\x14M\xe0\x84\x0f\x02\r\x05\x06\x01\x0fG?̯'\f\v%o\x99\x1f8\n\v\x049\x0eU\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x01(\x01F\x01(\xd6ߎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x02\x83\x1a&!\x19\x1a&!S\x02E\bm|\x82[\x06\xfd\xbc\an{\x83[<ɪ\x02\x12\x0f\r\n\"p\x9d C\n\v\x04D\x0fi\x02%\x1e\x04\r\x1d(\x03K\xe1\x84\x0f\x03\f\x05\x06\x01\x0fHCέ\x01\x16\x10\f\x06\x13\f\fp\x9a\x1eC\n\v\x05B\rm8\t\r@Kނ\f\x02\x0e\x05\x06\x01\rH\xe7\x01F\x01(\xd6\u007f\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x02\x81\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x01\a\x00\x06\x00\x00\v\x00\x16\x00\"\x00*\x00\x00\x016\x17\x16\x17%&\x04\a\x016$\t\x01\x16\x047\x03&$\x025\x10%\x16\x12\x02\x06\a\x06%\x016\x02'$2\x16\x14\x06\"&4\x03}\xf0\xd3\xe8x\xfd\x1a\xa0\xfe\xf43\xfe\xec\x80\x01n\xfd\xdd\x01QH\x01\x16\x9a\xe6\xd4\xfe\xa6\xc7\x06\xc4:\x03dΏ\xe6\xfe\xf4\x01\x95X\ve\xfe8\xfa\xb1\xb1\xfa\xb1\x06\x00\x02z\x86\xee'\t\xa7\x92\x01\xa8\x9f\xad\xfel\xfdi\x8f\x94\x1d\xfe=!\xf9\x01\u007f\xdc\x01\v7\x96\xfe\xbf\xfe\xdd\xfdS\x85\x0e\x02o\x83\x01?v\x06\xb1\xfa\xb1\xb1\xfa\x00\x00\x01\x00\x02\xff\x00\a\x00\x05\xc9\x00M\x00\x00\x01 \x00'&\x02\x1a\x017\x03>\x01\x17>\x017\x0e\x01\x17\x1e\x03\x17\x16\x06\a\x0e\x02\a\x17'\x06\x1e\x027>\x02\x17\x1e\x01\a\x0e\x04'\x0e\x01'\x1e\x01>\x0276.\x01'\x1e\x01\x176\x02'\x04\x00\x13\x16\x02\x0e\x01\x04\x03\x87\xfe\xe5\xfeEl:\x12F\x98g\v\vr\r*\xedt6\x83\a\x19K3U\b\x0f\v\x19\x05\x17Z8\x0f\x8b\x12\x153P)3^I%=9\t\x01\x03\x0e\x16)\x1a<\xa9}J\xb1\xa0\x95k\x1b+\bC-Wd\x1b\x0f\x91\x89\x01\t\x01&\x04\x02U\xa2\xd8\xfe\xe9\xff\x00\x01-\xf8\x83\x01T\x01E\x01+]\xfe\xe7\x0e\x03\x11Qr\x02-\xcf<\b\v\x04\x04\x01\x05Q#\a\x170\n\xbdC+M8\x1b\a\t3'\x02\x04:$\x02\a\x12\r\b\x03_Q\v=+\x1fIf5[ˮ&&SG\xaa\x01ZoM\xfek\xfe\xc5\u007f\xff\x00ܬc\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x007\x00\x00\x01&#\"\x04\a\x0e\x01\a\x15\x1e\x01\x17\x16\x04327\x06\x04#\"'&$&\x0254\x126$;\x01\x16\x04\x01\x14\x02\a\x06#\"'6\x1254\x02'632\x17\x16\x12\x05ե\u009b\xfe\xecfKY\x04\x04YKf\x01\x14\x9b¥y\xfeͩ\x1d\x0e\xaf\xfe\xc4䆎\xf0\x01L\xb6\x03\xa8\x011\x01\xa4\x9a\x88hv\x89v\x9a\xc7ƚw\x87wk\x87\x97\x05\x1cn\x92\u007f]\xfa\x8d*\x8d\xfa]\u007f\x92nlx\x01\b\x94\xee\x01D\xb1\xb6\x01L\xf0\x8e\x01w\xfc\xf8\xc0\xfe\xab~?T8\x01b\xe4\xe3\x01b9SA}\xfe\xac\x00\x00\x00\x04\x00\x00\xff\x10\a\x00\x05\xf0\x00+\x005\x00?\x00F\x00\x00\x01\x14\a!\x14\x163267!\x0e\x01\x04#\"'\x06#\"\x114767\x12%\x06\x03\x12\x00!2\x17$32\x1e\x02\x15\x14\a\x16\x034&#\"\a\x1e\x01\x176\x01\x14\x16327.\x01'\x06\x01!.\x01#\"\x06\a\x00\a\xfb\x81۔c\xad2\x01\xa78\xe5\xfeΨ\xbb\xa9\xe4\xa6\xed-\x11\\\xc7\x01\x14\xb8\xf3?\x01\xb9\x01\x19\x1e\x0f\x00\xff\xb2@hU0KeFjTl\x92y\xcbE3\xf9\xc6aVs\x97z\xb7.b\x01\xf8\x02\xd8\x05؏\x90\xd7\x02W80\x92\xc5]T\x9f\xf4\x85St\x01\as\xa0<\xa9\x01h\xf6O\xfe\xed\x01\x12\x01_\x01u\x1a7bBt\xaa\xb6\x01\xb0SbF/\xa9o\x87\xfb|V]SHކ\xcd\x02J\x8e\xbe\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x003\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\"&=\x01463!5!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd \x01`\x0e\x12\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x01`\xfd B^^B\x06@B^\x01 \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@B^\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80^B\x03\xc0B^^\x00\x00\x00\x00\x02\x00\x16\xff\x80\x06\xea\x05\x80\x00\x17\x00>\x00\x00\x133\x06\a\x0e\x03\x1e\x01\x17\x16\x17\x16\x17\x16\x17!\"&5\x1146)\x012\x16\x15\x11\x14\x06+\x016\x03\x05\x0e\x03\a\x06'.\x02'.\x0167>\x0176\x1e\x03\x17%&\x8a\xc5F8$.\x0e\x03\x18\x12\x13\x04\x023\x1e9_\xfe\xf00DD\x04\xe8\x0140DD0\xb2\xd4\x10\xfe+\x02\x14*M7{L *=\"#\x15\n\x12\x14U<-M93#\x11\x01\xd4D\x05\x80@U8v\x85k\x9d_Y\x13\t\xee[\xabhD0\x05\x180DD0\xfa\xe80D\xd2\x01ce-JF1\f\x1aB\x1bD\xbe\xa3\xa3\xc8N&)@\r\f\v\x17/1 d\xaf\x00\x00\x00\x00\x04\x00\x0e\xff\x00\x05y\x06\x00\x00%\x00F\x00\xab\x00\xc5\x00\x00\x05\a\x06\a\x06#\"'&'&'&'&76\x17\x16\x15\x16\x17\x16\x17\x16\x17\x163276?\x016\x17\x16\x17\x16\x01\a\x17\x16\a\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&7632\x1f\x0176\x17\x16\x05\x14\a\x06\a\x0e\x01\"&'&'&5#&76\x17\x16\x173\x11567632\x16\x15\x14\x06#\"'&76\x1f\x01\x1e\x0132654'&#\"\a\x06\x15\x11\x1632>\x0254'&#\"\a\x06\x0f\x01\x0e\x02'.\x015\x11463!2\x14#!\x113>\x017632\x16\x17\x16\x17\x16\x03\x16\x14\x06\a\x06#\"'&'&#\"\a\x06'&767632\x17\x16\x05y\x06q\x92\x9a\xa3\xa5\x98\x94oq>*\f\x0443\x05\x01\x12\x1c2fb\x80\x84\x90\x8f\x85\x80a\x06\n\x0f\f\x15$\xfe\x15B?\x15\x1c\x11\x0f\n\t>B\x05\n\x0f\x10\x02\x12\bBB\x10\x1e\x12\r\x06\aAA\x12\x1e\x1b\x01\xc7.-QP\xd6\xf2\xd6PR+\x0f\x01\t42\n%<\x01\x03ci\x94\x93\xd0ђ:6\x1c\x0f\x10\x1c\x0e\x0e&\vh\x90HGhkG@n\x84`\xb2\x86I\x8d\x8c\xc7Ȍ5\x18\x02\b\n!\x16\x15\x1f\x15\x11\x03m\x1e\x1e\xfc\xd5\x01(|.mzy\xd6PQ-.\x1f\t\v\v\x1a\r\t\aje\x80\x94\x85\x81\x1b\x12\t\x01\x03\r\x82\xa9\xa4\x98\x89\v\x06q>@@?pp\x92gV\x1c\b\b\x1c\x01\x03ZE|fb6887a\x06\n\x04\x03\x13%\x02RB?\x15\x1c\x11\n=B\x05\x10\x02\x0f\x0e\a\nAB\x10\x1d\x12\x05BA\x11\x1e\x1bJvniQP\\\\PRh!\a\x1b\x11\x10\x1ccD\x01S\x02\x88`gΒ\x93\xd0\x10\v23\b\x03\x03\x06\x8fgeFGPHX\xfecCI\x86\xb0_ƍ\x8c\x8c5\"\x02\v\t\n\b\x05\x17\x0f\x02\xa8\x0f\x17n\xfe\x1d*T\x13.\\PQip\x01\xd0\b\x14\x10\r\x1a\a[*81\n/\x19\r\x10\x049@:\x00\x00\x04\x00\x1d\xff\x00\x06\xe1\x06\x00\x00\x1b\x00>\x00t\x00\x82\x00\x00%6\x16\x14\a\x0e\x04#\".\x03'.\x01>\x01\x16\x17\x16\x17\x04%6%\x16\x06\a\x06\a\x06&7>\x01'.\x03\x0e\x02#\x0e\x03*\x02.\x01'&676\x16\x01\x14\x1e\x02\x1f\x01\a.\x01/\x01&'\x0e\x03.\x0254>\x05754'&#\"\x0e\x03\a%4>\x0332\x1e\x03\x15\x01\x14\x17\x167676=\x01\x0e\x03\x06\x0f\x0f\x16\x0f\r>\x81\x99\xdfvw\ued25d\"\b\x04\x06\n\r\x05\xc0l\x01\x85\x01\x9a\xbe\x01\x98\v\x11\x14\"3\x11\x12\t\x15/\x11\x05\x15!\x1a,\x13+\x01\x06\x0e\b\t\x05\x06\x03\x03\x01\x01\x06j2.|\xfe\x84\x1b%&\x0e\r\xe3(N\x13\x13\v\x0e&w\x88\x90\x83h>8X}x\x8cc2\x15\"W\x06\x15<4<\x12\xfe\xda,Z~\xb1fd\xa2aA\x19\xfd`FBIT\x1e\x0e;hmA<\x06\x06\x1d\x13\x107QC1>[u])\t\x0f\t\x05\x01\x04u1\xb0V(\xd2\x10k1S)\x0e\n\x13-\x99\x16\a\t\x03\x02\x02\x02\x04\x01\x01\x01\x01\x01\x02\x02\x100\x06\a\f\x01\xa9\x1fB2*\v\v\xe0%M\x14\x14\v\x16;W(\x060S\x8f[T\x8c]I)\x1c\t\x02\u007fA 5\x02\x16%R7\x1b&\x1a\x80\x1a&T\x01\xa8\x01,\xfe\xd4\xfeX\xfe\xd4\x02\x00\x0e\x12\x12\x0e\x92\xce\x12\x1c\x12\xa9\x01\xc0\x0f\xfdq\x1a&&\x1a\x02\x8f\x041\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8L\x12\x1c\x12Β\x0e\x12\x12\x0ew\xa9\x00\x00\x00\x00\x03\x00%\xff\x00\x06\xdb\x06\x00\x00\x1b\x00%\x00;\x00\x00\x01\x16\x14\x0f\x01\x06#!\"&5\x11463!546;\x012\x16\x1d\x01!2\x17\x01!\x11\x14\x06+\x01\"&5\x012\x16\x15\x11\x14\x06#!\"/\x01&4?\x0163!5!\x15\x06\xd1\n\n\x8d\x1c(\xfa\xc0\x1a&&\x1a\x02@&\x1a\x80\x1a&\x02\x00(\x1c\xfc\xbc\x01\x00&\x1a\x80\x1a&\x03@\x1a&&\x1a\xfa\xc0(\x1c\x8d\n\n\x8d\x1c(\x02\x00\x01\x00\x04\xd7\n\x1a\n\x8d\x1c&\x1a\x01\x00\x1a&@\x1a&&\x1a@\x1c\xfb\xdc\xfe\x00\x1a&&\x1a\x03\xc0&\x1a\xff\x00\x1a&\x1c\x8d\n\x1a\n\x8d\x1c\xc0\xc0\x00\x04\x00\x00\xff\x00\b\x00\x05\xfb\x00\x1b\x00\x1f\x00#\x00'\x00\x00\x01\x16\x15\x11\x14\x06\a\x01\x06'%\x05\x06#\"'&5\x11467\x016\x17\x05%6\x05\x11\x05\x11%\x11%\x11\x01\x11\x05\x11\a\xe4\x1c\x16\x12\xfd\x80\x18\x18\xfd\x98\xfd\x98\n\x0e\x13\x11\x1c\x16\x12\x02\x80\x18\x18\x02h\x02h \xfb\x18\x02@\xfb`\x02 \x04\xe0\xfd\xe0\x05\xf5\x14!\xfa\x80\x14 \a\xff\x00\v\v\xf6\xf6\x05\v\x14!\x05\x80\x14 \a\x01\x00\v\v\xf6\xf6\r\x9a\xfb\n\xe6\x04\xf6\r\xfb\n\xd9\x04\xf6\xfa\xfd\x04\xf6\xd9\xfb\n\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00#\x005\x00\x00\x012\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x17\x01\x16\x15\x11\x14\x06#\"'\x01&5\x1146\x02\x00\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\x04\xe8\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\xfb\xa8\b\x06\x02\x00\x12\x13\r\b\x06\xfe\x00\x12\x13\x06\x00\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x03\xff\x00\n\x13\xfa@\r\x13\x03\x01\x00\n\x13\x05\xc0\r\x13\x00\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x008\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'&7>\a7.\x0154\x12$ \x04\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\x01\xcb\xf0\xfed\xf4ne\xad\xfe\xfa4\"\f\x14\x03\x04\x18\x05%\x0e!\x0f\x1a\x0e\x0f\x05\x92\xa7\xf0\x01\x9c\x01\xe8\x01\x9c\x02KjKKjKKjKKjKKjKKjK\x01.\xfe\xa4\xfe٫\x12\xad8\n\x03\x01\x0e\v\x0f\x16\x05!\x0e%\x1a00C'Z\xfd\x8f\xae\x01'\xab\xab\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x00.\x00W\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x04\x14\x06\"&462\x02 \x04\x06\x15\x14\x16\x1f\x01\a\x06\a6?\x01\x17\x1632$6\x10&\x01\x14\x02\x04#\"'\x06\x05\x06\a#\"&'5&6&>\x027>\x057&\x0254>\x01$ \x04\x1e\x01\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\xe9\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x02\xb5jKKjKKjKKjKKjKKjK\x01\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xfe\x8b\xae\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xacee\xac\xed\x00\x04\x00\x00\xff\t\x04\x00\x05\xf7\x00\x03\x00\x06\x00\n\x00\r\x00\x00\t\x01\x11\t\x01\x11\x01\x19\x01\x01\x11\t\x01\x11\x02\x00\x02\x00\xfe\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\x02\x00\x01Y\x01'\xfd\xb1\xfe\xd8\x03w\xfd\xb1\x01(\x04\x9e\xfd\xb1\xfe\xd8\x02O\xfe\xd9\x01'\xfd\xb1\x00\x00\x00\x01\x00R\xff\xc0\x06\xad\x05@\x00$\x00\x00\x01\x06\x01\x00#\"\x03&\x03\x02#\"\a'>\x017676\x16\x17\x12\x17\x16327676#\"\a\x12\x05\x16\x06\xad\n\xfe\xbe\xfe\xb3\xe5\x8eb,XHU\x12mM\x18\xa8.\x9cU_t\x17,\x167A3ge\b\rz9@x\x01S\xfb\x03\xfa\xec\xfea\xfeQ\x01\a\xa0\x01B\x01\x06Lb\x15\x97(\x8a\b\t\x81\x8b\xfe\xe1V\xf9\xa1\xa1U\x8b\x1a\x01\x89\v\b\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\n\x00\x00\x11!\x11!\x01\x03\x13!\x13\x03\x01\x06\x00\xfa\x00\x04=\xdd\xdd\xfd\x86\xdd\xdd\x01=\x05\x80\xfa\x00\x01\xa5\x02w\x01)\xfe\xd7\xfd\x89\xfe\xd0\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x12\x00A\x00U\x00\x00\x11!\x11!\x01\a\x17\a\x177\x177'7'#'#\a\x052\x16\a74.\x02#\"\x06\x1d\x01#\x1532\x15\x11\x14\x06\x0f\x01\x15!5'.\x02>\x015\x1137#\"76=\x014>\x02\x015'.\x01465\x11!\a\x17\x16\x15\x11\x14\x06\x0f\x01\x15\x06\x00\xfa\x00\x03\x8c\fK\x1f\x19kk\x19\x1fK\f_5 5\xfe\x96 \x19\x01\xae#BH1\x85\x84`L\x14\n\rI\x01\xc0\x95\x06\x05\x02\x01\x01\xbf&\xe7\x06\x04\x04\x03\f\x1b\x02v6\a\x05\x02\xfe\xed\x17S\x17\f\x0eF\x05\x80\xfa\x00\x04\xc0!Sr\x1999\x19rS!``\xa3 /\x157K%\x0es}H\x80\b\xfe\x82\x0e\f\x01\aXV\x0e\x01\x01\x04\x04\n\x05\x01\x83\x80\x06\x06\x03P\x1b\x1b\x1d\v\xfc\xc3V\t\x01\x03\x03\f\x06\x02\be\x16\a\x14\xfe\x8e\x0e\t\x02\tV\x00\x00\x04\x00\x00\xffd\a\x00\x06\x00\x00/\x009\x00Q\x00[\x00\x00\x01\x14\x06\a\x16\x15\x14\x02\x04 $\x02547.\x0154632\x176%\x13>\x01\x17\x05>\x0132\x16\x14\x06\"&5%\x03\x04\x17632\x16\x01\x14\x16264&#\"\x06\x0164'&\"\a\x0e\x01\"&'&\"\a\x06\x14\x17\x1e\x022>\x01&2654&#\"\x06\x14\a\x00;2\f\xd5\xfe\x90\xfeP\xfe\x91\xd5\v3>tSU<\xda\x01)t\x03\x18\x0e\x01q\x12H+>XX|W\xfe\xb2h\x01,\xdb:USt\xfa\xa2W|XX>=X\x03*\v\v\n\x1e\v)\xa0\xa0\xa0)\v\x1e\n\v\v+\x97^X^\x97\x16|WX=>X\x02\xb2:_\x19.2\x9b\xfe\xf8\x99\x99\x01\b\x9b//\x19a:Ru?\x98\n\x02\t\r\x10\x03Q%-W|XW>J\xfe(\t\x97=u\xfe\xe7>XX|WX\xfe`\v\x1e\v\n\n*((*\n\n\n\x1f\v+2\t\t2\xf8X>=XW|\x00\x00\x00\x01\x00E\xff\x02\x06\xbb\x06\x00\x000\x00\x00\x133>\x03$32\x04\x17\x16\x1d\x01!\x1e\x03>\x017\x11\x06\f\x01'&\x02'&\x127\x0e\x01\a!6.\x04/\x01\x0e\x03E\x01\x10U\x91\xbe\x01\x01\x94\xe7\x01noh\xfb\x9b\x01i\xa8\xd3\xd7\xc9I\\\xfe\xed\xfe\xa2\x8d\xbd\xf5\x02\x03\xe4\xd30<\x10\x02{\b >ORD\x16\x16\x87\xf9ƚ\x02\xe5~\xe7˕V\xd3ƻ\xff\xbco\xa3R \x1aC3\xfe\x877J\x026I\x01`\xc4\xf2\x01Tb<\x83^M~M8\x1a\x0f\x01\x01\x05O\x82\x97\x00\x00\x00\x04\x00\x00\xff\x80\t\x00\x05\x80\x00\t\x00\r\x00\x11\x00\x1b\x00\x005\x11!\x11\x14\x06#!\"&\x01\x15!5!\x15!5\x012\x16\x1d\x01!5463\t\x00^B\xf8@B^\x02\x80\x01\x80\xfd\x00\x01\x00\x06`B^\xf7\x00^B \x02`\xfd\xa0B^^\x01\"\x80\x80\x80\x80\x04\x80^B\xe0\xe0B^\x00\x00\x00\x03\x00\x00\xff\x00\x06\xbb\x06\x00\x00\x1f\x000\x00;\x00\x00%'\x0e\x01#\".\x0154>\x0232\x16\x177&$#\"\x04\x06\x02\x10\x12\x16\x0432$\t\x01\x06\x00!\"$&\x02\x10\x126$3 \x00\x17\x03#\x15#\x1132\x1e\x01\x0e\x01\x060\xdaJ\xf5\x8d\x93\xf8\x90U\x91\xc7n\x83\xe9L\xd7n\xfe\x9fʡ\xfe\xda\xd4~~\xd4\x01&\xa1\xd5\x01q\xfe@\x02\xb5t\xfeK\xfe\xee\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\xb6\x01\x04\x01\xa5}\x9f'`\x88 -\f\n-\xf6ox\x8a\x90\xf8\x92nǑUyl}\xa9\xc0~\xd4\xfe\xda\xfe\xbe\xfe\xda\xd4~\xd6\x02F\xfe\xa0\xfd\xfeڎ\xf0\x01L\x01l\x01L\xf0\x8e\xfe\xf5\xe9\xfet\xa0\x01`(88(\x00\x04\x00 \xff\x00\x06\xe0\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\t\x017!\x01'\x11\x01\x1f\x01\x11\t\x02!\x01\x05\x93\xfd\x9a\\\x03W\xfa\xb5\xb8\x04\x9f\x14\x93\xfd\xec\x01\\\xfe\f\xfc\xa9\x01d\x03;\x01\x82\x97\xfc\xdet\x03Z\xfd\x19`_\xfc\xa6\x01O\x02\u007f\xfc\xde\x02;\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\xf0\x00\v\x00\x17\x00}\x00\x00\x0154+\x01\"\x1d\x01\x14;\x012%54+\x01\"\x1d\x01\x14;\x012\x05\x11!\x114&\"\x06\x15\x11!\x114;\x012\x1d\x013\x114;\x012\x1d\x01354;\x012\x1d\x01354>\x02\x163\x11&5462\x16\x15\x14\a\x15632\x1632632\x1d\x01\x14\x06#\"&#\"\a\x1526\x1e\x02\x1d\x01354;\x012\x1d\x01354;\x012\x15\x11354;\x012\x02\x80\x10`\x10\x10`\x10\x02\x00\x10`\x10\x10`\x10\x02\x00\xfd\x80p\xa0p\xfd\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x80\x05\f\a\x10\x01 !,! -&\x15M\x10\x11<\a\x10F\x1b\x12I\x13(2\x01\x10\a\f\x05\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x02\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xfd\x10\x01@PppP\xfe\xc0\x02\xf0\x10\x10p\x02p\x10\x10pp\x10\x10pp\x06\a\x03\x01\x01\x01\x87\x0f#\x17 \x17#\x0f\x11\n\x0f\x0f\x10\xd2\x0f\r\x0f\f\x85\x01\x01\x03\a\x06pp\x10\x10pp\x10\x10\xfd\x90p\x10\x00\x01\x00\x00\x00\x00\t\x00\x05\x80\x00j\x00\x00\x01\x16\x14\a\x05\x06#\"'&=\x01!\x16\x17\x1e\x05;\x015463!2\x16\x15\x11\x14\x06#!\"&=\x01#\".\x05'.\x03#!\x0e\x01#\"&4632\x16\x1732>\x027>\x06;\x01>\x0132\x16\x14\x06#\"&'#\"\x0e\x04\a\x06\a!546\x17\b\xf0\x10\x10\xfe\xc0\b\b\t\a\x10\xfc\xa6%.\x10\x11\x1f\x17\x1f \x11`\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12` :,.\x1c'\x12\x13\x17\x1c,-\x18\xfe\x98\x16\x8aXj\x96\x96jX\x8a\x16h\x18-,\x1c\x17\x13\x12'\x1c.,: k\x15b>PppP>b\x15k\x11 \x1f\x17\x1f\x11\x10.%\x04Z \x10\x02\xdb\b&\b\xc0\x05\x04\n\x12\x80:k%$> $\x10`\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e`\x14\x1b6&L')59I\"Tl\x96ԖlT\"I95)'L&6\x1b\x149Gp\xa0pG9\x10$ >$%k:\x80\x12\x14\v\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x11\x00!\x00\x00\x00\x14\x06+\x01\x1132\x00\x10&#!\x113\x1132\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04~O8\xfd\xfd8\x01\x02\xb7\x83\xfeO\xb4\xfd\x82\x02\x87\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03>pN\x01\r\xfe\xf7\x01\x04\xb8\xfc\x80\x01\r\x01i\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x04\x00\x00\xff\xd9\t\x00\x05'\x00'\x00:\x00M\x00a\x00\x00\x014&'\x06\a\x0e\x01#\"'.\x017654.\x01#\"\x06\a\x16\x17\x16\x14\x06\"'&#\"\x06\x14\x163!267\x14\x06#!\"&54676$32\x00\x17\x1e\x01\x17\x14\a\x06#\"'.\x0176\x10'&>\x01\x16\x17\x16$\x10\a\x06#\"'.\x017654'&676\x16\x17\x06mD5\a\x10\a)\x18\f\f\x1f\x1c\n\x17z\xd2{\x86\xe26lP\x16,@\x17Kij\x96\x96j\x04\x16Oo\x99Ɏ\xfb\xea\xa9\xf0ȕ>\x01>\xc3\xeb\x01[\x17t\x99\xfaa\x17)\x18\x13\x1a\f\x12GG\x12\f4?\x12a\x01\x00\x86\x17)\x17\x13\x1a\r\x12ll\x12\r\x1a\x1a>\x12\x01\xb6;_\x15-/\x18\x1c\x03\n9\x1eGH{\xd1z\x92y\x1cN\x17@,\x16K\x95ԕoN\x8e\xc8繁\xe4\x16\xb8\xe4\xfe\xc3\xe7\x19\xbby\xaf\x90!\r\x11?\x1ah\x01\x02h\x1a>$\r\x1a\x8eD\xfe\x18\xc7\"\r\x12>\x1a\xa4\xc2â\x1a?\x11\x12\f\x1b\x00\x02\x00$\xff\x00\x05\xdc\x06\x00\x00\t\x00n\x00\x00\x05\x14\x06\"&5462\x16'\x0e\x01\x15\x14\x17\x06#\".\x0554>\x032\x1e\x03\x15\x14\a\x1e\x01\x1f\x012654.\x04'&'.\x0354>\x0332\x1e\x03\x15\x14\x0e\x03#\"#*\x01.\x045.\x01/\x01\"\x0e\x01\x15\x14\x1e\x03\x17\x1e\b\x05\xdc~\xb4\u007f\u007f\xb4~\xe9s\x9b!\x92\xe9m\xb8{b6#\f\t\x1c-SjR,\x1b\b\x17\x1cl'(s\x96\x12-6^]I\x1c\x0ft\x8eg))[\x86\xc7zxȁZ&\x1e+6,\x11\x02\x06\x13\x1a4$.\x1c\x14\x0fX%%Dc*\n&D~WL}]I0\"\x13\n\x02\rY\u007f\u007fYZ\u007f\u007f\xbf\x0f\xafvJ@N*CVTR3\x0e\x13/A3$#/;'\x0e\"/\x1b\x1e\x02\x01fR\x1a-,&2-\"\r\a7Zr\x89^N\x90\x83a94Rji3.I+\x1d\n\n\x12&6W6\x10\x13\x01\x01>N%\x18&60;\x1d\x1996@7F6I3\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00+\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26%\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x007\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x16%\"&5\x1146;\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x012\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x01\xee\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04@\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\xc0\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x167\"&5\x11463!2\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92n\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00%\x00=\x00\x00%\x13\x16\a\x06#!\"'&7\x13\x01\x13!\x13>\x013!\x15\x14\x1626=\x01!\x15\x14\x1626=\x01!2\x16%\x11\x14\x06\"&5\x114&\"\x06\x15\x11\x14\x06\"&5\x1146 \x16\x06\xdd#\x03\x13\x13\x1d\xf9\x80\x1d\x13\x13\x03#\x06]V\xf9TV\x03$\x19\x01\x00KjK\x01\x80KjK\x01\x00\x19$\xfe\x83&4&\x96Ԗ&4&\xe1\x01>\xe1\x80\xfe\xc7\x1c\x16\x15\x15\x16\x1c\x019\x03G\xfc\xf9\x03\a\x18!\x805KK5\x80\x805KK5\x80!\xa1\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xff\x00\x1a&&\x1a\x01\x00\x9f\xe1\xe1\x00\x06\x00\x00\xff\x00\b\x00\x06\x00\x00\x15\x00#\x00/\x00;\x00I\x00m\x00\x00\x012\x16\x14\x06+\x01\x03\x0e\x01#!\"&'\x03#\"&463\x01>\x01'\x03.\x01\x0e\x01\x17\x13\x1e\x013%\x114&\"\x06\x15\x11\x14\x1626%\x114&\"\x06\x15\x11\x14\x1626%\x136.\x01\x06\a\x03\x06\x16\x17326\x01\x03#\x13>\x01;\x01463!2\x16\x1532\x16\x17\x13#\x03.\x01+\x01\x14\x06#!\"&5#\"\x06\a\x805KK5\x0fs\bH.\xfb\x00.H\bs\x0f5KK5\x01e\x1a#\x02 \x02)4#\x02 \x02%\x19\x01\xa0&4&&4&\x01\x80&4&&4&\x01` \x02#4)\x02 \x02#\x1a\x05\x19%\xfb~]\x84e\x13\x8cZ\xa7&\x1a\x01\x80\x1a&\xa7Z\x8c\x13e\x84]\vE-\xa7&\x1a\xfe\x80\x1a&\xa7-E\x03\x00KjK\xfdj.<<.\x02\x96KjK\xfc\xe0\x02)\x1a\x01\xa0\x1a#\x04)\x1a\xfe`\x19\"@\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x15\x01\xa0\x1a)\x04#\x1a\xfe`\x1a)\x02\"\x04\xda\xfed\x01\xb9Xo\x1a&&\x1aoX\xfeG\x01\x9c,8\x1a&&\x1a8\x00\x02\x00!\xff\x80\x06\xdf\x05\x80\x00\x03\x00O\x00\x00\x01\x13#\x03\x01\a\x06#!\x03!2\x17\x16\x0f\x01\x06#!\x03\x06+\x01\"'&7\x13#\x03\x06+\x01\"'&7\x13!\"'&?\x0163!\x13!\"'&?\x0163!\x136;\x012\x17\x16\a\x033\x136;\x012\x17\x16\a\x03!2\x17\x16\x03\xdf@\xfe@\x03\xfe8\a\x18\xfe\xb9@\x017\x0f\n\n\x048\x05\x1a\xfe\xb9Q\a\x18\xe0\x10\n\t\x03N\xfeQ\a\x18\xe1\x0f\n\t\x03N\xfe\xc9\x0f\n\t\x038\a\x18\x01G@\xfe\xc9\x0f\n\n\x048\x05\x1a\x01GQ\a\x19\xe0\x0f\n\t\x03N\xfeQ\a\x19\xe0\x0f\n\t\x03N\x017\x0f\n\t\x02\x00\x01\x00\xff\x00\x01\xf8\xe0\x18\xff\x00\f\x0e\x0e\xe0\x18\xfe\xb8\x18\f\f\x10\x018\xfe\xb8\x18\f\f\x10\x018\f\f\x10\xe0\x18\x01\x00\f\x0e\x0e\xe0\x18\x01H\x18\f\f\x10\xfe\xc8\x01H\x18\f\f\x10\xfe\xc8\f\f\x00\x00\x00\x00\x04\x00k\xff\x00\x05\x95\x06\x00\x00\x02\x00\x05\x00\x11\x00%\x00\x00\x01\x17\a\x11\x17\a\x03\t\x03\x11\x03\a\t\x01\x17\x01\x00\x10\x02\x0e\x02\".\x02\x02\x10\x12>\x022\x1e\x02\x03I\x94\x95\x95\x94\x83\x01\xd0\xfe\xce\x012\xfe0\xff]\x01@\xfe\xc0]\x00\xff\x02\xcf@o\xaa\xc1\xf6\xc1\xaao@@o\xaa\xc1\xf6\xc1\xaao\x01㔕\x03\x8c\x95\x94\xfca\x01\xd0\x012\x012\x01\xd0\xfd\x9d\x00\xff]\xfe\xbf\xfe\xbf]\x00\xff\x01p\xfe^\xfe\xc7\xc9|11|\xc9\x019\x01\xa2\x019\xc9|11|\xc9\x00\x00\x00\x00\x03\x00(\xff\x00\x03\xd8\x06\x00\x00\x02\x00\x05\x00\x11\x00\x00%7'\x117'\x13\t\x01\x11\x01'\t\x017\x01\x11\x01\x02T\xad\xad\xad\xad \x01d\xfd\xe5\xfe\xd7l\x01t\xfe\x8cl\x01)\x02\x1bq\xac\xac\x01n\xac\xac\xfd\xf1\xfe\x9c\xfd\xe4\x02\xc7\xfe\xd8l\x01u\x01ul\xfe\xd8\x02\xc7\xfd\xe4\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00)\x001\x00\x00$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 \x13\x14\a\x01\x06+\x01\"&547\x016;\x012\x16\x04\x10\x06 &\x106 \x05\x00LhLLh\xfdLLhLLh\x04L\xe1\xfe\xc2\xe1\xe1\x01>\x81\r\xfb\xe0\x13 \xa0\x1a&\r\x04 \x13 \xa0\x1a&\xfd`\xe1\xfe\xc2\xe1\xe1\x01>\xcchLLhL\x03LhLLhL\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\x02\xc0\x14\x12\xfa\x80\x1a&\x1a\x14\x12\x05\x80\x1a&\xbb\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x05\x00\x03\xffG\x06\xfd\x05\xb9\x00\x06\x00\n\x00\x10\x00\x17\x00\x1d\x00\x00\x13\t\x01.\x017\x13)\x01\x011\x01\x13!\x1362\x01\x13\x16\x06\a\t\x011!\x1362\x17h\x03\x18\xfc\x9c\x12\x0e\ae\x01\xce\x02\x94\xfe\xb6\xfd\xf0\xc6\xfe2\xc6\b2\x050e\a\x0e\x12\xfc\x9c\x03\x18\xfe2\xc6\b2\b\x03>\xfc\t\x02v\r+\x15\x014\xfc\t\x06[\xfd\x9c\x02d\x17\xfd\x85\xfe\xcc\x15+\r\xfd\x8a\x03\xf7\x02d\x17\x17\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\xe0\x00\x03\x00\x0f\x00\x13\x001\x00\x00\x0135#\x015\x06\a\x06&'\x17\x1e\x0172\x01!5!\x05\x14\a\x16\x15\x14\x04#\"&'\x06\"'\x0e\x01#\"$547&54\x12$ \x04\x12\x01\x80\xa0\xa0\x03Eh\x8b\x87\xf9`\x01X\xf8\x94\x81\xfe(\x02\x80\xfd\x80\x04\x80cY\xfe\xfd\xb8z\xce:\x13L\x13:\xcez\xb8\xfe\xfdYc\xf0\x01\x9d\x01\xe6\x01\x9d\xf0\x02\xc0\xe0\xfd\xd4\\$\x02\x01_K`Pa\x01\x01}\xe0\xc0\xbb\xa5f\u007f\x9d\xdeiX\x01\x01Xiޝ\u007ff\xa5\xbb\xd1\x01a\xce\xce\xfe\x9f\x00\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00(\x00+\x00.\x00>\x00\x00\x01\x15#5\x13\x15#5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x114&+\x01\x01'\a\x01#\"\x06\x15\x11\x14\x163!26\x017!\x057!\x05\x11\x14\x06#!\"&5\x11463!2\x16\x02\x03\xfc\xfc\xfc\x03\xf2\xfe\xab\x01U\xfd`\x02\xa0\xfd`\x03'\f\b \xfe\x86\xd2\xd2\xfe\x86 \b\f\f\b\x04\xd8\b\f\xfc\xa9\xb9\xfej\x02\x8b\xdd\xfej\x02\xe2V>\xfb(>VV>\x04\xd8>V\x02q\x80\x80\x00\xff\u007f\u007f\xfe\x01\x80\x80\x01\x00\x80\x80\x00\xff\u007f\u007f\xfc\xa4\x04\xd8\b\f\xff\x00\xab\xab\x01\x00\f\b\xfb(\b\f\f\x04^\x96\x96\x96\x14\xfb(>VV>\x04\xd8>VV\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00=\x00\x00\x01&'&'&'&\x06\x1f\x01\x1e\x03\x17\x16\x17\x1e\x04\x17\x1676'&'&\x02\x01.\x05\x02' \f\x01\x1e\x03\x0e\x01\a\x06\x15\x01#\x01\x0e\x02.\x02\x03\x80h8\x8b\xd0\"$Y\n''>eX5,\t\x04,Pts\x93K\x99\x01\x0125\x1cM\xcc\xfeRLqS;:.K'\x01\x11\x01\xc1\x015\xe9\x8aR\x1e\x05\x0e\r\r\x01Ch\xfe\xe7\x16\x8bh\xac\x95\xba\x02\xd0\xc4R\xcat\x13\x11(\x10\x1e\x1f+e\x84^T\x11\bT\x8a\xaa\x82u B\x06\x03\"$\x15:\x012\xfe~<\x82\x9d\x98\xdc\xc6\x012\x88Hp\xb1\xa8\xe5\xaa\xe3wTT\x17\xfe\xb9\x01\x1d\x02\x18\x0e\x02 V\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00/\x007\x00G\x00W\x00g\x00\x00\x00.\x01\a\x04 %&\x0e\x01\x16\x17\x16\x17\x0e\x02\x0f\x01\x06\x16\x17\x1632?\x01673\x16\x1f\x01\x16327>\x01/\x01.\x02'676$4&\"\x06\x14\x162\x04\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x00 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05d\f-\x1a\xfe\xfb\xfe\xe8\xfe\xfb\x1a-\f\x1b\x1a\xc2m\x02\x1b\x1a\x1c\t\n\x16\x19\t\x0e,\x10\b6\x11*\x116\b\x10,\x0e\t\x19\x16\n\t\x1c\x1a\x1b\x02m\xc2\x1a\xfe\xb7KjKKj\x02\x8bo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbd\xfeK\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xcezz\xce\x01Ȏ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03U4\x1b\x06>>\x06\x1b4-\x06.\f\x9e\xdeYG\x15\x190\n\x04)\x14\x8bxx\x8b\x14)\x04\n0\x19\x15GYޞ\f.\x06\xa3jKKjKq\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\x01lz\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xce\xfe0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x03\x00D\xff\x00\x05\xbb\x06\x00\x00/\x007\x00H\x00\x00\x00\x16\a\x03\x0e\x01#\"'.\x017\x13\a\x16\x15\x14\a'654&#\"\a'67\x01'\a\x06.\x016?\x01>\x01\x17\x01\x16\x17\x16\x0f\x01%\x02\"&462\x16\x14\x0127\x17\x06#\".\x01547\x17\x06\x15\x14\x16\x05|D\x05,\x04=)\x06\x03,9\x03#\x8f7\x94\x89[͑\x86f\x89x\xa4\x01\b\x95\xb5!X:\x05 \xef\x1aD\x1e\x01\xe8$\f\x11+\xcd\x01s)\x94hh\x94i\xfc\xdajZ\x8b\x92\xbd\x94\xfb\x92t\x8b<\xcd\x02\xf6F/\xfd\xd9*8\x01\x03C,\x01\xad\bq\u007f\u061c\x89e\x86\x91\xce\\\x8ar\x1b\x01,W\xa1\x1e\x05BX\x1d\xd5\x17\a\x12\xfe\xe5\x15/C2\xe8\x14\x01\xa9h\x94hh\x94\xfa\xbe=\x8bt\x92\xfa\x94\xbc\x94\x8bXm\x91\xcd\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00N\x00Z\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x14\x0e\x02\a\x0e\x02\x1d\x01\x14\x06+\x01\"&=\x014>\x037>\x0154&#\"\a\x06\a\x06#\"/\x01.\x017632\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03p\x12\x0e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x00\x1e=+& \x1d\x17\x12\x0e\xa0\x0e\x12\x15\x1b3\x1f\x1d5,W48'\x1d3\t\x10\v\bl\n\x04\az\xe3\x81\xdb\xee\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01P\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\x01\xe22P:\x1e\x15\x12\x14\x1c\x0f \x0e\x12\x12\x0eD#;$#\x10\r\x19$\x1f*;\x1b\x14?\f\x06R\a\x1a\n\xc0\xb3\x01Cf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x04\x00'\xff\x03\x05Y\x06\x00\x00\t\x00>\x00O\x00`\x00\x00\x00\"&5462\x16\x15\x14\x01\x14\x06&'\x01.\x01\x0f\x01\x06\x1f\x01\x13\x03\x06\a\x06\a\x06'.\x0176\x1b\x01\a\x17\x16\x0e\x02\x0f\x01\x06.\x035\x03\x13632\x17\x01\x16\x1f\x01\a\x16\x05\x1e\x01\x1f\x01\x16\x17\x16\a\x06.\x01'#&'\x03\x01\x16\x15\x14\a\x06.\x01'&\x01\x166?\x0165\x01\xae\x80\\\\\x80[\x01\x8c(\t\x01\x06\x02|\x03\x93\x1f\x03\t\v\x14\x06r\xfe\xcb\x03\b\x03\x03\v\x04\xc9[A@[[@A\xfd#2#\x16\x17\x01\xb6\f\a\x02\x03\b\r\x8b\xfe\x9e\xfe7\xc0*\x1a\x06\x1a\x19\r<\x1b\x11\x02Y\x01\xa0\xa4\xde\x18$\x13\r\x01\x02\x03\f\x14\x18\x0f\x02\x01+\x01}\"(\xfd\xf7\x05\f\x03\x01\r\xa6q\xe087] F\x1b\x16\f \x13\x10\t\x01_\xfe\xad1\b\x05\x02\x05\v)\n\xac\x01\xe9\x01\x04\x02\x02\t\b\x00\x00\x00\a\x00\x03\x00\xe3\t\x00\x04\x1c\x00\x02\x00\v\x00#\x001\x00K\x00e\x00\u007f\x00\x00\x013\x03\x054&+\x01\x11326\x01\x13\x14\x06+\x01\"&=\x01!\a\x06#!\"&7\x0163!2\x16\x04\x10\x06#!\"&5\x11463!2\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x17\x01\xf8\xab\x01\x03Xe`64[l\xfd\xc2\x01\x13\x0e\xd8\x0e\x13\xfe\xdd7\n\x12\xfe\xf5\x15\x13\r\x02,\t\x12\x01L\x0e\x14\x03;\xfb\xc7\xfe\xf2\x0e\x14\x14\x0e\x01\f\xc8\x01\x98\x01\x0f\x1c=+3&9\x1a\x10\x01\x01\x01\x0e\x1a8&+)>\x1d\x11\x02\xb9\x01\x0f\x1c>+3&9\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x02\xb6\x01\x0f\x1c=+3&8\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x01\x02\x1e\x01\t\xa6Wj\xfe|r\x01\xca\xfd\f\x0e\x14\x14\x0e>Q\x0f$\x11\x02\xf5\x0e\x14\xc6\xfe~\xdc\x14\x0e\x02\xf4\x0e\x14\xfed\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x00\x04\x00\x00\xff\x00\x05\x80\x05\xf2\x00J\x00\\\x00m\x00\x82\x00\x00\x054.\x01'.\x02'&#\"\x06#\"'.\x03'&47>\x037632\x16327>\x027>\x0254&'&#\"\a\x0e\x03\a\x06\a\x0e\x01\x10\x16\x17\x16\x17\x16\x17\x16\x17\x16327>\x01\x13\"&47654'&462\x17\x16\x14\a\x06\x16\"'&476\x10'&462\x17\x16\x10\a\x16\"'&47>\x01\x10&'&462\x17\x16\x12\x10\x02\a\x02i\x1a$\x02\x01\b\t\t\x0f$\x17^\x18\"\r\x06\n\x05\b\x01%%\x01\b\x05\n\x06\r\"\x18^\x17$\x0f\t\t\b\x01\x02$\x1aW \x14\x19\"@9O?\x1d\x1f\x06\x031&&18\x1b?t\x03\x03@\"\x19\x14 W\x9f\x1a&\x13%%\x13&4\x13KK\x15\xb86\x12\x13\x13pp\x13&4\x13\x96\x96\xa36\x12\x13\x13ZaaZ\x13&4\x13mttm\x99\v^x\t\x04-\x1b\b\x0e\v\v\x05\x15\x13\x1d\x04\x80\xfe\x80\x04\x1d\x13\x15\x05\v\v\x0e\b\x1b-\x04\tx^\v\x16=\f\b\x12\x11/U7C\f\ak\xda\xfe\xf2\xdakz'[$\x01\x01\x12\b\f=\x03\xa7&5\x13%54'\x134&\x13K\xd4K\x13\xb5\x13\x134\x13r\x01\x027>\x0254\x00 \x00\x15\x14\x06\"&54>\x022\x1e\x02\x04\x14\x06\"&462%\x14\x06\"&54&#\"\x06\x15\x14\x06\"&546 \x16%\x16\x06\a\x06#\"&'&'.\x017>\x01\x17\x16\x05\x16\x06\a\x06#\"'&'.\x017>\x01\x17\x16\x80&4&&4\xe6&4&&4S\x01\x00Z\xff\x00\x01\xad&4&&4\x02\xe9\x174$#\x1f\x1d&\x0f\xe1\x9f\x1a&&\x1aj\x96\x173$\"('$\xfe\xf9\xfe\x8e\xfe\xf9&4&[\x9b\xd5\xea՛[\xfd\xfd&4&&4\x01F&4&\x83]\\\x84&4&\xce\x01$\xce\x01\x8a\n\x16\x19\t\x0e\x13!\aD\x9c\x15\b\x10\x114\x15\xb7\x01%\t\x15\x19\v\f,\x10\\\xcd\x16\a\x10\x104\x15\xeb\xa64&&4&\x9a4&&4&\x01-\xff\x00Z\x01\x00\x874&&4&\x01\x00;cX/)#&>B)\x9f\xe1&4&\x96j9aU0'.4a7\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1au՛[[\x9b\xd5\xdb4&&4&@\x1a&&\x1a]\x83\x83]\x1a&&\x1a\x92\xceΏ\x190\n\x04\x16\x13\xb2u\x104\x15\x15\b\x10\x89\x85\x190\n\x04)\xee\x9b\x104\x15\x16\a\x10\xaf\x00\x00\x00\x00\x04\x00\x03\xff\x00\b\xfd\x06\x00\x00\x11\x00#\x00g\x00\xb0\x00\x00\x01&'.\x01#\"\x06\x15\x14\x1f\x01\x1632676%4/\x01&#\"\x06\a\x06\a\x16\x17\x1e\x01326\x01\x0e\x01'&#\"\a2632\x16\x17\x16\x06\a\x06#2\x17\x1e\x01\a\x0e\x01+\x01&'%\a\x06#\"'\x03&6?\x01\x136\x1276\x1e\x01\x06\a\x06\a676\x16\x17\x16\x06\a\x06\a632\x17\x1e\x01%\x13\x16\x06\x0f\x01\x03\x06\x02\a\x06#\"'&6767\x06\a\x06#\"&'&6767\x06#\"'.\x017>\x01\x17\x16327\"\x06#\"&'&6763\"'.\x017>\x01;\x02\x16\x17\x057632\x04\b;\x19\x11>%5K$\n\"0%>\x11\x19\x02s$\n\"0%>\x11\x19;;\x19\x11>%5K\xfeV\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x10\x1c\xfe\xde\xef\x0e\x0f(\x11\xa0\v\x0e\x16є\x11\x95y\x1fO2\a\x1fF/{\x90(?\x04\x050(TK.5sg$\x1a\x03\xb1\xa0\v\x0e\x16є\x11\x95y\x1a#-\x1d\x19\a\x1fF/{\x90\x04\b$7\x04\x050(TK.5sg$\x1a\x12\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x01\x0e\x1c\x01#\xef\x0e\x0f(\x02@\x025\"'K58!\b\x1f'\"5\x828!\b\x1f'\"5\x02\x025\"'K\x01\x12#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a#\x01@\x171\rw\x01\v\x9b\x01\x11d\x19\a>N\x1a;ET\x11\x050((?\x04\n-\n2\x12K|\xfe\xc0\x171\rw\xfe\xf5\x9b\xfe\xefd\x16#\x1fN\x1a;ET\x11\x010$(?\x04\n-\n2\x12K$#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\x13\x00D\x00N\x00\\\x00\x00\x01\x14\x162654& \x06\x15\x14\x16265462\x16\x02\"\x0e\x02\x15\x14\x162654\x00 \x00\x15\x14\x0e\x01\a\x0e\x03\x15\x14\x06#\"\x06\x14\x1632654>\x027>\x0354.\x01\x01\x17\x01\x06\"/\x01&47\x01\x17\x16\x14\x0f\x03&'?\x0162\x04 &4&\xce\xfe\xdc\xce&4&\x84\xb8\x84h\xea՛[&4&\x01\a\x01r\x01\a$'(\"$3\x17\x96j\x1a&&\x1a\x9f\xe1\x0f&\x1d\x1f#$4\x17[\x9b\xfd\xc2\xe2\xfd\xbd\f\"\f\xa8\f\f\x06@\xa8\f\f\xe9\x1aGB\x81[\xcf\r\"\x02\xc0\x1a&&\x1a\x92\xceΒ\x1a&&\x1a]\x83\x83\x01\xe3[\x9b\xd5u\x1a&&\x1a\xb9\x01\a\xfe\xf9\xb97a4.'0Ua9j\x96&4&\xe1\x9f)B>&#)/Xc;u՛\xfd\x8c\xe2\xfd\xbd\f\f\xa8\f\"\f\x06\x06\xa8\f\"\r\xe9\x19G\x99i[\xcf\f\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00X\x00h\x00\x00\x01\x14\a\x0e\x01\a\x0e\x01\a\x06#\"&5467632\x16\x014&'&#\"\a'>\x0154#\"\a\x0e\x02\x15\x14\x1632\x14\a\x06\a\x0e\x01#\"54>\x0354'.\x01#\"\x0e\x01\x15\x14\x1632>\x017>\x01767632\x17\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03b\r\v)\n\x02\x05\v\x14\v:4FD\x1c\x17\x1c\x11\x01\xe6N\r\x15\r[\x87\x02\x031\xf2\x18,^\x95J\xa1\x93\x19\x01\x04\x16\x0eK-*\x15\x1d\x1e\x16\a\x18E\x1f#9\x19gWR\x92Y\x15\x06\x13\x05\x03\vvm0O\x01\x03\x05\t\xb8\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfd\x1bC2\xc82\v\x03\x01\x02c@X\xac&\x0e!\xfe9\x0e{\x05\bM\x02\x16\xe2A\xe9\x06\x11\x91\xbc_\x92\x9e\x06\x02\"S4b/\x18/ \x19\x0f\x01\x03\a\x16\x1dDR\"Xlj\x92P\x16Y\x16\f\x06<\x12\x01\t\x02\x0f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00%\xff\x00\x05\xda\x05\xff\x00\x19\x00e\x00\x00\x014.\x02#\"\a\x06\x02\x15\x14\x1e\x0232\x16>\x0276\x1276\x01\x14\x06#'.\x02#\"\a\x06\a\x0e\x01\a\x0e\x03#\"&54>\x0132\x16\x17\x14\x0e\x03\x15\x14\x1632>\x03754&*\x01\x06#\"&54>\x02763 \x11\x14\x02\a\x17>\x0132\x17\x1e\x01\x02\xe8\x04\r\x1d\x17''il\x11$E/\x04\x1c\f\x14\n\x02\x10@\x10\x13\x02\xf2\x0f\b\x06\x16P@\x1f\xa7\xb8\x0f\x06\n\x1d\b\x17^\x83\xb2`\x87\x9f'W6&\xa4\x01!.. ! -P5+\x16\x05\a\n\n\n\x01\xe3\xfaE{\xbdn46\x01vL\x05\x03e\xa3V\x16\x1f\x13z\x04\xcf\x18\x1d\x1f\x0f\x17:\xfe\xf7\x89,SN/\x01\x01\x05\f\nM\x015M[\xfd\xa7\a\r\x01\x03\x10\t]\b\x13$\x8b\x1f[\xb1\x98^\xa7\x885\x80iC\x1c\x01\x17'2H&!(?]v`*\t\x02\x03\x01\xf5\xe2l\xe2\u008d\x13\t\xfe\x98b\xfe\xa2$\x039>\r\a\xbf\x00\x03\x00\x01\xff\x00\x06\u007f\x05\xfb\x00=\x00R\x00\x87\x00\x00\x012\x1f\x01\x16\x1f\x01\x16\a\x03\x0e\x01\a\r\x01#\"&5467%!\"&7>\x013-\x01.\x017>\x01;\x01\x05%.\x017>\x0132\x17\x05\x172\x16326/\x01.\x0176\a\x17/\x02\x03.\x01'&676\x16\x1f\x01\x0e\x01\a\x06\x16\x01\x13\x16\x0f\x01\x06\x0f\x016/\x01&/\x01&#\"\a\x03&676\x16\x17\t\x01&676\x16\x17\x13\x03&676\x16\x17\x13\x17\x1e\x016/\x01&672\x16\x03? \x1b\xde=1\x92(\vH\x06/ \xfd\xf1\xfe\xa0\t'96&\x01\x04\xfe@)9\x02\x02<'\x01\xba\xfd\xf7)2\x06\x069%\n\x01\xe1\xfe\xa1&0\x06\x066#\x06\x0e\x01\xc0\xd9\x01\x04\x01\x17\x0f\x14\xba#\x0e\x19\x1b\x15\xba\xda\x05$\xee\x01\x03\x01\x18\v \x1fJ\x1b\x8e\x02\x06\x01 \x12\x03\xa5\x0f\x04\x0f0\f7j\x02)\x925@\xde\"*3%\xeb\x19\x0e\"!M\x18\x01\n\xfe\xfa\x15\x15%#K\x14\xf1\x88\x0f\x15\"%N\x11\xc1e\b\x1e\x18\x01\f\x028)'8\x03_\x12\x94(9\xaa.<\xfec +\x048 8(%6\x05 <)'4\x01@\x05@)#-<^\n?%$-\x02`%\x01.\r}\x17Q!&\xca}%\x02&\x01\x06\x01\x05\x01\x1fN\x19\x17\v\x1c\x93\x01\x05\x02-l\x01\xa7\xfe\xf6IJ\xdb;\x1c6>/\xaa=*\x94\x17%\x018!Q\x17\x16\x10 \xfe\xa0\x01\xc7#P\x13\x12\x18\"\xfe\\\x01Q#N\x11\x13\x1a&\xfea\xc4\x0f\x05\x14\x10\xe0)<\x019\x00\x00\x04\x00\x00\xff\x1e\a\x00\x05b\x00R\x00]\x00m\x00p\x00\x00%\"'.\x01'&54>\x0676%&547632\x1f\x0163 \x00\x17\x16\x14\a\x0e\x01\a\x16\x15\x14\a\x06#\"/\x02\x017\x06\a\x16\x1a\x01\x15\x14\a\x06#\"'\x01\x06\a\x16\x00\x15\x14#\"&/\x01\x03\x06\a\x1e\x01\x17\x13\x14%\x17$\x13\x02%\x1e\x01\x15\x14\x06\x00\x14\x1632\x16\x15\x14\x162654&#\"%'\x17\x01O\x02\x04V\xa59\x15\x04\x04\n\a\x0e\x06\x12\x02\xb8\x01\fn\x11t\f\x12\n|\\d\x01\n\x01ϓ\x14\x14[\xff\x97n\x11t\v\x13\n|@\xfeD\a:)\x03\xf8\xee\t\r;9\x03\xfe8'+\x18\x01|\v\x0e\x89\x04j\xe0,\"\x02 \a\xb0\x0341\x01\x11\xb1\xb4\xfe\xe9CH^\xfen\x1c\x14Vz\x1c(\x1c\xb2~\x14\x01R\t\a\xb4\x029\xb0\\\x1e'\t\x14\x10\x14\f\x16\b\x17\x03\xfbr\xc6\r\x13\n@\x10\xe5\x13\xfe\xed\xe8\x1fL\x1f\x8e\xdf@\xc6\r\x14\t@\x10\xe5w\x034\a\x18\x17\x05\xfe6\xfeH\x03\a\x02\x03\a\x03I\x1c(+\xfdC\x04\n,\x06\xc5\x01\x9d55\x03,\f\xfe\xb9\nf[o\x01\x12\x01\x15p@\xa9\\j\xbd\x02;(\x1czV\x14\x1c\x1c\x14~\xb2\x11\x04\a\x00\x00\x00\x00\x04\x00\x00\xff\x97\x04\xfe\x05i\x00\x1f\x00/\x005\x00O\x00\x00\x01\x14\a\x06#\"'&54>\x0132\x17\x06\a&#\"\x06\x15\x14\x16 654'67\x16'\x14\x02\x0f\x01\"'>\x0454'\x16'\x15&'\x1e\x01\x13\"'6767\x0e\x01\a&546767>\x017\x16\x15\x14\a\x0e\x01\x04\x1a\x93\x94\xe6蒓\x88\xf2\x93`V \aBM\xa7\xe3\xe1\x01R\xe0 B9)̟\x9f\x0e\x1d!S\u007fH-\x0f\x0377I\x85Xm\xfdSM\xdaH\x13\x02*\xc3k#\"\x1a.o;^\x1bJ\x18 q\x01\xaeן\xa1\xa1\x9fד\xf7\x92\x1f>@\x1c\xf6\xa8\xaa\xed\xed\xaaYM\r$bK\xc0\xfe\xced\x01\x05 \x8d\xa8ү[E\"\xa0\xa2\x02\xd6\xe2;\xff\xfe\xb9Kx\u007f%\x13^\x91\x196;%T\x1a,\x1e\x10U:i\x94m=Mk\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1a\x00)\x00.\x00D\x00T\x00\x00\x014'\x06\a\x16\x15\x14\x06\"&54632\x1767&#\"\x06\x10\x16 6\x03\x16\x15\x14\x0e\x03\a\x16;\x016\x114'.\x01'\x16\x054'\x06\a\x0e\x01\x15\x14\x17>\x017\x0e\x01\a\x1632676%\x11\x14\x06#!\"&5\x11463!2\x16\x04\x1a\x1c),\x16\x9a蛜s5-\x04\x17\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xff\x16Cf\x1d\a'/'%\x14\f(\v\x04\b\x05\x11$\x86U\xc7L\x11\x05\x04\n\f(\n\x15#'/'\a@\x86\x16\x89\x02\b\x0f\x10\f3\x0e#@,G)+H+@#\x0e3\r\x10\x0e\b\x02\x89\x01\x01\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x84\x16\x05\x0fX@\x13\x06\x0f\x16\f\x1d\x16\x13\x19\x10\x02_\x13O#NW\xa5#O\x13_\x02\x0f\x18\x14\x15\x1d\f\x16\x0f\x06\x13\x8a\x1d\x05\x16.\x16\x05*\x13\t\x1e#\x1e\x1e#\x1e\b\x14(\x05\x16\x01\xfb\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x0f\xff\x80\x06q\x05\x80\x00[\x00\x00\x016\x16\x17\x16\x15\x14\a\x1632632\x16\x15\x14\x0e\x02\x15\x14\x17\x1e\x01\x17\x16\x17\x16\x15\x14\a\x0e\x02#\"&#\"\a\x0e\x04#\".\x03'&#\"\x06#\".\x01'&54767>\x017654.\x0254632\x16327&547>\x01\x03P\x86\xd59\x1b\t\x0e\x0e\x12B\x12\x1d6?K?\f%\x83O\x1c4\x1c\xdb\a\b\x14\x17\x14T\x16%\x19 >6>Z64Y=6>\x1f\x1a%\x18S\x11\x19\x14\b\a\xdb\x1c4\x1cN\x85$\f?L?4\x1d\x0fB\x14\x12\x0e\t\x1b@\xd8\x05\x80\x01\x8b{:y/\x90\a\x1b$\x1c ,\x13'\x1c\x0f\x1cR\x88!\f\v\x06\x1dF!\v8%\r\x05\x05#)(\x1b\x1b()#\x05\x05\x0f%:\v!F\x1d\x06\v\f \x8aQ\x1c\x0f\x1c'\x14+\x1f\x1b%\x1a\a\x8e0z:\x89z\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00O\x00_\x00\x00\x014'.\x01'&54>\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x16Cf\x1d\a'.'%\x14\v(\f\x04\b\x05\x11$\x85V\xc6M\x12\x06\n\x05\v)\n\x14#'.'\a@\x86\x16\x8a\x02\b\x0e\x10\r3\r#A,G)+H+A#\r4\r\x0f\x0f\b\x01\x8a\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x84\x16\x05\x0eXA\x0e\v\x0f\x16\f\x1d\x16\x13\x19\x10\x02?4N$NW\xa5&M&L\x02\x10\x19\x14\x15\x1d\f\x16\x0f\v\x0e\x8a\x1d\x05\x16/\x16\x05*\x13\n\x1e#\x1e\x1e#\x1e\t\x13+\x03\x16\x03\v\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00\x00\xff\x80\t\x00\x06\x00\x00O\x00\x00\x01\x0e\x05\a\x0e\x01\a\x0e\x03\a\x06\a$\x05\x06\a>\x01?\x01>\x0376\x052\x17\x1e\x01\a\x03\x06'&#\"\x04\a\x06.\x02/\x01454327\x12\x0032\x1e\x05\x177>\x047>\x03\t\x00EpB5\x16\x16\x03\n3\x17\x0fFAP\b/h\xfe\xab\xfe\xdf\\\xd3/N\x10\x0fG\xb8S\x85L\xba\x01\x17\x01\t\v\x06\x06\xc2\x0f \x80\xe2\x92\xfe\x00\x88R\x86P*\f\x01\x06\x8a\xe9\xc0\x01m\xc9\x05\x1395F84\x0ef\x02&3Ga4B|wB\x06\x00.\\FI*/\x06\x12\xed.\x1d?&,\x06\x1f\xc8\x0e\xac5~\x10\x1e\a\a\x1bK %\r\x1f&\x03\x06\x16\v\xfe\xa7\x1d\a\x18Y\x02\x01\x1c.\"\x11\x01\x01\x01\x067\x01n\x01<\x01\t\x0f\"-I.\xb1\x04M`{\x90ARwJ!\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00F\x00X\x00^\x00d\x00j\x00\x00\x01\x14\a'\x17\x06\a'\x17\x06\a'\x17\x06\a'\x17\x06\"'7\a&'7\a&'7\a&'7\a&547\x17'67\x17'67\x17'67\x17'632\x17\a7\x16\x17\a7\x16\x17\a7\x16\x17\a7\x16\x174\x02$#\"\x0e\x02\x15\x14\x1e\x0232$\x12\x13\x11\t\x01\x11\x01\x11\x01\x11\t\x01\x11\x01\x11\t\x01\x11\x01\x05*\x05\xec\xe0\x13'ֱ,?\x9dg=OO\x0e&L&\x0eNJBg\x9d;1\xb2\xd6'\x13\xe0\xed\x05\x05\xee\xe1\x13'ֱ.=\x9egCIM\r$'&&\x0eNJBg\x9e=.\xb1\xd5%\x15\xe0\xed\x05\x1e\x9d\xfe\xf3\x9ew\u061d\\\\\x9d\xd8w\x9e\x01\r\x9dI\xfdo\xfdo\x02\x91\x02\xc4\xfd<\xfd<\x05\xc4\xfd\x00\xfd\x00\x03\x00\x02\x80-\x1f\x0eNIDg\x9e=/\xb2\xd7%\x16\xe4\xf0\x06\x06\xee\xe2\x13(ײ+A\x9ehEHO\x0e*\"#*\x0eOICh\x9f=/\xb2\xd7'\x13\xe0\xec\x06\x06\xed\xe1\x13(ֲ/=\x9fh>ON\x0e\x1f.\xa0\x01\x0f\x9d]\x9d\xdaxwڝ]\x9d\x01\x0f\x02\x1e\xfd\x02\xfe\x81\x01\u007f\x02\xfe\x01\u007f\xf9\xcb\x01\x9c\x037\x01\x9b\xfee\xfc\xc9\x03[\xfc\x80\xfe@\x01\xc0\x03\x80\x01\xc0\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x14\x00)\x006\x00\x00\x01!\a!\"\x06\x15\x11\x14\x16\x17\x163\x15#\"&5\x1146%3\x01\x0e\x06\a567654'\x013\x13\x01\x11!67!\x114&'7\x1e\x01\x01S\x02\xb3\x1a\xfdgn\x9dy]\x17K-\x8c\xc7\xc7\x03\xdf\xf7\xfe\x1e\x17#75LSl>\xa39\x14\x14\xfe\xe3\xe4\xbb\x03V\xfc\xe5%\b\x02\xa6cP\x19e}\x05&H\x9en\xfc\xfd_\x95\x13\x05HȌ\x03\x03\x8c\xc8\xda\xfa\xf2=UoLQ1!\x02\xc3\x1a\x9c4564\x02\xdd\xfd\xb7\x01\xf2\xfb\xa97\x12\x04\x0eU\x8c\x1dC\"\xb3\x00\x00\x00\x00\n\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x14\x00!\x00-\x009\x00[\x00n\x00x\x00\x90\x00\xe7\x00\x00\x00\x14\x06\"&462\x0354&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x1626754&\"\x06\x1d\x01\x14\x1626\x01\x06\x04#\".\x02547\x06\x15\x14\x12\x17632\x17632\x1762\x17632\x16\x176\x12'4#\"\a\x06#\"547\x06\x15\x14\x163276\x014&\"\x06\x15\x14\x1626\x014.\x01#\"\x06\a\x06\x15\x14\x16327632\x16\x15\x14\a>\x01\x05\x14\x02\a\x06\x04\x0f\x01\x15\x14\x06#\"'\x06\"'\x06#\"'\x06#\"&5\x06#\"'67&'\x16327&'&54>\x0332\x1767>\x017>\x027>\x0132\x17632\x17\x16\x15\x14\x0e\x02\a\x1e\x01\x15\x14\a\x16\x17632\x17\x16\x03T\"8\"\"8\x82)<()\x1d\x1e)\xac(<))\x1e\x1d)\xae)<))<)\xae)<))<)\x01\fT\xfeد{ՐR\x15h\x82x\x1e=8\x1e 78\x1e n \x1e8\x1c1\rp\x82\x8eH\x11\x1e_6\xe2\x1eS\xb2\x92oc\r\xfeF@b@?d?\x02uK\x97bM\x9070[f5Y$\x1135\x04KU\x01\x17C<:\xfe\xee[\x04;+8\x1e n \x1e87 \x1e8/8Zlv]64qE 'YK\xc00\x18\x12-AlB;\x16\x13\x17\x02\x14\x03\n\x1a\x18\x10W\xf9\x88#\x1b;WS9\x05\f\r\x13\x01\x11&\x10\x9d(\x19#-7Z\x04\xe8://:/\xfaTr\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x02ʠ\xc7g\xab\xe0xXV\xafע\xfe\xd4e9222222\x1f\x19^\x01\x13\xb3K\x06\x13\xf3Vv\u007f\x94\x96\xddF0\x02\xb22OO23OO\xfe\xe0`\xa6lF;\x9fmhj\x13\x0684\x1a\x14D\xc3ro\xfe\xebB@\x9d\x1a\x01r+@222222C0DP\x01\x13\x1f`\a.\xc0r8h9\x89\x9c~T4\x1d\x19\x03\x14\x06\x0f.&\x14o\x84\x04@9\x05\a\x05\x11\x0f\x13\x01\x06\x18\f\x06\x13\x8a\xf0\x1e1P\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x014'!\x153\x0e\x01#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x95\x06\xfe\x96\xd9\f}Pc\x8c\x8cc]\x0132\x16\x06\x001\xae\xa4I\xfe\xe3U\xa4Π?L\x80\xb6\x80L?\xbe\x99cc\x0e\xc34MX\v\x8a\x14\x1a&\x04\x00\xfc\xb90\x0e4;0\xfe\xae\x05X\x19pD[\x80\x80[Dp\x19D,\x0f\x02)\x12\x02&&\x00\x00\x05\x00\x00\xffQ\t\x00\x05\x00\x00\x05\x009\x00V\x00\\\x00\x94\x00\x00\x1226&\"\x06\x05.\x05'\a\x06&'&6?\x01.\x02\x06#\"\x0f\x01#\x1126\x1e\x03\x17\x01\x16327\x1667\x167>\x01'\x1632>\x01&\x173\x11#'&+\x01\"\x0f\x01\x06\x14\x17\x1e\x01?\x016\x1e\x01\a\x1e\x01\x17\x1e\x01\x17\x16\x0426&\"\x06\x01\x11\x14\x06#!\x0e\x01\a\x0e\x01\a\x0e\x01'\x0e\x01.\x01'\x01!\"&5\x11463!>\x06;\x012\x176;\x012\x1e\x06\x17!2\x16\x98P P \x06\t\n9\x1a2#.\x16}S\xfbP9\x01:\xb1\x16:%L\v\\B\x9e\x9b\x05 \f\x1b\x0e\x15\b\x01)spN/9o\x11J5\x14 \x02\n!+D\x1f\a\x84`]\x9dBg\xa7Y9\xd1\x1c\x1b+\x86,\xc1\x199%\n\x10P\x14\x1dk\v4\x01\x00P P \x01\b&\x1a\xfeN\x1bnF!_7*}B<\x84{o0\xfe\xe1\xfe\x9a\x1a&&\x1a\x01\xa5\x0eB\x1d;*<@$ucRRc\xa7#@16#3\x1b7\x0e\x01c\x1a&\x01\x80@@@\x06\rJ\"@*4\x17\x8c^\x04`E\xb2D\xce\v\v\x01\x02B\x9e\xfd\xe0\x01\x01\x03\x06\v\b\xfe\xdco/\x1489\x062\x127\x17\n*@O\x18\x02\x00\xb4LC\xf3!T!3\x022\xda\x17\x033\x1f\x13X\x18$\x8b\x0fBJ@@@\x02\x00\xfd\x80\x1a&AS\n0C\f59\x04\"\v'D/\x01\x1a&\x1a\x02\xa0\x1a&\x0eD\x1c4\x17\x1c\v88\f\x11$\x1a5\x1fA\x10&\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00%\x00O\x00\x00\x01\x11\x14\x06#!\"&5\x1147>\x067>\x032\x1e\x02\x17\x1e\x06\x17\x16\x01$7>\x01/\x01.\x01\a\x06\a\x0e\x03\".\x02'&'&\x06\x0f\x01\x06\x16\x17\x16\x05\x1e\x042>\x03\a\x00^B\xfa@B^\v\b>\x15FFz\xa5n\x05_0P:P2\\\x06n\xa5zFF\x15>\b\v\xfd\xcc\x01\aR\v\x03\b&\b\x1a\v\xe7p\x05^1P:P1^\x05\xba\x9d\v\x1a\b&\b\x03\vR\x01\a\nP2NMJMQ0R\x03r\xfc.B^^B\x03\xd2\x0f\t\a7\x11:5]yP\x04H!%%\"F\x05Py]5:\x117\a\t\xfd\xa8\xbf=\b\x19\v4\v\x03\b\xa9Q\x03H!%%!H\x03\x86t\b\x03\v4\v\x19\b=\xbf\b<\"-\x16\x16/ ?\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x001\x00P\x00p\x00\x00\x01\x17\x16\x06\a\x0e\x02\a\x0e\x03+\x02\".\x02'.\x02'.\x01?\x01>\x01\x17\x16\x17\x1e\x03;\x022>\x027$76\x16\x13\x11&'&%.\x03+\x02\"\x0e\x02\a\x0e\x02\a\x06\a\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11476\x007>\x03;\x022\x1e\x02\x17\x1e\x02\x17\x16\x05\xc2'\b\x03\n+\xa7~\x04'*OJ%\x01\x01%JN,&\x05x\xa7'\v\x03\b%\b\x1b\v^\xd4\x05M,E\x18\x01\x01\x18E,M\x05\x01\x027\v\x1a\xc6ZE[\xfe\xd6\x03P*F\x18\x01\x01\x18F*P\x03\xd7\xc9:5\x0e\a\x13\r\x05\xc0\r\x13\x80^B\xfa@B^){\x01\xc6\x06$.MK%\x01\x01%KM.$+\xe2\xe2X)\x02o3\v\x19\b\"\x81a\x03 2\x17\x172!\x1f\x04]\x81\x1e\b\x19\v4\v\x04\tI\xa3\x04>\x1f\"\"\x1f>\x04\xc6,\b\x03\xfd&\x03\xa0S8J\xe6\x02B\x1e##\x1eB\x02\xa6\x9f12\f\a\xfc`\r\x13\x13\x03\xad\xfc`B^^B\x03\xa08&r\x01a\x05\x1e#1\x18\x181#\x1e$\xac\xb6R&\x00\x00\x00\x00\v\x00\x15\xff\x00\x05\xeb\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x1a\x00\x1e\x00\"\x00&\x00.\x002\x00v\x00\x00%\x17/\x01\x01%'\x05\x01\x17\x03'\x01%\x03\x05\x01\x17/\x01\x14\x16\x06\x0f\x01\x17\x16\x01\x05\x03%\x017\a\x17\x01%\x03\x05\x017'\a\x17\x16\x0f\x01%7\x0f\x02'\a\x14\x0f\x01\x06/\x01\x17\x14\a\x05\x06#&5'&\x03&?\x01&'\x03&?\x01&'\x03&7%2\x17\x05\x16\x15\x13\x14\x0f\x01\x17\x16\x15\x1776\x1f\x0174?\x016\x1f\x01\x1e\x01\x0e\x01\x15\x14\x0f\x01\x06\x01J\xca\"\xd8\x01\x12\x01\x12\v\xfe\xd4\xfe\xee\xe30\xf5\x01<\x01=\x0e\xfe\xa0\x01\x8d_\x02g\x02\x02\x04NU\a\xfd?\x01\x00D\xfe\xe9\x04f\x0f\xe6\x02\xfd\xe1\x01u\x13\xfeY\x03\x9a\x14\xe2\x02\x90\x06\x02\a\x01\x02\x1e\xb3\x14\x13G\b\x04\xea\a\ab\a\x04\xfe\xdb\x04\x02\b\xe4\x047\x02\a=^\x01H\x02\b^\x85\x02`\x02\t\x01\xb1\x05\x03\x01=\x06\x14\x06v~\x05\x05y\x05\x06T\x03\x05\xce\x06\x05\xf5\x04\x02\x0f\x14\x04\xbf\x06\x01\xd6\xec\xd5\xfe3\xda\xf5\xd7\x01\x86\xd5\x01G\xcc\xfd\xe2\xd6\x01D\xc8\xfe\xa3P\xefO\x01\x0f\t\x034F\x06\x02\x9e\xc8\x01ѭ\xfb\xb3\xea\xa4\xf0\x02q\xc2\x01\xb9\xa3\xfc\xbb\xe9\x8ei_\x04\x05w\\ހ\xe4!1u\x05\x03\xbb\x05\x05S\xa1\x05\x03\xea\x02\x02\x01\xf2\x04\x01\x11\a\x04%V\x06\x01_\a\x05-d\b\x01\xd2\n\x03\x87\x01\x99\x04\x05\xfe1\a\x03=U\x02\x06{J\x04\x048n\x06\x03~\x03\x03\x87\x04\x06r\x87\x03\x05\x02\x99\x05\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x1d\x00'\x00U\x00\x00\x014.\x03#\x0e\x04\".\x03'\"\x0e\x03\x15\x14\x163!26\x034&\"\x06\x15\x14\x1626\x01\x15\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x04\xb1\v\x1f0P3\x067\x1e3/./3\x1e7\x063P0\x1f\vT=\x02@=T\xad\x99֙\x99֙\x02|\x12\x0e`^B\xfb@B^^B\x04\xc0B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e``\x0e\x12\x01*9deG-\x04!\x10\x18\n\n\x18\x10!\x04-Ged9Iaa\x02\x9bl\x98\x98lk\x98\x98\xfeO\xc0\x0e\x12\xe0B^^B\x05\xc0B^^B\xe0\x12\x0e\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x80\x12\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\t\x00+\x00Y\x00i\x00\x00\x01\x14\x06\"&5462\x16\x032\x1e\x04\x15\x14\x06#!\"&54>\x03;\x01\x1e\x052>\x04\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x15\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x04\x04\x99֙\x99֙0.I/ \x10\aOB\xfd\xc0BO\t\x1c-Q5\x05\a2\x15-\x1d)&)\x1d-\x152\x02\xb3\x13\r``\r\x13\x13\r``\r\x13\x13\r`^B\xfb@B^^B\x04\xc0B^`\r\x13\xff\x00\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x03|k\x98\x98kl\x98\x98\xfe\xb8\"=IYL)CggC0[jM4\x04\x1f\v\x17\t\t\t\t\x17\v\x1f\x01\x04\r\x13\x80\x13\r\xc0\r\x13\x80\x13\r\xc0\r\x13\xe0B^^B\x05\xc0B^^B\xe0\x13\r\xfb@\x05\xc0\r\x13\x13\r\xfa@\r\x13\x13\x00\x00\x06\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x00\x004.\x02#\x0e\x04\".\x03'\"\x0e\x02\x14\x163!2\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!54&+\x01\"\x06\x1d\x01!54&+\x01\"\x06\x1d\x01!\"&5\x11463!2\x16\x04\x00\x12)P9\x060\x1b,***,\x1b0\x069P)\x12J6\x02\x006S\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\x00^B\xfe\xa0\x12\x0e@\x0e\x12\xfd\x00\x12\x0e@\x0e\x12\xfe\xa0B^^B\x06\xc0B^\x01U\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049ck\x80U\x02?\xbc\x85\x85\xbc\x85\xfe\xe6@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x128\x0f\x15\x15\x0f8\x0f\x15\x15\x01\v@\x0e\x12\x12\x0e@\x0e\x12\x12\x01N\xfb@B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`^B\x04\xc0B^^\x00\x00\a\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x85\x00\x00\x00\x14\x06#!\"&4>\x023\x1e\x042>\x0372\x1e\x01\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x01!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00J6\xfe\x006J\x12)P9\x060\x1b,***,\x1b0\x069P)\x8b\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x80\x13\r\xf9@\r\x13\x13\r\x01`\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x01`\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01ՀUU\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049c\x01\xbb\xbc\x85\x85\xbc\x85\xfd`@\x0e\x12\x12\x0e@\x0e\x12\x12\xee8\x0f\x15\x15\x0f8\x0f\x15\x15\xf5@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc2\x04\xc0\r\x13\x13\r\xfb@\r\x13`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00(\x00\x00%.\x01'\x0e\x01\"&'\x0e\x01\a\x16\x04 $\x02\x10& \x06\x10\x16 \x00\x10\x02\x06\x04#\"$&\x02\x10\x126$ \x04\x16\x05\xf3\x16\x83wC\xb9ιCw\x83\x16j\x01J\x01~\x01J\x89\xe1\xfe\xc2\xe1\xe1\x01>\x02\xe1\x8e\xef\xfe\xb4\xb7\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0ś\xcd\x10JSSJ\x10͛\x96\xaf\xaf\x02\xb2\x01>\xe1\xe1\xfe\xc2\xe1\x016\xfe\x94\xfe\xb5\xf1\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00$\x00,\x00\x00\x00 \x04\x16\x12\x15\x14\x02\x06\x04 $&\x02\x10\x126\x01654\x02&$ \x04\x06\x02\x15\x14\x17\x123\x16 72&\x10& \x06\x10\x16 \x02\xca\x01l\x01L\xf0\x8e\x8d\xf0\xfe\xb4\xfe\x92\xfe\xb4\uf38e\xf0\x04m\x95z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\x95B\xf0\x83\x01l\x83\xf0\xa9\xe1\xfe\xc2\xe1\xe1\x01>\x06\x00\x8e\xf0\xfe\xb4\xb6\xb5\xfe\xb4\xf0\x8f\x8e\xf1\x01K\x01l\x01L\xf0\xfbG\xcd\xfa\x9c\x01\x1c\xcezz\xce\xfe\xe4\x9c\xfa\xcd\x01G\x80\x80\xa1\x01>\xe1\xe1\xfe\xc2\xe1\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x1f\x00'\x007\x00\x00\x01\x1e\x04\x15\x14\x06#!\"&54>\x037&54>\x022\x1e\x02\x15\x14\x00 \x06\x10\x16 6\x10\x132654\x02'\x06 '\x06\x02\x15\x14\x163\x04\xb1/U]B,ȍ\xfc\xaa\x8d\xc8,B]U/OQ\x8a\xbdн\x8aQ\xfe\x9f\xfe\xc2\xe1\xe1\x01>\xe1+X}\x9d\x93\x91\xfe\x82\x91\x93\x9d}X\x02\xf0\x0e0b\x85Ӄ\x9a\xdbۚ\x83Ӆb0\x0e}\x93h\xbd\x8aQQ\x8a\xbdh\x93\x02\x13\xe1\xfe\xc2\xe1\xe1\x01>\xfa\xe1\x8ff\xef\x01\x14\a\u007f\u007f\a\xfe\xec\xeff\x8f\x00\x00\x00\x00\x04\x00\x00\xff\x00\x05\x00\x06\x00\x00\x11\x00\x19\x00#\x00=\x00\x00\x00\x14\x06#!\"&4>\x023\x16272\x1e\x01\x02\x14\x06\"&462\x01\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!\x15\x14\x16;\x0126=\x01!2\x16\x04\x00J6\xfe\x006J\x12)Q8P\xd8P8Q)\x88\x87\xbe\x87\x87\xbe\x01\xa1\xfc\x00\x13\r\x03\xc0\r\x13\x80^B\xfc@B^^B\x01`\x12\x0e\xc0\x0e\x12\x01`B^\x01V\x80VV\x80ld9KK9d\x01\xb9\xbc\x85\x85\xbc\x85\xfb\xa0\x05`\xfa\xa0\r\x13\x13\x05\xcd\xfa@B^^B\x05\xc0B^`\x0e\x12\x12\x0e`^\x00\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x014.\x02#\x06\"'\"\x0e\x02\x15\x14\x163!26\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01!54&#!\"\x06\x15!\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80\x0f\"D/@\xb8@/D\"\x0f?,\x01\xaa,?\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xf9\x80\a\x00\x12\x0e\xf9@\x0e\x12\a\x80^B\xf9@B^^B\x06\xc0B^\x01D6]W2@@2W]67MM\x01\xa3\xa0pp\xa0p\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01n`\x0e\x12\x12\x0e\xfb@B^^B\x04\xc0B^^\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x01\x14\x06#!\"&54>\x023\x16272\x1e\x02\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16%\x15\x14\x06#!\"&=\x01463!2\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80?,\xfeV,?\x0f\"D/@\xb8@/D\"\x0f\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x80\xf9\x00\x13\r\x06\xc0\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01D7MM76]W2@@2W]\x01֠pp\xa0p\xfd\xa0@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\xb2\x04`\xfb\xa0\r\x13\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x1d\xff\x00\x06\xe2\x06\x00\x00\x1a\x00A\x00\x00\x01\x10\x02#\"\x02\x11\x10\x12327.\x04#\"\a'632\x16\x176\x013\x16\x0e\x03#\".\x02'\x06#\"$&\x0254\x126$32\x1e\x03\x15\x14\x02\a\x1e\x01326\x04\xe7\xd2\xe1\xde\xd0\xd0\xdeJ9\x16\"65I).!1i\xab\x84\xa7CC\x01\x86u\x03\n+I\x8d\\Gw\\B!al\x96\xfe\xe3݇\x87\xde\x01\x1d\x95y\xebǙV\xa1\x8a/]:=B\x02\xed\x01>\x019\xfe\xc6\xfe\xc3\xfe\xc4\xfe\xc9\x11+\x0132\x16\x15\x14\a\x06\a\x06\x15\x10\x17\x16\x17\x1e\x04%\x14\x06#!\"&5463!2\x16\x03\x14\a\x0e\x01\a\x06#\"&54>\x0254'&#\"\x15\x14\x16\x15\x14\x06#\"54654'.\x01#\"\x0e\x01\x15\x14\x16\x15\x14\x0e\x03\x15\x14\x17\x16\x17\x16\x17\x16\x15\x14#\"'.\x0154>\x0354'&'&5432\x17\x1e\x04\x17\x14\x1e\x0532654&432\x17\x1e\x01\x05\x10\a\x0e\x03#\"&54>\x0176\x114&'&'.\x0554632\x17\x16\x12\x17\x16\x01\xc5 \x15\x01\f?c\xe1\xd5'p&\x13 ?b1w{2V\x02\x19\x0e\x14\t\x05?#\x1d\xfb\xc7\x1a&#\x1d\x049\x1a&\xd7C\x19Y'\x10\v\a\x10&.&#\x1d\x11\x03\x0f+\x17B\x03\n\r:\x16\x05\x04\x03 &65&*\x1d2\x10\x01\x01\x12\x06\x1bw\x981GF1\x19\x1d\x1b\x13)2<)<'\x1c\x10\b\x06\x03\b\n\f\x11\n\x17\x1c(\n\x1bBH=\x02ӊ\x13:NT \x10\x1e:O\t\xb7)4:i\x02\x16\v\x13\v\b \x13F~b`\f\x02e\x15!\x03\x0f}\x01\x1c\x01\x88\x01U\x01\x113i\x1b\x13\x1b?fR\xc7\xfa\xfe\xe7\xd2UX\x03\x1a\x10\x19\x16|\x1d'&\x1a\x1d'&\x02I\x86c&Q\x14\n\f\x06\t*2U.L6*\x05\f/\r\x16\x1aL\x0f:\x0f\x19\x15\x199\x01\x04\x04\x020\x1e%>..>%b>+\x14\x05\x05\x02\x03\x10\v+\xc1z7ymlw45)0\x10\t\f\x14\x1d\x1333J@0\x01!\x11!\x15\x16\v\x1c\x17\x19T\x14FL\xa0\x87\xfe\xee\xe5 P]=\x1f\x10\x0fGS\v\xe6\x01-\x83\xd0kwm\x03\x15\f\x17\x11\x14\t\x13!\xa9\x83\xfe\xe4\xac*\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x18\x00(\x00\x00%\x136&\a\x01\x0e\x01\x16\x1f\x01\x016\x17\x16\a\x019\x01\a2?\x01\x17\x16\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\xa5\x93\t' \xfc\xa0\x1d\x15\x10\x18\xdd\x02\x01\x15\v\a\v\xfea\x10\x17\x16l\xe0@\x02l\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xe5\x02\xb5,&\f\xfe\xb3\v\x1c\x19\aE\x01C\x0e\b\x05\n\xfe\x89\xe4\x16h\xa5$\x02\x9b\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x06\x00\x00\xff\x00\x04\x00\x06\x00\x00\r\x00\x1f\x00/\x003\x007\x00;\x00\x00%\x14\x06\"&5467\x113\x11\x1e\x01\x174&'\x114&\"\x06\x15\x11\x0e\x01\x15\x14\x16 67\x14\x00 \x00547\x1146 \x16\x15\x11\x16\x13\x15#5\x13\x15#5\x13\x15#5\x02\x80p\xa0pF:\x80:F\x80D\x00F\x00N\x00V\x00^\x00f\x00n\x00v\x00~\x00\x86\x00\x8e\x00\x96\x00\x9e\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01.\x017&#\"\x06\x15\x11!\x114>\x0232\x16\x176\x16\x17762\x17\x022\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04462\x16\x14\x06\"$2\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4$2\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x05\x99\n\n\xfd\x8e\n\x1a\nR\n\n,H\x138Jfj\x96\xff\x00Q\x8a\xbdhj\xbeG^\xceR,\n\x1a\n!4&&4&\x01Z4&&4&\xa64&&4&\xfd\xa64&&4&\x01\x00&4&&4\x01\x004&&4&\xfd\xa64&&4&\x01Z4&&4&\xa64&&4&\xfe\xda4&&4&\xa64&&4&\xfe\xa64&&4&\x01&4&&4&Z4&&4&Z4&&4&\x05\a\n\x1a\n\xfd\x8e\n\nR\n\x1a\n,[\xe8cG\x96j\xfb\x00\x05\x00h\xbd\x8aQRJ'\x1dA,\n\n\xfe\xa7&4&&4Z&4&&4Z&4&&4Z&4&&444&&4&\x80&4&&4Z&4&&4Z&4&&4Z&4&&4\xda&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4\x00\x11\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00%\x00-\x005\x00=\x00E\x00M\x00}\x00\x85\x00\x8d\x00\x95\x00\x9d\x00\xa5\x00\xad\x00\xb5\x00\xbd\x00\xc5\x00\x00\x01\x15\x14\a\x15\x14\x06+\x01\"&=\x01\x06#!\"'\x15\x14\x06+\x01\"&=\x01&=\x01\x00\x14\x06\"&4626\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x0146;\x01\x114632\x176\x16\x1776\x1f\x01\x16\a\x01\x06/\x01&?\x01.\x017&#\"\x06\x15\x11!2\x16\x00\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462\x06\x80\x80\x12\x0e@\x0e\x12?A\xfd\x00A?\x13\r@\r\x13\x80\x02@\x12\x1c\x12\x12\x1cR\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x04R\x12\x0e\xf9@\x0e\x12\x12\x0e`\x96jlL.h)\x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16$\t\x1c%35K\x05\xe0\x0e\x12\xfc\x80\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c\x01\xc0\xc0\xa9u\xc2\x0e\x12\x12\x0ev\x16\x16n\x11\x17\x17\x11\xbau\xa9\xc0\x01\xae\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\xfd\xe0@\x0e\x12\x12\x0e@\x0e\x12\x02\x80j\x96N\x13\x0e \x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16.t2#K5\xfd\x80\x12\x01\xc0\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12\x00\x00\x00\x04\x00\x01\xff\x00\x06\x00\x05\xfe\x00\r\x00@\x00H\x00q\x00\x00\x01\x14\a\x06\a\x06 '&'&54 \x01\x14\x00\a\x06&76767676\x1254\x02$\a\x0e\x03\x17\x16\x12\x17\x16\x17\x16\x17\x1e\x01\x17\x16\x06'.\x01\x0276\x126$76\x04\x16\x12\x04\x14\x06\"&462\x01\x14\x06\a\x06&'&'&7>\x0154.\x01\a\x0e\x01\a\x06\x16\x17\x16\a\x06\a\x0e\x01'.\x017>\x0276\x1e\x01\x03\xe2\x11\x1f\x18\x16\xfe\xfc\x16\x18\x1f\x11\x01\xc0\x02\x1e\xfe\xf4\xd8\b\x0e\x01\a\x03\x04\x02\x01\b\x9f\xc1\xb6\xfeȵ|\xe2\xa1_\x01\x01ğ\a\x02\x03\x03\x01\b\x02\x01\x0f\b\x94\xe2y\b\av\xbf\x01\x03\x8f\xa4\x01/ۃ\xfd\u20fa\x83\x83\xba\x01\xa3k]\b\x10\x02\x06\x17\a\n:Bu\xc6q\x85\xc0\r\nCA\n\a\x18\x05\x02\x10\b_k\x02\x03\x84ނ\x90\xf8\x91\x01XVo\xd7bZZb\xd7nW\xa8\x01\x00\xf0\xfe|V\x03\f\t0\x12 \x0f\t\x03Q\x012\xb8\xb4\x01-\xa8\n\al\xad\xe7}\xb8\xfe\xcfO\x03\t\x15\x18\t/\f\t\f\x04:\xdf\x011\xa7\x8f\x01\x05\xc1z\t\nq\xd0\xfe\xdb%\xba\x83\x83\xba\x83\xff\x00z\xd5G\x06\b\n4(\n\n6\x92Ro\xbaa\f\x0fą\\\xa8<\n\n)4\t\b\x06J\xda}\x83\xe2\x89\x06\a\x86\xf1\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\x13\x00\x00%!\x11!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x00\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x80\x03\x00\x01`\xfb@B^^B\x04\xc0B^^\x00\x01\x00\x00\xff\x80\a\x00\x01\x80\x00\x0f\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\a\x00^B\xfa@B^^B\x05\xc0B^\xe0\xc0B^^B\xc0B^^\x00\x00\x00\x03\x00\x00\xff\x00\b\x00\x06\x00\x00\x03\x00\f\x00&\x00\x00)\x01\x11)\x02\x11!\x1132\x16\x15\x01\x11\x14\x06#!\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x01\x00\x03\x00\xfd\x00\x04\x00\x02\x00\xfd\x00`B^\x03\x00^B\xfd\xa0^B\xfc@B^^B\x02`^B\x03\xc0B^\x02\x00\x03\x00\xff\x00^B\x02\x00\xfc@B^\xfe\xa0B^^B\x03\xc0B^\x01`B^^\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00#\x003\x00\x00%764/\x01764/\x01&\"\x0f\x01'&\"\x0f\x01\x06\x14\x1f\x01\a\x06\x14\x1f\x01\x162?\x01\x17\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x97\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\x02s^B\xfa@B^^B\x05\xc0B^ג\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\x04\x13\xfb@B^^B\x04\xc0B^^\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x007\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x14\x01!\x11!%\x11\x14\x06#!\"&5\x11463!2\x16\x04\xe9\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\xfc\r\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x01\xa9\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\xfe\xcd\x04\x00`\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x13\x00\x00\t\x01!\x01\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04.\x012\xfdr\xfe\xce\x05`\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01f\x024\xfd\xcc\x01\xd0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\a\x00\x00\xff\x00\a\x02\x06\x00\x00\a\x00\x13\x00#\x00.\x00C\x00\xc4\x00\xd4\x00\x00\x01&\x0e\x01\x17\x16>\x01\x05\x06\"'&4762\x17\x16\x14\x17\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14'\x06\"'&4762\x16\x14%\x0e\x01'.\x01>\x02\x16\x17\x1e\a\x0e\x01\x136.\x02'.\x01\a>\x01\x1f\x016'>\x01/\x01>\x0176&'&\x06\a\x0e\x01\x1e\x01\x17.\x01'&7&'\"\a>\x01?\x014'.\x01\x06\a67\x06\x1e\x01\x17\x06\a\x0e\x01\x0f\x01\x0e\x01\x17\x16\x17\x06\a\x06\x14\x167>\x017.\x02\a>\x043\x167654'\x16\a\x0e\x01\x0f\x01\x0e\x05\x16\x17&'\x0e\x04\x16\x17\x166\x127>\x017\x16\x17\x1676\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05\v\x0f(\f\v\x0e4\x10\xfeZ\b\x17\a\b\b\a\x17\b\a\x9e#\f#\r&\f\f#\f#\r&\fy\a\x17\b\a\a\b\x16\x10\x01\x8b\"\x936&.\x04JM@&\x02\x16\a\x13\x06\x0e\x03\x05\x03\a\xc3\x03\x17 \"\x06(XE\x13*\f\f\x02$\x06\x01\x03\x03+8\x06\njT\x01?\x013\x03\x13#'.\x01'&!\x11\x14\x163!2>\x04?\x013\x06\x02\a.\x01'#!\x0557>\x017\x13\x12'.\x01/\x015\x05!27\x0e\x01\x0f\x01#'.\x01#!\"\x06\x02\x06g\xb1%%D-\x11!g\x0e\ag\x1d\x0f<6W\xfe\xf7WZ\x01e#1=/2*\x12]Y\x063\x05\x92\xeb-,\xfd\x8c\xfe\x88\u007fC1\x01\b\x03\v\x02/D\u007f\x01x\x02\xbe\x8b\xeb\x06\x10\x04\x05] \x1fVF\xfd\xdc\x1c\x0f\x05I\xfdq\x01\x05\x03\x03\x02-H\x8e\xfe\xbe\xfe\xc1\u007fD2\x01\b\xfd\xd4NK\x04\v\x19'>*\xd8%\xfeR=\x05\x06\x01\ff\x19\r07\x02\x83\x01\x92\xf3=.\r\x18f\f\x1bD\xfd]\\|yu\x11\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x11\x00,\x000\x00>\x00S\x00e\x00u\x00\x00\x01\x15\x14\x16\x0e\x04#\x112\x1e\x03\x1c\x01\x05\x15\x14\x16\x0e\x02#\"'&5<\x03>\x0232\x1e\x03\x1c\x01\x053\x11#\x013\x11#\a&'#\x113\x11\x133\x13\x054'.\x05\"#\"+\x01\x1123\x166'&\x0554.\x02#\"\a5#\x1137\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9a\x01\x01\x02\x05\b\x0e\t\t\x0e\b\x05\x02\x01<\x01\x01\x04\v\b\t\x05\x04\x03\x04\x06\x05\x06\b\x05\x03\x01\xfb\xdezz\x01\xb2j\x9f\x1c\x14\f\x9ek-L+\x01\xa9\x05\x03\x10\x12 \x15)\x11\x15\b\x04[\x14$\xa98\x03\x01\x01=\x04\x0f\"\x1d.\x1fun\a\x1e/2 \xb4^B\xfb@B^^B\x04\xc0B^\x02\xe3\xb6\x04\x16\b\x10\a\b\x03\x015\x02\b\x03\x10\x05\x16cy\x01\x17\b\x0f\x06\t\n\x9b\x02\n\a\v\x06\b\x03\x03\x06\x06\v\x05\x0e\xee\x01\xd8\xfe(\x01\xd8ݔI\xfe(\x018\xfe\xc8\x01?\x0eC\x17\x10\x19\x10\f\x05\x03\xfe(\x013\x9b>\x9f\x85\x1d #\x0f\"\x9a\xfe(\x1e$=\x03\x12\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x05\x000\xff\x02\bK\x05\xf8\x00\f\x00\x15\x00\x1a\x00S\x00\x8f\x00\x00\x05&'.\x04'&'\x16\x00\x01\x17.\x01/\x01\x06\a\x16\x13\x06\a67\x014\x02&$#\"\x04\a\x06\a>\x03\x1f\x01\x1e\x03\a&\x0e\x02\a\x1e\x02\x17\x16>\x02?\x01>\x01\x16\x17\x16\a\x06\x05\x06'\x1e\x03\x1f\x01\x1676\x12\x13\x06\a\x06\x02\a\x06\a\x06'\x06# \x00\x03\"&#\x06\x1e\x02\x1f\x01\x16\x17.\x03/\x01.\x06'\x1e\x02\x177676767>\x0176$\x04\x17\x16\x12\x04w\x06\x05\r.~ku\x1f\x11\x9eB\x01R\xfe]\xa8\x19 \x03\x04T%\x05z+\",\x1e\x05\xa0|\xd3\xfeޟ\x93\xfe\xf4j\x1e\x0f<\xa6\x97\x87)(!(\t\x04\x03~ˣzF\x04\x0f8\"{\xf9\xb4\x91%%\x16#\x1a\x04\x0e5\xd0\xfe\xfd\x87\xb6)\x8a\x88}''\x8fx\xc3\xeeJ\x0e\x1aF\xdf\xcf0\"H[$%\xfe\xe5\xfeEJ\x01\x06\x02\x06\x11#%\r\x0e\b.Gk2\x1d\x03\x02\x059(B13\"\b\x13?\xa3@\x02\vS)\x87\x1c5\x0f\" \x9e\x01#\x019\x96\xdc\xe2\xc5\x01\x03\b\x1edm\xabW\x03\"\xd5\xfe\xd6\x02;\x1cL\xb765R\x8eA\x020@T.\x16\xfe\x9e\xa1\x01$\xd4}i`:f3A\x15\x06\x04\x03\x01\x1d%%\n\v\x15BM<$q\xf3:\x06)BD\x19\x18\x10\t\x13\x19a\x18a%\x14\x04`\xa1]A\v\f\x17&c\x01|\x01\t\x87M\xd0\xfe\xebs!\v\x1a\n\x03\x01Z\x01\r\x012}i[\x1a\x1a\fF&\x89\x8f\x83**\x02\x15\x0f\x1a\x18\x1b\x1b\f\n\x1f<\b \x95\x8dʣsc\x1c\"\x0fJ<&Ns\xfeF\x00\x05\x00%\xff\f\x06\xd8\x05\xf4\x00\x17\x000\x00@\x00W\x00m\x00\x00\x016&'.\x01\x06\a\x06\x16\x17\x1e\x02\x17\x1e\a6\x01\x0e\x02\x04$.\x01\x027>\x037\x06\x1a\x01\f\x01$76\a\x14\x02\x14\x0e\x02\".\x024>\x022\x1e\x01\x05.\x01,\x01\f\x01\x06\x02\x17&\x02>\x04\x1e\x02\x17\x1e\x01\x036\x00'\"'&7\x1e\x04\x0e\x03\a>\x03\x05=\x1dGV:\x87e\x12\f\x0f#\x17\x1f:\x1b$?+%\x18\x14\r\v\n\x01q4\xc1\xec\xfe\xf2\xfe\xfa\xf0\xb4g\x05\x01\x0f\n&\x043h\xf2\x01T\x01`\x01Zt\x14\x02\xf3Q\x88\xbcм\x88QQ\x88\xbcм\x88\x01pA\xe7\xfe\xed\xfe\xcb\xfe\xdb\xfe\xfe\xb6P\x1e1\x05L\x8e\xbd\xe1\xef\xf6\xe2\xceK!:<\f\xfe\xd7\xf8\b\x02\x02\x1a}҈`\x15\x17d\x91\xe1\x88l\xbb\xa1b\x02\xf0,\xab9'\x1d\x14\x1b\x17\n\x05\x03\x04\x0f\n\r%%($!\x18\r\x01\xfd\xcb\u007f\xbaa\x183\x83\xc0\x01\x17\xa4)W)x\r\xd0\xfe\x86\xfe\xfe\x9a\f\xa1\xa4\x1b\r\x04\x02\x1fо\x8aQQ\x8a\xbeо\x8aQQ\x8a\x06\x93\xd0c\bQ\xb1\xf6\xfe\xa4ǡ\x01-\xf4җe)\x17U\xa4s2\x8e\xfe\x81\xf4\x01XD\x05\x05\x03\x04\\\x94\xbd\xd1ϼ\x92Y\x02\x1ed\x92\xcf\x00\x00\x00\x00\v\x00\x00\xff\x80\x06\x00\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x0132\xc0p\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10\x04\xb08(\xfc\xc0(88(\x03@(8\x01\x00\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\xa0\xfa@(88(\x05\xc0(88\xfb\b \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\x00\x00\x00\x00\x01\x00/\xff\x00\x06Q\x06\x00\x00\x90\x00\x00\x01\a\x17\x1e\x01\a\x0e\x01/\x01\x17\x16\x06&'\x03%\x11\x17\x1e\x01\x0e\x01&/\x01\x15\x14\x06\"&=\x01\a\x0e\x01.\x016?\x01\x11\x05\x03\x0e\x01&?\x01\a\x06&'&6?\x01'.\x01>\x01\x17\x05-\x01\x05\x06#\".\x016?\x01'.\x01>\x01\x1f\x01'&6\x16\x17\x13\x05\x11'.\x01>\x01\x16\x1f\x015462\x16\x1d\x017>\x01\x1e\x01\x06\x0f\x01\x11%\x13>\x01\x16\x0f\x0176\x16\x17\x16\x06\x0f\x01\x17\x1e\x01\x0e\x01#\"'%\r\x01%6\x1e\x01\x06\x06\x1e\xa7\xba\x17\r\r\x0e2\x17\xba7\r2G\rf\xfe\xf1\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\xfe\xf1f\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1d\x1a\t*\x1d\x016\x01\x0f\xfe\xf1\xfe\xca\x04\t\x1b\"\x04\x1a\x1b\xa7\xba\x17\r\x1a4\x16\xba7\r2G\rf\x01\x0f\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\x01\x0ff\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1b\x1a\x04\"\x1b\t\x04\xfe\xca\xfe\xf1\x01\x0f\x016\x1d*\t\x1a\x01\xa3!k\r3\x17\x17\r\rj\xa0&3\n%\x01,\x9c\xfe\xc7\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\x019\x9c\xfe\xd4%\n3&\xa0j\r\r\x17\x173\rk!\x06./!\x06>\x9d\x9d>\x01$,*\x05!k\r3.\x0e\x0ej\xa0&3\n%\xfeԜ\x019\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\xfeǜ\x01,%\n3&\xa0j\r\r\x17\x173\rk!\x05*,$\x01>\x9d\x9d>\x06!/.\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x12\x00&\x00\x00\x016.\x02'&\x0e\x02\a\x06\x1e\x02\x17\x16$\x12\t\x01\x16\x12\a\x06\x02\x04\a\x05\x01&\x0276\x12$76$\x05\xc1\aP\x92\xd0utۥi\a\aP\x92\xd1u\x9b\x01\x14\xac\x01G\xfe\xa3xy\n\v\xb6\xfeԶ\xfc\x19\x01[xy\n\v\xb6\x01-\xb6\xa7\x02\x9a\x02_v١e\a\aN\x8f\xcfuv١e\a\t\x88\x00\xff\x04=\xfe\xa4u\xfeʦ\xb7\xfe\xc8\xc7\x19\x84\x01[t\x017\xa6\xb8\x018\xc7\x19\x16X\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x0e\x00\x12\x00\x16\x00&\x006\x00\x00\x01\x13#\v\x01#\x13'7\x17\a\x01\x05\x03-\x01\x17\a'%\x17\a'\x04\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb4\xa33\xaf\xab1\xb3N\x15\xf0\x15\xfeE\x010\x82\xfe\xd0\x01\xda\xf0g\xef\x01\u007f\xbfR\xbe\x02=|\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x01\"\x01>\x01\"\xd3\xec\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01\xfc\xfe\xb7\x01^\xfe\xa2\x01v!1f2\x02i\x82\xfeЂwg\xeffZQ\xbeQ^\x01>\x01\"\xd3||\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x02w\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\f\x00&\xff\x01\aZ\x05\xff\x00X\x00b\x00l\x00w\x00\x81\x00\xab\x00\xb7\x00\xc2\x00\xcd\x00\xd8\x00\xe4\x00\xee\x00\x00\x01.\x03'&>\x01'&'&\x0f\x01\x0e\x03\".\x01'.\x06'&\x06\a\x0e\x03&'&'&\x06\a\x0e\x03\x15\x06\x167>\x0176\x127>\x01\x17\x16\a\x0e\x01\a\x06\x1667>\x0276\x172\a\x06\x02\a\x06\x16\x17\x1e\x026\x04\x16\x06\a\x06&'&>\x01\x01\x16\x0e\x01&'&>\x01\x16\x00\x0e\x01'.\x017>\x01\x17\x16\x01\x16\x0e\x01.\x01676\x16\x13\x16\x02\a\x06'\x0e\x01&'\x06\a\x06&'&'.\x0267.\x01>\x017>\x02\x16\x176\x1e\x03\a\x1e\x02\x06\x01\x16\x06\a\x06&'&676\x16\x13\x16\x0e\x01&'&676\x16\x01\x16\x06\a\x06.\x01676\x16\x01\x16\x06\a\x06&'&>\x01\x16\x01\x16\x06\a\x06&'&676\x16'\x16\x06\a\x06.\x01>\x01\x16\x056\x04/4-\x03\x05LJ\x05\x0eg-\x1e\x03\x04\x02\a\x03\a\x05\a\x03\x03\f\x06\v\b\v\v\x06\x1e$\x1b\x01\x10\t\x15\f\v6\x1e)j\x17\x102%+\x16QF\x1e)\x12\a\x90\x05\x06\x1f\x0e\x1b\x06\x02b\x01\x063F\x14\x04SP\x06\x14\x15\x1d\x04\x02\u007f\a\f21\x11DK2\xfcA\x06\x10\x0f\x0e\x19\x03\x03\x10\x1c\x02W\f\a\")\f\v\a\")\xfd\x15$?\x1a\x1a\f\x12\x12?\x1a\x1a\x05\x04\x13\f8A&\f\x1b\x1cA\x84E5lZm\x14\x81\x9e=\f\x01g\xf4G2\x03Sw*&>$\x045jD \x86\x9f\xb1GH\x88yX/\x064F\x15 \xfbr\x0e\t\x14\x131\r\x0e\t\x14\x131\xac\x04\x12\"\x1c\x04\x03\x13\x10\x11\x1c\x04\xa5\x04\x15\x14\x13\"\b\x15\x14\x14!\xfdl\x10\x0f\x1c\x1b=\x10\x10\x0f6>\x02\xfa\x04\x10\x0f\x0f\x19\x03\x03\x10\x0f\x0e\x19\xbc\x0f\t\x16\x166\x1e\n,5\x01.\x18\x14\x01\x18\x1a/\xb9\xb1'e\x02\x01\x11\x02\x02\x01\x03\x01\x03\x04\x03\x02\r\x05\n\x05\x06\x03\x01\x05\x10\x17\x01\x0f\a\r\x02\x02\x1b\r\x12.*\x1c\x8d|\x90\x01Ed\x04\x02\x1a!\r\x01u\b\v\x0e\a\x0f&\x12\xf3\v&%\x17&\b\xa8\x9f\t\x1d\x01&\x10\xfe\xf9\x1c5d\x18\t\r\x03\x1f\xa8\x1e\x19\x03\x03\x10\x0f\x0e\x1a\x06\xfe\xda\x11)\x18\b\x11\x11)\x18\b\x0366\f\x13\x12@\x1a\x1b\f\x12\x13\xfd\x01\x1cC&\f8B\x14\x13\f\x02@q\xfe\xf9L?\x03P^\x057\t\x01G-hI[\x0eq\x8f\xa1:<\x88rS\tU~9\x177\x15\aA_\x87I\x10R`g\x02p\x141\x0e\x0e\t\x14\x141\x0e\x0e\t\x01\x05\x10\x1d\b\x13\x11\x11\x1c\x04\x04\x13\xfc;\x14\"\x04\x04\x15(\"\x05\x04\x17\x03j\x1b?\x10\x10\x0f\x1b\x1c>\"\x10\xfdT\x0f\x19\x04\x03\x11\x0e\x0f\x1a\x03\x03\x10\xe2\x166\x10\x0f\n,6 \n\x00\x00\x00\x18\x01&\x00\x01\x00\x00\x00\x00\x00\x00\x00/\x00`\x00\x01\x00\x00\x00\x00\x00\x01\x00\v\x00\xa8\x00\x01\x00\x00\x00\x00\x00\x02\x00\a\x00\xc4\x00\x01\x00\x00\x00\x00\x00\x03\x00\x11\x00\xf0\x00\x01\x00\x00\x00\x00\x00\x04\x00\v\x01\x1a\x00\x01\x00\x00\x00\x00\x00\x05\x00\x12\x01L\x00\x01\x00\x00\x00\x00\x00\x06\x00\v\x01w\x00\x01\x00\x00\x00\x00\x00\a\x00Q\x02'\x00\x01\x00\x00\x00\x00\x00\b\x00\f\x02\x93\x00\x01\x00\x00\x00\x00\x00\t\x00\n\x02\xb6\x00\x01\x00\x00\x00\x00\x00\v\x00\x15\x02\xed\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x1e\x03A\x00\x03\x00\x01\x04\t\x00\x00\x00^\x00\x00\x00\x03\x00\x01\x04\t\x00\x01\x00\x16\x00\x90\x00\x03\x00\x01\x04\t\x00\x02\x00\x0e\x00\xb4\x00\x03\x00\x01\x04\t\x00\x03\x00\"\x00\xcc\x00\x03\x00\x01\x04\t\x00\x04\x00\x16\x01\x02\x00\x03\x00\x01\x04\t\x00\x05\x00$\x01&\x00\x03\x00\x01\x04\t\x00\x06\x00\x16\x01_\x00\x03\x00\x01\x04\t\x00\a\x00\xa2\x01\x83\x00\x03\x00\x01\x04\t\x00\b\x00\x18\x02y\x00\x03\x00\x01\x04\t\x00\t\x00\x14\x02\xa0\x00\x03\x00\x01\x04\t\x00\v\x00*\x02\xc1\x00\x03\x00\x01\x04\t\x00\x0e\x00<\x03\x03\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00 \x002\x000\x001\x006\x00.\x00 \x00A\x00l\x00l\x00 \x00r\x00i\x00g\x00h\x00t\x00s\x00 \x00r\x00e\x00s\x00e\x00r\x00v\x00e\x00d\x00.\x00\x00Copyright Dave Gandy 2016. All rights reserved.\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00Regular\x00\x00F\x00O\x00N\x00T\x00L\x00A\x00B\x00:\x00O\x00T\x00F\x00E\x00X\x00P\x00O\x00R\x00T\x00\x00FONTLAB:OTFEXPORT\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x004\x00.\x007\x00.\x000\x00 \x002\x000\x001\x006\x00\x00Version 4.7.0 2016\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00P\x00l\x00e\x00a\x00s\x00e\x00 \x00r\x00e\x00f\x00e\x00r\x00 \x00t\x00o\x00 \x00t\x00h\x00e\x00 \x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00s\x00e\x00c\x00t\x00i\x00o\x00n\x00 \x00f\x00o\x00r\x00 \x00t\x00h\x00e\x00 \x00f\x00o\x00n\x00t\x00 \x00t\x00r\x00a\x00d\x00e\x00m\x00a\x00r\x00k\x00 \x00a\x00t\x00t\x00r\x00i\x00b\x00u\x00t\x00i\x00o\x00n\x00 \x00n\x00o\x00t\x00i\x00c\x00e\x00s\x00.\x00\x00Please refer to the Copyright section for the font trademark attribution notices.\x00\x00F\x00o\x00r\x00t\x00 \x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00Fort Awesome\x00\x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00\x00Dave Gandy\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00\x00http://fontawesome.io\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00/\x00\x00http://fontawesome.io/license/\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x8e\x00\x8b\x00\x8a\x00\x8d\x00\x90\x00\x91\x00\x8c\x00\x92\x00\x8f\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\a\x01\b\x01\t\x01\n\x01\v\x01\f\x01\r\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\"\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x011\x012\x013\x014\x015\x016\x017\x018\x019\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\\\x01]\x01^\x01_\x01`\x01a\x01b\x00\x0e\x00\xef\x00\r\x01c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01}\x01~\x01\u007f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\a\x02\b\x00\"\x02\t\x02\n\x02\v\x02\f\x02\r\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\"\x02#\x02$\x02%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x021\x022\x023\x024\x025\x026\x027\x028\x029\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02Q\x02R\x02S\x00\xd2\x02T\x02U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\\\x02]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02}\x02~\x02\u007f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\a\x03\b\x03\t\x03\n\x03\v\x03\f\x03\r\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\"\x03#\x03$\x03%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x031\x032\x033\x034\x035\x036\x037\x038\x039\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\\\x03]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03}\x03~\x03\u007f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x00\x94\x05glass\x05music\x06search\benvelope\x05heart\x04star\nstar_empty\x04user\x04film\bth_large\x02th\ath_list\x02ok\x06remove\azoom_in\bzoom_out\x03off\x06signal\x03cog\x05trash\x04home\bfile_alt\x04time\x04road\fdownload_alt\bdownload\x06upload\x05inbox\vplay_circle\x06repeat\arefresh\blist_alt\x04lock\x04flag\nheadphones\nvolume_off\vvolume_down\tvolume_up\x06qrcode\abarcode\x03tag\x04tags\x04book\bbookmark\x05print\x06camera\x04font\x04bold\x06italic\vtext_height\ntext_width\nalign_left\falign_center\valign_right\ralign_justify\x04list\vindent_left\findent_right\x0efacetime_video\apicture\x06pencil\nmap_marker\x06adjust\x04tint\x04edit\x05share\x05check\x04move\rstep_backward\rfast_backward\bbackward\x04play\x05pause\x04stop\aforward\ffast_forward\fstep_forward\x05eject\fchevron_left\rchevron_right\tplus_sign\nminus_sign\vremove_sign\aok_sign\rquestion_sign\tinfo_sign\nscreenshot\rremove_circle\tok_circle\nban_circle\narrow_left\varrow_right\barrow_up\narrow_down\tshare_alt\vresize_full\fresize_small\x10exclamation_sign\x04gift\x04leaf\x04fire\beye_open\teye_close\fwarning_sign\x05plane\bcalendar\x06random\acomment\x06magnet\nchevron_up\fchevron_down\aretweet\rshopping_cart\ffolder_close\vfolder_open\x0fresize_vertical\x11resize_horizontal\tbar_chart\ftwitter_sign\rfacebook_sign\fcamera_retro\x03key\x04cogs\bcomments\rthumbs_up_alt\x0fthumbs_down_alt\tstar_half\vheart_empty\asignout\rlinkedin_sign\apushpin\rexternal_link\x06signin\x06trophy\vgithub_sign\nupload_alt\x05lemon\x05phone\vcheck_empty\x0ebookmark_empty\nphone_sign\atwitter\bfacebook\x06github\x06unlock\vcredit_card\x03rss\x03hdd\bbullhorn\x04bell\vcertificate\nhand_right\thand_left\ahand_up\thand_down\x11circle_arrow_left\x12circle_arrow_right\x0fcircle_arrow_up\x11circle_arrow_down\x05globe\x06wrench\x05tasks\x06filter\tbriefcase\nfullscreen\x05group\x04link\x05cloud\x06beaker\x03cut\x04copy\npaper_clip\x04save\nsign_blank\areorder\x02ul\x02ol\rstrikethrough\tunderline\x05table\x05magic\x05truck\tpinterest\x0epinterest_sign\x10google_plus_sign\vgoogle_plus\x05money\ncaret_down\bcaret_up\ncaret_left\vcaret_right\acolumns\x04sort\tsort_down\asort_up\fenvelope_alt\blinkedin\x04undo\x05legal\tdashboard\vcomment_alt\fcomments_alt\x04bolt\asitemap\bumbrella\x05paste\nlight_bulb\bexchange\x0ecloud_download\fcloud_upload\auser_md\vstethoscope\bsuitcase\bbell_alt\x06coffee\x04food\rfile_text_alt\bbuilding\bhospital\tambulance\x06medkit\vfighter_jet\x04beer\x06h_sign\x04f0fe\x11double_angle_left\x12double_angle_right\x0fdouble_angle_up\x11double_angle_down\nangle_left\vangle_right\bangle_up\nangle_down\adesktop\x06laptop\x06tablet\fmobile_phone\fcircle_blank\nquote_left\vquote_right\aspinner\x06circle\x05reply\ngithub_alt\x10folder_close_alt\x0ffolder_open_alt\nexpand_alt\fcollapse_alt\x05smile\x05frown\x03meh\agamepad\bkeyboard\bflag_alt\x0eflag_checkered\bterminal\x04code\treply_all\x0fstar_half_empty\x0elocation_arrow\x04crop\tcode_fork\x06unlink\x04_279\vexclamation\vsuperscript\tsubscript\x04_283\fpuzzle_piece\nmicrophone\x0emicrophone_off\x06shield\x0ecalendar_empty\x11fire_extinguisher\x06rocket\x06maxcdn\x11chevron_sign_left\x12chevron_sign_right\x0fchevron_sign_up\x11chevron_sign_down\x05html5\x04css3\x06anchor\nunlock_alt\bbullseye\x13ellipsis_horizontal\x11ellipsis_vertical\x04_303\tplay_sign\x06ticket\x0eminus_sign_alt\vcheck_minus\blevel_up\nlevel_down\ncheck_sign\tedit_sign\x04_312\nshare_sign\acompass\bcollapse\fcollapse_top\x04_317\x03eur\x03gbp\x03usd\x03inr\x03jpy\x03rub\x03krw\x03btc\x04file\tfile_text\x10sort_by_alphabet\x04_329\x12sort_by_attributes\x16sort_by_attributes_alt\rsort_by_order\x11sort_by_order_alt\x04_334\x04_335\fyoutube_sign\ayoutube\x04xing\txing_sign\fyoutube_play\adropbox\rstackexchange\tinstagram\x06flickr\x03adn\x04f171\x0ebitbucket_sign\x06tumblr\vtumblr_sign\x0flong_arrow_down\rlong_arrow_up\x0flong_arrow_left\x10long_arrow_right\awindows\aandroid\x05linux\adribble\x05skype\nfoursquare\x06trello\x06female\x04male\x06gittip\x03sun\x04_366\aarchive\x03bug\x02vk\x05weibo\x06renren\x04_372\x0estack_exchange\x04_374\x15arrow_circle_alt_left\x04_376\x0edot_circle_alt\x04_378\fvimeo_square\x04_380\rplus_square_o\x04_382\x04_383\x04_384\x04_385\x04_386\x04_387\x04_388\x04_389\auniF1A0\x04f1a1\x04_392\x04_393\x04f1a4\x04_395\x04_396\x04_397\x04_398\x04_399\x04_400\x04f1ab\x04_402\x04_403\x04_404\auniF1B1\x04_406\x04_407\x04_408\x04_409\x04_410\x04_411\x04_412\x04_413\x04_414\x04_415\x04_416\x04_417\x04_418\x04_419\auniF1C0\auniF1C1\x04_422\x04_423\x04_424\x04_425\x04_426\x04_427\x04_428\x04_429\x04_430\x04_431\x04_432\x04_433\x04_434\auniF1D0\auniF1D1\auniF1D2\x04_438\x04_439\auniF1D5\auniF1D6\auniF1D7\x04_443\x04_444\x04_445\x04_446\x04_447\x04_448\x04_449\auniF1E0\x04_451\x04_452\x04_453\x04_454\x04_455\x04_456\x04_457\x04_458\x04_459\x04_460\x04_461\x04_462\x04_463\x04_464\auniF1F0\x04_466\x04_467\x04f1f3\x04_469\x04_470\x04_471\x04_472\x04_473\x04_474\x04_475\x04_476\x04f1fc\x04_478\x04_479\x04_480\x04_481\x04_482\x04_483\x04_484\x04_485\x04_486\x04_487\x04_488\x04_489\x04_490\x04_491\x04_492\x04_493\x04_494\x04f210\x04_496\x04f212\x04_498\x04_499\x04_500\x04_501\x04_502\x04_503\x04_504\x04_505\x04_506\x04_507\x04_508\x04_509\x05venus\x04_511\x04_512\x04_513\x04_514\x04_515\x04_516\x04_517\x04_518\x04_519\x04_520\x04_521\x04_522\x04_523\x04_524\x04_525\x04_526\x04_527\x04_528\x04_529\x04_530\x04_531\x04_532\x04_533\x04_534\x04_535\x04_536\x04_537\x04_538\x04_539\x04_540\x04_541\x04_542\x04_543\x04_544\x04_545\x04_546\x04_547\x04_548\x04_549\x04_550\x04_551\x04_552\x04_553\x04_554\x04_555\x04_556\x04_557\x04_558\x04_559\x04_560\x04_561\x04_562\x04_563\x04_564\x04_565\x04_566\x04_567\x04_568\x04_569\x04f260\x04f261\x04_572\x04f263\x04_574\x04_575\x04_576\x04_577\x04_578\x04_579\x04_580\x04_581\x04_582\x04_583\x04_584\x04_585\x04_586\x04_587\x04_588\x04_589\x04_590\x04_591\x04_592\x04_593\x04_594\x04_595\x04_596\x04_597\x04_598\x04f27e\auniF280\auniF281\x04_602\x04_603\x04_604\auniF285\auniF286\x04_607\x04_608\x04_609\x04_610\x04_611\x04_612\x04_613\x04_614\x04_615\x04_616\x04_617\x04_618\x04_619\x04_620\x04_621\x04_622\x04_623\x04_624\x04_625\x04_626\x04_627\x04_628\x04_629\auniF2A0\auniF2A1\auniF2A2\auniF2A3\auniF2A4\auniF2A5\auniF2A6\auniF2A7\auniF2A8\auniF2A9\auniF2AA\auniF2AB\auniF2AC\auniF2AD\auniF2AE\auniF2B0\auniF2B1\auniF2B2\auniF2B3\auniF2B4\auniF2B5\auniF2B6\auniF2B7\auniF2B8\auniF2B9\auniF2BA\auniF2BB\auniF2BC\auniF2BD\auniF2BE\auniF2C0\auniF2C1\auniF2C2\auniF2C3\auniF2C4\auniF2C5\auniF2C6\auniF2C7\auniF2C8\auniF2C9\auniF2CA\auniF2CB\auniF2CC\auniF2CD\auniF2CE\auniF2D0\auniF2D1\auniF2D2\auniF2D3\auniF2D4\auniF2D5\auniF2D6\auniF2D7\auniF2D8\auniF2D9\auniF2DA\auniF2DB\auniF2DC\auniF2DD\auniF2DE\auniF2E0\auniF2E1\auniF2E2\auniF2E3\auniF2E4\auniF2E5\auniF2E6\auniF2E7\x04_698\auniF2E9\auniF2EA\auniF2EB\auniF2EC\auniF2ED\auniF2EE\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x18\x00\x00\x00\x00\x00\x02\x00\x01\x00\x01\x02\xc2\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xcc=\xa2\xcf\x00\x00\x00\x00\xcbO<0\x00\x00\x00\x00\xd41h\xb9"), + Content: string("\x00\x01\x00\x00\x00\r\x00\x80\x00\x03\x00PFFTMk\xbeG\xb9\x00\x02\x86\x90\x00\x00\x00\x1cGDEF\x02\xf0\x00\x04\x00\x02\x86p\x00\x00\x00 OS/2\x882z@\x00\x00\x01X\x00\x00\x00`cmap\n\xbf:\u007f\x00\x00\f\xa8\x00\x00\x02\xf2gasp\xff\xff\x00\x03\x00\x02\x86h\x00\x00\x00\bglyf\x8f\xf7\xaeM\x00\x00\x1a\xac\x00\x02L\xbchead\x10\x89\xe5-\x00\x00\x00\xdc\x00\x00\x006hhea\x0f\x03\n\xb5\x00\x00\x01\x14\x00\x00\x00$hmtxEy\x18\x85\x00\x00\x01\xb8\x00\x00\n\xf0loca\x02\xf5\xa2\\\x00\x00\x0f\x9c\x00\x00\v\x10maxp\x03,\x02\x1c\x00\x00\x018\x00\x00\x00 name㗋\xac\x00\x02gh\x00\x00\x04\x86post\xaf\x8f\x9b\xa1\x00\x02k\xf0\x00\x00\x1au\x00\x01\x00\x00\x00\x04\x01ː\xcfxY_\x0f<\xf5\x00\v\a\x00\x00\x00\x00\x00\xd43\xcd2\x00\x00\x00\x00\xd43\xcd2\xff\xff\xff\x00\t\x01\x06\x00\x00\x00\x00\b\x00\x02\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x06\x00\xff\x00\x00\x00\t\x00\xff\xff\xff\xff\t\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xb5\x00\x01\x00\x00\x02\xc3\x02\x19\x00'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x01\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x03\x06i\x01\x90\x00\x05\x00\x00\x04\x8c\x043\x00\x00\x00\x86\x04\x8c\x043\x00\x00\x02s\x00\x00\x01\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00pyrs\x00@\x00 \xf5\x00\x06\x00\xff\x00\x00\x00\x06\x00\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x01\x03\x80\x00p\x00\x00\x00\x00\x02U\x00\x00\x01\xc0\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00]\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\x05\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00y\x05\x80\x00n\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x1a\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x002\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x04\x80\x00\x00\a\x00\x00@\x06\x80\x00\x00\x03\x00\x00\x00\x04\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\n\x05\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x80\x00z\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x06\x02\x00\x01\x05\x00\x00\x9a\x05\x00\x00Z\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00@\x06\x00\x00\x00\x06\x80\x005\x06\x80\x005\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\r\x05\x80\x00\x00\x05\x80\x00\x00\x06\x80\x00z\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x10\x05\x80\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00Z\a\x00\x00Z\a\x80\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x03\x80\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00,\x04\x00\x00_\x06\x00\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x15\a\x00\x00\x00\x05\x80\x00\x05\a\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x80\x00\x10\a\x80\x00\x00\x06\x80\x00s\a\x00\x00\x01\a\x00\x00\x00\x05\x80\x00\x04\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x0f\a\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x1b\a\x00\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\a\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x02\x80\x00@\x02\x80\x00\x00\x06\x80\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00(\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x03\x80\x00\x01\a\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x00\x00\x00\a\x00\x00@\a\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x80\x00\x00\a\x80\x00@\a\x00\x00\x00\a\x80\x00\x00\x06\x80\x00@\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00-\x04\x00\x00\r\x04\x80\x00M\x04\x80\x00M\x02\x80\x00-\x02\x80\x00\r\x04\x80\x00M\x04\x80\x00M\a\x80\x00\x00\a\x80\x00\x00\x04\x80\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x00\x00@\x06\x00\x00\x00\a\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\a\x80\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\a\x80\x00\x00\a\x00\x00@\a\x00\x00@\x06\x80\x00\r\a\x80\x00-\a\x00\x00\x00\x06\x80\x00\x02\x05\x80\x00\x02\x06\x80\x00\x00\x04\x00\x00\x00\x06\x80\x00\x00\x04\x00\x00`\x02\x80\x00\x00\x02\x80\x00b\x06\x00\x00\x05\x06\x00\x00\x05\a\x80\x00\x01\x06\x80\x00\x00\x04\x80\x00\x00\x05\x80\x00\r\x05\x00\x00\x00\x06\x80\x00\x00\x05\x80\x00\x03\x06\x80\x00$\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\a\x00\x00\f\a\x00\x00\x00\x04\x80\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x01\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x006\x06\x00\x00\x00\x05\x80\x00\x00\x04\x00\x00\x03\x04\x00\x00\x03\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x004\x03\x82\x00\x00\x04\x03\x00\x04\x05\x00\x00\x00\a\x00\x00\x00\x05\x00\x008\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\"\x06\x80\x00\"\a\x00\x00\"\a\x00\x00\"\x06\x00\x00\"\x06\x00\x00\"\x06\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x1b\x05\x80\x00\x05\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00@\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x06\x00\x00\x00\x04\x00\x00D\x06\x00\x00\x00\x03\x00\x00\x03\x03\x00\x00\x03\a\x00\x00@\a\x00\x00\x00\x05\x80\x00\x00\x06\x80\x00\x00\x05\x80\x00\x00\x06\x00\x00\v\x06\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00,\x06\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\a\x00\x00,\x06\x00\x00\x00\a\x00\x00@\x06\x80\x00 \a\x80\xff\xff\a\x00\x00\x00\x06\x00\x00\x00\x05\x80\x00\x00\x05\x00\x00\x15\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\x04\x80\x00\x00\x05\x80\x00\x00\b\x80\x00\x00\x06\x80\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00m\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x80\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\xf6\x00)\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00@\x06\x80\x00\x00\x03\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x10\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00 \x06\x00\x00\x00\x04\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00'\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x13\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00D\x06\x00\x00\x00\x05\x00\x009\a\x00\x00\x12\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00>\x05\x00\x00\x18\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x19\a\x00\x00d\x06\x00\x00Y\b\x00\x00\x00\b\x00\x00*\a\x00\x00\x00\x06\x00\x00\t\a\x00\x00'\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\b\x00\x00\x0e\b\x00\x00\x0e\x05\x80\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x05\x00\x00\v\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x13\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x05\x00\x00\x02\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x02\a\x80\x00\x01\b\x00\x00\x06\x06\x00\x00\x00\x05\x00\x00\x02\b\x00\x00\x04\x05\x00\x00\x00\x05\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\b\xf8\x00T\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\a\xb5\x00\x00\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00@\a\x00\x00\x00\t\x00\x00\x00\x05\x00\x00f\x06\x00\x00\x00\x06\xb8\x00\x00\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x02\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x16\x06\x00\x00\x0e\a\x00\x00\x1d\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00%\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\a\x00\x00R\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00E\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00 \a\x00\x00\x00\t\x00\x00\x00\a\x00\x00\x00\t\x00\x00\x00\x06\x00\x00$\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00!\x06\x00\x00k\x04\x00\x00(\x06\x00\x00\x00\a\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00D\x06\x00\x00\x00\x05\x80\x00'\t\x00\x00\x03\x05\x80\x00\x00\b\x80\x00\x00\a\x00\x00\x00\t\x00\x00\x03\a\x00\x00\x00\x06\x00\x00\x00\x05\xff\x00%\x06\x80\x00\x01\a\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x0f\x06\x00\x00\x00\t\x00\x00\x00\x06\x00\x00\x00\x06\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00%\t\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x15\x06\x80\x00\x00\x06\x80\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00\b\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x1d\t\x00\x00\x00\a\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\a\x80\x00\x00\a\x00\x00\x00\x06\x00\x00\x01\a\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x00\x00\x00\a\x02\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\b\x80\x000\a\x00\x00%\x06\x00\x00\x00\x06\x80\x00/\a\x00\x00\x00\a\x00\x00\x00\a\x80\x00&\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x00\x01\xec\x00\x03\x00\x01\x00\x00\x00\x1c\x00\x04\x01\xd0\x00\x00\x00p\x00@\x00\x05\x000\x00 \x00\xa9\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x0e\xf0\x1e\xf0>\xf0N\xf0^\xf0n\xf0~\xf0\x8e\xf0\x9e\xf0\xae\xf0\xb2\xf0\xce\xf0\xde\xf0\xee\xf0\xfe\xf1\x0e\xf1\x1e\xf1.\xf1>\xf1N\xf1^\xf1n\xf1~\xf1\x8e\xf1\x9e\xf1\xae\xf1\xbe\xf1\xce\xf1\xde\xf1\xee\xf1\xfe\xf2\x0e\xf2\x1e\xf2>\xf2N\xf2^\xf2n\xf2~\xf2\x8e\xf2\x9e\xf2\xae\xf2\xbe\xf2\xce\xf2\xde\xf2\xee\xf5\x00\xff\xff\x00\x00\x00 \x00\xa8\x00\xae\x00\xb4\x00\xc6\x00\xd8!\"\"\x1e\"`\xf0\x00\xf0\x10\xf0!\xf0@\xf0P\xf0`\xf0p\xf0\x80\xf0\x90\xf0\xa0\xf0\xb0\xf0\xc0\xf0\xd0\xf0\xe0\xf0\xf0\xf1\x00\xf1\x10\xf1 \xf10\xf1@\xf1P\xf1`\xf1p\xf1\x80\xf1\x90\xf1\xa0\xf1\xb0\xf1\xc0\xf1\xd0\xf1\xe0\xf1\xf0\xf2\x00\xf2\x10\xf2!\xf2@\xf2P\xf2`\xf2p\xf2\x80\xf2\x90\xf2\xa0\xf2\xb0\xf2\xc0\xf2\xd0\xf2\xe0\xf5\x00\xff\xff\xff\xe3\xff\\\xffX\xffS\xffB\xff1\xde\xe8\xdd\xedݬ\x10\r\x10\f\x10\n\x10\t\x10\b\x10\a\x10\x06\x10\x05\x10\x04\x10\x03\x10\x02\x0f\xf5\x0f\xf4\x0f\xf3\x0f\xf2\x0f\xf1\x0f\xf0\x0f\xef\x0f\xee\x0f\xed\x0f\xec\x0f\xeb\x0f\xea\x0f\xe9\x0f\xe8\x0f\xe7\x0f\xe6\x0f\xe5\x0f\xe4\x0f\xe3\x0f\xe2\x0f\xe1\x0f\xe0\x0f\xde\x0f\xdd\x0f\xdc\x0f\xdb\x0f\xda\x0f\xd9\x0f\xd8\x0f\xd7\x0f\xd6\x0f\xd5\x0f\xd4\x0f\xd3\r\xc2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x05\n\a\x04\f\b\t\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00,\x00\x00\x00\x90\x00\x00\x01\x14\x00\x00\x01\x98\x00\x00\x02t\x00\x00\x02\xd0\x00\x00\x03L\x00\x00\x03\xf0\x00\x00\x04T\x00\x00\x06$\x00\x00\x06\xe0\x00\x00\bl\x00\x00\tx\x00\x00\t\xd0\x00\x00\nT\x00\x00\v(\x00\x00\v\xd4\x00\x00\f\x84\x00\x00\rd\x00\x00\x0e\xa8\x00\x00\x0f\xd4\x00\x00\x10\x84\x00\x00\x11\x00\x00\x00\x11\x9c\x00\x00\x12l\x00\x00\x13,\x00\x00\x13\xd8\x00\x00\x14\x80\x00\x00\x14\xfc\x00\x00\x15\x90\x00\x00\x164\x00\x00\x17\x10\x00\x00\x18d\x00\x00\x18\xcc\x00\x00\x19p\x00\x00\x1aH\x00\x00\x1a\x94\x00\x00\x1b$\x00\x00\x1cd\x00\x00\x1d,\x00\x00\x1e\b\x00\x00\x1et\x00\x00\x1f(\x00\x00 \x8c\x00\x00 \xf0\x00\x00!\xa0\x00\x00\"0\x00\x00# \x00\x00$,\x00\x00$\xe0\x00\x00&D\x00\x00'\xe4\x00\x00(\x9c\x00\x00)T\x00\x00*\b\x00\x00*\xbc\x00\x00,\x10\x00\x00,\xf4\x00\x00-\xd8\x00\x00.@\x00\x00.\xd8\x00\x00/`\x00\x00/\xbc\x00\x000\x14\x00\x000\xa4\x00\x001\x94\x00\x002\x90\x00\x003d\x00\x0044\x00\x004\x94\x00\x005 \x00\x005\x80\x00\x005\xb8\x00\x006 \x00\x006\\\x00\x006\xbc\x00\x007H\x00\x007\xa8\x00\x008\f\x00\x008`\x00\x008\xb4\x00\x009L\x00\x009\xb4\x00\x00:h\x00\x00:\xec\x00\x00;\xc0\x00\x00<\x00\x00>\xe4\x00\x00?h\x00\x00?\xd8\x00\x00@H\x00\x00@\xbc\x00\x00A0\x00\x00A\xb8\x00\x00BX\x00\x00B\xf8\x00\x00Cd\x00\x00C\x9c\x00\x00DL\x00\x00D\xe4\x00\x00E\xb8\x00\x00F\x9c\x00\x00G0\x00\x00G\xdc\x00\x00H\xec\x00\x00I\x8c\x00\x00J8\x00\x00K\xac\x00\x00L\xe4\x00\x00Md\x00\x00N,\x00\x00N\x80\x00\x00N\xd4\x00\x00O\xb0\x00\x00P`\x00\x00P\xa8\x00\x00Q4\x00\x00Q\xa0\x00\x00R\f\x00\x00Rl\x00\x00S,\x00\x00S\x98\x00\x00T`\x00\x00U0\x00\x00W\xf0\x00\x00X\xdc\x00\x00Z\b\x00\x00[@\x00\x00[\x8c\x00\x00\\<\x00\x00\\\xf8\x00\x00]\x98\x00\x00^(\x00\x00^\xe4\x00\x00_\xa0\x00\x00`p\x00\x00b,\x00\x00b\xf4\x00\x00d\x04\x00\x00d\xec\x00\x00eP\x00\x00e\xd0\x00\x00f\xc4\x00\x00g`\x00\x00g\xa8\x00\x00iL\x00\x00i\xc0\x00\x00jD\x00\x00k\f\x00\x00k\xd4\x00\x00l\x80\x00\x00m@\x00\x00n,\x00\x00oL\x00\x00p\x84\x00\x00q\xa4\x00\x00r\xdc\x00\x00sx\x00\x00t\x10\x00\x00t\xa8\x00\x00uD\x00\x00{`\x00\x00|\x00\x00\x00|\xbc\x00\x00}\x10\x00\x00}\xa4\x00\x00~\x88\x00\x00\u007f\x94\x00\x00\x80\xbc\x00\x00\x81\x18\x00\x00\x81\x8c\x00\x00\x83H\x00\x00\x84\x14\x00\x00\x84\xd4\x00\x00\x85\xa8\x00\x00\x85\xe4\x00\x00\x86l\x00\x00\x87@\x00\x00\x88\x98\x00\x00\x89\xc0\x00\x00\x8b\x10\x00\x00\x8c\xc8\x00\x00\x8d\x8c\x00\x00\x8el\x00\x00\x8fH\x00\x00\x90 \x00\x00\x90\xc0\x00\x00\x91T\x00\x00\x92\f\x00\x00\x92H\x00\x00\x92\x84\x00\x00\x92\xc0\x00\x00\x92\xfc\x00\x00\x93`\x00\x00\x93\xc8\x00\x00\x94\x04\x00\x00\x94@\x00\x00\x94\xf0\x00\x00\x95\x80\x00\x00\x96$\x00\x00\x97\\\x00\x00\x98X\x00\x00\x99\x1c\x00\x00\x9aD\x00\x00\x9a\xb8\x00\x00\x9b\x98\x00\x00\x9c\xa0\x00\x00\x9dT\x00\x00\x9eX\x00\x00\x9e\xf8\x00\x00\x9f\x9c\x00\x00\xa0D\x00\x00\xa1P\x00\x00\xa2,\x00\x00\xa2\xa4\x00\x00\xa38\x00\x00\xa3\xa8\x00\x00\xa4d\x00\x00\xa5\\\x00\x00\xa8\x90\x00\x00\xab\b\x00\x00\xac\x1c\x00\x00\xac\xec\x00\x00\xad\x90\x00\x00\xad\xe8\x00\x00\xae\x80\x00\x00\xaf\x18\x00\x00\xaf\xb0\x00\x00\xb0H\x00\x00\xb0\xe0\x00\x00\xb1x\x00\x00\xb1\xcc\x00\x00\xb2 \x00\x00\xb2t\x00\x00\xb2\xc8\x00\x00\xb3X\x00\x00\xb3\xf4\x00\x00\xb4p\x00\x00\xb5\x00\x00\x00\xb5d\x00\x00\xb6\x1c\x00\x00\xb6\xd4\x00\x00\xb7\xb4\x00\x00\xb7\xf0\x00\x00\xb8x\x00\x00\xb9t\x00\x00\xb9\xf8\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xba\xcc\x00\x00\xbb\xa8\x00\x00\xbc\x84\x00\x00\xbd@\x00\x00\xbe\x04\x00\x00\xbf\xc8\x00\x00\xc0\xc4\x00\x00\xc2\f\x00\x00\u008c\x00\x00\xc3\\\x00\x00\xc4 \x00\x00ļ\x00\x00\xc5\x10\x00\x00Ÿ\x00\x00Ɣ\x00\x00\xc80\x00\x00\xc8\xe0\x00\x00\xc9d\x00\x00\xc9\xcc\x00\x00ʨ\x00\x00ˀ\x00\x00\xcb\xe0\x00\x00\xcc\xf4\x00\x00͔\x00\x00\xcex\x00\x00\xce\xe8\x00\x00ϰ\x00\x00Ќ\x00\x00\xd1,\x00\x00ш\x00\x00\xd2\b\x00\x00҈\x00\x00\xd3\f\x00\x00ӌ\x00\x00\xd3\xec\x00\x00\xd48\x00\x00\xd5,\x00\x00՜\x00\x00\xd6`\x00\x00\xd6\xe8\x00\x00\xd7l\x00\x00\xd8H\x00\x00ش\x00\x00\xd9`\x00\x00\xd9\xc4\x00\x00\xdaT\x00\x00ڸ\x00\x00\xdb\x18\x00\x00۔\x00\x00\xdc@\x00\x00\xdc\xc8\x00\x00\xddl\x00\x00\xdd\xf0\x00\x00ބ\x00\x00\xdf\x18\x00\x00߬\x00\x00\xe0\xbc\x00\x00\xe1l\x00\x00\xe2p\x00\x00\xe3 \x00\x00\xe3\xe4\x00\x00\xe4\x80\x00\x00\xe5\xc8\x00\x00\xe6\xc0\x00\x00\xe7\x18\x00\x00\xe7\xec\x00\x00\xe8\xe4\x00\x00\xe9\xd8\x00\x00\xea\xd8\x00\x00\xeb\xd8\x00\x00\xec\xd4\x00\x00\xed\xd0\x00\x00\xee\xdc\x00\x00\xef\xe4\x00\x00\xf2\x04\x00\x00\xf3\xf4\x00\x00\xf4\x80\x00\x00\xf54\x00\x00\xf6\x10\x00\x00\xf6\x9c\x00\x00\xf7\x18\x00\x00\xf8X\x00\x00\xf8\xc0\x00\x00\xf9$\x00\x00\xfal\x00\x00\xfb\xbc\x00\x00\xfc(\x00\x00\xfc\xb8\x00\x00\xfd\f\x00\x00\xfd`\x00\x00\xfd\xb4\x00\x00\xfe\b\x00\x00\xfe\xb8\x00\x00\xff\b\x00\x01\x00\x14\x00\x01\x05\xb4\x00\x01\x06\xf4\x00\x01\a\xf8\x00\x01\b\xd0\x00\x01\td\x00\x01\n\x10\x00\x01\n\x98\x00\x01\v\x18\x00\x01\f\x04\x00\x01\f\xa4\x00\x01\r,\x00\x01\x0e\x00\x00\x01\x0f\x88\x00\x01\x11,\x00\x01\x11\xa0\x00\x01\x12\xcc\x00\x01\x138\x00\x01\x13\xe4\x00\x01\x14\x90\x00\x01\x15(\x00\x01\x15\xa4\x00\x01\x16X\x00\x01\x16\xfc\x00\x01\x17\xc0\x00\x01\x18\x84\x00\x01\x19x\x00\x01\x1a|\x00\x01\x1bT\x00\x01\x1c\xd4\x00\x01\x1d@\x00\x01\x1d\xd4\x00\x01\x1e\x90\x00\x01\x1f\x04\x00\x01\x1f|\x00\x01 \xa4\x00\x01!\xc0\x00\x01\"x\x00\x01#\b\x00\x01#l\x00\x01$\x04\x00\x01$\xcc\x00\x01'h\x00\x01(\xe8\x00\x01*L\x00\x01,T\x00\x01.L\x00\x011t\x00\x011\xf4\x00\x012\xe0\x00\x0130\x00\x013\xb0\x00\x014\xa8\x00\x015t\x00\x016T\x00\x017$\x00\x018\f\x00\x019H\x00\x01:\x10\x00\x01:\xf0\x00\x01;\x90\x00\x01<\x84\x00\x01<\xd8\x00\x01?X\x00\x01@\x1c\x00\x01A\xc0\x00\x01B\xc8\x00\x01C\xc8\x00\x01D\x9c\x00\x01EH\x00\x01FH\x00\x01Gp\x00\x01HH\x00\x01Ix\x00\x01J \x00\x01J\xe4\x00\x01K\xd4\x00\x01L\xa0\x00\x01M\x18\x00\x01N@\x00\x01P@\x00\x01Q\xa0\x00\x01R\xe0\x00\x01SD\x00\x01T \x00\x01UL\x00\x01V`\x00\x01V\xd4\x00\x01WX\x00\x01X4\x00\x01X\xa0\x00\x01Z\x04\x00\x01Z\x88\x00\x01[d\x00\x01[\xe0\x00\x01\\|\x00\x01]\xd8\x00\x01^\xa0\x00\x01`\x94\x00\x01aH\x00\x01a\xbc\x00\x01b\xf0\x00\x01cX\x00\x01d\xac\x00\x01et\x00\x01fh\x00\x01g\xdc\x00\x01h\xb4\x00\x01i\\\x00\x01jx\x00\x01n\x84\x00\x01p@\x00\x01s\xe0\x00\x01v\x10\x00\x01w\xc8\x00\x01x\x90\x00\x01y\x88\x00\x01z\x8c\x00\x01{h\x00\x01|\x8c\x00\x01}\x1c\x00\x01}\xa4\x00\x01\u007f\\\x00\x01\u007f\x98\x00\x01\u007f\xf8\x00\x01\x80l\x00\x01\x81t\x00\x01\x82\x90\x00\x01\x834\x00\x01\x83\xa4\x00\x01\x84\xc8\x00\x01\x85\xb0\x00\x01\x86\xa4\x00\x01\x88t\x00\x01\x89\x8c\x00\x01\x8a8\x00\x01\x8b8\x00\x01\x8b\xa0\x00\x01\x8eL\x00\x01\x8e\xa8\x00\x01\x8fT\x00\x01\x90\x10\x00\x01\x91\x14\x00\x01\x93\x90\x00\x01\x94\x14\x00\x01\x95\x04\x00\x01\x95\xfc\x00\x01\x96\xf8\x00\x01\x97\xa0\x00\x01\x99|\x00\x01\x9a\xc8\x00\x01\x9c\x10\x00\x01\x9d\b\x00\x01\x9d\xd8\x00\x01\x9e|\x00\x01\x9f\x18\x00\x01\x9f\xe8\x00\x01\xa0\xc4\x00\x01\xa2\f\x00\x01\xa34\x00\x01\xa4x\x00\x01\xa5\xb0\x00\x01\xa6\x80\x00\x01\xa7L\x00\x01\xa8\x1c\x00\x01\xa8\x90\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa8\xec\x00\x01\xa9X\x00\x01\xaa(\x00\x01\xab \x00\x01\xab\xcc\x00\x01\xac\xac\x00\x01\xad\xa8\x00\x01\xae \x00\x01\xae\x88\x00\x01\xaf\x04\x00\x01\xaf\xa8\x00\x01\xb0@\x00\x01\xb0\x88\x00\x01\xb6\xbc\x00\x01\xb7l\x00\x01\xb8\xe0\x00\x01\xb9t\x00\x01\xba\x04\x00\x01\xba\x94\x00\x01\xbb$\x00\x01\xbb\xa4\x00\x01\xbc\b\x00\x01\xbcx\x00\x01\xbdL\x00\x01\xbeL\x00\x01\xbe\xa4\x00\x01\xbf \x00\x01\xc0H\x00\x01\xc1\x18\x00\x01\xc1\xc4\x00\x01\xc3\x04\x00\x01\xc3\xe4\x00\x01Ġ\x00\x01\xc5T\x00\x01\xc6(\x00\x01\xc6\xec\x00\x01\xc8\f\x00\x01\xc9\f\x00\x01ʈ\x00\x01ˠ\x00\x01\xcc\xf8\x00\x01\xce\x1c\x00\x01ϔ\x00\x01\xd0l\x00\x01\xd1d\x00\x01\xd2\xdc\x00\x01\xd3P\x00\x01\xd3\xf8\x00\x01Մ\x00\x01\xd6x\x00\x01\xd7p\x00\x01\xd7\xfc\x00\x01\xd8\xf4\x00\x01ڬ\x00\x01\xdbT\x00\x01\xdcT\x00\x01\xdd\f\x00\x01\xdd\xf0\x00\x01ވ\x00\x01\xdfL\x00\x01\xe1\x80\x00\x01\xe2\xf8\x00\x01\xe4\x18\x00\x01\xe5\f\x00\x01\xe6<\x00\x01\xe7H\x00\x01\xe7\xa8\x00\x01\xe8$\x00\x01\xe8\xd4\x00\x01\xe9l\x00\x01\xea\x1c\x00\x01\xea\xd4\x00\x01\xeb\xe4\x00\x01\xec4\x00\x01\xec\xb8\x00\x01\xec\xf4\x00\x01\xed\xf0\x00\x01\xef\b\x00\x01\xef\xa4\x00\x01\xf0\x04\x00\x01\xf0\xcc\x00\x01\xf1 \x00\x01\xf2P\x00\x01\xf3l\x00\x01\xf3\xe8\x00\x01\xf5\f\x00\x01\xf6,\x00\x01\xf6\xc0\x00\x01\xf7x\x00\x01\xf7\xe0\x00\x01\xf8p\x00\x01\xf9,\x00\x01\xfax\x00\x01\xfbt\x00\x01\xfc\f\x00\x01\xfcd\x00\x01\xfd\f\x00\x01\xfd\x8c\x00\x01\xfe4\x00\x01\xff\b\x00\x01\xff\xd0\x00\x02\x014\x00\x02\x02\x1c\x00\x02\x03,\x00\x02\x04h\x00\x02\x05\xd4\x00\x02\aP\x00\x02\t4\x00\x02\n\xd4\x00\x02\f\xe0\x00\x02\r\xf0\x00\x02\x0f\x18\x00\x02\x104\x00\x02\x11\xe4\x00\x02\x13<\x00\x02\x14,\x00\x02\x15,\x00\x02\x164\x00\x02\x170\x00\x02\x188\x00\x02\x19$\x00\x02\x1a\x88\x00\x02\x1b8\x00\x02\x1d\xb4\x00\x02\x1eT\x00\x02\x1e\xcc\x00\x02 |\x00\x02!h\x00\x02\"\xac\x00\x02$L\x00\x02%0\x00\x02&H\x00\x02'\x88\x00\x02(\xf4\x00\x02)\x8c\x00\x02*0\x00\x02*\xdc\x00\x02+\x94\x00\x02,\xdc\x00\x02.$\x00\x02.\xec\x00\x020\xec\x00\x021\x84\x00\x022@\x00\x022\xfc\x00\x023\xb8\x00\x024t\x00\x025$\x00\x026\xf4\x00\x029 \x00\x02:\x8c\x00\x02:\xd4\x00\x02;\f\x00\x02;\x88\x00\x02<(\x00\x02<\xd8\x00\x02=4\x00\x02?\xb8\x00\x02@\x98\x00\x02A\xe0\x00\x02C\xa0\x00\x02D\xfc\x00\x02F\x98\x00\x02H`\x00\x02H\xf4\x00\x02I\xcc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02L\xbc\x00\x02\x00p\x00\x00\x03\x10\x06\x00\x00\x03\x00\a\x00\x007!\x11!\x03\x11!\x11\xe0\x01\xc0\xfe@p\x02\xa0p\x05 \xfap\x06\x00\xfa\x00\x00\x00\x00\x00\x01\x00]\xff\x00\x06\xa3\x05\x80\x00\x1d\x00\x00\x01\x14\a\x01\x11!2\x16\x14\x06#!\"&463!\x11\x01&54>\x013!2\x1e\x01\x06\xa3+\xfd\x88\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfd\x88+$(\x17\x05\x80\x17($\x05F#+\xfd\x88\xfd\x00&4&&4&\x03\x00\x02x+#\x17\x1b\b\b\x1b\x00\x00\x01\x00\x00\xff\x00\x06\x00\x05\x80\x00+\x00\x00\x01\x11\x14\x0e\x02\".\x024>\x0232\x17\x11\x05\x11\x14\x0e\x02\".\x024>\x0232\x17\x11467\x01632\x16\x06\x00DhgZghDDhg-iW\xfd\x00DhgZghDDhg-iW&\x1e\x03@\f\x10(8\x05 \xfb\xa02N+\x15\x15+NdN+\x15'\x02\x19\xed\xfd;2N+\x15\x15+NdN+\x15'\x03\xc7\x1f3\n\x01\x00\x048\x00\x02\x00\x00\xff\x00\x06\x80\x05\x80\x00\a\x00!\x00\x00\x00\x10\x00 \x00\x10\x00 \x01\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x16\x04\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aL46$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W%\x02\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x804L&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9%\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00=\x00M\x00\x00%\x11\x06\a\x04\a\x0e\x02+\x02\".\x01'&%&'\x11\x14\x163!26\x11<\x02.\x03#!\"\x06\x15\x14\x17\x16\x17\x1e\x04;\x022>\x03767>\x017\x11\x14\x06#!\"&5\x11463!2\x16\x06\x80 %\xfe\xf4\x9e3@m0\x01\x010m@3\x9e\xfe\xf4% \x13\r\x05\xc0\r\x13\x01\x05\x06\f\b\xfa@\r\x13\x93\xc1\xd0\x06:\"7.\x14\x01\x01\x14.7\":\x06\xd0\xc16]\x80^B\xfa@B^^B\x05\xc0B^ \x03\x00$\x1e΄+0110+\x84\xce\x1e$\xfd\x00\r\x13\x13\x04(\x02\x12\t\x11\b\n\x05\x13\r\xa8t\x98\xa5\x051\x1a%\x12\x12%\x1a1\x05\xa5\x98+\x91`\xfb\xc0B^^B\x04@B^^\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x00\x00\x04\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x15\x14\a\x01\x03\x9a4\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\xe5\xfd\x91\x80\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\xdc\xdd\xe5\xfd\xa8\x00\x00\x01\x00\x00\xff\xad\x06\x80\x05\xe0\x00\"\x00\x00\x01\x14\a\x01\x13\x16\x15\x14\x06#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x06\x80\x1a\xfe\x95V\x01\x15\x14\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x03y\x16\x1a\xfe\x9e\xfe\f\a\r\x15\x1d\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x00\x00\x02\x00\x00\xff\xad\x06\x80\x05\xe0\x00\t\x00+\x00\x00\t\x01%\v\x01\x05\x01\x03%\x05\x01\x14\a\x01\x13\x16\x15\x14#\"'%\x05\x06#\"&547\x13\x01&547%\x1362\x17\x13\x05\x16\x04q\x012\xfeZ\xbd\xbd\xfeZ\x012I\x01z\x01y\x01\xc7\x1a\xfe\x95V\x01)\x13\x15\xfe?\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13<\x13\xe1\x01\xf68\x02\x14\x01)>\x01~\xfe\x82>\xfe\xd7\xfe[\xc7\xc7\x03\n\x16\x1a\xfe\x9e\xfe\f\a\r2\f\xec\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7))\xfe9I\t\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x15\x00\x1d\x00\x00%\x14\x06#!\"&54>\x033\x16 72\x1e\x03\x00\x10\x06 &\x106 \x05\x00}X\xfc\xaaX}\x11.GuL\x83\x01l\x83LuG.\x11\xff\x00\xe1\xfe\xc2\xe1\xe1\x01>\x89m\x9c\x9cmU\x97\x99mE\x80\x80Em\x99\x97\x03\xc1\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\v\x00\x00\xff\x00\a\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x0554&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x01267\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\x00&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\xfc\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x05\x80&\x1a\x80\x1a&&\x1a\x80\x1a&\xfe\x80&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&&\x1a\x80\x1a&\x80^B\xf9\xc0B^^B\x06@B^@\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xfd\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\x04\x9a\x80\x1a&&\x1a\x80\x1a&&\xfb\x9a\x80\x1a&&\x1a\x80\x1a&&\x03\x1a\x02\x00\x1a&&\x1a\xfe\x00\x1a&&\xfe\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\x01\x9a\x80\x1a&&\x1a\x80\x1a&&\xba\xfa\xc0B^^B\x05@B^^\x00\x04\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x03\x00L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x03\x80L4\xfe\x004LL4\x02\x004LL4\xfe\x004LL4\x02\x004L\x02\x00\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\xfc\xcc\xfe\x804LL4\x01\x804LL\x02\xcc\xfe\x804LL4\x01\x804LL\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(8\xfd\x808(\xfe\xc0(88(\x01@(8\x02\x808(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x02\x008(\xfe\xc0(88(\x01@(88(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(8\xfb\x008(\xfe\xc0(88(\x01@(8\x05\x008(\xfc@(88(\x03\xc0(88(\xfc@(88(\x03\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x03\xd8\xc0(88(\xc0(88\xfd\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x00\x01\x00y\x00\x0e\x06\x87\x04\xb2\x00\x16\x00\x00\x00\x14\a\x01\a\x06\"/\x01\x01&4?\x0162\x17\t\x0162\x1f\x01\x06\x87\x1c\xfd,\x88\x1cP\x1c\x88\xfe\x96\x1c\x1c\x88\x1cP\x1c\x01&\x02\x90\x1cP\x1c\x88\x03\xf2P\x1c\xfd,\x88\x1c\x1c\x88\x01j\x1cP\x1c\x88\x1c\x1c\xfe\xd9\x02\x91\x1c\x1c\x88\x00\x01\x00n\xff\xee\x05\x12\x04\x92\x00#\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\a\t\x01\x05\x12\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x1cP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\xfeP\x1c\x88\x1c\x1c\x01&\xfe\xda\x1c\x1c\x88\x1cP\x1c\x01&\x01&\x1cP\x1c\x88\x1c\x1c\xfe\xda\x01&\x1c\x1c\x88\x1cP\x1c\xfe\xda\xfe\xda\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00#\x00+\x00D\x00\x00\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01546;\x012\x16\x1d\x0132\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\xe0\r\x13\x13\r\xe0\x13\r@\r\x13\xe0\r\x13\x13\r\xe0\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x0f\x00\x17\x000\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x1e\x01\x10\x00 \x00\x10\x00 \x00\x14\x06#\"'\x01\x06#\"$&\x02\x10\x126$ \x04\x16\x12\x15\x14\a\x01\x04\x00\x13\r\xfd\xc0\r\x13\x13\r\x02@\r\x13\x80\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x03\aK56$\xfe\xa9\xb3\u070f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdo|\x01W\x02\xe0@\r\x13\x13\r@\r\x13\x13\xe6\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\xfe\xb5jK&\x01V|o\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\xfe\xfb\x8fܳ\xfe\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x06\x00\x00)\x005\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x1276\x16\x17\x16\x06\a\x0e\x01\x15\x14\x1e\x022>\x0254&'.\x017>\x01\x17\x16\x12\x01\x11\x14\x06\"&5\x11462\x16\x06\x00z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\xa1\x92+i\x1f \x0f*bkQ\x8a\xbdн\x8aQkb*\x0f \x1fj*\x92\xa1\xfd\x80LhLLhL\x02\x80\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\xb6\x01Bm \x0e+*i J\xd6yh\xbd\x8aQQ\x8a\xbdhy\xd6J i*+\x0e m\xfe\xbe\x02J\xfd\x804LL4\x02\x804LL\x00\x00\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16%\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x01\x00\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12`\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12r\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\xf2\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x01r\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x12\x01\xf2\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00n\x00\x00\x004&\"\x06\x14\x162\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x04\x00\x96Ԗ\x96\xd4\x02\x96\x10\f\xb9\x13\x14#H\n\t\x1b\x90\x16\f\x0e\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8d\n\x0f\x0e\v~'\a\b\x0fH\x12\x1b\x0e\xb7\r\x10\x10\v\xba\x0e\x19(C\n\t\x1a\x91\x16\r\r\x8a,/\x10\r\a\x1d\xde\x0e\x15\x01\x1c1)\x8e\t\x0f\r\f\x81$\a\b\x0fH\x12\x1a\x0f\xb7\r\x10\x02\x16Ԗ\x96Ԗ\x01m\xde\f\x16\x02\x1c6%2X\f\x1a\n%\x8e\tl\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\vr6\n\r\f\v\x15[\x1921\x1b\x02\x15\r\xde\f\x16\x02\x1c..9Q\f\f\n\r$\x8f\nk\x17\x0f\x882\x1c\x11\r\xb8\x10\x15k\t\nw3\b\x0e\f\v\x15[\x1920\x1c\x02\x15\x00\x00\x06\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00;\x00C\x00g\x00\x00\x01\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x05\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x13\x11!\x11\x14\x1e\x013!2>\x01\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\xfc\x80\x0e\x0f\x03\x03@\x03\x0f\x0e\xfd`\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\x03 \xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\xfd\x1e\x03\xb4\xfcL\x16%\x11\x11%\x04Ju\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x00\x00\x00\x02\x00\x1a\x00\x00\x06f\x05\x03\x00\x13\x005\x00\x00\x01\x11\x14\x06#!\x11!\x11!\"&5\x11465\t\x01\x167\a\x06\a#\"'\t\x01\x06'&/\x01&67\x0162\x1f\x01546;\x012\x16\x15\x11\x17\x1e\x01\x05\x80&\x1a\xfe\x80\xff\x00\xfe\x80\x1a&\x01\x02?\x02?\x01\xdf>\b\r\x03\r\b\xfdL\xfdL\f\f\r\b>\b\x02\n\x02\xcf X \xf4\x12\x0e\xc0\x0e\x12\xdb\n\x02\x02 \xfe \x1a&\x01\x80\xfe\x80&\x1a\x01\xe0\x01\x04\x01\x01\xda\xfe&\x02AJ\t\x02\a\x02A\xfd\xbf\b\x01\x02\tJ\n\x1b\b\x02W\x1a\x1a\xcc\xc3\x0e\x12\x12\x0e\xfeh\xb6\b\x1b\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\xe0\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\xfd\xfe\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x002\x00\x00\aN\x05\x00\x00\x11\x00C\x00\x00\x015\x03.\x01+\x01\"\x06\a\x03\x15\x06\x16;\x0126\x01\x14#!26'\x03.\x01#!\"\x06\a\x03\x06\x163!\"547\x01>\x013!\"\x06\x0f\x01\x06\x16;\x0126/\x01.\x01#!2\x16\x17\x01\x16\x04W\x18\x01\x14\r\xba\r\x14\x01\x18\x01\x12\f\xf4\f\x12\x02\xf6.\xfd@\r\x12\x01\x14\x01\x14\r\xfe\xf0\r\x14\x01\x14\x01\x12\r\xfd@.\x1a\x01\xa1\b$\x14\x01S\r\x14\x01\x0f\x01\x12\r\xa6\r\x12\x01\x0f\x01\x14\r\x01S\x14$\b\x01\xa1\x1a\x02\x1c\x04\x01@\r\x13\x13\r\xfe\xc0\x04\f\x10\x10\xfe9I\x13\r\x01\x00\r\x13\x13\r\xff\x00\r\x13I6>\x04\x14\x13\x1c\x13\r\xc0\x0e\x12\x12\x0e\xc0\r\x13\x1c\x13\xfb\xec>\x00\x04\x00\x00\x00\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00%\x00=\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x17\x162?\x01!2\x16\x01\x16\a\x01\x06\"'\x01&763!\x11463!2\x16\x15\x11!2\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01ч:\x9c:\x88\x01\xd0(8\xfe\xbb\x11\x1f\xfe@\x126\x12\xfe@\x1f\x11\x11*\x01\x00&\x1a\x01\x00\x1a&\x01\x00*\xa64&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(8\x8888\x888\x02\x11)\x1d\xfe@\x13\x13\x01\xc0\x1d)'\x01\xc0\x1a&&\x1a\xfe@\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x14\a\x01\x06\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04`\n\xfe\xc1\v\x18\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\xcc\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02`\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\x022\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x18\x00$\x000\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x0162\x17\x01\x16\x02 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04^\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\n\x01?\v\x18\v\x01@\x0f\xd2\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x94\x14\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e\f\f\x01?\t\t\xfe\xc0\x10\x01\xf9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\r\x00#\x00\x00\x01!.\x01'\x03!\x03\x0e\x01\a!\x17!%\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x03\xff\x01<\x01\x03\x01\xd4\xfd<\xd4\x01\x03\x01\x01<_\x01@\x02`&\x1a\xfa\x80\x1a&\x19\xee\n5\x1a\x03@\x1a5\n\xee\x19\x02@\x03\v\x02\x01\xf0\xfe\x10\x03\v\x02\xc0\xa2\xfe\x1e\x1a&&\x1a\x01\xe2>=\x02(\x19\"\"\x19\xfd\xd8=\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00'\x00\x00\x00\x14\a\x01\x06#\"'&5\x11476\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xa0 \xfd\xe0\x0f\x11\x10\x10 !\x1f\x02 \xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xa5J\x12\xfe\xc0\t\b\x13%\x02\x80%\x13\x12\x13\xfe\xc0\xcb\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x003\x00\x00\x01\x11\x14\x06#!\"'&?\x01&#\"\x0e\x02\x14\x1e\x023267672\x1f\x01\x1e\x01\a\x06\x04#\"$&\x02\x10\x126$32\x04\x1776\x17\x16\x06\x00&\x1a\xfe@*\x11\x11\x1f\x8a\x94\xc9h\xbd\x8aQQ\x8a\xbdhw\xd4I\a\x10\x0f\n\x89\t\x01\bm\xfeʬ\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x93\x01\x13k\x82\x1d)'\x05\x00\xfe@\x1a&('\x1e\x8a\x89Q\x8a\xbdн\x8aQh_\n\x02\t\x8a\b\x19\n\x84\x91z\xce\x01\x1c\x018\x01\x1c\xcezoe\x81\x1f\x11\x11\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00G\x00\x00\x01\x14\a\x02\x00!\"$'\a\x06\"&5\x11463!2\x16\x14\x0f\x01\x1e\x013267676;\x012\x16\x13\x11\x14\x06#!\"&4?\x01&#\"\x06\a\x06\a\x06+\x01\"&=\x01\x12\x00!2\x04\x17762\x16\x05\xe7\x01@\xfeh\xfe\xee\x92\xfe\xefk\x81\x134&&\x1a\x01\xc0\x1a&\x13\x89G\xb4a\x86\xe8F\v*\b\x16\xc0\r\x13\x19&\x1a\xfe@\x1a&\x13\x8a\x94Ɇ\xe8F\v*\b\x16\xc7\r\x13A\x01\x9a\x01\x13\x92\x01\x14k\x82\x134&\x01\xe0\x05\x02\xfe\xf4\xfe\xb3nf\x81\x13&\x1a\x01\xc0\x1a&&4\x13\x89BH\x82r\x11d\x17\x13\x03\x13\xfe@\x1a&&4\x13\x8a\x89\x82r\x11d\x17\x13\r\a\x01\f\x01Moe\x81\x13&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x04\x80\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x80\x13\r\xfa@\r\x13\x13\r\x05\xc0\r\x13\x80^B\xfa@B^^B\x05\xc0B^\x01`@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd3\x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x00\x02\x00\x00\x00\x00\x04\x80\x05\x80\x00\a\x00\x1f\x00\x00\x01!54&\"\x06\x15\x01\x11\x14\x06#!\"&5\x1146;\x0154\x00 \x00\x1d\x0132\x16\x01@\x02\x00\x96Ԗ\x03@8(\xfc@(88( \x01\b\x01p\x01\b (8\x03\x00\xc0j\x96\x96j\xfe\xe0\xfd\xc0(88(\x02@(8\xc0\xb8\x01\b\xfe\xf8\xb8\xc08\x00\x00\x02\x00@\xff\x80\a\x00\x05\x80\x00\x11\x007\x00\x00\x01\x14\a\x11\x14\x06+\x01\"&5\x11&5462\x16\x05\x11\x14\x06\a\x06#\".\x02#\"\x05\x06#\"&5\x114767632\x16\x17\x1632>\x0232\x16\x01@@\x13\r@\r\x13@KjK\x05\xc0\x19\x1bך=}\\\x8bI\xc0\xfe\xf0\x11\x10\x1a&\x1f\x15:\xec\xb9k\xba~&26\u007f]S\r\x1a&\x05\x00H&\xfb\x0e\r\x13\x13\r\x04\xf2&H5KKu\xfd\x05\x19\x1b\x0et,4,\x92\t&\x1a\x02\xe6 \x17\x0e\x1dx:;\x13*4*&\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00K\x00\x00\x01\x14\x0f\x02\x0e\x01#\x15\x14\x06+\x01\"&5\x1146;\x012\x16\x1d\x012\x16\x177654\x02$ \x04\x02\x15\x14\x1f\x01>\x013546;\x012\x16\x15\x11\x14\x06+\x01\"&=\x01\"&/\x02&54\x126$ \x04\x16\x12\x06\x80<\x14\xb9\x16\x89X\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12Gv\"D\x1d\xb0\xfe\xd7\xfe\xb2\xfeװ\x1dD\"vG\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12X\x89\x16\xb9\x14<\x86\xe0\x014\x01L\x014\xe0\x86\x02\x8a\xa6\x941!Sk \x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e G<\f_b\x94\x01\x06\x9c\x9c\xfe\xfa\x94b_\f\x034.\x0354632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b\x00\x00\x00\x00\x04\x00\x00\xff\xb9\x06\x80\x05G\x00\x13\x00-\x00I\x00k\x00\x00\x01\x11\x14\x06\"'\x01!\"&5\x11463!\x0162\x16\x00\x14\x06\a\x06#\"&54>\x034.\x0354632\x17\x16\x04\x10\x02\a\x06#\"&54767>\x014&'&'&54632\x17\x16\x04\x10\x02\a\x06#\"&547>\x017676\x12\x10\x02'&'.\x01'&54632\x17\x16\x03\x00&4\x13\xfe\xb3\xfe\xfa\x1a&&\x1a\x01\x06\x01M\x134&\x01\x80UF\n\x0f\x1a&\x18\"\"\x18\x18\"\"\x18&\x1a\x0f\nF\x01U\xaa\x8c\r\f\x1b&'8\x14JSSJ\x148'&\x1a\r\r\x8c\x01\xaa\xfe\xd3\r\r\x1a&'\a\x1f\a.${\x8a\x8a{$.\a\x1f\a'&\x1a\r\r\xd3\x04\xa0\xfb\xc0\x1a&\x13\x01M&\x1a\x01\x80\x1a&\x01M\x13&\xfe\x12\x98\x83\x1c\x05%\x1b\x15\x1d\x15\x19/B/\x19\x15\x1d\x15\x1b%\x05\x1b7\xfe\xce\xfe\xfd;\x05&\x1a'\x14\x1d\x0f6\xa3\xb8\xa36\x0f\x1d\x14'\x1a&\x05;\xb6\xfe4\xfe\u007f[\x05&\x1a$\x17\x04\r\x04\x19\x1a[\x01\x10\x012\x01\x10[\x1a\x19\x04\r\x04\x17$\x1a&\x05[\x00\f\x00\x00\x00\x00\x05\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00/\x003\x007\x00\x00\x01\x15#5\x13\x15#5!\x15#5\x01!\x11!\x11!\x11!\x01!\x11!\x01\x11!\x11\x01\x15#5!\x15#5\x13\x11!5#\x11#\x11!\x1535\x01\x11!\x11!\x11!\x11\x01\x80\x80\x80\x80\x03\x80\x80\xfc\x80\x01\x80\xfe\x80\x01\x80\xfe\x80\x03\x00\x01\x80\xfe\x80\xff\x00\xfd\x80\x04\x80\x80\x01\x80\x80\x80\xfe\x80\x80\x80\x01\x80\x80\xfd\x80\xfd\x80\x05\x80\xfd\x80\x01\x80\x80\x80\x03\x00\x80\x80\x80\x80\xfc\x01\x01\u007f\x01\x80\x01\x80\xfe\x80\x01\x80\xfd\x80\xfd\x80\x02\x80\xfe\x00\x80\x80\x80\x80\x02\x00\xfe\x80\x80\xfe\x80\x02\x80\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x80\x02\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x00'\x00+\x00/\x003\x007\x00;\x00?\x00\x003#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113\x13#\x113???? ^\x1f\x1f\x9d\x1f\x1f\x9d>>~\x1f\x1f?\x1f\x1f?\x1f\x1f\x9d??\x9d??~??~??^??\xbd^^? ^??\x05\x80\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x81\x05\u007f\xfa\x80\x05\x80\x00\x00\x00\x02\x00\x00\xff\x95\x05\xeb\x05\x80\x00\a\x00\x1d\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'\x00\x00\x00\x00\x03\x00\x00\xff\x95\ak\x05\x80\x00\a\x00\x1d\x005\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x06#\"'\x01.\x015\x11463!2\x16\x17\x01\x16\x05\x14\a\x01\x06#\"&'\x01654'\x01.\x01#32\x16\x17\x01\x16\x01\xc0KjKKj\x04v%\xfe\x15'45%\xfd5&5L4\x01\xa05\x80&\x02\xcb%\x01\x80%\xfe\x15'4$.\x1e\x01\xd6%%\xfd5&\x805\xe05\x80&\x02\xcb%\x04\vjKKjK\xfe@5%\xfe\x14%%\x02\xcc%\x805\x01\xa04L5&\xfd6'45%\xfe\x14%\x1c\x1f\x01\xd6%54'\x02\xca&55&\xfd6'\x00\x03\x00\n\xff\x80\x06y\x05\x80\x00T\x00d\x00t\x00\x00\x01\x16\a\x01\x0e\x01#!\"&'&74676&7>\x027>\x0176&7>\x017>\x0176&7>\x017>\x0176&7>\x027>\x06\x17\a63!2\x16\a\x01\x0e\x01#!\"\a\x06\x17\x163!267\x016'\x16\x05\x06\x163!26?\x016&#!\"\x06\a\x03\x06\x163!26?\x016&#!\"\x06\a\x06g(\x16\xfe\xed\x13sA\xfceM\x8f\x1c\x18\x16\x06\x01\x01\b\x01\x02\f\x15\x06\x17,\b\x03\x05\x02\x03\x1c\x03\x15*\x04\x01\a\x04\x04$\x04\x13/\x04\x01\b\x02\x02\x0e\x16\x06\b\x11\r\x13\x14!'\x1c\x01&\r\x02\xf9JP\x16\xfe\xee$G]\xfc\x9b\x1b\v\v\n\x18x\x03\x9b\x1d6\b\x01,\a\x02&\xfb\xed\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04h\x04\f\x0e\x02`\r\x19\x04\x15\x04\f\x0e\xfd\xa0\r\x19\x04\x04\"9H\xfcv@WkNC<\x04.\x0e\b\x1b\x06\v\x14\x1b\n&k&\n(\b\v\"\x06$p\"\t.\x05\r#\x05\x1au&\b#\t\b\x14\x1a\b\f%!'\x19\x16\x01\x06\x03\tpJ\xfcvwE\x0f\x10\x1bF\x1f\x1a\x03\xdb\x16#\x0f\x1e\r\x13\x13\r@\r\x13\x13\r\xfe\xc0\r\x13\x13\r@\r\x13\x13\r\x00\x00\x01\x00\x00\xff\x97\x05\x00\x05\x80\x00\x1c\x00\x00\x012\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x8c\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x80\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x80\x00\x03\x00\f\x00\x14\x00<\x00\x00)\x01\x11!\x11!\x11#\"&=\x01!\x004&\"\x06\x14\x1627\x11\x14\x06+\x01\x15\x14\x06#!\"&=\x01#\"&5\x1146;\x01\x11463!2\x16\x1f\x01\x1e\x01\x15\x1132\x16\x01\x80\x03\x80\xfc\x80\x03\x80\xa0(8\xfd\x80\x04\x80&4&&4\xa6\x13\r\xe08(\xfc@(8\xe0\r\x13qO@8(\x02\xa0(`\x1c\x98\x1c(@Oq\x01\x00\x01\x80\x01\x808(\xa0\xfd&4&&4&@\xfe`\r\x13\xa0(88(\xa0\x13\r\x01\xa0Oq\x02 (8(\x1c\x98\x1c`(\xff\x00q\x00\x03\x00\x00\xff\x80\a\x80\x06\x00\x00\a\x00!\x00)\x00\x00\x002\x16\x14\x06\"&4\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x017>\x013!2\x16\x1f\x01\x00 \x00\x10\x00 \x00\x10\x03I\uea69\xee\xa9\x03\xe0j\x96\x96j\xfa\x80j\x96\x96j\xe03\x13e5\x02\x005e\x133\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03`\xa9\uea69\xee\x02I\x96j\xfc\x80j\x96\x96j\x03\x80j\x96\x881GG1\x88\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x80\x05\x80\x00\a\x00P\x00\x00\x01\x032\x16327&\x017>\x047\x13\x01;\x01\x16\x17\x13\x16\x12\x17\x1e\x01\x17\x16\x17\x1e\x01\x17\x16\x15\x14\x06\x15\"&#\"\x04\a4?\x012>\x0554.\x01'%\x06\x02\x15\x14\x1e\x033\x16\x15\x14\a\"&#\"\x06#\x06\x02ժ!\xcf9\x13&W\xfc\xca\x02\x17B03&\f\xed\x01\x18K5\b\x03\xcd!\x92)\x0fV\x1d\x14\x0f\x13\x8a\x0f\x06\x01?\xfe@L\xfe\xea'\x04\x83\x01\x17\b\x15\t\r\x05>R\x01\xfe>\x1ae\x1c;&L\x03\x01\x02:\xe9:\b%\x03P\x03\xd1\xfe>\x04\x02\xfd\xfcvO\a\v\n\x13'\x1f\x02h\x02\xd4\x0e\a\xfe N\xfe\x99_\"\xdd:-\f\x0f\x1d\x06&\x13\x05\x11\x04\x10\x0e\x01+#\x1c\x05\x02\a\x06\n\f\b\x10\xa1\xc2\x03\x02:\xfe\xed\x19\x16\x1f\x12\t\b\x13'\t\x12\x14\b\x0e\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\x15\x00+\x00a\x00\x00%\x163 \x114'.\x04#\"\a\x14\x06\x15\x14\x06\x1e\x01\x03\x1632>\x0254.\x02#\"\a\x14\x16\x15\x14\x06\x15\x14\x017>\x017>\x04<\x015\x10'.\x04/\x016$32\x1632\x1e\x03\x15\x14\x0e\x03\a\x1e\x01\x15\x14\x0e\x03#\"&#\"\x04\x02+JB\x01x)\x1bEB_I:I\x1c\x01\x02\x01\b\x06*CRzb3:dtB2P\b\x01\xfd\xe4\x02\x0f\x8c$\a\v\x06\x05\x01\x16\x04$5.3\x05\x04b\x01\xe4\x83\x17Z\x17F\x85|\\8!-T>5\x9a\xcdFu\x9f\xa8\\,\xb0,j\xfen\x0f \x01OrB,\x027676\x1a\x01'5.\x02'7\x1e\x0232>\x017\x06\a\x0e\x01\a\x0e\x03\a\x06\x02\a\x0e\x03\x1f\x01\x16\x17\x06\a\"\x06#\"&#&#\"\x06\x11\x16OA\x1b\x1c\r\x01zj\x01\x18=N\x13\x13!\xae}:0e\x8d\x1c\x05\x0e\x1e\x8f%\b\f\x06\t\x02\x1by\x11\x02\x16\x12\x0e\x01\x01\x11\xa8\x03\r\v+\v\x1dt\x1c\x8aD3\xb8~U\a\x13\x13\x0e#B\a\x024\x02\v#\x19\r\v\x05\x03g\x02\t\x05\x05\t\x02'2\n%\x0f\x13/!:\r\x94\xfd\xe1T\tbRU\x0f\x12\x04\x1b,7\x03\x14\x02\x12\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\xfa\x05\x80\x00\x1b\x00}\x00\x00%2\x16\x0f\x01\x06\"/\x01&6;\x01\x11#\"&?\x0162\x1f\x01\x16\x06+\x01\x11\x01\x17\x1632632\x163!2\x16>\x02?\x012\x163\x16\x15\x14\a\x06\a&'.\x02'.\x03\x06#\"&\"\x06\a\x06\x17\x14\x12\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x0276\x114\x02=\x01464.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x06\xd0!\x12\x14~\x14:\x14~\x14\x12!PP!\x12\x14~\x14:\x14~\x14\x12!P\xf9\xd16\f\xc7,\xb0,$\x8f$\x01%\x06\x1e\v\x15\x0e\b*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\r\x01\x06\f\x13\a\x1d\x02\x11c2N \t\x01\x04\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\x13\x06\x01\x02\x04\x03\v\x97!x\x14\x13\x1e!\x1a*\x0e\x80%\x1a\xa2\x1a\x1a\xa2\x1a%\x04\x00%\x1a\xa2\x1a\x1a\xa2\x1a%\xfc\x00\x04\xff\x1b\x05\x04\x01\x01\x01\x05\r\v\x01\x01p\xe0P\x1d\x0e\x04,T\tNE\x01\b\t\x03\x02\x01\x01\x04\x04Q7^\xfd\xb4\xa1\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e*\x01Ue\x01\x94eu\x02\x1b\x17\x1c\x14\x04\f\x18\x0e\rwg\x02\x1a\x12\x01\u007f\x00\x00\x02\x00\x00\xff\x03\x06\x00\x05\x80\x00a\x00\x95\x00\x00\x13\x17\x1632632$\x04\x17\x16?\x012\x163\x16\x15\x14\a\x06\a&'.\x025&'&#\"&\"\x06\a\x06\x1f\x015\x14\x1e\x01\x15\x14\x06\x16\x17\x1e\x01\x17\x16\x15\x14\x0f\x01\x06$#\"\x06#&=\x01>\x027>\x024&54&54>\x01.\x01'&#\"\x06\a\x0e\x02\a&'\x11\x012\x1e\x02\x17\x16\x14\a\x0e\x03#\".\x01465!\x14\x16\x14\x0e\x01#\".\x02'&47>\x0332\x1e\x01\x14\x06\x15!4&4>\x01Q6\f\xc7,\xb0,F\x01a\x01\x00w!\x17*\x04\x14\x04\x02\x05'\x1d\x19\x1d\x03\x10\x0e\n\x11\x05=\x1e~Pl*\t\x01\x01\x02\x01\x05\x05\n(\xa8$\x05\x03\"L\xfe\xe4A2\xca3\x03\x11Yl\x18\a\t\x03\x01\x05\x01\x01\x01\x05\x04\v\x97)\xf4\x10\x13\x1e!\x1a*\x0e\x05\x1e\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\xfc\x00\x03\x05\x0f\r\f<7@\x04\x1a\x1a\x04@7<\f\r\x0f\x05\x03\x04\x00\x03\x05\x0f\x05\u007f\x1b\x05\x04\x02\x01\x04\x01 \x01\x01p\xe0P\x1d\x0e\x04,T\tMF\x01\r\x06\x02\x02\x04\x05Q7\x9847ƢH\x10oH!\x15+\x10(\n\x0e\x0f\x01\x02\x14\x123\x01\t\x1b \x1a\x0e\x10t\xaf\x87\xac\x03\a\x1d\b\aJHQ6\x05\f\x1b\v\fwh\x02\x1a\x12\x01\u007f\xfa\xff',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15',6\x03\x158\x15\x036,'\x15$\x1f#\x02\x02#\x1f$\x15\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01\x00&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\xfe\x80&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\x80&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xfe\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&&\x1a\xfb\x80\x1a&&\x1a\x04\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\a\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x01f\x80\x1a&&\x1a\x80\x1a&&\x00\x00\x00\x00\b\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xfa\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x06\x00\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xe0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x04s\xc0\r\x13\x13\r\xc0\r\x13\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80\x13\r\x0e\t\xfe\xe0\t\t\x01 \t\x0e\r\x13\x05\x80\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x03\xe0\xfd\xc0\r\x13\t\x01 \t\x1c\t\x01 \t\x13\xfc\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x05\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00\x00\x00\x14\a\x01\x06#\"&5\x114632\x17\t\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01`\t\xfe\xe0\t\x0e\r\x13\x13\r\x0e\t\x01 \x05\xa9\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x13\r\xf9@\r\x13\x13\r\x06\xc0\r\x13\x02\xce\x1c\t\xfe\xe0\t\x13\r\x02@\r\x13\t\xfe\xe0\xfe\t\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x01s\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x01\x00\x00\x00\x00\a\x00\x05\x00\x00\x1f\x00\x00\x01\x11\x14\a\x06#\"'\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x01632\x17\x16\a\x00'\r\f\x1b\x12\xfem\xa9w\xfd@w\xa9\xa9w\x02\xc0w\xa9\x01\x93\x12\x1b\f\r'\x04\xa0\xfb\xc0*\x11\x05\x13\x01\x93\xa6w\xa9\xa9w\x02\xc0w\xa9\xa9w\xa5\x01\x92\x13\x05\x11\x00\x00\x00\x00\x04\x00\x00\xff\x80\a\x80\x05\x80\x00\a\x00\x0e\x00\x1e\x00.\x00\x00\x00\x14\x06\"&462\x01\x11!5\x01\x17\t\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\x80p\xa0pp\xa0\x04p\xfa\x80\x01@\xa0\x02\x00\x02\x00\xf9\xc0\r\x13\x13\r\x06@\r\x13\x13\x93^B\xf9\xc0B^^B\x06@B^\x04\x10\xa0pp\xa0p\xfd\xc0\xfe@\xc0\x01@\xa0\x02\x00\x01 \x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13 \xfb@B^^B\x04\xc0B^^\x00\x04\x00\x00\xff\x80\x05\xeb\x05k\x00\x06\x00\x14\x00\x19\x00%\x00\x00!7'\a\x153\x15\x014#\"\a\x01\x06\x15\x14327\x016'\t\x01!\x11\x01\x14\x0f\x01\x017632\x1f\x01\x16\x01k[\xeb[\x80\x02v\x16\n\a\xfd\xe2\a\x16\n\a\x02\x1e\a6\x01\xa0\xfc\xc0\xfe`\x05\xeb%\xa6\xfe`\xa6$65&\xeb%[\xeb[k\x80\x03\xa0\x16\a\xfd\xe2\a\n\x16\a\x02\x1e\a\xca\xfe`\xfc\xc0\x01\xa0\x02\xe05%\xa6\x01\xa0\xa5&&\xea'\x00\x00\x02\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x17\x00\x00\x004&\"\x06\x14\x162\x01\x14\a\x01\x0e\x01\"&'\x01&54\x00 \x00\x03\x00\x96Ԗ\x96\xd4\x01\x96!\xfe\x94\x10?H?\x0f\xfe\x93!\x01,\x01\xa8\x01,\x03\x16Ԗ\x96Ԗ\x01\x00mF\xfc\xfa!&&!\x03\x06Fm\xd4\x01,\xfe\xd4\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x00%\x11\"\x0e\x01\x10\x1e\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\x94\xfa\x92\x92\xfa\x03\x94\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a`\x04@\x92\xfa\xfe\xd8\xfa\x92\x02\xf1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x05\xc0\x00\x15\x00-\x00\x00\x014'.\x03'&\"\a\x0e\x03\a\x06\x15\x14\x1626%\x14\x00 \x00547>\x037>\x012\x16\x17\x1e\x03\x17\x16\x02\x00\x14\x01\x1d\x16\x1c\a\x04\"\x04\a\x1c\x16\x1d\x01\x14KjK\x02\x00\xfe\xd4\xfeX\xfe\xd4Q\x06qYn\x1c\t243\b\x1cnYq\x06Q\x01\x80$!\x01+!7\x17\x10\x10\x177!+\x01!$5KK\xb5\xd4\xfe\xd4\x01,ԑ\x82\t\xa3\x8b\xd9]\x1e\"\"\x1e]ً\xa3\t\u007f\x00\x05\x00\x00\x00\x00\x06\xf8\x05\x80\x00\x06\x00\x0e\x009\x00>\x00H\x00\x00\x017'\a\x153\x15\x00&\a\x01\x06\x167\x01\x13\x15\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x016\x16\x03\t\x01!\x11\x01\a\x01762\x1f\x01\x16\x14\x03xt\x98t`\x02\x00 \x11\xfe\xa2\x11 \x11\x01^Q\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\x0e\x12\x17\x16\xfc\xc0B^^B\x03@B^\t@\x0f(`\x01 \xfd`\xfe\xe0\x04\\\\\xfe\xe0\\\x1cP\x1c\x98\x1c\x01`t\x98t8`\x02\xc0 \x11\xfe\xa2\x11 \x11\x01^\xfdϾw\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\x0e\x06\x06^B\xfc\xc0B^^B~\r\t@\x0f\x10\x02\xcd\xfe\xe0\xfd`\x01 \x02\x1c\\\x01 \\\x1c\x1c\x98\x1cP\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x06\x00\x00+\x00Z\x00\x00\x01\x11\x14\x06#!\"&5\x11463!12\x16\x15\x14\a\x06\a\x06+\x01\"\x06\x15\x11\x14\x163!26=\x0147676\x17\x16\x13\x01\x06#\"'&=\x01# \a\x06\x13\x16\a\x06#\"'.\x0454>\a;\x01547632\x17\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x00\xff\r\x13\x1aM8\n\x06pB^^B\x03@B^\x12\x1c\x1a\x10\x13\x15\xed\xfe\x80\x12\x1b\f\r'\xa0\xfe\xbdsw-\x03\x17\b\x04\x10\n\n\x169*#\a\x15#;No\x8a\xb5j\xa0'\r\f\x1a\x13\x01\x80\x13\x02#\xfe\xfdw\xa9\xa9w\x03@w\xa9\x13\r\x1b\x05\x1a\"\x04^B\xfc\xc0B^^B\xd6\x13\n\r\x18\x10\b\t\x01\xdc\xfe\x80\x13\x05\x11*\xc0\x83\x89\xfe\xb0\x17\v\x02\r\x0e\"g`\x8481T`PSA:'\x16\xc0*\x11\x05\x13\xfe\x80\x134\x00\x00\x02\x00\x00\x00\x00\x06\u007f\x05\x80\x00/\x00D\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x17\x16\x17\x16\x0f\x01\x06#\"'&#!\"\x06\x15\x11\x14\x163!26=\x014?\x01632\x17\x16\x13\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x16\x14\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@?6\x0f\x03\x03\f1\n\r\x03\x06\x17\x16\xfc\xc0B^^B\x03@B^\t@\n\r\x06\x06\x14\xe7\xfc\xd2\x18B\x18\xfeR\x18\x18n\x18B\x18\x01\a\x02\x87\x18B\x18n\x18\x02^\xfe\xc2w\xa9\xa9w\x03@w\xa9\x19\a\x10\x11\f1\n\x02\x06^B\xfc\xc0B^^B\xfe\r\t@\n\x03\b\x01\xd4\xfc\xd2\x18\x18\x01\xae\x18B\x18n\x18\x18\xfe\xf9\x02\x87\x18\x18n\x18B\x00\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00C\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!\x11#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x11!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\xfe\x80&4\x13\xff\x00\x13\x13\x01\x00\x134&\x01\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x01\x80&4\x13\x01\x00\x13\x13\xff\x00\x134&\xfe\x80\x80\x1a&\x13\xff\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x03\xd3\x13\x1a\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&'\x11\x14\x06+\x01\"&5\x1146;\x012\x16\x15\x1167\x016\x16\x15\x1167\x06\xd3\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\t\n\xfdZ\x1a&&\x1a\x05\x80\x1a&&\x1a\xfdZ\n\t\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x01\x00z\xff\x80\x06\x80\x05\x80\x00\x19\x00\x00\x016\x16\x15\x11\x14\x06'\x01&'\x11\x14\x06'\x01&47\x016\x16\x15\x1167\x06S\x13\x1a\x1a\x13\xfd:\t\x04\x1a\x13\xfd:\x13\x13\x02\xc6\x13\x1a\x04\t\x05s\x13\f\x1a\xfa@\x1a\f\x13\x02\xc6\t\n\xfd:\x1a\f\x13\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfd:\n\t\x00\x00\x01\x00\x00\xff|\x05\u007f\x05\x84\x00\v\x00\x00\t\x01\x06&5\x1146\x17\x01\x16\x14\x05h\xfa\xd0\x17!!\x17\x050\x17\x02a\xfd\x1e\r\x14\x1a\x05\xc0\x1a\x14\r\xfd\x1e\r$\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\xfc\x80&\x1a\xfe\x00\x1a&&\x1a\x02\x00\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\x05@\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x06\x05\x80\x00\x19\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x14\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\x13\x13\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\x134\x13\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00+\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a\x01\x06&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\t\xfd:\x13\x1a\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xc6\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\xfd:\x13\f\x1a\x02\xc6\n\t\x00\x00\x00\x01\x00\x00\xff\x80\x04\x00\x05\x80\x00\x1d\x00\x00\x17\x06&5\x1146\x17\x01\x16\x17\x1146;\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x06\a-\x13\x1a\x1a\x13\x02\xc6\t\x04&\x1a\x80\x1a&&\x1a\x80\x1a&\x04\ts\x13\f\x1a\x05\xc0\x1a\f\x13\xfd:\t\n\x02\xa6\x1a&&\x1a\xfa\x80\x1a&&\x1a\x02\xa6\n\t\x00\x00\x00\x02\x00\x01\x00\x00\x06\x01\x05\x06\x00\v\x00\x1b\x00\x00\x13\x0162\x17\x01\x16\x06#!\"&\x01!\"&5\x11463!2\x16\x15\x11\x14\x06\x0e\x02\xc6\x134\x13\x02\xc6\x13\f\x1a\xfa@\x1a\f\x05\xc6\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x02-\x02\xc6\x13\x13\xfd:\x13\x1a\x1a\xfd\xe6&\x1a\x01\x00\x1a&&\x1a\xff\x00\x1a&\x00\x00\x00\x00\x01\x00\x9a\xff\x9a\x04\xa6\x05\xe6\x00\x14\x00\x00\t\x02\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\x04\x93\xfd\xed\x02\x13\x13\x13\xa6\x134\x13\xfd\x1a\x13\x13\x02\xe6\x134\x13\xa6\x13\x04\xd3\xfd\xed\xfd\xed\x134\x13\xa6\x13\x13\x02\xe6\x134\x13\x02\xe6\x13\x13\xa6\x134\x00\x00\x00\x00\x01\x00Z\xff\x9a\x04f\x05\xe6\x00\x14\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x04S\xfd\x1a\x134\x13\xa6\x13\x13\x02\x13\xfd\xed\x13\x13\xa6\x134\x13\x02\xe6\x13\x02\x93\xfd\x1a\x13\x13\xa6\x134\x13\x02\x13\x02\x13\x134\x13\xa6\x13\x13\xfd\x1a\x134\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x1a\x80\x1a&\x01\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\x01\x00\x1a&&\x1a\xff\x00&\x1a\x80\x1a&\xff\x00\x1a&&\x1a\x01\x00&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xc0&\x1a\xfd\x00\x1a&&\x1a\x03\x00\x1a&\x01@\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&&\x1a\x80\x1a&&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00+\x007\x00\x00\x014/\x017654/\x01&#\"\x0f\x01'&#\"\x0f\x01\x06\x15\x14\x1f\x01\a\x06\x15\x14\x1f\x01\x1632?\x01\x17\x1632?\x016\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04}\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x01\x83\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x9e\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x1b\x1a\x13\xb5\xb5\x13\x1a\x1b\x13Z\x13\x13\xb5\xb5\x13\x13Z\x13\x01\xce\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00#\x00\x00\x014/\x01&\"\a\x01'&\"\x0f\x01\x06\x15\x14\x17\x01\x16327\x01>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x134\x13\xfeh\xe2\x134\x13[\x12\x12\x01j\x13\x1a\x1b\x13\x02\x1f\x12\xfc\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\"\x1c\x12Z\x13\x13\xfei\xe2\x13\x13Z\x12\x1c\x1b\x12\xfe\x96\x13\x13\x02\x1f\x12J\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00:\x00F\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x014.\x01#\"\a\x06\x1f\x01\x1632767632\x16\x15\x14\x06\a\x0e\x01\x1d\x01\x14\x16;\x01265467>\x04$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x00o\xa6W\xf3\x80\x0f\x17\x84\a\f\x10\t5!\"40K(0?i\x12\x0e\xc0\x0e\x12+! \":\x1f\x19\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\xaeX\x96R\xd5\x18\x12d\x06\fD\x18\x184!&.\x16\x1cuC$\x0e\x12\x12\x0e\x13=\x13\x12\x151/J=\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00.\x00:\x00\x00%54&+\x01\x114&#!\"\x06\x1d\x01\x14\x16;\x01\x11#\"\x06\x1d\x01\x14\x163!26\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x12\x0e`\x12\x0e\xfe\xc0\x0e\x12\x12\x0e``\x0e\x12\x12\x0e\x01\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xa0\xa0\x0e\x12\x02\x00\x0e\x12\x12\x0e\xa0\x0e\x12\xfe\xc0\x12\x0e\xa0\x0e\x12\x12\x03\x8e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\xc1\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00/\x00_\x00\x00\x01#\"&=\x0146;\x01.\x01'\x15\x14\x06+\x01\"&=\x01\x0e\x01\a32\x16\x1d\x01\x14\x06+\x01\x1e\x01\x17546;\x012\x16\x1d\x01>\x01\x01\x15\x14\x06+\x01\x0e\x01\a\x15\x14\x06+\x01\"&=\x01.\x01'#\"&=\x0146;\x01>\x017546;\x012\x16\x1d\x01\x1e\x01\x1732\x16\x04\xadm\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1\x01s&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&\x02\x00&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1l&\x1a\x80\x1a&l\xa1 m\x1a&&\x1am \xa1\x01,\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x1a\x80\x1a&\xa1\xeb%\x8f\x1a&&\x1a\x8f%\xeb\xa1&\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x00/\x00;\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x146\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04I\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n͒\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01ɒ\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\n\x92\n\n\x89\x89\n\n\x92\n\x1a\n\x89\x89\n\x1a\x19\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00,\x00\x00\t\x01\x06\"'\x01&4?\x0162\x1f\x01\x0162\x1f\x01\x16\x14\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x93\xfeZ\x134\x13\xfe\xda\x13\x13f\x134\x13\x93\x01\x13\x134\x13f\x13z\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xd3\xfeZ\x13\x13\x01&\x134\x13f\x13\x13\x93\x01\x13\x13\x13f\x134\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x85\x00\t\x00\x12\x00\"\x00\x00\x014'\x01\x1632>\x02\x05\x01&#\"\x0e\x01\x15\x14\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05 W\xfd\x0e\x89\xa0oɒV\xfc\x19\x02\U000c7954\xfa\x92\x05 z\xcd\xfe\xe3\xfe\xc8\xfe\xe3\xcdzz\xcd\x01\x1d\x018\x01\x1d\xcd\x02\x83\xa1\x86\xfd\x0fYW\x92˼\x02\xf2[\x92\xfc\x94\xa2\x01?\xfe\xc6\xfe\xe2\xcezz\xce\x01\x1e\x01:\x01\x1d\xcezz\xce\x00\x00\x01\x00@\xff5\x06\x00\x05K\x00 \x00\x00\x01\x15\x14\x06#!\x01\x16\x14\x0f\x01\x06#\"'\x01&547\x01632\x1f\x01\x16\x14\a\x01!2\x16\x06\x00A4\xfd@\x01%&&K%54'\xfdu%%\x02\x8b&54&K&&\xfe\xdb\x02\xc04A\x02\x80\x805K\xfe\xda$l$L%%\x02\x8c%54'\x02\x8a&&J&j&\xfe\xdbK\x00\x00\x01\x00\x00\xff5\x05\xc0\x05K\x00 \x00\x00\x01\x14\a\x01\x06#\"/\x01&47\x01!\"&=\x01463!\x01&4?\x01632\x17\x01\x16\x05\xc0%\xfdu'43'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%\x02@6%\xfdu%%K&j&\x01%K5\x805K\x01&$l$K&&\xfdu#\x00\x00\x01\x005\xff\x80\x06K\x05@\x00!\x00\x00\x01\x14\x0f\x01\x06#\"'\x01\x11\x14\x06+\x01\"&5\x11\x01\x06\"/\x01&547\x01632\x17\x01\x16\x06K%K&56$\xfe\xdaK5\x805K\xfe\xda$l$K&&\x02\x8b#76%\x02\x8b%\x0253'K&&\x01%\xfd@4AA4\x02\xc0\xfe\xdb&&K&45&\x02\x8b%%\xfdu'\x00\x00\x00\x00\x01\x005\xff\xb5\x06K\x05\x80\x00\"\x00\x00\x01\x14\a\x01\x06#\"'\x01&54?\x01632\x17\x01\x1146;\x012\x16\x15\x11\x01632\x1f\x01\x16\x06K%\xfdu'45%\xfdu&&J'45%\x01&L4\x804L\x01&%54'K%\x02\xc05%\xfdt%%\x02\x8c$65&K%%\xfe\xda\x02\xc04LL4\xfd@\x01&%%K'\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x00\x14\a\x01\x06\"&5\x11#\"\x0e\x05\x15\x14\x17\x14\x16\x15\x14\x06#\"'.\x02'\x02547\x12!3\x11462\x17\x01\a\x00\x13\xfe\x00\x134&\xe0b\x9b\x99qb>#\x05\x05\x11\x0f\x10\f\a\f\x0f\x03\u007f5\xa2\x02\xc9\xe0&4\x13\x02\x00\x03\x9a4\x13\xfe\x00\x13&\x1a\x01\x00\f\x1f6Uu\xa0e7D\x06#\t\x0f\x14\x11\t\x1a\"\a\x01\x1d\xa6dž\x01\x93\x01\x00\x1a&\x13\xfe\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x17\x00/\x00\x00\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x03\x17&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x01\xed\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x03I\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x00\x00\x00\x00\x02\x00\r\xff\x8d\x05\xf3\x05s\x00\x17\x00/\x00\x00\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x00\x14\a\x01\x17\x16\x14\x06#!\"&5\x11462\x1f\x01\x0162\x1f\x01\x03\x00&4\x13\x90\xfe\xb4\n\x1a\nr\n\n\x01L\x90\x13&\x1a\x01\xc0\x1a&\x02\xf3\n\xfe\xb4\x90\x13&\x1a\xfe@\x1a&&4\x13\x90\x01L\n\x1a\nr\x02@\xfe@\x1a&\x13\x90\xfe\xb4\n\nr\n\x1a\n\x01L\x90\x134&&\x02\x93\x1a\n\xfe\xb4\x90\x134&&\x1a\x01\xc0\x1a&\x13\x90\x01L\n\nr\x00\x00\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x05\x808(\xfe`8(\xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(8\x03 \xc0(8\xfe`(88(\x01\xa08(\xc0(8\x01\xa0(88(\xfe`8\x00\x00\x00\x00\x01\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x05\x808(\xfb@(88(\x04\xc0(8\x03 \xc0(88(\xc0(88\x00\x00\x01\x00z\xff\x80\x06\x06\x05\x80\x005\x00\x00\x01\x1e\x01\x0f\x01\x0e\x01'%\x11\x14\x06+\x01\"&5\x11\x05\x06&/\x01&67-\x01.\x01?\x01>\x01\x17\x05\x1146;\x012\x16\x15\x11%6\x16\x1f\x01\x16\x06\a\x05\x05\xca.\x1b\x1a@\x1ag.\xfe\xf6L4\x804L\xfe\xf6.g\x1a@\x1a\x1b.\x01\n\xfe\xf6.\x1b\x1a@\x1ag.\x01\nL4\x804L\x01\n.g\x1a@\x1a\x1b.\xfe\xf6\x01\xe6\x1ag.n.\x1b\x1a\x99\xfe\xcd4LL4\x013\x99\x1a\x1b.n.g\x1a\x9a\x9a\x1ag.n.\x1b\x1a\x99\x0134LL4\xfe͙\x1a\x1b.n.g\x1a\x9a\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00-\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x02\xb2\x12\r\xc0\r\x14\x14\r\xc0\r\x12\x02\x12\n\n\x0e\xdc\x0e\n\n\x11\x14\x0e\xb9\x0e\x13\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xef\xbe\x0e\x13\x14\r\xbe\r\x14\x13\x01f\x02m\f\x06\b\b\x06\f\xfd\x93\n\x0f\x0f\x00\x00\x00\x04\x00\x00\x00\x00\x06\x00\x05@\x00\r\x00\x16\x00\x1f\x00J\x00\x00%5\x115!\x15\x11\x15\x14\x16;\x0126\x013'&#\"\x06\x14\x16$4&#\"\x0f\x0132\x05\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!\"&4632\x1f\x017632\x16\x14\x06#!2\x16\x03\xa0\xfe\xc0$\x1c\xc0\x1c$\xfe8\xc3~\x1a+(88\x02\xd88(+\x1a}\xc2(\x01\xb0\x12\x0e`8(\xfb\xc0(8`\x0e\x12\x12\x0e\x01\xb8]\x83\x83]k=\x80\x80=k]\x83\x83]\x01\xb8\x0e\x12\xb48\x01\xd4\xc0\xc0\xfe,8\x19\x1b\x1b\x03e\xa1\x1f8P88P8\x1f\xa1\xa0\xfe\xc0\x0e\x12\xfe`(88(\x01\xa0\x12\x0e\x01@\x0e\x12\x83\xba\x83M\xa5\xa5M\x83\xba\x83\x12\x00\x02\x00\x00\x00\x00\a\x00\x05\x80\x00\x15\x00N\x00\x00\x004&#\"\x04\x06\a\x06\x15\x14\x16327>\x0176$32\x01\x14\a\x06\x00\a\x06#\"'.\x01#\"\x0e\x02#\"&'.\x0354>\x0254&'&54>\x027>\x047>\x0432\x1e\x02\x05\x00&\x1a\xac\xfe\xdc\xe3z\x13&\x1a\x18\x15\x1b^\x14\x89\x01\a\xb6\x1a\x02&\x14.\xfe\xeb\xdb\xd6\xe0\x94\x8a\x0f\x92\x17\x10/+>\x1d+)\x19\x02\b\x03\x03>J>\x1c\x02\tW\x97\xbem7\xb4\xb3\xb2\x95'\n'\x14\"'\x18'? \x10\x03&4&c\xa9\x87\x15\x18\x1a&\x13\x18^\x13|h\x01\x06_b\xe0\xfe\xc2ml/\x05J@L@#*\x04\x0e\x06\r\a#M6:\x13\x04D\n35sҟw$\x12\x0f\x03\t'%\n'\x11\x17\t\\\x84t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x003\x00\x00\x05\x15\x14\x06#!\"&=\x01463!2\x16\x01\x14\x0e\x05\x15\x14\x17'\x17.\x0454>\x0554'\x17'\x1e\x04\x05\x80\x13\r\xfa\xc0\r\x13\x13\r\x05@\r\x13\xff\x001O``O1C\x04\x01Z\x8c\x89Z71O``O1B\x03\x01Z\x8c\x89Z7\xa0@\r\x13\x13\r@\r\x13\x13\x04\x13N\x84]SHH[3`\x80\x01\x01)Tt\x81\xacbN\x84]SHH[3^\x82\x01\x01)Tt\x81\xac\x00\x00\x00\x00\x03\x00\x00\x00\x00\a\x00\x04\x80\x00\x11\x00!\x001\x00\x00\x01&'\x16\x15\x14\x00 \x00547\x06\a\x16\x04 $\x004&#\"\x06\x15\x14\x162654632\x00\x14\a\x06\x00 \x00'&476\x00 \x00\x17\x06\x80\x98\xe5=\xfe\xf9\xfe\x8e\xfe\xf9=嘅\x01\x91\x01\xd4\x01\x91\xfd\xb5\x1c\x14}\xb3\x1c(\x1czV\x14\x03l\x14\x8c\xfe'\xfd\xf2\xfe'\x8c\x14\x14\x8c\x01\xd9\x02\x0e\x01ٌ\x02@\xecuhy\xb9\xfe\xf9\x01\a\xb9yhu\xec\xcd\xf3\xf3\x029(\x1c\xb3}\x14\x1c\x1c\x14Vz\xfe\xd2D#\xe6\xfe\xeb\x01\x16\xe5#D#\xe5\x01\x16\xfe\xea\xe5\x00\x05\x00\x00\xff\xa0\a\x00\x04\xe0\x00\t\x00\x19\x00=\x00C\x00U\x00\x00%7.\x01547\x06\a\x12\x004&#\"\x06\x15\x14\x162654632%\x14\a\x06\x00\x0f\x01\x06#\"'&547.\x01'&476\x00!2\x177632\x1e\x03\x17\x16\x13\x14\x06\a\x01\x16\x04\x14\a\x06\a\x06\x04#76$7&'7\x1e\x01\x17\x02+NWb=嘧\x02\x89\x1c\x14}\xb3\x1c(\x1czV\x14\x01\x87\x01j\xfe\\i1\n\x12\fz\x10,\x8f\xf1X\x14\x14\x99\x01\xc6\x01\rY[6\n\x12\x05\x1a$\x1e!\x03\x10%\x9e\x82\x01\x18\b\x01\xc0\x14'F\x96\xfeu\xdeJ\xd4\x01iys\xa7?_\xaf9ɍ?\xc0kyhu\xec\xfe\xfe\x02n(\x1c\xb3}\x14\x1c\x1c\x14Vz\xef\a\x02\xbd\xfd\f\xbcY\x10F\n\x12\fKA؉\x1fL\x1f\xeb\x01\x10\x11a\x10\f\x13\x12\x13\x02\n\xfe0\x8b\xe52\x01\xf6-\x84F\"@Q\xac\xbe\x84\x12\uef33sp@\xb2_\x00\x00\x00\x00\x03\x00\x10\xff\x80\x06\xf0\x06\x00\x00\x0f\x00!\x003\x00\x00%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x03\x134'&+\x01\"\a\x06\x15\x13\x14\x16;\x0126\x03\x01\x16\a\x0e\x01#!\"&'&7\x01>\x012\x16\x04\x00\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x12\n\r\v\xdc\v\r\n\x11\x14\x0e\xb9\x0e\x13\r\x03\x00#%\x11;\"\xfa\x00\";\x11%#\x03\x00\x11\x01\x05`,@L\xa1\xa0\x05\x11\x80\a\f\x04\x03\x0f\x06\xfe\xe9\xfe\xfd5\x05\r`\t\x0e\x02\x0f\t\xbd\xfc\v\x02\x01\n`\t\x0e\x06\x02\xc2\x01\x03\xfe\x04\x0e\x03\x02\v\x80\x0e\x10\x02\x99\xa0L\xc0\x05`4\xc0L\xa1\xfdH\x13\x0e`\x06\x01\x03\r\x01\xfc\xfe\xfd\xc2\x11\x0e`\t\x02\v\xfc\xbd\a\x10\r\fa\t\x015\x01\x03\x01\x17\b\x10\x10\v\x80\r\x05\x9f\xa0L@\x00\x0f\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x1f\x00#\x003\x007\x00;\x00?\x00O\x00s\x00\x00\x17!\x11!\x01!\x11!%!\x11!\x01!\x11!%!\x11!\x01!\x11!\x01!\x11!\x01!\x11!%!\x11!\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!\x11!%!\x11!\x01!\x11!7\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x01`\x01@\xfe\xc0\xfe\xa0\x01 \xfe\xe0\x02\xe0\x01@\xfe\xc0\xfe\x80\x01@\xfe\xc0\x03\x00\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\xfe\xa0\x13\r@\r\x13\x13\r@\r\x13\x02\xe0\x01 \xfe\xe0\xfe\x80\x01@\xfe\xc0\x01\x80\x01 \xfe\xe0 \x13\r@\r\x13\x13\r@\r\x13\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x01 \xfe\xe0\x01 @\x01@\xfe\xc0\x01@@\x01 \xfc\x00\x01 \x01\xc0\x01 \xfc\x00\x01 @\x01@\x02 \x01 \r\x13\x13\r\xfe\xe0\r\x13\x13\xfc\xad\x01@@\x01 \xfe\xe0\x01 \xc0\x01 \r\x13\x13\r\xfe\xe0\r\x13\x13M\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x03\x00\x00\xff\xa0\a\x00\x05\xe0\x00\x12\x007\x00q\x00\x00\x01\x06\a.\x04+\x01\"&=\x0146;\x012\x00\x14\a\x01\x06#\"&=\x01\"\x0e\x01.\x06'67\x1e\x043!54632\x17\x01\x12\x14\a\x01\x06#\"&=\x01!\"\x0e\x02\a\x06\a\x0e\x06+\x01\"&=\x0146;\x012>\x02767>\x063!54632\x17\x01\x02\x9amBZxPV3!\x12\x0e\xc0\x0e\x12\x1emBZxPV3!\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x01\x00\x00\xff\x00\a\x00\x05\x00\x00&\x00\x00\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'5&6&>\x027>\x057&\x0254>\x01$32\x04\a\x00\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x11\x1b\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\xb6\xf4\x01\x9c\x03.\xfe\xa4\xfe٫\b\xafC\x0e\b\x02\x16\x12\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xace\xab\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x02\x04 $\x02=\x01463!2\x16\x1d\x01\x14\x1e\x032>\x03=\x01463!2\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xc5\xfe\xa1\xfeH\xfe\xa1\xc5&\x1a\x01\x80\x1a&/\x027\x03#\"&463!2\x1e\x04\x17!2\x16\x02\x80LhLLh\x03\xccLhLLh\xcc!\x18\xfb\xec\r\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x10\x10\x1b\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0e\f\x04\a\x01\x04\xb1\x1a&4hLLhLLhLLhL\x03\xc0\xfe\x00\x18%\x03z<\n\x100&4&&\x1a\v)\x1f1\x05\x037&4&\r\x12\x1f\x15&\a&\x00\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00\x14\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\x03\xa0\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x00\x02\x00\x00\x00\x00\aW\x05\x80\x00\x13\x00*\x00\x00\x01\x14\a\x01\x0e\x01#!\"&547\x01>\x013!2\x16\x01\x15!\"\x06\a\x01\a4&5\x11463!2\x16\x1d\x01!2\x16\aW\x1f\xfe\xb0+\x9bB\xfb\xc0\"5\x1f\x01P+\x9bB\x04@\"5\xfe\xa9\xfc\xc0^\xce=\xfe\xaf\x05\x01\x84\\\x01@\\\x84\x02 \\\x84\x02H\x1f#\xfet3G\x1a\x1e\x1f#\x01\x8c3G\x1a\x01:\xa0_H\xfet\x06\x04\x11\x04\x03\xc0\\\x84\x84\\ \x84\x00\x00\x00\x01\x00@\xff\x00\x02\xc0\x06\x00\x00\x1f\x00\x00\x00\x14\x06+\x01\x1132\x16\x14\a\x01\x06\"'\x01&46;\x01\x11#\"&47\x0162\x17\x01\x02\xc0&\x1a\x80\x80\x1a&\x13\xff\x00\x134\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x04\xda4&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x13\x13\xff\x00\x00\x00\x00\x01\x00\x00\x01@\a\x00\x03\xc0\x00\x1f\x00\x00\x00\x14\a\x01\x06\"&=\x01!\x15\x14\x06\"'\x01&47\x0162\x16\x1d\x01!5462\x17\x01\a\x00\x13\xff\x00\x134&\xfc\x00&4\x13\xff\x00\x13\x13\x01\x00\x134&\x04\x00&4\x13\x01\x00\x02\x9a4\x13\xff\x00\x13&\x1a\x80\x80\x1a&\x13\x01\x00\x134\x13\x01\x00\x13&\x1a\x80\x80\x1a&\x13\xff\x00\x00\x00\x00\x05\x00\x00\xff\x80\b\x00\x05\x80\x00\x03\x00\a\x00\r\x00\x11\x00\x15\x00\x00\x01\x11!\x11\x01\x11!\x11\x01\x15!\x113\x11\x01\x11!\x11\x01\x11!\x11\x02\x80\xff\x00\x02\x80\xff\x00\x05\x00\xf8\x00\x80\x05\x00\xff\x00\x02\x80\xff\x00\x02\x80\xfe\x00\x02\x00\x02\x00\xfc\x00\x04\x00\xfb\x80\x80\x06\x00\xfa\x80\x03\x80\xfd\x00\x03\x00\x01\x80\xfb\x80\x04\x80\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x000\x00@\x00\x00\x01\x06\a67\x06\a&#\"\x06\x15\x14\x17.\x01'\x06\x15\x14\x17&'\x15\x14\x16\x17\x06#\"'\x1e\x01\x17\x06#\"'\x1632>\x0354'6\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x008AD\x19AE=\\W{\x05\x81\xe2O\x1d[/5dI\x1d\x16\r\x1a\x15kDt\x91\x1a\x18\x94\xaepČe1\x01?\x01*\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x9e\x19\t(M&\rB{W\x1d\x13\ata28r=\x01\x19\x02Ku\x0e\b\x04?R\x01Z\x03^Gw\x9b\xa9T\x12\t-\x01\x02\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x04\xe0w\xa9\xa9w\xbc\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd\xecw\xa9\xa9w\x05\x80\xa9w\xfc@w\xa9\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad\xa9w\x03\xc0w\xa9\x00\x00\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x00\x17\x00\x1b\x00#\x00'\x00.\x00>\x00\x00\x004&#\"\x06\x15\x14\x1626546326\x14\x06\"&462\x01!5!\x00\x10& \x06\x10\x16 \x01!5!\x03!=\x01!\a!%\x11\x14\x06#!\"&5\x11463!2\x16\x03\xa0\x12\x0eB^\x12\x1c\x128(\x0e\xf2\x96Ԗ\x96\xd4\xfc\x96\x06\x00\xfa\x00\x04\x80\xe1\xfe\xc2\xe1\xe1\x01>\xfc\xe1\x01\x80\xfe\x80\x80\x06\x00\xfc\xc4@\xfd|\x06\x80K5\xfa\x005KK5\x06\x005K\x02\xb2\x1c\x12^B\x0e\x12\x12\x0e(8\bԖ\x96Ԗ\xfc\u0080\x01\x1f\x01>\xe1\xe1\xfe\xc2\xe1\x04\x02\x80\xfe\xc0v\x8a\x80\x80\xfb\x005KK5\x05\x005KK\x00\x02\x00\x00\xffH\x06\x93\x05\x80\x00\x15\x00G\x00\x00\x004&\"\x06\x15\x14\x17&#\"\x06\x14\x162654'\x1632\x01\x14\x06#\".\x02'\a\x17\x16\x15\x14\x06#\"'\x01\x06#\"&54\x12$32\x16\x15\x14\a\x017.\x0354632\x17\x1e\x04\x03@p\xa0p\x13)*Ppp\xa0p\x13)*P\x03\xc3b\x11\t'\"+\x03`\xdc\x1cN*(\x1c\xfda\xb0\xbd\xa3;\x012\xa0\xa3̓\x01c`\x03.\" b\x11\r\n\x06PTY9\x03\xb0\xa0ppP*)\x13p\xa0ppP*)\x13\xfe\x00\x11b \".\x03`\xdc\x1c(*N\x1c\x02\x9f\x83ͣ\xa0\x012\xbeͣ\xbd\xb0\xfe\x9d`\x03+\"'\t\x11b\n\x06MRZB\x00\x00\x00\x00\x06\x00\x00\xff\x0f\a\x80\x05\xf0\x00\a\x00\x11\x00\x1b\x00\u007f\x00\xbd\x00\xfb\x00\x00\x004&\"\x06\x14\x162\x014&\"\x06\x15\x14\x1626\x114&\"\x06\x15\x14\x1626\x01\x15\x14\x06\x0f\x01\x06\a\x16\x17\x16\x15\x14\a\x0e\x01#\"/\x01\x06\a\x06\a\x06+\x01\"&/\x01&'\a\x06#\"'&547>\x017&/\x01.\x01=\x0146?\x0167&'&547>\x0132\x1f\x0167676;\x012\x16\x1f\x01\x16\x177632\x17\x16\x15\x14\a\x0e\x01\a\x16\x1f\x01\x1e\x01\x01\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x11\x15\x14\a\x06\a\x16\x15\x14\a\x06#\"&'\x06\"'\x0e\x01#\"'&547&'&=\x014767&547>\x0232\x16\x1762\x176?\x012\x17\x16\x15\x14\a\x16\x17\x16\x03\x80\x96Ԗ\x96\xd4\x03\x96LhLKjKLhLKjK\xfe\x80\x0e\t\x9b\v\x15\"8\a\a\x17w\x13\v\ns%(\v\f\a\x17\xba\v\x12\x01\x17\")v\a\r\v\n\x90\a\n>\x10\x17\f\x98\n\x0e\x0e\t\x9b\v\x15\"8\a\a\x16x\x13\v\ns\"+\v\f\a\x17\xba\v\x12\x01\x17\")v\b\f\v\n\x90\a\f<\x0f\x17\v\x98\n\x0e\x02\x80\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x95\f\x123\x04z\x02\bL\x0e\x14\x14\x14\x0eL\b\x02z\x043\x12\f\x95\x95\r\x113\x04\x04>8\x02\bL\x0e\x14\x14\x143)\x06\x04x\x043\x11\r\x95\x02\x16Ԗ\x96Ԗ\xff\x004LL45KK\x0454LL45KK\xfe\x90\xb9\n\x13\x01\x18#)0C\v\t\f\a\x1ew\aZ\x13\fl/\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\t\n\x0eN\x16,&\x18\x01\x11\v\xb9\n\x13\x01\x18#)0C\v\t\f\b\x1ev\aZ\x12\x0el.\x18\x0f\n\x99\n\x15Y\a\b\x85\x1b\b\v\x10L\x160\"\x17\x02\x11\xfd\xe0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x03\xf0\x8c\x10\x0f\x1b\x19q\x19\x04\x03G^\x15\x02\x02\x15^G\x03\x04\x19q\x19\x1b\x0f\x10\x8c\x10\x0f\x1d\x17q\x19\x04\x03\x02$ ]\x15\x02\x02G)\x02F\x03\x04\x19q\x17\x1d\x0f\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00%\x00O\x00\x00\x00\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546$ \x04\x01\x14\x06\a\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x05\x80\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x01E\x01~\x01E\x02<\x8e|\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x03\x8b\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b쉉\xfd\x89x\xd1H\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6\x00\x00\x03\x00\x00\xff\x80\x06\x00\x06\x00\x00\a\x00<\x00m\x00\x00$4&\"\x06\x14\x162\x014&#!4654&#\x0e\x02\a\x06\a\x0e\x06+\x01\x1132\x1e\x04\x17\x16;\x01254'>\x014'654&'>\x017\x14\a\x16\x15\x14\a\x16\x15\x14\a\x16\x06+\x02\"&'&#!\"&5\x11463!6767>\x027632\x1e\x01\x15\x14\a32\x16\x01\x00&4&&4\x04\xa6N2\xfe\xa0`@`\x1a\x18%)\x167\x04&\x19,$)'\x10 \r%\x1d/\x170\x05Ӄy\xc0\x05\x1e#\x125\x14\x0f +\x801\t&\x03<\x01\xac\x8d$]`\xbb{t\x16\xfe\xe05KK5\x01\x12$e:1\x18\x17&+'3T\x86F0\xb0h\x98\xa64&&4&\x02\x803M:\xcb;b^\x1av\x85+\x17D\x052 5#$\x12\xfd\x80\x06\a\x0f\b\x11\x02I\xa7\x1a\x1e\x10IJ 2E\x19=\x11\x01\\$YJ!$MC\x15\x16eM\x8b\xa1-+(K5\x02\x805K\x18\x83K5\x19y\x84*%A\x8au]c\x98\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x05\x80\x00\a\x00>\x00q\x00\x00\x004&\"\x06\x14\x162\x014&'>\x0154'654&'654&+\x01\"\a\x0e\x05+\x01\x1132\x1e\x05\x17\x16\x17\x1e\x02\x172654&5!267\x14\x06+\x01\x16\x15\x14\a\x0e\x01#\"'.\x03'&'&'!\"&5\x11463!27>\x01;\x012\x16\a\x15\x16\x15\x14\a\x16\x15\x14\a\x16\x01\x00&4&&4\x04\xa6+ \x0f\x145\x12#\x1e\x05bW\x80\x83\xd3\x050\x17/\x1d%\r \x10')$,\x19&\x047\x16)%\x18\x1a`@`\x01`2N\x80\x98h\xb00##\x86T3'\"(\v\x18\x130;e$\xfe\xee5KK5\x01 \x16t\x80\xbeip\x8c\xad\x01<\x03&\t1\x04&4&&4&\xfe\x00#\\\x01\x11=\x19E2\x1f&%I\x10\x1e\x1aURI\x02\x11\b\x0f\a\x06\xfd\x80\x12$#5 2\x05D\x17+\x85v\x1a^b;\xcb:M2g\x98c]vDEA%!bSV\x152M\x83\x18K5\x02\x805K(,,\x9e\x89\x05Me\x16\x15CM$!I\x00\x00\x00\x01\x00\x00\xff\xad\x03@\x05\xe0\x00\x12\x00\x00\x01\x11\x05\x06#\"&547\x13\x01&547%\x136\x03@\xfe?\x16\x12\x15\x15\x02V\xfe\x94\x198\x01\xf6\xe1\x13\x05\xe0\xfa\xc5\xec\f\x1d\x15\x06\x0e\x01\xf4\x01b\x1b\x15%\tI\x01\xc7)\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1c\x009\x00\x00\x014.\x03\"\x0e\x02\a\x06\"'.\x03\"\x0e\x03\x15\x14\x17\t\x0167\x14\a\x01\x06\"'\x01.\x0454632\x1e\x02\x17>\x0332\x16\x06\x80+C`\\hxeH\x18\x12>\x12\x18Hexh\\`C+\xbb\x02E\x02D\xbc\x80\xe5\xfd\x91\x124\x12\xfd\x90\n#L\x81oP$$Po\x81>\xe0\xfe\x03\xacQ|I.\x103MC\x1c\x16\x16\x1cCM3\x10.I|Q\xa8\xbb\xfd\xd0\x02/\xbc\xa8\xdd\xe5\xfd\xa8\x12\x12\x02Z\b$_d\x8eC\xdc\xf8+I@$$@I+\xf8\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06 \x05\x00\x00(\x00@\x00\x00%\x14\x16\x0e\x02#!\"&5\x11463!2\x16\x15\x14\x16\x0e\x02#!\"\x06\x15\x11\x14\x163!:\x02\x1e\x03\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\x01\x02\x80\x02\x01\x05\x0f\r\xfe\xc0w\xa9\xa9w\x01@\r\x13\x02\x01\x05\x0f\r\xfe\xc0B^^B\x01 \x01\x14\x06\x11\x06\n\x04\x03\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 `\x04 \x15\x1a\r\xa9w\x02\xc0w\xa9\x13\r\x04 \x15\x1a\r^B\xfd@B^\x02\x04\a\v\x0224\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x0f\x00%\x005\x00\x0073\x11#7.\x01\"\x06\x15\x14\x16;\x0126\x013\x114&#\"\a35#\x16\x033\x1147>\x0132\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\xed\xe7\xe7\xf6\x01FtIG9\x01;H\x02I\xe7\x92x\x88I\x02\xe7\x03\x03\xe7\a\x0f<,t\x01ԩw\xfc@w\xa9\xa9w\x03\xc0w\xa9z\x02\xb6\xd64DD43EE\xfc\xa7\x01\x8e\x9a\x9eueB\xfd\x8c\x01\x84&\x12#1\x9d\x02s\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x00\x04\x80\x05\x80\x00\v\x00.\x00\x00\x01\x114&\"\x06\x15\x11\x14\x1626\x01\x14\x06#!\x03\x0e\x01+\x01\"'\x03!\"&5463\x11\"&463!2\x16\x14\x06#\x112\x16\x01\xe0\x12\x1c\x12\x12\x1c\x12\x02\xa0&\x1a\xfeS3\x02\x11\f\x01\x1b\x05L\xfel\x1a&\x9dc4LL4\x02\x804LL4c\x9d\x02\xa0\x01\xc0\x0e\x12\x12\x0e\xfe@\x0e\x12\x12\xfe\xae\x1a&\xfe\x1d\f\x11\x1b\x01\xe5&\x1a{\xc5\x02\x00LhLLhL\xfe\x00\xc5\x00\x00\x00\x02\x00\x00\x00\x00\a\x00\x06\x00\x00'\x00?\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01\x14\x06#!\"\x06\x15\x11\x14\x163!265\x1146;\x012\x16\x01\x11\x14\x06\"/\x01\x01\x06\"/\x01&47\x01'&463!2\x16\x05\x80\xa9w\xfc\xc0w\xa9\xa9w\x02\xc0\x0e\x12\x12\x0e\xfd@B^^B\x03@B^\x12\x0e@\x0e\x12\x01\x80&4\x13\xb0\xfdt\n\x1a\nr\n\n\x02\x8c\xb0\x13&\x1a\x02\x00\x1a&\x02`\xfe\xc0w\xa9\xa9w\x03@w\xa9\x12\x0e@\x0e\x12^B\xfc\xc0B^^B\x01@\x0e\x12\x12\x03R\xfe\x00\x1a&\x13\xb0\xfdt\n\nr\n\x1a\n\x02\x8c\xb0\x134&&\x00\x02\x00\x00\x00\x00\x06\x00\x05\x00\x00\x17\x00@\x00\x00\x00\x14\a\x01\x06\"&5\x11!\"&5\x11463!\x11462\x17\t\x01\x11\x14\x06#!\"&54&>\x023!265\x114&#!*\x02.\x0354&>\x023!2\x16\x04\xa0\x13\xfd\xe0\x134&\xfe@\x1a&&\x1a\x01\xc0&4\x13\x02 \x01s\xa9w\xfe\xc0\r\x13\x02\x01\x05\x0f\r\x01@B^^B\xfe\xe0\x01\x14\x06\x11\x06\n\x04\x02\x01\x05\x0f\r\x01@w\xa9\x02\x9a4\x13\xfd\xe0\x13&\x1a\x01 &\x1a\x01\x80\x1a&\x01 \x1a&\x13\xfd\xe0\x013\xfd@w\xa9\x13\r\x04 \x15\x1a\r^B\x02\xc0B^\x02\x04\a\v\b\x04 \x15\x1a\r\xa9\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00I\x00\x00\x01&5!\x15\x14\x16%5!\x14\a>\x017\x15\x14\x0e\x02\a\x06\a\x0e\x01\x15\x14\x1632\x16\x1d\x01\x14\x06#!\"&=\x014632654&'&'.\x03=\x01463!5463!2\x16\x1d\x01!2\x16\x01\xcaJ\xff\x00\xbd\x04\xc3\xff\x00J\x8d\xbd\x80S\x8d\xcdq*5&\x1d=CKu\x12\x0e\xfc\xc0\x0e\x12uKC=\x1d&5*q͍S8(\x01 ^B\x02@B^\x01 (8\x02\x8d\xa2\xd1`N\xa8\xf6`Ѣ\x1d\xa8\u0380G\x90tO\x056)\"M36J[E@\x0e\x12\x12\x0e@E[J63M\")6\x05Ot\x90G\x80(8`B^^B`8\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00,\x002\x00\x81\x00\x91\x00\x00\x016'&\a\x06\x17\x16'&\a\x06\x17\x1676'6'&\a\x06\x17\x16\x176&'&\x06\x17\x16\x176'&\a\x06\x17\x1e\x014#\"\x147&\x06\x17\x166\x014\x00 \x00\x15\x14\x12\x17\x16654'\x0e\x02.\x01'&'.\x03632\x1e\x01\x17\x1e\x0126767.\x03547&76\x16\x1f\x0162\x17>\x02\x17\x16\a\x16\x15\x14\x0e\x03\a\x16\x15\x14\x06\x15\x14\x1676\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\a\x04\a\t\x05\x04\a\t\x17\x05\a\x06\x06\a\x05\x06/\x02\a\a\x01\x03\a\b\x16\x02\x01\x03\x06\b\x05\x06[\x02\v\t\x04\x02\v\t.\f\n=\x02\x16\x02\x02\x14\x02\x82\xfe\xd4\xfeX\xfe\xd4Ě\x12\x11\x01\x06\x134,+\b\x17\"\x02\x05\v\x03\v\x0e\x06\x12*\f\x10+, \x0e\a\x1a1JH'5\x18\x1d\x13G\x19\x1a:\x8c:\v#L\x13\x1d\x185\x1c+@=&#\x01\x11\x12\x9a\xc4\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01P\x06\a\a\x05\x06\a\a.\a\x03\x04\b\b\x03\x041\x04\x04\x02\x04\x05\x03\x02\x13\x01\a\x02\a\b\a\x06G\a\x04\x03\a\a\x04\x03\x04\x10\x10\x0f\a\x04\a\b\x04\x01E\xd4\x01,\xfe\xd4ԧ\xfe\xf54\x03\x10\f4+\x01\x03\x01\t\x1f\x1a;\x0f\x01\x05\v\b\a\x04\x1b\x16\x1c\x1c\a\x06/\x16\x06\x195cFO:>J\x06\x1b\x10\x10\x11\x11\a\x16\x1e\x06J>:O9W5$\x10\x04\x1f@(b\x02\f\x10\x034\x01\v\x02\x87\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x04\x00\x00\xff\x80\x06\x80\x05\xc0\x00\a\x00\x0f\x00'\x00?\x00\x00$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!\x1e\x013!267!2\x16\x01\x06#!\x11\x14\x06#!\"&5\x11!\"'&7\x0162\x17\x01\x16\x05\x00&4&&4\x01&&4&&4\xa68(\xfa@(88(\x01\xab\x15c=\x01\x00=c\x15\x01\xab(8\xfe\xbb\x11*\xff\x00&\x1a\xff\x00\x1a&\xff\x00*\x11\x11\x1f\x01\xc0\x126\x12\x01\xc0\x1f&4&&4&&4&&4&\x01 \xfe\xc0(88(\x01@(88HH88\x02`(\xfe@\x1a&&\x1a\x01\xc0('\x1e\x01\xc0\x13\x13\xfe@\x1e\x00\x00\x00\x00\x02\x00\x00\xff\x80\x05\xff\x05\x80\x001\x00c\x00\x00\x014&'.\x0254654'&#\"\x06#\"&#\"\x0e\x01\a\x06\a\x0e\x02\x15\x14\x16\x15\x14\x06\x14\x1632632\x16327>\x01\x127\x14\x02\x06\a\x06#\"&#\"\x06#\"&54654&54>\x02767632\x1632632\x16\x15\x14\x06\x15\x14\x1e\x02\x17\x1e\x01\x05\u007f\x0e\v\f\n\b\n\n\x04\t\x13N\x14<\xe8;+gC8\x89A`\u007f1\x19\x16\x18\x16\x18a\x199\xe19\xb5g\x81\xd5w\x80\x8c\xfc\x9b|\xca9\xe28\x18a\x19Ie\x16\x19$I\x80VN\x9a\xc2z<\xe7:\x13L\x14QJ\n\x04\x03\f\x02\x10\x12\x02\xc6,\x8b\x1b\x1e\x1c-\x1a\x17[\x16%\x12\x01\t0\x17\x18\x1661I\xe9\xef\x81(\xa0)\x17W,\x1d\x16\x1f$-\xd7\x01\x14\x8b\xa5\xfe\xbb\xfb7,\x1d\x1doI\x18X\x17(\xa1)o\xd5ζA;=N0\neT\x17Z\x17\r\x18\t \x04(\x9d\x00\x00\x01\x00\x00\x00\x00\x05\x80\x05\x80\x00O\x00\x00\x01\x14\x06\a\x06\a\x06#\".\x03'&'&\x00'&'.\x0454767>\x0132\x17\x16\x17\x1e\x02\x17\x1e\x02\x15\x14\x0e\x02\x15\x14\x1e\x02\x17\x1e\x01\x17\x1e\x0332>\x0232\x1e\x01\x17\x1e\x02\x17\x16\x17\x16\x05\x80\x14\v\x15e^\\\x1b4?\x1fP\tbM\u007f\xfe\xeeO0#\x03\x1e\v\x12\a382\x19W\x1b\x0e\a\x12#\v& \x0f\x03\x1d\x0e9C9\n\a\x15\x01Lĉ\x02\"\x0e\x1b\t\x1282<\x14\x0e\x1d*\x04\x199F\x13F\x06\x03\x01(\x1bW\x19283\a\x12\v\x1e\x03#0O\x01\x12\u007fMb\tP\x1f?4\x1b\\^e\x15\v\x14\x03\x06F\x13F9\x19\x04*\x1d\x0e\x14<28\x12\t\x1b\x0e\"\x02\x89\xc4L\x01\x15\a\n9C9\x0e\x1d\x03\x0f &\v#\x12\a\x00\x00\x00\x02\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00\x00\x01!\"\x06\x15\x11\x14\x163!265\x114&\x17\x11\x14\x06#!\"&5\x11463!2\x16\x04`\xfc\xc0B^^B\x03@B^^ީw\xfc\xc0w\xa9\xa9w\x03@w\xa9\x05\x00^B\xfc\xc0B^^B\x03@B^\xa0\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x02\x00\x00\xff\x97\x05\x00\x05\x80\x00\x06\x00#\x00\x00\x01!\x11\x017\x17\x01\x132\x17\x1e\x01\x15\x11\x14\x06\a\x06#\"'\t\x01\x06#\"'.\x015\x1146763\x04\x80\xfc\x00\x01\xa7YY\x01\xa7\f\x17\x15!''!\x13\x190#\xfeG\xfeG$/\x17\x15!''!\x15\x17\x05\x00\xfb&\x01\x96UU\xfej\x05Z\t\r8\"\xfa\xf7\"8\r\b \x01\xa8\xfeX!\t\r8\"\x05\t\"8\r\t\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00W\x00\x00\x014.\x04'.\x02#\"\x0e\x02#\".\x02'.\x01'.\x0354>\x0254.\x01'.\x05#\"\a\x0e\x01\x15\x14\x1e\x04\x17\x16\x00\x17\x1e\x0532676\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x04 1.-\x06\x05\x1c\x16\n\x0f+$)\r\a\x13\f\x16\x03c\x8e8\x02\r\x06\a)1)\n\x14\x03\x03\x18\x1a\x1b\x17\n\v05.D\x05\x05\r\a\x12\x02<\x019\xa4\x060\x12)\x19$\x109\x93\x15\x16\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01W\v\n\x17\x1b\x1a\x18\x03\x03\x14\n)1)\a\x06\r\x027\x8fc\x03\x16\f\x13\a\r)$+\x0f\n\x16\x1c\x05\x06-.1 \x04\x16\x15\x939\x10$\x19)\x120\x06\xa4\xfe\xc7<\x02\x12\a\r\x05\x05D.5\x039\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00,\x00\x00\x06T\x05\x00\x001\x00\x00\x01\x06\a\x16\x15\x14\x02\x0e\x01\x04# '\x16327.\x01'\x16327.\x01=\x01\x16\x17.\x01547\x16\x04\x17&54632\x1767\x06\a6\x06TC_\x01L\x9b\xd6\xfeҬ\xfe\xf1\xe1#+\xe1\xb0i\xa6\x1f!\x1c+*p\x93DNBN,y\x01[\xc6\b\xbd\x86\x8c`m`%i]\x04hbE\x0e\x1c\x82\xfe\xfd\xee\xb7m\x91\x04\x8a\x02}a\x05\v\x17\xb1u\x04&\x03,\x8eSXK\x95\xb3\n&$\x86\xbdf\x159s?\n\x00\x00\x00\x01\x00_\xff\x80\x03\xbf\x06\x00\x00\x14\x00\x00\x01\x11#\"\x06\x1d\x01!\x03#\x11!\x11#\x11!54632\x03\xbf\x9dV<\x01%'\xfe\xfe\xce\xff\x00\xffЭ\x93\x05\xf4\xfe\xf8HH\xbd\xfe\xd8\xfd\t\x02\xf7\x01(ں\xcd\x00\x00\x00\b\x00\x00\xff\xa7\x06\x00\x05\x80\x00T\x00\\\x00d\x00k\x00s\x00z\x00\x82\x00\x88\x00\x00\x00 \x04\x12\x15\x14\x00\a\x06&54654'>\x0454'6'&\x06\x0f\x01&\"\a.\x02\a\x06\x17\x06\x15\x14\x1e\x03\x17\x06\a\x0e\x01\"&'.\x01/\x01\"\x06\x1e\x01\x1f\x01\x1e\x01\x1f\x01\x1e\x03?\x01\x14\x16\x15\x14\x06'&\x0054\x12\x136'&\a\x06\x17\x16\x176'&\a\x06\x17\x16\x176'&\a\x06\x16\x176'&\a\x06\x17\x16\x176'&\x06\x17\x1674\a\"\x15\x14727&\a\x06\x166\x02/\x01\xa2\x01a\xce\xfe\xdb\xe8\x1b\x1a\x0149[aA)O%-\x1cj'&]\xc6]\x105r\x1c-%O)@a[9'\n\x150BA\x17\x13;\x14\x14\x15\x10\x06\f\a\a\x16+\n\n\r>HC\x16\x17\x01\x1a\x1b\xe8\xfe\xdb\xceU\x03\n\n\x03\x03\n\t#\a\t\n\x06\a\t\n$\t\t\b\t\t\x122\b\f\f\b\t\r\fA\x03\x10\x0f\b\x11\x0fC\x11\x10\x11\x10:\x02\x10\x10\x04 \x05\x80\xce\xfe\x9f\xd1\xfb\xfeoM\x05\x18\x12\x03\x93=a-\x06\x186O\x83UwW[q\t(\x18\x18\x1a\x1a\v -\tq[WwU\x82P6\x18\x06$C\n\n+) (\x04\x03\t\x0e\x0e\x05\x05\n8\x17\x17&/\r\x01\x04\x04&e\x04\x12\x18\x05M\x01\x91\xfb\xd1\x01a\xfc\u007f\a\x05\x03\x05\a\x05\x06\x1a\x05\v\t\x06\x05\v\n&\a\f\r\a\x05\x1a$\b\v\f\t\b\v\f\x10\v\x05\x04\x16\x04\x06\a\r\x02\v\r\x02\x15\v\x02\x03\x18\b\x00\x00\x00\x01\x00\x00\x00\x00\x06\x80\x05\x80\x00%\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&\"\x06\x1d\x0132\x16\x15\x11\x14\x06#!\"&5\x11463!54\x00 \x00\x06\x80&\x1a@\x1a&\x96Ԗ`(88(\xfc@(88(\x02\xa0\x01\a\x01r\x01\a\x03\xc0\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xc08(\xfd\xc0(88(\x02@(8\xc0\xb9\x01\a\xfe\xf9\x00\x00\x00\x05\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x00\x19\x00#\x00'\x00+\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x15\"\x06\x1d\x01!54&#\x11265\x11!\x11\x14\x16375!\x1535!\x15\x06\xe0B^^B\xf9\xc0B^^B\r\x13\x06\x80\x13\r\r\x13\xf9\x80\x13\r`\x01\x00\x80\x01\x80\x05\x80^B\xfb@B^^B\x04\xc0B^\x80\x13\r\xe0\xe0\r\x13\xfb\x00\x13\r\x02`\xfd\xa0\r\x13\x80\x80\x80\x80\x80\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\a\x00!\x00=\x00\x00\x00\x14\x06\"&462\x01\x16\a\x06+\x01\"&'&\x00'.\x01=\x01476;\x01\x16\x04\x17\x16\x12\x05\x16\a\x06+\x01\"&'&\x02\x00$'.\x01=\x01476;\x01\f\x01\x17\x16\x12\x01\x80p\xa0pp\xa0\x02p\x02\x13\x12\x1d\x87\x19$\x02\x16\xfe\xbb\xe5\x19!\x15\x11\x1a\x05\xa0\x01$qr\x87\x02\r\x02\x14\x12\x1c\x8f\x1a%\x01\f\xb2\xfe\xe3\xfe}\xd7\x19#\x14\x12\x1a\x03\x01\x06\x01ߺ\xbb\xd6\x01\x10\xa0pp\xa0p\xfe\xc5\x1c\x14\x15!\x19\xe5\x01E\x16\x02$\x19\x87\x1d\x12\x11\r\x87rq\xfeܢ\x1b\x14\x14#\x19\xd7\x01\x83\x01\x1d\xb2\r\x01%\x19\x8f\x1c\x12\x12\rֻ\xba\xfe!\x00\x05\x00\x00\x00\x00\x06\x00\x05\x00\x00\a\x00\x0f\x00\x1f\x00)\x00?\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x17\x114&#!\"\x06\x15\x11\x14\x163!26\x01!\x03.\x01#!\"\x06\a\x01\x11\x14\x06#!\"&5\x1147\x13>\x013!2\x16\x17\x13\x16\x04\x10/B//B\x01//B//B\x9f\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfb2\x04\x9c\x9d\x04\x18\x0e\xfc\xf2\x0e\x18\x04\x04\xb1^B\xfb@B^\x10\xc5\x11\\7\x03\x0e7\\\x11\xc5\x10\x01aB//B//B//B/\xf0\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x01\xed\x01\xe2\r\x11\x11\r\xfd~\xfe\xc0B^^B\x01@\x192\x02^5BB5\xfd\xa22\x00\x02\x00\x00\xff\x83\a\x00\x05\x80\x00.\x004\x00\x00\x012\x16\x14\x06#\x11\x14\x06#\x00%\x0e\x01\x16\x17\x0e\x01\x1e\x02\x17\x0e\x01&'.\x0467#\"&=\x01463! \x012\x16\x15\x03\x11\x00\x05\x11\x04\x06\x805KK5L4\xfe_\xfeu:B\x04&\x14\x06\x121/&\x1d\xa5\xac.\a-\x13\x1b\x03\n\x11zB^^B\x01\xe0\x01\xb3\x01\xcd4L\x80\xfev\xfe\x8a\x01y\x03\x80KjK\xfe\x804L\x01[!\x13^k'!A3;)\x1e:2\x1b*\x17\x81\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\xfdv\x05\x14\xfe\xf60Z\x99\xba\x99Z0\x04\xc0L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x010\x01,\x02\x143lb??bl3\xfd\xec\xfe\xd44Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x00\x01\x00\x02\xff\x80\x05\xfe\x05}\x00I\x00\x00\x01\x17\x16\a\x06\x0f\x01\x17\x16\a\x06/\x01\a\x06\a\x06#\"/\x01\a\x06'&/\x01\a\x06'&?\x01'&'&?\x01'&76?\x01'&76\x1f\x017676\x1f\x0176\x17\x16\x1f\x0176\x17\x16\x0f\x01\x17\x16\x17\x16\a\x05`\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n)\f\a\x1f\x14\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x8a\x8a\x1e\n\f(\xbc5\f\x1f\x1d)\xba0\n))\x1d\x87\x87\x1d))\n0\xba)\x1d\x1f\f5\xbc(\f\n\x1e\x02\x80\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc(\f\x02\x16\x8a\x8a\x1e\n\v)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x87\x87\x1c*)\n0\xba)\x1d\x1f\f5\xbc)\n\f\x1f\x8b\x8b\x1e\v\n)\xbc5\f\x1f\x1d)\xba0\n)*\x1c\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x005\x00h\x00\x00$4&\"\x06\x14\x162\x014&#!4>\x0254&#\"\a\x06\a\x06\a\x06\a\x06+\x01\x1132\x1e\x013254'>\x014'654&'!267\x14\x06+\x01\x06\a\x16\x15\x14\a\x16\x06#\"'&#!\"&5\x11463!2>\x05767>\x0432\x16\x15\x14\a!2\x16\x01\x00&4&&4\x05\xa6N2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5Q\xbd\x05\x1e#\x125\x14\x0f\x01K4L\x80\x97i\xa9\x04!\x03<\x01\xac\x8d\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\xa64&&4&\x02\x803M\x1495S+C=\x8b,\x15@QQ\x199\xfd\x80@@\xa7\x1a\x1e\x10IJ 2E\x19=\x11L5i\x98>9\x15\x16eM\x8b\xa1E;K5\x02\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x005\x00=\x00q\x00\x00%3\x11#\".\x02'&'&'&'.\x04#\"\x06\x15\x14\x1e\x02\x15!\"\x06\x15\x14\x163!\x0e\x01\x15\x14\x17\x06\x14\x16\x17\x06\x15\x14\x1632>\x01$4&\"\x06\x14\x162\x13\x11\x14\x06#!\"\a\x06#\"&?\x01&547&'#\"&5463!&54632\x1e\x03\x17\x16\x17\x1e\x063!2\x16\x05` #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K\x0f\x145\x12#\x1e\x04aWTƾ\x01h&4&&4\xa6K5\xfe\xe0;\xa4\xbe\u007f\x8e\xb0\x01\x01=\x03!\x04\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5K\x80\x02\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L\x11=\x19E2 JI\x10\x18 UR@@&4&&4&\x02\x80\xfd\x805K;E\x9b\x8c\x05Lf\x16\x159>\x98ig\x98R\x157J\x03\x1c\x0f\x1c\x11\x13\tK\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x005\x00h\x00\x00\x044&\"\x06\x14\x162\x134#\"\a.\x01\"\a&#\"\x06\a\x114&#\"\x06\x15\x11\".\x02#\"\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x16\x1d\x01!54>\x017\x14\a\x06\x15\x11\x14\x06#!\"&5\x114.\x05'&'.\x0454632\x17\x114632\x16\x1d\x01\x16\x17632\x176\x16\x05\x00&4&&4\xa6\xa7\x1a\x1e\x10IJ 2E\x19=\x11L43M\x1495S+C=\x8b,\x15@QQ\x199\x02\x80@@\x80E;K5\xfd\x805K\t\x13\x11\x1c\x0f\x1c\x03J7\x15R>@#\x86zD<\x98gi\x98>9\x15\x16eM\x8b\xa1Z4&&4&\x03<\xbd\x05\x1e#\x125\x14\x0f\x01K4LN2\xfd\xc0\x1e$\x1eYG\x18B\x18\r(HG\x1eEG H\xbe\xc5V\x85\xbd\xa4;\xfe\xe05KK5\x01 \n\x17\x18\x15\x1b\x0e\x18\x02A#\r(\"/?&}\xa3\x16\x01vh\x98\x97i\xa9\x04!\x03<\x01\xac\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x004\x00<\x00p\x00\x00\x014.\x01=\x01!\x15\x14\x0e\x02\a\x06\a\x06\a\x06\a\x0e\x04\x15\x14\x1632>\x023\x11\x14\x163265\x11\x16327\x16267\x16326\x024&\"\x06\x14\x162\x01\x14\x06/\x01\x06#\"'\x06\a\x15\x14\x06#\"&5\x11\x06#\"&54>\x03767>\x065\x11463!2\x16\x15\x11\x14\x17\x16\x05\x80@@\xfd\x80\x182*!\t\x05Q@\x16.\x03'!&\x17=C+S59\x14M34L.9E2 JI\x10\x18 UR\x80&4&&4\x01&\x9b\x8c\x05Lf\x16\x156A\x98ig\x986Jy\x87#@>R\x157J\x03\x1c\x0f\x1c\x11\x13\tK5\x02\x805K;E\x02@TƾH #A<(\x1d\b\x04H(\x0e\x18\x01\x13\x12\x16\x15\bGY\x1e$\x1e\xfd\xc02NL4\x01K#5\x12#\x1e\x04a\x03=4&&4&\xfdD\x8e\xb0\x01\x01=\x03\x1e\a\xa9i\x97\x98h\x01v\x16\xa3}&?/\"(\r#A\x02\x18\x0e\x1b\x15\x18\x17\n\x01 5KK5\xfe\xe0;\xa4\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x0154&#!764/\x01&\"\a\x01\a\x06\x14\x1f\x01\x01\x162?\x0164/\x01!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x00&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x126\x12[\x12\x12\xbd\x01\xf6\x1a&\x01\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02@\x80\x1a&\xbd\x134\x13[\x12\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x01+\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01\x01&\"\x0f\x01\x06\x14\x1f\x01!\"\x06\x1d\x01\x14\x163!\a\x06\x14\x1f\x01\x1627\x017$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x05\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\x126\x12\x01j[\x01\r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02e6\x12[\x01j\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\xfe\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004'\x01'&\"\x0f\x01\x01\x06\x14\x1f\x01\x162?\x01\x11\x14\x16;\x01265\x11\x17\x162?\x01$\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12\xfe\x96[\x126\x12[\xfe\x96\x12\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02f6\x12\x01j[\x12\x12[\xfe\x96\x126\x12[\x12\x12\xbd\xfe\n\x1a&&\x1a\x01\xf6\xbd\x13\x13[\xfd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00+\x00\x00\x004/\x01&\"\x0f\x01\x114&+\x01\"\x06\x15\x11'&\"\x0f\x01\x06\x14\x17\x01\x17\x162?\x01\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x05\x04\x12[\x126\x12\xbd&\x1a\x80\x1a&\xbd\x134\x13[\x12\x12\x01j[\x126\x12[\x01j\x01\x0e\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02d6\x12[\x12\x12\xbd\x01\xf6\x1a&&\x1a\xfe\n\xbd\x13\x13[\x126\x12\xfe\x96[\x12\x12[\x01j\x00\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x01\xd8\x02\x18\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x01\x0e\x01\a2>\x01767676\x17&67>\x01?\x01\x06&'\x14\a4&\x06'.\x02'.\x01'.\x03\"\x0e\x01#&\x0e\x02\a\x0e\x01\a6'&\a6&'3.\x02'.\x01\a\x06\x1e\x01\x15\x16\x06\x15\x14\x16\a\x0e\x01\a\x06\x16\x17\x16\x0e\x02\x0f\x01\x06&'&'&\a&'&\a6'&\a>\x01567>\x02#\x167>\x0176\x1e\x013\x166'\x16'&'&\a\x06\x17&\x0e\x01'.\x01'\"\a6&'6'.\x01\a\x0e\x01\x1e\x02\x17\x16\a\x0e\x02\a\x06\x16\a.\x01'\x16/\x01\"\x06&'&76\x17.\x01'\x06\a\x167>\x0176\x177\x16\x17&\a\x06\a\x16\a.\x02'\"\a\x06\a\x16\x17\x1e\x027\x16\a6\x17\x16\x17\x16\a.\x01\a\x06\x167\"\x06\x14\a\x17\x06\x167\x06\x17\x16\x17\x1e\x02\x17\x1e\x01\x17\x06\x16\a\"\x06#\x1e\x01\x17\x1e\x0276'&'.\x01'2\x1e\x02\a\x06\x1e\x02\x17\x1e\x01#2\x16\x17\x1e\x01\x17\x1e\x03\x17\x1e\x01\x17\x162676\x16\x17\x167\x06\x1e\x02\x17\x1e\x01\x1767\x06\x16765\x06'4.\x026326&'.\x01'\x06&'\x14\x06\x15\"'>\x017>\x03&\a\x06\a\x0e\x02\a\x06&'.\x0154>\x01'>\x017>\x01\x1667&'&#\x166\x17\x1674&7\x167\x1e\x01\x17\x1e\x0267\x16\x17\x16\x17\x16>\x01&/\x0145'.\x0167>\x0276'27\".\x01#6'>\x017\x1676'>\x017\x16647>\x01?\x016#\x1676'6&'6\x1676'&\x0367.\x01'&'6.\x02'.\x03\x06#\a\x0e\x03\x17&'.\x02\x06\a\x0e\x01\a&6'&\x0e\x04\a\x0e\x01\a.\x015\x1e\x01\x17\x16\a\x06\a\x06\x17\x14\x06\x17\x14\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03D\x02\x0f\x06\x02\x05\x05\x01\x06\x10\x0e&\"\x11\x02\x17\x03\x03\x18\x03\x02\f\v\x01\x06\t\x0e\x02\n\n\x06\x01\x02\x0f\x02\x01\x03\x03\x05\x06\b\a\x01\x03\x06\x03\x06\x02\x03\v\x03\x0f\x10\n\x06\t\x03\a\x05\x01\x0f\x14\x03\b4\a\x05\x01\a\x01\r\x1c\x04\x03\x1a\x03\x05\a\a\x02\x01\x06\x05\x04\x03\v\x13\x04\a\t\x17\x06\x05$\x19!\x06\x06\a\f\x03\x02\x03\t\x01\f\a\x03#\x0f\x05\r\x04\t\n\x13\x05\x0e\x03\t\f\t\x04\x04\f\x0f\b\n\x01\x11\x10\b\x01\t\x05\b\b\x03\x1c\n\x13\x1b\a\x1b\x06\x05\x01\v\n\r\x02\x0e\x06\x02\r\n\x01\x03\x06\x05\x05\b\x03\a \n\x04\x18\x11\x05\x04\x04\x01\x03\x04\x0e\x03.0\x06\x06\x05\x10\x02\"\b\x05\x0e\x06\a\x17\x14\x02\a\x02\x04\x0f\x0e\b\x10\x06\x92Y\a\x05\x04\x02\x03\n\t\x06\x01+\x13\x02\x03\r\x01\x10\x01\x03\a\a\a\x05\x01\x02\x03\x11\r\r!\x06\x02\x03\x12\f\x04\x04\f\b\x02\x17\x01\x01\x03\x01\x03\x19\x03\x01\x02\x04\x06\x02\x1a\x0f\x02\x03\x05\x02\x02\b\t\x06\x01\x03\n\x0e\x14\x02\x06\x10\b\t\x16\x06\x05\x06\x02\x02\r\f\x14\x03\x05\x1b\b\n\f\x11\x05\x0f\x1c\a$\x13\x02\x05\v\a\x02\x05\x1a\x05\x06\x01\x03\x14\b\x0e\x1f\x12\x05\x03\x02\x02\x04\t\x02\x06\x01\x01\x14\x02\x05\x16\x05\x03\r\x02\x01\x03\x02\x01\t\x06\x02\v\f\x13\a\x01\x04\x06\x06\a\"\a\r\x13\x05\x01\x06\x03\f\x04\x02\x05\x04\x04\x01\x01\x03\x03\x01\a+\x06\x0f\a\x05\x02\x05\x18\x03\x19\x05\x03\b\x03\a\x05\n\x02\v\b\a\b\x01\x01\x01\x01\x01\x0f\a\n\n\x01\x0e\x11\x04\x15\x06\a\x04\x01\b\a\x01\t\a\x05\x05\x05\t\f\b\a\x05\x1f\x03\a\x02\x03\x04\x16\x02\x11\x03\x03\x12\r\n\x10\x03\f\t\x03\x11\x02\x0f\x16\x11\xbdΑ\x03\x13\x03\x12\x06\x01\a\t\x10\x03\x02\n\x04\v\x06\a\x03\x03\x05\x06\x02\x01\x15\x0f\x05\f\t\v\x06\x05\x02\x01\a\x0e\x05\x03\x0f\t\x0e\x04\r\x02\x03\x06\x02\x02\x13\x02\x04\x03\a\x13\x1b\x02\x04\x10\x10\x01\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfe\xc5\x01\x11\x01\n\f\x01\a\b\x06\x06\b\x13\x02\x16\x01\x02\x05\x05\x16\x01\x10\r\x02\x06\a\x02\x04\x01\x03\t\x18\x03\x05\f\x04\x02\a\x06\x05\n\n\x02\x01\x01\x05\x01\x02\x02\x01\x05\x06\x04\x01\x04\x10\x06\x04\t\b\x02\x05\t\x04\x06\t\x13\x03\x06\x0e\x05\a\x11\r\b\x10\x04\b\x15\x06\x02\x04\x05\x03\x02\x02\x05\x16\x0f\x19\x05\b\t\r\r\t\x05\x01\x0e\x0f\x03\x06\x17\x02\r\n\x01\x0f\f\x04\x0f\x05\x18\x05\x06\x01\n\x01\x18\b\x01\x12\a\x02\x04\t\x04\x04\x01\x17\f\v\x01\x19\x01\x0f\b\x0e\x01\f\x0f\x04\x02\x05\a\t\a\x04\x04\x01\n\x04\x01\x05\x04\x02\x04\x14\x04\x05\x19\x04\t\x03\x01\x04\x02\a\b\f\x04\x02\x03\r\x02\x0f\x1a\x01\x02\x02\t\x01\x0e\a\x05\x10\t\x04\x03\x06\x06\f\x06\x03\x0e\b\x01\x01P\x8e\a\x01\x01\x10\x06\x06\b\v\x01\x1c\x11\x04\v\a\x02\x0e\x03\x05\x1b\x01 '\x04\x01\f-\x03\x03(\b\x01\x02\v\t\x06\x05#\x06\x06\x1c\t\x02\a\x0e\x06\x03\x0e\b\x02\x14*\x19\x04\x05\x15\x04\x03\x04\x04\x01\a\x15\x10\x16\x02\x06\x1b\x15\t\b$\x06\a\r\x06\n\x02\x02\x11\x03\x04\x05\x01\x02\"\x04\x13\b\x01\r\x12\v\x03\x06\x12\x06\x04\x05\b\x18\x02\x03\x1d\x0f!\x01\t\b\t\x06\a\x12\x04\b\x18\x03\t\x02\b\x01\t\x02\x01\x03\x1d\b\x04\x10\r\f\a\x01\x01\x13\x03\x0f\b\x03\x03\x02\x04\b*\x10\n!\x11\x10\x02\x0f\x03\x01\x01\x01\x04\x04\x01\x02\x03\x03\t\x06\v\r\x01\x11\x05\x1b\x12\x03\x04\x03\x02\a\x02\x03\x05\x0e\n(\x04\x03\x02\x11\v\a\b\t\t\b\x03\x12\x13\t\x01\x05\b\x04\x13\x10\t\x06\x04\x05\v\x03\x10\x02\f\n\b\b\a\a\x06\x02\b\x10\x04\x05\b\x01\v\x04\x02\r\v\t\x06\a\x02\x01\x01\x02\n\x06\x05\xfc\x82$\x99\x03\x03\x02\a\x01\a\f\x06\n\x02\x02\b\x03\x06\x02\x01\x01\x03\x03\x03\x01\x11\x05\x01\t\x05\x02\x06\x05\x14\x03\x05\x19\x06\x06\x03\x06\v\x02\t\x03\x04\x10\x03\x04\x05\x03\n2\r\x1f\x11\x19\x0f\x16\x04\a\x1b\b\x06\x00\x00\x03\x00\x15\xff\x15\x06~\x05\x80\x00\a\x00\x15\x00/\x00\x00$4&\"\x06\x14\x162\t\x01\x06#\"/\x01&547\x01\x1e\x01\x01\x14\a\x0e\x01#\"\x00\x10\x0032\x16\x17\x16\x14\a\x05\x15\x17>\x0232\x16\x01\x80&4&&4\x02\xaa\xfdV%54'j&&\x02\xa9'\x97\x02\xdc\x17/덹\xfe\xf9\x01\a\xb9:\u007f,\x10\x10\xfe\xdb\xc1\x05\x94{\t\x0f\x11&4&&4&\x01\xe4\xfdV%%l$65&\x02\xa9b\x97\x01\x8c'C\x86\xa7\x01\a\x01r\x01\a!\x1e\v\"\v\xa9\xe0k\x03[G\x14\x00\x00\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x1b\x00+\x00;\x00\x00%!5!\x01!5!\x01!5!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x19\x01\x14\x06#!\"&5\x11463!2\x16\x04\x00\x02\x80\xfd\x80\xfe\x80\x04\x00\xfc\x00\x02\x80\x01\x80\xfe\x80\x02\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\x80\x80\x01\x80\x80\x01\x80\x80\xfc@\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x01\xe6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x01\x00\x05\xff\x80\x05{\x05\x00\x00\x15\x00\x00\x01\x16\a\x01\x11\x14\a\x06#\"'\x01&5\x11\x01&763!2\x05{\x11\x1f\xfe\x13'\r\f\x1b\x12\xff\x00\x13\xfe\x13\x1f\x11\x11*\x05\x00*\x04\xd9)\x1d\xfe\x13\xfd\x1a*\x11\x05\x13\x01\x00\x13\x1a\x01\xe6\x01\xed\x1d)'\x00\x00\x00\x04\x00\x00\x00\x00\a\x00\x06\x00\x00\x03\x00\x17\x00\x1b\x00/\x00\x00\x01!5!\x01\x11\x14\x06#!\"&5\x11!\x15\x14\x163!26=\x01#\x15!5\x01\x11!\x11463!5463!2\x16\x1d\x01!2\x16\x02\x80\x02\x00\xfe\x00\x04\x80^B\xfa@B^\x02\xa0&\x1a\x01@\x1a&`\xff\x00\x04\x00\xf9\x00^B\x01`8(\x02@(8\x01`B^\x05\x00\x80\xfd\x00\xfe B^^B\x01\xe0\xa0\x1a&&\x1a\xa0\x80\x80\x01\xe0\xfe\x80\x01\x80B^\xa0(88(\xa0^\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00G\x00\x00\t\x0276\x17\x16\x15\x11\x14\x06#!\"'&?\x01\t\x01\x17\x16\a\x06#!\"&5\x11476\x1f\x01\t\x01\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\t\x01'&763!2\x16\x15\x11\x14\a\x06#\"'\x05\x03\xfe\x9d\x01c\x90\x1d)'&\x1a\xfe@*\x11\x11\x1f\x90\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x13\x1a\f\f(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x1f\x11\x11*\x01\xc0\x1a&'\r\f\x1a\x13\x03\xe3\xfe\x9d\xfe\x9d\x90\x1f\x11\x11*\xfe@\x1a&('\x1e\x90\x01c\xfe\x9d\x90\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x90\x01c\x01c\x90\x13\x05\x11*\x01\xc0\x1a&('\x1e\x90\xfe\x9d\x01c\x90\x1e'(&\x1a\xfe@*\x11\x05\x13\x00\x00\x06\x00\x00\xff\x00\a\x80\x06\x00\x00\x11\x001\x009\x00A\x00S\x00[\x00\x00\x01\x06\a#\"&5\x1032\x1e\x01327\x06\x15\x14\x01\x14\x06#!\"&54>\x0532\x1e\x022>\x0232\x1e\x05\x00\x14\x06\"&462\x00\x10\x06 &\x106 \x01\x14\x06+\x01&'654'\x1632>\x0132\x02\x14\x06\"&462\x02Q\xa2g\x86Rp|\x06Kx;CB\x05\x04\x80\x92y\xfc\x96y\x92\a\x15 6Fe=\nBP\x86\x88\x86PB\n=eF6 \x15\a\xfc\x00\x96Ԗ\x96\xd4\x03V\xe1\xfe\xc2\xe1\xe1\x01>\x03!pR\x86g\xa2Q\x05BC;xK\x06|\x80\x96Ԗ\x96\xd4\x02\x80\x05{QN\x01a*+\x17%\x1d\x8b\xfd\x0ex\x8b\x8bx5eud_C(+5++5+(C_due\x052Ԗ\x96Ԗ\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\xfd\x9fNQ{\x05u\x8b\x1d%\x17+*\x01jԖ\x96Ԗ\x00\x00\x00\x00\x03\x00\x10\xff\x90\x06p\x05\xf0\x00!\x00C\x00i\x00\x00\x014/\x01&#\"\a\x1e\x04\x15\x14\x06#\".\x03'\x06\x15\x14\x1f\x01\x1632?\x016\x014/\x01&#\"\x0f\x01\x06\x15\x14\x1f\x01\x16327.\x0454632\x1e\x03\x176\x00\x14\x0f\x01\x06#\"/\x01&547'\x06#\"/\x01&4?\x01632\x1f\x01\x16\x15\x14\a\x17632\x1f\x01\x05\xb0\x1c\xd0\x1c(*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x1c\xce\x1b)(\x1c\x93\x1c\xfdA\x1c\xce\x1c('\x1d\x93\x1c\x1c\xd0\x1b)*\x1e\x03 \v\x13\a8(\x0f\x19\x1a\f\x1f\x03!\x03\u007fU\x93SxyS\xceSXXVzxT\xd0TU\x93SxyS\xceSXXVzxT\xd0\x01@(\x1c\xd0\x1c \x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f*(\x1c\xcf\x1b\x1a\x92\x1c\x02\xe8(\x1c\xcf\x1c\x1b\x92\x1c'(\x1c\xd0\x1b\x1f\x03\x1f\f\x1a\x19\x0f(8\a\x13\v \x03\x1f\xfd\xe1\xf0S\x92SU\xcfSx{VXXT\xd0T\xf0S\x92SU\xcfSx{VXXT\xd0\x00\x01\x00\x00\x00\x00\a\x80\x05\x80\x00\x1b\x00\x00\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\a\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8et\x02\x01,Ԟ\x01\x01;F`j\x96)\x81\xa8\x01\x80\x9f\xe1\x01\a\xb9\x84\xdb6\x1c\x0f\xd4\x01,\xb0\x8e>\x96jK?\x1e\xd1\x00\x02\x00s\xff\x80\x06\r\x05\x80\x00\x17\x00!\x00\x00%\x16\x06#!\"&7\x01\x11#\"&463!2\x16\x14\x06+\x01\x11\x05\x01!\x01'5\x11#\x11\x15\x05\xf78Ej\xfb\x80jE8\x01\xf7@\x1a&&\x1a\x02\x00\x1a&&\x1a@\xfe\xec\xfe\xf0\x02\xc8\xfe\xf0\x14\x80XY\u007f\u007fY\x03\x19\x01\x8f&4&&4&\xfeqD\xfeS\x01\xad\x1f%\x01\x8f\xfeq%\x00\x00\x00\x00\a\x00\x01\xff\x80\a\x00\x05\x00\x00\a\x00N\x00\\\x00j\x00x\x00\x86\x00\x8c\x00\x00\x002\x16\x14\x06\"&4\x05\x01\x16\a\x06\x0f\x01\x06#\"'\x01\a\x06\a\x16\a\x0e\x01\a\x06#\"'&7>\x017632\x176?\x01'&'\x06#\"'.\x01'&67632\x17\x1e\x01\x17\x16\a\x16\x1f\x01\x01632\x1f\x01\x16\x17\x16\a\x056&'&#\"\a\x06\x16\x17\x1632\x03>\x01'&#\"\a\x0e\x01\x17\x1632\x01\x1754?\x01'\a\x0e\x01\a\x0e\x01\a\x1f\x01\x01'\x01\x15\a\x17\x16\x17\x1e\x01\x1f\x01\x017\x01\a\x06\a\x03\xa64&&4&\x01l\x01\xfb\x1c\x03\x05\x1e\x80\r\x10\x11\x0e\xfdNn\b\x04\x0e\x04\abS\x84\x91\x88VZ\v\abR\x84\x92SD\t\rzz\r\tDS\x92\x84Rb\a\x05)+U\x89\x91\x84Sb\a\x04\x0e\x04\bn\x02\xb2\x0e\x11\x10\r\x80\x1e\x05\x03\x1c\xfb\\.2Q\\dJ'.2Q\\dJ.Q2.'Jd\\Q2.'Jd\x01\x0e`!\x0eO\x1a\x03\x0e\x05\x02\x04\x01\xd7`\x02\xe0\x80\xfd\x00\xa0\t\x02\x05\x04\x0e\x04\x1a\x03`\x80\xfd\xf8\xb1\x02\v\x02\x80&4&&4\x1a\xfer\x14$#\x10@\a\b\x01\x83B\x04\x0110M\x8d5TNT{L\x8e5T\x1f\r\tII\t\r\x1fT5\x8eL;l'OT4\x8eM01\x01\x04B\x01\x83\b\a@\x10#$\x14\x8a*\x843;$*\x843;\xfd;3\x84*$;3\x84*$\x02\xa0:\v$\x14\b/\x1a\x03\x10\x04\x02\x03\x01\xe9 \x02@@\xfeQq`\b\x02\x04\x04\x10\x04\x1a\xfe\xc0@\x01\x98\x8a\x03\x04\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00\"\x00%\x003\x00<\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11!\"&5\x11467\x01>\x013!2\x16\x15\x1163\a\x01!\t\x01!\x13\x01\x11!\x11\x14\x06#!\x11!\x1146\x01\x11!\x11\x14\x06#!\x11\x06\xa0(88(\xfc@(8\xfd\xe0(8(\x1c\x01\x98\x1c`(\x01\xa0(8D<\x80\xfe\xd5\x01+\xfd\x80\xfe\xd5\x01+\xc4\x01<\xfe\x808(\xfe`\x02\x00(\x03\xd8\xfe\x808(\xfe`\x04\x808(\xfb@(88(\x01 8(\x02\xa0(`\x1c\x01\x98\x1c(8(\xfe\xb8(\xd5\xfe\xd5\x02\xab\xfe\xd5\xfe\xa4\x01<\x01\xa0\xfe`(8\xfd\x80\x01\x00(`\xfc\xf8\x04\x80\xfe`(8\xfd\x80\x00\x00\x00\x01\x00\x04\xff\x84\x05|\x05|\x00?\x00\x00%\x14\x06#\"'\x01&54632\x17\x01\x16\x15\x14\x06#\"'\x01&#\"\x06\x15\x14\x17\x01\x1632654'\x01&#\"\x06\x15\x14\x17\x01\x16\x15\x14\x06#\"'\x01&54632\x17\x01\x16\x05|\x9eu\x87d\xfc\xf7qܟ\x9es\x02]\n=\x10\r\n\xfd\xa2Ofj\x92L\x03\b?R@T?\xfd\xbb\x1a\"\x1d&\x19\x01\x9a\n>\x10\f\n\xfef?rRX=\x02Ed\x97u\x9ed\x03\bs\x9c\x9f\xdeq\xfd\xa2\n\f\x10=\n\x02_M\x96jiL\xfc\xf7?T@R?\x02E\x18&\x1d \x1b\xfef\n\f\x10>\n\x01\x9a=XRr?\xfd\xbbb\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00!\x001\x00E\x00\x00)\x01\x11!\x013\x114&'\x01.\x01#\x11\x14\x06#!\"&5\x11#\x113\x11463!2\x16\x15\x01\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x05\x11\x14\x06#!\"&5\x11463!2\x16\x17\x01\x1e\x01\x01\x80\x03\x00\xfd\x00\x03\x80\x80\x14\n\xfe\xe7\n0\x0f8(\xfd\xc0(8\x80\x808(\x03@(8\xfe\x80\x13\r\xc0\r\x13\x13\r\xc0\r\x13\x02\x808(\xfa\xc0(88(\x03\xa0(`\x1c\x01\x18\x1c(\x01\x80\xfe\x80\x03\x80\x0e1\n\x01\x19\n\x14\xfe`(88(\x01\xa0\xfb\x00\x01\xa0(88(\x02\x00\x01@\r\x13\x13\r\xfe\xc0\r\x13\x13\x13\xfc`(88(\x05@(8(\x1c\xfe\xe8\x1c`\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x00\x01\x11\x14\x06#!\"&5\x11463!2\x16\x06\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x04`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x05\x00\x00\x0f\x00\x1f\x00/\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x06\x00&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x01\xe6\x80\x1a&&\x1a\x80\x1a&&\x00\x06\x00\x00\xff\xc0\a\x00\x05@\x00\a\x00\x0f\x00\x1f\x00'\x007\x00G\x00\x00$\x14\x06\"&462\x12\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x00\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01\x80p\xa0pp\xa0pp\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\xfa\x80p\xa0pp\xa0\x05\xf0\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13Рpp\xa0p\x01\x90\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x03\xe3\xa0pp\xa0p\xfd\xa0\xc0\r\x13\x13\r\xc0\r\x13\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x06\x00\x0f\xff\x00\a\x00\x05\xf7\x00\x1e\x00<\x00L\x00\\\x00l\x00|\x00\x00\x05\x14\x06#\"'7\x1632654\a'>\x0275\"\x06#\x15#5!\x15\a\x1e\x01\x13\x15!&54>\x0354&#\"\a'>\x0132\x16\x15\x14\x0e\x02\a35\x01\x15\x14\x06#!\"&=\x01463!2\x16\x01\x15!5346=\x01#\x06\a'73\x11\x01\x15\x14\x06#!\"&=\x01463!2\x16\x11\x15\x14\x06#!\"&=\x01463!2\x16\x01}mQjB919\x1d+i\x1a\b1$\x13\x10A\x10j\x01M_3<\x02\xfe\x96\x06/BB/\x1d\x19.#U\x18_:IdDRE\x01\u007f\x05\xea\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\xfa\x80\xfe\xb1k\x01\x02\b*G\x88j\x05\xec\x13\r\xfb@\r\x13\x12\x0e\x04\xc0\r\x13\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13TP\\BX-\x1d\x1c@\b8\nC)\x12\x01\x025\x98Xs\fJ\x02@\x9f$\x123T4+,\x17\x19\x1b:;39SG2S.7\x19<\xfe\xc1\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x03vcc)\xa1)\f\x11%L\u007f\xfel\xfe}\xc0\r\x13\x13\r\xc0\x0e\x12\x13\x01\xf3\xc0\r\x13\x13\r\xc0\r\x13\x13\x00\x00\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00\x0f\x005\x00e\x00\x00\x012\x16\x1d\x01\x14\x06#!\"&=\x01463%&'&5476!2\x17\x16\x17\x16\x17\x16\x15\x14\x0f\x01/\x01&'&#\"\a\x06\x15\x14\x17\x16\x17\x16\x17\x16\x17\x03!\x16\x15\x14\a\x06\a\x06\a\x06\a\x06#\"/\x01&'&=\x014'&?\x0157\x1e\x02\x17\x16\x17\x16\x17\x1632767654'&\x06\xe0\x0e\x12\x12\x0e\xf9@\x0e\x12\x12\x0e\x01\xc3\x1c\x170\x86\x85\x01\x042uBo\n\v\x0e\x05\fT\x0e25XzrDCBB\xd5Eh:%\xec\x01\x9b\a)\x170%HPIP{rQ\x8c9\x0f\b\x02\x01\x01\x02f\x0f\x1e\x0f\x05#-+>;I@KM-/Q\"\x02\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12@#-bZ\xb5\x80\u007f\x13\f$&P{<\x12\x1b\x03\x06\x02\x958[;:XICC>\x14.\x1c\x18\xff\x00'5oe80#.0\x12\x15\x17(\x10\f\b\x0e\rl0\x1e&%,\x02\"J&\b9%$\x15\x16\x1b\x1a<=DTI\x1d\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00c\x00s\x00\x00\x13&/\x01632\x17\x163276727\a\x17\x15\x06#\"\a\x06\x15\x14\x16\x15\x17\x13\x16\x17\x16\x17\x16327676767654.\x01/\x01&'&\x0f\x01'73\x17\x167\x17\x16\x15\x14\a\x06\a\x06\a\x06\x15\x14\x16\x15\x16\x13\x16\a\x06\a\x06\a\x06\a\x06#\"'&'&'&5\x114'&\x0154&#!\"\x06\x1d\x01\x14\x163!260%\b\x03\r\x1b<4\x84\"VRt\x1e8\x1e\x01\x02<@<\x13\r\x01\x01\x0e\x06-#=XYhW8+0\x11$\x11\x15\a\x0f\x06\x04\x05\x13\"+d\x0e\x02T\xcdLx\x12\x06\x04-'I\x06\x0f\x03\b\x0e\x06\x15\x0f\x1a&JKkm\x92\xa7uw<=\x16\x10\x11\x19\x05V\x12\x0e\xfa@\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x05!\x02\x02X\x01\x04\a\x03\x04\x01\x02\x0e@\t\t\x19\x0ev\r'\x06\xe5\xfe\xe8|N;!/\x1c\x12!$\x1c8:I\x9cOb\x93V;C\x15#\x01\x02\x03V\n\x03\r\x02&\r\a\x18\f\x01\v\x06\x0f\x1a\a(\v\x13\xfe\x87\xc3mL.A:9 !./KLwP\x9d\x01M\xbc\x19$\xfa\x82@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\n\x00\x00\x00\x00\x06\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%54&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\xfe\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x80^B\xfa\xc0B^^B\x05@B^\xa0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x03\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfe\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01N\xfb\xc0B^^B\x04@B^^\x00\x00\x00\x06\x00\x1b\xff\x9b\x06\x80\x06\x00\x00\x03\x00\x13\x00\x1b\x00#\x00+\x003\x00\x00\t\x01'\x01$\x14\a\x01\x06\"/\x01&47\x0162\x1f\x01%\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x01\x17\x0f\x01/\x01?\x01\x04\xa6\x01%k\xfe\xdb\x02*\x12\xfa\xfa\x126\x12\xc6\x12\x12\x05\x06\x126\x12\xc6\xfa\xcbbb\x1e\x1ebb\x1e\x01|\xc4\xc4<<\xc4\xc4<\x03\xdebb\x1e\x1ebb\x1e\xfd\x9ebb\x1e\x1ebb\x1e\x03\xbb\x01%k\xfe\xdb\xd56\x12\xfa\xfa\x12\x12\xc6\x126\x12\x05\x06\x12\x12Ƒ\x1e\x1ebb\x1e\x1eb\xfe\xfc<<\xc4\xc4<<\xc4\xfd^\x1e\x1ebb\x1e\x1eb\x02\x1e\x1e\x1ebb\x1e\x1eb\x00\x00\x00\x04\x00@\xff\x80\a\x00\x05\x00\x00\a\x00\x10\x00\x18\x00M\x00\x00$4&\"\x06\x14\x162\x01!\x11#\"\x0f\x01\x06\x15\x004&\"\x06\x14\x162\x01\x11\x14\x0e\x04&#\x14\x06\"&5!\x14\x06\"&5#\"\x06.\x045463\x114&>\x03?\x01>\x01;\x015463!2\x16\x02\x80LhLLh\xfe\xcc\x01\x80\x9e\r\t\xc3\t\x05\x00LhLLh\x01L\b\x13\x0e!\f'\x03\x96Ԗ\xfe\x80\x96Ԗ@\x03'\f!\x0e\x13\b&\x1a\x01\x01\x04\t\x13\r\xc6\x13?\x1b\xa0&\x1a\x04\x00\x1a&LhLLhL\x02\x80\x01\x00\t\xc3\t\r\xfd\xaehLLhL\x04\xc0\xfc\x00\x0f\x17\x0e\t\x03\x01\x01j\x96\x96jj\x96\x96j\x01\x01\x03\t\x0e\x17\x0f\x1a&\x01@\b6\x16/\x1b\"\r\xc6\x13\x1a\xc0\x1a&&\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00J\x00\x00\x00\x10\x02\x04#\"'6767\x1e\x0132>\x0154.\x01#\"\x0e\x03\x15\x14\x16\x17\x167>\x0176'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17&\x0254\x12$ \x04\x06\x00\xce\xfe\x9f\xd1ok;\x13\t-\x14j=y\xbehw\xe2\x8ei\xb6\u007f[+PM\x1e\b\x02\f\x02\x06\x113ѩ\x97\xa9\x89k=J\x0e\b%\x1762>V\x19c\x11\x04\xce\xfe\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce ]G\"\xb1'9\x89\xf0\x96r\xc8~:`}\x86Ch\x9e \f \a0\x06\x17\x14=Z\x97٤\x83\xaa\xeeW=#uY\x1f2BrUI1\xfe^Fk[\x01|\xe9\xd1\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00L\x00\x00\x012\x16\x15\x11\x14\x06#!6767\x1e\x0132\x1254.\x02#\"\x0e\x03\x15\x14\x16\x17\x1667676'&54632\x16\x15\x14\x06#\"&7>\x0254&#\"\x06\x15\x14\x17\x03\x06\x17#\"&5\x11463\x04\xe0w\xa9\xa9w\xfd+U\x17\t,\x15i<\xb5\xe5F{\xb6jh\xb5}Z+OM\r\x15\x04\n\x05\x06\x112ϧ\x95\xa7\x87jX\x96բ\x81\xa8\xecW<\"uW\x1f1AqSH1\xfebd\x9a\xa9w\x03\xc0w\xa9\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1b\x00'\x007\x00\x00\x014'!\x153\x0e\x03#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x95\x06\xfe\x96\xd9\x03\x1b0U6c\x8c\x8cc\\=hl\x95\xa0\xe0ࠥ\xcb\x01Ymmnnnn\x01\x12\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02w\x1a&\x84\x1846#\x8eȎ;ed\xe1\xfe\xc2\xe1\xd2wnnnnn\x02\x85\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x02\x00\x00\xff\xa3\t\x00\x05]\x00#\x00/\x00\x00\x01\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x14\x1e\x0132>\x037!5!\x16%\x15#\x15#5#5353\x15\x05\x9d\xae\xfe\xbeЕ\xfe\xf0\xc4tt\xc4\x01\x10\x95\x01\x1e\xcd\xc7u\xaf{\xd1zz\xd1{S\x8bZC\x1f\x06\xfe`\x02\xb4\f\x03c\xd1\xd2\xd1\xd1\xd2\x02o\xd0\xfe\xbb\xb7t\xc4\x01\x10\x01*\x01\x10\xc4t\xc0\xbfq|\xd5\xfc\xd5|.EXN#\xfc??\xd2\xd1\xd1\xd2\xd1\xd1\x00\x00\x00\x04\x00\x00\x00\x00\a\x80\x05\x00\x00\f\x00\x1c\x00,\x00<\x00\x00\x01!5#\x11#\a\x17673\x11#$\x14\x0e\x02\".\x024>\x022\x1e\x01\x01\x11\"&5!\x14\x06#\x112\x16\x15!46\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x00\x01\x80\x80r\x94M*\r\x02\x80\x02\x00*M~\x96~M**M~\x96~M\x02*j\x96\xfb\x80\x96jj\x96\x04\x80\x96\xea&\x1a\xf9\x00\x1a&&\x1a\a\x00\x1a&\x01\x80`\x01\xc0\x89P%\x14\xfe\xe0挐|NN|\x90\x8c\x90|NN|\xfe*\x02\x00\x96jj\x96\xfe\x00\x96jj\x96\x03@\xfb\x80\x1a&&\x1a\x04\x80\x1a&&\x00\x00\x01\x00\x00\x01@\x04\x00\x03\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x03Z4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x01\x00\x04\x00\x03@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00@\x00\x80\x02\x80\x04\x80\x00\r\x00\x00\x01\x11\x14\x06\"'\x01&47\x0162\x16\x02\x80&4\x13\xfe@\x13\x13\x01\xc0\x134&\x04@\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x13&\x00\x00\x00\x01\x00\x00\x00\x80\x02@\x04\x80\x00\r\x00\x00\x00\x14\a\x01\x06\"&5\x11462\x17\x01\x02@\x13\xfe@\x134&&4\x13\x01\xc0\x02\x9a4\x13\xfe@\x13&\x1a\x03\x80\x1a&\x13\xfe@\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\x80\x00\x06\x00\r\x00\x1d\x00\x003!\x11!\x11\x14\x16%\x11!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\xa0\x02`\xfd\x80\x13\x05m\xfd\x80\x02`\r\x13\x80^B\xfa\xc0B^^B\x05@B^\x04\x80\xfb\xa0\r\x13 \x04`\xfb\x80\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\xc0\x04\x00\x05@\x00\r\x00\x1b\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x12\x14\x06#!\"&47\x0162\x17\x01\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a&&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x01Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x01\x00\x00\xff\xc0\x04\x00\x02\x00\x00\r\x00\x00\x00\x14\a\x01\x06\"'\x01&463!2\x04\x00\x13\xfe@\x134\x13\xfe@\x13&\x1a\x03\x80\x1a\x01\xda4\x13\xfe@\x13\x13\x01\xc0\x134&\x00\x00\x00\x00\x01\x00\x00\x03\x00\x04\x00\x05@\x00\r\x00\x00\x00\x14\x06#!\"&47\x0162\x17\x01\x04\x00&\x1a\xfc\x80\x1a&\x13\x01\xc0\x134\x13\x01\xc0\x03Z4&&4\x13\x01\xc0\x13\x13\xfe@\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x00\x00\x1a\x00:\x00\x00\x01\x11\x14\x06#!\"&5\x11\x16\x17\x04\x17\x1e\x02;\x022>\x0176%6\x13\x14\x06\a\x00\a\x0e\x04+\x02\".\x03'&$'.\x015463!2\x16\a\x00^B\xfa@B^,9\x01j\x879Gv3\x01\x013vG9\xaa\x01H9+bI\xfe\x88\\\nA+=6\x17\x01\x01\x176=+A\n[\xfe\xaa\">nSM\x05\xc0A_\x03:\xfc\xe6B^^B\x03\x1a1&\xf6c*/11/*{\xde'\x01VO\x903\xfe\xfb@\a/\x1d$\x12\x12$\x1d/\a@\xed\x18*\x93?Nh^\x00\x03\x00\x00\xff\xb0\x06\x00\x05l\x00\x03\x00\x0f\x00+\x00\x00\x01\x11!\x11\x01\x16\x06+\x01\"&5462\x16\x01\x11!\x114&#\"\x06\a\x06\x15\x11!\x12\x10/\x01!\x15#>\x0332\x16\x01]\xfe\xb6\x01_\x01gT\x02Rdg\xa6d\x04\x8f\xfe\xb7QV?U\x15\v\xfe\xb7\x02\x01\x01\x01I\x02\x14*Gg?\xab\xd0\x03\x8f\xfc!\x03\xdf\x012IbbIJaa\xfc\xdd\xfd\xc8\x02\x12iwE3\x1e3\xfd\xd7\x01\x8f\x01\xf000\x90 08\x1f\xe3\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eoz\xce\x00\x01\x00(\xff\x15\x06\xeb\x05\xd8\x00q\x00\x00!\x14\x0f\x01\x06#\"'\x01&547\x01\a\x06\"'\x1e\x06\x15\x14\a\x0e\x05#\"'\x01&54>\x047632\x1e\x05\x17&47\x0162\x17.\x06547>\x0532\x17\x01\x16\x15\x14\x0e\x04\a\x06#\".\x05'\x16\x14\x0f\x01\x01632\x17\x01\x16\x06\xeb%k'45%\xfe\x95&+\xff\x00~\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\xfeh\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e\x01\\\x0e(\x0e\x02\x15\x04\x10\x04\b\x03\x1c\x03\x1b\v\x1a\x12\x1a\r(\x1c\x01\x98\x1c\t\t\x16\v\x1e\x03\x1e&\n\x10\x11\n\x11\x06\x14\x02\x0e\x0e~\x01\x00+54'\x01k%5%l%%\x01l$65+\x01\x00~\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\x01\x98\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e\x01\\\x0e\x0e\x02\x14\x06\x11\n\x11\x10\n&\x1e\x03\x1e\v\x16\t\t\x1c\xfeh\x1c(\r\x1a\x12\x1a\v\x1b\x03\x1c\x03\b\x04\x10\x04\x15\x02\x0e(\x0e~\xff\x00+%\xfe\x95'\x00\x00\a\x00\x00\xff\x80\a\x00\x05\x00\x00\a\x00\x0f\x00!\x00)\x001\x009\x00K\x00\x00\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x136.\x01\x06\a\x03\x0e\x01\a\x06\x1e\x01676&$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x044&\"\x06\x14\x162\x01\x10\a\x06#!\"'&\x114\x126$ \x04\x16\x12\x01\x80KjKKj\x01\vKjKKj\x01\xf7e\x06\x1b2.\ae<^\x10\x14P\x9a\x8a\x14\x10,\x02bKjKKj\xfd\xcbKjKKj\x02\vKjKKj\x01\x8b\x8d\x13#\xfa\x86#\x13\x8d\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x01KjKKjK\x02\vjKKjK\xfe\x9f\x01~\x1a-\x0e\x1b\x1a\xfe\x82\x05M\x027>\x057&\x0254\x12$ \x04\x04L\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\xf0\x01\x9c\x01\xe8\x01\x9c\x04\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xc7\xfe\xa4\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\xae\x01'\xab\xab\x00\x00\x03\x00\x00\xff\x80\a\x00\x05\x00\x00\x14\x00:\x00d\x00\x00\x00 \x04\x06\x15\x14\x16\x1f\x01\a6?\x01\x17\x1632$64&$ \x04\x16\x10\x06\x04#\"'\x06\a\x06\a#\"&'&4>\x057>\x047.\x01546\x01\x1e\x04\x17\x1e\x06\x14\a\x0e\x01'&'&'\x06# '\x1632$7>\x0154'\x1e\x01\x15\x14\x06\x03Y\xfe\xce\xfe\xf6\x9dj`a#\"\x1c,5NK\x99\x01\n\x9d\x9d\xfd\x9e\x01~\x01E\xbc\xbc\xfe\xbb\xbfVZ|\x9a$2\x03\v\x13\x02\x01\x01\x03\x02\x05\x03\x06\x01\x05$\x10\x1d\x15\n|\x8e\xbc\x05:\n\x15\x1d\x10$\x05\x01\x06\x03\x05\x02\x03\x01\x01\x03\x14\f2$\x9a|ZV\xfe\xf1\xc9:\x1e\xa1\x01(t}\x86\x17\x81\x96\x8e\x04\x80h\xb2fR\x9888T\x14\x13\x1f\n\x0eh\xb2̲\xe8\x89\xec\xfe\xea\xec\x89\x10X(\t\a\x10\r\x03\a\x06\x06\x04\a\x03\a\x01\x06&\x15%(\x18H\xd2w\x8b\xec\xfb\xf8\x18(%\x15&\x06\x01\a\x03\a\x04\x06\x06\a\x03\x0e\x10\x01\a\t(X\x10\x84\x04ZT\\\xf0\x86MKG\xd6{x\xd1\x00\x01\x00\x01\xff\x00\x03|\x05\x80\x00!\x00\x00\x01\x16\a\x01\x06#\"'.\x017\x13\x05\x06#\"'&7\x13>\x013!2\x16\x15\x14\a\x03%632\x03u\x12\v\xfd\xe4\r\x1d\x04\n\x11\x11\x04\xc5\xfej\x04\b\x12\r\x12\x05\xc9\x04\x18\x10\x01H\x13\x1a\x05\xab\x01\x8c\b\x04\x13\x03\xca\x14\x18\xfb{\x19\x02\x05\x1c\x10\x03(e\x01\v\x0f\x18\x039\x0e\x12\x19\x11\b\n\xfe1b\x02\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\x80\x00U\x00\x00\x01\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015!\x1532\x16\x15\x11\x14\x06#!\"&5\x1146;\x015463!5#\"&5\x11463!2\x16\x15\x11\x14\x06+\x01\x15!2\x16\x1d\x0132\x16\a\x008(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`\xfe\x00`(88(\xfe\xc0(88(`L4\x02\x00`(88(\x01@(88(`\x02\x004L`(8\x01 \xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc0\xc08(\xfe\xc0(88(\x01@(8\xc04L\xc08(\x01@(88(\xfe\xc0(8\xc0L4\xc08\x00\x00\x03\x00\x00\xff\x80\x06\x80\x05\xc0\x00\x13\x00O\x00Y\x00\x00\x01\x11\x14\x06\"&5462\x16\x15\x14\x16265\x1162\x05\x14\x06#\"'.\x01#\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01\"\x06\a\x0e\x01\a\x06#\"'.\x01'.\x01#\"\x06\a\x06#\"&5476\x00$32\x04\x1e\x01\x17\x16\x01\x15&\"\a5462\x16\x03\x80\x98И&4&NdN!>\x03!\x13\r\v\f1X:Dx+\a\x15\x04\v\x11\x12\v\x04\x15\a+w\x88w+\a\x15\x04\v\x12\x11\v\x04\x15\a+xD:X1\f\v\r\x13\x01-\x00\xff\x01U\xbe\x8c\x01\r\xe0\xa5!\x01\xfd\x00*,*&4&\x02\xc4\xfd\xbch\x98\x98h\x1a&&\x1a2NN2\x02D\v&\r\x13\n..J<\n$\x06\x11\x11\x06$\n\x01767\x14\a\x0e\x02\a\x16\x15\x14\a\x16\x15\x14\a\x16\x15\x14\x06#\x0e\x01\"&'\"&547&547&547.\x02'&54>\x022\x1e\x02\x02\xe0\x13\x1a\x13l4\r\x13\x13\r2cK\xa0Eo\x87\x8a\x87oED\n)\n\x80\r\xe4\r\x80\n)\nD\x80g-;<\x04/\x19\x19-\r?.\x14P^P\x14.?\r-\x19\x19/\x04<;-gY\x91\xb7\xbe\xb7\x91Y\x03\xc0\r\x13\x13\r.2\x13\x1a\x13 L4H|O--O|HeO\v,\v\x99\x91\x91\x99\v,\vOe\x9bq1Ls2\x1c6%\x1b\x1b%4\x1d\x17\x18.2,44,2.\x18\x17\x1d4%\x1b\x1b%6\x1c2sL1q\x9bc\xabqAAq\xab\x00\x02\x00\x00\xff\xa0\a\x00\x04\xe0\x00\x1a\x004\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&547\x01632\x16\x1d\x01!2\x16\x10\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\a\x00\x13\r\xfa\xa0\x13\r\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x05`\r\x13\t\xfe\xc0\t\x0e\r\x13\xfa\xa0\r\x13\x13\r\x05`\x12\x0e\f\f\x01?\x01`\xc0\r\x13\xc0\r\x13\n\x01@\t\r\x0e\t\x01@\t\x13\r\xc0\x13\x02!\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014&+\x01\x114&+\x01\"\x06\x15\x11#\"\x06\x15\x14\x17\x01\x1627\x016\x05\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\t\x01`\t\x1c\t\x01_\n\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02`\x0e\x12\x01`\r\x13\x13\r\xfe\xa0\x13\r\x0e\t\xfe\xa0\t\t\x01_\fԟ\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x02\x00\x00\x00\x00\a\x80\x05\x80\x00\x19\x005\x00\x00\x014'\x01&\"\a\x01\x06\x15\x14\x16;\x01\x11\x14\x16;\x01265\x11326\x01\x14\x06#!\"\x005467&54\x0032\x04\x17632\x16\x15\x14\a\x1e\x01\x05\x00\t\xfe\xa0\t\x1c\t\xfe\xa1\n\x12\x0e\xe0\x13\r\xc0\r\x13\xe0\r\x13\x02\x80\xe1\x9f\xfb\xc0\xb9\xfe\xf9\x8cv\x02\x01,Ԝ\x01\x03;G_j\x96)\x82\xa7\x02\xa0\x0e\t\x01`\t\t\xfe\xa1\f\f\x0e\x12\xfe\xa0\r\x13\x13\r\x01`\x13\xfe\xed\x9f\xe1\x01\a\xb9\x82\xdc7\x1e\r\xd4\x01,\xae\x90>\x96jL>\x1f\xd1\x00\x00\x00\x00\x03\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00X\x00`\x00\x00$\x14\x06\"&462\x05\x14\x06#!\"&54>\x037\x06\x1d\x01\x0e\x01\x15\x14\x162654&'547\x16 7\x16\x1d\x01\"\x06\x1d\x01\x06\x15\x14\x162654'5462\x16\x1d\x01\x06\x15\x14\x162654'54&'46.\x02'\x1e\x04\x00\x10\x06 &\x106 \x01\x80&4&&4\x04&\x92y\xfc\x96y\x92\v%:hD\x16:Fp\xa0pG9\x19\x84\x01F\x84\x19j\x96 8P8 LhL 8P8 E;\x01\x01\x04\n\bDh:%\v\xfe\xc0\xe1\xfe\xc2\xe1\xe1\x01>\xda4&&4&}y\x8a\x8ayD~\x96s[\x0f4D\xcb\x14d=PppP=d\x14\xcb>\x1fhh\x1f>@\x96jY\x1d*(88(*\x1dY4LL4Y\x1d*(88(*\x1dYDw\"\nA\x1f4*\x13\x0f[s\x96~\x03\xd8\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x02\x00\x00\xff\x80\x05\x80\x05\x80\x00\a\x00M\x00\x00\x004&\"\x06\x14\x1627\x14\x06\a\x11\x14\x04 $=\x01.\x015\x114632\x17>\x0132\x16\x14\x06#\"'\x11\x14\x16 65\x11\x06#\"&4632\x16\x17632\x16\x15\x11\x14\x06\a\x15\x14\x16 65\x11.\x015462\x16\x05\x00&4&&4\xa6G9\xfe\xf9\xfe\x8e\xfe\xf9\xa4\xdc&\x1a\x06\n\x11<#5KK5!\x1f\xbc\x01\b\xbc\x1f!5KK5#<\x11\n\x06\x1a&ܤ\xbc\x01\b\xbc9Gp\xa0p\x03&4&&4&@>b\x15\xfeu\x9f\xe1ោ\x14ؐ\x02\x00\x1a&\x02\x1e$KjK\x12\xfenj\x96\x96j\x01\x92\x12KjK$\x1e\x02&\x1a\xfe\x00\x90\xd8\x14\x84j\x96\x96j\x01\x8b\x15b>Ppp\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\r\x00\x1b\x00%\x00\x00\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x02\x80\x02\x00\xfe\x00\xfe\xa0@\\\x84\x84\\\x04\xa0\xfc\x00\x808(\x02@(8\x02\x00\x84\\@@\\\x84\x04\x80\x80\x80\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x02\x00@\xff\x00\x06\xc0\x06\x00\x00\v\x003\x00\x00\x044#\"&54\"\x15\x14\x163\x01\x14\x06#!\x14\x06\"&5!\"&5>\x0454\x127&5462\x16\x15\x14\a\x16\x12\x15\x14\x1e\x03\x03\x90\x10;U gI\x03@L4\xfe@\x96Ԗ\xfe@4L2RX='\xea\xbe\b8P8\b\xbe\xea'=XR\xb0 U;\x10\x10Ig\x0104Lj\x96\x96jL4*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x1c\xfe\xfb\x98\x8b\xf2\xaa\x93\\\x00\x00\x03\x00\x00\xff\x80\a@\x05\x00\x00\a\x00\x0f\x00\"\x00\x00\x004&+\x01\x1132\x01!\x14\x06#!\"&\x00\x10\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x06\x80pP@@P\xf9\xf0\a\x00\x96j\xfb\x00j\x96\a@\xe1\x9f@\x84\\\xfd@\\\x84&\x1a\x04\x80\x9f\x030\xa0p\xfe\x80\xfd\xc0j\x96\x96\x04\t\xfe\xc2\xe1 \\\x84\x84\\\x02\xe0\x1a&\x00\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00-\x00B\x00\x00\x01\x11\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015\x11462\x16\x15\x11\x14\x16265\x11462\x16\x15\x11\x14\x16265\x11462\x16\x05\x11\x14\x06+\x01\"&5\x11#\"&5\x11463!2\x16\x02\x80G9L4\x804L9G&4&&4&&4&&4&&4&\x03\x00L4\x804L\xe0\r\x13\xbc\x84\x01\x00\x1a&\x05\xc0\xfd\x80=d\x14\xfc\xf54LL4\x03\v\x14d=\x02\x80\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xf9\xc04LL4\x02\x00\x13\r\x03 \x84\xbc&\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01463!2\x16\x1d\x01\x14\x06#!\"&5\x052\x16\x1d\x01\x14\x06#!\"&=\x01463\x012\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\x00\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x02\xe0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03`\x0e\x12\x12\x0e@\x0e\x12\x12\x0e\xa0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xff\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01-\x01=\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x11!5463!2\x16\x15\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xfb\x80\x01\x80\x13\r\x01@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfa\x93\x06\x00\xfa\x00\xe0\r\x13\x13\r\x05`\xf9\x80\x1a&&\x1a\x06\x80\x1a&&\x00\r\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xb7\x00\xdb\x00\xf5\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01!\x11!\x15\x14\x06#!\"&=\x01!\x11!5463!2\x16\x15\x19\x014&+\x01\"\x06\x1d\x01#54&+\x01\"\x06\x15\x11\x14\x16;\x0126=\x013\x15\x14\x16;\x0126%\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x15\x11!2\x16\x01\x80\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x03\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x02\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x13\r@\r\x13\x13\r@\r\x13\x01\x00\x13\r@\r\x13\x13\r@\r\x13\xff\x00\x01\x80\xff\x008(\xfe@(8\xff\x00\x01\x80\x13\r\x01@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x13\r@\r\x13\x80\x13\r@\r\x13\x02\x00&\x1a\xfb\x00\x1a&&\x1a\x01@8(\x01\xc0(8\x01@\x1a&\xe0@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfd\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\xfe\xf3@\r\x13\x13\r@\r\x13\x13\xf3@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\r@\r\x13\x13\xfc\x93\x04\x80 (88( \xfb\x80\xe0\r\x13\x13\r\x03\xc0\x01@\r\x13\x13\r``\r\x13\x13\r\xfe\xc0\r\x13\x13\r``\r\x13\x13-\xfb\x00\x1a&&\x1a\x05\x00\x1a&\x01 (88(\xfe\xe0&\x00\x05\x00@\xff\x80\a\x80\x05\x80\x00\a\x00\x10\x00\x18\x00<\x00c\x00\x00$4&\"\x06\x14\x162\x01!\x11#\x06\x0f\x01\x06\a\x004&\"\x06\x14\x162\x1354&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01\x11\x14\x06+\x01\x14\x06\"&5!\x14\x06\"&5#\"&463\x1146?\x01>\x01;\x01\x11463!2\x16\x02\x80KjKKj\xfe\xcb\x01\x80\x9e\x0e\b\xc3\a\x02\x05\x00KjKKj\xcb\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x01\x00&\x1a\xc0\x96Ԗ\xfe\x80\x96Ԗ\x80\x1a&&\x1a\x1a\x13\xc6\x13@\x1a\xa0&\x1a\x04\x80\x1a&KjKKjK\x02\x80\x01\x00\x02\a\xc3\f\n\xfd\xadjKKjK\x03 \xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02.\xfb\x80\x1a&j\x96\x96jj\x96\x96j&4&\x01\xa0\x1a@\x13\xc6\x13\x1a\x01@\x1a&&\x00\x00\x05\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x001\x00?\x00I\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x01!5!\x05\x11#\"&5\x11463!\x11!\x1135463!2\x16\x1d\x01\x05\x11\x14\x06+\x01\x1132\x16\x05\x00\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\xfd\x80\x02\x00\xfe\x00\xfe\x80 \\\x84\x84\\\x04\xc0\xfb\xc0\xa08(\x02@(8\x02\x00\x84\\ \\\x84\x01\xa0\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x02\ue000\xfb\x00\x84\\\x03@\\\x84\xfb\x00\x05\x00\xa0(88(\xa0\xe0\xfc\xc0\\\x84\x05\x00\x84\x00\x00\x00\x00\x01\x00\x00\x00\x00\a\x80\x04\x80\x00:\x00\x00\x01\x06\r\x01\a#\x0132\x16\x14\x06+\x0353\x11#\a#'53535'575#5#573\x173\x11#5;\x022\x16\x14\x06+\x01\x013\x17\x05\x1e\x01\x17\a\x80\x01\xfe\xe1\xfe\xa0\xe0@\xfe\xdbE\x1a&&\x1a`\xa0@@\xa0\xc0` \x80\xc0\xc0\x80 `\xc0\xa0@@\xa0`\x1a&&\x1aE\x01%@\xe0\x01`\x80\x90\b\x02@ @ @\xfe\xa0\t\x0e\t \x01\xa0\xe0 \xc0 \b\x18\x80\x18\b \xc0 \xe0\x01\xa0 \t\x0e\t\xfe\xa0@ \x1c0\n\x00\x00\x00\x02\x00@\x00\x00\x06\x80\x05\x80\x00\x06\x00\x18\x00\x00\x01\x11!\x11\x14\x163\x01\x15!57#\"&5\x11'7!7!\x17\a\x11\x02\x80\xff\x00K5\x04\x80\xfb\x80\x80\x80\x9f\xe1@ \x01\xe0 \x03\xc0 @\x02\x80\x01\x80\xff\x005K\xfe@\xc0\xc0\xc0\xe1\x9f\x01@@\x80\x80\xc0 \xfc\xe0\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00%\x114&+\x01\"\x06\x15\x11!\x114&+\x01\"\x06\x15\x11\x14\x16;\x01265\x11!\x11\x14\x16;\x0126\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\x80\x1a&\xfe\x00&\x1a\x80\x1a&&\x1a\x80\x1a&\x02\x00&\x1a\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xc0\x03\x80\x1a&&\x1a\xfe\xc0\x01@\x1a&&\x1a\xfc\x80\x1a&&\x1a\x01@\xfe\xc0\x1a&&\x03\xba\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x0154&#!\x114&+\x01\"\x06\x15\x11!\"\x06\x1d\x01\x14\x163!\x11\x14\x16;\x01265\x11!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x1a\x80\x1a&\x01@\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&\x01@\x1a&&\x1a\xfe\xc0&\x1a\x80\x1a&\xfe\xc0\x1a&&\x1a\x01@&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00-\x00M\x03\xf3\x043\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x04\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x02s\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\x01\x8a\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\xad\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\x00\x00\x00\x02\x00\r\x00M\x03\xd3\x043\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x04\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x01\x8a\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x02\x00M\x00\x8d\x043\x04S\x00\x14\x00)\x00\x00$\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x12\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\xed\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x01v\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x02\x00M\x00\xad\x043\x04s\x00\x14\x00)\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x12\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x02\xad\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x01v\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x01\x00-\x00M\x02s\x043\x00\x14\x00\x00\x00\x14\a\t\x01\x16\x14\x0f\x01\x06\"'\x01&47\x0162\x1f\x01\x02s\n\xfew\x01\x89\n\n2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\x03\xed\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\x00\x00\x00\x01\x00\r\x00M\x02S\x043\x00\x14\x00\x00\x00\x14\a\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x02S\n\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\x02M\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\x00\x00\x00\x01\x00M\x01\r\x043\x03S\x00\x14\x00\x00\x00\x14\x0f\x01\x06\"'\t\x01\x06\"/\x01&47\x0162\x17\x01\x043\n2\n\x1a\n\xfew\xfew\n\x1a\n2\n\n\x01\xd2\n\x1a\n\x01\xd2\x01m\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\n\xfe.\x00\x00\x00\x01\x00M\x01-\x043\x03s\x00\x14\x00\x00\x00\x14\a\x01\x06\"'\x01&4?\x0162\x17\t\x0162\x1f\x01\x043\n\xfe.\n\x1a\n\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\x03-\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\n2\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x06\x00\x00\x0f\x00/\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x14\x1e\x01\x15\x14\x06#!\"&54>\x015!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd\xe0 &\x1a\xfe\x00\x1a& \xfd\xe0B^^B\x06@B^\x02 \x03@\r\x13\x13\r\xfc\xc0\r\x13\x13\x03M\xfb\xc0B^%Q=\r\x1a&&\x1a\x0e\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x94\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x04\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x05\x11\x14\x06#!\"&5\x114>\x02;\x012\x16\x1d\x01\x14\x06+\x01\"\x06\x1d\x01\x14\x16;\x012\x16\x03\x00pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x03\x80pP\xfe\x80PpQ\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0Pp\x02@\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\xfe\x80PppP\x02\xc0h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8p\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00!\x00C\x00\x00\x01\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x05\x11\x14\x0e\x02+\x01\"&=\x0146;\x0126=\x014&+\x01\"&5\x11463!2\x16\x03\x00Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x03\x80Q\x8a\xbdh@\x1a&&\x1a@j\x968(\xe0PppP\x01\x80Pp\x04\xc0\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80PppP\xfd@h\xbd\x8aQ&\x1a\x80\x1a&\x96j (8pP\x01\x80Ppp\x00\x00\x00\x00\b\x00@\xff@\x06\xc0\x06\x00\x00\t\x00\x11\x00\x19\x00#\x00+\x003\x00;\x00G\x00\x00$\x14\x06#\"&5462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&462\x16\x00\x14\x06\"&462\x00\x14\x06\"&462\x00\x14\x06\"&462\x01\x14\x06#\"&54632\x16\x02\x0eK54LKj\x02=KjKKj\xfd\x8bKjKKj\x04\xfdL45KKjK\xfc<^\x84^^\x84\x04\xf0KjKKj\xfd\xcbp\xa0pp\xa0\x02\x82\x84\\]\x83\x83]\\\x84\xc3jKL45K\xfe\xe7jKKjK\x02ujKKjK\xfd\x8e4LKjKK\x03\xf1\x84^^\x84^\xfd\xa3jKKjK\x02\x90\xa0pp\xa0p\xfer]\x83\x83]\\\x84\x84\x00\x00\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x00\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x06\x00\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03Q\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x00\xff\x80\a\x00\x05\xc0\x00,\x00\x00\x01\x14\x03\x0e\x02\a\x06#\"&5465654.\x05+\x01\x11\x14\x06\"'\x01&47\x0162\x16\x15\x113 \x13\x16\a\x00\u007f\x03\x0f\f\a\f\x10\x0f\x11\x05\x05#>bq\x99\x9bb\xe0&4\x13\xfe\x00\x13\x13\x02\x00\x134&\xe0\x02ɢ5\x01\xa0\xa6\xfe\xe3\a\"\x1a\t\x11\x14\x0f\t#\x06D7e\xa0uU6\x1f\f\xff\x00\x1a&\x13\x02\x00\x134\x13\x02\x00\x13&\x1a\xff\x00\xfem\x86\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\v\x00\x17\x001\x00X\x00\x00\x00\x14\x0e\x01\".\x014>\x012\x16\x04\x14\x0e\x01\".\x014>\x012\x16\x174&#\"\a\x06\"'&#\"\x06\x15\x14\x1e\x03;\x012>\x03\x13\x14\a\x0e\x04#\".\x04'&547&5472\x16\x17632\x17>\x013\x16\x15\x14\a\x16\x02\x80\x19=T=\x19\x19=T=\x02\x99\x19=T=\x19\x19=T=\xb9\x8av)\x9aG\xacG\x98+v\x8a@b\x92\x86R\xa8R\x86\x92b@\xe0=&\x87\x93\xc1\x96\\N\x80\xa7\x8a\x88j!>\x88\x1b3l\xa4k\x93\xa2\x94\x84i\xa4k3\x1b\x88\x01hPTDDTPTDDTPTDDTPTDD|x\xa8\x15\v\v\x15\xa8xX\x83K-\x0e\x0e-K\x83\x01\b\xcf|Mp<#\t\x06\x13)>dA{\xd0\xed\x9fRXtfOT# RNftWQ\xa0\x00\x00\x00\x00\x02\x00\x00\x00\x00\x06\x80\x05\x80\x00\x17\x00,\x00\x00%\x114&#!\"&=\x014&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x1d\x01!2\x16\x06\x008(\xfd@(88(\xfe\xc0(88(\x04\xc0(8\x80\x84\\\xfb@\\\x84\x84\\\x01@\\\x84\x02\xa0\\\x84\xe0\x02\xc0(88(@(88(\xfc@(88\x02\xe8\xfd@\\\x84\x84\\\x03\xc0\\\x84\x84\\ \x84\x00\x00\x03\x00\x00\x00\x00\au\x05\x80\x00\x11\x00'\x00E\x00\x00\x014#!\"\x06\a\x01\x06\x15\x143!267\x016%!54&#!\"&=\x014&#!\"\x06\x15\x11\x01>\x01\x05\x14\a\x01\x0e\x01#!\"&5\x11463!2\x16\x1d\x01!2\x16\x1d\x0132\x16\x17\x16\x06\xf55\xfb\xc0([\x1a\xfe\xda\x125\x04@(\\\x19\x01&\x12\xfb\x8b\x03\x008(\xfd\xc0(88(\xfe\xc0(8\x01\x00,\x90\x059.\xfe\xd9+\x92C\xfb\xc0\\\x84\x84\\\x01@\\\x84\x02 \\\x84\xc06Z\x16\x0f\x02]#+\x1f\xfe\x95\x18\x10#,\x1f\x01k\x16\xb4\xa0(88(@(88(\xfc\xab\x01;5E\xa3>:\xfe\x955E\x84\\\x03\xc0\\\x84\x84\\ \x84\\\xa01. \x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x0e\x01\"&'&676\x16\x17\x1e\x01267>\x01\x1e\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n%\xca\xfe\xca%\b\x18\x1a\x19/\b\x19\x87\xa8\x87\x19\b02\x18\xfe\nKjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcdy\x94\x94y\x19/\b\b\x18\x1aPccP\x1a\x18\x10/\x01\xcfjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00\x1c\x00$\x004\x00@\x00\x00\x01\x16\x0e\x01&'.\x01\"\x06\a\x0e\x01'.\x017>\x012\x16\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04n\b\x1820\b\x19\x87\xa8\x87\x19\b/\x19\x1a\x18\b%\xca\xfe\xca\xfe7KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x013\x19/\x10\x18\x1aPccP\x1a\x18\b\b/\x19y\x94\x94\x02\tjKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x13\x00\x1b\x00+\x007\x00\x00\x00\x14\x06#!\"&463!2\x00\x14\x06\"&462\x04\x14\x06\"&462\x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80&\x1a\xfd\x80\x1a&&\x1a\x02\x80\x1a\xfe&KjKKj\x02KKjKKj\x01Kf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xda4&&4&\x01\xb5jKKjKKjKKjK\xfd\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\x00\x00\a\x80\x04\x00\x00#\x00+\x003\x00C\x00\x00\x0154&+\x0154&+\x01\"\x06\x1d\x01#\"\x06\x1d\x01\x14\x16;\x01\x15\x14\x16;\x0126=\x01326\x044&\"\x06\x14\x162\x004&\"\x06\x14\x162$\x10\x00#\"'#\x06#\"\x00\x10\x003!2\x03@\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x02@KjKKj\x01KKjKKj\x01K\xfe\xd4\xd4\xc0\x92ܒ\xc0\xd4\xfe\xd4\x01,\xd4\x03\x80\xd4\x01\xc0\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12gjKKjK\x01KjKKjK\xd4\xfeX\xfeԀ\x80\x01,\x01\xa8\x01,\x00\x00\x00\x0f\x00\x00\x00\x00\a\x80\x04\x80\x00\v\x00\x17\x00#\x00/\x00;\x00G\x00S\x00_\x00k\x00w\x00\x83\x00\x8f\x00\x9f\x00\xa3\x00\xb3\x00\x00\x01\x15\x14+\x01\"=\x014;\x0127\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14#!\"=\x0143!2%\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012'\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x01\x15\x14+\x01\"=\x014;\x012\x05\x15\x14+\x01\"=\x014;\x012\x05\x11\x14+\x01\"=\x014;\x0154;\x012\x13\x11!\x11\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80\x10`\x10\x10`\x10\x80\x10\xe0\x10\x10\xe0\x10\x80\x10`\x10\x10`\x10\x04\x00\x10\xfc\xa0\x10\x10\x03`\x10\xfd\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\x01\x80\x10`\x10\x10`\x10\xfe\x00\x10`\x10\x10`\x10\x01\x00\x10`\x10\x10`\x10\x01\x00\x10\xe0\x10\x10p\x10`\x10\x80\xf9\x80\a\x00K5\xf9\x805KK5\x06\x805K\x01p`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfd\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\xfe\xf0`\x10\x10`\x10\x01\xf0`\x10\x10`\x10\x10`\x10\x10`\x10\x10\xfe\xa0\x10\x10`\x10\xf0\x10\xfd\x00\x03\x80\xfc\x80\x03\x80\xfc\x805KK5\x03\x805KK\x00\x00\x00\x00\x03\x00@\xff\x80\a\x00\x05\x80\x00\x16\x00*\x00V\x00\x00\x01\x11\x06#\"'.\x01#\"\a\x11632\x1e\x02\x1f\x01\x1632\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x06\x80\xa9\x89R?d\xa8^\xad\xe6\xf5\xbc7ac77\x1c,9x\xfbm#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x01\xeb\x02h[ 17\u007f\xfd\xa9q\x0f%\x19\x1b\x0e\x16\x03q#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x00\x06\x00@\xff\x80\a\x00\x05\x80\x00\x05\x00\v\x00*\x002\x00F\x00r\x00\x00\x015\x06\a\x156\x135\x06\a\x156\x015\x06'5&'.\t#\"\a\x1532\x16\x17\x16\x17\x15\x1632\x135\x06#\"'\x15\x16\x01\x14\x06\a\x11\x14\x06+\x01\"&5\x11.\x015462\x16\x05\x11\x14\a\x06\a\x06#\"/\x01.\x02#\"\x04\a\x06#\"'&5\x1147>\x0332\x16\x17\x16327676\x17\x16\x03@\xb5\xcbͳ\xac\xd4\xd7\x03\xe9\xeb\x95\x14\x13\x058\r2\x13.\x1a,#,\x16\x17\x1a\x13f\xb5k\x13\x14*1x\xad\xa9\x89-!\x94\xfb\xac#\x1d\x12\x0e@\x0e\x12\x1d#KjK\x05\xc0#\n\aڗXF\x1c@Fp:f\xfe\xf5_\x0f\x12\x10\x10 \x1f#W\x8d\xa4Ip\xc2p&3z\xbc\x16\t\x1f\x1f\x1f\x02\x18\xc0\x10e\xb9`\x01\xb0\xc5\bv\xbdo\xfe8\xb8t-\xe0\x06\t\x03\x1c\x06\x18\a\x13\x06\v\x04\x04\x03\xde:5\t\x06\xbc\x11\x02\a\xbd[\b\xc4*\x01\xee#:\x11\xfb\x0e\x0e\x12\x12\x0e\x04\xf2\x11:#5KKu\xfd\x05'\x12\x05\x04t#\x0e!\x1e\x1cX:\t\b\x13%\x02\xe6#\x14\x15+=&>7\x13p\f\x05\x10\x12\x14\x00\x02\x00\r\x00\x00\x06\x80\x043\x00\x14\x00$\x00\x00\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x01\x15\x14\x06#!\"&=\x01463!2\x16\x02I\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x04-\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x02)\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\xfe-@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x00\x03\x00-\xff\x93\aS\x04\xed\x00\x14\x00$\x009\x00\x00%\a\x06\"'\x01&47\x0162\x1f\x01\x16\x14\a\t\x01\x16\x14\t\x01\x0e\x01/\x01.\x017\x01>\x01\x1f\x01\x1e\x01\t\x01\x06\"/\x01&47\t\x01&4?\x0162\x17\x01\x16\x14\x02i2\n\x1a\n\xfe.\n\n\x01\xd2\n\x1a\n2\n\n\xfew\x01\x89\n\x02E\xfe\x8b\x04\x17\f>\r\r\x04\x01u\x04\x17\f>\r\r\x02\x8d\xfe.\n\x1a\n2\n\n\x01\x89\xfew\n\n2\n\x1a\n\x01\xd2\n\x892\n\n\x01\xd2\n\x1a\n\x01\xd2\n\n2\n\x1a\n\xfew\xfew\n\x1a\x04!\xfa\xf5\r\r\x04\x11\x04\x17\r\x05\v\r\r\x04\x11\x04\x17\xfdh\xfe.\n\n2\n\x1a\n\x01\x89\x01\x89\n\x1a\n2\n\n\xfe.\n\x1a\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\xbb\x00\x15\x00;\x00\x00\x01\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x1d\x01\x01\x06\x14\x17\x01\x14\x0e\x03\a\x06#\"'&7\x12'.\x01'\x15\x14\a\x06#\"'\x01&47\x016\x17\x16\x15\x11\x04\x17\x16\x02\x80'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\xfes\x13\x13\x06\r\"+5\x1c\x06\b\x14\x06\x03\x19\x02+\x95@ա'\r\f\x1b\x12\xfe\x00\x13\x13\x02\x00\x1d)'\x01\x9b\xbc\xa9\x01\xc6F*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*E\xfer\x134\x13\xfeM:\x97}}8\f\x11\x01\b\x1a\x01\x90\xa5GO\r\xfb*\x11\x05\x13\x02\x00\x134\x13\x02\x00\x1f\x11\x11*\xfe\xfa\x1c\xc1\xad\x00\x00\x00\x00\x02\x00\x02\xff\xad\x06~\x05\xe0\x00\n\x00(\x00\x00\x01-\x01/\x01\x03\x11\x17\x05\x03'\t\x01\x13\x16\x06#\"'%\x05\x06#\"&7\x13\x01&67%\x13632\x17\x13\x05\x1e\x01\x04\xa2\x01\x01\xfe\x9cB\x1e\x9f;\x01><\f\x01\xf5\xfe\x95V\x05\x16\x17\x11\x17\xfe?\xfe?\x17\x11\x17\x16\x05V\xfe\x94 \x12-\x01\xf6\xe1\x14\x1d\x1c\x15\xe1\x01\xf6-\x12\x02C\xfa4\n<\x01B\xfc=\x1f\xa8\x01cB\x015\xfe\x9e\xfe\f!%\f\xec\xec\f%!\x01\xf4\x01b 7\aI\x01\xc7))\xfe9I\a7\x00\x00\x00\x01\x00\x02\xff\x80\x05\x80\x05\x00\x00\x16\x00\x00\t\x01\x06#\"'.\x015\x11!\".\x0167\x01632\x17\x1e\x01\x05y\xfd\x80\x11(\x05\n\x16\x1b\xfd\xc0\x16#\n\x12\x14\x05\x00\r\x10\x1b\x12\x0f\a\x04\xa3\xfb\x00#\x02\x05#\x16\x02@\x1b,(\n\x02\x80\a\x13\x0e)\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x02\x00\x05\x008\x00\x00\x01!\x11\t\x01!\x01\x15\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\"&5\x11#\"&=\x0146;\x01546;\x012\x16\x1d\x01!762\x17\x16\x14\x0f\x01\x1132\x16\x02-\x02S\xfd\x80\x02S\xfd\xad\x04\x80\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\xfc\xa0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\xc0\x0e\x12\x03S\xf6\n\x1a\n\t\t\xf7\xe0\x0e\x12\x01\x00\x02S\xfd\xda\x02S\xfd`\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x03`\x12\x0e\xc0\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xf7\t\t\n\x1a\n\xf6\xfc\xad\x12\x00\x00\x00\x04\x00\x00\xff\x80\x04\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00K\x00\x00$4&\"\x06\x14\x162\x124&\"\x06\x14\x162\x044&\"\x06\x14\x1627\x14\x06\a\x02\a\x06\a\x0e\x01\x1d\x01\x1e\x01\x15\x14\x06\"&5467\x11.\x015462\x16\x15\x14\x06\a\x1167>\x055.\x015462\x16\x01 8P88P88P88P\x02\xb88P88P\x984,\x02\xe0C\x88\x80S,4p\xa0p4,,4p\xa0p4,6d7AL*'\x11,4p\xa0p\x18P88P8\x04\xb8P88P8HP88P8`4Y\x19\xfe\xe1\u007f&+(>E\x1a\x19Y4PppP4Y\x19\x034\x19Y4PppP4Y\x19\xfe\x0f\x1a\x1f\x11\x19%*\x0154&#\"\a\x06\a\x06#\"/\x01.\x017\x12!2\x1e\x02\x02\xc0\x18\x10\xf0\x10\x18\x18\x10\xf0\x10\x18\x01<\x1f'G,')7\x18\x10\xf0\x0f\x15\x82N;2]=A+#H\r\x12\f\r\xa4\r\x05\b\xa0\x010P\xa2\x82R\x01\x18\xf0\x10\x18\x18\x10\xf0\x10\x18\x18\x02H6^;<\x1b\x16\x17T\x19\x11\x1f%\x13-S\x93#\x1b:/*@\x1d\x19Z\x10\b}\n\x1e\r\x01\n>h\x97\x00\x00\x00\x02\x00\x00\x00\x00\x02\x80\x05\x80\x00\x1e\x00.\x00\x00%\x15\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x01463!2\x16\x15\x1132\x16\x03\x15\x14\x06#!\"&=\x01463!2\x16\x02\x80&\x1a\xfe\x00\x1a&&\x1a@@\x1a&&\x1a\x01\x80\x1a&@\x1a&\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xc0\x80\x1a&&\x1a\x80\x1a&\x01\x80&\x1a\x80\x1a&&\x1a\xfd\xc0&\x04f\xc0\x1a&&\x1a\xc0\x1a&&\x00\x00\x02\x00b\x00\x00\x02\x1e\x05\x80\x00\x0f\x00\x1f\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x03\x0e\x01#!\"&'\x03&63!2\x16\x02\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x1e\x1c\x01'\x1a\xff\x00\x1a'\x01\x1c\x01%\x1a\x01@\x1a%\x01 \xe0\x1a&&\x1a\xe0\x1a&&\x04\x06\xfd\x00\x1a&&\x1a\x03\x00\x1a&&\x00\x02\x00\x05\x00\x00\x05\xfe\x05k\x00%\x00J\x00\x00%\x15#/\x01&'#\x0e\x02\a\x06\x0f\x01!53\x13\x03#5!\x17\x16\x17\x16\x1736?\x02!\x15#\x03\x13\x01\x15!'&54>\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x04\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xea\xfd\xfe\x03\x044NZN4;)3.\x0e\x16i\x1a%Sin\x881KXL7\x03觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\x02\xa7\xce\x1b\x1c\x12@jC?.>!&1'\v\x1b\\%\x1dAwc8^;:+\x0454&#\"\a\x06\a'67632\x16\x15\x14\x0e\x03\a35\x03\x81\xf8\x9f\x18\b\x03\x03\x01\x03\x04\x01\n\x0f\x9b\xfe\xfe\x80Ź\x89\x01\x14\x8b\x02\x15\b\x03\x03\x03\b\x19\x8c\x01\x01}\xb8\xcc\x02\xec\xfd\xfe\x04\x034NZN4;)3.\x0e\x16i\x1a%Pln\x88EcdJ\x04觧\xfc*\t\f\x03\a\t\x02\x14\x18\xfa\xa7\x01#\x01\x10\xa8\xe4\x04&\t\f\t\f*\xe4\xa8\xfe\xf5\xfe\xd8\xd9\xce\x1b-\x01@jC?.>!&1'\v\x1b\\%\x1dAwcBiC:D'P\x00\x00\x00\x02\x00\x01\x00\x00\a\u007f\x05\x00\x00\x03\x00\x17\x00\x00%\x01!\t\x01\x16\x06\a\x01\x06#!\"&'&67\x0163!2\x16\x03\x80\x01P\xfd\x00\xfe\xb0\x06\xf5\x0f\v\x19\xfc\x80&:\xfd\x00&?\x10\x0f\v\x19\x03\x80&:\x03\x00&?\x80\x01\x80\xfe\x80\x045\"K\x1c\xfc\x00,)\"\"K\x1c\x04\x00,)\x00\x00\x01\x00\x00\xff\xdc\x06\x80\x06\x00\x00h\x00\x00\x01\x14\x06#\".\x02#\"\x15\x14\x16\a\x15\"\a\x0e\x02#\"&54>\x0254&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06#\"'.\x01/\x01\"'\"5\x11\x1e\x02\x17\x16327654.\x0254632\x16\x15\x14\x0e\x02\x15\x14\x163267\x15\x0e\x02\a\x06\x15\x14\x17\x1632>\x0232\x16\x06\x80YO)I-D%n \x01\x16\v\"\u007fh.=T#)#lQTv\x1e%\x1e.%P_\x96\t%\t\r\x01\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1evUPl#)#T=@\xe8/\x01\x05\x05\x01\x18#,-\x1691P+R[\x01\xb6Ql#)#|'\x98'\x05\x01\x03\x11\n59%D-I)OY[R+P19\x16-,#\x18\x02\x04\x02\x02\x01\x01\x04\x00\x01\x05\x05\x01\x18#,-\x1691P+R[YO)I-D%95\x1e\x02\x02\x02\x1f%\x03\x96_P%.\x1e%\x1ev\x00\x00\x02\x00\x00\xff\x80\x04\x80\x06\x00\x00'\x003\x00\x00\x01\x15\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&\x00=\x01462\x16\x1d\x01\x14\x00 \x00=\x01462\x16\x01\x11\x14\x06 &5\x1146 \x16\x04\x80\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00\xd9\xfe\xd9&4&\x01\a\x01r\x01\a&4&\xff\x00\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x03@\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\x18\x01G݀\x1a&&\x1a\x80\xb9\xfe\xf9\x01\a\xb9\x80\x1a&&\x01f\xfe\x00\x84\xbc\xbc\x84\x02\x00\x84\xbc\xbc\x00\x03\x00\r\xff\x80\x05s\x06\x00\x00\v\x00C\x00K\x00\x00\x01\a&=\x01462\x16\x1d\x01\x14\t\x01\x15\x14\x06#\"'\a\x1632\x00=\x01462\x16\x1d\x01\x14\x00\a\x15!2\x16\x14\x06#!\"&463!5&'\a\x06\"/\x01&47\x0162\x1f\x01\x16\x14%\x01\x114632\x16\x01\x0fe*&4&\x04i\xfe\x97\xbc\x8476`al\xb9\x01\a&4&\xfe\xd9\xd9\x01\x00\x1a&&\x1a\xfd\x80\x1a&&\x1a\x01\x00}n\xfe\n\x1a\nR\n\n\x04\xd2\n\x1a\nR\n\xfez\xfd\x93\xbc\x84f\xa5\x02Oego\x80\x1a&&\x1a\x805\x02\x1e\xfe\x97\x80\x84\xbc\x13`3\x01\a\xb9\x80\x1a&&\x1a\x80\xdd\xfe\xb9\x18\x84&4&&4&\x84\rD\xfe\n\nR\n\x1a\n\x04\xd2\n\nR\n\x1az\xfd\x93\x02\x00\x84\xbcv\x00\x00\x00\x02\x00\x00\xff\x80\x05\x00\x05\x80\x00\x06\x00\"\x00\x00\x01\x11!\x11676\x13\x11\x14\x0e\x05\a\x06\"'.\x065\x11463!2\x16\x04@\xfe@w^\xeb\xc0Cc\x89t~5\x10\f\x1c\f\x105~t\x89cC&\x1a\x04\x80\x1a&\x02@\x02\x80\xfb\x8f?J\xb8\x03\xb0\xfd\x00V\xa9\x83|RI\x1a\a\x06\x06\a\x1aIR|\x83\xa9V\x03\x00\x1a&&\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\x03\x00\x13\x00#\x00G\x00\x00\x17!\x11!%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x11\x14\x06#!\"&5\x1146;\x01546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x0132\x16\x80\x05\x80\xfa\x80\x01\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x80L4\xfa\x804LL4\x80^B@B^\x01\x80^B@B^\x804L\x80\x04\x00\xc0\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12\x0e\x01 \x0e\x12\x12\x0e\xfe\xe0\x0e\x12\x12N\xfb\x004LL4\x05\x004L`B^^B``B^^B`L\x00\x00\x00\x02\x00\x03\xff\x80\x05\x80\x05\xe0\x00\a\x00L\x00\x00\x004&\"\x06\x14\x162%\x11\x14\a\x06#\"'%.\x015!\x15\x1e\x01\x15\x11\x14\x06#!\"&5\x114675#\"\x0e\x03\a\x06#\"'.\x017>\x047&5462\x16\x15\x14\a!467%632\x17\x16\x02\x00&4&&4\x03\xa6\f\b\f\x04\x03\xfe@\v\x0e\xff\x00o\x91&\x1a\xfe\x00\x1a&}c ;pG=\x14\x04\x11(\x10\r\x17\x11\f\x05\x138Ai8\x19^\x84^\x0e\x01.\x0e\v\x01\xc0\x03\x04\f\b\f\x05&4&&4&`\xfe\xc0\x10\t\a\x01`\x02\x12\vf\x17\xb0s\xfc\xe0\x1a&&\x1a\x03 j\xa9\x1eo/;J!\b#\a\f2\x18\n KAE\x12*,B^^B!\x1f\v\x12\x02`\x01\a\t\x00\x00\x02\x00$\xff \x06\x80\x05\x80\x00\a\x00-\x00\x00\x004&\"\x06\x14\x162\x01\x14\x02\a\x06\a\x03\x06\a\x05\x06#\"/\x01&7\x13\x01\x05\x06#\"/\x01&7\x1367%676$!2\x16\x05\xa08P88P\x01\x18\x97\xb2Qr\x14\x02\x0e\xfe\x80\a\t\f\v@\r\x05U\xfe\xe7\xfe\xec\x03\x06\x0e\t@\x11\f\xe0\n\x10\x01{`P\xbc\x01T\x01\x05\x0e\x14\x04\x18P88P8\x01\x80\xf9\xfe\x95\xb3P`\xfe\x85\x10\n\xe0\x04\t@\x0e\x12\x01\x14\x01\x19U\x01\t@\x13\x14\x01\x80\x0e\x02\x14rQ\xbb\x8e\x13\x00\x00\x00\x01\x00\x00\x00\x00\x06\xd1\x05\x00\x00\x16\x00\x00\x01\x03!\x136'&+\x01\x03!\x13!\x03!\x13\x03!2\x16\x17\x1e\x01\x06Ѥ\xfe\xb2\xb2\r\x1c\x1b8\xa9\xcc\xfe\xb2\xcc\xfe\xe2\xcc\xfe\xb2̙\x04\xfce\xb1;<*\x02\xfb\xfd\x05\x03@8 !\xfcG\x03\xb9\xfcG\x03\xb9\x01GQII\xbf\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%764'\t\x0164/\x01&\"\a\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x8df\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x13\x01\xc6\x134\x02\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8df\x134\x13\x013\x013\x134\x13f\x13\x13\xfe:\x134\x13\xfe:\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164'\x01&\"\x0f\x01\x06\x14\x17\t\x01\x06\x14\x1f\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xcd\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x13f\x134\x03F\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x8d\x01\xc6\x134\x13\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x02\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00\x01764'\x01&\"\a\x01\x06\x14\x1f\x01\x1627\t\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x8df\x13\x13\xfe:\x134\x13\xfe:\x13\x13f\x134\x13\x013\x013\x134\x01\x86\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x8df\x134\x13\x01\xc6\x13\x13\xfe:\x134\x13f\x13\x13\x013\xfe\xcd\x13\x01\xd7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00 \x00\x00%\x0164/\x01&\"\a\t\x01&\"\x0f\x01\x06\x14\x17\x01\x162\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03-\x01\xc6\x13\x13f\x134\x13\xfe\xcd\xfe\xcd\x134\x13f\x13\x13\x01\xc6\x134\x02\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xed\x01\xc6\x134\x13f\x13\x13\xfe\xcd\x013\x13\x13f\x134\x13\xfe:\x13\x02w\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x02\x00\x00\xff@\x05\x80\x05\x80\x00\x11\x00\x16\x00\x00\x017!\x13!\x0f\x01/\x01#\x13\x0535%\x13!'\x01!\x03\x05%\x04j\x10\xfc\x8c/\x02d\x16\xc5\xc4\r\xaf\x16\x01j\x04\x01g2\xfd|\x0f\xfe8\x05\x80\x80\xfd\xbe\xfd\xc2\x03\xab\xaf\xfd\xea\xe455\x8c\xfe\xead\x01c\x02 \xb5\x01\xd5\xfab\xa2\xa2\x00\x00\x00\x01\x00\f\xff@\x06\xf4\x05\x80\x00\x0f\x00\x00\x01!\t\x02\x13!\a\x05%\x13!\x13!7!\x01\x13\x05\xe1\xfe\xf6\xfc\xdc\xfdFG\x01)\x1d\x01\xa6\x01\xe6D\xfbH:\x04\xb9&\xfbH\x05\x80\xfa\xcb\xfe\xf5\x01\v\x01d\x93\xa1\xa1\x01S\x01)\xbf\x00\x00\x00\x02\x00\x00\xff\x10\a\x00\x06\x00\x00\a\x00U\x00\x00\x004&\"\x06\x14\x162\x01\x11\x14\a\x06#\"/\x01\x06\x04 $'\a\x06#\"'&5\x11463!2\x17\x16\x0f\x01\x1e\x01\x17\x11#\"&=\x0146;\x015.\x015462\x16\x15\x14\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x11>\x017'&763!2\x16\x03\xc0&4&&4\x03f\x14\b\x04\f\v]w\xfeq\xfe4\xfeqw]\t\x0e\x04\b\x14\x12\x0e\x01`\x16\b\b\x0fdC\xf5\x95\xc0\x1a&&\x1a\xc0:F\x96ԖF:\xc0\x1a&&\x1a\xc0\x95\xf5Cd\x0f\b\b\x16\x01`\x0e\x12\x04\xe64&&4&\xfc\xa0\xfe\xa0\x16\b\x02\t]\x8f\xa7\xa7\x8f]\t\x02\b\x16\x01`\x0e\x12\x14\x13\x10d[}\x14\x02\x87&\x1a\x80\x1a&\xa3\"uFj\x96\x96jFu\"\xa3&\x1a\x80\x1a&\xfdy\x14}[d\x10\x13\x14\x12\x00\x01\x00\x00\x00\x00\x04\x80\x06\x00\x00#\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x01\x114\x00 \x00\x15\x14\x06+\x01\"&54&\"\x06\x15\x11\x04 (88(\xfc@(88( \x01\a\x01r\x01\a&\x1a@\x1a&\x96Ԗ\x03\x008(\xfd\xc0(88(\x02@(8\x01@\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1aj\x96\x96j\xfe\xc0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00'\x003\x00\x00\x00\x14\x06\"&462\x00\x10& \x06\x10\x16 \x00\x10\x00 \x00\x10\x00 \x00\x10.\x02 \x0e\x02\x10\x1e\x02 >\x01\x12\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4\x01\x16\xe1\xfe\xc2\xe1\xe1\x01>\x01a\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8\x01\xacf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xe6\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\xfea\x01>\xe1\xe1\xfe\xc2\xe1\x02T\xfeX\xfe\xd4\x01,\x01\xa8\x01,\xfd~\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x02@\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\x02\x00\x05\x80\x03\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x02\x008(\xc0(88(\xc0(8\x03 \xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88\x00\x00\x00\x00\x03\x00\x00\x00\x00\x01\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x808(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(88(\xc0(8\x01 \xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x01\xd8\xc0(88(\xc0(88\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x1b\x005\x00E\x00\x00$4&\"\x06\x14\x162%&\x00'&\x06\x1d\x01\x14\x16\x17\x1e\x01\x17\x1e\x01;\x0126%&\x02.\x01$'&\a\x06\x1d\x01\x14\x16\x17\x16\x04\x12\x17\x1e\x01;\x01276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\x00KjKKj\x01\xaa\r\xfe\xb9\xe9\x0e\x14\x11\r\x9a\xdc\v\x01\x12\r\x80\r\x14\x01\u007f\x05f\xb1\xe9\xfe\xe1\x9a\x0e\t\n\x12\r\xcc\x01\\\xd1\a\x01\x12\r\x80\r\n\v\x01\x1f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xcbjKKjK\"\xe9\x01G\r\x01\x14\r\x80\r\x12\x01\vܚ\r\x11\x14\r\x9a\x01\x1f\xe9\xb1f\x05\x01\n\n\r\x80\r\x12\x01\a\xd1\xfe\xa4\xcc\r\x12\n\t\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x0164'\x01&\a\x06\x15\x11\x14\x17\x16327\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x03\xb2 \xfd\xe0\x1f! \x10\x10\x11\x0f\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfd\x97\x12J\x12\x01@\x13\x12\x13%\xfd\x80%\x13\b\t\x00\x03\x006\xff5\x06\xcb\x05\xca\x00\x03\x00\x13\x00/\x00\x00\t\x0564'\x01&\"\a\x01\x06\x14\x17\x01\x162\t\x01\x06\"/\x0164&\"\a'&47\x0162\x1f\x01\x06\x14\x1627\x17\x16\x14\x04\x00\x01<\xfd\xc4\xfe\xc4\x01i\x02j\x13\x13\xfe\x96\x126\x12\xfd\x96\x13\x13\x01j\x126\x03\x8b\xfcu%k%~8p\xa08}%%\x03\x8b%k%}8p\xa08~%\x04<\xfe\xc4\xfd\xc4\x01<\xfei\x02j\x134\x13\x01j\x12\x12\xfd\x96\x134\x13\xfe\x96\x12\x02\x8f\xfct%%~8\xa0p8~%k%\x03\x8a%%}8\xa0p8}%k\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00\x00\x0154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfc\x80\x1a&&\x1a\x03\x80\x1a&\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02@\x80\x1a&&\x1a\x80\x1a&&\x02:\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x03@\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x01\x00\x03\x00\x00\x03\xfa\x05\u007f\x00\x1c\x00\x00\x01\x06+\x01\x11\x14\x06#!\"'&?\x0163!\x11#\"'&7\x0162\x17\x01\x16\x03\xfa\x12(\xc0\x12\x0e\xfd@\x15\b\b\f\xa0\t\x10\x01@\xc0(\x12\x11\x1a\x01@\x12>\x12\x01@\x1b\x03\xa5%\xfc\xa0\x0e\x12\x12\x14\x0f\xc0\v\x02\x80%%\x1f\x01\x80\x16\x16\xfe\x80 \x00\x00\x00\x01\x00\x03\xff\x80\x03\xfa\x05\x00\x00\x1b\x00\x00\x13!2\x16\x15\x1132\x16\a\x01\x06\"'\x01&76;\x01\x11!\"/\x01&76 \x02\xc0\r\x13\xc0($\x1b\xfe\xc0\x12>\x12\xfe\xc0\x1a\x11\x12(\xc0\xfe\xc0\x0e\v\xa0\r\t\t\x05\x00\x13\x0e\xfc\xa1J \xfe\x80\x16\x16\x01\x80\x1f&%\x02\x80\v\xc0\x0e\x14\x13\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00$\x00\x00%\x0164/\x01&\"\a\x01'&\"\x0f\x01\x06\x14\x17\x01\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad\x02f\x13\x13f\x134\x13\xfe-\xd3\x134\x13f\x13\x13\x01f\x134\x03f\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xed\x02f\x134\x13f\x13\x13\xfe-\xd3\x13\x13f\x134\x13\xfe\x9a\x13\x03\x86\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x06\x00\x10\x00\x15\x00\x1f\x00/\x00\x00\x01\x17\a#5#5\x01\x16\a\x01\x06'&7\x016\t\x03\x11\x01764/\x01&\"\x0f\x01%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x94\x9848`\x01\xd2\x0e\x11\xfe\xdd\x11\r\x0e\x11\x01#\x11\xfe\xfb\x02 \xfe\xe0\xfd\xe0\x03\x80\\\x1c\x1c\x98\x1cP\x1c\\\x02\xa0\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xac\x984`8\x01\xba\r\x11\xfe\xdd\x11\x0e\r\x11\x01#\x11\xfd@\x02 \x01 \xfd\xe0\xfe\xe0\x02`\\\x1cP\x1c\x98\x1c\x1c\\`\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00)\x00\x00\x01\x114&#!\"\a\x06\x1f\x01\x01\x06\x14\x1f\x01\x1627\x01\x17\x163276\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00&\x1a\xfe *\x11\x11\x1f\x90\xfd\xea\x13\x13f\x134\x13\x02\x16\x90\x12\x1b\f\r'\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02`\x01\xe0\x1a&')\x1d\x90\xfd\xea\x134\x13f\x13\x13\x02\x16\x90\x13\x05\x11\x02*\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00\t\x0164'\x01&\a\x06\x1d\x01\"\x0e\x05\x15\x14\x17\x163276'\x027>\x013\x15\x14\x17\x1632\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xed\x01`\x13\x13\xfe\xa0\x1e'(w\u0083a8!\n\xa7\v\x0e\a\x06\x16\x03,j.\xa8\x8c(\f\f\x1a\x02&\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xb3\x01`\x134\x13\x01`\x1f\x11\x11*\xa0'?_`ze<\xb5\xdf\f\x03\t\x18\x01bw4/\xa0*\x11\x05\x02\xc0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\x06\x00\x12\x00\x1e\x00\x00\x01-\x01\x01\x11\x01\x11\x00\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\x80\x01\x00\xff\x00\x01\x80\xfe\x00\x03 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xc0\x80\x80\x01O\xfd\xe2\xff\x00\x02\x1e\xfe\xdd\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x16\a\x01\x06\"'\x01&763!2\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x12\x17\xfe\xc0\x13B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x98\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03]#\x1f\xfe@\x1b\x1b\x01\xc0\x1f##\xfd \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x01\x06#!\"'&7\x0162\x17\x01\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04y\x11(\xfd\x80(\x11\x12\x17\x01@\x13B\x13\x01@\x17u\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xa3###\x1f\x01\xc0\x1b\x1b\xfe@\x1f\xfe\xda\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\r\x00\x1d\x00-\x00\x00\x00\x14\a\x01\x06'&5\x11476\x17\x01\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04@\x1b\xfe@\x1f####\x1f\x01\xc0\xdb\x12\x0e\xfc@\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\xa1B\x13\xfe\xc0\x17\x12\x11(\x02\x80(\x11\x12\x17\xfe\xc0\xfd\xec\x03\xc0\x0e\x12\x12\x0e\xfc@\x0e\x12\x12\x03\xce\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x00\x00\x00\x03\xf3\x05\x80\x00`\x00\x00%\x17\x16\x06\x0f\x01\x0e\a#\"\x00'#\"&=\x0146;\x01&7#\"&=\x0146;\x016\x0032\x17\x16\x17\x16\x0f\x01\x0e\x01/\x01.\x05#\"\x06\a!2\x17\x16\x0f\x01\x06#!\x06\x17!2\x17\x16\x0f\x01\x0e\x01#!\x1e\x0132>\x04?\x016\x17\x16\x03\xd0#\x03\f\v\x05\x04\r\x13\x18\x1b!\"'\x13\xea\xfe\xa2?_\r\x13\x13\rB\x02\x03C\x0e\x12\x12\x0ebC\x01a\xe0f\\\v\t\x06\x03+\x03\x16\r\x04\x04\x0f\x14\x19\x1b\x1f\x0e~\xc82\x01\xd4\x10\t\n\x03\x18\x05\x1b\xfe\x18\x03\x03\x01\xcb\x0f\n\t\x03\x18\x02\x12\v\xfe}0\xcb\u007f\x12$\x1f\x1c\x15\x10\x04\x05\r\r\f\xe5\x9f\f\x15\x04\x01\x02\x03\x06\x05\x05\x05\x04\x02\x01\x05\xdd\x13\rq\r\x1390\x12\x0er\x0e\x12\xd2\x01\x00\x17\x03\f\v\r\x9f\r\r\x04\x01\x01\x03\x04\x03\x03\x02\x80p\f\f\x0er\x1a%D\f\f\x0fp\v\x0fu\x89\x03\x04\x05\x05\x04\x01\x02\x05\a\a\x00\x00\x01\x00\x00\x00\x00\x03\xfc\x05\x80\x00?\x00\x00\x01\x11\x14\x06#!\"&=\x0146;\x01\x11#\"&=\x0146;\x0154632\x17\x1e\x01\x0f\x01\x06\a\x06'.\x02#\"\x06\x1d\x01!2\x16\x1d\x01\x14\x06#!\x11!546;\x012\x16\x03\xfc\x12\x0e\xfcD\x0e\x12\x13\ra_\x0e\x12\x12\x0e_\xf7\xbf\xb9\x96\t\x02\bg\t\r\r\n\x05*`-Uh\x011\r\x13\x13\r\xfe\xcf\x01\x9e\x12\x0e\xa2\x0e\x12\x01\x8f\xfe\x91\x0e\x12\x12\x0e\x96\r\x13\x01\u007f\x13\r\x83\x0e\x12߫\xde}\b\x19\n\u007f\v\x01\x02\t\x05\x1c$^L\xd7\x12\x0e\x83\r\x13\xfe\x85\xb5\r\x13\x13\x00\x00\x00\x01\x004\xff\x00\x03\xd2\x06\x00\x00b\x00\x00\x01\x14\x06\a\x15\x14\x06+\x01\"&=\x01.\x04'&?\x01676\x170\x17\x16\x17\x1632654.\x03'.\b5467546;\x012\x16\x1d\x01\x1e\x04\x17\x16\x0f\x01\x06\a\x06'.\x04#\"\x06\x15\x14\x1e\x04\x17\x1e\x06\x03\xd2ǟ\x12\x0e\x87\r\x13B{PD\x19\x05\x11\x0fg\a\x10\x0f\t\x02q\x82%%Q{\x1e%P46'-N/B).\x19\x11ĝ\x13\r\x87\x0e\x129kC<\x12\x06\x11\fQ\b\x0f\x0e\r\x03\x177>W*_x\x11*%K./58`7E%\x1a\x01_\x99\xdd\x1a\xaf\x0e\x12\x13\r\xaf\t,-3\x18\x06\x15\x14\x87\n\x02\x02\v\x02c\x1a\bVO\x1c2\")\x17\x15\x10\x12#\x1b,)9;J)\x8a\xd0\x1e\xb4\r\x13\x12\x0e\xb0\x06\"!*\x10\x06\x12\x14\x92\x0f\x01\x03\n\x03\x12#\x1d\x17VD\x1a,'\x1b#\x13\x12\x14\x17/&>AX\x00\x01\x00\x00\x00\x00\x03\x82\x05\x80\x00>\x00\x00\x01\x15\x14\x06+\x01\x0e\x01\a\x16\x01\x16\a\x06+\x01\"'\x00'&=\x0146;\x01267!\"&=\x01463!&+\x01\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01\x16\x1732\x16\x03\x82\x12\x0e\xa8\x17Ԫ\xa7\x01$\x0e\n\b\x15\xc3\x10\t\xfe\xce\xc0\t\x13\rp\x84\xa1\x16\xfeU\x0e\x12\x12\x0e\x01\x9d9ӑ\r\x13\x12\x0e\x03@\x0e\x12\x12\x0e\xe9/\x11\xab\x0e\x12\x04*f\x0e\x12\x90\xb4\x14\xb2\xfe\x9a\x10\x12\x12\f\x01o\xcc\t\r\u007f\r\x13VR\x12\x0ef\x0e\x12q\x13\r\x85\x0e\x12\x12\x0ef\x0e\x12=S\x12\x00\x01\x00\x04\x00\x00\x03\xff\x05\x80\x00E\x00\x00!#\"&5\x11!\"&=\x01463!5!\"&=\x0146;\x01\x01&76;\x012\x17\x13\x16\x17>\x017\x136;\x012\x17\x16\a\x0132\x16\x1d\x01\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x11\x14\x06\x02[\xac\r\x13\xfe\xe0\r\x13\x13\r\x01 \xfe\xe0\r\x13\x13\r\xd6\xfe\xbf\b\b\n\x12\xc2\x13\n\xd7\x13%\n)\a\xbf\b\x15\xbf\x11\n\t\b\xfe\xc7\xd7\r\x13\x13\r\xfe\xde\x01\"\r\x13\x13\r\xfe\xde\x13\x12\x0e\x01J\x12\x0eg\r\x13U\x12\x0eh\r\x13\x02B\x10\x10\x10\x12\xfeW&W\x18X\x11\x01\xa4\x13\x10\x0e\x11\xfd\xbd\x13\rh\x0e\x12U\x13\rg\x0e\x12\xfe\xb6\r\x13\x00\x02\x00\x00\x00\x00\x05\x00\x05\x80\x00\a\x008\x00\x00\x004&#!\x11!2\x00\x10\x06#!\x15!2\x16\x1d\x01\x14\x06#!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015#\"&=\x0146;\x01\x11463!2\x04\x13\x82j\xfe\xc0\x01@j\x01o\xfd\xc8\xfe\xac\x01\xf9\x0e\x12\x12\x0e\xfe\a\x13\r\xa7\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e\x02\x1b\xc8\x03g\xc8|\xfe@\x01\xa1\xfe~\xf4v\x12\x0e\x80\x0e\x12\xc0\x0e\x12\x12\x0e\xc0\x12\x0e\x80\x0e\x12v\x12\x0e\x95\r\x13\x02u\x0e\x12\x00\x06\x00\x00\x00\x00\a\x00\x05\x80\x00\b\x00\f\x00\x10\x00\x19\x00\x1d\x00n\x00\x00\x01\x13#\x13\x16\x14\x1746\x137!\x17!3'#\x01\x13#\x13\x14\x16\x1746\x137!\x17\x05\x15\x14\x06+\x01\x03\x06+\x01\"'\x03#\x03\x06+\x01\"&'\x03#\"&=\x0146;\x01'#\"&=\x0146;\x01\x03&76;\x012\x17\x13!\x136;\x012\x17\x13!\x136;\x012\x17\x16\a\x0332\x16\x1d\x01\x14\x06+\x01\a32\x16\x02\x02Q\x9fK\x01\x01\x01t#\xfe\xdc \x01\xa1\x8b#F\x01\x9fN\xa2Q\x01\x01\x01o!\xfe\xd7\"\x02\x80\x12\x0eդ\a\x18\x9f\x18\a\xa6ѧ\a\x18\x9f\v\x11\x02\xa0\xd0\x0e\x12\x12\x0e\xaf!\x8e\x0e\x12\x12\x0emY\x05\n\n\x10\x89\x1a\x05Z\x01ga\a\x18~\x18\ab\x01m]\x05\x1a\x89\x10\n\n\x05[o\x0e\x12\x12\x0e\x91\"\xb3\x0e\x12\x01U\x01+\xfe\xd4\x01\x04\x01\x01\x05\x01\xac\x80\x80\x80\xfd\xd4\x01,\xfe\xd5\x01\x05\x01\x01\x04\x01\xad\x80\x80 @\x0e\x12\xfd\x98\x18\x18\x02h\xfd\x98\x18\x0e\n\x02h\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x01X\x0f\r\f\x18\xfe\x98\x01h\x18\x18\xfe\x98\x01h\x18\f\r\x0f\xfe\xa8\x12\x0e@\x0e\x12\x80\x12\x00\x00\x03\x008\xff\x00\x04\xe8\x05\x80\x003\x00H\x00\\\x00\x00\x01\x16\a\x1e\x01\a\x0e\x04\a\x15#5\"'\x15#\x11\"&+\x017327\x113&#\x11&+\x015\x172753\x156353\x15\x1e\x03\x034.\x04\"\x06#\x112\x162>\x06\x034.\x04\x0e\x01#\x112\x16>\x06\x04\x8f\x12\x95ut\r\a3Nt\u007fR\x9aP*\x9a\x12H\x13\xc8\x1fo2\b\x10\x06\n\rLo\xd4@!\x9aR(\x9aOzh=\xd1\x1e,GID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xee\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x1e\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xdf?jJrL6V\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x127>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x02/rr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x00\x00\x00\x00\x04\x00\"\xff\x00\x05\xce\x06\x00\x00\n\x00$\x007\x00V\x00\x00\x014&#\"\x06\x14\x16326\x01\x14\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x1132\x16\x05\x15!53\x1146=\x01#\a\x06\x0f\x01'73\x11\x13\x14\x0e\x03#\"'&'7\x16\x17\x163267#\x0e\x01#\"&54632\x16\x05BX;4>ID2F\xfd\x9e\n\xfe\xc1\n\r\f\v\xfe\xc0\x0f\b\b\x16\xc0\x12\x0e\xc0\x0e\x12\xc0\x0e\x12\x02\xd0\xfe+\xa7\x01\x02\a\b\x12>R\xc0{\xc3\x1a8PuE>.\x18\x12'\x0f\x10%&Te\x10\x02\x15Q,j\x86\x90m{\xa4\x04\xdf?jJrL6\xfb\xaa\f\f\xfe\xc1\t\t\x01@\x10\x13\x14\x05`\x0e\x12\x12\x0e\xfa\xa0\x12\xfcrr\x01\xb0\a\x18\x05\x10\f\r\x12:V\xb9\xfdr\x053>wmR1\x10\b\aq\a\x04\ruW\x17\x1c\x8fei\x92\xbd\x00\x00\x03\x00\x00\xff\x80\x06@\x05\x80\x00\v\x00\x1b\x00\\\x00\x00%4&#\"\x06\x15\x14\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x14\a\x16\x15\x16\a\x16\a\x06\a\x16\a\x06\a+\x02\".\x01'&'.\x015\x11467>\x01767>\x027>\x027632\x1e\x05\x15\x14\x0e\x01\a\x0e\x02\a!2\x16\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04\xa07\x0f\x03.\x11\x11\x0f'\t:@\x85$L\x11B\x9cWM{#\x1a&$\x19\x18h1D!\x12\x1a\t\t\a\v\x1c\x14\x13\x1a.I/!\x0f\t\x01\x13\x13\x12\x03\x0e\b\x04\x01\x15Nr\xc0\x1a&&\x1a\x1b%%\x02\x1b\xfd\x80\x1a&&\x1a\x02\x80\x1a&&\x1aV?, L=8=9%pEL\x02\x1f\x1b\x1a+\x01\x01%\x1a\x02\x81\x19%\x02\x02r@W!\x12<%*',<\x14\x13\x15\x1f2(<\x1e\x18&L,\"\x06\x18\x14\x0er\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06@\x05\x00\x00\v\x00\x1b\x00\\\x00\x00\x01\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26%\x16\x15\x0e\x01#!\x1e\x02\x17\x1e\x02\x15\x14\x0e\x05#\"'.\x02'.\x02'&'.\x01'.\x015\x1146767>\x02;\x03\x16\x17\x16\a\x16\x17\x16\a\x16\a\x14\x01\x00&\x1a\x1b%%\x1b\x1a&\xa0&\x1a\xfe\xe0\x1a&&\x1a\x01 \x1a&\x04i7\x01qN\xfe\xeb\x04\b\x0e\x03\x12\x12\x14\x01\t\x0f!/I.\x1a\x13\x14\x1c\v\a\t\t\x1a\x12!D1h\x18\x19$&\x1a#{MW\x9cB\x11L$\x85@:\t'\x0f\x11\x11.\x03\x03\xc0\x1a&&\x1a\x1b%%\xfd\xe5\x02\x80\x1a&&\x1a\xfd\x80\x1a&&\xaf=XNr\x0e\x14\x18\x06%(M&\x18\x1e<(2\x1f\x15\x13\x14<,'*%<\x12!W@r\x02\x02%\x19\x02\x81\x1a%\x01\x01+\x1a\x1b\x1f\x02LEp%9=8=L \x00\x00\f\x00\x00\xff\x80\x06\x00\x05\x80\x00\t\x00\x0f\x00\x17\x00+\x00=\x00\\\x00d\x00\u007f\x00\x8c\x00\x9e\x00\xb2\x00\xc2\x00\x00%54#\"\a\x15\x16327354\"\x15%\x15#\x11#\x11#5\x05\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x05\x15\x14\a\x06#\"'\x15#\x113\x15632\x17\x16\x17\x15\x14\a\x06\a\x06#\"'&=\x014762\x17\x16\x1d\x01#\x15\x143274645\x01\x15\x14\"=\x0142\x014'.\x01'&! \a\x0e\x01\a\x06\x15\x14\x17\x1e\x01\x17\x16 7>\x0176\x01\x13#\a'#\x1e\x01\x17\x16\x17\x153%54'&#\"\a\x06\x1d\x01\x14\x17\x163276\x173\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x97\x1d\x11\x10\x10\x11\x1d\xb8BB\xfd\xc5PJN\x01\xb1C'%!\t\x06B\x01\x01\x0e\x14\x16\x01?\a\f)#!CC $)\f\a\xfb\x02\x03\f\x1b54\x1d\x15\x14\x1df\x1b\x15\x85\"\x18\x06\x01\xfe\x81@@\x02\x15\x13\nB+\x88\xfe\xec\xfe\xed\x88,A\n\x14\x14\nA+\x89\x02&\x89+A\n\x14\xfd\rZK35N\a \b#\vJ\x01!\x15\x1d13\x1b\x15\x15\x1b31\x1d\x15\xb5CC\x16\x14\x0f\x01\x01C\x06\v $)\x01\xf7\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xe9\x9d2\x10\xe0\x10\xab\"33\xe8F\xfeY\x01\xa7F~\xfe\x91(-\x1c\x11%\x01\"\xfe\xf2\x18\x02\x0f\x1f\x01\x18o\x924\x15*)$\x01\xed\xa1(*\x15\xb6\t\x1d\x0e\x16\x12(&\x1b;\x81;\x1b&&\x1d9LA3\x1a\x01\f\x15\v\x038\x9c33\x9c4\xfd\x03\xb1S,;\x05\x0f\x0f\x05;,W\xad\xb0T+<\x05\x0f\x0f\x05<+T\x03;\x01(\xc3\xc3\x17\\\x17g7\xc9x\x82:\x1d&&\x1d:\x82:\x1d&&\x1b<\x01r\xfe\xe5\x1f\x10\x02\x18\x01\x10\xfe\xdb%\x12\x1b-\x01\b\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\v\x00\x1b\xff\x00\x05\xe5\x06\x00\x00\t\x00\x0f\x00\x17\x00+\x00=\x00[\x00c\x00}\x00\x89\x00\x9b\x00\xaf\x00\x00\x01\x15\x14#\"'\x11632\x05\x15#542%35!\x153\x113!3\x11#\x11\x06#\"'&5\x11#\x11\x14\x17\x16327%54'&#\"\a5#\x1135\x163276%5#\x14\a\x06#\"=\x01354'&#\"\a\x06\x1d\x01\x14\x17\x16327676\x0154\"\x1d\x01\x142\x01\x14\a\x0e\x01\a\x06 '.\x01'&547>\x0176 \x17\x1e\x01\x17\x16\x013\x03\x11#\x11&'&'3\x13\x05\x15\x14\a\x06#\"'&=\x0147632\x17\x16%\x11#5\x06#\"'&5\x113\x11\x14\x17\x16327\x11\x03\xcb'\x17\x16\x16\x17'\x01RZZ\xfc:k\xfe\xc8id\x01 YY\x1e\x1b\x12\x03\x01Y\b\f.06\x01\xad\t\x1162+YY-06\x11\t\x01R[\x02\a!.\xb3\x1b'CD'\x1c\x1d'EH$\x12\x03\x02\xfd\xa0VV\x02\xcf\x1a\x0eX:\xb8\xfd\x1a\xb8:Y\r\x1a\x1a\x0eX;\xb7\x02\xe6\xb8:Y\r\x1a\xfc\x1afyd\x0e/%\x1cjG\x01\xb6\x1c&DC&\x1c\x1c&CD&\x1c\x01O[52.\r\b[\x01\x03\x12\x1b\x1e\x01$\xd3C\x16\x01-\x16D..D\x96^^\xfd\xc7\x01\xee\xfe\x86*\x15\x03 \x01l\xfey1\x18%=^\xc5I\x1a86\xd9\xfdi077\x1bS\r3\n$EWgO%33%O\xadO%35\x1b\x1b\t\x03\xc2\xd2EE\xd2F\xfdW\xeat;P\x06\x15\x15\x06P;p\xee\xeat;P\a\x14\x14\aP;p\x04\x0e\xfeq\xfe\xf1\x01\x0fJ\x8agT\xfe\xf9F\xafQ%33&P\xafP%33%R\xfe\r7>%\x183\x01\x8a\xfe\x91!\x02\x16+\x01}\x00\x00\x02\x00\x05\xff\x80\x05{\x05\xf6\x00\x13\x00'\x00\x00\x01\x06\x03\x06+\x01\"&7\x132'\x03&76;\x012\x17\x01\x16\a\x01\x15\x01\x16\a\x06+\x01\"'\x016\x016;\x012\x02U\n\xf7\x1b&\xef\x15\x14\n\xfd\x01\x01\xa1\f\v\t\x17\xef(\x1a\x03\xca\v\v\xfd\xf0\x01P\v\n\n\x16\xef*\x18\xfe\xad\x12\x02\x01\x19'\xf1\x16\x03e\x12\xfeJ.\"\x13\x01\xc0\x01\x01\x17\x16\x0f\x0f-\x01d\x10\x15\xfcZ\x01\xfd\x99\x14\x11\x0f-\x02n \x03\x8e-\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x13\x00'\x007\x00\x00\x014'&+\x01\"\a\x06\x1f\x01\x15\x03\x06\x17\x16;\x0127\x01&+\x01\"\a\x01\x16\x01\x16;\x01276'\x015\x016\x17\x11\x14\x06#!\"&5\x11463!2\x16\x02\xad~\x15\x1f\xb8\x12\b\a\b}\xc4\t\t\b\x10\xb9\x1f\x13\x037\a\x11\xbb\x1e\x13\xfee\x01\x01\x05\x14 \xb8\x12\a\b\t\xfe\xfc\x01\x99\b۩w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x03\x01\xdd\"\v\f\x11\xd8\x01\xfe\xa6\x0e\x0e\r$\x03Q\f#\xfd'\x02\xfe!#\f\r\x0f\x01\xdc\x01\x02\xd3\x10\x88\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00\x00\x00\n\a\x00\x04\xf6\x00\x02\x00I\x00\x00\x01-\x01\x132\x04\x1f\x012\x1e\x05\x17\x1e\x02\x17\x1e\x01\x17\x1d\x01\x16\a\x0e\x01\x0f\x01\x0e\x06#\x06!&$/\x02.\x02'.\x02'.\x01'=\x01&7>\x01?\x01>\x0636\x02\xc7\x01\xe4\xfe\x1c\xb9\xa8\x019II\x01 \x0e!\x18 \x1e\x0e\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0f\x1f\x01\xfb\xfe\x88\xcf\xfe\xcf01$$%A\x18\x06\x13'\a\b\t\x01\x01\x13\a$\x0e\x0e\x0e\x1e \x18!\x0e \x01\xfb\x01\x98\xfa\xfd\x01g\t\x05\x04\x03\x03\x06\n\x10\x17\x0f\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x0f\n\x06\x03\x03\x13\x02\t\x03\x04\x04\x05\n \x19\x06\x19\\7@\x91)(\x88\x91\x917Y\x11\x11\x0f\x17\x10\n\x06\x03\x03\x12\x00\x00\x05\x00@\xff\x80\x06\xc0\x05\x8a\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00\x00\t\x04\x15\x01\x15'\a5\x015\x17\x015\x177\x15\t\f\x01\x92\x01\xee\xfe\xaa\xfe\x16\x05,\xfe\x16\x01\x01\xfe\x17\x93\x01V\x01\x01\x01W\xfdQ\x01V\xfe\x12\xfe\xae\x05.\x01R\xfe\x17\xfe\xa9\x01W\x01\xe9\xfe\xae\xfe\x12\x03=\xfe\xcf\xfe\xe3\x01?\xfe\xe4l\xfe\xdb\x01\x01\x01\x01\x01%l`\x01\x1c\x02\x01\x01\x02\xfe\xe4\x04\xd8\xfe\xe3\xfe\xd0\x01\x0e\xfe\xf2\xfe\xf1\xfe\xc1\x01\x1d\x03~\xfe\xc1\xfe\xf2\x010\x00\x06\x00\v\xff\x00\x05\xf5\x06\x00\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00\x00\x05!\x11#\x11!\x11#%7\x05\a\x017\x01\a\x017\x01\a\x03\x01\a\t\x015!\x15\x05\t\xfb\xa2\xa0\x05\x9e\xa0\xfcR!\x03\x0f!\xfdXC\x02\xd5C\xfd\xf4f\x02ff\xd9\x01݀\xfe#\xfd\xb2\x03 `\x01\xe0\xfd\x80\x02\x80,\x9d\xa5\x9c\x02\x1a\x92\xfe\xad\x91\x02\xb6{\xfd\xff{\x03{\xfd\u007f`\x02\x81\xfa\xa1\x9f\x9f\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00O\x00g\x00\x00\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 $\x14\x06\"&462$\"&\x0e\x02\a\x0e\x01\a\x0e\x03\x16\x14\x06\x1e\x02\x17\x1e\x01\x17\x1e\x0362\x16>\x027>\x017>\x03&46.\x02'.\x01'.\x03\x00\x10\a\x0e\x01\a\x06 '.\x01'&\x107>\x0176 \x17\x1e\x01\x17\x04\x00\x96Ԗ\x96\xd4\x01 \xe6\xfe\xb8\xe6\xe6\x01H\x01R6L66L\xfeG\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x02n\x05\n\xe4\xd0X\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x02\x16Ԗ\x96Ԗ\x01\xa4\xfe\xb8\xe6\xe6\x01H\xe66L66L6\x80\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\x01\x01\x01\x05\x0f\v\x14L2\x1dUyH\x8b\x0e\x8bHyU\x1d2L\x14\v\x0f\x05\x01\xfen\xfe6X\xd0\xe4\n\x05\x05\n\xe4\xd0X\x01\xcaX\xd0\xe4\n\x05\x05\n\xe4\xd0\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x17\x00\x1f\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x01\x9a|\xb0||\xb0\x02\xb0|\xb0||\xb0\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfc\xa8\xb0||\xb0||\xb0||\xb0|\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x15\x00\x00\x01\x13!\x053\t\x0137!\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x00\xc9\xfen\x026^\xfe5\xfe5^h\x02\n\x01\xfb\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x03\x92\xfe\xce\xe0\x02\xb3\xfdM\xa0\x011\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x05\x00\x00\xffP\x05\x81\x05\xa3\x00\n\x00\x16\x00*\x00C\x00g\x00\x00\x01\x16\x06'.\x01676\x1e\x01\x17.\x01\a\x0e\x01\x17\x1e\x017>\x01\x13.\x02'$\x05\x0e\x02\a\x1e\x02\x17\x167>\x02\x13\x0e\x03\a\x0e\x01&'.\x03'&'?\x01\x16 7\x1e\x01\x06\x13\x06\x03\x0e\x02\a\x06%&'.\x04'.\x03'>\x04767$\x05\x16\x17\x1e\x01\x03/\bu5'\x1d\x1c&$I7o\x0e\xc6b?K\x03\x04\x93\\[z\xe4\x14H,1\xfe\xdd\xfe\xed+.@\x12\x1e\\7<\xe4\xdc?5\\V\b\x0f\r,$V\xcf\xc5g.GR@\x14\x19 \x06\x12\xdf\x027\xe0\x15\x06\x10\xb5\x1aU\x05,+!\xfc\xfe\x9a\xf8\x92\x0f\x15\r\x05\a\x02\t#\x15\x1a\t\x03\x1d\"8$\x1e}\xbc\x01{\x01)\x9b<\x10\x01\x02\xa5?L \x11RR\x11\x12\f;\x11kr,\x1cyE[\x80\b\b\x98\x02z\x1b#\t\b/1\a\n\"\x1a\x1c#\t\a\x1d\x1c\b\b#\xfc\x12\x1aeCI\x140/\x03\x11\b\x14\"5#`\xc4\x10\t\x94\x94\x06\"8\x03\xb8\xa7\xfe\x18\x1e4\x1c\x11~&\x1bp\f\x1d)\x1b4\t2\xc8{\xacH\x1a-\x1e\x1e\x0f\v.\x12%W.L\x14>\x00\x06\x00\x00\xff\x80\x06\x00\x05\x80\x00\b\x00\x13\x00'\x00:\x00Y\x00i\x00\x00\x014&\a\x06\x16\x17\x1667\x16\x0e\x01&'&676\x16\x13\x0e\x02\a\x06'.\x02'>\x0276\x17\x1e\x02\x1346&'\x06 '\x0f\x01\x16\x17\x16\x17\x167>\x02\x136'&'&\x05\x06\a\x0e\x02\a\x1e\x02\x17\x1e\x03\x17\x16\x17\x047>\x027\x12\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03PR$+\x01+'TJ\bX\x84j\x03\x027-F\x8f\xb6\x14C',\x9b\xa9,&C\x15\r.\"\x1e\xc6\xd2!$28\v\x05\x0f\xa1\xfeh\xa2\f\x05\x1a\x0f/\x9d\xf9\xb3\"\x1e\x0f\x87\t\x11+p\xd8\xfe\xf1\x84^&+3\x04\b\x16$\x06\x01\b\x06\x12\ri\xb3\x01\x03\xb5\x18\x1f\x1f\x040\x01(\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x9a+.\x16\x14i\x12\x176=Bn\f\\C1X\x14\x1fR\x01:\x15\x1a\x06\x05\x14\x14\x06\a\x19\x14\x13\x18\a\x05#\"\x05\a\x19\xfd\x03\a'\x19\x04jj\x06\f\x9a8Q\x1b.c\x13Aj\x02\xc75\x167!?\x1b\f\"\x0f\x140\x1eD\x8c\xca$\x054\x14\"\vP\x14\x1c[\r\x14&\x15\x01\v\x012\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00D\xff\x80\x04\x00\x06\x00\x00\"\x00\x00%\x17\x0e\x01\a\x06.\x035\x11#5>\x047>\x01;\x01\x11!\x15!\x11\x14\x1e\x0276\x03\xb0P\x17\xb0Yh\xadpN!\xa8HrD0\x14\x05\x01\a\x04\xf4\x01M\xfe\xb2\r C0N\xcf\xed#>\x01\x028\\xx:\x02 \xd7\x1aW]oW-\x05\a\xfeX\xfc\xfd\xfa\x1e45\x1e\x01\x02\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1f\x00/\x00\x00%'\x06#\x06.\x025\x11!5!\x11#\"\a\x0e\x03\a\x153\x11\x14\x1e\x027>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04p>,;$4\x19\n\x01\x01\xff\x00\xbc\b\x01\x05\x195eD\x82+W\x9bcE\x87\x01\xa2\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9K\xb7\x16\x01\x17()\x17\x01\x8e\xc2\x01F\n,VhV\x19\xa5\xfe^9tjA\x02\x010\x04/\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x01\x00\x03\xff@\x02\xfd\x06\x00\x00\x17\x00\x00\x00\x16\a\x01\x06#\"'\x01&76;\x01\x1146;\x012\x16\x15\x113\x02\xf5\x10\r\xfe\xa2\n\r\x0e\n\xfe\x9d\r\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x01\x00&\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x12\x0e\xfb \x00\x00\x00\x01\x00\x03\xff\x00\x02\xfd\x05\xc0\x00\x17\x00\x00\x01\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&7\x01632\x17\x01\x16\x02\xfd\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01c\r\x04\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\n\xfe\x80\x10\x00\x00\x00\x00\x01\x00@\x01\x03\a\x00\x03\xfd\x00\x17\x00\x00\x01\x15\x14\x06#!\x15\x14\x06'\x01&547\x016\x17\x16\x1d\x01!2\x16\a\x00\x12\x0e\xfb &\x10\xfe\x80\n\n\x01\x80\x10\x13\x13\x04\xe0\x0e\x12\x02\xe0\xc0\x0e\x12\xe0\x15\x10\r\x01^\n\r\x0e\n\x01b\x0e\b\t\x14\xe0\x12\x00\x00\x00\x01\x00\x00\x01\x03\x06\xc0\x03\xfd\x00\x17\x00\x00\x01\x14\a\x01\x06'&=\x01!\"&=\x01463!546\x17\x01\x16\x06\xc0\n\xfe\x80\x10\x13\x13\xfb \x0e\x12\x12\x0e\x04\xe0&\x10\x01\x80\n\x02\x83\x0e\n\xfe\x9e\x0e\b\t\x14\xe0\x12\x0e\xc0\x0e\x12\xe0\x15\x10\r\xfe\xa2\n\x00\x00\x00\x02\x00\x00\xff\x80\x05q\x06\x00\x00&\x008\x00\x00\x01\x06\a\x06#\"'&#\"\a\x06#\"\x03\x02547632\x17\x16327632\x17\x16\x17\x06\a\x06\x15\x14\x16\x01\x14\a\x06\a\x06\a\x06\a6767\x1e\x01\x17\x14\x16\x05q'T\x81\x801[VA=QQ3\x98\x95\x93qq\xabHih\"-bfGw^44O#A\x8a\xfe\xe1\x1d\x1e?66%C\x03KJ\xb0\x01\x03\x01\x01\x01A}}\xc4 !\"\x01\x03\x01\x05\xf2䒐\x1e\x1e\"\"A$@C3^q|\xc6\x04z=KK?6\x12\v\x06\x95lk)\x03\x10\x03\x04\f\x00\x00\x04\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\x01\x11%\x11\x01\x11!\x11\x01\x11%\x11\x01\x11!\x11\x02\xaa\xfdV\x02\xaa\xfdV\x06\x80\xfcu\x03\x8b\xfcu\x02\x12\xfdu^\x02-\x02\xe7\xfdm\x025\xfdw\xfc\xee}\x02\x95\x03n\xfc\xe6\x02\x9d\x00\x00\x00\x06\x00\x00\xff\x00\x05\x80\x05~\x00\a\x00\x0f\x00\x1c\x007\x00M\x00[\x00\x00\x00264&\"\x06\x14\x04264&\"\x06\x14\x052\x16\x15\x11\x14\x06\"&5\x1146\x05\x11\x14\x06+\x01\x15\x14\x06\"&=\x01#\x15\x14\x06#\"&5'#\"&5\x11\x01\x1e\x01\x15!467'&76\x1f\x0162\x1776\x17\x16\a\x01\x11\x14\x06#\"&5\x114632\x16\x01\xdd \x17\x17 \x16\x01\xbc \x16\x16 \x17\xfc\xfb*<;V<<\x04O@-K\x03<\x01&\x014'>\x03&4.\x02'.\x01'\x16\x17\x16\a\x06\a\x06.\x01'.\x04'.\x03'&6&'.\x01'.\x01676\x16\a\x06\x167645.\x03'\x06\x17\x14#.\x01\x06'6&'&\x06\a\x06\x1e\x017676\a\"&'&6\x172\x16\x06\a\x06\a\x0e\x01\a\x0e\x01\x17\x1e\x03\x17\x167>\x0376\x17\x1e\x01\x06\a\x0e\x01\a\x06\a\x06'&\x17\x16\x17\x167>\x05\x16\x17\x14\x0e\x05\a\x0e\x02'&'&\a\x06\x15\x14\x0e\x02\x17\x0e\x01\a\x06\x16\a\x06'&'&76\a\x06\a\x06\x17\x1e\x01\x17\x1e\x01\x17\x1e\x01\x06\a\x1e\x02\x156'.\x027>\x01\x17\x167676\x17\x16\a\x06\a\x06\x16\x17>\x0176&6763>\x01\x16\x016&'&\x15\x16\x172\a\x0632\x05.\x02'.\x04\a\x06\x16\x17\x166'4.\x01\a\"\x06\x16\x17\x16\x17\x147674.\x01'&#\x0e\x01\x16\a\x0e\x02\x17\x16>\x017626\x01\x1e\x02\x0e\x05\a\x0e\x01\a\x0e\x01'.\x03'&#\"\x06\a\x0e\x03'.\x01'.\x04'&676.\x0167>\x017>\x015\x16\a\x06'&\a\x06\x17\x1e\x03\a\x14\x06\x17\x16\x17\x1e\x01\x17\x1e\x027>\x02.\x01'&'&\a\x06'&7>\x027>\x03767&'&67636\x16\x17\x1e\x01\a\x06\x17\x16\x17\x1e\x01\x17\x16\x0e\x01\a\x0e\x03'.\x04'&\x0e\x01\x17\x16\a\x06\x1667>\x017>\x01.\x01'.\x0167\x1e\x05\x02\x97\v\t\x04\x05\x13\x05\\\x04\x0f\n\x18\b\x03\xfe\x9b\x04\x04\x05\x03\x03\a\n\t\x04\x11\x04\x01\x02\x02\x01\x02\x03U7\x04\a\x03\x03\x02\a\x01\t\x01\nJ#\x18!W!\v'\x1f\x0f\x01\v\t\x15\x12\r\r\x01\x0e\"\x19\x16\x04\x04\x14\v'\x0f;\x06\b\x06\x16\x19%\x1c\n\v\x12\x15\r\x05\x11\x19\x16\x10k\x12\x01\t)\x19\x03\x01\"\x1c\x1b\x1d\x02\x01\t\x11\a\n\x06\x04\v\a\x11\x01\x01\x14\x18\x11\x14\x01\x01\x16\t\b'\x01\r\x05\n\x0e\x16\n\x1b\x16/7\x02*\x1b \x05\t\v\x05\x03\t\f\x14I\t,\x1a\x196\n\x01\x01\x10\x19*\x11&\"!\x1b\x16\r\x02\x02\x06\x06\v\a\r\x03\x1cO6\x16\x15*\x16\x03\x01\x1e\x1d\r\x12\x17O\b\x02\x01\x06\b\x15 \x04\x02\x06\x04\x05\x02\x02$.\x05(\x04\x14\xa8\t\x10\x03\x1f\x1e\b*\x0e.'\x04\r\x06\x01\x03\x14\n.x\x85,\x17\v\f\x02\x01\x16\t\x06\x15\x03\x17\x02\x02\x11\x02\x16\x0f$\x01CN\xfd\xa1\x03\v\x06\t\x02\x03\n\x03\x03\v\x03\x01\xa3\x02\t\x11\x06\x05\t\x05\x06\x02\x03\x0e*\x12\t\v\xb4\n\f\x03\x06\x04\x04\x03\x0e\x04\b\x026\x05\r\x03\x0f\t\t\x05\x03\x02\x01\n\x02\x04\x04\b\x0e\b\x01\x10\x0e\x027\x14\x16\x02\a\x18\x17%\x1a&\b&_\x1c\x11f&\x12\x17\n\"\x1e,V\x13L\x14,G$3\x1c\x1d\xa4@\x13@$+\x18\x05\n\"\x01\x01\n\n\x01\n\x0eV\x11\x1e\x18\x155 3\"\t\r\x12\x02\f\x05\x04\x01\"\x03\x03\"\x14\x81#\x18dA\x17++\x03\x12\x14\ny0D-\v\x04\x03\x01\x01\x12\x1e\a\b%\x16&\x14n\x0e\f\x04\x024P'A5j$9E\x05\x05#\"c7Y\x0f\b\x06\x12\v\n\x1b\x1b6\"\x12\x1b\x12\t\x0e\x02\x16&\x12\x10\x14\x13\n8Z(;=I50\v' !!\x03\x0e\x01\x0e\x0f\x1a\x10\x1b\x04e\x01\x13\x01\x06\f\x03\x0e\x01\x0f\x03\v\r\x06\xfeR\x01\b\x11\x05\x05\b\v\x01\x01\x10\n\x03\b\x04\x05\x03\x03\x02\xfe\x9a\x12\x18\x0f\x19\x1b\x10\x1d\n\"\a+\x050n\x14\x14?\xa2t(\x02\x04-z.'<\x1f\x12\f\x01>R\x1e$\x16\x15A\"\b\x03\x1e\x01\x0124\x01\x03B\x19\x13\x0f\a\x04@\x05\x1e(\x15\t\x03\b~\x0f\t\x03\x04\a9B\x01\x019\x1f\x0f,\x1f\x02\x03\v\t\x01\x1d\x13\x16\x1e\x01*$\x04\x0f\x0e\f\x17\x01\x0e\x1a\x05\b\x17\x0f\v\x01\x02\x11\x01\f\t\x11\t\x0e\x06\x03\v\r\x03\x06\x1f\x04\x13\x04\x05\a\x02\x04\x04\x0f\x17\x01\x01\f\x10\x13\x0f\t\x04\t\x02\x05\x05\x04\x06\x03\a\x01\x0e<\x1a\f\v>\x1f\t\x03\a\x19?0D\x1d\x06\xa89\x12f\b\x18\x15\x1f?\x1c\x1c\x13\x01\x01\x04Ae\f \x04\x17\x87\t\x0f.(\x03\x0f;1.\x18D\b\x10\b\x02\x05\t\a4\x10\x0fH&\b\x06.\x19C\x17\x1d\x01\x13t \x15iY\x1a\x12% \v\x03*\x11\x1a\x02\x02\t\x05\x01\x0f\x14\xc2\b\a\x03\x04\x03\n\x06\a\x01\x02\x107\x04\x01\x12\xe0\v\x11\b\x01\x04\x04\x01\x04\x1b\x03\x05\x02\xea\x02\x06\b\x02\x0f\x01\r\r\x06\x04\r\x05\x06\x03\x06\f\x03\x01\x04\xfa\xc8\f\x19\x17\x16\x16\x11\x14\r\x12\x04\x13J\x1b\x10\a\x12\t\x1d\x16\x11\x01\x01\x03\x01\x01\x1c \x19\x01\x01<\r\x04\v\a\f\x11\v\x17W\v\x100%$\t\f\x04\n\x12\"\"I!\x14\x05\x03\r\x0f*\x06\x18\f\x16\v\x0fD\x0e\x11\t\x06\x19\b\x06 \x0e\x03\x06,4A'\x11\xbe4J\"\t\x18\x10\x16\x1d.0\x12\x15f6D\x14\x8f4p\xc6Z{+\x15\x01\x1d\x1b*\x9fD_wqi;\xd0W1G(\x02\x02\"%\x1e\x01\x01\b\x13\f\x1d\x05%\x0eT7F}AG\x05!1#\x19\x12% \x19\v\vJG\f\x1f3\x1e\x1b\v\x0f\x00\b\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00 \x00'\x00.\x002\x00>\x00V\x00b\x00\x00%&\x03#\a\x0e\x04\a'\x1632\x03&'\x04!\x06\x15\x14\x16\x17>\x03?\x01>\x01'&'\x0e\x01\a \x05&\a\x16\x17>\x01\x01\"\a6\x05&#\"\a\x16\x17>\x04\x13&'\a\x0e\x04\a\x16\x17\x1e\x01\x17>\x012\x1e\x04\x176\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00*b\x02\x02\x106\x94~\x88#\x0f\xb8\xea\x84=\x15 \xfe\xc9\xfe\x96\x01XP2\x93\x8a{&%\x04\x12gx|\x8a\xc0 \x01.\x03\xdc\xd2\xc7W)o\x94\xfc\xf1\x01\x01\x01\x02O\xb9\xf8LO\x83sEzG<\x0f\xe4\x03\x92\x01\t\x14CK}E\x19\x13\x02\t\x03$MFD<5+\x1e\nz\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a$\xf1\x01\x01\x01\x06\x15MW\x8eM\v\x96\x02\x931>]\a\x0e|\xe1YY\x9b^D\x0e\r\x01\x05\xd6եA\xf2\x97\xef<\x1f\xef\xe6K\xe5\x03m\x01\x01\x91\xa4\x13\xaa\xd4\x1aE6<\x15\xfe\"\xe8\xb2\x01\f\x19@9I\x1c5*\x05\x18\x05\x05\x04\x03\x05\x06\a\x05\x02\xc8\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00>\x00^\x00\x00\x014.\x03/\x01.\x045432\x1e\x0332654.\x01#\"\x0e\x02\x15\x14\x1e\x02\x1f\x01\x16\x17\x16\x15\x14\x06#\".\x03#\"\x06\x15\x14\x1632>\x02\x05\x14\x06#\"'\x06#\"$&\x02547&54632\x17632\x04\x16\x12\x15\x14\a\x16\x04\x95':XM1h\x1e\x1c*\x12\x0f\x90+D($,\x1a/9p\xac`D\x80oC&JV<\x92Z\x16 PA3Q1*2\x1d23\xf4\xa9I\x86oB\x01kែhMI\x8f\xfe\xfb\xbdo\x10PែhMI\x8f\x01\x05\xbdo\x10P\x01\xd92S6,\x18\v\x18\a\a\x10\x10\x1a\x11M\x18!\"\x18@-7Y.\x1f?oI=[<%\x0e$\x16\x0e\x14('3 -- <-\\\x83%Fu\x90\x9f\xe1P\x10o\xbd\x01\x05\x8fIMh\x82\x9f\xe1P\x10o\xbd\xfe\xfb\x8fIMh\x00\x00\x00\x03\x00,\xff\x80\x04\xcb\x06\x00\x00#\x00?\x00D\x00\x00\x0176&#!\"\x06\x15\x11\x147\x01>\x01;\x01267676&#!\"&=\x01463!267\x06\n\x01\a\x0e\x04#!\"\a\x06\x01\x0e\x01'&5\x11463!2\x16\a\x036\x1a\x01\x03\xe8%\x05\x1c\x15\xfd8\x17\x1f\x06\x01#\x17\x1e!\xef\x16\x1e\x03\x18\r\x04\x1f\x15\xfe\xda\x1d&&\x1d\x01Z\x12\"\xe6\x0fM>\x04\x06\x06\x16\x1b2!\xfe\xf1\r\t\b\xfe^\x16I\f7LR\x03x_@\x16\x9e\x04>M\x04N\xc2\x17\"\"\x14\xfb\xb3\a\x06\x01`\x1a\x0f\x1d\x0f\x82=\x15&&\x1d*\x1d%\x1b\xeeI\xfe}\xfe\xc7\x11\x16\x15,\x16\x14\n\t\xfe\x1b\x19\a\t\x16L\x05\x827_jj\xfc\xea\x11\x019\x01\x83\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00%\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x02\xc0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\x02\xa0\x12\x0e\xfe \x0e\x12\x12\x0e\x01\xe0\x0e\x12\xa0&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&\xc0\x04\x00\x0e\x12\x12\x0e\xfc\x00\x0e\x12\x12\x01\x8e\x02\x80\x0e\x12\x12\x0e\xfd\x80\x0e\x12\x12\x03\x0e\xfa\x80\x1a&&\x1a\x05\x80\x1a&&\x00\x00\x00\x00\x02\x00\x00\xff\x00\x05\x00\x05\xe0\x001\x009\x00\x00\x01\x14\x06#\"'\x03#\x15\x13\x16\x15\x14\x06+\x01\x11\x14\x06+\x01\"&5\x11#\"&547\x135#\x03\x06#\"&547\x0163!2\x17\x01\x16\x00\x14\x06\"&462\x05\x008(3\x1d\xe3-\xf7\t&\x1a\xc0B.\xa0.B\xc0\x1a&\t\xf7-\xe3\x1d3(8\x10\x01\x00Ig\x01\x80gI\x01\x00\x10\xfe`\x83\xba\x83\x83\xba\x01\xe0(8+\x01U\x84\xfee\x0f\x12\x1a&\xfe\xf0.BB.\x01\x10&\x1a\x12\x0f\x01\x9b\x84\xfe\xab+8(\x1d\x18\x01\x80kk\xfe\x80\x18\x03`\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x00\x04\x00\x05\xe0\x00%\x00-\x00\x00\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11463!2\x16\x00\x14\x06\"&462\x04\x008P8@B\\B@B\\B@8P8pP\x02\x80Pp\xfe\xe0\x83\xba\x83\x83\xba\x03@\xfe`(88(\x01`\xfcp.BB.\x01\xd0\xfe0.BB.\x03\x90\xfe\xa0(88(\x01\xa0Ppp\x01ͺ\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00!\x00\x00%\x01>\x01&'&\x0e\x01\a\x06#\"'.\x02\a\x0e\x01\x16\x17$\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x05\x01^\x10\x11\x1d/(V=\x18$<;$\x18=V).\x1d\x11\x10\x04X\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xea\x01\xd9\x16J`\x1f\x1a\x01\"\x1c((\x1c\"\x01\x1a\x1f`J\x16\x8e\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00,\xff\x00\x06\xd4\x05\xff\x00\x0f\x00I\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01%\x06\a\x05\x11\x14\a\x06'%\a\x06\"/\x01\x05\x06'&5\x11%&'&?\x01'&767%\x11476\x17\x05762\x1f\x01%6\x17\x16\x15\x11\x05\x16\x17\x16\x0f\x01\x17\x16\x05\xc0[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01o\x04\x10\xfe\xdc\r\x0f\x0e\xfeܴ\n \n\xb4\xfe\xdc\x0e\x0f\r\xfe\xdc\x10\x04\x05\t\xb4\xb4\t\x05\x04\x10\x01$\r\x0f\x0e\x01$\xb4\t\"\t\xb4\x01$\x0e\x0f\r\x01$\x10\x04\x05\t\xb4\xb4\t\x02\v\xea՛[[\x9b\xd5\xea՛[[\x9b5\x0f\x05`\xfe\xce\x10\n\n\x06^\xf8\r\r\xf8^\x06\n\n\x10\x012`\x05\x0f\x11\f\xf8\xf8\r\x10\x0f\x05`\x012\x10\n\n\x06^\xf8\f\f\xf8^\x06\n\n\x10\xfe\xce`\x05\x0f\x10\r\xf8\xf8\f\x00\x02\x00\x00\xff\x80\x05\xbe\x05\u007f\x00\x12\x001\x00\x00%\x06#\"$\x02547\x06\x02\x15\x14\x1e\x0232$%\x06\x04#\"$&\x0254\x126$76\x17\x16\a\x0e\x01\x15\x14\x1e\x013276\x17\x1e\x01\x04\xee68\xb6\xfeʴh\xc9\xfff\xab킐\x01\x03\x01&^\xfe\x85\xe0\x9c\xfe\xe4\xcezs\xc5\x01\x12\x99,\x11\x12!V[\x92\xfa\x94vn)\x1f\x0e\a\xe9\t\xb4\x016\xb6\xc0\xa5<\xfe\xaeׂ\xed\xabf{\xc3\xcb\xf3z\xce\x01\x1c\x9c\x99\x01\x17\xcc}\x06\x02))\x1fN\xcfs\x94\xfa\x923\x12\x1f\x0e(\x00\x03\x00@\xff\x80\x06\xc0\x05\x80\x00\v\x00\x1b\x00+\x00\x00\x004&#!\"\x06\x14\x163!2\x01\x11\x14\x06#!\"&5\x11463!2\x16\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04@&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a\x02f&\x1a\xfa\x80\x1a&&\x1a\x05\x80\x1a&@&\x1a\xfa\x00\x1a&&\x1a\x06\x00\x1a&\x02\xa64&&4&\x01\x00\xfc@\x1a&&\x1a\x03\xc0\x1a&&\x01\xa6\xff\x00\x1a&&\x1a\x01\x00\x1a&&\x00\x00\x02\x00 \xff\xa0\x06`\x05\xc0\x00B\x00H\x00\x00\x00\x14\x06+\x01\x14\a\x17\x16\x14\a\x06\"/\x01\x0e\x04#\x11#\x11\".\x02/\x01\a\x06#\"'.\x01?\x01&5#\"&46;\x01\x11'&462\x1f\x01!762\x16\x14\x0f\x01\x1132\x01!46 \x16\x06`&\x1a\xe0C\xd0\x13\x13\x126\x12\xc6\x05\x14@Bb0\x803eI;\x0e\x0f\xb7\x14\x1c\x18\x13\x13\x03\x11\xca:\xe0\x1a&&\x1a\xe0\xad\x13&4\x13\xad\x03L\xad\x134&\x13\xad\xe0\x1a\xfeF\xfd\x80\xbb\x01\n\xbb\x02Z4&\xabw\xd1\x134\x13\x13\x13\xc5\x05\x10) \x1a\x03\x80\xfc\x80\x1b''\r\x0e\xcf\x15\x10\x125\x14\xe3r\xa0&4&\x01&\xad\x134&\x13\xad\xad\x13&4\x13\xad\xfe\xda\x02\x00\x85\xbb\xbb\x00\x00\x01\xff\xff\x00\x01\a}\x04G\x00\x85\x00\x00\x01\x16\a\x06\a\x0e\x02\x1e\x02\x17\x16\x17\x16\x17\x1e\x02\x0e\x01#\x05\x06&/\x01.\x03\a\x0e\x04\x17\x14\x06\x0f\x01\x06\a#\x06.\x02/\x01.\x03\x02'&4?\x0163%\x1e\x01\x1f\x01\x16\x17\x1e\x01\x1f\x01\x1e\x0327>\x04'.\x01/\x01&'&7676\x17\x16\x17\x1e\x03\x14\x0e\x01\x15\x14\x06\x1e\x02\x17\x1e\x01>\x02767>\x01?\x01>\x02\x17%6\x16\x17\a}\x17\xad\x18)(\x1e\x1f\a\x13.\"\x04\x01\x8d2\x03\a\a\b*&\xff\x00\x18@\x14\x14\x1eP9A\x18\x03\n\x18\x13\x0f\x01\a\x04\x04\x12#sG\x96q]\x18\x19\n#lh\x8d<\x06\x03\x04\x0f*\x01\x12\f\x16\x05\x05\x10\b\x144\x0f\x10\x1d6+(\x1c\r\x02\x06\x12\t\n\x05\x02\x0e\a\x06\x19<\r\x12\x10\x165\xbaR5\x14\x1b\x0e\a\x02\x03\x02\x01\x06\x11\x0e\b\x12\"*>%\"/\x1f\t\x02\x04\x1a+[>hy\n\x0f\x03\x03\x01\x03\x03\x01\x02\x05\x0f\t\x00\a\x00\x00\xff\xaa\x06\xf7\x05K\x00\n\x00\x15\x00!\x00/\x00U\x00i\x00\u007f\x00\x00%6&'&\x06\a\x06\x1e\x01676&'&\x06\a\x06\x17\x166\x17\x0e\x01'.\x017>\x01\x17\x1e\x01%.\x01$\a\x06\x04\x17\x1e\x01\x0476$%\x14\x0e\x02\x04 $.\x0154\x1276$\x17\x16\a\x06\x1e\x016?\x0162\x17\x16\a\x0e\x01\x1e\x01\x17\x1e\x02\x02\x1e\x01\a\x0e\x01'.\x0176&\a\x06&'&676%\x1e\x01\a\x0e\x01.\x0176&'.\x01\a\x06.\x01676\x16\x02\xa3\x15\x14#\"N\x15\x16\x12DQt\b\t\r\x0e\x1d\a\x11\x1e\x0e\x1e\xb5-\xe2okQ//\xd1jo_\x01\v\t\xa0\xfe\xff\x92\xdf\xfe\xdb\x0e\t\xa0\x01\x01\x92\xdf\x01%\x01&J\x90\xc1\xfe\xfd\xfe\xe6\xfe\xf4Ղ\x8b\x80\xa9\x01YJA-\x04\x06\x0e\x0f\x06\x06\x8b\xd6.--\x02\x05\x0e\n\f9\\DtT\x19\x13\b+\x17\x17\x16\a\x14X?\x18*\x04\x05\x1a\x18<\x01UW3'\t26\x1a\b\x1c$>>\xacW\x1c0\f\x1f\x1c{\xf2\xfc\"F\x0f\x0e\x1a!\"E \x1b\x9b\r\x1b\x05\x05\v\r\x1f\x0e\x05\v^f`$\"\xb9_]\\\x1b\x1d\xb5<`\x94F\x0e\x17\xed\x92`\x94F\x0e\x17\xed\x8eD\x8f\x83h>Cw\xb7ls\x01\x04\x80\xa9\x86J@\x91\x0e\f\x02\x03\x02\x02;=?s\r\x0e\v\x04\x04\x12:i\x02_^{8\x17\x16\a\b+\x17?`\r\x05\x1a\x18\x18)\x05\rO`\xfds\x1b\x1a\x122\x1bR\xb4DE5\x12\x06\x1f8/\x06\x1aK\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05r\x00\t\x00\x13\x00\x1d\x00\x00\x05\x06#\"'>\x017\x1e\x01\x01\x11\x14\x02\a&\x114\x12$\x01\x10\a&\x025\x11\x16\x04\x12\x04m\xab\xc5ī\x8a\xc3\"#\xc3\xfe\x9b\xfd̵\xa7\x01$\x045\xb5\xcc\xfd\xb3\x01$\xa7\"^^W\xf8\x90\x90\xf8\x05=\xfe\x1b\xfc\xfeac\xd7\x01\x18\xbb\x01E\xd6\xfd*\xfe\xe8\xd7c\x01\x9f\xfc\x01\xe5\x1e\xd6\xfe\xbb\x00\x00\x00\x01\x00\x00\xff\x00\x05z\x06\x00\x00k\x00\x00\x01\x0e\x03.\x03/\x01\x06\x00\a\"&4636$7\x0e\x02.\x03'>\x01\x1e\x02\x1767\x0e\x02.\x05'>\x01\x1e\x05\x1f\x0165.\x0567\x1e\x04\x0e\x02\x0f\x01\x16\x14\a>\x05\x16\x17\x0e\x06&/\x01\x06\a>\x05\x16\x05z X^hc^O<\x10\x11q\xfe\x9f\xd0\x13\x1a\x1a\x13\xad\x01+f$H^XbVS!rȇr?\x195\x1a\a\x16GD_RV@-\x06F\u007fbV=3!\x16\x05\x04\f\b\x1bG84\x0e&3Im<$\x05\x06\x14\x12\b\a\x01\x01\x03\x0e/6X_\x81D\x02'=NUTL;\x11\x11\x172\x06\x18KPwt\x8e\x01\xb1Pt= \x03\x0e\x1e\x19\n\n\xe4\xfe\xf9\x01\x1a&\x19\x01ռ\x0e\x12\b\r,J~S/\x14#NL,\x83\xa0\x01\x03\x02\x03\x11\x1d8JsF\x1c\x11\x13);??1\x0f\x10zI\x06\x14EJpq\x8dD\x19IPZXSF6\x0f\x0f\x04\\\x1a\a\x17?5:\x1f\x02\x17N\u007fR=\x1e\x12\x01\x03\x03\x03\x93\x88\a\x17;.&\x021\x00\x04\x00\x15\xff\x00\x04\xeb\x05\x00\x00\f\x00\x10\x00\x14\x00\x1e\x00\x00\x01\x15\x14\x06+\x01\x01\x11!\"&=\x01\x01\x15!\x11\x01\x15!\x11%\x15!5463!2\x16\x04\xebsQ9\xfe\xfc\xfd\xefQs\x04\xd6\xfb*\x04\xd6\xfb*\x04\xd6\xfb*sQ\x03NQs\x01\x1bBUw\xfe\xf3\x01\rwUB\x01F\xff\x00\xff\x01H\xff\x00\xff\x8cCCTww\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x00\x14\a\x01\x06#\"&=\x01!\"&=\x01463!54632\x17\x01\x16\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\t\xfe\xc0\t\x0e\r\x13\xfe\xa0\r\x13\x13\r\x01`\x12\x0e\f\f\x01?\xa9\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\x8e\x1c\t\xfe\xc0\t\x13\r\xc0\x13\r\xc0\r\x13\xc0\x0e\x12\n\xfe\xc1\xab\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x01\x15\x14\x06#!\x15\x14\x06#\"'\x01&47\x01632\x16\x1d\x01!2\x16\x12\x10.\x01 \x0e\x01\x10\x1e\x01 6\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x80\x13\r\xfe\xa0\x12\x0e\f\f\xfe\xc1\t\t\x01@\t\x0e\r\x13\x01`\r\x13\xa0\x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xe0\xc0\r\x13\xc0\x0e\x12\n\x01?\t\x1c\t\x01@\t\x13\r\xc0\x13\xfe\xff\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x02_\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00\x00\x01\x11\x14\x06#\"'\x01&47\x01632\x16\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00&\x1a\x14\x11\xfe@\x1b\x1b\x01\xc0\x11\x14\x1a&\x01\x00\x13\r\xfc@\r\x13\x13\r\x03\xc0\r\x13\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xc0\xfd\x80\x1a&\f\x01@\x13B\x13\x01@\f&\xfc\xc6\x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x13\x00\x1f\x00\x00\x00\x14\x06\"&462\x12 \x0e\x01\x10\x1e\x01 >\x01\x10&\x04\x10\x02\x04 $\x02\x10\x12$ \x04\x04\x00\x96Ԗ\x96\xd4*\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\x92\x92\x01r\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x02\xeaԖ\x96Ԗ\x01 \x92\xfa\xfe\xd8\xfa\x92\x92\xfa\x01(\xfa\xbd\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06]\x05\xe0\x00\x15\x006\x00\x00\x01\x17\x06\x04#\"$\x0254\x127\x17\x0e\x01\x15\x14\x0032>\x01%\x17\x05\x06#\"'\x03!\"&'\x03&7>\x0132\x16\x15\x14\x06'\x13!\x15!\x17!2\x17\x13\x03\xfff:\xfeл\x9c\xfe\xf7\x9bѪ\x11z\x92\x01\a\xb9~\xd5u\x02\x1b:\xff\x00\r\x10(\x11\xef\xfe(\x18%\x03`\x02\b\x0eV6B^hD%\x01\xa7\xfei\x10\x01\xc7(\x11\xe4\x01]̳ޛ\x01\t\x9c\xb5\x01*>\x836߅\xb9\xfe\xf9\x82\xdd\x1ar\x80\a#\x01\xdd!\x18\x03\v\x11\x193?^BEa\a\xfe߀\x80#\xfe9\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00#\x003\x00\x00\x016'&\x03632\a\x0e\x01#\"'&'&\a\x06\a\x0e\x01\a\x17632\x17\x1e\x01\x17\x1632\x13\x12\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\f\n\xab\xe7Q,&U\v\x04\x8c#+'\r \x1e\x82;i\x1bl\x1b4L\v92\x0f<\x0fD`\x9d\xe2\xdc\xfa\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\x82\xd8\x06\b\xfe\xf3\x13`9ܩ6ɽ\f\a]\x18`\x18C4\xb37\xdb7\xb3\x01&\x01\x1b\x01\u007f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x01\x00\x00\x00\x00\x04\x80\x05\x80\x00D\x00\x00\x01\x14\x02\x04+\x01\"&5\x11\a\x06#\"'&=\x014?\x015\a\x06#\"'&=\x014?\x01546;\x012\x16\x1d\x01%6\x16\x1d\x01\x14\a\x05\x15%6\x16\x1d\x01\x14\a\x05\x116\x00546;\x012\x16\x04\x80\xbd\xfe\xbc\xbf\xa0\x0e\x12\xd7\x03\x06\n\t\r\x17\xe9\xd7\x03\x06\n\t\r\x17\xe9\x12\x0e\xa0\x0e\x12\x01w\x0f\x1a\x17\xfew\x01w\x0f\x1a\x17\xfew\xbc\x01\x04\x12\x0e\xa0\x0e\x12\x02\xc0\xbf\xfe\xbc\xbd\x12\x0e\x02cB\x01\x06\n\x10\x80\x17\bG]B\x01\x06\n\x10\x80\x17\bG\xfa\x0e\x12\x12\x0e\xb5t\x05\x14\x10\x80\x17\by]t\x05\x14\x10\x80\x17\by\xfe\x19\r\x01\x14\xbe\x0e\x12\x12\x00\x03\x00\x00\x00\x00\x05\x80\x05\x80\x00#\x003\x00C\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x11!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x80\x12\x0e\xfe\xa0\x12\x0e@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x80^B\xfc\xc0B^^B\x03@B^\x80\xa9w\xfc\xc0w\xa9\xa9w\x03@w\xa9\x02\xe0@\x0e\x12\xfe\xa0\x0e\x12\x12\x0e\x01`\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x0e\xfe\xa0\x12\xfe2\x03@B^^B\xfc\xc0B^^\x03\x82\xfc\xc0w\xa9\xa9w\x03@w\xa9\xa9\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x80\x05\x00\x00'\x00/\x00?\x00P\x00\x00\x01\x06+\x015#\"&547.\x01467&546;\x01532\x17!\x1e\x01\x17\x1e\x02\x14\x0e\x01\a\x0e\x01\a7\x16\x14\a\x1764'\x01!\x06\a\"\x06\x0f\x01\x01\x0e\x01+\x01\x0332\x03#\x1332\x16\x17\x01\x1e\x043\x05!&\x02ln\x9e\x80@\r\x13\a:MM:\a\x13\r@\x80\x9en\x04Y*\x81\x10Yz--zY\x10\x81*\x0655QDD\xfbU\x03\xf7\xd9\xef9p\x1b\x1c\xfe\xe0\x1aY-`]\x1d\x9d\x9d\x1d]`.X\x1a\x01 \x04\x0e/2I$\x01\xc8\xfc\tt\x01\xa0@@/!\x18\x19\x02\x11\x18\x11\x02\x19\x18!/@@\a\x16\x03\x0f3,$,3\x0f\x03\x16\a\xfc$p$\x1e0\x940\xfe\xd6&*0\x18\x18\xfe\xe0\x1a&\x01\xd0\x01\xe0\x01\xd0&\x1a\xfe\xe0\x04\r!\x19\x15P@\x00\x02\x00\x00\xff\x80\x06\x80\x06\x00\x00R\x00V\x00\x00\x012\x16\x15\x14\x0f\x01\x17\x16\x15\x14\x06#\"&/\x01\x05\x17\x16\x15\x14\x06#\"&/\x01\a\x06#\"&546?\x01\x03\a\x06#\"&546?\x01'&54632\x16\x1f\x01%'&54632\x16\x1f\x017632\x16\x15\x14\x06\x0f\x01\x1376\x01%\x03\x05\x05\xef>S]\xac8\aT;/M\x0f7\xfe\xca7\bT\x057%>\x01\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\x03\xe0\x1f!\"\xc55bBBb/\xbe/\f*\n8(\x03@(87)\xfc\xc0(8=%/\xb5'\x03\x1c\x0e\x1c\x13\x18\x15\x14\x15\x18\x13\x1c\x0e\x1c\x03\x01\v#?\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfb\xe0\x01\xb4#\x14\x16~$EE y \b&\b\xfeL(88\x02e):8(%O\x19 r\x1a\x02\x13\t\x11\t\n\x05\x05\n\t\x11\t\x13\x02\xae\x17O\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x05\x00?\x00G\x00Q\x00a\x00q\x00\x00\x1347\x01&\x02\x01\x14\x0e\x03\a\x03\x0167>\x01&\x0f\x01&'&\x0e\x01\x1e\x01\x1f\x01\x13\x03\x0167>\x01&\x0f\x01\"$32\x04\x17#\"\x06\x15\x14\x1e\x06\x17\x16\x05\x13\x16\x17\x06#\"'\x01\x16\x15\x14\x02\a\x13654\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x00 $6\x12\x10\x02&$ \x04\x06\x02\x10\x12\x16\u007fC\x01o\xc4\xee\x05\b\x05\x0f\b\x1b\x04L\xfe\xea.*\x13\x0e\x13\x13\xcdK\u007f\f\x11\x06\x03\x0f\fPx\xa8\xfe\xe8.*\x13\x0e\x13\x13\xcd\a \ni\x01SƓ\x01\vi\n7J\x04\x04\f\x06\x12\a\x16\x03?\xfe\x06\xed\x01\x04~\x81pi\x03{_Я\xeb;\xfc\xa2\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01U\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3刈\xe5\x02\x80\xa3\x96\xfc\x13_\x01t\x01\b\x13'<\x1cZ\r\xff\x00\x03:\x03\x05\x02!\x1d\x01\n\x01\t\x01\f\x12\x13\x0e\x01\b\xfe\xb8\xfe\b\x03@\x03\x05\x02!\x1d\x01\n\x01\xa0\xbbj`Q7\f\x18\x13\x1b\x0f\x1e\f$\x05k\xd3\xfdy\x06\x05, \x04R\xae\xc3\xd1\xfe\x9ff\x02\xa6\xa9k*\x024\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xf9\xb7\x88\xe5\x01=\x01Z\x01=刈\xe5\xfe\xc3\xfe\xa6\xfe\xc3\xe5\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x06\x00\x00\x12\x00\x1b\x00\x00\x01\x11\x05&$&546$7\x15\x06\x04\x15\x14\x04\x17\x11\x01\x13%7&'5\x04\x17\x04>\xfe\xf0\xe4\xfe\x8c\xd6\xc9\x01]\xd9\xd9\xfe\xe9\x015\xea\x03\xad%\xfd\xf3\x93w\xa1\x01\x15\xcc\x06\x00\xfa\x00\x80\x14\xa4\xfd\x92\x8c\xf7\xa4\x1a\xac&\xe0\x8f\x98\xe6\x1e\x05P\xfe?\xfezrSF\x1d\xac!|\x00\x00\x00\x03\x00\x00\xff\x00\a\x80\x06\x00\x00\f\x00&\x000\x00\x00\t\x01\x15#\x14\x06#!\"&5#5\x01!\x113\x11!\x113\x11!\x113\x11!\x1132\x16\x1d\x01!546;\x01\x052\x16\x1d\x01!5463\x03\xc0\x03\xc0\x80)\x1c\xfa\n\x1c)\x80\x01\x00\x01\x00\x80\x01\x00\x80\x01\x00\x80\x01\x00;\x1c)\xf9\x80)\x1c;\x06;\x1c)\xf8\x80)\x1c\x06\x00\xfe\x80\x80\x1a&&\x1a\x80\xff\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00\x03\x00\xfd\x00&\x1a@@\x1a&\xc0&\x1a\x80\x80\x1a&\x00\x00\x02\x00\x00\xff\x80\t\x00\x05\x80\x00\r\x006\x00\x00\x01\x13\x16\x06\x04 $&7\x13\x05\x1627\x00\x14\a\x01\x06\"'%\x0e\x01\a\x16\x15\x14\a\x13\x16\a\x06+\x01\"'&7\x13&54767%&47\x0162\x17\x01\x06\xee\x12\x04\xac\xfe\xd6\xfe\xa4\xfe֬\x04\x12\x02>\x164\x16\x04P\x16\xfb\xa0\x04\f\x04\xfdt+8\x06?::\x02\n\t\x0f\xc0\x0f\t\n\x02::A\vW\xfe\xb3\x16\x16\x04`\x04\f\x04\x04`\x02\xbc\xfe\xc4EvEEvE\x01<\xb5\a\a\x02\x10.\b\xfe\xa0\x01\x01\xce\"\x9be$IE&\xfeO\x0e\v\v\v\v\x0e\x01\xb1&EI&\xcf{h\b.\b\x01`\x01\x01\xfe\xa0\x00\x01\x00m\xff\x80\x05\x93\x06\x00\x00\"\x00\x00\x01\x13&#\"\a\x13&\x00\x02'\x16327\x1e\x01\x12\x17>\x037\x163271\x0e\x03\a\x06\x03[\r>+)@\r(\xfe\xff\xb0]:2,C?\x8d\xc1*%\x91Zx/658:\x1c@#N\n\x92\x02C\xfd=\v\v\x02\xc3E\x01\xc5\x01(\x8b\x0f\x0fo\xed\xfe\xc4E=\xe9\x93\xcdW\x0e\x0e'c:\x86\x11\xf8\x00\x00\x01\x00\x00\xff\x80\x05\xe1\x05\x80\x00#\x00\x00\x01!\x16\x15\x14\x02\x04#\"$&\x02\x10\x126$3 \x17\a&#\"\x0e\x01\x10\x1e\x0132>\x037!\x03\x00\x02\xd5\f\xb6\xfe\xafڝ\xfe\xe4\xceyy\xce\x01\x1c\x9d\x01,\xd7\xd1{\xb7\x81ۀ\x80ہW\x92^F!\x06\xfeL\x02\xeeC=\xd9\xfe\xab\xc0y\xce\x01\x1c\x01:\x01\x1c\xcey\xc9\xc9w\x82\xdf\xfe\xf8߂0H\\R%\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x19\x00\"\x00N\x00^\x00\x00\x01\x16\a\x06 '&762\x17\x1632762$\x14\x06\"&5462\x05\x14\x06\"&462\x1674&\"\a&'\x13\x17\x14\x16264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x0432$54'>\x01$\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04G\x10\x10>\xfe\xee>\x10\x10\x06\x12\x060yx1\x06\x12\xfe\xd34J55J\x01\xbf5J44J5\xfbFd$\x82\xb5?\xc84J55%6\x1a\xdd\x13\x06E\xb4\x81#42F%\x1f\x06\x01\x18\xc5\xc6\x01\x18\a\x1e$\x01f\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01q\x10\x0f>>\x0f\x10\x06\x0611\x06\xd4J44%&4Z%44J54R1F$Z\x06\x01\x1b-%45J521\x05\x15\xfe\xc8\aZ%F1#:\x0f\x1b\x1d\x8e\xcaʎ \x19\x0f9\xbb\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x19\x00#\x00Q\x00a\x00\x00\x01\x16\a\x06\"'&762\x17\x162762%\x14\x06\"&5462\x16\x05\x14\x06\"&5462\x1674&#\"\a&'7\x17\x1e\x013264&#\"\a'&\a\x03\x06\a&#\"\x06\x15\x14\x16\x17\x06\x15\x14\x1632654'>\x01\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\xab\r\r5\xec5\r\r\x05\x10\x05*\xce*\x05\x10\xfe\xfe.>.-@-\x01R.>.-@-\xd7<+*\x1fq\x9a6\xab\x01-\x1f -- 0\x15\xbd\x11\x04<\x9ao\x1e,+< \x1a\x05\xf0\xa9\xaa\xf0\x06\x19\x1f\x013\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x97\r\r55\r\r\x06\x06**\x06\x96\x1f..\x1f -- \x1f..\x1f --G*<\x1fN\x04\xf3' ,-@-+*\x05\x12\xfe\xf4\x06M <*\x1e2\r\x19\x17z\xad\xadz\x19\x18\r1\x01\xe4\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x000\x00<\x00\x00\x01754&\"\x06\x15\x11\x14\x06\"&=\x01#\x15\x14\x163265\x114632\x16\x1d\x01\x055#\x15\x14\x06#\"&=\x01\a'\x15\x14\x1626\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03bZt\xa0t\x1c&\x1b\x97sRQs\x1b\x14\x13\x1b\x01\x89\x96\x1b\x14\x13\x1bZOpoO\xfe\xe5\x14\x1b\x1b\x14xzRrqP\x01\x18\x13\x1c\x1c\x136\xdfz~\x14\x1b\x1c\x13{\x1a\x1c{Prr\x01\xad\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x02\x00\x00\xff\xa3\a\x80\x05]\x00\x1e\x000\x00\x00\x0154&\"\x06\x15\x11\x14\x06#\"&5\x11!\x11\x14\x16265\x114632\x16\x1d\x01\a\x05!\x11\x14\x06#\"&5\x11\x177\x11\x14\x16265\x04&\x02'&\a\x0e\x01#\".\x01'&'\x04#\"&5467%&4>\x037>\x0132\x16\x17632\x16\x15\x14\x06\x0f\x02\x06\x1632654.\x02547'654'632\x1e\x05\x177\x0e\x03\x177.\a'.\x02*\x01#\"\a>\x057\x1e\x02?\x01\x15\x1767>\b?\x01\x06\a\x0e\x01\a\x0e\x02\a\x1e\x01\x15\x14\x03>\x0132\x1e\x03\x17\x06#\"'\x017\x17\a\x01\x16\x15\x14\x0e\x03\a'>\x023\x01\a'>\x0132\x133\x17\a\x015\x15\x0f\x01?\x02\x04\xc6K\x89cgA+![,7*\x14\x15\n\x18\f2\x03(-#\x01=\x05\x11\a\x0e\x06\n\a\t\x04\a\x0f\x1a\x12/\x0e~[\x10(D?\x1dG\b\f \x16\f\x16\xf7|\x1c,)\x19\"\x0e#\v+\b\a\x02)O\xfc\xb4\x0e8,\x11\x03+\xf7'\xb96\t\x1b\x1d\x17\x19\x02y{=@\xfe\xf90mI\x01\xa1\x03#938\x04\a\x15OA\x1c\xfeE`\x06\n-\f\x13\xd3\x1f\n)\x03y\x01\x02\x01\x02\x01\x02_\x03/FwaH8j7=\x1e7?\x10%\x9c\xad\xbc\x95a\x02\x04\x05\t\x05%\a\x1d\f\x1e\x19%\x16!\x1a?)L\x0f\x01\x15\n\x10\x1fJ\x16\r9=\x15\x02\x1a5]~\x99\x14\x04\x1ap\x16\x10\x0f\x17\x03j\x0e\x16\r\n\x04\x05\x02\x01\r \x11%\x16\x11\x0f\x16\x03(\x10\x1a\xb7\xa01$\"\x03\x14\x18\x10\x12\x13,I\x1a \x10\x03\x0e\r$\x1f@\x1c\x19((\x02\v\x0f\xd6\x05\x15\b\x0f\x06\n\x05\x05\x02\x03\x04\x01+\x1e!\x1a.\x1bS\t\t-\x1c\x01\x01L\x01__\x15$'\x17-\x119\x13L\x0f\t5V\xa5\xc6+\x03\t\n\t\x136\a\v\xfcT\x1a+\x1f6.8\x05-\v\x03$\f\xb10\xfe\xd0\x0f\x01\a\x0f\v\b\a\x01+\x02\r\a\x02t\x14\x11\x01\f\xfd|S\f\x061\x01\x01\x05\x02\x03\x04\x01\x00\x00\x04\x00\x00\xff\x12\x06\x00\x05\xee\x00\x17\x006\x00]\x00\x83\x00\x00\x05&\a\x0e\x01#\"'&#\"\a\x0e\x01\x17\x1e\x0167>\x0276'&'&#\"\a\x06\a\x06\x17\x1667>\a32\x1e\x01\x17\x1e\x0176\x014.\x02#\"\x0e\x01#\x06.\x03\a\x0e\x01\a\x06\x17\x1e\x0132>\x02\x17\x1e\x03\x17\x1667>\x017\x14\x02\x06\x04 $&\x0254>\x057>\x037>\x017\x16\x17\x1e\x01\x17\x1e\x06\x04\x8f\x05\x13\x1erJ\x81@\x05\b\v\x0f\a\x01\b\"kb2)W+\a\f,\x13\x14\x175/\x18\x1d1\x1a\x0e\t\x11\x17\x03\x0f\x06\x0e\t\x10\x0e\x13\v\x1b#\v\b\n\x05\n\x17\x01Z\n\x17-\x1e!\x80\x82$\x1bIOXp7s\xa4\x02\x02L\x1dCF9\x96vz \x1aNAG\x14#/ \x1c\x1d5|\xd0\xfe\xeb\xfe\xd0\xfe\xe6Հ';RKR/\x13\x0eJ#=\x1e$,\b\x819,\xac+\x15$UCS7'2\x13\x0e\x16\"1\x04\f\x06\x14\n \x1c\x03\x03\x04!\x1b\a\f\x84/\x0e\x0f\n\f,\x18\x14\b\a\x14\x02\r\x04\n\x04\x06\x03\x02\x0f\x0e\x0f\x11\x06\x04\f\x01/\x16--\x1cST\x01(::(\x01\x01\x9bep4\x14\x11AM@\x01\x01=I>\x01\x03\".)xΤ\xfe\xe7\xbfls\xc7\x01\x1c\xa0Y\xa7|qK@\x1d\n\b%\x14(\x18\x1cYQ\x9b&\x1dN\x1b\r\x18EHv~\xab\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1e\x00<\x00Z\x00x\x00\x00\x01\x0f\x02\x0e\x01'\x0e\x01#\"&5467&6?\x01\x17\a\x06\x14\x17\x162?\x03\x03\x17\a'&\"\x06\x14\x1f\x03\a/\x02.\x017.\x0154632\x16\x176\x16\x01\x14\x06#\"&'\x06&/\x017\x17\x16264/\x037\x1f\x02\x1e\x01\a\x1e\x01\x03\x14\x06\a\x16\x06\x0f\x01'764&\"\x0f\x03'?\x02>\x01\x17>\x0132\x16\x04.\xa0\x97\x1eA\xadU\x10pIUxYE\x16.A\f\x97\v%%%h%\x1e\x97\xa1\xbe\f\x98\f%hJ%\x1d\x98\xa0\x97\xa1\x97\x1eD,\x1bFZxULs\fT\xab\x03gxUJr\x0eV\xbbD\v\x97\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1d@/\x15Le\x02fL\x1a.C\f\x97\f%Jh%\x1e\x98\xa0\x98\xa1\x98\x1dC\xb8V\vsNUx\x01Ϡ\x98\x1e@.\x15FZyUHp\x10V\xaeA\f\x98\v%h&%%\x1e\x98\xa0\x02\x12\f\x98\f%Ji%\x1d\x98\xa0\x98\xa0\x98\x1eC\xb9W\x0fpIUybJ\x14/\xfb\x95Uy^G\x1c,D\f\x98\f%Jh%\x1e\x98\xa0\x98\xa0\x98\x1e@\xadU\vs\x04\x17Mt\vU\xb7C\f\x98\f%hJ%\x1e\x98\xa0\x98\xa0\x98\x1eC-\x1aKfy\x00\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00E\x00X\x00[\x00_\x00g\x00j\x00\x89\x00\xa3\x00\x00\x01\x06&/\x01&'.\x01'\x06\a\x06\a\x0e\x01'67>\x017>\x017&\a\x0e\x02\a\x06\x14\a\x06\a\x06'&'&'>\x0176763>\x017>\x02\x17\x16\a\x14\x0e\x01\a\x06\a\x17\x1e\x01\x17\x1e\x01\x03\x16\a\x06\a\x06#&'&'7\x1e\x0167672\x05\x17'\x01%\x11\x05\x01\x17\x03'\x03\x177\x17\x01\x05\x11\x01\x17\a'\x06\a\x06+\x01\"&'&54632\x1e\x01\x17\x1e\x013267>\x027\x01\x11%\x06\x04#\"'4'\x11676767\x11\x052,\x0132\x15\x11\x02\x8e\x01\x17\x14\x14,+\aD\x04CCQ\x18\x04\x1f\x03\x06L\x15\x81\x0e\x11D\x02\bf\b'\x1e\x02\x02\x01\x05\x1a\x17\x18\x12\n\x04\x01\x06%\v:/d\x02\nB\v\t\x19\x04\x04\x02\x03\x19\x1c\x03\x194@\f}\x05\x04\r\xcf\x03\a\f&\x1e\x1e\x1a\x17\x0e\x04\x01\x03!\x140$\x13\x11\x02\xbe?\x8b\xfb\xf8\x02\xb6\xfdJ\x04\xd9f\xb5d\xd8f-\xd3\xfe.\x02=\xfe\xfa\x9e6(\x82\x92:!TO\xf1?\b\n\b\x04\x1c!\x04I\xadG_\x90U\x0f\x1f%\n\x01\x95\xfc\xfa\x0e\xfd.\a\r\x05\x01\x03\x01\x05\x0fk*\x02.\x02\x01=\x01;\x04\x14\x01\xca\x03\a\b\t\x14\x1d\x055\x02gN_\x0f\x02\x04\x02\x04X\x18\xb6\x1b\x1e\x89\t\x01\"\x02\v\b\x01\x02\x11\x01\n\x05\a\a\x04\x11\x06\x11\x02\x06\x03\x10\x10#\x02#\x04\x03\n\x01\x01\f\x15\x0229\x052Q\x1c\x064\x02\x011\x01\xe0\x0f\r\x17\x0f\f\x03\x17\x0f\x1a\x03\x03\x04\x04\x0e\f\x02\x92\xe3*\xfd\x99\xe8\x04\b\xe9\xfd6\x1f\x02\x91\x1f\xfd\xe8\x1fnA\x03;\xb8\x01|\xfa\x11\r\xa0BS\x19\fN.\a\t\b\v\x0f\x12\x02%1\x1d$\a\x11\x15\x06\x04\x80\xfb\xc9\xf6\x06\xf3\r\x01\x02\x046\t\x01\x06\x05$\x0e\x01\x80\xc6nk\x15\xfe^\x00\f\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00'\x007\x00G\x00W\x00g\x00w\x00\x87\x00\x97\x00\xa7\x00\xb7\x00\xc0\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11463\x05\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x1f\x01\x1e\x01\x15\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x13\x11#\"&=\x01!\x11\x01 B^^B\x80B^^B\x05\xe0:F\x96j\xfc\xa0B^8(\x02\xa0(`\x1c\x98\x1c(\xfd \x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x01\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12`\xa0(8\xfd\x80\x04\x80^B\xfb\xc0B^^B\x04@B^\xa3\"vE\xfd\x00j\x96^B\x06\x00(8(\x1c\x98\x1c`(\xfb\x80\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\xfe\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x12\x01\x8e\x01\x008(\xa0\xfe\x00\x00\x14\x00\x00\xff\x00\x05\x80\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\xbf\x00\xcf\x00\xdf\x00\xef\x00\xff\x01\x0f\x01\x1f\x01/\x01?\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x11\x15\x14\x16;\x0126=\x014&+\x01\"\x06\x0354&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x0154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x05@\x1a&&\x1a\xfb\x00\x1a&&\x1a\x01\xc0\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x02\x00\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x06\x00&\x1a\xf9\x80\x1a&&\x1a\x06\x80\x1a&\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfe\xb2@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfb\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x02\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x00\x00\x00\x02\x00@\xff\x10\x04\xc0\x05`\x00\x1f\x00'\x00\x00\t\x01\x11\x14\x06\"&5\x11#\x11\x14\x06\"&5\x11\x01&4762\x1f\x01!762\x17\x16\x14$\x14\x06\"&462\x04\xa4\xfe\xdcB\\B@B\\B\xfe\xdc\x1c\x1c\x1dO\x1c\xe4\x01p\xe4\x1cP\x1c\x1c\xfe\xa0\x83\xba\x83\x83\xba\x03\xdc\xfe\xdc\xfc\xc8.BB.\x01\x80\xfe\x80.BB.\x038\x01$\x1cP\x1c\x1c\x1c\xe4\xe4\x1c\x1c\x1dO広\x83\xba\x83\x00\x05\x00\x00\xff\x80\x06\x80\x05\x80\x00\x0f\x00\x1d\x003\x00C\x00Q\x00\x00\x01\x14\x0e\x01#\".\x0154>\x0132\x1e\x01\x01\x14\x06#\".\x0154632\x1e\x01\x052\x04\x12\x15\x14\x0e\x02#\"&#\"\x06#\"54>\x02%\".\x0154>\x0132\x1e\x01\x15\x14\x0e\x01%2\x16\x15\x14\x0e\x01#\"&54>\x01\x03\f&X=L|<&X=M{<\xfe\xaaTML\x83FTML\x83F\x01\x8av\x01\x12\xb8\"?B+D\xef?B\xfdJ\xb7p\xa7\xd0\x01H=X&<{M=X&<|\x01dMTF\x83LMTF\x83\x04(\x012\x1e\x01\x02\xc0r_-\x02$\x1a\xc0\x1a$\x02-_rU\x96\xaa\x96U\x03\xf0\x91\xc5%\xfc\xcb\x1a&&\x1a\x035%ő\x80\xf3\x9d\x9d\xf3\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\x80\x00\x03\x00\a\x00\x1f\x00\x00\x05\x01\x11\x05'-\x01\r\x01\x11\x14\x06\a\x01\x06\"'\x01.\x015\x11467\x0162\x17\x01\x1e\x01\x03\x80\x02\x80\xfd\x80@\x02\xba\xfdF\xfdF\x05\xfa$\x1f\xfd@\x1cB\x1c\xfd@\x1f$.&\x02\xc0\x16,\x16\x02\xc0&.]\x01]\x02|\xe9q\xfe\xfe\xfe\x02\xfd\x00#<\x11\xfe\x80\x10\x10\x01\x80\x11<#\x03\x00(B\x0e\x01\x00\b\b\xff\x00\x0eB\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x80\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00B\x00\x00\x05%\x11\x05'-\x01\x05\x01%\x11\x05'-\x01\x05'%\x11\x05'-\x01\x05\x01\x11\x14\x06\a\x05\x06\"'%&'\x06\a\x05\x06\"'%.\x015\x11467%\x11467%62\x17\x05\x1e\x01\x15\x11\x05\x1e\x01\x02\x80\x01\x80\xfe\x80@\x01\x94\xfel\xfel\x05\xd4\x01\x80\xfe\x80@\x01\x94\xfel\xfel,\x01\x80\xfe\x80@\x01\xb9\xfeG\xfeG\x05\xf9&!\xfe@\x19@\x19\xfe@\x04\x03\x02\x05\xfe@\x19@\x19\xfe@!&+#\x01\xb2+#\x01\xc0\x176\x17\x01\xc0#+\x01\xb2$*`\xc0\x01:\xa4p\xad\xad\xad\xfd\x8d\xc0\x01:\xa4p\xad\xad\xadx\xa5\x01\n\xa4p\xbd\xbd\xbd\xfd=\xfe`$>\x10\xe0\x0e\x0e\xe0\x02\x02\x02\x02\xe0\x0e\x0e\xe0\x10>$\x01\xa0&@\x10\xba\x01\x90&@\x10\xc0\n\n\xc0\x10@&\xfep\xba\x10@\x00\x00\x06\x00\x00\xff\xfe\b\x00\x05\x02\x00\x03\x00\t\x00\x1f\x00&\x00.\x00A\x00\x00\x01!\x15!\x03\"\x06\a!&\x032673\x02!\"\x0254\x0032\x1e\x01\x15\x14\a!\x14\x16%!254#!5!2654#!%!2\x1e\x02\x15\x14\a\x1e\x01\x15\x14\x0e\x03#!\a8\xfe\x01\x01\xff\xfcZp\x06\x01\x98\x12\xa6?v\x11\xddd\xfe\xb9\xd6\xfd\x01\x05Ί\xcde\x02\xfdns\xfb6\x01(\xcd\xc7\xfe\xd2\x01\x19N[\xbe\xfe\xfc\xfe\xeb\x02RW\x88u?\xacrt1Sr\x80F\xfd\x9d\x04\xad|\xfe\xd2iZ\xc3\xfd\xb7@7\xfe\xcd\x01\b\xd7\xd0\x01\x13\x88މ\x11\x1eoy2\xa7\xb4\xbeIM\x90\xd7\x1cC~[\xb5R \xa6yK{T:\x1a\x00\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1e\x00%\x00,\x00A\x00G\x00K\x00\x00\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x13!\x11!2654'654.\x02\x03#532\x15\x14\x03#532\x15\x14\x05\"&5!654&#\"\x06\x15\x14\x16327#\x0e\x01\x032\x17#>\x01\x03!\x15!\x04\xe0w\xa9\xa9w\xfc@w\xa9\xa9w\xd3\xfe\x8d\x01~u\xa0\x8fk'JTM\xb0\xa3wa\xb9\xbd|\x02\nDH\x01\x9b\x01\x95\x81\x80\xa4\x9e\x86\xcd>\x8a\vI1q\v\xfe\x04Fj\x01?\xfe\xc1\x05\x80\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfe\x91\xfc\xedsq\x9e*4p9O*\x11\xfe¸Z^\xfe\xb1\xd9qh LE\n\x14\x84\xb1\xac\x82\x87\xa4\xbf\"(\x01nz8B\x01\nM\x00\x00\x00\x04\x00\x00\xff\x80\a\x00\x05\x80\x00\a\x00\x1b\x00'\x00?\x00\x00\x00\x14\x06\"&462\x004&#\"\a\x17\x1e\x01\a\x0e\x01'.\x01'\x1e\x0132\x014&#\"\x06\x15\x14\x163267\x14\x00#\x01\x0e\x01#\"&/\x01\x11\x05632\x17\x016\x0032\x00\x06.\x8fʏ\x8f\xca\xfd\x8d\x92h\x1b\x1bhMA\x1f\x1f\x98L\x15R\x14 vGh\x03г~\u007f\xb3\xb3\u007f~\xb3\x96\xfe\xf5\xbc\xfeK\f\u0084y\xba\x19\xe6\x01\x85O^\r\x16\x01\x1c\x02\x01\v\xbb\xbc\x01\v\x04\x1fʏ\x8fʏ\xfb\xbeВ\x06*\x1f\x97LM@\x1f\b!\b\xfeשw\x03\xc0w\xa9\xf7\x8eȍ\x8dde\x8d\x03)\xa0qrOPq\xfeȦs:0\x14\x14\x183=\x027\x16\x1b\x01'\x0e\x03\x0f\x01\x03.\x01?\x0167'\x01\x03\x0e\x01\x0f\x01\x06\a\x17\x03\x13\x17\x1667\x01\x06\x03%'\x13>\x01\x17\x1e\x05\x01\x13\x16\x06\a\x0e\x05\a&\x03%'7\x03%7.\x03/\x01\x056\x16\x1f\x01\x16\x03D\x0f\x02\xfe\\$>\x10\v\a\x0f\t\"\x02N,\xb4\x93?a0\x1f\x03\x04\xbe\x11\x02\a\b#O\x8c\x06\x80\xbc\f1\x13\x12G\x94\b\xe6\xd3\a\xaa\xe29\xfd'/\xda\xfe\xc3\x13\xe1\x14P(\x181#0\x180\x02\x97\xd4\x12\v\x16\r($=!F\v\"\xe7\x019|\x8e\xdc\xfe]\x97\"RE<\x11\x11\x01\x95\x1f6\f\v'\x01o\xfe\x90\x16\x1d\x039%\x1b8J$\\\a\f\x02:\xfe\x85\\H\x91iT\x15\x15\x01e\x1a<\x11\x12?}V\xfd\xea\xfe\x99\x1d#\x03\x04\a\x05\xa4\x01o\x01j\xad\x10\x16\x16\x03\xb2?\xfe\x8c\xbb\f\x01d\x1f\x1c\x04\x02\x14\x16,\x196\xfe\xc5\xfe\x95%N#\x14\"\x16\x16\n\x12\x03H\x01l\xc3\xedS\xfe\x8b\x14VY\x9a]C\r\r\x01\x03\x1b\x0f\x0f=\x00\x00\x04\x00\x00\xff@\b\x00\x05\x80\x00\a\x00\x11\x00\x19\x00C\x00\x00\x004&\"\x06\x14\x162\x13!\x03.\x01#!\"\x06\a\x004&\"\x06\x14\x162\x13\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x013!2\x16\x17\x1332\x16\x01\xe0^\x84^^\x84\x82\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x05\x03^\x84^^\x84\xfe\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x03\x00b\xa2\x17i\x1c]\x83\x01~\x84^^\x84^\x01\xe0\x01e\b\x13\x13\b\xfd\x19\x84^^\x84^\x01\x00\xfe\x80\x0e\x12\x80PppP\x80\x80PppP\x80\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\u007f^\xfe]\x83\x00\x04\x00\x00\xff\x00\b\x00\x06\x00\x003\x00;\x00E\x00M\x00\x00\x012\x16\x15\x11\x14\x06+\x01\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\"&5\x1146;\x01\x13>\x01;\x015463!2\x16\x1d\x0132\x16\x17\x13\x00264&\"\x06\x14\x01!\x03.\x01#!\"\x06\a\x00264&\"\x06\x14\a ]\x83\x12\x0e`p\xa0p\xfc\x00p\xa0p`\x0e\x12\x83]\x1ci\x17\xa2b\x80\x12\x0e\x01\xc0\x0e\x12\x80b\xa2\x17i\xf9\xfa\x84^^\x84^\x01d\x03\xf8Y\x02\x18\t\xfd\x00\t\x18\x02\x04!\x84^^\x84^\x02\x80\x83]\xfe\x80\x0e\x12@PppP@@PppP@\x12\x0e\x01\x80]\x83\x01\xa3^\u007f\xe0\x0e\x12\x12\x0e\xe0\u007f^\xfe]\xfe ^\x84^^\x84\x01\x82\x01e\b\x13\x13\b\xfc\xbb^\x84^^\x84\x00\x01\x00 \xff\x00\x05\xe0\x06\x00\x003\x00\x00$\x14\x06#!\x1e\x01\x15\x14\x06#!\"&5467!\"&47\x01#\"&47\x01#\"&47\x0162\x17\x01\x16\x14\x06+\x01\x01\x16\x14\x06+\x01\x01\x05\xe0&\x1a\xfe2\x01\n$\x19\xfe\xc0\x19$\n\x01\xfe2\x1a&\x13\x01\x92\xe5\x1a&\x13\x01\x92\xc5\x1a&\x13\x01\x80\x134\x13\x01\x80\x13&\x1a\xc5\x01\x92\x13&\x1a\xe5\x01\x92Z4&\x11\x8d&\x19##\x19&\x8d\x11&4\x13\x01\x93&4\x13\x01\x93&4\x13\x01\x80\x13\x13\xfe\x80\x134&\xfem\x134&\xfem\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x15\x00+\x00D\x00P\x00\x00\x014'&#\"\a\x06\x15\x14\x16327632\x17\x1632674'&!\"\a\x06\x15\x14\x1632763 \x17\x16326\x134'&$#\"\a\x0e\x01\x15\x14\x16327632\x04\x17\x1632>\x01\x10\x02\x04 $\x02\x10\x12$ \x04\x04g\x1e\xc1\xfe\x85\x9a*\x1b\x16\x05 \x84o\xe2\xab\x13\x0e\x13\x1c`#\xed\xfeə\x960#\x19\a\x1ez\x81\x01\x17\xd1\x18\x0e\x19#l(~\xfe\xb2\xb0̠\x17\x1f)\x1f\v\x1d\x85\xae\x9f\x01-g\x15\x13\x1d+\xcd\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01F \x13s\"\t+\x14\x1d\b\x1bg\v\x1b\xec(\x15\x8d*\r3\x19#\b!|\r#\x01\x11/\x17IK/\a%\x1e\x1f*\b%D=\f)[\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00\x00\xff\x80\x04\x00\x06\x00\x00\x13\x00\x00\t\x01\x17!\x11!\a\x03\a!\x11\x01'!\x11!7\x137!\x04\x00\xfe\xd1\x18\x01\x17\xfe\x05,\x8e\x1e\xfe\xd3\x01/\x18\xfe\xe9\x01\xfb,\x8e\x1e\x01-\x04\xd1\xfd\xba\x1f\xfea\x1e\xfe\xef\x1e\x01/\x02G\x1e\x01\x9f\x1e\x01\x11\x1e\x00\x00\x00\x11\x00\x00\x00\x8c\t\x00\x04t\x00\x0e\x00%\x00/\x00;\x00<\x00H\x00T\x00b\x00c\x00q\x00\u007f\x00\x8d\x00\x90\x00\x9e\x00\xac\x00\xc0\x00\xd4\x00\x00%7\x03.\x01#\"\x06\x15\x03\x17\x1e\x0132%7\x034'&\"\a\x06\x15\a\x03\x14\x17\x15\x14\x17\x1632765\x01\x17\a\x06\"/\x017627\x17\a\x06#\"5'7432\x01\x03\x17\a\x14#\"/\x017632\x1f\x01\a\x06#\"5'7432\x1f\x01\a\x06#\"&5'74632\t\x01\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x14\x06#\"/\x01\x13632\x167\x13\a\x06#\"/\x01\x134632\x16\x019\x01\x03\x13\a\x14\x06\"&/\x01\x13462\x16\x17\x13\a\x14\x06\"&/\x01\x13>\x012\x16\x13\a1\x14\x06\"&/\x02\x13567632\x17\x16\x17\x01\x14\x06#!.\x015\x1147632\x00\x17632\x16\x03\x10\x10\x10\x01\r\n\t\x0e\x0e\x0e\x01\r\t\x16\x01*\v\f\r\b\x10\b\r\x01\n\v\x06\t\x0e\v\t\t\xfb\xec\x14\x14\x02\x0e\x02\x11\x11\x02\x0eX\x1a\x1a\x02\b\t\x17\x17\t\b\x01\x1a\xbc\x19\x19\v\n\x02\x15\x15\x02\n\v^\x17\x17\x02\f\r\x15\x15\r\f`\x15\x15\x02\x0e\x06\t\x14\x14\t\x06\x0e\x01\x81\xfe\xdf\x15\x15\n\a\x10\x02\x12\x12\x02\x10\a\n^\x13\x13\v\b\x12\x02\x10\x10\x02\x12\b\vb\x12\x12\x02\x14\x13\x02\x10\x10\r\b\t\f\x01\x89\xc6\x0f\x0f\x0f\x14\x0e\x01\x0e\x0e\x0f\x14\x0fc\x0e\x0e\x10\x16\x10\x01\f\f\x01\x10\x16\x0f\xd5\x0e\x12\x1a\x12\x01\x06\x06\f\x02\n\t\v\b\a\x0e\x02\x04f\xa6u\xfc\xee\r\x12\x1cU`\xc3\x01\x1e\x1159u\xa6\xa4\xf1\x02\v\n\x0e\x0e\n\xfd\xf5\xf1\n\r4\xd3\x02J\x10\b\x05\x05\b\x10\x06\xfd\xbd\x01\xeb\x01\n\a\v\t\a\r\x01l\x80~\t\t~\x80\tF\xcf\xcb\t\n\xca\xcf\t\xfe2\x01\xeb\xf5\xed\v\v\xed\xf5\f\x05\xfc\xf4\r\r\xf4\xfc\r\x1f\xea\xf6\x10\t\a\xf6\xea\x06\t\xfe\x16\x02m\xfe\x84\xf6\a\v\x12\xf6\x01|\x12\vO\xfe,\xf4\b\v\x13\xf4\x01\xd4\x13\v \xfe\x06\xf2\x15\x15\xf2\x01\xfa\t\r\r\xfd\x11\x02\xea\xfe\x02\xef\n\x0f\x0e\v\xef\x01\xfe\v\x0e\x0e\x1e\xfe\x14\xec\v\x10\x10\v\xec\x01\xec\f\x10\x10\xfe\b\xe7\r\x12\x12\rru\x02|\x03\x0f\t\a\x05\b\x12\xfd\x94u\xa5\x02\x12\r\x03\x83\x17\n\"\xfe\xf9\xc0\x16\xa6\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\r\x00\x1b\x00)\x009\x00\x00\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 $7\x15\x14\x06\x04 $&=\x01\x16\x00 \x04\x16\x1d\x01\x14\x06\x04 $&=\x0146\x02\x13\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\x9c\x01\xda\x01\x9cw\xce\xfe\x9e\xfe`\xfe\x9e\xcew\x01\xb9\x01\xa0\x01b\xce\xce\xfe\x9e\xfe`\xfe\x9e\xce\xce\x03\x00VT\xaaEvEEvE\xaaT\xfc\xaaVT\xaaEvEEvE\xaaT\x01*VT\xaaEvEEvE\xaaT\x04*EvE\x80EvEEvE\x80Ev\x00\b\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00^\x00c\x00t\x00\u007f\x00\x87\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x17632\x17\x16\a\x14\x06\a\x15\x06#\"&'\x06\a\x02#\"/\x01&'&7>\x0176\x17\x16\x156767.\x0176;\x022\x17\x16\a\x06\a\x16\x1d\x01\x06\a\x16\x0167\x0e\x01\x01\x06\x17674767&5&5&'\x14\a\x0367.\x01'&'\x06\a\x06\x05&#\x163274\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\xfe!3;:\x93\x1e\x10\x0e\x02\x01\x06A0\x86?ݫ\x99Y\x0f\r\x18\x01\x05\n\x04\t^U\x0e\t\x0247D$\x18\r\r\v\x1f\x15\x01\x17\f\x12\t\x02\x02\x01\x02\f7\xfe\x1b4U3I\x01\x81\x0f\r\x01\x06\a\x01\x03\x01\x01\x01\f\x01|\x87\x95\x02\x16\x05L3\x1b8\x1e\x02w\x18tL0\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x02Q\x1a\x1e\a1\x16\x1e\x01\x02\x01\x01&(!\x18;\xfe\xfa\a\f\x01\x04\n\x1a(g-\t\x0f\x02\x02Up\x88~R\x9b2(\x0f\x15/\x06\x02\x03\x05\x1e{E\xa4\xfe\x1b\x18\x86(X\x03z*Z\a%\x03(\x04\x04\x01\x01\x02\x01\x16\x0e\x01\x01\xfdi6\x1b\x01\x11\x05CmVo8\v\x18\x1c\x01\x01\x00\x00\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00T\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x13\x153\x133\x1367653\x17\x1e\x01\x17\x133\x1335!\x153\x03\x06\x0f\x01#4.\x015.\x01'\x03#\x03\x0e\x01\x0f\x01#'&'\x0335\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00iF\xa4\x9f\x80\a\x03\x02\x04\x03\x01\x05\x03\x80\x9f\xa4F\xfe\xd4Zc\x05\x02\x02\x04\x01\x02\x01\x06\x02\x90r\x90\x02\x05\x01\x04\x04\x02\x02\x05cZ\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80k\xfdk\x01\xe5\x14\x1a\x10\b\x18\x03\"\t\xfe\x1b\x02\x95kk\xfeJ\x14\x1a\x15\x03\a\t\x02\x05 \t\x02!\xfd\xdf\t\x1f\x06\x15\x15\x1a\x14\x01\xb6k\x00\x00\x04\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00S\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#7>\x02;\x01\x16\x17\x1e\x02\x1f\x01#\x15!5#\x03\x1335!\x153\a\x0e\x01\x0f\x01#&'&/\x0135!\x153\x13\x03\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01-\x01\x19Kg\x05\n\x05\x01\x02\x01\x04\x02\x05\a\x03kL\x01#D\xc0\xc3C\xfe\xe9Jg\x04\f\x03\x02\x02\x01\x04\x06\vjL\xfe\xdeD\xbd\xc2\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa1\a\x13\b\x04\x06\x04\a\t\x04\xa1jj\x01\x11\x01\x1akk\x9f\a\x13\x04\x03\x04\x06\v\f\x9fkk\xfe\xf0\xfe\xe5\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x008\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11%\x15!5#5327>\x0154&'&#!\x153\x11\x01#\x1132\x17\x16\x15\x14\a\x06\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01 \x01G]\x89L*COJ?0R\xfe\x90\\\x01\x05wx4\x1f8>\x1f\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\xeajj\xa7\x0f\x17\x80RQx\x1b\x13k\xfd\xd5\x01\x18\x01\f\x12!RY\x1f\x0f\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x00*\x002\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x11!57\x17\x01\x04\"&462\x16\x14\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x04\x80\xfc\x00\xc0\x80\x01\x80\xfeP\xa0pp\xa0p\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x01\xc0\xfe\xc0\xc0\xc0\x80\x01\x80\x80p\xa0pp\xa0\x00\x00\t\x00\x00\xff\x00\x06\x00\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00#\x00*\x007\x00J\x00R\x00\x00\x015#\x15\x055#\x1d\x015#\x15\x055#\x15\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11#\x15#5!\x11\x01\x13\x16\x15\x14\x06\"&5476\x1353\x1532\x16\x02264&\"\x06\x14\x02\x80\x80\x01\x00\x80\x80\x01\x00\x80\x03<\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\x80\x80\xfe\x00\x02\x8dk\b\x91ޑ\b\x15c\x80O\x16\"\xbcjKKjK\x04\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x01\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\x80\x80\xfa\x00\x02\xd1\xfe\xa3\x1b\x19SmmS\x19\x1b?\x01M\x80\x80\x1a\xfe\x1a&4&&4\x00\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x009\x00L\x00^\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01\x16\x15\x11\x14\a\x06#\"/\x01#\"&=\x0146;\x0176\x01276\x10'.\x01\a\x0e\x01\x17\x16\x10\a\x06\x16\x17\x16'2764'.\x01\x0e\x01\x17\x16\x14\a\x06\x16\x17\x16\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01\xec\x14\x14\b\x04\f\v\xa6\x83\x0e\x12\x12\x0e\x83\xa6\x10\x01\xb4\x1f\x13\x81\x81\x106\x14\x15\x05\x11dd\x11\x05\x15\x12\xbd\x1b\x14WW\x126&\x02\x1344\x13\x02\x13\x14\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03.\b\x16\xfd\xe0\x16\b\x02\t\xa7\x12\x0e\xc0\x0e\x12\xa7\x0f\xfdG\x18\x9f\x01\x98\x9f\x15\x06\x11\x115\x15{\xfe\xc2{\x155\x10\x0f\x94\x14]\xfc]\x13\x02$5\x149\x949\x145\x12\x11\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x003\x00C\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x16\x15\x11\x14\a\x06#\"'\x015\x01632\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x02\x804LL4\xfe\x804LL4\x03l\x14\x14\b\x04\x0e\t\xfe\xf7\x01\t\t\x0e\x04\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80L4\xfe\x804LL4\x01\x804L\x02\b\x16\xfd\xc0\x16\b\x02\t\x01\nZ\x01\n\t\x00\x00\x00\x06\x00\x00\xff\x00\x06\x00\x06\x00\x00\x13\x00\x1a\x00#\x007\x00K\x00[\x00\x00\x01\x1e\x01\x15\x11\x14\x06#!\"&5\x11463!2\x16\x17\a\x11!&'\x01&\x01\x11!\"&5\x11!\x11\x01>\x01\x1f\x01\x1e\x01\x0f\x01\x17\x16\x06\x0f\x01\x06&'\x03&7!\x16\a\x03\x0e\x01/\x01.\x01?\x01'&6?\x016\x16\x17\x01.\x017\x13>\x01\x1f\x01\x1e\x01\a\x03\x0e\x01'\x05\xbc\x1c(8(\xfa\xc0(88(\x03\x80(`\x1c\x84\x01x\n\f\xfe\xc7\f\x01c\xfe`(8\xfd\x00\x01`\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xe2\x0e\x0e\x04\x04\x0e\x0e\xe2\b\x1a\v3\v\x03\b\xb6\xb6\b\x03\v3\v\x1a\b\xfev\r\x0f\x02\x8a\x02\x16\r?\r\x0f\x02\x8a\x02\x16\r\x04\x84\x1c`(\xfb\x80(88(\x06@(8(\x1cD\xfe\x88\x1d\f\x019\f\xfa\x12\x04\x008(\x01\xa0\xfa\x00\x03\x80\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\x01-\x13\x13\x13\x13\xfe\xd3\v\x03\b&\b\x1a\v\xf3\xf3\v\x1a\b&\b\x03\v\xfd\x06\x02\x16\r\x03?\r\x0f\x02\n\x02\x16\r\xfc\xc1\r\x0f\x02\x00\x01\x00'\xff\x97\x05\xd9\x06\x00\x006\x00\x00\x01\x15\x06#\x06\x02\x06\a\x06'.\x04\n\x01'!\x16\x1a\x01\x16\x1767&\x0254632\x16\x15\x14\a\x0e\x01\".\x01'654&#\"\x06\x15\x14\x1632\x05\xd9eaAɢ/PR\x1cAids`W\x1b\x01\x1b\x1aXyzO\xa9v\x8e\xa2д\xb2\xbe:\a\x19C;A\x12\x1f:25@Ң>\x02\xc5\xc6\x17\x88\xfe\xf2\xa1\x1a-0\x115r\x8f\xe1\x01\a\x01n\xcf\xda\xfe\x97\xfe\xef\xc6`\xa9\xedH\x01(\xb9\xc0\xf5\xd3\xc0\x9f\u007f\x01\x04\f' gQWZc[\xba\xd7\x00\x00\b\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x06\x00\n\x00\x0e\x00\x12\x00\x15\x00\x19\x00-\x00\x00\x13\x01\x11%\x057'\t\x01%\x05'-\x01\x05'%\x11\t\x01\x17\x11\x05%\x01\x11\x05\x11\x14\a\x01\x06\"'\x01&5\x1147\x0162\x17\x01\x16\xd8\x02[\xfe\xb2\xfe\xb5\xc1\xc1\x033\x02[\xfe\xf3\xfe\xb2M\x01\x10\xfe\xf0\xfe\xf0\x8b\x01N\xfd\xa5\x04\xcd\xc1\xfe\xb5\x01\r\xfd\xa5\x033\"\xfc\xcd\x15,\x15\xfc\xcd\"\"\x033\x15,\x15\x033\"\x01o\xfen\x01g\xdf$\x81\x81\xfc\xdc\x01\x92\xb4߆\xb6\xb6\xb6]\xdf\x01g\xfen\xfe\xef\x81\x01\x02$\xb4\x01\x92\xfe\x99+\xfd\xde)\x17\xfd\xde\r\r\x02\"\x17)\x02\")\x17\x02\"\r\r\xfd\xde\x17\x00\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05x\x00#\x00W\x00\x00\x01\x1e\x01\x15\x14\x06#\"&#!+\x02.\x015467&54632\x176$32\x04\x12\x15\x14\x06\x01\x14\x16327.\x01'\x06#\"&54632\x1e\x0532654&#\"\a\x17632\x16\x15\x14\x06#\".\x05#\"\x06\a\bo\x89\xec\xa7\x04\x0f\x03\xfbG\x01\x02\x05\xaa\xecn\\\f\xa4u_MK\x01'\xb3\xa6\x01\x18\xa3\x01\xfą|\x89g\x10?\fCM7MM5,QAAIQqAy\xa7\xa8{\x8fb]BL4PJ9+OABIRo?z\xaa\x02\xfc.\xc7z\xa4\xe9\x01\n\xe7\xa5n\xba6'+s\xa2:\x9a\xbc\xa1\xfe\xec\xa3\x06\x18\xfe\xf0z\x8ec\x14I\x0eAC65D*DRRD*\x8fwy\x8eal@B39E*DRRD*\x8d\x00\x00\x00\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00\x00\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \a\x1762\x177\x017&47'\x06\x10\x00 7'\x06\"'\a\x12 6\x10& \x06\x10\x05\x176\x10'\a\x16\x14\x02\xca\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x02\xc0\xfe\x84\xab\xc2R\xaaR\xc2\xfb\xf1\xc2\x1c\x1c\xc2Z\x02B\x01|\xab\xc2R\xaaR\xc2\xca\x01>\xe1\xe1\xfe\xc2\xe1\x03d\xc2ZZ\xc2\x1c\x06\x00\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x0eZ\xc2\x1c\x1c\xc2\xfb\xf1\xc2R\xaaR«\xfe\x84\xfd\xbeZ\xc2\x1c\x1c\xc2\x01&\xe1\x01>\xe1\xe1\xfe\xc2\b«\x01|\xab\xc2R\xaa\x00\x01\x00 \xff \x06\xe0\x05\xd7\x00!\x00\x00\x01\x14\x02\x06\x04 $&\x0254\x12$7\x15\x06\x00\x15\x14\x1e\x02 >\x0254\x00'5\x16\x04\x12\x06\xe0\x89\xe7\xfe\xc0\xfe\xa0\xfe\xc0\xe7\x89\xc2\x01P\xce\xdd\xfe\xddf\xab\xed\x01\x04\xed\xabf\xfe\xdd\xdd\xce\x01P\xc2\x02\x80\xb0\xfe\xc0牉\xe7\x01@\xb0\xd5\x01s\xf0\x1f\xe4-\xfe\xa0\xe6\x82\xed\xabff\xab\xed\x82\xe6\x01`-\xe4\x1f\xf0\xfe\x8d\x00\x00\x01\x00\x13\xff\x00\x06\xee\x06\x00\x00c\x00\x00\x136\x12721\x14\a\x0e\x04\x1e\x01\x17\x1e\x01>\x01?\x01>\x01.\x01/\x01.\x03/\x017\x1e\x01\x1f\x016&/\x017\x17\x0e\x01\x0f\x01>\x01?\x01\x17\x0e\x01\x0f\x01\x0e\x01\x16\x17\x1e\x01>\x01?\x01>\x02.\x04/\x01&3\x161\x1e\b\x17\x12\x02\x04#\"$&\x02\x13\b\xd8\xc5\x05\x01\b(@8!\x05IH2hM>\x10\x10'\x1c\x0f\x1b\r\x0e\n)-*\x0e\rh'N\x14\x13\x01'\x15\x14\xa1\xa0!'\x03\x04\x16O\x1c\x1cg,R\x13\x13\x1f\"\x14/!YQG\x16\x15\x0154'6\x133&5\x1147#\x16\x15\x11\x14\x055\x06#\"=\x0132\x1635#47#\x16\x1d\x01#\x15632\x163\x15#\x15\x14\x1e\x0332\x014&\"\x06\x15\x14\x1626%\x11\x14\x06#!\"&5\x11463!2\x16\x02F]kbf$JMM$&\xa6N92Z2\x1d\b\x02\a\x18\x06\x15&`\x06\xe3\x06\xab\x0f9\x0eUW=\xfd\xf0N9:PO;:\x16dhe\x03\\=R\x91\x87\x01\xcd\xca\f\n+)\u007f\xb3\x17\b&'\x1f)\x17\x15\x1e-S9\xfe\xd0\x199kJ\xa5<\x04)Um\x1c\x04\x18\xa9Q\x8b\xb9/\xfc\xbe-Y\x02a^\"![\xfd\x9bY\xb1\xc4'(<`X;\x01_\x04\x02\x06\xbeL6#)|\xbe\x04\xfe\x93\x83\x04\x0etWW:;X\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x1b\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02שw\xfc@w\xa9\xa9w\x03\xc0w\xa9\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x03\x8a\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x02\x009\xff\x00\x04\xc7\x06\x00\x00\x1d\x00I\x00\x00\x00\x14\x06#\"'\x06\a\x02\x13\x16\x06\a#\"&'&>\x03767&5462\x04\x10\x02\x04#\"'.\x017>\x01\x17\x1632>\x024.\x02\"\x0e\x02\x15\x14\x17\x16\x0e\x01&'&54>\x0232\x04\x03JrO<3>5\xf7-\x01\x1b\x15\x05\x14\x1e\x02\x0e\x15&FD(=G\x10q\xa0\x01\xee\x9c\xfe\xf3\x9e@C\x15\x17\x05\x05$\x1539a\xb2\x80LL\x80\xb2²\x80L4\n\r&)\n@]\x9c\xd8v\x9e\x01\r\x04\x14\xa0q#CO\xfe\x8d\xfe\x18\x16!\x02\x1b\x14~\U000ffd42\x0172765'.\x01/\x01\"\a\x0e\x01\a#\"&'&5\x10\x01\x0e\b\x16\r\x01\x11\x0e\xb9}\x8b\xb9\x85\x851R<2\"\x1f\x14\f\x017\x12\x03\x04MW'$\t\x15\x11\x15\v\x10\x01\x01\x02\x05;I\x14S7\b\x02\x04\x05@\xee5sQ@\x0f\b\x0e@\b)\xadR#DvTA\x14\x1f\v;\x14\x04\n\x02\x020x\r\x05\x04\b\x12I)\x01\x04\x04\x03\x17\x02\xda\x13!\x14:\x10\x16>\f\x8b\x01+\x03\x14)C\x04\t\x016.\x01\x13\x00\x00\x00\x00\x06\x00\x00\xff>\b\x00\x05\xc2\x00\n\x00\x16\x00!\x00-\x00I\x00[\x00\x00\x004&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x024&#\"\x06\x15\x14\x1632\x014&#\"\x06\x15\x14\x16326\x01&#\"\x04\x02\x15\x14\x17\x06#\".\x03'\a7$\x114\x12$32\x04\x16\x01\x14\x06\a\x17'\x06#\"$&\x106$32\x04\x16\x02D2)+BB+)\x03\x193(\x1b--\x1b(3\xec1)+BB+)\x02\xac4'\x1b--\x1b'4\xfe\xf6\x1f'\xa9\xfe\xe4\xa3\x17#!\x1a0>\x1bR\t\xfdH\xfe\xde\xc3\x01MŰ\x019\xd3\x02o\x89u7ǖD\xa9\xfe䣣\x01\x1c\xa9\xa1\x01\x1c\xab\x04\nR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xefR23('3\xfe_\x1c,-\x1b\x1c-,\x01\xaa\x04\x9a\xfe\xf9\x9cNJ\x03\x03\n\x04\x11\x02\u007f\xda\xcb\x01\x1f\xa9\x01\x1c\xa3\x84\xe9\xfd?u\xd5W\xb5m%\x8d\xf2\x01\x1e\xf2\x8d\x8d\xf3\x00\x01\x00\x00\xff\x00\x06\xff\x06\x00\x00\x1e\x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x03\x06#\"'.\x015\x11\t\x01%&'&7\x01632\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfe;\xf2\x12\x1f\r\t\x13\x17\x03`\xfb\xd3\xfeu%\x03\x02\"\x06\x80\x0f\x11\x14\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xb9\xfe\xd9\x17\x04\a!\x14\x01]\x04#\xfcc\xa2\x0e)(\x13\x03\xc0\t\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\xff\x05\xf7\x00\x1a\x00 \x00\x00\x01\x16\a\x01\x06\a\x06#\"'%\x01\x06#\"'.\x015\x11%&'&7\x016\x01\x13\x01\x05\t\x01\x06\xe4!\x06\xff\x00\x05\x1b\x0e\x11\v\r\xfd\xf1\xfe\xd6\x12\x1d\x0e\t\x13\x16\xfe(%\x03\x03#\x06\x80#\xfe\xcb\xdd\xfaf\x01P\x03_\xfe\"\x05\xf5\x18(\xfa\x00\x1d\x10\b\x05\xd7\xfe\xb9\x15\x04\a!\x14\x01\xc4\xc1\x0e)'\x14\x03\xc0\x15\xfa\x0e\x05+\xfcʼn\x02\u007f\xfc\xe3\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x004\x00I\x00\x00\x00\x10\x02\x06\x04#\"$'&6?\x0163\x16\x17\x1e\x0132>\x024.\x02#\"\x06\a\x17\x16\a\x06#!\"&5\x11476\x1f\x016$32\x04\x16\x05\x11\x14\x06#!\"&=\x0146;\x01\x1146;\x012\x16\x06\x00z\xce\xfe䜬\xfe\xcam\a\x01\b\x89\n\x0f\x10\aI\xd4wh\xbd\x8aQQ\x8a\xbdhb\xb4F\x89\x1f\x11\x11*\xfe@\x1a&('\x1e\x82k\x01\x13\x93\x9c\x01\x1c\xce\xfd\xfa\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x03\x1c\xfe\xc8\xfe\xe4\xcez\x91\x84\n\x19\b\x8a\t\x02\n_hQ\x8a\xbdн\x8aQGB\x8a\x1e'(&\x1a\x01\xc0*\x11\x11\x1f\x81eozΘ\xfe@\x0e\x12\x12\x0e@\x0e\x12\x01`\x0e\x12\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x00 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x82\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x05\x00f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x01\x00>\xff\x80\x06\xc2\x05\x80\x00\x85\x00\x00\x05\"&#\"\x06#\"&54>\x02765\x034'&#!\"\a\x06\x15\x03\x14\x17\x1e\x03\x15\x14\x06#\"&#\"\x06#\"&54>\x02765'\x1146.\x04'.\x01\"&54632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x163!2765\x134'.\x0254632\x1632632\x16\x15\x14\x0e\x02\a\x06\x15\x13\x14\x17\x1e\x03\x15\x14\x06\x06\x92,\xb1-,\xb0,\x18\x1a\",:\x10!\x01\x01\r%\xfd]&\r\x01\x01%\x10@2(\x19\x18/\xb9.+\xaa*\x17\x19\x1f)6\x0f!\x01\x01\x01\x02\x05\b\x0e\t\x0f<.$\x18\x18.\xb9.*\xa9*\x19\x19\"+8\x0f#\x01\x01\r\x1a\x02\xbb\x19\r\x01\x01#\x12Q3\x19\x19,\xb0,+\xac+\x19\x19#-:\x0f#\x01\"\x10\x19$$\x19\x01\xf0\f/:yu\x8e\xa6xv)%$\x00\t\x00\x00\xff\x80\x06\x00\x05\x00\x00\x03\x00\x13\x00\x17\x00\x1b\x00\x1f\x00/\x00?\x00C\x00G\x00\x00%\x15!5%2\x16\x15\x11\x14\x06#!\"&5\x11463\x01\x15!5\x13\x15#5\x01\x15!5\x032\x16\x15\x11\x14\x06#!\"&5\x11463\x012\x16\x15\x11\x14\x06#!\"&5\x11463\x05\x15#5\x13\x15!5\x01`\xfe\xa0\x02\xc0\x1a&&\x1a\xff\x00\x1a&&\x1a\x01\xa0\xfc\xa0\xe0\xe0\x06\x00\xfd \xe0\x1a&&\x1a\xff\x00\x1a&&\x1a\x03\x80\x1a&&\x1a\xff\x00\x1a&&\x1a\x02@\xe0\xe0\xfc\xa0\x80\x80\x80\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x01\x80\x80\x80\x02\x00\x80\x80\xfc\x00\x80\x80\x04\x80&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\xfe\x00&\x1a\xff\x00\x1a&&\x1a\x01\x00\x1a&\x80\x80\x80\x02\x00\x80\x80\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x00\x00\x012\x16\x10\x06 &547%\x06#\"&\x10632\x17%&546 \x16\x10\x06#\"'\x05\x16\x14\a\x056\x04\xc0\x85\xbb\xbb\xfe\xf6\xbb\x02\xfe\x98\\~\x85\xbb\xbb\x85~\\\x01h\x02\xbb\x01\n\xbb\xbb\x85~\\\xfe\x98\x02\x02\x01h\\\x02\x00\xbb\xfe\xf6\xbb\xbb\x85\f\x16\xb4V\xbb\x01\n\xbbV\xb4\x16\f\x85\xbb\xbb\xfe\xf6\xbbV\xb4\x16\x18\x16\xb4V\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00%\x005\x00\x00$4&#\"\a'64'7\x163264&\"\x06\x15\x14\x17\a&#\"\x06\x14\x16327\x17\x06\x15\x14\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00}XT=\xf1\x02\x02\xf1=TX}}\xb0~\x02\xf1>SX}}XS>\xf1\x02~\xb0\x01}\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\xfd\xb0~:x\x10\x0e\x10x:~\xb0}}X\a\x10x9}\xb0}9x\x10\aX}\x03\xe0\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\a\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00/\x00>\x00L\x00X\x00d\x00s\x00\x00\x00.\x01\a\x0e\x01\a\x06\x16\x17\x16327>\x0176\x01\x17\a\x17\x16\x14\x0f\x01\x16\x15\x14\x02\x06\x04 $&\x02\x10\x126$32\x17762\x1f\x01\x13\x06#\"/\x01&4762\x1f\x01\x16\x14\x17\x06\"/\x01&4762\x1f\x01\x16\x146\x14\x06+\x01\"&46;\x012'\x15\x14\x06\"&=\x01462\x16\x17\a\x06#\"'&4?\x0162\x17\x16\x14\x02E\x140\x19l\xa6,\n\x14\x19\r\v*\x12\"\x81T\x19\x03\xb8.\xf4D\x13\x13@Yo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x8f\xb6\xa1@\x135\x13D\xfb\n\f\r\n[\t\t\n\x1a\nZ\n\xdc\v\x18\vZ\n\n\t\x1b\t[\t \x12\x0e`\x0e\x12\x12\x0e`\x0e\xae\x12\x1c\x12\x12\x1c\x12\x97[\n\f\r\n\n\nZ\n\x1a\n\t\x03\x9a2\x14\n,\xa6l\x190\n\x05(T\x81\"\v\x01\xad.\xf3D\x135\x13@\xa1\xb6\x8f\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoY@\x13\x13D\x01,\n\nZ\n\x1a\n\t\t[\t\x1b\xef\t\t[\t\x1b\t\n\nZ\n\x1a\xbb\x1c\x12\x12\x1c\x12\xa0`\x0e\x12\x12\x0e`\x0e\x12\x12EZ\n\n\t\x1b\t[\t\t\n\x1a\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x04\x00\x14\x005\x00\x00\x01%\x05\x03!\x02 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x016=\x01\a'\x13\x17&'\x17\x05%7\x06\a7\x13\a'\x15\x14\x177\x05\x13\a\x1627'\x13%\x02a\x01\x1f\x01\x1fm\xfe\x9d\x05\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x04m\x95f\xf0?\x86\x96\xef5\xfe\xe1\xfe\xe15\uf587>\xf0f\x95\x1e\x01F\x8btu\xf6ut\x8b\x01F\x02\xd0\xd0\xd0\xfe\xb0\x04\x80\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xfbH\xcb\xfb\x03Y\xe0\x01C\f\xceL|\x9f\x9f|L\xce\f\xfe\xbd\xe0Y\x03\xfb˄(\xfe\xd6E''E\x01*(\x00\x00\x00\f\x00\x00\x00\x00\a\x00\x05\x80\x00\x0f\x00\x1f\x00/\x00?\x00I\x00Y\x00i\x00y\x00\x89\x00\xa2\x00\xb2\x00\xbc\x00\x00%\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16%\"&=\x01!\x15\x14\x06#\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x03\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x15!54\x05\x04\x1d\x01!54>\x04$ \x04\x1e\x04\x11\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x11\x15\x14\x06#!\"&=\x01\x01\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xfd\xc2\x1c&\x02\x02&\x1b\x02\xff\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x02@\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\xc0\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x01\x80\xfd\xfe\xfe\x82\xfe\x82\xfd\xfe\x113P\x8d\xb3\x01\r\x01>\x01\f\xb4\x8dP3\x11\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12&\x1b\xfe\x80\x1b&\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x92&\x1b\x81\x81\x1b&\xfd\xe0\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\xfer\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01r\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01\x8a\r\nh\x02\x01e\n\r\x114LKM:%%:MKL4\xfeW\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x01T\x81\x1b&&\x1b\x81\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00\x14\x00%\x00/\x009\x00\x00\x01\x11\x14\x06#\x11\x14\x06#!\"&5\x11\x1363!\x11!\x11\x01\x11\x14\x06#!\"&5\x11\"&5\x11!2\x17\x01\x15!5463!2\x16\x05\x15!5463!2\x16\x02\xc0&\x1a&\x1a\xfe\x00\x1a&\xf9\a\x18\x02\xe8\xff\x00\x04\x00&\x1a\xfe\x00\x1a&\x1a&\x01\xa8\x18\a\xfc\xd9\xfe\xa0\x12\x0e\x01 \x0e\x12\x02\xa0\xfe\xa0\x12\x0e\x01 \x0e\x12\x04\xc0\xfd\x00\x1a&\xfd\xc0\x1a&&\x1a\x02\x00\x03i\x17\xfd@\x02\xc0\xfc\x80\xfe\x00\x1a&&\x1a\x02@&\x1a\x03\x00\x17\x017\xe0\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x00\x01\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00\x00\x01\x16\x14\a\x01\x17\a\x06\x04'\x01#5\x01&\x12?\x01\x17\x0162\x16\x14\a\x01\x17\x0162\x06\xdb%%\xfeo\x96\xa0\xa3\xfe;\xb9\xfe\x96\xb5\x01j|/\xa3\xa0\x96\x01\x90&jJ%\xfep\xea\x01\x91&j\x04;&i&\xfep\x96\xa0\xa3/|\xfe\x96\xb5\x01j\xb9\x01ţ\xa0\x96\x01\x91%Jk%\xfeo\xea\x01\x90%\x00\x00\x00\x04\x00\x19\xff\f\x06\xe7\x06\x00\x00\t\x00\x15\x00:\x00g\x00\x00\x01\x14\x06\"&5462\x16\x05\x14\x06#\"&54632\x16\x13\x114&#!\"\x06\x15\x11\x1e\x052636\x17\x16\x17\x16\x176\x172\x1e\x02>\x057\x06\a\x12\a\x06\a\x06'&7\x035.\x01'\x03\x16\a\x06'&'&\x13&'&6\x17\x1e\x01\x17\x11463!2\x16\x15\x1176\x16\x03i\u007f\xb2\u007f\u007f\xb2\u007f\x01\xf6~ZY\u007f\u007fYZ~\xe1@O\xfb\xa8S;+[G[3Y\x1cU\x02D\x1b\x06\x04\x1a#\ao\x05?\x17D&G3I=J\xc6y\xfbTkBuhNV\x04\x01\b!\a\x01\x04WOhuAiS\xfby\x19*'\x04\x0f\x03^C\x04\xe9C^\x15'*\x03\x1cSwwSTvvTSwwSTvv\xfe\xf8\x02\x9bWID\\\xfd_\x17\"\x16\x0f\a\x01\x04\x01\x1c\x06\x03\x19\x1a[\x04\x03\x01\x01\x03\x06\v\x10\x17\x1f\x18\x95g\xfe\xe3\xb4q# /3q\x01F\x01\x02\b\x01\xfe\xaer2/ $r\xb4\x01\x1bg\x95%4\x1b\x02\n\x03\x02\xb6HffH\xfdJ\x0f\x1b4\x00\x00\x04\x00d\xff\x80\x06\x9c\x06\x00\x00\x03\x00\a\x00\x0f\x00\x19\x00\x00\x01\x11#\x11!\x11#\x11\x137\x11!\x11!\x157\x01\x11\x01!\a#5!\x11\x13\x03\x80\x91\x02\x1f\x91\x91\xfd\xfbV\x01F\xd9\x03\x1c\xfeN\xfe\xba\xd9\xd9\xferm\x04N\xfeN\x01\xb2\xfeN\x01\xb2\xfd\b\xfe\x03\x1b\xfb\xe7\xd9\xd9\x04\xaa\xfc\v\xfeN\xd9\xd9\x04\x86\x01!\x00\x00\x00\x00\x05\x00Y\xff\x01\x05\xaa\x05\xfd\x00\x16\x00+\x00?\x00N\x00e\x00\x00%\x15\x02\a\x06\a\x06&'&'&7>\x01727>\x01\x17\x1e\x01'\x06\x0f\x01\x04#&'&'&>\x01\x172\x17\x16\x1f\x01\x1e\x01\x01\x0e\x01\a\x06'&\x03'&676\x17\x16\x17\x1e\x01\x17\x16\x01\x16\a\x06'\x01&76$\x17\x16\x17\x16\x12\x05\x16\a\x06\x05\x06\a7\x06&'&767>\x0176\x17\x1e\x01\x17\x03\x05\x01\x05\f'6\xff#\r\x04\x01\x05\x04<\x97\x01;\x0f1\x19\x18\x1b\x96\x031x\xfe\xed\x11#\x13\f\x05\b\x12*#\r\xbdG,T\x17\x19\x039\a\xa93%\x1a\x0e\xaa/\x0e\x05\x11#0\x01v\xcbN\b\x1c\xfdZ\x05;:8\xfe\x86\b\x1b)\x01M:(\t\x03&\x02\x9b\x03\x1d\x0f\xfe\xc6C\x18\x01\x17.\x0e\x1e\x1e\x01J}2\t\x1c%0\x96\x06\xd9\u007f\xfe\xdc\r \b\t^*\x0f\x15\f\x0e\nJ\xb3F\x13\v\t\n&\xe47\x0f'X\x02\"\x192L\xb5D\x02M\x1d\x12\"\t+\xfe\xbc6\xd6\x14\x0e\x15\n\x01\x15M\x152\x15+\x11\x01'B\x1b\a\x16\x02Qf\x14\x11X\x02V#\x1b+]\x0f\n#\x12\xfd\xc1\xc8'\x14\nL\x0f\b\x02\x06\x14\x16/(\x01e\xabB\x06\x13\x11\x17\xdd9\x00\x00\x00\n\x00\x00\x00\x00\b\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00\x17\x00\x1b\x00#\x00,\x008\x00\x00\x01!\x11!\x13\x15!5\x01\x11!\x11\x01\x15!5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x11#\x11\x14\x1626%\x11!\x11\x14\a!26\x13\x11\x14\x06#!\"&5\x11!5\x04\x00\xfe\x80\x01\x80\x80\xfd\x80\x02\x80\xfd\x80\x05\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\xfe\x00\xfc\x00\x80&4&\x06\x80\xfa\x00\v\x05\xcb\x1a&\x80pP\xf9\x80Pp\x01\x00\x04\x00\xfe\x80\xff\x00\x80\x80\x03\x00\xfd\x80\x02\x80\xfd\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\x01\x00\x80\x80\xfc@\x03\xc0\xfc@\x1a&&\x1a\x04@\xfb\xc0!\x1f&\x04\xda\xfb@PppP\x04@\x80\x00\x04\x00*\x00\r\a\xd6\x05\x80\x00\t\x00\x1f\x009\x00Q\x00\x00$\"&5462\x16\x15\x147\".\x01\"\x0e\x01#\"&547>\x012\x16\x17\x16\x15\x14\x06\x01\"'.\x01#\"\x0e\x03#\"&5476$ \x04\x17\x16\x15\x14\x06\x13\"'&$ \x04\a\x06#\"&5476$ \x04\x17\x16\x15\x14\x06\x04\x14(\x92}R}h\x02L\u007f\x82\u007fK\x03\x12\x97\nN\xec\xe6\xecN\n\x97\x00\xff\v\f\x88\xe8\x98U\xab\u007fd:\x02\x11\x96\n\x84\x01x\x01\x80\x01x\x84\n\x96\xfe\v\v\xb3\xfe\u007f\xfe8\xfe\u007f\xb3\v\v\x11\x97\n\xbb\x02\x04\x02\x1a\x02\x04\xbb\n\x97\r\x93\x14 ,, \x14|2222\x96\x12\r\nMXXM\n\r\x12\x96\x01\x10\bic,>>,\x96\x12\f\n\x84\x92\x92\x84\n\f\x12\x96\x01\x0f\t\x9d\x9f\x9f\x9d\t\x96\x12\r\n\xba\xcc̺\n\r\x12\x96\x00\x00\r\x00\x00\xff\x00\x06\x80\x06\x00\x00\a\x00\x0f\x00\x17\x00\x1f\x00'\x00/\x007\x00?\x00K\x00S\x00c\x00k\x00{\x00\x00\x044&\"\x06\x14\x162$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x004&\"\x06\x14\x162\x01\x114&\"\x06\x15\x11\x14\x1626\x004&\"\x06\x14\x162\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x104&\"\x06\x14\x162\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x80KjKKj\x01\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\xfe\xcbKjKKj\x03KKjKKj\xfe\xcbKjKKj\x03KLhLLhL\xfe\x80KjKKj\x01\xcb&\x1a\xfb\x00\x1a&&\x1a\x05\x00\x1a&KjKKj\xcbL4\xfa\x804LL4\x05\x804L5jKKjKKjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\x01\xcbjKKjK\xfe\xcbjKKjK\x01\xcbjKKjK\xfd\x80\x01\x804LL4\xfe\x804LL\x02\xffjKKjK\x01\xc0\x01\x00\x1a&&\x1a\xff\x00\x1a&&\xfe\xa5jKKjK\x03\x00\xfa\x004LL4\x06\x004LL\x00\x02\x00\t\xff\x00\x05\xef\x06\x00\x00'\x00E\x00\x00\x01\x16\a\x02!#\"\x06\x0f\x01\x03\a\x0e\x01+\x01\"&7>\x0376;\x01\x167676767>\x01\x16\x17\x16'\x14\a\x06\a\x06\a\x14#'\"\a\x06\x03\x06#!\"&7\x13>\x013!2\x16\x17\x1e\x01\x05\xef\x12\x16W\xfe\",\x19&\x05\x047\x02\x05'\x19\xfb\x15\x18\x03\t#\x12$\t\x05&\x83\x85g\xafpf5\x18\v\x01\x03\x04\x04O\x99.P\xdeq\x8bZZd\x12\x02S\x01\v\xfe\xd9\x16\x1d\x03\xe8\x05-\x1d\x02V\"\u007f0kq\x03zTx\xfeD!\x1a\x13\xfe\xa6\x0f\x1a!\x1e\x158\xe0p\xdf8%\x02\x17'i_\x97F?\x06\x03\x01\x03;\xb3k\x81\xe9R(\x02\x01\x01`\b\xfd\xf6\n!\x16\x05\xbf\x1d&\x1a\x13)\xa4\x00\x00\x04\x00'\xff\x00\a\x00\x06\x00\x00\n\x00\x12\x00\x19\x00(\x00\x00\x012\x17\x00\x13!\x02\x03&63\x01\x06\a\x02\x0367\x12\x13\x12\x00\x13!\x02\t\x01\x10\x03\x02\x01\x02\x03&63!2\x16\x17\x12\x01\xb9!\x13\x01\n`\xfeB\u007f\xf0\f\x12\x14\x03\xa41LO\xb1(\x04\xd3\xe1\xeb\x01+#\xfe=)\xfe\x00\x04heC\xfe\xdc\x19Q\x04\x13\x10\x01g\x15#\x05s\x03`\x1a\xfe\x94\xfef\x01\xb9\x014\x10#\xfe\x9b\xc7\xc2\x016\x01\x1c\xdd\xe4\xfe\xac\x01\x8f\xfe\xbc\xfd\x13\xfeq\x02\x99\x03'\xfd\xc0\xfeX\xfe|\x020\x02\v\x01-\x01\x1b\x10\x19\x1a\x14\xfeg\x00\a\x00\x00\xff\x80\t\x00\x05\x80\x00\b\x00\x0f\x00\x18\x00\x1c\x00>\x00I\x00Y\x00\x00\x01#6?\x01>\x017\x17\x05\x03&#!\a\x04%\x03'.\x01'\x133\x01\x033\x13#\x05&#\"\x06\a\x06\x17\x1e\x01\x15\x14\x06#\"/\x01\a\x163\x16674'.\x0154636\x1f\x01%#\"\a\x03373\x16\x173\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\xb7\x8a\x0e4\x03\x04\f\x03\f\xfa\x82:\v@\xfe\xf4\x02\x017\x01\x0f\xa2\x11\x1avH\x87\xaf\x01\x05%\xa6h\xa6\x02\x98EP{\x9c\x01\x01\x920&<'VF\x16\x17Jo\x82\x9d\x02\x8c1,1.F6\x0f\x01\xc0\x80A\x16\xf6\xae#\xd4\x05\x0f\x9a\x80L4\xf8\x004LL4\b\x004L\x02\"%\x8e\t\n \n7x\x01'6\rO\\\xfeJYFw\x1d\xfe\x02\x02\x81\xfd~\x02\x82\x10\x1bv^fH\x17$\x15\x1e !\v\x90\"\x01xdjD\x19\"\x15\x16!\x01\x19\b\x9b6\xfd\xb4`\x16J\x03\xc2\xfb\x004LL4\x05\x004LL\x00\x18\x00\x00\xff\x80\t\x00\x05\x80\x00\x11\x00\x19\x00+\x003\x00@\x00G\x00X\x00c\x00g\x00q\x00z\x00\x9c\x00\xb8\x00\xc7\x00\xe5\x00\xf9\x01\v\x01\x19\x01-\x01<\x01J\x01X\x01{\x01\x8b\x00\x00\x01&#\"\x0e\x02\x15\x14\x1e\x02327&\x02\x127\x06\x02\x12\x176\x12\x02'\x16\x12\x02\a\x1632>\x0254.\x02#\"\x0135#\x153\x15;\x025#\a'#\x1535\x1737\x03\x15+\x015;\x01\x153'23764/\x01\"+\x01\x15353$4632\x16\x15\x14\x06#\"$2\x17#\x04462\x16\x15\x14\x06#\"6462\x16\x15\x14\x06\"\x17\"'\"&5&547476125632\x17\x161\x17\x15\x16\x15\a\x1c\x01#\a\x06#\x06%354&'\"\a&#\"\a5#\x1535432\x1d\x0135432\x15\x173=\x01#\x15&#\"\x06\x14\x1632?\x014/\x01&5432\x177&#\"\x06\x15\x14\x1f\x01\x16\x15\x14#\"'\a\x16326\x17'\x06#\"=\x0135#5#\x15#\x153\x15\x14327\"\x06\x15\x14\x16327'\x06#\"'354&3\"\a5#\x1535432\x177&\x16\x14\x16327'\x06'\"&4632\x177&#\"\x173=\x01#\x15&#\"\x06\x14\x1632?\x01\"\a5#\x1535432\x177&\x173=\x01#\x15&\"\x06\x14\x1632?\x01\a\"#\x06\a\x06\x15\x06\x15\x14\x17\x14\x17\x1e\x013274?\x0167654'&'4/\x01\"&\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04_\x80\x99g\xbd\x88QQ\x88\xbch\x99\x80\x83^_\xa3~\\[\u007f\u007f[\\]\x82_^\x83\x80\x99h\xbc\x88QQ\x88\xbdg\x99\x02e\a\x11\a\x03\x1d\x04\x05\x06\x06\x05\x03\x06\x04\x05\b\x02\x03\x03\x02\x03\x04\x01\x01\x01\x01\x01\x01\x02\x01\x06\x03\x01\xfb\x16\x16\x13\x12\x16\x16\x12\x13\x01\xa5<\x05F\x01\x87\x16$\x17\x16\x13\x12\xfa\x17$\x17\x17$\x87\x02\x02\x01\x04\x01\x01\x02\x01\x02\x02\x02\x03\x01\x04\x02\x01\x01\x01\x01\x02\x02\x01\xfa\xbc\x1e\x1d\x19 \x0f\x0e\x1f\x18\x0f\x1e\x1e!\x1e\x1d!\x1e\xa6\x1d\x1d\x11\x1a\x1d&&\x1d\x1c\x0f\xb2/\x0e\x17\x19\x17\x14\f\x16!\x1a\x1e/\r\x18\x1f\x19\x14\r\x19!\x1d!\x82\b\r\r\x1300\x1e\x1c\x1c/\x15e\x1d&'\x1e!\x16\x0e\x12\x15\"\ae$\x83\x17\f\x1e\x1e\x1d\n\b\t\t\x12'!\x1d\x13\x0e\x12\x11\x12\x17\x17\x12\x13\x10\x0e\x14\x1c!\xce\x1e\x1e\x0f\x1b\x1d''\x1d\x1c\x0e\x85\x17\f\x1d\x1d\x1d\n\b\t\b\u007f\x1d\x1d\x0f8''\x1c\x1d\x0eN\x02\x02\x01\x02\x02\x03\x01\x01\x03\x02\x04\x03\x04\x02\x02\x02\x01\x02\x01\x01\x01\x02\x02\x02\x01\x04\x01gL4\xf8\x004LL4\b\x004L\x04\xabUQ\x88\xbcgh\xbc\x88QUk\x01=\x01(\x14\x18\"\x06\x02\x04\n\x0f\v\x18\x0e\x18\x14!\x06\x02\x04\n\x11\x0e\x17\x11\x18\x0e\x19\a\x16=\x1b))\x1b=2\x8e(\x1f '\x13\x16\x0f!\f '\x14\x10\x87L#\x04\x1c\x04(>(\x10\x18\r\x01\x18&\x18\f\x18\x10\x8bDC\x10\x14(>(\x14z\x14\x10\x87L#\x04\x1c\x04\x8bDzG\x14)<)\x14\x03\x01\x01\x02\x01\x03\x02\x04\x03\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x03\x02\x03\x04\x02\x01\x03\x01\x01\x01\x01\x04\xe5\xfb\x004LL4\x05\x004LL\x00\x00\f\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x11\x00\x1b\x00\x1f\x00B\x00W\x00b\x00j\x00q\x00}\x00\x8a\x00\x9a\x00\x00\x01\x14\a\x06+\x01532\x17\x16%\x14+\x01532\x054&+\x01\x113276\x173\x11#\x054&'.\x0154632\x177&#\"\x06\x15\x14\x16\x17\x16\x17\x16\x15\x14\x06#\"'\a\x16326\x055\x06#\"&54632\x175&#\"\x06\x14\x1632\x01\x11\x0e\x01\f\x02\x05!26\x004&\"\x06\x14\x162%\x13#\a'#\x13735#535#535#\x013'654&+\x01\x11353\x01\x11\x14\x06#!\"&5\x11463!2\x16\x019$\x1d<\x11\x11=\x1c$\x06\xf0@\x13\x14?\xf9SdO__J-<\x1eAA\x01@)7\x1d\x15\x1b\x15\x1d\x18\")9,<$.%\b\x13\x1c\x160\x17*,G3@\x01\x16%)1??.+&((JgfJ*\x04\xf7A\x9f\xfe\xc4\xfe\xa9\xfe\x14\xfe\xfe\x06!\x1a&\xfc\xadj\x96jj\x96\x01\x02\x90GZYG\x8eиwssw\xb8\x01\x87PiL>8aA\t\x01!M7\xf8\b7MM7\a\xf87M\x02\xf73!\x1a\xdc\x1b\x1f\r4erJ]\xfe\xb3&3Y\x01M\xe8(,\x14\n\x12\x0e\x10\x15\x1b,%7(#)\x10\r\x06\f\x16\x14\x1b,(@=)M%A20C&M\x14e\x92e\xfd\xb7\x02\x0f(X\x92\x81\x8c0&\x02Ėjj\x96j\b\x01V\xe0\xe0\xfe\xaa\t8Z8J9\xfe\xb3\x8c\x10N/4\xfe\xb3\x85\x02$\xfb\f8NN8\x04\xf48NN\x00\x00\x00\x00\x12\x00\x00\xff\x80\t\x00\x05\x80\x00\x02\x00\v\x00\x0e\x00\x15\x00\x1c\x00#\x00&\x00:\x00O\x00[\x00\xce\x00\xe2\x00\xf9\x01\x05\x01\t\x01$\x01?\x01b\x00\x00\x133'\x017'#\x153\x15#\x15%\x175\x174+\x01\x1532%4+\x01\x1532\x014+\x01\x1532\x053'%\x11#5\a#'\x15#'#\a#\x133\x13\x113\x177\x01\x14\x0e\x04\"&#\x15#'\a!\x11!\x17732%\x15#\x113\x15#\x153\x15#\x15\x01\x15\x14\x06#!\"&5\x11373\x1735\x1737\x15!572\x1d\x01!5\x1e\x026373\x1735\x173\x11#\x15'#\x15'#\"\a5#\x15&#!\a'#\x15'#\a\x11463!2\x16\x15\x11#\"\a5#\"\a5!\x15&+\x01\x15&+\x01\a'!\x11!7\x1735327\x153532\x16\x1d\x01!27\x1532%\x14\x06\a\x1e\x01\x1d\x01#54&+\x01\x15#\x1132\x16\x01\x14\x06\a\x1e\x01\x1d\x01#46.\x03+\x01\x15#\x11\x172\x16\x01\x15#\x113\x15#\x153\x15#\x15\x01\x11#\x11\x01\x14+\x0153254&\".\x01546;\x01\x15#\"\x15\x14\x166\x1e\x017\x15\x06+\x0153254&\x06.\x02546;\x01\x15#\"\x15\x14\x1e\x01\x03\x11#'\x15#'#\a#\"54;\x01\x15\"&\x0e\x04\x15\x14\x16;\x0173\x13\x113\x175wY-\x02AJF\xa3\x8e\x8e\x01=c\xbd(TS)\x01!*RQ+\xfe\xea*RQ+\x01\xcbY,\xfc\x16B^9^\x84\x19\x87\x19Ft`njUM\x02\x98\v\x11\x1c\x18'\x18)\t~PS\xff\x00\x01\x04PR\xcfm\xfe\xdd\xd9٘\x94\x94\x05\xd4M7\xf8\b7Mo\x197\x19\xda\x13q\x14\x02\x1d\n\n\x01\x17\x17@)U\t\x198\x19\xe3\"\xb6\xb4\x19\xb9\x17\xf9E(\xac\x181\xfd\x8c++\xc6\x16\xa9NM7\a\xf87Mx3\x1e\xb17\x17\xfe\xc4\x1f8\xd1\x17D\xea62\xfe\xa3\x01W74\xd3\x15;\x1f\xae\b\b\x04\x02\x119\x1f\xa8<\xfd-\x18\x16\x19\x12A\x18\"EA\x9a0:\xfe\xeb\x19\x15\x1a\x11A\x01\x01\x05\f\x17\x12F@\x991:\x02\x11\xd8ؗ\x94\x94\xfe\xedB\x02\xf7f~~\"\"12\"4(\x82w$#11#\xef\x18@}}!\x19%+%\x195(\x81v$:O\x94\\z\x84\x1a\x86\x19K\x81\x85?\a*\x0f\x1f\f\x11\x06\x1b$\x1d\\amcr\x03Vl\xfd\x86OO176Nn\xd9\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x06\x15\x14;\x012\x004&+\x01\"\x0f\x01'&+\x01\"\x06\x15\x14\x1e\x01\x17\x06\x15\x14;\x0127\x01%4&+\x01\"\a\x03\x06\x16;\x012?\x01>\x022\x16326\x05\x136&+\x01\"\a&#\"\x06\x15\x14\x163267\x14\x06\x15\x14;\x012\x1354+\x01\"\a\x03\a\x14\x16;\x0127\x01\x0e\x01#\a76;\x012\x16\x01\x11\x14\x06#!\"&5\x11463!2\x16\x02\xe93%\x1d#2%\x1c%\x03\x11,, \x11\x02\v\x12\x16\x1a\x18\x01_3$\x1d$2%\x1c%\xfa\xa8M>\xa0\x13\x02A\x01\b\x06L\x14\x02\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1bDHeE:\x1c<\x12\x04\rE\x13\x01\xc2\b\x05M\v\aj,\x05\x11K\x05\b'-\x01R\rM\v\a\x00\xff\x01~M>\x9f\x14\x02A\x01\b\x06R\f\x04\x12\x01\f\x12\x10\x16\x03Vb\x015)\x01\b\x06L\x0e\x03\x1aEHeE:\x1d<\x11\x04\rE\x13\xdd\rJ\v\x02A\x01\b\x06B\x13\x02\xf9I\x05*'!\x11\x02\v\x13($\arL4\xf8\x004LL4\b\x004L\x02v%1 \x1c%3!x*\x1e\x01k\v\x04\x15\xa9$2 \x1c%3!\x8e;5\x13\xfeh\x06\n\x13n\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\f\t\x10\x01\x15\n\t\n\x9c\x96\x10\t\x05\x02r\x84\x04p\b\r\n\x01p8;5\x13\xfeh\x06\n\rt\b\n\x03\x02a\xe2\x01\x05\x06\n!(lI;F\x18\x14\x01\x10\x04\x10\x01\xac\x01\x0e\v\xfe`\x02\x05\t\x13\x01\x13#\x16\x01k\v\x17\x01\xdf\xfb\x004LL4\x05\x004LL\x00\x00\x00\n\x00\x00\xff\x80\t\x00\x05\x80\x00\n\x00\x0f\x002\x00H\x00W\x00[\x00l\x00t\x00\x8b\x00\x9b\x00\x00\x01\x14\a\x06#\"'5632\x05#632\x054&'.\x015432\x177&#\"\a\x06\x15\x14\x16\x17\x1e\x01\x15\x14#\"&'\a\x163276\x017#5\x0f\x033\x15\x14\x17\x163275\x06#\"=\x01\x055&#\"\x06\a'#\x113\x11632\x133\x11#\x054'&#\"\a'#\x1175\x163276\x004&\"\x06\x14\x162\x014'&#\"\x06\x15\x14\x17\x16327'\x06#\"'&'36\x13\x11\x14\x06#!\"&5\x11463!2\x16\x06=\x15\x13!\x17\x12\x1d\x1c9\x01\xb6n\x0623\xf9\xecBD$ &:B\x12CRM.0AC'\x1f0\x1dR\x1f\x12H`Q03\x01'\x13`\x81\x12.\x11>,&I / \f*\x01\x89\x0f\r /\n\n\x83\x96\x1a8\x10/\x96\x96\x02n-(G@5\b\x84\x96$ S3=\xfe,.B..B\x03\xb002^`o?7je;\x109G+\x14\x17\x05\xf8\x02\x80L4\xf8\x004LL4\b\x004L\x02yE%#\t\xe0\x1eVb\xe9;A\x19\r\x16\x0e\x1a!p &'F:A\x18\x0e\x17\x10\x1f\x19\x12q)%)\x01#o\x87\x15r\bg\xdbT$\x1e\vv\a2\xc5\x19\x8b\x03 \x1e8\xfe)\x012\x1f\xfe\xaf\x01\xd7\xdez948/\xfd{\x19\x97\v8A\x01\xc4B..B/\xfe\xebq?@\x84r\x80<7(g\x1f\x13\x13/\x0e\x02\xb1\xfb\x004LL4\x05\x004LL\x00\x00\x03\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x17\x00?\x00\x00\x01\x12\x17\x14\x06#!\x14\x06\"&'\x0524#\"&54\"\x15\x14\x16\x01\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x17\x06\x16=\xedL4\xfe@\x96ԕ\x01\x01\x00\x10\x10;U g\x043\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\b\x02\xac\xfe\x9c\xc84Lj\x96\x95j\xaf U;\x10\x10Ig\x06@\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\n\x00\x00\x00\x00\x04\x00\x0e\xff\x00\a\xf2\x06\x00\x00\v\x00\x16\x00&\x00N\x00\x00\x044#\"&54\"\x15\x14\x163\t\x01.\x01#\"\x0e\x02\x15\x10\x01\x14\x06#!\x14\x06\"&'7!&\x037\x12\x01\x17\x16\x06\a\x01\x06&/\x01&6?\x01&5>\x0454\x127&5462\x16\x15\x14\a\x1e\x01\x17\x016\x16\x04\x10\x10;U gI\xfd\xf7\x03m*\xb5\x85]\x99Z0\x04\xc0L4\xfe@\x96ԕ\x01\x95\x02\xf5\xa6=o=\x01CT\b\x01\n\xf8\xb0\n\x1b\bT\b\x01\n\xba\x132RX='\xea\xbe\b8P8\b|\xbe5\x01\xa2\n\x1b\xb0 U;\x10\x10Ig\x01\xeb\x02\xf8Xu?bl3\xfe\x80\xfe@4Lj\x96\x95j\x81\xbb\x01\x10a\xfe\x9c\x04\xa8`\n\x1b\t\xf9\xaa\b\x02\n`\n\x1b\b\xa1 \"*\\\x93\xaa\xf2\x8b\x98\x01\x05\x1c\x13\x14(88(\x14\x13\x12\x81]\x01k\b\x02\x00\x00\x00\x00\x05\x00\x00\xff\x80\x05\x80\x05\x80\x00\x0f\x00\x1f\x00/\x007\x00[\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126\x01!'&'!\x06\a\x05\x15\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&=\x01463!7>\x013!2\x16\x1f\x01!2\x16\x02\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x00\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd\xe0\x01\xc00\a\n\xfe\xc3\n\a\x03o\x12\x0e`^B\xfc\xc0B^`\x0e\x12\x12\x0e\x015F\x0fN(\x01@(N\x0fF\x015\x0e\x12\xa0\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x03\xeeu\t\x02\x02\t\x95@\x0e\x12\xfcLSyuS\x03\xb8\x12\x0e@\x0e\x12\xa7%44%\xa7\x12\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00,\x00<\x00H\x00\x00\x01\x15\x14\x0e\x02#\"\x0054\x0032\x1e\x03\x1d\x01\x14+\x01\"=\x014&#\"\x06\x15\x14\x16326=\x0146;\x012\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04~Isy9\xcd\xfe\xed\x01\x10\xcb\"SgR8\x10v\x10\x83H\x8c\xb1\xb7\x8eD\x8c\t\x06w\x06\n\xfc\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\xcem2N+\x16\x01\x16\xcf\xcb\x01\x10\t\x1b)H-m\x10\x10F+1\xb7\x92\x97\xc50*F\a\t\t\x03+f\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0e\x00b\x00\x00\x014&#\"\x0e\x02\x15\x14\x1632>\x01\x05\x14\x0e\x02\a\"\x06#\"'&'\x0e\x01#\"&54\x12632\x16\x17?\x01>\x01;\x012\x17\x16\a\x03\x06\x15\x14\x163>\x045\x10\x00!\"\x0e\x02\x10\x1e\x023276\x16\x1f\x01\x16\a\x06\a\x0e\x01#\"$&\x02\x10\x126$3 \x00\x03\xcck^?zb=ka`\xa0U\x024J{\x8cK\x06\x13\a_/\x1c\x054\x9f^\xa1\xb1\x84\xe2\x85W\x88&\x02\v\x01\t\x05v\x05\b\x05\x02x\x05\x19 \x1c:XB0\xfe\xa4\xfe܂\xed\xabff\xab\xed\x82\xe4\xb1\v\x1a\b)\b\x01\x02\nf\xfb\x85\x9c\xfe\xe4\xcezz\xce\x01\x1c\x9c\x01X\x01\xa8\x02\xf9lz=l\xa6apz\x85\xc7\x11o\xacb3\x02\x015!2BX\xbf\xae\x9d\x01\n\x9bG@\x138\x06\f\v\x05\v\xfd\x9a\x18\x18'\x1a\x01\t'=vN\x01$\x01\\f\xab\xed\xfe\xfc\xed\xabf\x90\t\x02\v1\f\f\r\tSZz\xce\x01\x1c\x018\x01\x1c\xcez\xfeX\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x00(\x00\x00\x00\x16\x10\x0f\x01\x17\x16\x14\x0f\x01\x06\"/\x01\x01\x06+\x01\x05'\x13547\x01'&4?\x0162\x1f\x0176\t\x01'\x01\x15\x06D\xbc^\xe1h\n\n\xd2\n\x1a\ni\xfd\xa5%5\xcb\xff\x00@\x80%\x02[i\n\n\xd2\n\x1a\nh\xdf]\xfc\xc5\x02@\xc0\xfd\xc0\x06\x00\xbc\xfe\xf7]\xdfh\n\x1a\n\xd2\n\ni\xfd\xa5%\x80@\x01\x00\xcb5%\x02[i\n\x1a\n\xd2\n\nh\xe1^\xfa@\x02@\xc0\xfd\xc0\xc0\x00\x02\x00\x00\xff\x00\x06\xfe\x06\x00\x00\x10\x00)\x00\x00\x012\x16\x15\x14\a\x00\a\x06#\"&547\x016\x01\x1e\x01\x1f\x01\x16\x00#\".\x025\x1e\x03327>\x04\x06OFi-\xfe\xb4\x85ay~\xb5\\\x02~;\xfc\xba'\x87S\x01\x04\xfe\xf5\xd7{\xbes:\aD8>\x0f)\x0e\x19AJfh\x06\x00]F?X\xfd\x8b{[\xb9\u007f\x80T\x02C6\xfb\xf6Ll\x16G\xd5\xfe\xf4]\xa2\xccv\x052'\"%B];$\x0f\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00o\x00\u007f\x00\x8f\x00\x9f\x00\x00%\x11!\x112>\x017>\x0132\x1e\x01\x17\x1e\x0232>\x017>\x0232\x16\x17\x1e\x022>\x017>\x0132\x16\x17\x1e\x02\x13\x15\".\x01'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x02#\"&'.\x02#\"\x0e\x01\a\x0e\x01#546;\x01\x11!\x11!\x11!\x11!\x11!\x1132\x16\x01\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\x05\x14\x06#\"&54>\x0452\x16\a\x00\xf9\x00-P&\x1c\x1e+#\x18(\x16\x16\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&PZP&\x1c\x1e+#\"+\x1e\x1c&P-\x18(\x16\x16\x1d$P-.P$\x1d\x16\x16(\x18#+\x1e\x1d$P.-P$\x1e\x15\x17'\x18#+\x1e\x1c&P-.P$\x1d\x1e+#pP@\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00@Pp\xfb\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x02\x00H85K\x13\x1c\"\x1c\x13&Z\x80\xfe\x80\x01\x80\x1c\x1b\x18\x1b\x16\x0e\x10\x13\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1b\x18\x1b\x16\x16\x1b\x18\x1b\x1c\x01@\xc0\x0e\x10\x13\x19\x1a\x1c\x1c\x1a\x19\x13\x10\x0e\x16\x1b\x19\x1a\x1c\x1d\x19\x19\x13\x10\x0e\x16\x1b\x18\x1b\x1c\x1c\x1a\x19\x1b\x16\xc0Pp\x01\xc0\xfe@\x01\xc0\xfe@\x01\xc0\xfe@p\x03\x10MSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94LMSK5\x1d,\x18 \x1f:&\x94\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\v\x00\x00!\x15!\x113\x11\t\x01!\x11\t\x01\b\x00\xf8\x00\x80\x06\x00\x01\x00\xf9\x80\x01\xc0\x02@\x80\x06\x00\xfa\x80\x04\x00\xfc\x80\x02@\x02@\xfd\xc0\x00\x00\x00\x03\x00\x00\xff\x80\x06\xc0\x06\x00\x00\v\x00\x10\x00\x16\x00\x00\t\x01\x06\x04#\"$\x02\x10\x12$3\x13!\x14\x02\a\x13!\x112\x04\x12\x03\x00\x02\"j\xfe\xe5\x9d\xd1\xfe\x9f\xce\xce\x01aѻ\x03\x05xl\xa4\xfd\x00\xd1\x01a\xce\x02\x86\xfd\xdelx\xce\x01a\x01\xa2\x01a\xce\xfd\x00\x9d\xfe\xe5j\x02\xa2\x03\x00\xce\xfe\x9f\x00\x02\x00\x00\xff\x80\b\x00\x05\x80\x00\x05\x00\x1f\x00\x00!\x15!\x113\x11\x01\x11\x14\x06/\x01\x01\x06\"/\x01\x01'\x0162\x1f\x01\x01'&63!2\x16\b\x00\xf8\x00\x80\a\x00'\x10y\xfd\x87\n\x1a\n\xe9\xfe`\xc0\x02I\n\x1a\n\xe9\x01\xd0y\x10\x11\x15\x01\xb3\x0e\x12\x80\x06\x00\xfa\x80\x04\xe0\xfeM\x15\x11\x10y\xfd\x87\n\n\xe9\xfe`\xc0\x02I\n\n\xe9\x01\xd0y\x10'\x12\x00\x00\x01\x00\x00\x00\x00\a\x00\x04W\x00`\x00\x00\x01\x14\x17\x1e\x03\x17\x04\x15\x14\x06#\".\x06'.\x03#\"\x0e\x01\x15\x14\x1632767\x17\x06\a\x17\x06!\"&\x0254>\x0232\x1e\x06\x17\x1632654.\x06'&546\x17\x1e\x01\x17#\x1e\x02\x17\a&'5&#\"\x06\x05\f\n\n\x1e4$%\x01Eӕ;iNL29\x1e1\v ;XxR`\xaef՝\xb1Q8\x1bT\x0f\x1d\x01\x83\xfe\xff\x93\xf5\x88W\x91\xc7iW\x90gW:;*:\x1a`\x89Qs&?RWXJ8\v\x03\xafoNU0\x01\f\x16\x1e\x04\x81\x1a\x1c\x17J1F\x03@\x06#\x1d)\x1b\r\n[\xf1\x92\xc1%6_P\u007fO\x86\x1cQiX(o\xb2`\xa0\xef_?5\x98\"$\x01\x98\x9e\x01\x01\x92iʗ\\&>bd\x86s\x926\xc8aP*< \x1f\x17-;iF\x10\x11n\xa4\x04\x03\x17*\v\x1b-\x05c1\x15\x01\x15B\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00W\x00g\x00\x00\x014'.\x02'4.\x0154632\x17#\x16\x177&'.\x01#\"\x06\x15\x14\x17\x1e\x01\x17\x1e\x03\x1d\x01\x16\x06#\"'.\x05#\"\x0e\x01\x17\x15\x1e\x0232767'\x0e\x01#\"&54632\x16\x17\x1e\a326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x98\xea#$(\t\x04\x021$6\x11\x01\x14\x13]'\n!E3P|\x02\x10ad\x1d(2\x1b\x01S;aF\x179'EO\x80Se\xb6j\x03\x04]\xaem\xba]\x14\v<*rYs\x98\xa4hpt.\b#\x16)$78L*k\x98h\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\xe4\xadB\n\r%\x1c\x02\r\v\x02$/\x0f\x0f$G6\n\x1d\x14sP\a\x10`X\x1d\b\x0f\x1c)\x1a\x05:F\x90/\x95fwH1p\xb8d\x01l\xb6qn\x1b\x18mPH\xaeui\xa8kw\x15_:[9D'\x1b\x8b\x02\xe5\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x0f\x00\x1f\x003\x00\x00\x004.\x02\"\x0e\x02\x14\x1e\x022>\x01$4.\x02#!\x16\x12\x10\x02\a!2>\x01\x12\x10\x0e\x02#!\".\x02\x10>\x023!2\x1e\x01\x04\x80Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x03QQ\x8a\xbdh\xfe~w\x8b\x8bw\x01\x82h\xbd\x8a\xd1f\xab\xed\x82\xfd\x00\x82\xed\xabff\xab\xed\x82\x03\x00\x82\xed\xab\x02\x18н\x8aQQ\x8a\xbdн\x8aQQ\x8a\xbdн\x8aQZ\xfe\xf4\xfe\xcc\xfe\xf4ZQ\x8a\x01\xa7\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x00\x00\x00\x02\x00\x00\x00\x00\b\x00\x05\x00\x00\x13\x00#\x00\x00\x18\x01>\x023!2\x1e\x02\x10\x0e\x02#!\".\x01\x042>\x024.\x02\"\x0e\x02\x14\x1e\x01f\xab\xed\x82\x03\x00\x82\xed\xabff\xab\xed\x82\xfd\x00\x82\xed\xab\x04\xb2н\x8aQQ\x8a\xbdн\x8aQQ\x8a\x01\xfe\x01\x04\xed\xabff\xab\xed\xfe\xfc\xed\xabff\xab\x91Q\x8a\xbdн\x8aQQ\x8a\xbdн\x8a\x00\x00\x05\x00\x00\x00\x00\t\x00\x05\x00\x00\x0e\x00\x12\x00\x18\x00,\x00\\\x00\x00\x01!\"&?\x01&#\"\x06\x10\x16326'3&'\x05\x01!\a\x16\x17\x04\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\x16 \x00\x10\x00 \x005467'\x01\x06+\x01\x0e\x01#\"\x00\x10\x0032\x177#\"&463!\x15!'#\"&463!2\x17\x01632\x02\xfa\xfe\xc6(#\x18\xbcAH\x84\xbc\xbc\x84s\xb0\xa3\xba\x129\x01q\x01 \xfe ci\x15\x05\x05\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\xbc\x01\b\x01<\xfe\xf9\xfe\x8e\xfe\xf9OFA\xfe\x9f\x12!\xc5\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9re\x89\xe0\x1a&&\x1a\x01\x80\x01\xb3U\xde\x1a&&\x1a\x01\x00!\x14\x01\v[e\xb9\x01\x80F \xfb\x1f\xbc\xfe\xf8\xbc\x91\xefU?\x94\x01\x80\x84g\x95\xc4\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\xbc\x01\xf9\xfe\x8e\xfe\xf9\x01\a\xb9a\xad?b\xfe+\x1a\xa4\xdc\x01\a\x01r\x01\a7\xb7&4&\x80\x80&4&\x1c\xfep,\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\a\x00\x0f\x00\x1f\x00+\x00K\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162\x13\x03.\x01#!\"\x06\a\x03\x06\x163!26\x024&#!\"\x06\x14\x163!2\x01\x11#\x15\x14\x06\"&=\x01!\x15\x14\x06\"&=\x01#\x1147\x13>\x01$ \x04\x16\x17\x13\x16\x01\x80KjKKj\x04KKjKKj\x1dH\x05#\x17\xfcj\x17#\x05H\x05&\x1e\x04&\x1e&\xe7\x1c\x14\xfd\x80\x14\x1c\x1c\x14\x02\x80\x14\x01\xac\x80KjK\xfd\x00KjK\x80\x19g\t\xb1\x01\x1b\x01V\x01\x1b\xb1\ti\x17\x01\vjKKjKKjKKjK\x02\f\x01\x80\x17\x1d\x1d\x17\xfe\x80\x1e..\x02n(\x1c\x1c(\x1c\xfd[\xfd\xa5\x805KK5\x80\x805KK5\x80\x02[po\x01\xc6Nv<\x02\x01\x14\x06+\x01\x16\x15\x14\x02\x06\x04#\"\x00'#\"&546;\x01&54\x126$32\x00\x1732\x16\x05\xb72$\xfdB$22$\x02\xbe$\x01\b\x17\xfc*$22$\x03\x8cX\xfeڭ\xb1\xfeӯ\x17\x03\xd6$22$\xfctX\x01'\xad\x84\xf2\xaeh\x01s2$\x83\x11\x83\xdc\xfeϧ\xf6\xfekc\xbd$22$\x84\x11\x83\xdc\x011\xa8\xf5\x01\x95c\xbc$2\x02\xe3F33F3VVT2#$2\x8f\xa8\xaf\xfeԱVT2#$2\x8f\xa8g\xaf\xf1\x01\x84#2UU\xa7\xfe\xcf݃\x01\n\xd92$#2UU\xa7\x011݃\xfe\xf6\xd92\x00\x00\x06\x00\v\xff\x00\x04\xf5\x06\x00\x00\a\x00\x0f\x00\x1b\x00,\x00u\x00\xa3\x00\x00\x01\x03\x17\x1254#\"\x01\x16\x1767.\x02\x01\x14\x13632\x17\x03&#\"\x06\x03\x14\x1e\x0132654'.\x03#\"\x06\x03\x14\x17\x1e\x013276\x114.\x01'&$#\"\a\x06\x15\x14\x1e\x047232\x17\x16\x17\x06\a\x06\a\x0e\x01\x15\x14\x16\x15\a\x06\x15&'\x06#\x16\x15\x14\x06#\"&547\x16\x17\x1632654&#\"\x06\a467&54632\x17\x0254632\x13\x16\x17>\x0532\x16\x15\x14\x03\x1e\x03\x15\x14\x02\x0e\x01#\"'&\x02\x03\xb9ru\xa5&9\xfe\x8c\x1e\x03%\"\f*#\xfe͟\x11 \x0fO%GR\x9f=O&\x0e^\xaa\xfc\x98op\x95\xda\x04\x86\xfe\xb8\x15\x01\xc3C8\xfcpP\b*\x19\x02\a\a\x03\x85b\xfeY\n\x05\x01_\xdc#\xfc\xf5$\xa6\x8c\x1a\x0e\x18N Pb@6\xfe\x9d)?\x91\xa4\xaa\xa9\x01\x02+0L\x1215\v\x05\x1e\"4\x1c\x13\x04\x04\x02\x13\x13$\x1c\x1a\x16\x18.\x88E\x1fs\x1e\f\f\x02\n\xce\x02\a\x0e5I\x9cQ\"!@\fh\x11\f\"\xdeY7e|\x1aJ\x1e>z\x0f\x01\xceiPe\xfd\xbb\x11\x06\x10\u007fn\x91eHbIl\xfeF\x0f>^]@\x96\xfe\xfc\xben*9\x01\r\x00\x00\x00\x00\x04\x00\x00\xff\x80\b\x00\x05\x80\x00\x1a\x006\x00[\x00_\x00\x00\x013\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x0232%3\x0e\x01#\"&54632\x16\x17#.\x01#\"\x06\x15\x14\x1e\x02326%4&'.\x02'&! \a\x0e\x02\a\x0e\x01\x15\x14\x16\x17\x1e\x02\x17\x16\x04! 7>\x027>\x01\x13\x11!\x11\x03\x11\xcf\x0e\xa9\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcb\x05=39?\n\x1a6'_\x02\xd6\xce\x0e\xa8\x82\xa2\xb9\xba\x8c\x94\xa8\r\xcc\x04>29?\n\x1a5'17\x01m\x1f-\x06\x0f\x1c\x02V\xfd\x9d\xfd\x8fU\x05\x19\x11\x06-\x1e\x1e-\x06\x12\x17\x06,\x01\x87\x01\x13\x02bW\x05\x18\x11\x05.\x1e\xc0\xf8\x00\x02\x10\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$\x8b\x9e\xb5\xe8\xc8\xc2뮠@Fyu0HC$L\xb6\xcf\xc8=\b\f\x12\x02??\x04\x0f\r\b<\xc7\xd1\xd0\xc7=\b\x0e\x0e\x05! A\x04\x0e\x0e\t<\xc6\x03\xcb\xfa\x00\x06\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x05`\x05\x80\x00\x1d\x00;\x00\x00\x01\x11\x14\x06+\x01\"&5\x114&#!\x11\x14\x06+\x01\"&5\x11463!2\x1e\x01\x01\x11\x14\x0e\x01#!\"&5\x1146;\x012\x16\x15\x11!265\x1146;\x012\x16\x03\xe0\x12\x0e\xa0\x0e\x12\xa0p\xfe\xf0\x12\x0e\xa0\x0e\x12\x12\x0e\x01Ї\xe4\x85\x01\x80\x85\xe4\x87\xfe0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x10p\xa0\x12\x0e\xa0\x0e\x12\x03\x90\xfe\x10\x0e\x12\x12\x0e\x01\xf0p\xa0\xfb\x80\x0e\x12\x12\x0e\x05@\x0e\x12\x85\xe4\x01I\xfc\x90\x87\xe4\x85\x12\x0e\x03\xc0\x0e\x12\x12\x0e\xfd\x00\xa0p\x03p\x0e\x12\x12\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00S\x00c\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x0554&+\x01\"\a&+\x01\"\x06\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012=\x0146;\x012\x16\x1d\x01\x14;\x012%54&#!\"\x06\x15\x11\x14;\x012=\x01\x16;\x0126\x13\x11\x14\x06#!\"&5\x11463!2\x16\x05\x1f\x1b\x18\xca\x18\x1c\x1c\x18\xca\x18\x1b\xfe\x16A5\x85D\x1c\x1cD\x825A\x157\x16\x1b\x19^\x18\x1c\x156\x16\x1c\x18a\x18\x1b\x167\x15\x02MB5\xfe\xf85B\x167\x15\x1f?\xbf5B~\x88`\xfb\xd0`\x88\x88`\x040`\x88\x02\xb6r\x18\x1c\x1c\x18r\x18\x1c\x1c\xfe\xfa5A44A5\xfa\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16\x16\xe6\x18\x1c\x1c\x18\xe6\x16v\x9a5AA5\xfef\x15\x15\xb4*A\x02\x9d\xfb\xd0`\x88\x88`\x040`\x88\x88\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x02\x00\t\x00\x19\x00\x00\x01!\x1b\x01!\x01!\x01!\t\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x93\xfeړ\xe9\x017\xfe\xbc\xfeH\xfe\xbc\x017\x01\u007f\x02j\xaav\xfc@v\xaa\xaav\x03\xc0v\xaa\x01\xc2\x02'\xfc\x97\x04\x00\xfc\x00\x01:\x02\xa6\xfc@v\xaa\xaav\x03\xc0v\xaa\xaa\x00\x00\x00\x00\x17\x00\x00\xff\x00\b\x00\x06\x00\x00M\x00U\x00a\x00h\x00m\x00r\x00x\x00\u007f\x00\x84\x00\x89\x00\x91\x00\x96\x00\x9c\x00\xa0\x00\xa4\x00\xa7\x00\xaa\x00\xaf\x00\xb8\x00\xbb\x00\xbe\x00\xc1\x00\xcb\x00\x00\x01\x14\x06\a\x03\x16\x15\x14\x06\a\x03\x16\x15\x14\x06#\"'!\x06\"'!\x06#\"&547\x03.\x01547\x03.\x015467\x134&547\x13&54632\x17!62\x17!632\x16\x15\x14\a\x13\x1e\x01\x15\x14\a\x13\x1e\x01\x01!\x01#\x01!62\x01\x16\x15\x14\a\x13\x177\x11'\x06\a\x01!\x17%!\x06\"\x0167'\a#7\x03\x01\x17\x017\x13!\x016\x053\x01!\x11\x17\x16\x03!7\x01\x0f\x0135\a\x16\x11\x14\x16\x15\x14\a\x17\x117\x11\x17\x01/\x01\a\x117'\x06%#\x05\x17\x15\t\x02%'\x11\x05\a3\x01\x17\x13/\x02&=\x01\x03&'\t\x025\x03\x13#\x13\x01\a?\x01\x13&547\v\x01\x176\b\x00\x1a\x14\xcd\x03\x19\x14\xc1\x03!\x18\x19\x10\xfep\x114\x11\xfeq\x11\x1a\x17\"\x04\xc1\x14\x19\x03\xce\x14\x19\x1b\x14\xc7\x01\"\xd1\x04\"\x17\x1a\x12\x01\x8c\x106\x10\x01\x8e\x12\x1a\x17\"\x04\xcf\x17 \a\xbb\x13\x19\xfc'\x01\x85\xfe\xaa\x8f\xfe\xaa\x01h\x12*\xfc[\x01\x02\xd0\x0f\xbc\xbb\r\x10\x02\xa8\xfe|\xbe\x02*\xfe\xe8\x10,\x02\xaf\x01\x04@\x11\x1e\x16\xfc\xfe\xd8?\x01w\x10A\xfeU\x01M\b\xfcp\x05\x01V\xfe\x8b\x04\x0e\x12\x01\x92@\xfe˝\xc1\xa3\xa8\x04\x01\b\xab\x1e\x99\x01)\xdf\xdf\x04Ϳ\x06\x03w\x10\xfd\x93\xd5\xfe\xd7\x017\x01(\xfd{\x88\x01\xe6*U\x01%\xee\x84\x03\x01\x16\b\xd8\x05\b\xfeK\x016\xfc\xc0\xa3\xa3\xa3\xa3\x04=0\x82(\xcf\x02\x03\xab\x81M\x05\x02\x81\x15\x1f\x04\xfe\x9c\t\t\x14\x1f\x04\xfe\xaf\b\b\x17\"\x12\x14\x14\x14!\x18\b\f\x01O\x04\x1f\x14\t\t\x01d\x05\x1f\x14\x15\x1f\x04\x01X\x01\x04\x01$\x0f\x01k\n\b\x18!\x15\x15\x15\x15!\x18\x06\f\xfe\x9a\x01!\x16\r\x0e\xfe\xbc\x04\x1f\xfc\xcd\x01b\xfe\x9e\x10\x03\x1c\x04\t\n\x05\xfe\x98\x06\xc7\x01[\xc2\b\x02\x01\xc0\xc8\xc8\x10\xfbT\x06\x05DOi\x01\n\xfe\xcd@\xfe\x90\x1c\x016\xfe\xa9\x04\x0f\x01b\xfe\xb1\x06\x05\x01xB\x01A\xa6ݽ\xb1\b\x035\x01\x02\x01\x10\r\xb1\x01\r\v\xfeɝ\x01:\xec\xde\b\xfe\xf8J\xc9\x02\f\xe0\xe1+\xfe\xc5\xfe\xc1\x013\x0f\x8d\xfe\xe4\xdd,\x01\x88\xfb\x02p\x05\x01\x15\r\x10\x02\x01x\x01\x04\xfe1\xfe\xb9\x01\xf6\xdf\xfe\xe6\xfc\x89\xfe\xe5\x01\x1b\xe3\xe3F\x01i\n\x04\x01\x0f\x01(\xfd\x9cR\x03\x00\x02\x00\x00\xff\x00\x05\x80\x06\x00\x00\r\x00\x1b\x00\x00\x11463!\x01\x11\x14\x06#!\"&5%'\x114&#!\"\x06\x15\x11\x14\x163\xb7\x83\x02\xe6\x01`\xb7\x83\xfc\xf4\x83\xb7\x04а@.\xfe\x1c.@A-\x03X\x83\xbf\x01f\xfaB\x84\xbe\xbe\x84$\xb4\x01\xa9.BB.\xfe\x14.C\x00\x00\x04\x00\x00\xff\x83\x06\x00\x05}\x00\n\x00\x14\x00\x1e\x00)\x00\x00\x01\x04\x00\x03&54\x12$32\x05\x16\x17\x04\x00\x03&'\x12\x00\x01\x12\x00%\x16\x17\x04\x00\x03&\x05&'\x06\a6\x007\x06\a\x16\x03\xa6\xfe\xc3\xfe\"w\x14\xcd\x01`\xd0R\x01d]G\xfe{\xfd\xc5o]>p\x026\xfe\xa3s\x02\x11\x01c(\x0e\xfe\xdc\xfe@wg\x03\xcf\xc1\xae\x87\x9bm\x01J\xcc\x15PA\x05jy\xfe\x1d\xfe\xc1YW\xd0\x01a͊AZq\xfd\xc1\xfe{HZ\x01\x82\x02:\xfb<\x01d\x02\x14v\\gx\xfe>\xfe\xdb\x0e\x142AT\x17\xcd\x01Kn\x98\x84\xaf\x00\x00\x03\x00\x00\xff\x80\b\x00\x04\xf7\x00\x16\x00+\x00;\x00\x00\x01\x13\"'&#\"\a&#\"\a\x06+\x01\x136!2\x1763 \x012\x16\x17\x03&#\"\a&#\"\a\x03>\x0232\x1767\x03\x06\a&#\"\a\x03>\x0132\x176\x17\ae\x9b\x83~\xc8\xc1└\xe2\xc1Ȁ|\x05\x9b\xe0\x01\x02隚\xe9\x01\x02\xfe\xf1\x81Ν|\xab\xc5\xe0\x96\x96\xe0ū|iy\xb0Zʬ\xac\xf27Ӕ\x98ް\xa0r|\xd1uѥ\xac\xca\x04x\xfb\b9[\x94\x94[9\x04\xf8\u007fjj\xfb\xa69A\x03\xfdN\x8d\x8dN\xfc\x03+,#ll\"\x03\x8b\x04\x97\x9bB\xfcS32fk\x05\x00\x00\x05\x00\x00\xff\xa5\b\x00\x05[\x00\x0f\x00\x1f\x00/\x00?\x00\\\x00\x00%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x114&+\x01\"\x06\x15\x11\x14\x16;\x0126%\x14\x06#!\"&5467&54632\x176$32\x1e\x01\x15\x14\a\x1e\x01\x05\xdc\x1e\x14]\x14\x1e\x1e\x14]\x14\x1e\xfe\xe4\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\xfe\xdc\x1e\x14e\x14\x1e\x1e\x14e\x14\x1e\x05\x88\xec\xa6\xfb$\xa6\xec~i\n\xa1qfN-\x01*\xbd\x95\xfc\x93\x0e\x87\xac\xa5\x02\xdd\x15\x1e\x1e\x15\xfd#\x14\x1e\x1e\x14\x02\x13\x14\x1e\x1e\x14\xfd\xed\x14\x1e\x1e\x14\x01\xad\x14\x1e\x1e\x14\xfeS\x14\x1e\x1e\x14\x01j\x14\x1e\x1e\x14\xfe\x96\x14\x1e\x1e\xa6\xa6\xec\xec\xa6t\xc52\"'q\xa1C\xb7\xea\x93\xfc\x95B8!\xdb\x00\x00\x00'\x00\x00\xff>\x06\x00\x06\x00\x00\x04\x00\t\x00\r\x00\x11\x00\x15\x00\x19\x00\x1d\x00!\x00%\x00)\x00-\x001\x005\x009\x00=\x00A\x00E\x00I\x00M\x00Q\x00U\x00Y\x00]\x00a\x00g\x00k\x00o\x00s\x00w\x00{\x00\u007f\x00\x85\x00\x89\x00\x8d\x00\x91\x00\x95\x00\x99\x00\xa5\x00\xd5\x00\x00\x11!\x11\t\x01%\x11!\x11\t\x015!\x15\x13\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x17\x15#5\x177\x17\a\x177\x17\a\x177\x17\a\x177\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a?\x01\x17\a\x01\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x01\x15#53\x157\x15#5!\x15#5!\x15#5!\x15#5!\x15#5!\x15#5\x175#53\x15\a53\x15\a53\x15\a53\x15\a53\x15\a53\x15%\"&54632\x16\x15\x14\x06\x01\x14\x1e\x026\x16\x15\x14#\"'#\a\x1632>\x0254.\x01\x06&54>\x0132\x16\x1737.\x06#\"\x0e\x02\x06\x00\xfc\xf8\xfd\b\x05\x9c\xfa\xc8\x02\x95\x02\xa3\xfa\xc8Q%%%%%%%%%?\x0fi\x0f\x1f\x0fi\x0f\x1e\x0fi\x0f\x1f\x0fh\x0fOi\x0fixi\x0fiyi\x0fixi\x0fi\xfcAr\x01\x14s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\x01\x14r\xfb\xb8%s\xa2s\x01\x15s\x01\x14r\x01\x14r\x01\x14s\x01\x15s\xf0Ns%%%%%%%%%%\xfd\x88\x81\xb8\xb8\x81\x82\xb7\xb7\xfe\xd9'\x0232\x16\x15\x14\a\x06\x04#\".\x0154\x0032\x1e\x0532654&#\"\x06#\"&54654&#\"\x0e\x02#\"&547>\x0132\x16\x15\x14\a6\x05\x96\x01\x04\x94\xd2ڞU\x9azrhgrx\x98S\x9a\xc3Пd\xd8U\x05 \x1c\b\x0e\x15\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x04\xc0&\x1a\x80&4&\x80\x1a&&\x1a\x80&4&\x80\x1a\xfd\xe6KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x80\x1a&&\x1a\x80&4&\x80\x1a&&\x1a\x80\xfd5jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x80\x05\x00\x00\x17\x00\x1f\x00'\x00S\x00\x00\x004&\"\x0f\x01\x114&\"\x06\x15\x11'&\"\x06\x14\x17\x01\x1627\x01\x00\x14\x06\"&462\x04\x14\x06\"&462\x13\x11\x14\x06\a\x05\x1e\x02\x15\x14\a!2\x16\x14\x06#!\"&54>\x017\x03#\"&463!2\x1e\x04\x17!2\x16\x05\x00&4\x13\x93&4&\x93\x134&\x13\x01\x00\x134\x13\x01\x00\xfd\x93KjKKj\x03\xcbKjKKj\xcb \x19\xfb\xec\x01\a\x05\x18\x03\x98\x1a&&\x1a\xfc\x00\x1a&\x16%\x02\xb1\xcc\x1a&&\x1a\x01\x00\x10\x19\x0f\v\x04\a\x01\x04\xb1\x1a&\x03&4&\x13\x92\x01%\x1a&&\x1a\xfeے\x13&4\x13\xff\x00\x13\x13\x01\x00\xfd\"jKKjKKjKKjK\x03\xc0\xfe\x00\x18%\x03z\a\x1d\x18\n\x100&4&&\x1a\x0e3D\x04\x037&4&\r\x12\x1f\x16%\a&\x00\x00\x00\x00\a\x00\x00\xff\x00\b\x00\x05\x80\x00\x02\x00\x05\x00\t\x00\f\x00\x10\x00\x14\x00&\x00\x00\x13\t\x03!'\x13!\t\x02!%!\x03!\x01!\x01!%\x01\x16\x06\a\x01\x06\"'\x01.\x017\x0163!2\xd4\x02o\xfe\xd4\x01\xe9\x01]\xfdF\x89\xcc\xfe\xfa\xfe\xe0\x03\xfd\x02o\xfe\xbd\xfc\xc2\x02\xaa\xcc\xfe\xee\x02o\x01Z\xfe\xe0\xfe\xfa\x01Y\x01\x80\x0e\x02\x10\xfc@\x12:\x12\xfc@\x10\x02\x0e\x01\x80\x12!\x04\x80!\x03\x00\xfdg\x02\x99\xfc\xfc\x03\x04\x80\x01\x80\xfe\x80\xfc\xe7\x02\x99\x80\x01\x80\xfe\x80\x01\x80f\xfe\x00\x12/\x11\xfc\x00\x14\x14\x04\x00\x11/\x12\x02\x00\x1a\x00\x03\x00\x13\xff\x00\a\xed\x06\x00\x00I\x00\x97\x00\xa0\x00\x00\x0562\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x017\x17762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01762\x1f\x01%\x06\"/\x017\x17762\x1f\x017\x11\x03&6?\x01\x1135!5!\x15!\x153\x11\x17\x1e\x01\a\x03\x11762\x1f\x01762\x1f\x01\a'\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\a\x06\"/\x01\x01\x15%\x055#5!\x15\a\x13\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13\x80ZSS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\xfa-\x134\x13\x80ZSS\x134\x13S@\xd2\x11\x14\x1e\xb1\x80\x01\x00\x01\x00\x01\x00\x80\xb1\x1e\x14\x11\xd2\x13\x134\x13SS\x134\x13\x80ZSS\x126\x12SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13SS\x134\x13S\x01@\x01\x80\x01\x80\x80\xfe\x00\x13\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13Sy\x13\x13\x80ZRR\x13\x13R@\x01%\x01:\x1a=\n:\x01+\x80\x80\x80\x80\xfe\xd5:\n=\x1a\xfe\xc6\xfe\xdb\x12\x13\x13RR\x13\x13\x80ZSS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13SS\x13\x13S\x04\x1a\x80\x80\x80\x80\x80\x80\x00\x00\x00\x04\x00\x00\xff\x80\x05\x80\x06\x00\x00\x03\x00\a\x00C\x00v\x00\x00!\x13/\x01\x01\x13\x0f\x01\x01&'&#\"\a\x06\"'&#\"\a\x06\a\x16\x17\x1e\x01\x17\x1e\t32>\x03;\x012\x1e\x0332>\b7>\x0176\x01\x14\x06#!\"&54>\x037'3&547&547>\x017632\x162632\x17\x1e\x01\x17\x16\x15\x14\a\x16\a3\a\x1e\x03\x02@``\x80\x01\x80\x80\x80`\x01\x00\x02\x02\nVFa\a\x1c\aaFV\n\x02\x02\x02\x02\x02\v\x02\x02\v\x03\f\x05\r\v\x11\x12\x17\r$.\x13\n\r\v\f\v\r\n\x13.$\r\x17\x12\x11\v\r\x05\f\x03\v\x02\x02\v\x02\x02\x01\xa2\x92y\xfc\x96y\x92\t\x1d.Q5Z\xd6\x16\x02\xc2\xd2\x11E$ ,\x1el\x90*%>>%*\x90>*98(QO\xe1!\u007f\xa0\x8f\x00\x03\x00\x00\x00\x00\b\xfd\x05\x00\x00L\x00\\\x00p\x00\x00\x01\x16\x0e\x02'.\x01'&67'\x0e\x01\x15\x14\x06#!#\x0e\x01#\"\x00\x10\x0032\x177&+\x01\"&46;\x012\x1e\x02\x17!3'#\"&7>\x01;\x012\x1f\x0176;\x012\x16\x1d\x01\x14\x06+\x01\x176\x17\x1e\x01\x01267!\"'&7\x13&#\"\x06\x10\x16(\x016\x10&#\"\a\x13\x16\x06\a\x06#\"'\x03\x06\x15\x14\b\xfd\fD\x82\xbbg\xa1\xed\x10\fOOG`n%\x1b\xff\x00E\x17\xfc\xa8\xb9\xfe\xf9\x01\a\xb9LL\x18{\xb5@\x1a&&\x1a\x80N\x86c,\x1d\x02\x00sU\xde\x1e&\x05\x04&\x18\xfd!\x14Fr\x13\x1be\x1a&&\x1a\xb3s\x83\x90\x8f\xca\xf8\xd4s\xb0\x17\xfe\xc6#\x14\x12\x11\x93/,\x84\xbc\xbc\x05\x80\x01\b\xbc\xbc\x84<=\xae\x0f\n\x16\x0f\x15#\x12\xae]\x01\xf4g\xbf\x88L\a\v\xe4\xa0o\xc7GkP\xe4\x82\x1b'\xa4\xdc\x01\a\x01r\x01\a\x1b-n&4&\x1b2\x1d\x16\x80-\x1e\x17\x1e\x1cir\x13&\x1a\x80\x1a&\xac?\x1b\x1a\xd9\xfd\xfb\x91o\x1f \x1f\x01\x15\r\xbc\xfe\xf8\xbc\xbc\x01\b\xbc\x18\xfe\xfc\x174\x0e\v\x1d\x01\x04_\x82\x84\x00\x00\x03\x00\x00\xff\x00\x05\x80\x05\xe0\x005\x00O\x00W\x00\x00!\x14\x0e\x02 .\x0254>\x0276\x16\x17\x16\x06\a\x0e\x04\a\x1e\x042>\x037.\x04'.\x017>\x01\x17\x1e\x03\x01\x11\x14\x06+\x01\x11\x14\x06#!\"&5\x11#\"&5\x11463!2\x16\x02\x14\x06\"&462\x05\x80{\xcd\xf5\xfe\xfa\xf5\xcd{BtxG\x1a,\x04\x05\x1f\x1a:`9(\x0f\x01\x030b\x82\xbfԿ\x82b0\x03\x01\x0f(9`:\x1a\x1f\x05\x04,\x1aGxtB\xfe\x80&\x1a@&\x1a\xff\x00\x1a&@\x1a&K5\x01\x805K`\x83\xba\x83\x83\xba?e=\x1f\x1f=e?1O6#\f\x05\x1f\x1a\x1a,\x04\n\x1b\x18\x17\x10\x04\v\x1f#\x1e\x14\x14\x1e$\x1f\f\x04\x0e\x18\x17\x1b\n\x04,\x1a\x1a\x1f\x05\f#6O\x03O\xfe\x80\x1a&\xfe\x80\x1a&&\x1a\x01\x80&\x1a\x01\x805KK\x01\xa8\xba\x83\x83\xba\x83\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x1b\x00?\x00\x00\x01!\x0e\x01\x0f\x01\x01\x06\"'\x01&'!267\x1b\x01\x1e\x013267\x13\x17\x16\x01\x14\a!'.\x01\a\x06\a\v\x01.\x01\"\x06\a\x03!&54632\x1e\x02\x17>\x0332\x16\x05\x00\x011\x05\n\x04\x03\xfd\x91\x124\x12\xfd\x90\x05\x10\x01q\x16#\x05F\xbe\x06\"\x16\x15\"\x06\x928\x12\x02'g\xfe\x8fo\b#\x13-\v\x81\xc4\x06#,\"\x05t\xfeYg\xfe\xe0>\x81oP$$Po\x81>\xe0\xfe\x02\x00\x06\t\x03\x04\xfd\xa8\x12\x12\x02Z\x02\x12\x1b\x15\x01\x19\xfde\x14\x1a\x1a\x14\x01\xe5p#\x01\xac\x91\x9b\xdd\x11\x14\x02\x05)\xfeR\x02\xae\x14\x1a\x1b\x15\xfe0\x9b\x91\xdc\xf8+I@$$@I+\xf8\x00\x00\x02\x00\x02\xff\x00\x04\x80\x05\xfc\x00+\x003\x00\x00\x01\x14\x00\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x027>\x0276\x04\x12$\x10\x00 \x00\x10\x00 \x04\x80\xfe\xd9\xd9\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\v\x8bᅪ\x01*\xae\xfc\x00\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x03\xc0\xdd\xfe\xb9\x18\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\x86\xe6\x92\x0f\x13\x92\xfe\xea\x12\xfe\x8e\xfe\xf9\x01\a\x01r\x01\a\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00'\x00/\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\x01\x16\x15\x14\x0e\x02\".\x024>\x0232\x17\x01!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12\xfe\x82~[\x9b\xd5\xea՛[[\x9b\xd5u˜\x01~\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\xfe\x81\x9c\xcbu՛[[\x9b\xd5\xea՛[~\x01~\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00=\x00E\x00\x00\x01\x16\x12\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x0054\x127&'&6;\x012\x17\x1e\x012676;\x012\x16\a\x06\x00 \x00\x10\x00 \x00\x10\x03>\x91\xb1\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfeٱ\x91\xa5?\x06\x13\x11E\x15\b,\xc0\xec\xc0,\b\x1d=\x11\x13\x06?\xfd\xa4\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x04\xc4H\xfe\xeb\xa7\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01Gݧ\x01\x15H`\xb1\x10\x1b\x14j\x82\x82j\x14\x1b\x10\xb1\xfb\xdc\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x02\x00\x02\xff\x00\x05\x80\x06\x00\x00B\x00J\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x16\x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x04\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x95\xf3\x82\f\x10\x01 \xcbv\xdcX\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x10\xae\x01\x11\x9b\xcc\x01+\x17\x0eBF\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x06\x80\x06\x00\x00k\x00s\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x15\x14\x00\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015&\x00547'\a\x0e\x01/\x01.\x01?\x01'\x15\x14\x06+\x01\"&5\x11463!2\x16\x1d\x01\x14\x06+\x01\x177>\x01\x1f\x01\x1e\x01\x0f\x01\x176 \x17%#\"&5\x00 \x00\x10\x00 \x00\x10\x05\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe~\xfe\xd9\xd9`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\xd9\xfe\xd9~4e\t\x1a\n0\n\x01\tio\x12\x0e@\x0e\x12&\x1a\x01 \x0e\x12\x12\x0e\x85jV\t\x1a\n0\n\x01\tZ9\x9e\x01\x92\x9e\x00\xff\x86\x0e\x12\xfd\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff\x9e\xc9\xdd\xfe\xb9\x18\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x18\x01G\xddɞ5o\n\x01\b,\b\x1b\nsp\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12k^\n\x01\b,\b\x1b\nc8~~\xfe\x12\x0e\xfb`\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x05\x00\x02\xff\x00\x06\xfe\x05\xfd\x008\x00>\x00K\x00R\x00_\x00\x00\x01\x16\x02\x06\a\x1132\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01!\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x01\x11.\x01\x0276\x0076\x176\x17\x16\x00\x016\x10'\x06\x10\x0327&547&#\"\x00\x10\x00\x01\x11&'\x06\a\x11\x012\x00\x10\x00#\"\a\x16\x15\x14\a\x16\x06\xfe\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\xfe\x00\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\x96\xf3\x81\f\x11\x01'\xcdΫ\xab\xce\xcd\x01'\xfc\x93\x80\x80\x80\xc0sg\x9a\x9ags\xb9\xfe\xf9\x01\a\x02\xf9\x89ww\x89\x02@\xb9\x01\a\xfe\xf9\xb9sg\x9a\x9ag\x03\xef\x9b\xfe\xee\xae\x10\xfe\xfc\x12\x0e@\x0e\x12\xe0\x0e\x12\x12\x0e\xe0\xe0\x0e\x12\x12\x0e\xe0\x12\x0e@\x0e\x12\x01\x04\x10\xae\x01\x12\x9b\xce\x01-\x13\x15ss\x15\x13\xfe\xd3\xfdʃ\x01l\x83\x83\xfe\x94\xfe\xf69\xa5\xe2\xe0\xa79\xfe\xf9\xfe\x8e\xfe\xf9\xfe\x80\x01\x04\x0fOO\x0f\xfe\xfc\x01\x80\x01\a\x01r\x01\a9\xa7\xe0\xe2\xa59\x00\x00\x04\x00\x01\xff\x06\a\x80\x06\x00\x00F\x00P\x00^\x00l\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06$'.\x037>\x0276\x16\x17%#\"&=\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x16\x17\x16\x17%#\"&5\x014'\x0e\x01\x15\x14\x17>\x01%\x14\x16\x17&54\x007.\x01#\"\x00\x012\x0054&'\x16\x15\x14\x00\a\x1e\x01\x06\x00\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16\x1f\xfe\xf2\xb7\xd2\xfe\xa3CuГP\b\t\x8a\xe2\x87v\xdbY\x00\xff\x86\x0e\x12\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfe;\"\xb6\x92\x00\xff\x86\x0e\x12\xfe\x00\x04\xa2\xda\x04\xa2\xda\xfc\x80ޥ\x03\x01\x0e\xcb5݇\xb9\xfe\xf9\x03\xc0\xb9\x01\aޥ\x03\xfe\xf2\xcb5\xdd\x04`\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue036\xfe\xfc\x1a\x1dڿ\x06g\xa3\xdew\x87\xea\x95\x0f\x0eBF\xfe\x12\x0e@\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xffJ_\ts\xfe\x12\x0e\xfe\xa0\x14&\x19\xfa\xa7\x14&\x19\xfa\xa7\xa8\xfc\x17\x1d\x1e\xd2\x01?%x\x92\xfe\xf9\xfc\a\x01\a\xb9\xa8\xfc\x17\x1c\x1f\xd2\xfe\xc1%x\x92\x00\x04\x00\x06\xff\x00\b\x00\x06\x00\x00J\x00P\x00\\\x00h\x00\x00\x01463!2\x16\x15\x11\x14\x06+\x01\"&=\x01\a\x1e\x01\a\x06\x00\a\x06'\x06\a\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06+\x01\"&=\x01#\"&=\x0146;\x015.\x01\x0276\x0076\x17632\x17%#\"&5\x016\x10'\x06\x10\x00\x10\x00327&\x107&#\"\x012\x00\x10\x00#\"\a\x16\x10\a\x16\x06\x80\x12\x0e\x01 \x1a&\x12\x0e@\x0e\x12\xfeL?\x16 \xfe\xf7\xb5ߺu\x8b`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x9b\xf9}\x17\x19\x01\r\xba\u0e92\xaeɞ\x00\xff\x86\x0e\x12\xfd\x00\x80\x80\x80\xfd\x80\x01\a\xb9ue\x9a\x9aeu\xb9\x039\xb9\x01\a\xfe\xf9\xb9ue\x9a\x9ae\x05\xe0\x0e\x12&\x1a\xfe\xe0\x0e\x12\x12\x0e\x86\xff_\ue034\xfe\xfc\x1b\"|N\x0f\x84\x12\x0e@\x0e\x12`\x0e\x12\x12\x0e`\x12\x0e@\x0e\x12\x84\x11\xb9\x01\"\xa2\xbb\x01\x0f\x1d\"|a~\xfe\x12\x0e\xfb\xe7\x83\x01l\x83\x83\xfe\x94\x01o\xfe\x8e\xfe\xf99\xa7\x01\xc0\xa79\xfc\x80\x01\a\x01r\x01\a9\xa7\xfe@\xa79\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00;\x00C\x00\x00\x012\x16\x15\x11\x14\x06+\x01\"&5\x11\a\x17\x16\x14\x0f\x01\x06\"/\x01\a\x16\x15\x14\x0e\x02\".\x024>\x0232\x177'&4?\x0162\x1f\x017!\"&=\x01463\x00 \x00\x10\x00 \x00\x10\x05\xc0\x1a&\x12\x0e@\x0e\x12Ռ\t\t.\t\x1a\n\x8cN~[\x9b\xd5\xea՛[[\x9b\xd5u˜N\xac\t\t.\t\x1a\n\xac\xd5\xfe\xfb\x0e\x12\x12\x0e\xfdg\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x05\x80&\x1a\xfe`\x0e\x12\x12\x0e\x01\x06\u058c\n\x1a\t.\t\t\x8dO\x9c\xcbu՛[[\x9b\xd5\xea՛[~N\xac\n\x1a\t.\t\t\xac\xd5\x12\x0e@\x0e\x12\xfa\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x00\x00\x02\x00\x02\xff\x04\x04\x80\x06\x00\x009\x00A\x00\x00\x01\x16\x00\x15\x14\x02\x04'.\x02'&\x12675#\"&=\x0146;\x015\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14\x0f\x01\x06\"/\x01\x1532\x16\x1d\x01\x14\x06+\x01\x02 \x00\x10\x00 \x00\x10\x02\x80\xd9\x01'\xae\xfe֪\x85\xe1\x8b\v\f\x81\xf3\x96\xa0\x0e\x12\x12\x0e\xa0\\\n\x1a\t.\t\t\xca\x134\x13\xca\t\t.\t\x1a\n\\\xa0\x0e\x12\x12\x0e\xa0\xf9\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03|\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\xa5\\\t\t.\t\x1a\n\xc9\x13\x13\xc9\n\x1a\t.\t\t\\\xa5\x12\x0e@\x0e\x12\xfb\x80\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x04\x00\x00\a\x80\x04~\x009\x00A\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01!\x15\x14\x06+\x01\"&=\x01#\x06\x00#\"$\x027>\x0276\x04\x16\x173546;\x012\x16\x1d\x01!'&4?\x0162\x17\x00 \x00\x10\x00 \x00\x10\am\x13\x13\xfe\xda\t\x1b\t-\n\n\xb9\xfe\xda\x12\x0e@\x0e\x12\x84\x18\xfe\xb9ݧ\xfe\xea\x92\x13\x0f\x92憛\x01\x12\xae\x10\x84\x12\x0e@\x0e\x12\x01&\xb9\n\n-\t\x1b\t\xfb@\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x02m\x134\x13\xfe\xda\n\n-\t\x1b\t\xb9\xe0\x0e\x12\x12\x0e\xe0\xd9\xfeٮ\x01*\xaa\x85\xe1\x8b\v\f\x81\xf3\x96\xe0\x0e\x12\x12\x0e\xe0\xb9\t\x1b\t-\n\n\xfc\xed\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\xff\x00\x04\x80\x06\x00\x00\x17\x00\x1f\x00\x00\x01\x14\x00\a\x11\x14\x06+\x01\"&5\x11&\x0054>\x022\x1e\x02\x00 \x00\x10\x00 \x00\x10\x04\x80\xfe\xd9\xd9\x12\x0e@\x0e\x12\xd9\xfe\xd9[\x9b\xd5\xea՛[\xfd\a\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x03\xc0\xdd\xfe\xb9\x18\xfd\x9c\x0e\x12\x12\x0e\x02d\x18\x01G\xddu՛[[\x9b\xd5\xfd\xcb\x01\a\x01r\x01\a\xfe\xf9\xfe\x8e\x00\x00\x02\x00\x00\x00\x00\x04\x80\x04\x80\x00\a\x00\x17\x00\x00\x00\x10\x00 \x00\x10\x00 \x00\x14\x0e\x02\".\x024>\x022\x1e\x01\x04\x00\xfe\xf9\xfe\x8e\xfe\xf9\x01\a\x01r\x01\x87[\x9b\xd5\xea՛[[\x9b\xd5\xea՛\x01\x87\x01r\x01\a\xfe\xf9\xfe\x8e\xfe\xf9\x025\xea՛[[\x9b\xd5\xea՛[[\x9b\x00\x00\x01\x00\x00\xff\x80\x06\x00\x05\x80\x00$\x00\x00\x012\x16\x15\x11\x14\x06#!\x1137#546375&#\"\x06\x1d\x01#\x153\x11!\"&5\x11463\x05\xab#22#\xfey\xc7\x1e\xe5/Dz?s\x88\xa3\xc8\xc8\xfd!#22#\x05\x802#\xfa\xaa#2\x02S\xe8\x9488\x01\xcf\t\xa0\x92\xab\xe8\xfd\xad2#\x05V#2\x00\x00\x00\x01\x00\x00\xff\x80\x05\x00\x06\x00\x00L\x00\x00\x114>\x0332\x04\x16\x15\x14\x0e\x03#\"&'\x0e\x06\x0f\x01'&546\x127&54632\x16\x15\x14\x06\x15\x14\x1632>\x0454&#\"\x00\x15\x14\x1e\x02\x15\x14\x06#\"'.\x03K\x84\xac\xc6g\x9e\x01\x10\xaa&Rv\xacgD\x86\x1d\n$\v\x1e\x16*2%\x0e\t\x0f+Z\a hP=DXZ@7^?1\x1b\r۰\xc8\xfe\xf4\x19\x1d\x19\x1e\x16\x02\x0f3O+\x16\x03\xabl\xbf\x8eh4\x85\xfe\xa0`\xb8\xaa\x81M@8'\x93+c+RI2\x05\n\x9d\x1f\\\xe5\x01Z\x1eAhS\x92Q>B\xfa>?S2Vhui/\xad\xc1\xfe\xfd\xc7,R0+\t\x1cZ\x03\x0fRkm\x00\x00\x00\x00\x03\x00\x00\xffz\x06\x00\x05\x86\x00+\x00>\x00Q\x00\x00\x002\x16\x17\x16\x15\x14\a\x0e\x01#\"'.\x01'&7567632\x1632\x16\x17\x1e\x01\x15\x14\x06\x15\x14\x17\x16\x17\x16\x17\x1632\x032>\x024.\x02\"\x0e\x02\x15\x14\x17\a7\x16\x12 \x04\x16\x12\x10\x02\x06\x04#\"'\x05\x13&54\x126\x03\xcc\x1a\xa9\x05\x02\x11\x10n/9\x85b\x90LH\x01\x03G\x18\x1c\x06\x18\a\x13\x0f\b\b2E\x05\"D8_\f\n\x0fp\u007f\xe9\xa8dd\xa8\xe9\xfe\xe9\xa8dxO\xf2\x9e\"\x012\x01\x17\xcaxx\xca\xfe\xe9\x99ê\xfe_\x88lx\xca\x022X\t\x05\n!+'5>-\x92pkW\b[C\x16\x03\r\x15\x14\x88\a\x15I\n\a\bI@50\a\xfeOd\xa8\xe9\xfe\xe9\xa8dd\xa8\xe9\u007f˥\xe9Mh\x05fx\xca\xfe\xe9\xfe\xce\xfe\xe9\xcax^\x86\x01\x95\xb2ә\x01\x17\xca\x00\x00\t\x00\x00\x00\x00\a\x00\x05\x80\x00\x03\x00\a\x00\x0f\x00\x13\x00\x1b\x00#\x00'\x00+\x00/\x00\x007!5!\x11!5!\x004&\"\x06\x14\x162\x01!5!\x004&\"\x06\x14\x162\x124&\"\x06\x14\x162\x13\x11!\x11\x01\x11!\x11\x01\x11!\x11\x80\x04\x00\xfc\x00\x04\x00\xfc\x00\x06 8P88P\xfa\x18\x04\x00\xfc\x00\x06 8P88P88P88P\x98\xf9\x00\a\x00\xf9\x00\a\x00\xf9\x00\x80\x80\x01\x80\x80\xfd\x98P88P8\x04 \x80\xfd\x98P88P8\x028P88P8\xfd \xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x02\x00\xfe\x80\x01\x80\x00\x00\x03\x00\x00\xff\x80\b\x00\x05\x80\x00\a\x00+\x00N\x00\x00\x00 &\x106 \x16\x10\x01!2\x16\x1d\x01\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!\x1146;\x012\x16\x15\x01\x14\x163!\x15\x06#!\"&54>\x0532\x17\x1e\x01267632\x17#\"\x06\x15\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02@\x01`\r\x13\x13\r\xfe\xa0\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\xfd L4\x01\x00Dg\xfc\x96y\x92\a\x15 6Fe=\x13\x14O\x97\xb2\x97O\x14\x13\x84U\xdf4L\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfe\x9f\x13\r\xc0\r\x13\xfe\xa0\r\x13\x13\r\x01`\x13\r\xc0\r\x13\x01`\r\x13\x13\r\xfd\xc04L\xee2\x8ay5eud_C(\x11====\x11`L4\x00\x00\x00\x03\x00\x00\xff\x80\a\xf7\x05\x80\x00\a\x003\x00V\x00\x00\x00 &\x106 \x16\x10\x01\x17\x16\x15\x14\x0f\x01\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&54?\x01632\x1f\x017632\x1f\x01\x16\x15\x14\a\x05\a\x06\x15\x14\x1f\x01\x06#!\"&54>\x0532\x17\x16 7632\x17\x0e\x01\x15\x14\x17\x03_\xfe\xc2\xe1\xe1\x01>\xe1\x02\xb5\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xfd\x15\xb5%%S\x15\x17\xfc\x96y\x92\a\x15 6Fe=\x13\x14\x9a\x01J\x9a\x14\x13\x1c\x1d\x1c\x1a%\x02\x80\xe1\x01>\xe1\xe1\xfe\xc2\xfd\xdf\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xf9\t\x0e\r\t\x88\t\t\xf9\xf9\t\t\x88\t\r\x0e\t\xf9\xb5%65%S\x03\x8ay5eud_C(\x11zz\x11\x06\x1b.!6%\x00\x03\x00\x00\x00\x00\b\x00\x05\x00\x00\x12\x00\x1a\x00$\x00\x00\x01!2\x16\x15\x11!\x11!\x11!\x1146;\x012\x16\x15\x004&\"\x06\x14\x162!54&#!\"\x06\x15\x11\x01\x00\x06\xc0\x1a&\xff\x00\xfa\x00\xff\x00&\x1a\x80\x1a&\x02@\x96Ԗ\x96\xd4\x05V\xe1\x9f\xfd@\x1a&\x02\x00&\x1a\xfe@\x01\x00\xff\x00\x04\xc0\x1a&&\x1a\xfe\x16Ԗ\x96Ԗ@\x9f\xe1&\x1a\xfe\x80\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00\x16\x00\x19\x00\x00\x01\x033\x15!\a!\x15!\t\x01!5!'!53\x03!\x01!\t\x01\x13#\x06\x00\xc0\xc0\xfe\xee7\x01I\xfee\xfe\x9b\xfe\x9b\xfee\x01I7\xfe\xee\xc0\xc0\x01\x00\x01C\x01z\x01C\xfe\x00l\xd8\x06\x00\xfe@\xc0\x80\xc0\xfc\xc0\x03@\xc0\x80\xc0\x01\xc0\xfd\x00\x03\x00\xfb@\x01\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x12264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xf0\xa0pp\xa0p\x03\x00\xfb\x80\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xc0p\xa0pp\xa0\x01\xd0\x02\x00\xfe\x00\x00\x00\x00\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00\x17\x00\x1f\x00#\x00+\x00/\x00\x00\x012\x04\x15\x11\x14\x06\a\x17\x16\x06#!\"&?\x01.\x015\x114$3\x02264&\"\x06\x14\x01\x11!\x11\x00264&\"\x06\x14\x01\x11!\x11\x04@\xb9\x01\a\xfb\xb4\xd5\x10\x10\x16\xfb\xe0\x16\x10\x10մ\xfb\x01\a\xb9\xe2\x84^^\x84^\x02@\xfd\xe0\x03\xfe\x84^^\x84^\x01@\xfd\xc0\x06\x00\xbb\x85\xfc\x80\x82\xb8\x05\xca\x0f((\x0f\xca\x05\xb8\x82\x03\x80\x85\xbb\xfa\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\xfd\xe0^\x84^^\x84\x01\xc2\x02\x00\xfe\x00\x00\x00\x00\x00\x04\x00\x00\xff\x8a\a\x00\x05v\x00\x12\x00\x15\x00\x1c\x00(\x00\x00\x01\x11\x14\x06#\"'%.\x015\x114632\x17\x01\x16\x17\t\x02\x11\x14\x06\"'%\x01\x14\x00\a\t\x01632\x17\x01\x16\x02U\x19\x18\x11\x10\xfe/\x15\x1d\x14\x13\x0e\x1e\x01\xff\x03@\x02\x16\xfd\xea\x04k\x1c0\x17\xfeG\x02\x19\xfd\xff,\xfez\x01D\x11#\x0e\f\x02\x1d\x04\x04[\xfbk\x19#\b\xe9\n/\x17\x04t\x14\x1c\x0f\xff\x00\x03g\xfc\x9e\x01\n\x02F\xfb\xe2\x19\x1f\r\xdc\x03\xe5\x03\xfc\xbfG\x02z\x02\x0f\x1c\x06\xfe\xf2\x02\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x0f\x00\x00\t\x01#\x03\x06\a'\x03#\x01\x113\x01\x11!\x11\x03)\x01\np\x9d\x18\x14*\x9bx\x01\ae\x02\xd7\xfa\x00\x02\x14\x01\xf3\xfe\xc80,\\\x018\xfe\x13\xfe\xbc\x04\xaa\xfa\x00\x06\x00\x00\x00\x18\x00T\xff\x06\b\xa4\x05\xff\x00\v\x00\x17\x00#\x00/\x00D\x00M\x00\xfc\x01\x06\x01\x12\x01\x1b\x01%\x012\x01<\x01G\x01Q\x01^\x01l\x01w\x01\xb3\x01\xc2\x01\xd9\x01\xe9\x01\xfe\x02\r\x00\x00\x05\x0e\x01\a\x06&'&676\x16\x05\x1e\x01\x17\x16676&'&\x067\x1e\x01\x17\x16654&'&\x06\x05\x0e\x01\a\x06&54676\x16\x013\"\a\x1e\x01\x15\x14\x06#\"'\x06\x15\x14\x163264&7.\x01\a>\x02\x1e\x01\x01\x16\a\x16\x15\x16\x0e\x01\a\x06&'\x04%\x0e\x01'.\x01767&76\x1767&76\x1767476\x176\x17\x16\x175\"'.\x01'&767>\x02\x16\x173\x16\x17\x16\x17>\x017&'&'47.\x01'.\x017676\x16\x17\x14\x1e\x03\x17\x16767&\a76767.\x04'$\x01\x16\x17\x1673>\x03?\x01>\x01\x17\x16\x17\x16\x06\a\x0e\x01\a\x15\x06\a\x06\a\x1e\x01\x1767673>\x01\x1e\x01\x17\x16\x17\x16\a\x0e\x01\a\x06#\x14\a676\x176\x17\x16\x15\x16\x176\x17\x16\a\x16\x176\x01\x14\a\x16\x176&'&\x06\a\x1e\x01\a6767.\x01'\x06\a\"'\x16\x17276&\x0567&54&\a\x0e\x01\x17\x16\x17&671&'\x0e\x01\a\x16\x1767\x06\x0f\x015\x06\x17\x16\x05\x1e\x01\x17\x1e\x017>\x017&\x00\"\x06\x15\x14\x162654\x03&\a5\x06\x16\x17\x1e\x017>\x01&\x05>\x01&'5\x06#\x0e\x01\x16\x17\x1e\x01%\x06\x16\x17\x1667>\x017\x06\a\x16\a\x16\x04\x176$7&74>\x01=\x01\x15.\x01'\x06\a\x06'&'&'\x0e\b#\x06'\x0e\x03\a\x06#\x06'\x06'&'&'&'\x06\a\x16\x0365.\x01'&\x0e\x01\x17\x1e\x01\x17\x1667\x16\x1767.\x01'\x06\a\x14\x06\x15\x16\a\x06\a\x06\a#\x06\x17\x16\x17\x04%&'\x06\a\x06'&'\x06\a#\x152%6767\a65&'&'&7&5&'\x06\a\x16\x056.\x01\a\x0e\x01\a\x14\x17\x1e\x017>\x01\x01\xde\b&\x12\x195\x02\x01R\x1b\x17\x16\x054\a&\x13\x195\x01\x02S\x1b\x16\x169\rW\"-J\x870(/\xfar\rV\"-J\x870(.\x02\xc9\x01)#\x1b\"6&4\x1c\x05pOPpp\xe0c\xf3|\x1bo}vQ\x02\xf2\b\x13\a\x01[\x8060X\x16\xfdQ\xfd\xc4\x17W1V\xbb\x01\x02\x05\x13\b\x06\x19\x0e\x1b\a\t\v\x1c\x1d\x1e\r\x17\x1c#\x1a\x12\x14\v\a5X\v\t\t\x0fN\x02\"&\x1c\x05\r.\x0e\x03\x02\n)\n\x0f\x0f\x17D\x01>q\x1c \x15\b\x10J\x17:\x03\x03\x02\x04\a\x05\x1b102(z/=f\x91\x89\x14*4!>\f\x02S\x015b!\x11%\n\x19\x12\x05\x12\x03\x04\x01\x05\x01\v\x06(\x03\x06\x04\x02!\x1f$p8~5\x10\x17\x1d\x01\x1a\x10\x18\x0e\x03\x0e\x02.\x1c\x04\x12.:5I\r\b\x0f\r\b\x0e\x03~\xfe\xf7T\x8a\n\x13\x03\x0e\x18\x0f\x0e\x0e\x1c\x18\x114~9p# !\x02\n\x02)\x05\f\x01\x05\x01\x05\x03\x12\x05\x12\x18\b&\x11 ?()5F\t\x021\x18\x0f\x04\a\x05\x1c\f\t\x1c\x10\x12\r\t\n\x1c\x1e\x15\b\x03\xaf\x1d\x19 d%{\x1d\x13\x04v*\x85:\r \x0e\x0e@e\x10\x0f\n\x01s|\x03D\x861d \x19\x1d\x12\x04\x13\x1d{\x8b\x1f\x0e:\x85*\x06\x0f\x10dA\x11A|o\x04\x0e\x13\x01Yk\x03'&\x8d\x13\x12\a\b\x14\x83<\x02\x02\x83\xa5tu\xa5\xa5ut\xfe&\x02\x02\x01\x1bv\a\x0e\x01\v\x03HC\xba\x04XX\x13\x01\x03\x14TR\x05\x0f\x02\xc8;w\x19\b\x06\x12\x10\x94\x1d\x02\x82\x17\r\x8d\xc671\u0099\r\x15\x02\x03\x03\x01\x01\x01\x02\a\x01Z*&'\x06\b\r1\x05\b\x06\x05\x03\x02\x02\x01\x01\t\x14\x11\x13\v\x03\x02\x01\x119?\t\b.\r\r\x1d$\x06\x04\x02\xfd\x84\x0e\x10Gv\v\f5k65P\x02\x02<\xdc?8q=4\x88a\x04\t\x01\x06\x02\x12\x13\x17\v\r\vSC\"\xcd\x15\x15\x931#\x16\x03\x03\x15\x1c<\x80\x01/6B&!\x01ML\b\x11\t\x18\x14\x12\x04\x05\x04\b\xbe^;\x8c6k5\f\vwF\x10\x0e1<\x02\x02P\x00\x00\x03\x00\x00\xffC\t\x01\x05\xbd\x00\a\x00\x0f\x00;\x00\x00$\x14\x06\"&462\x04\x14\x06\"&462\x01\x1e\x05\f\x0132\x1e\x04\x0e\x03\a\x06\a>\x05.\x03\a\x06$.\a\x05\xf4`\x88aa\x88\xfdsa\x88``\x88\xfdZ9k\x87\x89\xc3\xcd\x01'\x019؋ӗa-\x03*Gl|M\xb9e\x1d_]`F&\fO\x9a\xfe\xb1\xa8\xfe\xdcܽ\x82sDD!/+\x88``\x88aa\x88``\x88a\x051\x0154&'\"&#!\x11!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\a\x9f\x1f\x17\b\n\x99\x99\n\b\x17\r\x1e\x17\x03\f\x8b\x8b\x03\v\x01\x17\xfbi\xe4LCly5\x88)*\x01H\x02\xcacelzzlec0h\x1c\x1c\u007f\xb7b,,b\xb7\u007fe\x03IVB9@RB\x03\x12\x05\xfe9\x01\xebJ_\x80L4\xf8\x004LL4\b\x004L\x0244%\x05\x02\x8c\x02\x05\xaf2\"\x04\x01\x81\x01\x04\xe0\x014\xfe\xcc:I;p\x0f\x10\x01\x01!q4\a\bb\xbab\b\a3p\f\x0f\x02\x02\x06(P`t`P(\x06\x04\x8e6E\x05\x03\bC.7B\x03\x01\xfe\x02I\x036\xfb\x004LL4\x05\x004LL\x00\x00\x05\x00\x00\xff\x80\t\x00\x05\x80\x00\x05\x00\v\x00\x1a\x00.\x00>\x00\x00\x01\x11\x0e\x01\x14\x16$4&'\x116\x00\x10\x02\x04#\".\x0254\x12$ \x04\x014.\x02#!\"\x04\x02\x15\x14\x12\x043!2>\x02\x01\x11\x14\x06#!\"&5\x11463!2\x16\x03Zj\x84\x84\x02b\x84jj\x01[\x9d\xfe\xf2\x9fwٝ]\x9d\x01\x0e\x01>\x01\x0e\x02\x1co\xb8\xf3\x83\xfeӰ\xfeٯ\xae\x01*\xae\x01-\x81\xf5\xb8o\x01XL4\xf8\x004LL4\b\x004L\x01'\x02\xb5)\xbd꽽\xea\xbd)\xfdJ)\x01\xd1\xfe\xc2\xfe\xf2\x9d]\x9d\xd9w\x9f\x01\x0e\x9d\x9d\xfeL\x8b\xf5\xa6`\xa2\xfeֺ\xab\xfe۪e\xa9\xec\x03\x06\xfb\x004LL4\x05\x004LL\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x1f\x00;\x00\x00\x05\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15#54&#!\"\x06\x15\x11\x14\x16;\x01\x15#\"&5\x11463!2\x16\x06\x80\x13\r\xfb\xc0\r\x13\x13\r\x04@\r\x13\x80^B\xfb\xc0B^^B\x04@B^\xfe\x80\x80\x13\r\xfb\xc0\r\x13\x13\r\xa0\xa0B^^B\x04@B^`\x04@\r\x13\x13\r\xfb\xc0\r\x13\x13\x04M\xfb\xc0B^^B\x04@B^^\x01>\xa0\xa0\r\x13\x13\r\xfb\xc0\r\x13\x80^B\x04@B^^\x00\x00\x06\x00\x00\xff\x00\b\x80\x06\x00\x00\x02\x00\x05\x005\x00=\x00U\x00m\x00\x00\t\x01!\t\x01!\x01\x0e\x01\a\x11!2\x16\x1d\x01\x14\x06#!\"&=\x01463!\x11.\x01'!\"&=\x01463!>\x012\x16\x17!2\x16\x1d\x01\x14\x06#\x04264&\"\x06\x14\x01\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x05\x14\x0e\x02\".\x0254>\x03762\x17\x1e\x04\x06\xc0\xfe\x80\x03\x00\xf9\x80\xfe\x80\x03\x00\x01\xb5\x0e?(\x02`\x0e\x12\x12\x0e\xfa\xc0\x0e\x12\x12\x0e\x02`(?\x0e\xfe\x15\x0e\x12\x12\x0e\x01\xeb\x15b|b\x15\x01\xeb\x0e\x12\x12\x0e\xfd?B//B/\x04\x90]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\xfb\x00]\x8e\x93\x84\x93\x8e]Frdh\x04\x12L\x12\x04hdrF\x04@\xfd@\x02\xc0\xfd@\x03\x80(?\x0e\xfa\xf5\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x05\v\x0e?(\x12\x0e@\x0e\x129GG9\x12\x0e@\x0e\x12\x10/B//B\xfcaItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\vItB!!BtI\v\x8cѶ\xba\a!!\a\xba\xb6ь\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00M\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x0e\x03\x15!4.\x02'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13M\x90sF\x04\x00Fs\x90M\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00?\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x114.\x02'#\x0e\x03\x15\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00\t\x03\xee\tDq\x8cL\xe6L\x8cqD\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12B>=\xfaC\x82\xef\xb1\u007f\x1f\x1f\u007f\xb1\xef\x82\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x003\x00;\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06+\x01!\x14\x17!6\x03.\x01'#\x0e\x01\a\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xe0\xfc\x00U\x03VU96\xb7g\xe6g\xb76\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12β\xb2\xfc\x0e\x8d\xc9**ɍ\x00\x00\x02\x00\x00\xff\x00\x06\x00\x06\x00\x00-\x00G\x00\x00\x01\x10\x02\a\x16\x12\x1132\x16\x1d\x01\x14\x06#!\"&=\x0146;\x01\x10\x127&\x02\x11#\"&=\x01463!2\x16\x1d\x01\x14\x06#\x01>\x035!\x14\x1e\x02\x17\x1e\x01\x14\x06\a\x06\a!&'.\x0146\x05\x80ՠ\xa0\xd5`\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e`ՠ\xa0\xd5`\x0e\x12\x12\x0e\x05\xc0\x0e\x12\x12\x0e\xfd\x8aM\x90sF\xfc\x00Fs\x90M\x13\x17\x17\x13\x89k\x02\xbck\x89\x13\x17\x17\x05\x80\xfe\xfb\xfeojj\xfeo\xfe\xfb\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x01\x05\x01\x91jj\x01\x91\x01\x05\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\xfd<\x1d\u007f\xb2\xf2\x84\x84\xf2\xb2\u007f\x1d\a!(!\a3\x91\x913\a!(!\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x0f\x009\x00I\x00\x00\x052\x16\x1d\x01\x14\x06#!\"&=\x014637>\b7.\b'!\x0e\b\a\x1e\b\x17\x132\x16\x1d\x01\x14\x06#!\"&=\x01463\x05\xe0\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0eb\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03\x04\xfc\x03\x1a\":1P4Y,++,Y4P1:\"\x1a\x03b\x0e\x12\x12\x0e\xfa@\x0e\x12\x12\x0e@\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12@7hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh77hVX@K-A\x1e\x1c\x1c\x1eA-K@XVh7\x06\x00\x12\x0e\x80\x0e\x12\x12\x0e\x80\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x00\x00A\x00j\x00\x00\x01\"\x06\x1d\x01#54&#\"\x06\x15\x11'54&#\"\x06\x1d\x01\x14\x17\x01\x16\x15\x14\x163!26=\x0147\x136=\x014&#\"\x06\x1d\x01#54&'&#\"\x06\x1d\x01#54&'&'2\x17632\x16\x17632\x16\x1d\x01\x14\a\x03\x06\x15\x14\x06#!\"&5\x01&=\x014632\x17>\x0132\x176\x03\x005K @0.B @0.B#\x016'&\x1a\x02\x80\x1a&\nl\n@0.B 2'\x0e\t.B A2\x05\bTA9B;h\"\x1b d\x8c\rm\x06pP\xfd\x80Tl\xfe\xccL\x8dc\v\x05\x06\x8b_4.H\x04\x80K5\x80]0CB.\xfeS\x1e\xac0CB.\xe0/#\xfe\xd8'?\x1a&&\x1a\x19)$\x01\xb4$)\xf60CB. }(A\b\x02B.\x80z3M\x05\x01\x802\"61\a\x8fd\xf639\xfeL\x18/PpuT\x01(If\xe0c\x8d\x01_\x82\x15E\x00\x00\x00\x00\x02\x00\x00\xff\x00\x06`\x06\x00\x001\x00X\x00\x00\x00\"\x06\x15\x11#\x114&\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x1365\x114&\"\x06\x15\x11#\x114&\"\x06\x15\x11#\x114&2\x16\x17632\x16\x1d\x016\x16\x15\x11\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x114632\x176\x03\x9e\\B B\\B\x9a&@5K\x1a\x01\x80&@\x02\xb0\"6\aL\x05B\\B B\\B \xb4\x88s\x1f\x13\x17c\x8di\x97\bL\x0e}Q\xfdP\x01\x03%&#\"\x06\x15\x14\x16\x17\x05\x15!\"\x06\x14\x163!754?\x01\x0327%>\x015\x114&#!\a\x06\x15\x11\x14\x1626=\x013\x15\x14\a\x1e\x01\x15\x14\x06\a\x05\x041\xb1\xa3?\x17>I\x05\xfe\xfbj\x96\x96jq,J[\x96j.-\x02t\x01\x91j\x96lV\xfe\xad\\\x8f\x9b\xa3\x1e$B.\x1a\x14\x01R1?\x01@B.\x1a\x14\xfe\xde\x1c\x12+\x10\x10?2\x14\x12\x01`\x1e$\xe8\xfdv\x18\x165K-%\x02\x0e\xfd\x805KK5\x02\x17\xe9.olRI\x01S+6K5\xfë$B\\B 94E.&\xfeʀ\x8d15\x05\x1euE&\n\x96Ԗ\x11\x1c\x83Pj\x96\x11\xef\x96j\xfddX\x8b\x15U\x17\x02\xc7GJ\x0e7!.B\n\x9a\nP2\xff\x00.B\n\x84\r\b\x1a\x15%\x162@\t\xa0\x0e7\x03\x11\xf8\bK5(B\x0e\xc8@KjKj\xc6?+f\xfc\x00\x13U\vE,\x02\x9c5K~!1\xfe\xd8.>F.\xd0\xd0F,\bQ5*H\x11\x8d\x00\x00\x00\x00\x02\x00\x00\xff\x00\b\x00\x06\x00\x00$\x00b\x00\x00\x012\x16\x17\x01\x16\x15\x11\x14\x06#!\"&=\x01%!\"&=\x01463!7!\"&'&=\x01463\x01\x114'\x01&#!\"\x06\x15\x14\x1e\x01\x17>\x013!\x15!\"\x06\x15\x14\x17\x1e\x013!32\x16\x15\x14\x0f\x01\x0e\x01#!\"\x06\x1d\x01\x14\x163!2\x17\x05\x1e\x01\x1d\x01\x14\x163!26\x04\u007f=n$\x02\x0132\x16\x17\x1b\x01>\x0132\x16\x17\x1e\x01\x15\x14\a\x03>\x0532\x16\x15\x14\x06\a\x01\x06#\x03\"\x06\a\x03#\x03.\x01#\"\x06\x15\x14\x17\x13#\x03.\x01#\"\x06\x15\x14\x17\x13\x1e\x01\x17\x13\x1e\x013!27\x01654&#\"\a\x0554\x1a\x017654&#\"\x06\a\x03#\x13654&\x01\xcbMy\x13e\r\x05t\a|]\x11\x83WS\x82\x14Sg\x14\x82SY\x85\x0e\\x\a{\n7\x160\"1\x19i\x9692\xfe\x05DU1&=\t\xa4\u007f\x91\t=&0@\x03\x84\x1ac\t>&/B\x03t\a\x04\bd\b4!\x02\xb6*\"\x01\xfb8K4+\"\xfe\xcd@H\x03\x04@/'=\tt\x1a\x96\x03?\xff\x00_K\x01\x9193-\x16\x01\xdd\x1b\x1e]\x88\nUlgQ\xfe\xa4\x01\xacQgsW\n\x8a]\x18#\xfe\x00\a+\x10\x1e\v\v\x94i>p&\xfe\x843\x06\x800&\xfdV\x02Z&0B/\x0f\r\xfd\xdd\x01\x98%3B.\x0e\f\xfe\"\x1ct\x1e\xfeo )\x1a\x01{+C4I\x1a\xe6\xe3\x04\x01\f\x01(\r\x12\v/D0&\xfe\x1e\x02p\x0e\x0e0D\x00\x05\x00\x00\xff\x00\x06\x80\x06\x00\x003\x00[\x00_\x00c\x00g\x00\x00\x01\"\x06\x15\x19\x01'&#\"\x06\x15\x14\x17\x01\x163!267\x136=\x014&\"\x06\x15#54&#\"\x06\x1d\x01#54&#\"\x06\x1d\x01#\x114&'2\x16\x1d\x01632\x17632\x17632\x16\x1d\x01\x14\a\x03\x0e\x01#!\"&'\x01&54632\x17\x1146\x13\x11#\x11!\x11#\x11!\x11#\x11\x02\x805K\x97)B4J\x1a\x01\x80&@\x02\xce\x16#\x05\\\x188P8 @0.B J65K J6k\x95\x16\ncJ/4qG\x1b\x1d^\x82\x1c\\\x10hB\xfd2.\xfe\xd81!~K5\x03y\x17?\xa3\xb1^\\\xfe\xadVl\x96j\x01\x91\x02t-.j\x96[J,qj\x96\x96j\xfe\xfb\x05I7$\x1e\xa3\x9b?1\x01R\x14\x1a.B\x87\x10\x10+\x12\x1c\xfe\xde\x14\x1a.B$\x1e\x01`\x12\x142?\x01g\x16\x18\xfdvEo.\xe9\x02\x175KK5\xfd\x80\x02\x0e%-K\xfa\xeb6+\x01SIR[\xfe\xca&.E49 B\\B$\x88\xfe\xcc5K\x00\x00\x00\x00\x02\x00\x00\x00\x00\a\xb4\x04\x00\x00\x19\x00G\x00\x00\x01\x15\x14\x06#!\x11\x14\x06+\x01\"&5\x11!\"&=\x01463!2\x16\x05\x13\x16\a\x06+\x01\"&'\v\x01\x06+\x01\"'\v\x01\x0e\x01+\x01\"'&5\x13>\x01;\x012\x17\x13\x16\x17>\x017\x136;\x012\x16\x03Y\x13\r\xfe\xd6\x12\r\x87\r\x13\xfe\xd7\r\x13\x12\x0e\x03\x19\r\x13\x04\x0eM\x01\t\n\r\x86\f\x12\x01.\xbd\b\x15x\x14\t\xbc-\x01\x12\f\x87\r\n\tN\x01\x12\f\x8e\x14\t\xdc\n\n\x03\r\x04\xdd\t\x14\x8d\r\x12\x03\xe0u\r\x12\xfc\xd4\r\x13\x12\x0e\x03,\x12\ru\x0e\x12\x13\n\xfc?\r\v\n\x11\f\x02L\xfeW\x13\x13\x01\xab\xfd\xb2\f\x11\n\n\x0e\x03\xc1\f\x11\x13\xfd\xf8\x18\x1b\a#\t\x02\b\x13\x11\x00\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\t\x00*\x00:\x00J\x00\x00\x014'&+\x01\x11326\x17\x13\x16\a\x06+\x01\"'\x03#\x11\x14\x06+\x01\"&5\x11463!2\x17\x1e\x01\x15\x14\x06\a\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\x12UbUI\x06-\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\x01ڎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03AX!\x12\xfe\xe7J\xd9\xfe\x8b\x11\x0e\x10\x11\x01m\xfe\xa2\x0e\x12\x12\x0e\x03\xc0\x0e\x12\x18\x1f\x9cf\\\x93$\n\x036u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\xfeK\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00-\x00[\x00k\x00{\x00\x00\x01276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16!276/\x01&'&\x0f\x01\x0e\x05#\"&54632\x16\x1f\x01\x1676?\x016'.\x04#\"\x06\x15\x14\x16\x02 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00 \x04\x16\x12\x10\x02\x06\x04 $&\x02\x10\x126\x02]\x99h\x0e\v-\x06\x12\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x94\xc4\xc2\x03\f\x99h\x0e\n-\b\x11\x10\v\x04\x04\x0f\x14\x1b\x1e%\x13Lb`J%E\x10\x10\v\x0f\x10\b5\r\x0f\x03\x10,5R-\x93\xc5\xc2'\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5uu\xc5\xfd\xa4\x01l\x01L\xf0\x8e\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01/h\x12\x12R\r\x04\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbfh\x12\x12R\x0e\x03\x02\r\x03\x04\f\x0f\x0e\f\adMLc\x1c\x0e\x0e\v\x01\x02\fN\x14\x13\x04\x10\x1f\x19\x14\xc1\x90\x92\xbf\x041u\xc5\xfe\xf0\xfe\xd4\xfe\xf0\xc5uu\xc5\x01\x10\x01,\x01\x10\xc5\x01\x15\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x00\x00\x02\x00@\xff\xe0\a\xc0\x05 \x00\v\x00\x17\x00\x00\t\x04\x17\a'\t\x017\t\x03'7\x17\t\x01\a\x01\a\x01\x02\xe0\x01\x80\xfe\x80\xfd`\x02\xa0\xa8`H\xfe \x01\xe0\xc1\xfe\xdf\x02\xa0\x02\xa0\xfd`\xa8`H\x01\xe0\xfe \xc1\x01!`\xfe\x80\x02\xe0\xfe\x80\xfe\x80\x02\xa0\x02\xa0\xa8`H\xfe \xfe \xc1\x01\x1f\x02\xa0\xfd`\xfd`\xa8`H\x01\xe0\x01\xe0\xc1\xfe\xe1`\x01\x80\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00\x17\x00'\x00\x00%\t\x01\a\x17\a\t\x01\x177'\t\x057'7\t\x01'\a\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x02\xcd\x01\x0f\xfe\xe9X\xc0`\xfe\xe9\x01\x17(W\u007f\xfe:\x03,\x01\xc6\xfe:\xfe\xf1\x01\x17X\xc0`\x01\x17\xfe\xe9(W\x03L\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xb6\x01\x0f\x01\x17X\xbf`\x01\x17\x01\x17(W\x80\xfe:\xfeB\x01\xc6\x01\xc6\xfe\xf1\xfe\xe9X\xbf`\xfe\xe9\xfe\xe9(X\x01\xf9\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\n\x00\x00\xff\xdc\t\x00\x05$\x00\v\x00\x13\x00\x1c\x00%\x00/\x009\x00E\x00S\x00[\x00\x80\x00\x00\x01\x14\x06#\"&54632\x16$\x14\x06\"&462\x054&\"\x06\x14\x1626$4&#\"\x06\x14\x162%\x14\x06#\"&462\x16$\x14\x06#\"&4632\x00\x10\x00#\"\x0e\x01\x14\x1e\x0132\x01&! \a2\x1e\x02\x154>\x02\x00\x10\x00 \x00\x10\x00 \x13!\x0e\x01\a\x16\x15\x14\x02\x04#\"&'\x06\a.\x01'\x0e\x01#\"$\x02547.\x01'!6$32\x04\x02\x8b7&'77'&7\x04\x827N77N\xfc'q\xa0qq\xa0q\x04\x81qPOrq\xa0\xfcE\xa3st\xa3\xa4\xe6\xa3\x04\x82\xa3ts\xa3\xa3st\xfc\xdf\xfe\xf1\xbf}\xd4||\xd4}\xbf\x03\xab\xfe\xfe\xd2\xfe\xc1\xfeuԙ[W\x95\xce\x02Q\xfe\xf2\xfe\x82\xfe\xf1\x01\x0f\x01~\x04\x01\u007f,>\tn\x9a\xfe\xf8\x9b\x85\xe8P/R\vU P酛\xfe\xf8\x9an\t>,\x01m\x95\x01\x9c\xe2\xe0\x01\x8a\x02\x1b'77'&77\x02N77N6^Orq\xa0qq\x01\xa0qq\xa0q\xc0t\xa3\xa4棣\x01棣\xe6\xa3\xfe(\x01~\x01\x0f|\xd5\xfa\xd5|\x04\von[\x9a\xd4usј^\xfd\a\x01~\x01\x0f\xfe\xf1\xfe\x82\xfe\xf1\x04\x043\u007f3\x97\xba\x9c\xfe\xf8\x99pc8{\x16y%cq\x99\x01\b\x9c\xba\x973\u007f3dqp\x00\x03\x00f\xff\x00\x04\x9a\x06\x00\x00\t\x00\x13\x00L\x00\x00\x00 \x0054\x00 \x00\x15\x14\x00\"\x06\x15\x14\x162654\x01\x1e\x01\x0e\x02\a\x06\a\x17\x01\x16\x14\x0f\x01\x06\"'&'\x01\x06\"/\x01&47\x017&'.\x0367>\x02\x16\x17\x1e\x04326?\x01>\x01\x1e\x01\x03<\xfe\x88\xfe\xf6\x01\n\x01x\x01\n\xfe\x96\xb8\x83\x83\xb8\x83\x01,\r\x04\r(-'s\xc8I\x01\v\x1e\x1e\f\x1fV\x1fC\xc8\xfe\xf5\x1fV\x1e\f\x1f\x1f\x01\vH\xcbr'-(\r\x04\r\n$0@!\x05\x14BHp9[\xa6%&!@0$\x02u\x01\n\xbb\xbc\x01\n\xfe\xf6\xbc\xbb\x01\x9b\x83]\\\x83\x83\\]\xfd\xa7\x1b-$)!\x19I\x15H\xfe\xf5\x1fV\x1e\r\x1e\x1eD\xc8\xfe\xf4\x1e\x1e\r\x1eV\x1f\x01\vH\x15I\x19!)$-\x1b\x14\x1e\x0e\x12\x1a\x04\x0e#\x1a\x163\x19\x19\x1a\x12\x0e\x1e\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x006\x00>\x00N\x00\x00\x00\x14\x06\"&462\x01.\x01\x06\a\x0e\x02\"&/\x01.\x01\x06\a\x06\x16\x17\x16\x17\a\x06\a\x06\x14\x1f\x01\x162?\x01\x16\x17\x162?\x0164/\x0267>\x01\x02\x10& \x06\x10\x16 \x01\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9f]\x84]]\x84\x013\n$;\x1f\n&|\x82v\x1b\x1b\x1f;$\n\x16(CS\x8f3\x8e1\x16\x16\t\x16=\x16\xbfrM\x16=\x16\t\x16\x16\xbf4\x8dTC(G\xbe\xfe\xf4\xbe\xbe\x01\f\x02z\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfe\x84]]\x84]\xfd\xf6\x14\x18\x05\x19\b\x18($\x12\x12\x19\x05\x18\x14-;,5\x0e4\x8e0\x16=\x16\t\x16\x16\xbfsL\x16\x16\t\x16=\x16\xbe4\x0e5,;\x01\x12\x01\f\xbe\xbe\xfe\xf4\xbe\x01\xe8\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x02\x00\x00\xff\x80\x06\xb8\x05\x80\x00\x12\x00(\x00\x00\x012\x16\x15\x11\x14\x02\x06\x04#\"$&\x025\x11463\x0127\x01654&#\"\a\t\x01&#\"\x06\x15\x14\x17\x01\x16\x06\x1dAZ\x88\xe5\xfe\xc1\xaf\xb0\xfe\xc1\xe6\x88\\@\x02\xc1/#\x01\x94%E1/#\xfe\xbd\xfe\xbd#.1E$\x01\x95!\x05\x80[A\xfd\xf9\xb0\xfe\xc0懇\xe6\x01@\xb0\x02\a@\\\xfb\xd8!\x01\x84#21E!\xfe\xca\x016!E13\"\xfe|!\x00\x00\x00\x01\x00\x00\xff\x98\t\x00\x05g\x00L\x00\x00\x05\x01\x06\x00\a\x06&5&\x00'.\x02#4&5!\x15\x0e\x02\x17\x16\x00\x176\x127&\x02'&'5\x05\x15\x0e\x01\x17\x1e\x01\x17676&'6452>\x013\x15\x0e\x01\a\x03\x16\x12\x17\x01.\x02'5\x05\x17\a\x06\a\x00\a\x05\xd6\xfe\xd9\x19\xfe\xf5A\x015R\xfe\xa5V\x15[t,\x01\x02G'Q4\x10\x1a\x01}-\x1f\xda\x16\x13\xd6\x1d&\xa3\x02\x01r!\xd5\r\xe5\a\x01\xb9\x0eG;\x1a\x01\xcc\x01\x01\x8b>\xfd\xf2!g\x02\xb71\xfd\xff\x85\x01\x01\x01\xc1\x03\x14\xca2sV\x05&\b2\x02\x1c:#;\xfc\x90d=\x01\x9b*'\x01\xe45E\x022\x01/\x02..F\xefD֕71\x02\a$\x06\x01\x011\x02>2\xfeF!\xfd\xfe\x11\x03\xf9&1\x0e\x012\x04\x02,\x04\x8d\xfb@K\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x18\x00r\x00\x82\x00\x92\x00\x00\x01\x14\x06#\"&5462\x16\x17\x01\x0e\x04\a\x01>\x04%\x14\a.\x02#\"\x15\x14\x17\x0e\x01\a'&#\"\x06\x1f\x01\x06#\"'>\x0254#\"\x0e\x01\a.\x01'7654&\x0f\x01&547\x1e\x023254&/\x01>\x017\x17\x16326/\x01632\x17\x06\x15\x14327\x1e\x01\x17\a\x06\x15\x14\x16?\x01\x1e\x01\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb5!\x19\x1a&\"2&\x0f\x01^\tu\x86\x8b_\x03\xfe\xa3\ax\x84\x8c^\x02\x8ah\x03\x1c\x19\x04\r;J݃\x10\x01\x0e\x05\x06\x01\x10HJǭ\x01\x18\x13\r\x06\x16\x17\x02q\x9e\x1fE\n\v\x05D\x0em\x02!\x1b\x04\r\x19\x14\x14M\xe0\x84\x0f\x02\r\x05\x06\x01\x0fG?̯'\f\v%o\x99\x1f8\n\v\x049\x0eU\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x01(\x01F\x01(\xd6ߎ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x02\x83\x1a&!\x19\x1a&!S\x02E\bm|\x82[\x06\xfd\xbc\an{\x83[<ɪ\x02\x12\x0f\r\n\"p\x9d C\n\v\x04D\x0fi\x02%\x1e\x04\r\x1d(\x03K\xe1\x84\x0f\x03\f\x05\x06\x01\x0fHCέ\x01\x16\x10\f\x06\x13\f\fp\x9a\x1eC\n\v\x05B\rm8\t\r@Kނ\f\x02\x0e\x05\x06\x01\rH\xe7\x01F\x01(\xd6\u007f\u007f\xd6\xfe\xd8\xfe\xba\xfe\xd8\xd6\u007f\u007f\xd6\x02\x81\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x04\x00\x00\xff\x01\a\x00\x06\x00\x00\v\x00\x16\x00\"\x00*\x00\x00\x016\x17\x16\x17%&\x04\a\x016$\t\x01\x16\x047\x03&$\x025\x10%\x16\x12\x02\x06\a\x06%\x016\x02'$2\x16\x14\x06\"&4\x03}\xf0\xd3\xe8x\xfd\x1a\xa0\xfe\xf43\xfe\xec\x80\x01n\xfd\xdd\x01QH\x01\x16\x9a\xe6\xd4\xfe\xa6\xc7\x06\xc4:\x03dΏ\xe6\xfe\xf4\x01\x95X\ve\xfe8\xfa\xb1\xb1\xfa\xb1\x06\x00\x02z\x86\xee'\t\xa7\x92\x01\xa8\x9f\xad\xfel\xfdi\x8f\x94\x1d\xfe=!\xf9\x01\u007f\xdc\x01\v7\x96\xfe\xbf\xfe\xdd\xfdS\x85\x0e\x02o\x83\x01?v\x06\xb1\xfa\xb1\xb1\xfa\x00\x00\x01\x00\x02\xff\x00\a\x00\x05\xc9\x00M\x00\x00\x01 \x00'&\x02\x1a\x017\x03>\x01\x17>\x017\x0e\x01\x17\x1e\x03\x17\x16\x06\a\x0e\x02\a\x17'\x06\x1e\x027>\x02\x17\x1e\x01\a\x0e\x04'\x0e\x01'\x1e\x01>\x0276.\x01'\x1e\x01\x176\x02'\x04\x00\x13\x16\x02\x0e\x01\x04\x03\x87\xfe\xe5\xfeEl:\x12F\x98g\v\vr\r*\xedt6\x83\a\x19K3U\b\x0f\v\x19\x05\x17Z8\x0f\x8b\x12\x153P)3^I%=9\t\x01\x03\x0e\x16)\x1a<\xa9}J\xb1\xa0\x95k\x1b+\bC-Wd\x1b\x0f\x91\x89\x01\t\x01&\x04\x02U\xa2\xd8\xfe\xe9\xff\x00\x01-\xf8\x83\x01T\x01E\x01+]\xfe\xe7\x0e\x03\x11Qr\x02-\xcf<\b\v\x04\x04\x01\x05Q#\a\x170\n\xbdC+M8\x1b\a\t3'\x02\x04:$\x02\a\x12\r\b\x03_Q\v=+\x1fIf5[ˮ&&SG\xaa\x01ZoM\xfek\xfe\xc5\u007f\xff\x00ܬc\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00#\x007\x00\x00\x01&#\"\x04\a\x0e\x01\a\x15\x1e\x01\x17\x16\x04327\x06\x04#\"'&$&\x0254\x126$;\x01\x16\x04\x01\x14\x02\a\x06#\"'6\x1254\x02'632\x17\x16\x12\x05ե\u009b\xfe\xecfKY\x04\x04YKf\x01\x14\x9b¥y\xfeͩ\x1d\x0e\xaf\xfe\xc4䆎\xf0\x01L\xb6\x03\xa8\x011\x01\xa4\x9a\x88hv\x89v\x9a\xc7ƚw\x87wk\x87\x97\x05\x1cn\x92\u007f]\xfa\x8d*\x8d\xfa]\u007f\x92nlx\x01\b\x94\xee\x01D\xb1\xb6\x01L\xf0\x8e\x01w\xfc\xf8\xc0\xfe\xab~?T8\x01b\xe4\xe3\x01b9SA}\xfe\xac\x00\x00\x00\x04\x00\x00\xff\x10\a\x00\x05\xf0\x00+\x005\x00?\x00F\x00\x00\x01\x14\a!\x14\x163267!\x0e\x01\x04#\"'\x06#\"\x114767\x12%\x06\x03\x12\x00!2\x17$32\x1e\x02\x15\x14\a\x16\x034&#\"\a\x1e\x01\x176\x01\x14\x16327.\x01'\x06\x01!.\x01#\"\x06\a\x00\a\xfb\x81۔c\xad2\x01\xa78\xe5\xfeΨ\xbb\xa9\xe4\xa6\xed-\x11\\\xc7\x01\x14\xb8\xf3?\x01\xb9\x01\x19\x1e\x0f\x00\xff\xb2@hU0KeFjTl\x92y\xcbE3\xf9\xc6aVs\x97z\xb7.b\x01\xf8\x02\xd8\x05؏\x90\xd7\x02W80\x92\xc5]T\x9f\xf4\x85St\x01\as\xa0<\xa9\x01h\xf6O\xfe\xed\x01\x12\x01_\x01u\x1a7bBt\xaa\xb6\x01\xb0SbF/\xa9o\x87\xfb|V]SHކ\xcd\x02J\x8e\xbe\xbe\x00\x00\x00\x00\x02\x00\x00\xff\x80\a\x80\x05\x80\x00\x0f\x003\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x13\x11\x14\x06#!\x15!2\x16\x1d\x01\x14\x06#!\"&=\x01463!5!\"&5\x11463!2\x16\a\x00\x13\r\xf9\xc0\r\x13\x13\r\x06@\r\x13\x80^B\xfd \x01`\x0e\x12\x12\x0e\xfc\xc0\x0e\x12\x12\x0e\x01`\xfd B^^B\x06@B^\x01 \x03\xc0\r\x13\x13\r\xfc@\r\x13\x13\x03\xcd\xfc@B^\x80\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x80^B\x03\xc0B^^\x00\x00\x00\x00\x02\x00\x16\xff\x80\x06\xea\x05\x80\x00\x17\x00>\x00\x00\x133\x06\a\x0e\x03\x1e\x01\x17\x16\x17\x16\x17\x16\x17!\"&5\x1146)\x012\x16\x15\x11\x14\x06+\x016\x03\x05\x0e\x03\a\x06'.\x02'.\x0167>\x0176\x1e\x03\x17%&\x8a\xc5F8$.\x0e\x03\x18\x12\x13\x04\x023\x1e9_\xfe\xf00DD\x04\xe8\x0140DD0\xb2\xd4\x10\xfe+\x02\x14*M7{L *=\"#\x15\n\x12\x14U<-M93#\x11\x01\xd4D\x05\x80@U8v\x85k\x9d_Y\x13\t\xee[\xabhD0\x05\x180DD0\xfa\xe80D\xd2\x01ce-JF1\f\x1aB\x1bD\xbe\xa3\xa3\xc8N&)@\r\f\v\x17/1 d\xaf\x00\x00\x00\x00\x04\x00\x0e\xff\x00\x05y\x06\x00\x00%\x00F\x00\xab\x00\xc5\x00\x00\x05\a\x06\a\x06#\"'&'&'&'&76\x17\x16\x15\x16\x17\x16\x17\x16\x17\x163276?\x016\x17\x16\x17\x16\x01\a\x17\x16\a\x06#\"/\x01\a\x06#\"/\x01&54?\x01'&7632\x1f\x0176\x17\x16\x05\x14\a\x06\a\x0e\x01\"&'&'&5#&76\x17\x16\x173\x11567632\x16\x15\x14\x06#\"'&76\x1f\x01\x1e\x0132654'&#\"\a\x06\x15\x11\x1632>\x0254'&#\"\a\x06\x0f\x01\x0e\x02'.\x015\x11463!2\x14#!\x113>\x017632\x16\x17\x16\x17\x16\x03\x16\x14\x06\a\x06#\"'&'&#\"\a\x06'&767632\x17\x16\x05y\x06q\x92\x9a\xa3\xa5\x98\x94oq>*\f\x0443\x05\x01\x12\x1c2fb\x80\x84\x90\x8f\x85\x80a\x06\n\x0f\f\x15$\xfe\x15B?\x15\x1c\x11\x0f\n\t>B\x05\n\x0f\x10\x02\x12\bBB\x10\x1e\x12\r\x06\aAA\x12\x1e\x1b\x01\xc7.-QP\xd6\xf2\xd6PR+\x0f\x01\t42\n%<\x01\x03ci\x94\x93\xd0ђ:6\x1c\x0f\x10\x1c\x0e\x0e&\vh\x90HGhkG@n\x84`\xb2\x86I\x8d\x8c\xc7Ȍ5\x18\x02\b\n!\x16\x15\x1f\x15\x11\x03m\x1e\x1e\xfc\xd5\x01(|.mzy\xd6PQ-.\x1f\t\v\v\x1a\r\t\aje\x80\x94\x85\x81\x1b\x12\t\x01\x03\r\x82\xa9\xa4\x98\x89\v\x06q>@@?pp\x92gV\x1c\b\b\x1c\x01\x03ZE|fb6887a\x06\n\x04\x03\x13%\x02RB?\x15\x1c\x11\n=B\x05\x10\x02\x0f\x0e\a\nAB\x10\x1d\x12\x05BA\x11\x1e\x1bJvniQP\\\\PRh!\a\x1b\x11\x10\x1ccD\x01S\x02\x88`gΒ\x93\xd0\x10\v23\b\x03\x03\x06\x8fgeFGPHX\xfecCI\x86\xb0_ƍ\x8c\x8c5\"\x02\v\t\n\b\x05\x17\x0f\x02\xa8\x0f\x17n\xfe\x1d*T\x13.\\PQip\x01\xd0\b\x14\x10\r\x1a\a[*81\n/\x19\r\x10\x049@:\x00\x00\x04\x00\x1d\xff\x00\x06\xe1\x06\x00\x00\x1b\x00>\x00t\x00\x82\x00\x00%6\x16\x14\a\x0e\x04#\".\x03'.\x01>\x01\x16\x17\x16\x17\x04%6%\x16\x06\a\x06\a\x06&7>\x01'.\x03\x0e\x02#\x0e\x03*\x02.\x01'&676\x16\x01\x14\x1e\x02\x1f\x01\a.\x01/\x01&'\x0e\x03.\x0254>\x05754'&#\"\x0e\x03\a%4>\x0332\x1e\x03\x15\x01\x14\x17\x167676=\x01\x0e\x03\x06\x0f\x0f\x16\x0f\r>\x81\x99\xdfvw\ued25d\"\b\x04\x06\n\r\x05\xc0l\x01\x85\x01\x9a\xbe\x01\x98\v\x11\x14\"3\x11\x12\t\x15/\x11\x05\x15!\x1a,\x13+\x01\x06\x0e\b\t\x05\x06\x03\x03\x01\x01\x06j2.|\xfe\x84\x1b%&\x0e\r\xe3(N\x13\x13\v\x0e&w\x88\x90\x83h>8X}x\x8cc2\x15\"W\x06\x15<4<\x12\xfe\xda,Z~\xb1fd\xa2aA\x19\xfd`FBIT\x1e\x0e;hmA<\x06\x06\x1d\x13\x107QC1>[u])\t\x0f\t\x05\x01\x04u1\xb0V(\xd2\x10k1S)\x0e\n\x13-\x99\x16\a\t\x03\x02\x02\x02\x04\x01\x01\x01\x01\x01\x02\x02\x100\x06\a\f\x01\xa9\x1fB2*\v\v\xe0%M\x14\x14\v\x16;W(\x060S\x8f[T\x8c]I)\x1c\t\x02\u007fA 5\x02\x16%R7\x1b&\x1a\x80\x1a&T\x01\xa8\x01,\xfe\xd4\xfeX\xfe\xd4\x02\x00\x0e\x12\x12\x0e\x92\xce\x12\x1c\x12\xa9\x01\xc0\x0f\xfdq\x1a&&\x1a\x02\x8f\x041\xfe\xd4\xfeX\xfe\xd4\x01,\x01\xa8L\x12\x1c\x12Β\x0e\x12\x12\x0ew\xa9\x00\x00\x00\x00\x03\x00%\xff\x00\x06\xdb\x06\x00\x00\x1b\x00%\x00;\x00\x00\x01\x16\x14\x0f\x01\x06#!\"&5\x11463!546;\x012\x16\x1d\x01!2\x17\x01!\x11\x14\x06+\x01\"&5\x012\x16\x15\x11\x14\x06#!\"/\x01&4?\x0163!5!\x15\x06\xd1\n\n\x8d\x1c(\xfa\xc0\x1a&&\x1a\x02@&\x1a\x80\x1a&\x02\x00(\x1c\xfc\xbc\x01\x00&\x1a\x80\x1a&\x03@\x1a&&\x1a\xfa\xc0(\x1c\x8d\n\n\x8d\x1c(\x02\x00\x01\x00\x04\xd7\n\x1a\n\x8d\x1c&\x1a\x01\x00\x1a&@\x1a&&\x1a@\x1c\xfb\xdc\xfe\x00\x1a&&\x1a\x03\xc0&\x1a\xff\x00\x1a&\x1c\x8d\n\x1a\n\x8d\x1c\xc0\xc0\x00\x04\x00\x00\xff\x00\b\x00\x05\xfb\x00\x1b\x00\x1f\x00#\x00'\x00\x00\x01\x16\x15\x11\x14\x06\a\x01\x06'%\x05\x06#\"'&5\x11467\x016\x17\x05%6\x05\x11\x05\x11%\x11%\x11\x01\x11\x05\x11\a\xe4\x1c\x16\x12\xfd\x80\x18\x18\xfd\x98\xfd\x98\n\x0e\x13\x11\x1c\x16\x12\x02\x80\x18\x18\x02h\x02h \xfb\x18\x02@\xfb`\x02 \x04\xe0\xfd\xe0\x05\xf5\x14!\xfa\x80\x14 \a\xff\x00\v\v\xf6\xf6\x05\v\x14!\x05\x80\x14 \a\x01\x00\v\v\xf6\xf6\r\x9a\xfb\n\xe6\x04\xf6\r\xfb\n\xd9\x04\xf6\xfa\xfd\x04\xf6\xd9\xfb\n\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x11\x00#\x005\x00\x00\x012\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x16\x15\x11\x14\a\x01\x06#\"&5\x1147\x016!2\x17\x01\x16\x15\x11\x14\x06#\"'\x01&5\x1146\x02\x00\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\x04\xe8\r\x13\x11\xfe \a\b\r\x13\x11\x01\xe0\a\xfb\xa8\b\x06\x02\x00\x12\x13\r\b\x06\xfe\x00\x12\x13\x06\x00\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x13\r\xfa@\x14\b\xff\x00\x04\x13\r\x05\xc0\x14\b\x01\x00\x04\x03\xff\x00\n\x13\xfa@\r\x13\x03\x01\x00\n\x13\x05\xc0\r\x13\x00\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x008\x00\x00\x004&\"\x06\x14\x162$4&\"\x06\x14\x162$4&\"\x06\x14\x162\x00\x10\x02\x04#\"'\x06\x05\x06\a\x06&'&7>\a7.\x0154\x12$ \x04\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\x01\xcb\xf0\xfed\xf4ne\xad\xfe\xfa4\"\f\x14\x03\x04\x18\x05%\x0e!\x0f\x1a\x0e\x0f\x05\x92\xa7\xf0\x01\x9c\x01\xe8\x01\x9c\x02KjKKjKKjKKjKKjKKjK\x01.\xfe\xa4\xfe٫\x12\xad8\n\x03\x01\x0e\v\x0f\x16\x05!\x0e%\x1a00C'Z\xfd\x8f\xae\x01'\xab\xab\x00\x00\x00\x00\x05\x00\x00\xff\x00\a\x00\x05\x00\x00\a\x00\x0f\x00\x17\x00.\x00W\x00\x00\x00\x14\x06\"&462\x04\x14\x06\"&462\x04\x14\x06\"&462\x02 \x04\x06\x15\x14\x16\x1f\x01\a\x06\a6?\x01\x17\x1632$6\x10&\x01\x14\x02\x04#\"'\x06\x05\x06\a#\"&'5&6&>\x027>\x057&\x0254>\x01$ \x04\x1e\x01\x02\x80KjKKj\x01\xcbKjKKj\x01\xcbKjKKj\xe9\xfeh\xfe\x9dя\x82W\x1b\x18.\x98{+9E=\xcc\x01c\xd1\xd1\x01Q\xf0\xfed\xf4FK\xc6\xfe\xfa1A\x05\x0f\x18\x04\x03\x05\x01\n\x02\f\x02\a0\x15)\x18\x1e\v\x9d\xb5\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x02\xb5jKKjKKjKKjKKjKKjK\x01\x80\x8b\xec\x89p\xcbJ2`[Q?l&\x06\b\x8b\xec\x01\x12\xec\xfe\x8b\xae\xfe٫\b\xafC\x0e\b\x15\x11\x01\x04\x10\x04\x0f\x03\x0e\x02\b5\x178.H(Y\x01\x06\x96\x82\xed\xacee\xac\xed\x00\x04\x00\x00\xff\t\x04\x00\x05\xf7\x00\x03\x00\x06\x00\n\x00\r\x00\x00\t\x01\x11\t\x01\x11\x01\x19\x01\x01\x11\t\x01\x11\x02\x00\x02\x00\xfe\x00\xfe\x00\x02\x00\xfe\x00\x02\x00\x02\x00\x01Y\x01'\xfd\xb1\xfe\xd8\x03w\xfd\xb1\x01(\x04\x9e\xfd\xb1\xfe\xd8\x02O\xfe\xd9\x01'\xfd\xb1\x00\x00\x00\x01\x00R\xff\xc0\x06\xad\x05@\x00$\x00\x00\x01\x06\x01\x00#\"\x03&\x03\x02#\"\a'>\x017676\x16\x17\x12\x17\x16327676#\"\a\x12\x05\x16\x06\xad\n\xfe\xbe\xfe\xb3\xe5\x8eb,XHU\x12mM\x18\xa8.\x9cU_t\x17,\x167A3ge\b\rz9@x\x01S\xfb\x03\xfa\xec\xfea\xfeQ\x01\a\xa0\x01B\x01\x06Lb\x15\x97(\x8a\b\t\x81\x8b\xfe\xe1V\xf9\xa1\xa1U\x8b\x1a\x01\x89\v\b\x00\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\n\x00\x00\x11!\x11!\x01\x03\x13!\x13\x03\x01\x06\x00\xfa\x00\x04=\xdd\xdd\xfd\x86\xdd\xdd\x01=\x05\x80\xfa\x00\x01\xa5\x02w\x01)\xfe\xd7\xfd\x89\xfe\xd0\x00\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\x12\x00A\x00U\x00\x00\x11!\x11!\x01\a\x17\a\x177\x177'7'#'#\a\x052\x16\a74.\x02#\"\x06\x1d\x01#\x1532\x15\x11\x14\x06\x0f\x01\x15!5'.\x02>\x015\x1137#\"76=\x014>\x02\x015'.\x01465\x11!\a\x17\x16\x15\x11\x14\x06\x0f\x01\x15\x06\x00\xfa\x00\x03\x8c\fK\x1f\x19kk\x19\x1fK\f_5 5\xfe\x96 \x19\x01\xae#BH1\x85\x84`L\x14\n\rI\x01\xc0\x95\x06\x05\x02\x01\x01\xbf&\xe7\x06\x04\x04\x03\f\x1b\x02v6\a\x05\x02\xfe\xed\x17S\x17\f\x0eF\x05\x80\xfa\x00\x04\xc0!Sr\x1999\x19rS!``\xa3 /\x157K%\x0es}H\x80\b\xfe\x82\x0e\f\x01\aXV\x0e\x01\x01\x04\x04\n\x05\x01\x83\x80\x06\x06\x03P\x1b\x1b\x1d\v\xfc\xc3V\t\x01\x03\x03\f\x06\x02\be\x16\a\x14\xfe\x8e\x0e\t\x02\tV\x00\x00\x04\x00\x00\xffd\a\x00\x06\x00\x00/\x009\x00Q\x00[\x00\x00\x01\x14\x06\a\x16\x15\x14\x02\x04 $\x02547.\x0154632\x176%\x13>\x01\x17\x05>\x0132\x16\x14\x06\"&5%\x03\x04\x17632\x16\x01\x14\x16264&#\"\x06\x0164'&\"\a\x0e\x01\"&'&\"\a\x06\x14\x17\x1e\x022>\x01&2654&#\"\x06\x14\a\x00;2\f\xd5\xfe\x90\xfeP\xfe\x91\xd5\v3>tSU<\xda\x01)t\x03\x18\x0e\x01q\x12H+>XX|W\xfe\xb2h\x01,\xdb:USt\xfa\xa2W|XX>=X\x03*\v\v\n\x1e\v)\xa0\xa0\xa0)\v\x1e\n\v\v+\x97^X^\x97\x16|WX=>X\x02\xb2:_\x19.2\x9b\xfe\xf8\x99\x99\x01\b\x9b//\x19a:Ru?\x98\n\x02\t\r\x10\x03Q%-W|XW>J\xfe(\t\x97=u\xfe\xe7>XX|WX\xfe`\v\x1e\v\n\n*((*\n\n\n\x1f\v+2\t\t2\xf8X>=XW|\x00\x00\x00\x01\x00E\xff\x02\x06\xbb\x06\x00\x000\x00\x00\x133>\x03$32\x04\x17\x16\x1d\x01!\x1e\x03>\x017\x11\x06\f\x01'&\x02'&\x127\x0e\x01\a!6.\x04/\x01\x0e\x03E\x01\x10U\x91\xbe\x01\x01\x94\xe7\x01noh\xfb\x9b\x01i\xa8\xd3\xd7\xc9I\\\xfe\xed\xfe\xa2\x8d\xbd\xf5\x02\x03\xe4\xd30<\x10\x02{\b >ORD\x16\x16\x87\xf9ƚ\x02\xe5~\xe7˕V\xd3ƻ\xff\xbco\xa3R \x1aC3\xfe\x877J\x026I\x01`\xc4\xf2\x01Tb<\x83^M~M8\x1a\x0f\x01\x01\x05O\x82\x97\x00\x00\x00\x04\x00\x00\xff\x80\t\x00\x05\x80\x00\t\x00\r\x00\x11\x00\x1b\x00\x005\x11!\x11\x14\x06#!\"&\x01\x15!5!\x15!5\x012\x16\x1d\x01!5463\t\x00^B\xf8@B^\x02\x80\x01\x80\xfd\x00\x01\x00\x06`B^\xf7\x00^B \x02`\xfd\xa0B^^\x01\"\x80\x80\x80\x80\x04\x80^B\xe0\xe0B^\x00\x00\x00\x03\x00\x00\xff\x00\x06\xbb\x06\x00\x00\x1f\x000\x00;\x00\x00%'\x0e\x01#\".\x0154>\x0232\x16\x177&$#\"\x04\x06\x02\x10\x12\x16\x0432$\t\x01\x06\x00!\"$&\x02\x10\x126$3 \x00\x17\x03#\x15#\x1132\x1e\x01\x0e\x01\x060\xdaJ\xf5\x8d\x93\xf8\x90U\x91\xc7n\x83\xe9L\xd7n\xfe\x9fʡ\xfe\xda\xd4~~\xd4\x01&\xa1\xd5\x01q\xfe@\x02\xb5t\xfeK\xfe\xee\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\xb6\x01\x04\x01\xa5}\x9f'`\x88 -\f\n-\xf6ox\x8a\x90\xf8\x92nǑUyl}\xa9\xc0~\xd4\xfe\xda\xfe\xbe\xfe\xda\xd4~\xd6\x02F\xfe\xa0\xfd\xfeڎ\xf0\x01L\x01l\x01L\xf0\x8e\xfe\xf5\xe9\xfet\xa0\x01`(88(\x00\x04\x00 \xff\x00\x06\xe0\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x00\t\x017!\x01'\x11\x01\x1f\x01\x11\t\x02!\x01\x05\x93\xfd\x9a\\\x03W\xfa\xb5\xb8\x04\x9f\x14\x93\xfd\xec\x01\\\xfe\f\xfc\xa9\x01d\x03;\x01\x82\x97\xfc\xdet\x03Z\xfd\x19`_\xfc\xa6\x01O\x02\u007f\xfc\xde\x02;\x00\x00\x03\x00\x00\xff\x00\x06\x80\x05\xf0\x00\v\x00\x17\x00}\x00\x00\x0154+\x01\"\x1d\x01\x14;\x012%54+\x01\"\x1d\x01\x14;\x012\x05\x11!\x114&\"\x06\x15\x11!\x114;\x012\x1d\x013\x114;\x012\x1d\x01354;\x012\x1d\x01354>\x02\x163\x11&5462\x16\x15\x14\a\x15632\x1632632\x1d\x01\x14\x06#\"&#\"\a\x1526\x1e\x02\x1d\x01354;\x012\x1d\x01354;\x012\x15\x11354;\x012\x02\x80\x10`\x10\x10`\x10\x02\x00\x10`\x10\x10`\x10\x02\x00\xfd\x80p\xa0p\xfd\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x80\x05\f\a\x10\x01 !,! -&\x15M\x10\x11<\a\x10F\x1b\x12I\x13(2\x01\x10\a\f\x05\x80\x10`\x10\x80\x10`\x10\x80\x10`\x10\x02\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xe0\x10\x10\xfd\x10\x01@PppP\xfe\xc0\x02\xf0\x10\x10p\x02p\x10\x10pp\x10\x10pp\x06\a\x03\x01\x01\x01\x87\x0f#\x17 \x17#\x0f\x11\n\x0f\x0f\x10\xd2\x0f\r\x0f\f\x85\x01\x01\x03\a\x06pp\x10\x10pp\x10\x10\xfd\x90p\x10\x00\x01\x00\x00\x00\x00\t\x00\x05\x80\x00j\x00\x00\x01\x16\x14\a\x05\x06#\"'&=\x01!\x16\x17\x1e\x05;\x015463!2\x16\x15\x11\x14\x06#!\"&=\x01#\".\x05'.\x03#!\x0e\x01#\"&4632\x16\x1732>\x027>\x06;\x01>\x0132\x16\x14\x06#\"&'#\"\x0e\x04\a\x06\a!546\x17\b\xf0\x10\x10\xfe\xc0\b\b\t\a\x10\xfc\xa6%.\x10\x11\x1f\x17\x1f \x11`\x12\x0e\x01@\x0e\x12\x12\x0e\xfe\xc0\x0e\x12` :,.\x1c'\x12\x13\x17\x1c,-\x18\xfe\x98\x16\x8aXj\x96\x96jX\x8a\x16h\x18-,\x1c\x17\x13\x12'\x1c.,: k\x15b>PppP>b\x15k\x11 \x1f\x17\x1f\x11\x10.%\x04Z \x10\x02\xdb\b&\b\xc0\x05\x04\n\x12\x80:k%$> $\x10`\x0e\x12\x12\x0e\xfe\xc0\x0e\x12\x12\x0e`\x14\x1b6&L')59I\"Tl\x96ԖlT\"I95)'L&6\x1b\x149Gp\xa0pG9\x10$ >$%k:\x80\x12\x14\v\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x11\x00!\x00\x00\x00\x14\x06+\x01\x1132\x00\x10&#!\x113\x1132\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04~O8\xfd\xfd8\x01\x02\xb7\x83\xfeO\xb4\xfd\x82\x02\x87\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03>pN\x01\r\xfe\xf7\x01\x04\xb8\xfc\x80\x01\r\x01i\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x04\x00\x00\xff\xd9\t\x00\x05'\x00'\x00:\x00M\x00a\x00\x00\x014&'\x06\a\x0e\x01#\"'.\x017654.\x01#\"\x06\a\x16\x17\x16\x14\x06\"'&#\"\x06\x14\x163!267\x14\x06#!\"&54676$32\x00\x17\x1e\x01\x17\x14\a\x06#\"'.\x0176\x10'&>\x01\x16\x17\x16$\x10\a\x06#\"'.\x017654'&676\x16\x17\x06mD5\a\x10\a)\x18\f\f\x1f\x1c\n\x17z\xd2{\x86\xe26lP\x16,@\x17Kij\x96\x96j\x04\x16Oo\x99Ɏ\xfb\xea\xa9\xf0ȕ>\x01>\xc3\xeb\x01[\x17t\x99\xfaa\x17)\x18\x13\x1a\f\x12GG\x12\f4?\x12a\x01\x00\x86\x17)\x17\x13\x1a\r\x12ll\x12\r\x1a\x1a>\x12\x01\xb6;_\x15-/\x18\x1c\x03\n9\x1eGH{\xd1z\x92y\x1cN\x17@,\x16K\x95ԕoN\x8e\xc8繁\xe4\x16\xb8\xe4\xfe\xc3\xe7\x19\xbby\xaf\x90!\r\x11?\x1ah\x01\x02h\x1a>$\r\x1a\x8eD\xfe\x18\xc7\"\r\x12>\x1a\xa4\xc2â\x1a?\x11\x12\f\x1b\x00\x02\x00$\xff\x00\x05\xdc\x06\x00\x00\t\x00n\x00\x00\x05\x14\x06\"&5462\x16'\x0e\x01\x15\x14\x17\x06#\".\x0554>\x032\x1e\x03\x15\x14\a\x1e\x01\x1f\x012654.\x04'&'.\x0354>\x0332\x1e\x03\x15\x14\x0e\x03#\"#*\x01.\x045.\x01/\x01\"\x0e\x01\x15\x14\x1e\x03\x17\x1e\b\x05\xdc~\xb4\u007f\u007f\xb4~\xe9s\x9b!\x92\xe9m\xb8{b6#\f\t\x1c-SjR,\x1b\b\x17\x1cl'(s\x96\x12-6^]I\x1c\x0ft\x8eg))[\x86\xc7zxȁZ&\x1e+6,\x11\x02\x06\x13\x1a4$.\x1c\x14\x0fX%%Dc*\n&D~WL}]I0\"\x13\n\x02\rY\u007f\u007fYZ\u007f\u007f\xbf\x0f\xafvJ@N*CVTR3\x0e\x13/A3$#/;'\x0e\"/\x1b\x1e\x02\x01fR\x1a-,&2-\"\r\a7Zr\x89^N\x90\x83a94Rji3.I+\x1d\n\n\x12&6W6\x10\x13\x01\x01>N%\x18&60;\x1d\x1996@7F6I3\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1f\x00+\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26%\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x02\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\xc0\x12\x0e\xff\x00\x0e\x12\x12\x0e\x01\x00\x0e\x12\x01\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x007\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x16%\"&5\x1146;\x012\x16\x15\x11\x14\x06#!\"&5\x1146;\x012\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92\x01\xee\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00\x1b\x00\x00\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04@\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\xc0\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01`\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x12\x01\xff\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\v\x00\x17\x00'\x00\x00\x00 \x04\x12\x10\x02\x04 $\x02\x10\x12\x00 >\x01\x10.\x01 \x0e\x01\x10\x167\"&5\x11463!2\x16\x15\x11\x14\x06#\x02/\x01\xa2\x01a\xce\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01\x9e\x01(\xfa\x92\x92\xfa\xfe\xd8\xfa\x92\x92n\x0e\x12\x12\x0e\x02@\x0e\x12\x12\x0e\x05\x80\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xfb\xae\x92\xfa\x01(\xfa\x92\x92\xfa\xfe\xd8\xfaN\x12\x0e\x02@\x0e\x12\x12\x0e\xfd\xc0\x0e\x12\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\v\x00%\x00=\x00\x00%\x13\x16\a\x06#!\"'&7\x13\x01\x13!\x13>\x013!\x15\x14\x1626=\x01!\x15\x14\x1626=\x01!2\x16%\x11\x14\x06\"&5\x114&\"\x06\x15\x11\x14\x06\"&5\x1146 \x16\x06\xdd#\x03\x13\x13\x1d\xf9\x80\x1d\x13\x13\x03#\x06]V\xf9TV\x03$\x19\x01\x00KjK\x01\x80KjK\x01\x00\x19$\xfe\x83&4&\x96Ԗ&4&\xe1\x01>\xe1\x80\xfe\xc7\x1c\x16\x15\x15\x16\x1c\x019\x03G\xfc\xf9\x03\a\x18!\x805KK5\x80\x805KK5\x80!\xa1\xff\x00\x1a&&\x1a\x01\x00j\x96\x96j\xff\x00\x1a&&\x1a\x01\x00\x9f\xe1\xe1\x00\x06\x00\x00\xff\x00\b\x00\x06\x00\x00\x15\x00#\x00/\x00;\x00I\x00m\x00\x00\x012\x16\x14\x06+\x01\x03\x0e\x01#!\"&'\x03#\"&463\x01>\x01'\x03.\x01\x0e\x01\x17\x13\x1e\x013%\x114&\"\x06\x15\x11\x14\x1626%\x114&\"\x06\x15\x11\x14\x1626%\x136.\x01\x06\a\x03\x06\x16\x17326\x01\x03#\x13>\x01;\x01463!2\x16\x1532\x16\x17\x13#\x03.\x01+\x01\x14\x06#!\"&5#\"\x06\a\x805KK5\x0fs\bH.\xfb\x00.H\bs\x0f5KK5\x01e\x1a#\x02 \x02)4#\x02 \x02%\x19\x01\xa0&4&&4&\x01\x80&4&&4&\x01` \x02#4)\x02 \x02#\x1a\x05\x19%\xfb~]\x84e\x13\x8cZ\xa7&\x1a\x01\x80\x1a&\xa7Z\x8c\x13e\x84]\vE-\xa7&\x1a\xfe\x80\x1a&\xa7-E\x03\x00KjK\xfdj.<<.\x02\x96KjK\xfc\xe0\x02)\x1a\x01\xa0\x1a#\x04)\x1a\xfe`\x19\"@\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x1a\x01\xa0\x1a&&\x1a\xfe`\x1a&&\x15\x01\xa0\x1a)\x04#\x1a\xfe`\x1a)\x02\"\x04\xda\xfed\x01\xb9Xo\x1a&&\x1aoX\xfeG\x01\x9c,8\x1a&&\x1a8\x00\x02\x00!\xff\x80\x06\xdf\x05\x80\x00\x03\x00O\x00\x00\x01\x13#\x03\x01\a\x06#!\x03!2\x17\x16\x0f\x01\x06#!\x03\x06+\x01\"'&7\x13#\x03\x06+\x01\"'&7\x13!\"'&?\x0163!\x13!\"'&?\x0163!\x136;\x012\x17\x16\a\x033\x136;\x012\x17\x16\a\x03!2\x17\x16\x03\xdf@\xfe@\x03\xfe8\a\x18\xfe\xb9@\x017\x0f\n\n\x048\x05\x1a\xfe\xb9Q\a\x18\xe0\x10\n\t\x03N\xfeQ\a\x18\xe1\x0f\n\t\x03N\xfe\xc9\x0f\n\t\x038\a\x18\x01G@\xfe\xc9\x0f\n\n\x048\x05\x1a\x01GQ\a\x19\xe0\x0f\n\t\x03N\xfeQ\a\x19\xe0\x0f\n\t\x03N\x017\x0f\n\t\x02\x00\x01\x00\xff\x00\x01\xf8\xe0\x18\xff\x00\f\x0e\x0e\xe0\x18\xfe\xb8\x18\f\f\x10\x018\xfe\xb8\x18\f\f\x10\x018\f\f\x10\xe0\x18\x01\x00\f\x0e\x0e\xe0\x18\x01H\x18\f\f\x10\xfe\xc8\x01H\x18\f\f\x10\xfe\xc8\f\f\x00\x00\x00\x00\x04\x00k\xff\x00\x05\x95\x06\x00\x00\x02\x00\x05\x00\x11\x00%\x00\x00\x01\x17\a\x11\x17\a\x03\t\x03\x11\x03\a\t\x01\x17\x01\x00\x10\x02\x0e\x02\".\x02\x02\x10\x12>\x022\x1e\x02\x03I\x94\x95\x95\x94\x83\x01\xd0\xfe\xce\x012\xfe0\xff]\x01@\xfe\xc0]\x00\xff\x02\xcf@o\xaa\xc1\xf6\xc1\xaao@@o\xaa\xc1\xf6\xc1\xaao\x01㔕\x03\x8c\x95\x94\xfca\x01\xd0\x012\x012\x01\xd0\xfd\x9d\x00\xff]\xfe\xbf\xfe\xbf]\x00\xff\x01p\xfe^\xfe\xc7\xc9|11|\xc9\x019\x01\xa2\x019\xc9|11|\xc9\x00\x00\x00\x00\x03\x00(\xff\x00\x03\xd8\x06\x00\x00\x02\x00\x05\x00\x11\x00\x00%7'\x117'\x13\t\x01\x11\x01'\t\x017\x01\x11\x01\x02T\xad\xad\xad\xad \x01d\xfd\xe5\xfe\xd7l\x01t\xfe\x8cl\x01)\x02\x1bq\xac\xac\x01n\xac\xac\xfd\xf1\xfe\x9c\xfd\xe4\x02\xc7\xfe\xd8l\x01u\x01ul\xfe\xd8\x02\xc7\xfd\xe4\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\a\x00\x0f\x00\x17\x00)\x001\x00\x00$4&\"\x06\x14\x162\x004&\"\x06\x14\x162\x00\x10\x06 &\x106 \x13\x14\a\x01\x06+\x01\"&547\x016;\x012\x16\x04\x10\x06 &\x106 \x05\x00LhLLh\xfdLLhLLh\x04L\xe1\xfe\xc2\xe1\xe1\x01>\x81\r\xfb\xe0\x13 \xa0\x1a&\r\x04 \x13 \xa0\x1a&\xfd`\xe1\xfe\xc2\xe1\xe1\x01>\xcchLLhL\x03LhLLhL\xfe\x1f\xfe\xc2\xe1\xe1\x01>\xe1\x02\xc0\x14\x12\xfa\x80\x1a&\x1a\x14\x12\x05\x80\x1a&\xbb\xfe\xc2\xe1\xe1\x01>\xe1\x00\x00\x00\x05\x00\x03\xffG\x06\xfd\x05\xb9\x00\x06\x00\n\x00\x10\x00\x17\x00\x1d\x00\x00\x13\t\x01.\x017\x13)\x01\x011\x01\x13!\x1362\x01\x13\x16\x06\a\t\x011!\x1362\x17h\x03\x18\xfc\x9c\x12\x0e\ae\x01\xce\x02\x94\xfe\xb6\xfd\xf0\xc6\xfe2\xc6\b2\x050e\a\x0e\x12\xfc\x9c\x03\x18\xfe2\xc6\b2\b\x03>\xfc\t\x02v\r+\x15\x014\xfc\t\x06[\xfd\x9c\x02d\x17\xfd\x85\xfe\xcc\x15+\r\xfd\x8a\x03\xf7\x02d\x17\x17\x00\x00\x00\x04\x00\x00\xff \a\x00\x05\xe0\x00\x03\x00\x0f\x00\x13\x001\x00\x00\x0135#\x015\x06\a\x06&'\x17\x1e\x0172\x01!5!\x05\x14\a\x16\x15\x14\x04#\"&'\x06\"'\x0e\x01#\"$547&54\x12$ \x04\x12\x01\x80\xa0\xa0\x03Eh\x8b\x87\xf9`\x01X\xf8\x94\x81\xfe(\x02\x80\xfd\x80\x04\x80cY\xfe\xfd\xb8z\xce:\x13L\x13:\xcez\xb8\xfe\xfdYc\xf0\x01\x9d\x01\xe6\x01\x9d\xf0\x02\xc0\xe0\xfd\xd4\\$\x02\x01_K`Pa\x01\x01}\xe0\xc0\xbb\xa5f\u007f\x9d\xdeiX\x01\x01Xiޝ\u007ff\xa5\xbb\xd1\x01a\xce\xce\xfe\x9f\x00\x00\x00\x00\t\x00\x00\xff\x80\x06\x00\x05\x80\x00\x03\x00\a\x00\v\x00\x0f\x00\x13\x00(\x00+\x00.\x00>\x00\x00\x01\x15#5\x13\x15#5\x01\x15!5\x01\x15!5\x01\x15!5\x01\x114&+\x01\x01'\a\x01#\"\x06\x15\x11\x14\x163!26\x017!\x057!\x05\x11\x14\x06#!\"&5\x11463!2\x16\x02\x03\xfc\xfc\xfc\x03\xf2\xfe\xab\x01U\xfd`\x02\xa0\xfd`\x03'\f\b \xfe\x86\xd2\xd2\xfe\x86 \b\f\f\b\x04\xd8\b\f\xfc\xa9\xb9\xfej\x02\x8b\xdd\xfej\x02\xe2V>\xfb(>VV>\x04\xd8>V\x02q\x80\x80\x00\xff\u007f\u007f\xfe\x01\x80\x80\x01\x00\x80\x80\x00\xff\u007f\u007f\xfc\xa4\x04\xd8\b\f\xff\x00\xab\xab\x01\x00\f\b\xfb(\b\f\f\x04^\x96\x96\x96\x14\xfb(>VV>\x04\xd8>VV\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x1f\x00=\x00\x00\x01&'&'&'&\x06\x1f\x01\x1e\x03\x17\x16\x17\x1e\x04\x17\x1676'&'&\x02\x01.\x05\x02' \f\x01\x1e\x03\x0e\x01\a\x06\x15\x01#\x01\x0e\x02.\x02\x03\x80h8\x8b\xd0\"$Y\n''>eX5,\t\x04,Pts\x93K\x99\x01\x0125\x1cM\xcc\xfeRLqS;:.K'\x01\x11\x01\xc1\x015\xe9\x8aR\x1e\x05\x0e\r\r\x01Ch\xfe\xe7\x16\x8bh\xac\x95\xba\x02\xd0\xc4R\xcat\x13\x11(\x10\x1e\x1f+e\x84^T\x11\bT\x8a\xaa\x82u B\x06\x03\"$\x15:\x012\xfe~<\x82\x9d\x98\xdc\xc6\x012\x88Hp\xb1\xa8\xe5\xaa\xe3wTT\x17\xfe\xb9\x01\x1d\x02\x18\x0e\x02 V\x00\x00\x05\x00\x00\xff\x00\a\x00\x06\x00\x00/\x007\x00G\x00W\x00g\x00\x00\x00.\x01\a\x04 %&\x0e\x01\x16\x17\x16\x17\x0e\x02\x0f\x01\x06\x16\x17\x1632?\x01673\x16\x1f\x01\x16327>\x01/\x01.\x02'676$4&\"\x06\x14\x162\x04\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x00 \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02&\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05d\f-\x1a\xfe\xfb\xfe\xe8\xfe\xfb\x1a-\f\x1b\x1a\xc2m\x02\x1b\x1a\x1c\t\n\x16\x19\t\x0e,\x10\b6\x11*\x116\b\x10,\x0e\t\x19\x16\n\t\x1c\x1a\x1b\x02m\xc2\x1a\xfe\xb7KjKKj\x02\x8bo\xbd\xfe\xfb\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbd\xfeK\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xcezz\xce\x01Ȏ\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x03U4\x1b\x06>>\x06\x1b4-\x06.\f\x9e\xdeYG\x15\x190\n\x04)\x14\x8bxx\x8b\x14)\x04\n0\x19\x15GYޞ\f.\x06\xa3jKKjKq\xfe\xe2\xfe\xfb\xbdoo\xbd\x01\x05\x01\x1e\x01\x05\xbdoo\xbd\x01lz\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcezz\xce\x01\x1c\x018\x01\x1c\xce\xfe0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x00\x03\x00D\xff\x00\x05\xbb\x06\x00\x00/\x007\x00H\x00\x00\x00\x16\a\x03\x0e\x01#\"'.\x017\x13\a\x16\x15\x14\a'654&#\"\a'67\x01'\a\x06.\x016?\x01>\x01\x17\x01\x16\x17\x16\x0f\x01%\x02\"&462\x16\x14\x0127\x17\x06#\".\x01547\x17\x06\x15\x14\x16\x05|D\x05,\x04=)\x06\x03,9\x03#\x8f7\x94\x89[͑\x86f\x89x\xa4\x01\b\x95\xb5!X:\x05 \xef\x1aD\x1e\x01\xe8$\f\x11+\xcd\x01s)\x94hh\x94i\xfc\xdajZ\x8b\x92\xbd\x94\xfb\x92t\x8b<\xcd\x02\xf6F/\xfd\xd9*8\x01\x03C,\x01\xad\bq\u007f\u061c\x89e\x86\x91\xce\\\x8ar\x1b\x01,W\xa1\x1e\x05BX\x1d\xd5\x17\a\x12\xfe\xe5\x15/C2\xe8\x14\x01\xa9h\x94hh\x94\xfa\xbe=\x8bt\x92\xfa\x94\xbc\x94\x8bXm\x91\xcd\x00\x00\x00\x04\x00\x00\xff\x80\x06\x00\x05\x80\x00\x0f\x00>\x00N\x00Z\x00\x00\x01\x15\x14\x06+\x01\"&=\x0146;\x012\x16\x01\x14\x0e\x02\a\x0e\x02\x1d\x01\x14\x06+\x01\"&=\x014>\x037>\x0154&#\"\a\x06\a\x06#\"/\x01.\x017632\x16\x02 \x0e\x02\x10\x1e\x02 >\x02\x10.\x01\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03p\x12\x0e\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x01\x00\x1e=+& \x1d\x17\x12\x0e\xa0\x0e\x12\x15\x1b3\x1f\x1d5,W48'\x1d3\t\x10\v\bl\n\x04\az\xe3\x81\xdb\xee\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xabff\xab\x01\x91\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01P\xa0\x0e\x12\x12\x0e\xa0\x0e\x12\x12\x01\xe22P:\x1e\x15\x12\x14\x1c\x0f \x0e\x12\x12\x0eD#;$#\x10\r\x19$\x1f*;\x1b\x14?\f\x06R\a\x1a\n\xc0\xb3\x01Cf\xab\xed\xfe\xfc\xed\xabff\xab\xed\x01\x04\xed\xab\xfe\xb7\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x04\x00'\xff\x03\x05Y\x06\x00\x00\t\x00>\x00O\x00`\x00\x00\x00\"&5462\x16\x15\x14\x01\x14\x06&'\x01.\x01\x0f\x01\x06\x1f\x01\x13\x03\x06\a\x06\a\x06'.\x0176\x1b\x01\a\x17\x16\x0e\x02\x0f\x01\x06.\x035\x03\x13632\x17\x01\x16\x1f\x01\a\x16\x05\x1e\x01\x1f\x01\x16\x17\x16\a\x06.\x01'#&'\x03\x01\x16\x15\x14\a\x06.\x01'&\x01\x166?\x0165\x01\xae\x80\\\\\x80[\x01\x8c(\t\x01\x06\x02|\x03\x93\x1f\x03\t\v\x14\x06r\xfe\xcb\x03\b\x03\x03\v\x04\xc9[A@[[@A\xfd#2#\x16\x17\x01\xb6\f\a\x02\x03\b\r\x8b\xfe\x9e\xfe7\xc0*\x1a\x06\x1a\x19\r<\x1b\x11\x02Y\x01\xa0\xa4\xde\x18$\x13\r\x01\x02\x03\f\x14\x18\x0f\x02\x01+\x01}\"(\xfd\xf7\x05\f\x03\x01\r\xa6q\xe087] F\x1b\x16\f \x13\x10\t\x01_\xfe\xad1\b\x05\x02\x05\v)\n\xac\x01\xe9\x01\x04\x02\x02\t\b\x00\x00\x00\a\x00\x03\x00\xe3\t\x00\x04\x1c\x00\x02\x00\v\x00#\x001\x00K\x00e\x00\u007f\x00\x00\x013\x03\x054&+\x01\x11326\x01\x13\x14\x06+\x01\"&=\x01!\a\x06#!\"&7\x0163!2\x16\x04\x10\x06#!\"&5\x11463!2\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x1f\x01\x14\x0e\x03\a#>\x03?\x014.\x03'3\x1e\x03\x17\x01\xf8\xab\x01\x03Xe`64[l\xfd\xc2\x01\x13\x0e\xd8\x0e\x13\xfe\xdd7\n\x12\xfe\xf5\x15\x13\r\x02,\t\x12\x01L\x0e\x14\x03;\xfb\xc7\xfe\xf2\x0e\x14\x14\x0e\x01\f\xc8\x01\x98\x01\x0f\x1c=+3&9\x1a\x10\x01\x01\x01\x0e\x1a8&+)>\x1d\x11\x02\xb9\x01\x0f\x1c>+3&9\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x02\xb6\x01\x0f\x1c=+3&8\x1a\x10\x01\x01\x01\x0e\x198&+)>\x1d\x11\x01\x02\x1e\x01\t\xa6Wj\xfe|r\x01\xca\xfd\f\x0e\x14\x14\x0e>Q\x0f$\x11\x02\xf5\x0e\x14\xc6\xfe~\xdc\x14\x0e\x02\xf4\x0e\x14\xfed\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x1a\v$kaw+-wi[\x1b\x1b\b\x1d[\\\x83;/xgY\x1a\x00\x04\x00\x00\xff\x00\x05\x80\x05\xf2\x00J\x00\\\x00m\x00\x82\x00\x00\x054.\x01'.\x02'&#\"\x06#\"'.\x03'&47>\x037632\x16327>\x027>\x0254&'&#\"\a\x0e\x03\a\x06\a\x0e\x01\x10\x16\x17\x16\x17\x16\x17\x16\x17\x16327>\x01\x13\"&47654'&462\x17\x16\x14\a\x06\x16\"'&476\x10'&462\x17\x16\x10\a\x16\"'&47>\x01\x10&'&462\x17\x16\x12\x10\x02\a\x02i\x1a$\x02\x01\b\t\t\x0f$\x17^\x18\"\r\x06\n\x05\b\x01%%\x01\b\x05\n\x06\r\"\x18^\x17$\x0f\t\t\b\x01\x02$\x1aW \x14\x19\"@9O?\x1d\x1f\x06\x031&&18\x1b?t\x03\x03@\"\x19\x14 W\x9f\x1a&\x13%%\x13&4\x13KK\x15\xb86\x12\x13\x13pp\x13&4\x13\x96\x96\xa36\x12\x13\x13ZaaZ\x13&4\x13mttm\x99\v^x\t\x04-\x1b\b\x0e\v\v\x05\x15\x13\x1d\x04\x80\xfe\x80\x04\x1d\x13\x15\x05\v\v\x0e\b\x1b-\x04\tx^\v\x16=\f\b\x12\x11/U7C\f\ak\xda\xfe\xf2\xdakz'[$\x01\x01\x12\b\f=\x03\xa7&5\x13%54'\x134&\x13K\xd4K\x13\xb5\x13\x134\x13r\x01\x027>\x0254\x00 \x00\x15\x14\x06\"&54>\x022\x1e\x02\x04\x14\x06\"&462%\x14\x06\"&54&#\"\x06\x15\x14\x06\"&546 \x16%\x16\x06\a\x06#\"&'&'.\x017>\x01\x17\x16\x05\x16\x06\a\x06#\"'&'.\x017>\x01\x17\x16\x80&4&&4\xe6&4&&4S\x01\x00Z\xff\x00\x01\xad&4&&4\x02\xe9\x174$#\x1f\x1d&\x0f\xe1\x9f\x1a&&\x1aj\x96\x173$\"('$\xfe\xf9\xfe\x8e\xfe\xf9&4&[\x9b\xd5\xea՛[\xfd\xfd&4&&4\x01F&4&\x83]\\\x84&4&\xce\x01$\xce\x01\x8a\n\x16\x19\t\x0e\x13!\aD\x9c\x15\b\x10\x114\x15\xb7\x01%\t\x15\x19\v\f,\x10\\\xcd\x16\a\x10\x104\x15\xeb\xa64&&4&\x9a4&&4&\x01-\xff\x00Z\x01\x00\x874&&4&\x01\x00;cX/)#&>B)\x9f\xe1&4&\x96j9aU0'.4a7\xb9\x01\a\xfe\xf9\xb9\x1a&&\x1au՛[[\x9b\xd5\xdb4&&4&@\x1a&&\x1a]\x83\x83]\x1a&&\x1a\x92\xceΏ\x190\n\x04\x16\x13\xb2u\x104\x15\x15\b\x10\x89\x85\x190\n\x04)\xee\x9b\x104\x15\x16\a\x10\xaf\x00\x00\x00\x00\x04\x00\x03\xff\x00\b\xfd\x06\x00\x00\x11\x00#\x00g\x00\xb0\x00\x00\x01&'.\x01#\"\x06\x15\x14\x1f\x01\x1632676%4/\x01&#\"\x06\a\x06\a\x16\x17\x1e\x01326\x01\x0e\x01'&#\"\a2632\x16\x17\x16\x06\a\x06#2\x17\x1e\x01\a\x0e\x01+\x01&'%\a\x06#\"'\x03&6?\x01\x136\x1276\x1e\x01\x06\a\x06\a676\x16\x17\x16\x06\a\x06\a632\x17\x1e\x01%\x13\x16\x06\x0f\x01\x03\x06\x02\a\x06#\"'&6767\x06\a\x06#\"&'&6767\x06#\"'.\x017>\x01\x17\x16327\"\x06#\"&'&6763\"'.\x017>\x01;\x02\x16\x17\x057632\x04\b;\x19\x11>%5K$\n\"0%>\x11\x19\x02s$\n\"0%>\x11\x19;;\x19\x11>%5K\xfeV\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x10\x1c\xfe\xde\xef\x0e\x0f(\x11\xa0\v\x0e\x16є\x11\x95y\x1fO2\a\x1fF/{\x90(?\x04\x050(TK.5sg$\x1a\x03\xb1\xa0\v\x0e\x16є\x11\x95y\x1a#-\x1d\x19\a\x1fF/{\x90\x04\b$7\x04\x050(TK.5sg$\x1a\x12\x11L#>H30\x03\r\x03\\\x9d(\x11\x1b$\x12\x15\x15\x12$\x1b\x11(\x9d\\\x06\x01\x0e\x1c\x01#\xef\x0e\x0f(\x02@\x025\"'K58!\b\x1f'\"5\x828!\b\x1f'\"5\x02\x025\"'K\x01\x12#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a#\x01@\x171\rw\x01\v\x9b\x01\x11d\x19\a>N\x1a;ET\x11\x050((?\x04\n-\n2\x12K|\xfe\xc0\x171\rw\xfe\xf5\x9b\xfe\xefd\x16#\x1fN\x1a;ET\x11\x010$(?\x04\n-\n2\x12K$#\x1a\x11\x1f\x11\x01dS$K\x11\t\t\x11K$Sd\x02\x02\x1bx\a\x00\x00\x00\x04\x00\x00\xff\x00\a\x00\x06\x00\x00\x13\x00D\x00N\x00\\\x00\x00\x01\x14\x162654& \x06\x15\x14\x16265462\x16\x02\"\x0e\x02\x15\x14\x162654\x00 \x00\x15\x14\x0e\x01\a\x0e\x03\x15\x14\x06#\"\x06\x14\x1632654>\x027>\x0354.\x01\x01\x17\x01\x06\"/\x01&47\x01\x17\x16\x14\x0f\x03&'?\x0162\x04 &4&\xce\xfe\xdc\xce&4&\x84\xb8\x84h\xea՛[&4&\x01\a\x01r\x01\a$'(\"$3\x17\x96j\x1a&&\x1a\x9f\xe1\x0f&\x1d\x1f#$4\x17[\x9b\xfd\xc2\xe2\xfd\xbd\f\"\f\xa8\f\f\x06@\xa8\f\f\xe9\x1aGB\x81[\xcf\r\"\x02\xc0\x1a&&\x1a\x92\xceΒ\x1a&&\x1a]\x83\x83\x01\xe3[\x9b\xd5u\x1a&&\x1a\xb9\x01\a\xfe\xf9\xb97a4.'0Ua9j\x96&4&\xe1\x9f)B>&#)/Xc;u՛\xfd\x8c\xe2\xfd\xbd\f\f\xa8\f\"\f\x06\x06\xa8\f\"\r\xe9\x19G\x99i[\xcf\f\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x14\x00X\x00h\x00\x00\x01\x14\a\x0e\x01\a\x0e\x01\a\x06#\"&5467632\x16\x014&'&#\"\a'>\x0154#\"\a\x0e\x02\x15\x14\x1632\x14\a\x06\a\x0e\x01#\"54>\x0354'.\x01#\"\x0e\x01\x15\x14\x1632>\x017>\x01767632\x17\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03b\r\v)\n\x02\x05\v\x14\v:4FD\x1c\x17\x1c\x11\x01\xe6N\r\x15\r[\x87\x02\x031\xf2\x18,^\x95J\xa1\x93\x19\x01\x04\x16\x0eK-*\x15\x1d\x1e\x16\a\x18E\x1f#9\x19gWR\x92Y\x15\x06\x13\x05\x03\vvm0O\x01\x03\x05\t\xb8\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x03\xfd\x1bC2\xc82\v\x03\x01\x02c@X\xac&\x0e!\xfe9\x0e{\x05\bM\x02\x16\xe2A\xe9\x06\x11\x91\xbc_\x92\x9e\x06\x02\"S4b/\x18/ \x19\x0f\x01\x03\a\x16\x1dDR\"Xlj\x92P\x16Y\x16\f\x06<\x12\x01\t\x02\x0f\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x02\x00%\xff\x00\x05\xda\x05\xff\x00\x19\x00e\x00\x00\x014.\x02#\"\a\x06\x02\x15\x14\x1e\x0232\x16>\x0276\x1276\x01\x14\x06#'.\x02#\"\a\x06\a\x0e\x01\a\x0e\x03#\"&54>\x0132\x16\x17\x14\x0e\x03\x15\x14\x1632>\x03754&*\x01\x06#\"&54>\x02763 \x11\x14\x02\a\x17>\x0132\x17\x1e\x01\x02\xe8\x04\r\x1d\x17''il\x11$E/\x04\x1c\f\x14\n\x02\x10@\x10\x13\x02\xf2\x0f\b\x06\x16P@\x1f\xa7\xb8\x0f\x06\n\x1d\b\x17^\x83\xb2`\x87\x9f'W6&\xa4\x01!.. ! -P5+\x16\x05\a\n\n\n\x01\xe3\xfaE{\xbdn46\x01vL\x05\x03e\xa3V\x16\x1f\x13z\x04\xcf\x18\x1d\x1f\x0f\x17:\xfe\xf7\x89,SN/\x01\x01\x05\f\nM\x015M[\xfd\xa7\a\r\x01\x03\x10\t]\b\x13$\x8b\x1f[\xb1\x98^\xa7\x885\x80iC\x1c\x01\x17'2H&!(?]v`*\t\x02\x03\x01\xf5\xe2l\xe2\u008d\x13\t\xfe\x98b\xfe\xa2$\x039>\r\a\xbf\x00\x03\x00\x01\xff\x00\x06\u007f\x05\xfb\x00=\x00R\x00\x87\x00\x00\x012\x1f\x01\x16\x1f\x01\x16\a\x03\x0e\x01\a\r\x01#\"&5467%!\"&7>\x013-\x01.\x017>\x01;\x01\x05%.\x017>\x0132\x17\x05\x172\x16326/\x01.\x0176\a\x17/\x02\x03.\x01'&676\x16\x1f\x01\x0e\x01\a\x06\x16\x01\x13\x16\x0f\x01\x06\x0f\x016/\x01&/\x01&#\"\a\x03&676\x16\x17\t\x01&676\x16\x17\x13\x03&676\x16\x17\x13\x17\x1e\x016/\x01&672\x16\x03? \x1b\xde=1\x92(\vH\x06/ \xfd\xf1\xfe\xa0\t'96&\x01\x04\xfe@)9\x02\x02<'\x01\xba\xfd\xf7)2\x06\x069%\n\x01\xe1\xfe\xa1&0\x06\x066#\x06\x0e\x01\xc0\xd9\x01\x04\x01\x17\x0f\x14\xba#\x0e\x19\x1b\x15\xba\xda\x05$\xee\x01\x03\x01\x18\v \x1fJ\x1b\x8e\x02\x06\x01 \x12\x03\xa5\x0f\x04\x0f0\f7j\x02)\x925@\xde\"*3%\xeb\x19\x0e\"!M\x18\x01\n\xfe\xfa\x15\x15%#K\x14\xf1\x88\x0f\x15\"%N\x11\xc1e\b\x1e\x18\x01\f\x028)'8\x03_\x12\x94(9\xaa.<\xfec +\x048 8(%6\x05 <)'4\x01@\x05@)#-<^\n?%$-\x02`%\x01.\r}\x17Q!&\xca}%\x02&\x01\x06\x01\x05\x01\x1fN\x19\x17\v\x1c\x93\x01\x05\x02-l\x01\xa7\xfe\xf6IJ\xdb;\x1c6>/\xaa=*\x94\x17%\x018!Q\x17\x16\x10 \xfe\xa0\x01\xc7#P\x13\x12\x18\"\xfe\\\x01Q#N\x11\x13\x1a&\xfea\xc4\x0f\x05\x14\x10\xe0)<\x019\x00\x00\x04\x00\x00\xff\x1e\a\x00\x05b\x00R\x00]\x00m\x00p\x00\x00%\"'.\x01'&54>\x0676%&547632\x1f\x0163 \x00\x17\x16\x14\a\x0e\x01\a\x16\x15\x14\a\x06#\"/\x02\x017\x06\a\x16\x1a\x01\x15\x14\a\x06#\"'\x01\x06\a\x16\x00\x15\x14#\"&/\x01\x03\x06\a\x1e\x01\x17\x13\x14%\x17$\x13\x02%\x1e\x01\x15\x14\x06\x00\x14\x1632\x16\x15\x14\x162654&#\"%'\x17\x01O\x02\x04V\xa59\x15\x04\x04\n\a\x0e\x06\x12\x02\xb8\x01\fn\x11t\f\x12\n|\\d\x01\n\x01ϓ\x14\x14[\xff\x97n\x11t\v\x13\n|@\xfeD\a:)\x03\xf8\xee\t\r;9\x03\xfe8'+\x18\x01|\v\x0e\x89\x04j\xe0,\"\x02 \a\xb0\x0341\x01\x11\xb1\xb4\xfe\xe9CH^\xfen\x1c\x14Vz\x1c(\x1c\xb2~\x14\x01R\t\a\xb4\x029\xb0\\\x1e'\t\x14\x10\x14\f\x16\b\x17\x03\xfbr\xc6\r\x13\n@\x10\xe5\x13\xfe\xed\xe8\x1fL\x1f\x8e\xdf@\xc6\r\x14\t@\x10\xe5w\x034\a\x18\x17\x05\xfe6\xfeH\x03\a\x02\x03\a\x03I\x1c(+\xfdC\x04\n,\x06\xc5\x01\x9d55\x03,\f\xfe\xb9\nf[o\x01\x12\x01\x15p@\xa9\\j\xbd\x02;(\x1czV\x14\x1c\x1c\x14~\xb2\x11\x04\a\x00\x00\x00\x00\x04\x00\x00\xff\x97\x04\xfe\x05i\x00\x1f\x00/\x005\x00O\x00\x00\x01\x14\a\x06#\"'&54>\x0132\x17\x06\a&#\"\x06\x15\x14\x16 654'67\x16'\x14\x02\x0f\x01\"'>\x0454'\x16'\x15&'\x1e\x01\x13\"'6767\x0e\x01\a&546767>\x017\x16\x15\x14\a\x0e\x01\x04\x1a\x93\x94\xe6蒓\x88\xf2\x93`V \aBM\xa7\xe3\xe1\x01R\xe0 B9)̟\x9f\x0e\x1d!S\u007fH-\x0f\x0377I\x85Xm\xfdSM\xdaH\x13\x02*\xc3k#\"\x1a.o;^\x1bJ\x18 q\x01\xaeן\xa1\xa1\x9fד\xf7\x92\x1f>@\x1c\xf6\xa8\xaa\xed\xed\xaaYM\r$bK\xc0\xfe\xced\x01\x05 \x8d\xa8ү[E\"\xa0\xa2\x02\xd6\xe2;\xff\xfe\xb9Kx\u007f%\x13^\x91\x196;%T\x1a,\x1e\x10U:i\x94m=Mk\x00\x00\x00\x05\x00\x00\xff\x80\x06\x00\x05\x80\x00\x1a\x00)\x00.\x00D\x00T\x00\x00\x014'\x06\a\x16\x15\x14\x06\"&54632\x1767&#\"\x06\x10\x16 6\x03\x16\x15\x14\x0e\x03\a\x16;\x016\x114'.\x01'\x16\x054'\x06\a\x0e\x01\x15\x14\x17>\x017\x0e\x01\a\x1632676%\x11\x14\x06#!\"&5\x11463!2\x16\x04\x1a\x1c),\x16\x9a蛜s5-\x04\x17\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x04\xff\x16Cf\x1d\a'/'%\x14\f(\v\x04\b\x05\x11$\x86U\xc7L\x11\x05\x04\n\f(\n\x15#'/'\a@\x86\x16\x89\x02\b\x0f\x10\f3\x0e#@,G)+H+@#\x0e3\r\x10\x0e\b\x02\x89\x01\x01\xce\xfe\x9f\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\x01\x84\x16\x05\x0fX@\x13\x06\x0f\x16\f\x1d\x16\x13\x19\x10\x02_\x13O#NW\xa5#O\x13_\x02\x0f\x18\x14\x15\x1d\f\x16\x0f\x06\x13\x8a\x1d\x05\x16.\x16\x05*\x13\t\x1e#\x1e\x1e#\x1e\b\x14(\x05\x16\x01\xfb\xfe^\xfe\x9f\xce\xce\x01a\x01\xa2\x01a\xce\xce\x00\x00\x01\x00\x0f\xff\x80\x06q\x05\x80\x00[\x00\x00\x016\x16\x17\x16\x15\x14\a\x1632632\x16\x15\x14\x0e\x02\x15\x14\x17\x1e\x01\x17\x16\x17\x16\x15\x14\a\x0e\x02#\"&#\"\a\x0e\x04#\".\x03'&#\"\x06#\".\x01'&54767>\x017654.\x0254632\x16327&547>\x01\x03P\x86\xd59\x1b\t\x0e\x0e\x12B\x12\x1d6?K?\f%\x83O\x1c4\x1c\xdb\a\b\x14\x17\x14T\x16%\x19 >6>Z64Y=6>\x1f\x1a%\x18S\x11\x19\x14\b\a\xdb\x1c4\x1cN\x85$\f?L?4\x1d\x0fB\x14\x12\x0e\t\x1b@\xd8\x05\x80\x01\x8b{:y/\x90\a\x1b$\x1c ,\x13'\x1c\x0f\x1cR\x88!\f\v\x06\x1dF!\v8%\r\x05\x05#)(\x1b\x1b()#\x05\x05\x0f%:\v!F\x1d\x06\v\f \x8aQ\x1c\x0f\x1c'\x14+\x1f\x1b%\x1a\a\x8e0z:\x89z\x00\x00\x00\x02\x00\x00\xff\x80\x06\x00\x05\x80\x00O\x00_\x00\x00\x014'.\x01'&54>\x0254&#\"\x06#\"'654'.\x01#\"\a\x06\x15\x14\x17\x06#\"&#\"\x06\x15\x14\x1e\x02\x15\x14\a\x06\a\x06\x15\x14\x17\x1e\x0232632\x1e\x0232>\x0232\x1632>\x0176\x01\x11\x14\x06#!\"&5\x11463!2\x16\x05\x00\x16Cf\x1d\a'.'%\x14\v(\f\x04\b\x05\x11$\x85V\xc6M\x12\x06\n\x05\v)\n\x14#'.'\a@\x86\x16\x8a\x02\b\x0e\x10\r3\r#A,G)+H+A#\r4\r\x0f\x0f\b\x01\x8a\x01\x00\xa9w\xfc@w\xa9\xa9w\x03\xc0w\xa9\x01\x84\x16\x05\x0eXA\x0e\v\x0f\x16\f\x1d\x16\x13\x19\x10\x02?4N$NW\xa5&M&L\x02\x10\x19\x14\x15\x1d\f\x16\x0f\v\x0e\x8a\x1d\x05\x16/\x16\x05*\x13\n\x1e#\x1e\x1e#\x1e\t\x13+\x03\x16\x03\v\xfc@w\xa9\xa9w\x03\xc0w\xa9\xa9\x00\x00\x00\x00\x01\x00\x00\xff\x80\t\x00\x06\x00\x00O\x00\x00\x01\x0e\x05\a\x0e\x01\a\x0e\x03\a\x06\a$\x05\x06\a>\x01?\x01>\x0376\x052\x17\x1e\x01\a\x03\x06'&#\"\x04\a\x06.\x02/\x01454327\x12\x0032\x1e\x05\x177>\x047>\x03\t\x00EpB5\x16\x16\x03\n3\x17\x0fFAP\b/h\xfe\xab\xfe\xdf\\\xd3/N\x10\x0fG\xb8S\x85L\xba\x01\x17\x01\t\v\x06\x06\xc2\x0f \x80\xe2\x92\xfe\x00\x88R\x86P*\f\x01\x06\x8a\xe9\xc0\x01m\xc9\x05\x1395F84\x0ef\x02&3Ga4B|wB\x06\x00.\\FI*/\x06\x12\xed.\x1d?&,\x06\x1f\xc8\x0e\xac5~\x10\x1e\a\a\x1bK %\r\x1f&\x03\x06\x16\v\xfe\xa7\x1d\a\x18Y\x02\x01\x1c.\"\x11\x01\x01\x01\x067\x01n\x01<\x01\t\x0f\"-I.\xb1\x04M`{\x90ARwJ!\x00\x05\x00\x00\xff\x00\x06\x00\x06\x00\x00F\x00X\x00^\x00d\x00j\x00\x00\x01\x14\a'\x17\x06\a'\x17\x06\a'\x17\x06\a'\x17\x06\"'7\a&'7\a&'7\a&'7\a&547\x17'67\x17'67\x17'67\x17'632\x17\a7\x16\x17\a7\x16\x17\a7\x16\x17\a7\x16\x174\x02$#\"\x0e\x02\x15\x14\x1e\x0232$\x12\x13\x11\t\x01\x11\x01\x11\x01\x11\t\x01\x11\x01\x11\t\x01\x11\x01\x05*\x05\xec\xe0\x13'ֱ,?\x9dg=OO\x0e&L&\x0eNJBg\x9d;1\xb2\xd6'\x13\xe0\xed\x05\x05\xee\xe1\x13'ֱ.=\x9egCIM\r$'&&\x0eNJBg\x9e=.\xb1\xd5%\x15\xe0\xed\x05\x1e\x9d\xfe\xf3\x9ew\u061d\\\\\x9d\xd8w\x9e\x01\r\x9dI\xfdo\xfdo\x02\x91\x02\xc4\xfd<\xfd<\x05\xc4\xfd\x00\xfd\x00\x03\x00\x02\x80-\x1f\x0eNIDg\x9e=/\xb2\xd7%\x16\xe4\xf0\x06\x06\xee\xe2\x13(ײ+A\x9ehEHO\x0e*\"#*\x0eOICh\x9f=/\xb2\xd7'\x13\xe0\xec\x06\x06\xed\xe1\x13(ֲ/=\x9fh>ON\x0e\x1f.\xa0\x01\x0f\x9d]\x9d\xdaxwڝ]\x9d\x01\x0f\x02\x1e\xfd\x02\xfe\x81\x01\u007f\x02\xfe\x01\u007f\xf9\xcb\x01\x9c\x037\x01\x9b\xfee\xfc\xc9\x03[\xfc\x80\xfe@\x01\xc0\x03\x80\x01\xc0\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x14\x00)\x006\x00\x00\x01!\a!\"\x06\x15\x11\x14\x16\x17\x163\x15#\"&5\x1146%3\x01\x0e\x06\a567654'\x013\x13\x01\x11!67!\x114&'7\x1e\x01\x01S\x02\xb3\x1a\xfdgn\x9dy]\x17K-\x8c\xc7\xc7\x03\xdf\xf7\xfe\x1e\x17#75LSl>\xa39\x14\x14\xfe\xe3\xe4\xbb\x03V\xfc\xe5%\b\x02\xa6cP\x19e}\x05&H\x9en\xfc\xfd_\x95\x13\x05HȌ\x03\x03\x8c\xc8\xda\xfa\xf2=UoLQ1!\x02\xc3\x1a\x9c4564\x02\xdd\xfd\xb7\x01\xf2\xfb\xa97\x12\x04\x0eU\x8c\x1dC\"\xb3\x00\x00\x00\x00\n\x00\x00\xff\x00\a\x00\x06\x00\x00\a\x00\x14\x00!\x00-\x009\x00[\x00n\x00x\x00\x90\x00\xe7\x00\x00\x00\x14\x06\"&462\x0354&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x16326754&\"\x06\x1d\x01\x14\x1626754&\"\x06\x1d\x01\x14\x1626\x01\x06\x04#\".\x02547\x06\x15\x14\x12\x17632\x17632\x1762\x17632\x16\x176\x12'4#\"\a\x06#\"547\x06\x15\x14\x163276\x014&\"\x06\x15\x14\x1626\x014.\x01#\"\x06\a\x06\x15\x14\x16327632\x16\x15\x14\a>\x01\x05\x14\x02\a\x06\x04\x0f\x01\x15\x14\x06#\"'\x06\"'\x06#\"'\x06#\"&5\x06#\"'67&'\x16327&'&54>\x0332\x1767>\x017>\x027>\x0132\x17632\x17\x16\x15\x14\x0e\x02\a\x1e\x01\x15\x14\a\x16\x17632\x17\x16\x03T\"8\"\"8\x82)<()\x1d\x1e)\xac(<))\x1e\x1d)\xae)<))<)\xae)<))<)\x01\fT\xfeد{ՐR\x15h\x82x\x1e=8\x1e 78\x1e n \x1e8\x1c1\rp\x82\x8eH\x11\x1e_6\xe2\x1eS\xb2\x92oc\r\xfeF@b@?d?\x02uK\x97bM\x9070[f5Y$\x1135\x04KU\x01\x17C<:\xfe\xee[\x04;+8\x1e n \x1e87 \x1e8/8Zlv]64qE 'YK\xc00\x18\x12-AlB;\x16\x13\x17\x02\x14\x03\n\x1a\x18\x10W\xf9\x88#\x1b;WS9\x05\f\r\x13\x01\x11&\x10\x9d(\x19#-7Z\x04\xe8://:/\xfaTr\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x1er\x1e++\x1er\x1e,,\x02ʠ\xc7g\xab\xe0xXV\xafע\xfe\xd4e9222222\x1f\x19^\x01\x13\xb3K\x06\x13\xf3Vv\u007f\x94\x96\xddF0\x02\xb22OO23OO\xfe\xe0`\xa6lF;\x9fmhj\x13\x0684\x1a\x14D\xc3ro\xfe\xebB@\x9d\x1a\x01r+@222222C0DP\x01\x13\x1f`\a.\xc0r8h9\x89\x9c~T4\x1d\x19\x03\x14\x06\x0f.&\x14o\x84\x04@9\x05\a\x05\x11\x0f\x13\x01\x06\x18\f\x06\x13\x8a\xf0\x1e1P\x00\x00\x03\x00\x00\xff\x80\x06\x00\x05\x80\x00\x19\x00%\x001\x00\x00\x014'!\x153\x0e\x01#\"&4632\x177&#\"\x06\x10\x16326%35#5#\x15#\x153\x153\x00\x10\x02\x04 $\x02\x10\x12$ \x04\x03\x95\x06\xfe\x96\xd9\f}Pc\x8c\x8cc]\x0132\x16\x06\x001\xae\xa4I\xfe\xe3U\xa4Π?L\x80\xb6\x80L?\xbe\x99cc\x0e\xc34MX\v\x8a\x14\x1a&\x04\x00\xfc\xb90\x0e4;0\xfe\xae\x05X\x19pD[\x80\x80[Dp\x19D,\x0f\x02)\x12\x02&&\x00\x00\x05\x00\x00\xffQ\t\x00\x05\x00\x00\x05\x009\x00V\x00\\\x00\x94\x00\x00\x1226&\"\x06\x05.\x05'\a\x06&'&6?\x01.\x02\x06#\"\x0f\x01#\x1126\x1e\x03\x17\x01\x16327\x1667\x167>\x01'\x1632>\x01&\x173\x11#'&+\x01\"\x0f\x01\x06\x14\x17\x1e\x01?\x016\x1e\x01\a\x1e\x01\x17\x1e\x01\x17\x16\x0426&\"\x06\x01\x11\x14\x06#!\x0e\x01\a\x0e\x01\a\x0e\x01'\x0e\x01.\x01'\x01!\"&5\x11463!>\x06;\x012\x176;\x012\x1e\x06\x17!2\x16\x98P P \x06\t\n9\x1a2#.\x16}S\xfbP9\x01:\xb1\x16:%L\v\\B\x9e\x9b\x05 \f\x1b\x0e\x15\b\x01)spN/9o\x11J5\x14 \x02\n!+D\x1f\a\x84`]\x9dBg\xa7Y9\xd1\x1c\x1b+\x86,\xc1\x199%\n\x10P\x14\x1dk\v4\x01\x00P P \x01\b&\x1a\xfeN\x1bnF!_7*}B<\x84{o0\xfe\xe1\xfe\x9a\x1a&&\x1a\x01\xa5\x0eB\x1d;*<@$ucRRc\xa7#@16#3\x1b7\x0e\x01c\x1a&\x01\x80@@@\x06\rJ\"@*4\x17\x8c^\x04`E\xb2D\xce\v\v\x01\x02B\x9e\xfd\xe0\x01\x01\x03\x06\v\b\xfe\xdco/\x1489\x062\x127\x17\n*@O\x18\x02\x00\xb4LC\xf3!T!3\x022\xda\x17\x033\x1f\x13X\x18$\x8b\x0fBJ@@@\x02\x00\xfd\x80\x1a&AS\n0C\f59\x04\"\v'D/\x01\x1a&\x1a\x02\xa0\x1a&\x0eD\x1c4\x17\x1c\v88\f\x11$\x1a5\x1fA\x10&\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00%\x00O\x00\x00\x01\x11\x14\x06#!\"&5\x1147>\x067>\x032\x1e\x02\x17\x1e\x06\x17\x16\x01$7>\x01/\x01.\x01\a\x06\a\x0e\x03\".\x02'&'&\x06\x0f\x01\x06\x16\x17\x16\x05\x1e\x042>\x03\a\x00^B\xfa@B^\v\b>\x15FFz\xa5n\x05_0P:P2\\\x06n\xa5zFF\x15>\b\v\xfd\xcc\x01\aR\v\x03\b&\b\x1a\v\xe7p\x05^1P:P1^\x05\xba\x9d\v\x1a\b&\b\x03\vR\x01\a\nP2NMJMQ0R\x03r\xfc.B^^B\x03\xd2\x0f\t\a7\x11:5]yP\x04H!%%\"F\x05Py]5:\x117\a\t\xfd\xa8\xbf=\b\x19\v4\v\x03\b\xa9Q\x03H!%%!H\x03\x86t\b\x03\v4\v\x19\b=\xbf\b<\"-\x16\x16/ ?\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x001\x00P\x00p\x00\x00\x01\x17\x16\x06\a\x0e\x02\a\x0e\x03+\x02\".\x02'.\x02'.\x01?\x01>\x01\x17\x16\x17\x1e\x03;\x022>\x027$76\x16\x13\x11&'&%.\x03+\x02\"\x0e\x02\a\x0e\x02\a\x06\a\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11476\x007>\x03;\x022\x1e\x02\x17\x1e\x02\x17\x16\x05\xc2'\b\x03\n+\xa7~\x04'*OJ%\x01\x01%JN,&\x05x\xa7'\v\x03\b%\b\x1b\v^\xd4\x05M,E\x18\x01\x01\x18E,M\x05\x01\x027\v\x1a\xc6ZE[\xfe\xd6\x03P*F\x18\x01\x01\x18F*P\x03\xd7\xc9:5\x0e\a\x13\r\x05\xc0\r\x13\x80^B\xfa@B^){\x01\xc6\x06$.MK%\x01\x01%KM.$+\xe2\xe2X)\x02o3\v\x19\b\"\x81a\x03 2\x17\x172!\x1f\x04]\x81\x1e\b\x19\v4\v\x04\tI\xa3\x04>\x1f\"\"\x1f>\x04\xc6,\b\x03\xfd&\x03\xa0S8J\xe6\x02B\x1e##\x1eB\x02\xa6\x9f12\f\a\xfc`\r\x13\x13\x03\xad\xfc`B^^B\x03\xa08&r\x01a\x05\x1e#1\x18\x181#\x1e$\xac\xb6R&\x00\x00\x00\x00\v\x00\x15\xff\x00\x05\xeb\x06\x00\x00\x03\x00\a\x00\v\x00\x0f\x00\x1a\x00\x1e\x00\"\x00&\x00.\x002\x00v\x00\x00%\x17/\x01\x01%'\x05\x01\x17\x03'\x01%\x03\x05\x01\x17/\x01\x14\x16\x06\x0f\x01\x17\x16\x01\x05\x03%\x017\a\x17\x01%\x03\x05\x017'\a\x17\x16\x0f\x01%7\x0f\x02'\a\x14\x0f\x01\x06/\x01\x17\x14\a\x05\x06#&5'&\x03&?\x01&'\x03&?\x01&'\x03&7%2\x17\x05\x16\x15\x13\x14\x0f\x01\x17\x16\x15\x1776\x1f\x0174?\x016\x1f\x01\x1e\x01\x0e\x01\x15\x14\x0f\x01\x06\x01J\xca\"\xd8\x01\x12\x01\x12\v\xfe\xd4\xfe\xee\xe30\xf5\x01<\x01=\x0e\xfe\xa0\x01\x8d_\x02g\x02\x02\x04NU\a\xfd?\x01\x00D\xfe\xe9\x04f\x0f\xe6\x02\xfd\xe1\x01u\x13\xfeY\x03\x9a\x14\xe2\x02\x90\x06\x02\a\x01\x02\x1e\xb3\x14\x13G\b\x04\xea\a\ab\a\x04\xfe\xdb\x04\x02\b\xe4\x047\x02\a=^\x01H\x02\b^\x85\x02`\x02\t\x01\xb1\x05\x03\x01=\x06\x14\x06v~\x05\x05y\x05\x06T\x03\x05\xce\x06\x05\xf5\x04\x02\x0f\x14\x04\xbf\x06\x01\xd6\xec\xd5\xfe3\xda\xf5\xd7\x01\x86\xd5\x01G\xcc\xfd\xe2\xd6\x01D\xc8\xfe\xa3P\xefO\x01\x0f\t\x034F\x06\x02\x9e\xc8\x01ѭ\xfb\xb3\xea\xa4\xf0\x02q\xc2\x01\xb9\xa3\xfc\xbb\xe9\x8ei_\x04\x05w\\ހ\xe4!1u\x05\x03\xbb\x05\x05S\xa1\x05\x03\xea\x02\x02\x01\xf2\x04\x01\x11\a\x04%V\x06\x01_\a\x05-d\b\x01\xd2\n\x03\x87\x01\x99\x04\x05\xfe1\a\x03=U\x02\x06{J\x04\x048n\x06\x03~\x03\x03\x87\x04\x06r\x87\x03\x05\x02\x99\x05\x00\x00\x03\x00\x00\xff\x00\x06\x80\x06\x00\x00\x1d\x00'\x00U\x00\x00\x014.\x03#\x0e\x04\".\x03'\"\x0e\x03\x15\x14\x163!26\x034&\"\x06\x15\x14\x1626\x01\x15\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x04\xb1\v\x1f0P3\x067\x1e3/./3\x1e7\x063P0\x1f\vT=\x02@=T\xad\x99֙\x99֙\x02|\x12\x0e`^B\xfb@B^^B\x04\xc0B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e``\x0e\x12\x01*9deG-\x04!\x10\x18\n\n\x18\x10!\x04-Ged9Iaa\x02\x9bl\x98\x98lk\x98\x98\xfeO\xc0\x0e\x12\xe0B^^B\x05\xc0B^^B\xe0\x12\x0e\xc0\x0e\x12\x80\x12\x0e\xc0\x0e\x12\x80\x12\x00\x00\x04\x00\x00\xff\x00\x06\x80\x06\x00\x00\t\x00+\x00Y\x00i\x00\x00\x01\x14\x06\"&5462\x16\x032\x1e\x04\x15\x14\x06#!\"&54>\x03;\x01\x1e\x052>\x04\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x1532\x16\x1d\x01\x14\x06+\x01\x15\x14\x06#!\"&5\x11463!2\x16\x1d\x0132\x16\x15\x01\x114&#!\"\x06\x15\x11\x14\x163!26\x04\x04\x99֙\x99֙0.I/ \x10\aOB\xfd\xc0BO\t\x1c-Q5\x05\a2\x15-\x1d)&)\x1d-\x152\x02\xb3\x13\r``\r\x13\x13\r``\r\x13\x13\r`^B\xfb@B^^B\x04\xc0B^`\r\x13\xff\x00\x13\r\xfb@\r\x13\x13\r\x04\xc0\r\x13\x03|k\x98\x98kl\x98\x98\xfe\xb8\"=IYL)CggC0[jM4\x04\x1f\v\x17\t\t\t\t\x17\v\x1f\x01\x04\r\x13\x80\x13\r\xc0\r\x13\x80\x13\r\xc0\r\x13\xe0B^^B\x05\xc0B^^B\xe0\x13\r\xfb@\x05\xc0\r\x13\x13\r\xfa@\r\x13\x13\x00\x00\x06\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x00\x004.\x02#\x0e\x04\".\x03'\"\x0e\x02\x14\x163!2\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01\x11\x14\x06#!54&+\x01\"\x06\x1d\x01!54&+\x01\"\x06\x1d\x01!\"&5\x11463!2\x16\x04\x00\x12)P9\x060\x1b,***,\x1b0\x069P)\x12J6\x02\x006S\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x01\x00^B\xfe\xa0\x12\x0e@\x0e\x12\xfd\x00\x12\x0e@\x0e\x12\xfe\xa0B^^B\x06\xc0B^\x01U\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049ck\x80U\x02?\xbc\x85\x85\xbc\x85\xfe\xe6@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x128\x0f\x15\x15\x0f8\x0f\x15\x15\x01\v@\x0e\x12\x12\x0e@\x0e\x12\x12\x01N\xfb@B^`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`^B\x04\xc0B^^\x00\x00\a\x00\x00\xff\x80\b\x00\x05\x80\x00\x19\x00!\x001\x00A\x00Q\x00u\x00\x85\x00\x00\x00\x14\x06#!\"&4>\x023\x1e\x042>\x0372\x1e\x01\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x114&#!\"\x06\x15\x11\x14\x163!546;\x012\x16\x1d\x01!546;\x012\x16\x1d\x01!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x04\x00J6\xfe\x006J\x12)P9\x060\x1b,***,\x1b0\x069P)\x8b\x85\xbc\x85\x85\xbc\x04\"\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x15\x0f\xfd\xc8\x0f\x15\x15\x0f\x028\x0f\x15\x12\x0e\xfd\xc0\x0e\x12\x12\x0e\x02@\x0e\x12\x80\x13\r\xf9@\r\x13\x13\r\x01`\x12\x0e@\x0e\x12\x03\x00\x12\x0e@\x0e\x12\x01`\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01ՀUU\x80kc9\x04\x1c\x0f\x14\t\t\x14\x0f\x1c\x049c\x01\xbb\xbc\x85\x85\xbc\x85\xfd`@\x0e\x12\x12\x0e@\x0e\x12\x12\xee8\x0f\x15\x15\x0f8\x0f\x15\x15\xf5@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc2\x04\xc0\r\x13\x13\r\xfb@\r\x13`\x0e\x12\x12\x0e``\x0e\x12\x12\x0e`\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x0f\x00\x17\x00(\x00\x00%.\x01'\x0e\x01\"&'\x0e\x01\a\x16\x04 $\x02\x10& \x06\x10\x16 \x00\x10\x02\x06\x04#\"$&\x02\x10\x126$ \x04\x16\x05\xf3\x16\x83wC\xb9ιCw\x83\x16j\x01J\x01~\x01J\x89\xe1\xfe\xc2\xe1\xe1\x01>\x02\xe1\x8e\xef\xfe\xb4\xb7\xb6\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0ś\xcd\x10JSSJ\x10͛\x96\xaf\xaf\x02\xb2\x01>\xe1\xe1\xfe\xc2\xe1\x016\xfe\x94\xfe\xb5\xf1\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x03\x00\x00\xff\x00\a\x00\x06\x00\x00\x10\x00$\x00,\x00\x00\x00 \x04\x16\x12\x15\x14\x02\x06\x04 $&\x02\x10\x126\x01654\x02&$ \x04\x06\x02\x15\x14\x17\x123\x16 72&\x10& \x06\x10\x16 \x02\xca\x01l\x01L\xf0\x8e\x8d\xf0\xfe\xb4\xfe\x92\xfe\xb4\uf38e\xf0\x04m\x95z\xce\xfe\xe4\xfe\xc8\xfe\xe4\xcez\x95B\xf0\x83\x01l\x83\xf0\xa9\xe1\xfe\xc2\xe1\xe1\x01>\x06\x00\x8e\xf0\xfe\xb4\xb6\xb5\xfe\xb4\xf0\x8f\x8e\xf1\x01K\x01l\x01L\xf0\xfbG\xcd\xfa\x9c\x01\x1c\xcezz\xce\xfe\xe4\x9c\xfa\xcd\x01G\x80\x80\xa1\x01>\xe1\xe1\xfe\xc2\xe1\x00\x00\x00\x00\x03\x00\x00\xff\x00\x06\x00\x06\x00\x00\x1f\x00'\x007\x00\x00\x01\x1e\x04\x15\x14\x06#!\"&54>\x037&54>\x022\x1e\x02\x15\x14\x00 \x06\x10\x16 6\x10\x132654\x02'\x06 '\x06\x02\x15\x14\x163\x04\xb1/U]B,ȍ\xfc\xaa\x8d\xc8,B]U/OQ\x8a\xbdн\x8aQ\xfe\x9f\xfe\xc2\xe1\xe1\x01>\xe1+X}\x9d\x93\x91\xfe\x82\x91\x93\x9d}X\x02\xf0\x0e0b\x85Ӄ\x9a\xdbۚ\x83Ӆb0\x0e}\x93h\xbd\x8aQQ\x8a\xbdh\x93\x02\x13\xe1\xfe\xc2\xe1\xe1\x01>\xfa\xe1\x8ff\xef\x01\x14\a\u007f\u007f\a\xfe\xec\xeff\x8f\x00\x00\x00\x00\x04\x00\x00\xff\x00\x05\x00\x06\x00\x00\x11\x00\x19\x00#\x00=\x00\x00\x00\x14\x06#!\"&4>\x023\x16272\x1e\x01\x02\x14\x06\"&462\x01\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!\x15\x14\x16;\x0126=\x01!2\x16\x04\x00J6\xfe\x006J\x12)Q8P\xd8P8Q)\x88\x87\xbe\x87\x87\xbe\x01\xa1\xfc\x00\x13\r\x03\xc0\r\x13\x80^B\xfc@B^^B\x01`\x12\x0e\xc0\x0e\x12\x01`B^\x01V\x80VV\x80ld9KK9d\x01\xb9\xbc\x85\x85\xbc\x85\xfb\xa0\x05`\xfa\xa0\r\x13\x13\x05\xcd\xfa@B^^B\x05\xc0B^`\x0e\x12\x12\x0e`^\x00\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x014.\x02#\x06\"'\"\x0e\x02\x15\x14\x163!26\x024&\"\x06\x14\x162\x0154&#!\"\x06\x1d\x01\x14\x163!26\x0154&#!\"\x06\x1d\x01\x14\x163!26%54&+\x01\"\x06\x1d\x01\x14\x16;\x0126\x1154&#!\"\x06\x1d\x01\x14\x163!26\x01!54&#!\"\x06\x15!\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80\x0f\"D/@\xb8@/D\"\x0f?,\x01\xaa,?\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xf9\x80\a\x00\x12\x0e\xf9@\x0e\x12\a\x80^B\xf9@B^^B\x06\xc0B^\x01D6]W2@@2W]67MM\x01\xa3\xa0pp\xa0p\xfe\xe0@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x01n`\x0e\x12\x12\x0e\xfb@B^^B\x04\xc0B^^\x00\b\x00\x00\xff\x80\b\x00\x05\x80\x00\x13\x00\x1b\x00+\x00;\x00K\x00[\x00e\x00u\x00\x00\x01\x14\x06#!\"&54>\x023\x16272\x1e\x02\x02\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x01463!2\x16%\x15\x14\x06#!\"&=\x01463!2\x16\x05\x15\x14\x06+\x01\"&=\x0146;\x012\x165\x15\x14\x06#!\"&=\x01463!2\x16\x13\x11!\x11\x14\x163!26\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x80?,\xfeV,?\x0f\"D/@\xb8@/D\"\x0f\x80p\xa0pp\xa0\x04p\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\xfe\x80\x12\x0e\xfe\xc0\x0e\x12\x12\x0e\x01@\x0e\x12\x01\x80\x12\x0e\xc0\x0e\x12\x12\x0e\xc0\x0e\x12\x12\x0e\xfd@\x0e\x12\x12\x0e\x02\xc0\x0e\x12\x80\xf9\x00\x13\r\x06\xc0\r\x13\x80^B\xf9@B^^B\x06\xc0B^\x01D7MM76]W2@@2W]\x01֠pp\xa0p\xfd\xa0@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\x0e@\x0e\x12\x12\xf2@\x0e\x12\x12\x0e@\x0e\x12\x12\xfc\xb2\x04`\xfb\xa0\r\x13\x13\x04\xcd\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x1d\xff\x00\x06\xe2\x06\x00\x00\x1a\x00A\x00\x00\x01\x10\x02#\"\x02\x11\x10\x12327.\x04#\"\a'632\x16\x176\x013\x16\x0e\x03#\".\x02'\x06#\"$&\x0254\x126$32\x1e\x03\x15\x14\x02\a\x1e\x01326\x04\xe7\xd2\xe1\xde\xd0\xd0\xdeJ9\x16\"65I).!1i\xab\x84\xa7CC\x01\x86u\x03\n+I\x8d\\Gw\\B!al\x96\xfe\xe3݇\x87\xde\x01\x1d\x95y\xebǙV\xa1\x8a/]:=B\x02\xed\x01>\x019\xfe\xc6\xfe\xc3\xfe\xc4\xfe\xc9\x11+\x0132\x16\x15\x14\a\x06\a\x06\x15\x10\x17\x16\x17\x1e\x04%\x14\x06#!\"&5463!2\x16\x03\x14\a\x0e\x01\a\x06#\"&54>\x0254'&#\"\x15\x14\x16\x15\x14\x06#\"54654'.\x01#\"\x0e\x01\x15\x14\x16\x15\x14\x0e\x03\x15\x14\x17\x16\x17\x16\x17\x16\x15\x14#\"'.\x0154>\x0354'&'&5432\x17\x1e\x04\x17\x14\x1e\x0532654&432\x17\x1e\x01\x05\x10\a\x0e\x03#\"&54>\x0176\x114&'&'.\x0554632\x17\x16\x12\x17\x16\x01\xc5 \x15\x01\f?c\xe1\xd5'p&\x13 ?b1w{2V\x02\x19\x0e\x14\t\x05?#\x1d\xfb\xc7\x1a&#\x1d\x049\x1a&\xd7C\x19Y'\x10\v\a\x10&.&#\x1d\x11\x03\x0f+\x17B\x03\n\r:\x16\x05\x04\x03 &65&*\x1d2\x10\x01\x01\x12\x06\x1bw\x981GF1\x19\x1d\x1b\x13)2<)<'\x1c\x10\b\x06\x03\b\n\f\x11\n\x17\x1c(\n\x1bBH=\x02ӊ\x13:NT \x10\x1e:O\t\xb7)4:i\x02\x16\v\x13\v\b \x13F~b`\f\x02e\x15!\x03\x0f}\x01\x1c\x01\x88\x01U\x01\x113i\x1b\x13\x1b?fR\xc7\xfa\xfe\xe7\xd2UX\x03\x1a\x10\x19\x16|\x1d'&\x1a\x1d'&\x02I\x86c&Q\x14\n\f\x06\t*2U.L6*\x05\f/\r\x16\x1aL\x0f:\x0f\x19\x15\x199\x01\x04\x04\x020\x1e%>..>%b>+\x14\x05\x05\x02\x03\x10\v+\xc1z7ymlw45)0\x10\t\f\x14\x1d\x1333J@0\x01!\x11!\x15\x16\v\x1c\x17\x19T\x14FL\xa0\x87\xfe\xee\xe5 P]=\x1f\x10\x0fGS\v\xe6\x01-\x83\xd0kwm\x03\x15\f\x17\x11\x14\t\x13!\xa9\x83\xfe\xe4\xac*\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x18\x00(\x00\x00%\x136&\a\x01\x0e\x01\x16\x1f\x01\x016\x17\x16\a\x019\x01\a2?\x01\x17\x16\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04\xa5\x93\t' \xfc\xa0\x1d\x15\x10\x18\xdd\x02\x01\x15\v\a\v\xfea\x10\x17\x16l\xe0@\x02l\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\xe5\x02\xb5,&\f\xfe\xb3\v\x1c\x19\aE\x01C\x0e\b\x05\n\xfe\x89\xe4\x16h\xa5$\x02\x9b\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\x06\x00\x00\xff\x00\x04\x00\x06\x00\x00\r\x00\x1f\x00/\x003\x007\x00;\x00\x00%\x14\x06\"&5467\x113\x11\x1e\x01\x174&'\x114&\"\x06\x15\x11\x0e\x01\x15\x14\x16 67\x14\x00 \x00547\x1146 \x16\x15\x11\x16\x13\x15#5\x13\x15#5\x13\x15#5\x02\x80p\xa0pF:\x80:F\x80D\x00F\x00N\x00V\x00^\x00f\x00n\x00v\x00~\x00\x86\x00\x8e\x00\x96\x00\x9e\x00\x00\x01\x16\x14\a\x01\x06\"/\x01&4?\x01.\x017&#\"\x06\x15\x11!\x114>\x0232\x16\x176\x16\x17762\x17\x022\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04462\x16\x14\x06\"$2\x16\x14\x06\"&4\x042\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x04\"&462\x16\x1462\x16\x14\x06\"&4\x042\x16\x14\x06\"&4$2\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x062\x16\x14\x06\"&4\x05\x99\n\n\xfd\x8e\n\x1a\nR\n\n,H\x138Jfj\x96\xff\x00Q\x8a\xbdhj\xbeG^\xceR,\n\x1a\n!4&&4&\x01Z4&&4&\xa64&&4&\xfd\xa64&&4&\x01\x00&4&&4\x01\x004&&4&\xfd\xa64&&4&\x01Z4&&4&\xa64&&4&\xfe\xda4&&4&\xa64&&4&\xfe\xa64&&4&\x01&4&&4&Z4&&4&Z4&&4&\x05\a\n\x1a\n\xfd\x8e\n\nR\n\x1a\n,[\xe8cG\x96j\xfb\x00\x05\x00h\xbd\x8aQRJ'\x1dA,\n\n\xfe\xa7&4&&4Z&4&&4Z&4&&4Z&4&&444&&4&\x80&4&&4Z&4&&4Z&4&&4Z&4&&4\xda&4&&4Z&4&&4Z&4&&4&&4&&4Z&4&&4Z&4&&4\x00\x11\x00\x00\xff\x00\a\x00\x06\x00\x00\x1d\x00%\x00-\x005\x00=\x00E\x00M\x00}\x00\x85\x00\x8d\x00\x95\x00\x9d\x00\xa5\x00\xad\x00\xb5\x00\xbd\x00\xc5\x00\x00\x01\x15\x14\a\x15\x14\x06+\x01\"&=\x01\x06#!\"'\x15\x14\x06+\x01\"&=\x01&=\x01\x00\x14\x06\"&4626\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x01\x15\x14\x06#!\"&=\x0146;\x01\x114632\x176\x16\x1776\x1f\x01\x16\a\x01\x06/\x01&?\x01.\x017&#\"\x06\x15\x11!2\x16\x00\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462&\x14\x06\"&462\x16\x14\x06\"&462\x06\x80\x80\x12\x0e@\x0e\x12?A\xfd\x00A?\x13\r@\r\x13\x80\x02@\x12\x1c\x12\x12\x1cR\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x04R\x12\x0e\xf9@\x0e\x12\x12\x0e`\x96jlL.h)\x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16$\t\x1c%35K\x05\xe0\x0e\x12\xfc\x80\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\xd2\x12\x1c\x12\x12\x1c.\x12\x1c\x12\x12\x1c\x92\x12\x1c\x12\x12\x1c\x01\xc0\xc0\xa9u\xc2\x0e\x12\x12\x0ev\x16\x16n\x11\x17\x17\x11\xbau\xa9\xc0\x01\xae\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\xfd\xe0@\x0e\x12\x12\x0e@\x0e\x12\x02\x80j\x96N\x13\x0e \x16\v\v*\v\v\xfe\xc6\v\v*\v\v\x16.t2#K5\xfd\x80\x12\x01\xc0\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12R\x1c\x12\x12\x1c\x12.\x1c\x12\x12\x1c\x12\x12\x1c\x12\x12\x1c\x12\x00\x00\x00\x04\x00\x01\xff\x00\x06\x00\x05\xfe\x00\r\x00@\x00H\x00q\x00\x00\x01\x14\a\x06\a\x06 '&'&54 \x01\x14\x00\a\x06&76767676\x1254\x02$\a\x0e\x03\x17\x16\x12\x17\x16\x17\x16\x17\x1e\x01\x17\x16\x06'.\x01\x0276\x126$76\x04\x16\x12\x04\x14\x06\"&462\x01\x14\x06\a\x06&'&'&7>\x0154.\x01\a\x0e\x01\a\x06\x16\x17\x16\a\x06\a\x0e\x01'.\x017>\x0276\x1e\x01\x03\xe2\x11\x1f\x18\x16\xfe\xfc\x16\x18\x1f\x11\x01\xc0\x02\x1e\xfe\xf4\xd8\b\x0e\x01\a\x03\x04\x02\x01\b\x9f\xc1\xb6\xfeȵ|\xe2\xa1_\x01\x01ğ\a\x02\x03\x03\x01\b\x02\x01\x0f\b\x94\xe2y\b\av\xbf\x01\x03\x8f\xa4\x01/ۃ\xfd\u20fa\x83\x83\xba\x01\xa3k]\b\x10\x02\x06\x17\a\n:Bu\xc6q\x85\xc0\r\nCA\n\a\x18\x05\x02\x10\b_k\x02\x03\x84ނ\x90\xf8\x91\x01XVo\xd7bZZb\xd7nW\xa8\x01\x00\xf0\xfe|V\x03\f\t0\x12 \x0f\t\x03Q\x012\xb8\xb4\x01-\xa8\n\al\xad\xe7}\xb8\xfe\xcfO\x03\t\x15\x18\t/\f\t\f\x04:\xdf\x011\xa7\x8f\x01\x05\xc1z\t\nq\xd0\xfe\xdb%\xba\x83\x83\xba\x83\xff\x00z\xd5G\x06\b\n4(\n\n6\x92Ro\xbaa\f\x0fą\\\xa8<\n\n)4\t\b\x06J\xda}\x83\xe2\x89\x06\a\x86\xf1\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00\x03\x00\x13\x00\x00%!\x11!\x01\x11\x14\x06#!\"&5\x11463!2\x16\x01\x00\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x80\x03\x00\x01`\xfb@B^^B\x04\xc0B^^\x00\x01\x00\x00\xff\x80\a\x00\x01\x80\x00\x0f\x00\x00%\x15\x14\x06#!\"&=\x01463!2\x16\a\x00^B\xfa@B^^B\x05\xc0B^\xe0\xc0B^^B\xc0B^^\x00\x00\x00\x03\x00\x00\xff\x00\b\x00\x06\x00\x00\x03\x00\f\x00&\x00\x00)\x01\x11)\x02\x11!\x1132\x16\x15\x01\x11\x14\x06#!\x11\x14\x06#!\"&5\x11463!\x11463!2\x16\x01\x00\x03\x00\xfd\x00\x04\x00\x02\x00\xfd\x00`B^\x03\x00^B\xfd\xa0^B\xfc@B^^B\x02`^B\x03\xc0B^\x02\x00\x03\x00\xff\x00^B\x02\x00\xfc@B^\xfe\xa0B^^B\x03\xc0B^\x01`B^^\x00\x00\x00\x02\x00\x00\xff\x80\a\x00\x05\x80\x00#\x003\x00\x00%764/\x01764/\x01&\"\x0f\x01'&\"\x0f\x01\x06\x14\x1f\x01\a\x06\x14\x1f\x01\x162?\x01\x17\x162\x01\x11\x14\x06#!\"&5\x11463!2\x16\x04\x97\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\x02s^B\xfa@B^^B\x05\xc0B^ג\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\n\x92\n\x1a\n\xe9\xe9\n\x1a\n\x92\n\n\xe9\xe9\n\x04\x13\xfb@B^^B\x04\xc0B^^\x00\x03\x00\x00\xff\x80\a\x00\x05\x80\x00#\x00'\x007\x00\x00\x01\a\x06\"/\x01\a\x06\"/\x01&4?\x01'&4?\x0162\x1f\x01762\x1f\x01\x16\x14\x0f\x01\x17\x16\x14\x01!\x11!%\x11\x14\x06#!\"&5\x11463!2\x16\x04\xe9\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\xfc\r\x05\x00\xfb\x00\x06\x00^B\xfa@B^^B\x05\xc0B^\x01\xa9\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\n\x92\n\n\xa9\xa9\n\n\x92\n\x1a\n\xa9\xa9\n\x1a\xfe\xcd\x04\x00`\xfb@B^^B\x04\xc0B^^\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x03\x00\x13\x00\x00\t\x01!\x01\x00\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x04.\x012\xfdr\xfe\xce\x05`\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01f\x024\xfd\xcc\x01\xd0\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\x00\a\x00\x00\xff\x00\a\x02\x06\x00\x00\a\x00\x13\x00#\x00.\x00C\x00\xc4\x00\xd4\x00\x00\x01&\x0e\x01\x17\x16>\x01\x05\x06\"'&4762\x17\x16\x14\x17\a\x06\"/\x01&4?\x0162\x1f\x01\x16\x14'\x06\"'&4762\x16\x14%\x0e\x01'.\x01>\x02\x16\x17\x1e\a\x0e\x01\x136.\x02'.\x01\a>\x01\x1f\x016'>\x01/\x01>\x0176&'&\x06\a\x0e\x01\x1e\x01\x17.\x01'&7&'\"\a>\x01?\x014'.\x01\x06\a67\x06\x1e\x01\x17\x06\a\x0e\x01\x0f\x01\x0e\x01\x17\x16\x17\x06\a\x06\x14\x167>\x017.\x02\a>\x043\x167654'\x16\a\x0e\x01\x0f\x01\x0e\x05\x16\x17&'\x0e\x04\x16\x17\x166\x127>\x017\x16\x17\x1676\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x05\v\x0f(\f\v\x0e4\x10\xfeZ\b\x17\a\b\b\a\x17\b\a\x9e#\f#\r&\f\f#\f#\r&\fy\a\x17\b\a\a\b\x16\x10\x01\x8b\"\x936&.\x04JM@&\x02\x16\a\x13\x06\x0e\x03\x05\x03\a\xc3\x03\x17 \"\x06(XE\x13*\f\f\x02$\x06\x01\x03\x03+8\x06\njT\x01?\x013\x03\x13#'.\x01'&!\x11\x14\x163!2>\x04?\x013\x06\x02\a.\x01'#!\x0557>\x017\x13\x12'.\x01/\x015\x05!27\x0e\x01\x0f\x01#'.\x01#!\"\x06\x02\x06g\xb1%%D-\x11!g\x0e\ag\x1d\x0f<6W\xfe\xf7WZ\x01e#1=/2*\x12]Y\x063\x05\x92\xeb-,\xfd\x8c\xfe\x88\u007fC1\x01\b\x03\v\x02/D\u007f\x01x\x02\xbe\x8b\xeb\x06\x10\x04\x05] \x1fVF\xfd\xdc\x1c\x0f\x05I\xfdq\x01\x05\x03\x03\x02-H\x8e\xfe\xbe\xfe\xc1\u007fD2\x01\b\xfd\xd4NK\x04\v\x19'>*\xd8%\xfeR=\x05\x06\x01\ff\x19\r07\x02\x83\x01\x92\xf3=.\r\x18f\f\x1bD\xfd]\\|yu\x11\x00\x00\a\x00\x00\xff\x80\x06\x00\x05\x80\x00\x11\x00,\x000\x00>\x00S\x00e\x00u\x00\x00\x01\x15\x14\x16\x0e\x04#\x112\x1e\x03\x1c\x01\x05\x15\x14\x16\x0e\x02#\"'&5<\x03>\x0232\x1e\x03\x1c\x01\x053\x11#\x013\x11#\a&'#\x113\x11\x133\x13\x054'.\x05\"#\"+\x01\x1123\x166'&\x0554.\x02#\"\a5#\x1137\x16326\x13\x11\x14\x06#!\"&5\x11463!2\x16\x03\x9a\x01\x01\x02\x05\b\x0e\t\t\x0e\b\x05\x02\x01<\x01\x01\x04\v\b\t\x05\x04\x03\x04\x06\x05\x06\b\x05\x03\x01\xfb\xdezz\x01\xb2j\x9f\x1c\x14\f\x9ek-L+\x01\xa9\x05\x03\x10\x12 \x15)\x11\x15\b\x04[\x14$\xa98\x03\x01\x01=\x04\x0f\"\x1d.\x1fun\a\x1e/2 \xb4^B\xfb@B^^B\x04\xc0B^\x02\xe3\xb6\x04\x16\b\x10\a\b\x03\x015\x02\b\x03\x10\x05\x16cy\x01\x17\b\x0f\x06\t\n\x9b\x02\n\a\v\x06\b\x03\x03\x06\x06\v\x05\x0e\xee\x01\xd8\xfe(\x01\xd8ݔI\xfe(\x018\xfe\xc8\x01?\x0eC\x17\x10\x19\x10\f\x05\x03\xfe(\x013\x9b>\x9f\x85\x1d #\x0f\"\x9a\xfe(\x1e$=\x03\x12\xfb@B^^B\x04\xc0B^^\x00\x00\x00\x00\x05\x000\xff\x02\bK\x05\xf8\x00\f\x00\x15\x00\x1a\x00S\x00\x8f\x00\x00\x05&'.\x04'&'\x16\x00\x01\x17.\x01/\x01\x06\a\x16\x13\x06\a67\x014\x02&$#\"\x04\a\x06\a>\x03\x1f\x01\x1e\x03\a&\x0e\x02\a\x1e\x02\x17\x16>\x02?\x01>\x01\x16\x17\x16\a\x06\x05\x06'\x1e\x03\x1f\x01\x1676\x12\x13\x06\a\x06\x02\a\x06\a\x06'\x06# \x00\x03\"&#\x06\x1e\x02\x1f\x01\x16\x17.\x03/\x01.\x06'\x1e\x02\x177676767>\x0176$\x04\x17\x16\x12\x04w\x06\x05\r.~ku\x1f\x11\x9eB\x01R\xfe]\xa8\x19 \x03\x04T%\x05z+\",\x1e\x05\xa0|\xd3\xfeޟ\x93\xfe\xf4j\x1e\x0f<\xa6\x97\x87)(!(\t\x04\x03~ˣzF\x04\x0f8\"{\xf9\xb4\x91%%\x16#\x1a\x04\x0e5\xd0\xfe\xfd\x87\xb6)\x8a\x88}''\x8fx\xc3\xeeJ\x0e\x1aF\xdf\xcf0\"H[$%\xfe\xe5\xfeEJ\x01\x06\x02\x06\x11#%\r\x0e\b.Gk2\x1d\x03\x02\x059(B13\"\b\x13?\xa3@\x02\vS)\x87\x1c5\x0f\" \x9e\x01#\x019\x96\xdc\xe2\xc5\x01\x03\b\x1edm\xabW\x03\"\xd5\xfe\xd6\x02;\x1cL\xb765R\x8eA\x020@T.\x16\xfe\x9e\xa1\x01$\xd4}i`:f3A\x15\x06\x04\x03\x01\x1d%%\n\v\x15BM<$q\xf3:\x06)BD\x19\x18\x10\t\x13\x19a\x18a%\x14\x04`\xa1]A\v\f\x17&c\x01|\x01\t\x87M\xd0\xfe\xebs!\v\x1a\n\x03\x01Z\x01\r\x012}i[\x1a\x1a\fF&\x89\x8f\x83**\x02\x15\x0f\x1a\x18\x1b\x1b\f\n\x1f<\b \x95\x8dʣsc\x1c\"\x0fJ<&Ns\xfeF\x00\x05\x00%\xff\f\x06\xd8\x05\xf4\x00\x17\x000\x00@\x00W\x00m\x00\x00\x016&'.\x01\x06\a\x06\x16\x17\x1e\x02\x17\x1e\a6\x01\x0e\x02\x04$.\x01\x027>\x037\x06\x1a\x01\f\x01$76\a\x14\x02\x14\x0e\x02\".\x024>\x022\x1e\x01\x05.\x01,\x01\f\x01\x06\x02\x17&\x02>\x04\x1e\x02\x17\x1e\x01\x036\x00'\"'&7\x1e\x04\x0e\x03\a>\x03\x05=\x1dGV:\x87e\x12\f\x0f#\x17\x1f:\x1b$?+%\x18\x14\r\v\n\x01q4\xc1\xec\xfe\xf2\xfe\xfa\xf0\xb4g\x05\x01\x0f\n&\x043h\xf2\x01T\x01`\x01Zt\x14\x02\xf3Q\x88\xbcм\x88QQ\x88\xbcм\x88\x01pA\xe7\xfe\xed\xfe\xcb\xfe\xdb\xfe\xfe\xb6P\x1e1\x05L\x8e\xbd\xe1\xef\xf6\xe2\xceK!:<\f\xfe\xd7\xf8\b\x02\x02\x1a}҈`\x15\x17d\x91\xe1\x88l\xbb\xa1b\x02\xf0,\xab9'\x1d\x14\x1b\x17\n\x05\x03\x04\x0f\n\r%%($!\x18\r\x01\xfd\xcb\u007f\xbaa\x183\x83\xc0\x01\x17\xa4)W)x\r\xd0\xfe\x86\xfe\xfe\x9a\f\xa1\xa4\x1b\r\x04\x02\x1fо\x8aQQ\x8a\xbeо\x8aQQ\x8a\x06\x93\xd0c\bQ\xb1\xf6\xfe\xa4ǡ\x01-\xf4җe)\x17U\xa4s2\x8e\xfe\x81\xf4\x01XD\x05\x05\x03\x04\\\x94\xbd\xd1ϼ\x92Y\x02\x1ed\x92\xcf\x00\x00\x00\x00\v\x00\x00\xff\x80\x06\x00\x06\x00\x00\x0f\x00\x1f\x00/\x00?\x00O\x00_\x00o\x00\u007f\x00\x8f\x00\x9f\x00\xaf\x00\x00\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543\x13\x15#\"=\x01#\"=\x014;\x01543%\x11\x14\x06#!\"&5\x11463!2\x16\x01\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x01325\x15\x14+\x01\x15\x14+\x01532\x1d\x0132\xc0p\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10\x04\xb08(\xfc\xc0(88(\x03@(8\x01\x00\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x100\x10pp\x100\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\x01\x00\x80\x10\x10\x10 \x10\x10\x10\xa0\xfa@(88(\x05\xc0(88\xfb\b \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\xf0 \x10\x10\x10\x80\x10\x10\x00\x00\x00\x00\x01\x00/\xff\x00\x06Q\x06\x00\x00\x90\x00\x00\x01\a\x17\x1e\x01\a\x0e\x01/\x01\x17\x16\x06&'\x03%\x11\x17\x1e\x01\x0e\x01&/\x01\x15\x14\x06\"&=\x01\a\x0e\x01.\x016?\x01\x11\x05\x03\x0e\x01&?\x01\a\x06&'&6?\x01'.\x01>\x01\x17\x05-\x01\x05\x06#\".\x016?\x01'.\x01>\x01\x1f\x01'&6\x16\x17\x13\x05\x11'.\x01>\x01\x16\x1f\x015462\x16\x1d\x017>\x01\x1e\x01\x06\x0f\x01\x11%\x13>\x01\x16\x0f\x0176\x16\x17\x16\x06\x0f\x01\x17\x1e\x01\x0e\x01#\"'%\r\x01%6\x1e\x01\x06\x06\x1e\xa7\xba\x17\r\r\x0e2\x17\xba7\r2G\rf\xfe\xf1\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\xfe\xf1f\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1d\x1a\t*\x1d\x016\x01\x0f\xfe\xf1\xfe\xca\x04\t\x1b\"\x04\x1a\x1b\xa7\xba\x17\r\x1a4\x16\xba7\r2G\rf\x01\x0f\xd0\x10\x02\x18!)\x10p&4&p\x10)!\x18\x02\x10\xd0\x01\x0ff\rG2\r7\xba\x172\x0e\r\r\x17\xba\xa7\x1b\x1a\x04\"\x1b\t\x04\xfe\xca\xfe\xf1\x01\x0f\x016\x1d*\t\x1a\x01\xa3!k\r3\x17\x17\r\rj\xa0&3\n%\x01,\x9c\xfe\xc7\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\x019\x9c\xfe\xd4%\n3&\xa0j\r\r\x17\x173\rk!\x06./!\x06>\x9d\x9d>\x01$,*\x05!k\r3.\x0e\x0ej\xa0&3\n%\xfeԜ\x019\xee\x12*\x1f\x13\b\x12\x80\xd6\x1a&&\x1aր\x12\b\x13\x1f*\x12\xee\xfeǜ\x01,%\n3&\xa0j\r\r\x17\x173\rk!\x05*,$\x01>\x9d\x9d>\x06!/.\x00\x00\x00\x00\x02\x00\x00\xff\x00\a\x00\x06\x00\x00\x12\x00&\x00\x00\x016.\x02'&\x0e\x02\a\x06\x1e\x02\x17\x16$\x12\t\x01\x16\x12\a\x06\x02\x04\a\x05\x01&\x0276\x12$76$\x05\xc1\aP\x92\xd0utۥi\a\aP\x92\xd1u\x9b\x01\x14\xac\x01G\xfe\xa3xy\n\v\xb6\xfeԶ\xfc\x19\x01[xy\n\v\xb6\x01-\xb6\xa7\x02\x9a\x02_v١e\a\aN\x8f\xcfuv١e\a\t\x88\x00\xff\x04=\xfe\xa4u\xfeʦ\xb7\xfe\xc8\xc7\x19\x84\x01[t\x017\xa6\xb8\x018\xc7\x19\x16X\x00\x06\x00\x00\xff\x00\a\x00\x06\x00\x00\n\x00\x0e\x00\x12\x00\x16\x00&\x006\x00\x00\x01\x13#\v\x01#\x13'7\x17\a\x01\x05\x03-\x01\x17\a'%\x17\a'\x04\x10\x02&$ \x04\x06\x02\x10\x12\x16\x04 $6\x12\x10\x02\x06\x04 $&\x02\x10\x126$ \x04\x16\x03\xb4\xa33\xaf\xab1\xb3N\x15\xf0\x15\xfeE\x010\x82\xfe\xd0\x01\xda\xf0g\xef\x01\u007f\xbfR\xbe\x02=|\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x01\"\x01>\x01\"\xd3\xec\x8e\xf0\xfe\xb4\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x01\xfc\xfe\xb7\x01^\xfe\xa2\x01v!1f2\x02i\x82\xfeЂwg\xeffZQ\xbeQ^\x01>\x01\"\xd3||\xd3\xfe\xde\xfe\xc2\xfe\xde\xd3||\xd3\x02w\xfe\x94\xfe\xb4\xf0\x8e\x8e\xf0\x01L\x01l\x01L\xf0\x8e\x8e\xf0\x00\f\x00&\xff\x01\aZ\x05\xff\x00X\x00b\x00l\x00w\x00\x81\x00\xab\x00\xb7\x00\xc2\x00\xcd\x00\xd8\x00\xe4\x00\xee\x00\x00\x01.\x03'&>\x01'&'&\x0f\x01\x0e\x03\".\x01'.\x06'&\x06\a\x0e\x03&'&'&\x06\a\x0e\x03\x15\x06\x167>\x0176\x127>\x01\x17\x16\a\x0e\x01\a\x06\x1667>\x0276\x172\a\x06\x02\a\x06\x16\x17\x1e\x026\x04\x16\x06\a\x06&'&>\x01\x01\x16\x0e\x01&'&>\x01\x16\x00\x0e\x01'.\x017>\x01\x17\x16\x01\x16\x0e\x01.\x01676\x16\x13\x16\x02\a\x06'\x0e\x01&'\x06\a\x06&'&'.\x0267.\x01>\x017>\x02\x16\x176\x1e\x03\a\x1e\x02\x06\x01\x16\x06\a\x06&'&676\x16\x13\x16\x0e\x01&'&676\x16\x01\x16\x06\a\x06.\x01676\x16\x01\x16\x06\a\x06&'&>\x01\x16\x01\x16\x06\a\x06&'&676\x16'\x16\x06\a\x06.\x01>\x01\x16\x056\x04/4-\x03\x05LJ\x05\x0eg-\x1e\x03\x04\x02\a\x03\a\x05\a\x03\x03\f\x06\v\b\v\v\x06\x1e$\x1b\x01\x10\t\x15\f\v6\x1e)j\x17\x102%+\x16QF\x1e)\x12\a\x90\x05\x06\x1f\x0e\x1b\x06\x02b\x01\x063F\x14\x04SP\x06\x14\x15\x1d\x04\x02\u007f\a\f21\x11DK2\xfcA\x06\x10\x0f\x0e\x19\x03\x03\x10\x1c\x02W\f\a\")\f\v\a\")\xfd\x15$?\x1a\x1a\f\x12\x12?\x1a\x1a\x05\x04\x13\f8A&\f\x1b\x1cA\x84E5lZm\x14\x81\x9e=\f\x01g\xf4G2\x03Sw*&>$\x045jD \x86\x9f\xb1GH\x88yX/\x064F\x15 \xfbr\x0e\t\x14\x131\r\x0e\t\x14\x131\xac\x04\x12\"\x1c\x04\x03\x13\x10\x11\x1c\x04\xa5\x04\x15\x14\x13\"\b\x15\x14\x14!\xfdl\x10\x0f\x1c\x1b=\x10\x10\x0f6>\x02\xfa\x04\x10\x0f\x0f\x19\x03\x03\x10\x0f\x0e\x19\xbc\x0f\t\x16\x166\x1e\n,5\x01.\x18\x14\x01\x18\x1a/\xb9\xb1'e\x02\x01\x11\x02\x02\x01\x03\x01\x03\x04\x03\x02\r\x05\n\x05\x06\x03\x01\x05\x10\x17\x01\x0f\a\r\x02\x02\x1b\r\x12.*\x1c\x8d|\x90\x01Ed\x04\x02\x1a!\r\x01u\b\v\x0e\a\x0f&\x12\xf3\v&%\x17&\b\xa8\x9f\t\x1d\x01&\x10\xfe\xf9\x1c5d\x18\t\r\x03\x1f\xa8\x1e\x19\x03\x03\x10\x0f\x0e\x1a\x06\xfe\xda\x11)\x18\b\x11\x11)\x18\b\x0366\f\x13\x12@\x1a\x1b\f\x12\x13\xfd\x01\x1cC&\f8B\x14\x13\f\x02@q\xfe\xf9L?\x03P^\x057\t\x01G-hI[\x0eq\x8f\xa1:<\x88rS\tU~9\x177\x15\aA_\x87I\x10R`g\x02p\x141\x0e\x0e\t\x14\x141\x0e\x0e\t\x01\x05\x10\x1d\b\x13\x11\x11\x1c\x04\x04\x13\xfc;\x14\"\x04\x04\x15(\"\x05\x04\x17\x03j\x1b?\x10\x10\x0f\x1b\x1c>\"\x10\xfdT\x0f\x19\x04\x03\x11\x0e\x0f\x1a\x03\x03\x10\xe2\x166\x10\x0f\n,6 \n\x00\x00\x00\x18\x01&\x00\x01\x00\x00\x00\x00\x00\x00\x00/\x00`\x00\x01\x00\x00\x00\x00\x00\x01\x00\v\x00\xa8\x00\x01\x00\x00\x00\x00\x00\x02\x00\a\x00\xc4\x00\x01\x00\x00\x00\x00\x00\x03\x00\x11\x00\xf0\x00\x01\x00\x00\x00\x00\x00\x04\x00\v\x01\x1a\x00\x01\x00\x00\x00\x00\x00\x05\x00\x12\x01L\x00\x01\x00\x00\x00\x00\x00\x06\x00\v\x01w\x00\x01\x00\x00\x00\x00\x00\a\x00Q\x02'\x00\x01\x00\x00\x00\x00\x00\b\x00\f\x02\x93\x00\x01\x00\x00\x00\x00\x00\t\x00\n\x02\xb6\x00\x01\x00\x00\x00\x00\x00\v\x00\x15\x02\xed\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x1e\x03A\x00\x03\x00\x01\x04\t\x00\x00\x00^\x00\x00\x00\x03\x00\x01\x04\t\x00\x01\x00\x16\x00\x90\x00\x03\x00\x01\x04\t\x00\x02\x00\x0e\x00\xb4\x00\x03\x00\x01\x04\t\x00\x03\x00\"\x00\xcc\x00\x03\x00\x01\x04\t\x00\x04\x00\x16\x01\x02\x00\x03\x00\x01\x04\t\x00\x05\x00$\x01&\x00\x03\x00\x01\x04\t\x00\x06\x00\x16\x01_\x00\x03\x00\x01\x04\t\x00\a\x00\xa2\x01\x83\x00\x03\x00\x01\x04\t\x00\b\x00\x18\x02y\x00\x03\x00\x01\x04\t\x00\t\x00\x14\x02\xa0\x00\x03\x00\x01\x04\t\x00\v\x00*\x02\xc1\x00\x03\x00\x01\x04\t\x00\x0e\x00<\x03\x03\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00 \x002\x000\x001\x006\x00.\x00 \x00A\x00l\x00l\x00 \x00r\x00i\x00g\x00h\x00t\x00s\x00 \x00r\x00e\x00s\x00e\x00r\x00v\x00e\x00d\x00.\x00\x00Copyright Dave Gandy 2016. All rights reserved.\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00Regular\x00\x00F\x00O\x00N\x00T\x00L\x00A\x00B\x00:\x00O\x00T\x00F\x00E\x00X\x00P\x00O\x00R\x00T\x00\x00FONTLAB:OTFEXPORT\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x004\x00.\x007\x00.\x000\x00 \x002\x000\x001\x006\x00\x00Version 4.7.0 2016\x00\x00F\x00o\x00n\x00t\x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00FontAwesome\x00\x00P\x00l\x00e\x00a\x00s\x00e\x00 \x00r\x00e\x00f\x00e\x00r\x00 \x00t\x00o\x00 \x00t\x00h\x00e\x00 \x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00s\x00e\x00c\x00t\x00i\x00o\x00n\x00 \x00f\x00o\x00r\x00 \x00t\x00h\x00e\x00 \x00f\x00o\x00n\x00t\x00 \x00t\x00r\x00a\x00d\x00e\x00m\x00a\x00r\x00k\x00 \x00a\x00t\x00t\x00r\x00i\x00b\x00u\x00t\x00i\x00o\x00n\x00 \x00n\x00o\x00t\x00i\x00c\x00e\x00s\x00.\x00\x00Please refer to the Copyright section for the font trademark attribution notices.\x00\x00F\x00o\x00r\x00t\x00 \x00A\x00w\x00e\x00s\x00o\x00m\x00e\x00\x00Fort Awesome\x00\x00D\x00a\x00v\x00e\x00 \x00G\x00a\x00n\x00d\x00y\x00\x00Dave Gandy\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00\x00http://fontawesome.io\x00\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00f\x00o\x00n\x00t\x00a\x00w\x00e\x00s\x00o\x00m\x00e\x00.\x00i\x00o\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00/\x00\x00http://fontawesome.io/license/\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x8e\x00\x8b\x00\x8a\x00\x8d\x00\x90\x00\x91\x00\x8c\x00\x92\x00\x8f\x01\x02\x01\x03\x01\x04\x01\x05\x01\x06\x01\a\x01\b\x01\t\x01\n\x01\v\x01\f\x01\r\x01\x0e\x01\x0f\x01\x10\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01!\x01\"\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01+\x01,\x01-\x01.\x01/\x010\x011\x012\x013\x014\x015\x016\x017\x018\x019\x01:\x01;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01G\x01H\x01I\x01J\x01K\x01L\x01M\x01N\x01O\x01P\x01Q\x01R\x01S\x01T\x01U\x01V\x01W\x01X\x01Y\x01Z\x01[\x01\\\x01]\x01^\x01_\x01`\x01a\x01b\x00\x0e\x00\xef\x00\r\x01c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x01q\x01r\x01s\x01t\x01u\x01v\x01w\x01x\x01y\x01z\x01{\x01|\x01}\x01~\x01\u007f\x01\x80\x01\x81\x01\x82\x01\x83\x01\x84\x01\x85\x01\x86\x01\x87\x01\x88\x01\x89\x01\x8a\x01\x8b\x01\x8c\x01\x8d\x01\x8e\x01\x8f\x01\x90\x01\x91\x01\x92\x01\x93\x01\x94\x01\x95\x01\x96\x01\x97\x01\x98\x01\x99\x01\x9a\x01\x9b\x01\x9c\x01\x9d\x01\x9e\x01\x9f\x01\xa0\x01\xa1\x01\xa2\x01\xa3\x01\xa4\x01\xa5\x01\xa6\x01\xa7\x01\xa8\x01\xa9\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xae\x01\xaf\x01\xb0\x01\xb1\x01\xb2\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xb8\x01\xb9\x01\xba\x01\xbb\x01\xbc\x01\xbd\x01\xbe\x01\xbf\x01\xc0\x01\xc1\x01\xc2\x01\xc3\x01\xc4\x01\xc5\x01\xc6\x01\xc7\x01\xc8\x01\xc9\x01\xca\x01\xcb\x01\xcc\x01\xcd\x01\xce\x01\xcf\x01\xd0\x01\xd1\x01\xd2\x01\xd3\x01\xd4\x01\xd5\x01\xd6\x01\xd7\x01\xd8\x01\xd9\x01\xda\x01\xdb\x01\xdc\x01\xdd\x01\xde\x01\xdf\x01\xe0\x01\xe1\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\xe6\x01\xe7\x01\xe8\x01\xe9\x01\xea\x01\xeb\x01\xec\x01\xed\x01\xee\x01\xef\x01\xf0\x01\xf1\x01\xf2\x01\xf3\x01\xf4\x01\xf5\x01\xf6\x01\xf7\x01\xf8\x01\xf9\x01\xfa\x01\xfb\x01\xfc\x01\xfd\x01\xfe\x01\xff\x02\x00\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x06\x02\a\x02\b\x00\"\x02\t\x02\n\x02\v\x02\f\x02\r\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02\"\x02#\x02$\x02%\x02&\x02'\x02(\x02)\x02*\x02+\x02,\x02-\x02.\x02/\x020\x021\x022\x023\x024\x025\x026\x027\x028\x029\x02:\x02;\x02<\x02=\x02>\x02?\x02@\x02A\x02B\x02C\x02D\x02E\x02F\x02G\x02H\x02I\x02J\x02K\x02L\x02M\x02N\x02O\x02P\x02Q\x02R\x02S\x00\xd2\x02T\x02U\x02V\x02W\x02X\x02Y\x02Z\x02[\x02\\\x02]\x02^\x02_\x02`\x02a\x02b\x02c\x02d\x02e\x02f\x02g\x02h\x02i\x02j\x02k\x02l\x02m\x02n\x02o\x02p\x02q\x02r\x02s\x02t\x02u\x02v\x02w\x02x\x02y\x02z\x02{\x02|\x02}\x02~\x02\u007f\x02\x80\x02\x81\x02\x82\x02\x83\x02\x84\x02\x85\x02\x86\x02\x87\x02\x88\x02\x89\x02\x8a\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x95\x02\x96\x02\x97\x02\x98\x02\x99\x02\x9a\x02\x9b\x02\x9c\x02\x9d\x02\x9e\x02\x9f\x02\xa0\x02\xa1\x02\xa2\x02\xa3\x02\xa4\x02\xa5\x02\xa6\x02\xa7\x02\xa8\x02\xa9\x02\xaa\x02\xab\x02\xac\x02\xad\x02\xae\x02\xaf\x02\xb0\x02\xb1\x02\xb2\x02\xb3\x02\xb4\x02\xb5\x02\xb6\x02\xb7\x02\xb8\x02\xb9\x02\xba\x02\xbb\x02\xbc\x02\xbd\x02\xbe\x02\xbf\x02\xc0\x02\xc1\x02\xc2\x02\xc3\x02\xc4\x02\xc5\x02\xc6\x02\xc7\x02\xc8\x02\xc9\x02\xca\x02\xcb\x02\xcc\x02\xcd\x02\xce\x02\xcf\x02\xd0\x02\xd1\x02\xd2\x02\xd3\x02\xd4\x02\xd5\x02\xd6\x02\xd7\x02\xd8\x02\xd9\x02\xda\x02\xdb\x02\xdc\x02\xdd\x02\xde\x02\xdf\x02\xe0\x02\xe1\x02\xe2\x02\xe3\x02\xe4\x02\xe5\x02\xe6\x02\xe7\x02\xe8\x02\xe9\x02\xea\x02\xeb\x02\xec\x02\xed\x02\xee\x02\xef\x02\xf0\x02\xf1\x02\xf2\x02\xf3\x02\xf4\x02\xf5\x02\xf6\x02\xf7\x02\xf8\x02\xf9\x02\xfa\x02\xfb\x02\xfc\x02\xfd\x02\xfe\x02\xff\x03\x00\x03\x01\x03\x02\x03\x03\x03\x04\x03\x05\x03\x06\x03\a\x03\b\x03\t\x03\n\x03\v\x03\f\x03\r\x03\x0e\x03\x0f\x03\x10\x03\x11\x03\x12\x03\x13\x03\x14\x03\x15\x03\x16\x03\x17\x03\x18\x03\x19\x03\x1a\x03\x1b\x03\x1c\x03\x1d\x03\x1e\x03\x1f\x03 \x03!\x03\"\x03#\x03$\x03%\x03&\x03'\x03(\x03)\x03*\x03+\x03,\x03-\x03.\x03/\x030\x031\x032\x033\x034\x035\x036\x037\x038\x039\x03:\x03;\x03<\x03=\x03>\x03?\x03@\x03A\x03B\x03C\x03D\x03E\x03F\x03G\x03H\x03I\x03J\x03K\x03L\x03M\x03N\x03O\x03P\x03Q\x03R\x03S\x03T\x03U\x03V\x03W\x03X\x03Y\x03Z\x03[\x03\\\x03]\x03^\x03_\x03`\x03a\x03b\x03c\x03d\x03e\x03f\x03g\x03h\x03i\x03j\x03k\x03l\x03m\x03n\x03o\x03p\x03q\x03r\x03s\x03t\x03u\x03v\x03w\x03x\x03y\x03z\x03{\x03|\x03}\x03~\x03\u007f\x03\x80\x03\x81\x03\x82\x03\x83\x03\x84\x03\x85\x03\x86\x03\x87\x03\x88\x03\x89\x03\x8a\x03\x8b\x03\x8c\x03\x8d\x03\x8e\x03\x8f\x03\x90\x03\x91\x03\x92\x03\x93\x03\x94\x03\x95\x03\x96\x03\x97\x03\x98\x03\x99\x03\x9a\x03\x9b\x03\x9c\x03\x9d\x03\x9e\x03\x9f\x03\xa0\x03\xa1\x03\xa2\x03\xa3\x03\xa4\x03\xa5\x03\xa6\x03\xa7\x03\xa8\x03\xa9\x03\xaa\x03\xab\x03\xac\x03\xad\x03\xae\x03\xaf\x03\xb0\x03\xb1\x00\x94\x05glass\x05music\x06search\benvelope\x05heart\x04star\nstar_empty\x04user\x04film\bth_large\x02th\ath_list\x02ok\x06remove\azoom_in\bzoom_out\x03off\x06signal\x03cog\x05trash\x04home\bfile_alt\x04time\x04road\fdownload_alt\bdownload\x06upload\x05inbox\vplay_circle\x06repeat\arefresh\blist_alt\x04lock\x04flag\nheadphones\nvolume_off\vvolume_down\tvolume_up\x06qrcode\abarcode\x03tag\x04tags\x04book\bbookmark\x05print\x06camera\x04font\x04bold\x06italic\vtext_height\ntext_width\nalign_left\falign_center\valign_right\ralign_justify\x04list\vindent_left\findent_right\x0efacetime_video\apicture\x06pencil\nmap_marker\x06adjust\x04tint\x04edit\x05share\x05check\x04move\rstep_backward\rfast_backward\bbackward\x04play\x05pause\x04stop\aforward\ffast_forward\fstep_forward\x05eject\fchevron_left\rchevron_right\tplus_sign\nminus_sign\vremove_sign\aok_sign\rquestion_sign\tinfo_sign\nscreenshot\rremove_circle\tok_circle\nban_circle\narrow_left\varrow_right\barrow_up\narrow_down\tshare_alt\vresize_full\fresize_small\x10exclamation_sign\x04gift\x04leaf\x04fire\beye_open\teye_close\fwarning_sign\x05plane\bcalendar\x06random\acomment\x06magnet\nchevron_up\fchevron_down\aretweet\rshopping_cart\ffolder_close\vfolder_open\x0fresize_vertical\x11resize_horizontal\tbar_chart\ftwitter_sign\rfacebook_sign\fcamera_retro\x03key\x04cogs\bcomments\rthumbs_up_alt\x0fthumbs_down_alt\tstar_half\vheart_empty\asignout\rlinkedin_sign\apushpin\rexternal_link\x06signin\x06trophy\vgithub_sign\nupload_alt\x05lemon\x05phone\vcheck_empty\x0ebookmark_empty\nphone_sign\atwitter\bfacebook\x06github\x06unlock\vcredit_card\x03rss\x03hdd\bbullhorn\x04bell\vcertificate\nhand_right\thand_left\ahand_up\thand_down\x11circle_arrow_left\x12circle_arrow_right\x0fcircle_arrow_up\x11circle_arrow_down\x05globe\x06wrench\x05tasks\x06filter\tbriefcase\nfullscreen\x05group\x04link\x05cloud\x06beaker\x03cut\x04copy\npaper_clip\x04save\nsign_blank\areorder\x02ul\x02ol\rstrikethrough\tunderline\x05table\x05magic\x05truck\tpinterest\x0epinterest_sign\x10google_plus_sign\vgoogle_plus\x05money\ncaret_down\bcaret_up\ncaret_left\vcaret_right\acolumns\x04sort\tsort_down\asort_up\fenvelope_alt\blinkedin\x04undo\x05legal\tdashboard\vcomment_alt\fcomments_alt\x04bolt\asitemap\bumbrella\x05paste\nlight_bulb\bexchange\x0ecloud_download\fcloud_upload\auser_md\vstethoscope\bsuitcase\bbell_alt\x06coffee\x04food\rfile_text_alt\bbuilding\bhospital\tambulance\x06medkit\vfighter_jet\x04beer\x06h_sign\x04f0fe\x11double_angle_left\x12double_angle_right\x0fdouble_angle_up\x11double_angle_down\nangle_left\vangle_right\bangle_up\nangle_down\adesktop\x06laptop\x06tablet\fmobile_phone\fcircle_blank\nquote_left\vquote_right\aspinner\x06circle\x05reply\ngithub_alt\x10folder_close_alt\x0ffolder_open_alt\nexpand_alt\fcollapse_alt\x05smile\x05frown\x03meh\agamepad\bkeyboard\bflag_alt\x0eflag_checkered\bterminal\x04code\treply_all\x0fstar_half_empty\x0elocation_arrow\x04crop\tcode_fork\x06unlink\x04_279\vexclamation\vsuperscript\tsubscript\x04_283\fpuzzle_piece\nmicrophone\x0emicrophone_off\x06shield\x0ecalendar_empty\x11fire_extinguisher\x06rocket\x06maxcdn\x11chevron_sign_left\x12chevron_sign_right\x0fchevron_sign_up\x11chevron_sign_down\x05html5\x04css3\x06anchor\nunlock_alt\bbullseye\x13ellipsis_horizontal\x11ellipsis_vertical\x04_303\tplay_sign\x06ticket\x0eminus_sign_alt\vcheck_minus\blevel_up\nlevel_down\ncheck_sign\tedit_sign\x04_312\nshare_sign\acompass\bcollapse\fcollapse_top\x04_317\x03eur\x03gbp\x03usd\x03inr\x03jpy\x03rub\x03krw\x03btc\x04file\tfile_text\x10sort_by_alphabet\x04_329\x12sort_by_attributes\x16sort_by_attributes_alt\rsort_by_order\x11sort_by_order_alt\x04_334\x04_335\fyoutube_sign\ayoutube\x04xing\txing_sign\fyoutube_play\adropbox\rstackexchange\tinstagram\x06flickr\x03adn\x04f171\x0ebitbucket_sign\x06tumblr\vtumblr_sign\x0flong_arrow_down\rlong_arrow_up\x0flong_arrow_left\x10long_arrow_right\awindows\aandroid\x05linux\adribble\x05skype\nfoursquare\x06trello\x06female\x04male\x06gittip\x03sun\x04_366\aarchive\x03bug\x02vk\x05weibo\x06renren\x04_372\x0estack_exchange\x04_374\x15arrow_circle_alt_left\x04_376\x0edot_circle_alt\x04_378\fvimeo_square\x04_380\rplus_square_o\x04_382\x04_383\x04_384\x04_385\x04_386\x04_387\x04_388\x04_389\auniF1A0\x04f1a1\x04_392\x04_393\x04f1a4\x04_395\x04_396\x04_397\x04_398\x04_399\x04_400\x04f1ab\x04_402\x04_403\x04_404\auniF1B1\x04_406\x04_407\x04_408\x04_409\x04_410\x04_411\x04_412\x04_413\x04_414\x04_415\x04_416\x04_417\x04_418\x04_419\auniF1C0\auniF1C1\x04_422\x04_423\x04_424\x04_425\x04_426\x04_427\x04_428\x04_429\x04_430\x04_431\x04_432\x04_433\x04_434\auniF1D0\auniF1D1\auniF1D2\x04_438\x04_439\auniF1D5\auniF1D6\auniF1D7\x04_443\x04_444\x04_445\x04_446\x04_447\x04_448\x04_449\auniF1E0\x04_451\x04_452\x04_453\x04_454\x04_455\x04_456\x04_457\x04_458\x04_459\x04_460\x04_461\x04_462\x04_463\x04_464\auniF1F0\x04_466\x04_467\x04f1f3\x04_469\x04_470\x04_471\x04_472\x04_473\x04_474\x04_475\x04_476\x04f1fc\x04_478\x04_479\x04_480\x04_481\x04_482\x04_483\x04_484\x04_485\x04_486\x04_487\x04_488\x04_489\x04_490\x04_491\x04_492\x04_493\x04_494\x04f210\x04_496\x04f212\x04_498\x04_499\x04_500\x04_501\x04_502\x04_503\x04_504\x04_505\x04_506\x04_507\x04_508\x04_509\x05venus\x04_511\x04_512\x04_513\x04_514\x04_515\x04_516\x04_517\x04_518\x04_519\x04_520\x04_521\x04_522\x04_523\x04_524\x04_525\x04_526\x04_527\x04_528\x04_529\x04_530\x04_531\x04_532\x04_533\x04_534\x04_535\x04_536\x04_537\x04_538\x04_539\x04_540\x04_541\x04_542\x04_543\x04_544\x04_545\x04_546\x04_547\x04_548\x04_549\x04_550\x04_551\x04_552\x04_553\x04_554\x04_555\x04_556\x04_557\x04_558\x04_559\x04_560\x04_561\x04_562\x04_563\x04_564\x04_565\x04_566\x04_567\x04_568\x04_569\x04f260\x04f261\x04_572\x04f263\x04_574\x04_575\x04_576\x04_577\x04_578\x04_579\x04_580\x04_581\x04_582\x04_583\x04_584\x04_585\x04_586\x04_587\x04_588\x04_589\x04_590\x04_591\x04_592\x04_593\x04_594\x04_595\x04_596\x04_597\x04_598\x04f27e\auniF280\auniF281\x04_602\x04_603\x04_604\auniF285\auniF286\x04_607\x04_608\x04_609\x04_610\x04_611\x04_612\x04_613\x04_614\x04_615\x04_616\x04_617\x04_618\x04_619\x04_620\x04_621\x04_622\x04_623\x04_624\x04_625\x04_626\x04_627\x04_628\x04_629\auniF2A0\auniF2A1\auniF2A2\auniF2A3\auniF2A4\auniF2A5\auniF2A6\auniF2A7\auniF2A8\auniF2A9\auniF2AA\auniF2AB\auniF2AC\auniF2AD\auniF2AE\auniF2B0\auniF2B1\auniF2B2\auniF2B3\auniF2B4\auniF2B5\auniF2B6\auniF2B7\auniF2B8\auniF2B9\auniF2BA\auniF2BB\auniF2BC\auniF2BD\auniF2BE\auniF2C0\auniF2C1\auniF2C2\auniF2C3\auniF2C4\auniF2C5\auniF2C6\auniF2C7\auniF2C8\auniF2C9\auniF2CA\auniF2CB\auniF2CC\auniF2CD\auniF2CE\auniF2D0\auniF2D1\auniF2D2\auniF2D3\auniF2D4\auniF2D5\auniF2D6\auniF2D7\auniF2D8\auniF2D9\auniF2DA\auniF2DB\auniF2DC\auniF2DD\auniF2DE\auniF2E0\auniF2E1\auniF2E2\auniF2E3\auniF2E4\auniF2E5\auniF2E6\auniF2E7\x04_698\auniF2E9\auniF2EA\auniF2EB\auniF2EC\auniF2ED\auniF2EE\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x18\x00\x00\x00\x00\x00\x02\x00\x01\x00\x01\x02\xc2\x00\x01\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xcc=\xa2\xcf\x00\x00\x00\x00\xcbO<0\x00\x00\x00\x00\xd41h\xb9"), } filee := &embedded.EmbeddedFile{ Filename: "favicon.ico", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1549601873, 0), Content: string("\x00\x00\x01\x00\x01\x00 \x00\x00\x01\x00 \x00\xa8\x10\x00\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x907,\x17U\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f?0\x9a\x82&\x1b^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9dA.'\xa0?0\xfb\x82&\x1e\xbbq\x1c\x1c\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e?0\xb1\x9f?0\xff\x88*\x1f\xc3}#\x1b|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d@/<\x9f?0\xff\x9f?0\xff\x8f3%\xc9~#\x1a\xf1y$\x18\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x01\xa3D6\xb9\x9f?0\xff\x9f?0\xff\x9a:+\xe5~#\x1a\xff~$\x1a\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ڨ\x9fR\xbcn_\xc1\xa5C4Ɵ?0\xff\x9e>/\xfe}#\x1a\xf6~#\x1a\xfa|!\x1a'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\xbf\x80\x04ڨ\x9e\xd6͎\x83\xc0\xabI9\xff\xaaI8̠@2\xe2\x80%\x1c\xd5~#\x1a\xff}#\x1a\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ۨ\x9fjڨ\x9f\xff֣\x9a֫I9\xff\xabI9\xff\xabI9\xf8\x8a1(\xc0~#\x1a\xff~#\x1a\xff\x80%\x19>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ժ\x95\f٨\x9f\xe7ڨ\x9f\xffڨ\x9f\xfc\xaeP@\xf0\xabI9\xff\xb1UG\xeb\xb1tk\xc4~#\x1a\xff~#\x1a\xff~#\x1b\xca\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00٧\x9f\x80ڨ\x9f\xffڨ\x9f\xffڨ\x9f\xff\xbeoaȫI9\xffܮ\xa6\xc2Х\x9e\xda~#\x1a\xff~#\x1a\xff~#\x1a\xff}\"\x1aZ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbdh^\x1b\xadUH\xb7\xc0ym\xc6٥\x9c\xf9ڨ\x9f\xffϑ\x87\xc1\xacI:\xd9\xe7\xc9\xc4\xd8\xe7\xc9\xc3\xf9\xabM@\xb6\x923(\xee\x913'\xef\x925(َ9\x1c\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbfk\\\x98\xaeRCƟ?0\xff\xa0A3\xe3\xb5fY\xc0Җ\x8f̬J:S\xe8\xc9\xc6Z\xe9\xca\xc5\xff\xc3qd\xbb\xafL<Õ6)\xf7\x935(\xff\x924'u\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbei\\'\xc0k\\\xfa\xb4[L\xbf\x9f?0\xff\x9f?0\xff\x9f?0\xff\xa0>0\xc1\x00\x00\x00\x00\xff\xff\xff\x02\xe9\xca\xc5\xd0\u2daf\xb6\xb5Q?\xff\xb4O?Ԗ8+\xe7\x935(\xed\x96<-\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0j\\\xaf\xc0k\\\xff\xb9aS\u009f?0\xff\x9f?0\xff\x9f?0\xff\x9e>.B\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xc8\xc5F\xf2\xdfܿ\xb7UCߵQ?\xff\xb5P>\xe9\x9d=.ғ5)\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbfi[8\xc0k\\\xfe\xc0k\\\xff\xbegYϟ?0\xff\x9f?0\xff\xa0?0\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xdbٛ̇y\xbf\xb5Q?\xff\xb5Q?\xff\xb5Q?\xf9\xa5D4\xbe\x965&\"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x01\xbfm`\xa8\xc0k\\\xff\xc0k\\\xff\xc0j\\\xe6\x9f?0\xff\x9f?0\xfd\x9f@00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\xe2\xe2,\xed\xd5\xd1\xe1\xb5Q?\xfe\xb5Q?\xff\xb5Q?\xff\xb5Q?\xff\xaeQ<\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e>/W\xa5J<\xcf՜\x93\xc2\xc0k\\\xff\xc0k\\\xfd\xa0@2\xf8\x9f?0\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xe9褺[JҵQ?\xff\xb5Q?\xff\xb5Q?\xff\xabZN\xb6}%\x1c7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xaa\xaa\x03\xbesh\xa0\xa0?0\xf1ӟ\x98\xcf⸱\xc2\xc1n_\xf8\xa5G8ע<3\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\xe6\xe6\x1fє\x89\xbc\xb5Q?\xff\xb5Q?\xff\xbddUʲf\\\xce~#\x1a\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ک\x9fȟ\x82\xbf\xaaI8ѤG7\xd0\xe9\xc9\xc4\xfd\xe7\xc6\xc0\u05fdrbp\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xd1̀\xb5Q?\xfa\xb6QA\xfd˄w׳h\\\xd0~#\x1a\xff\x80\"\x19R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00㪪\tک\xa0\xe3і\x8b«I9\xff\xaaH9\xcbʍ\x83\xc4\xe9\xcb\xc5\xee\xe4\xc9\xc9\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xf1\xe3\x12\xbc_PÿiZ\xc4ˆy\xff\xb3i]\xd1~#\x1a\xff~#\x1aր@\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ک\x9e|ڨ\x9f\xffԝ\x92ɫI9\xff\xabI9\xff\xacN=\xc8⽺h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2p``ʅx\xe4ˆy\xff\xb6k_\xd2~#\x1a\xff~#\x1a\xff~$\x1ak\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00٦\x99\x14ڨ\x9f\xf1ڨ\x9f\xff֢\x98ӫI9\xff\xabI9\xff\xabJ9\u07b6II\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ےm\aˆy\xdeˆy\xff\xb6m_\xd3~#\x1a\xff~#\x1a\xff~#\x1a\xe8v'\x14\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ڨ\x9f\x90ڨ\x9f\xffڨ\x9f\xffإ\x9c\xe1\xabI9\xff\xabI9\xff\xaaI8W\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ʇxWˆy\xff\xb8ma\xd5~#\x1a\xff~#\x1a\xff~#\x1a\xff\u007f#\x1b\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ק\x9f ڨ\x9f\xf8ڨ\x9f\xffڨ\x9f\xff٨\x9e\xf2\xabI9\xff\xabI9\xcb\xff\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x01ˆyʹoc\xd6~#\x1a\xff~#\x1a\xff~#\x1a\xff~#\x1a\xf5{&\x1c\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ڨ\x9f\xa5ڨ\x9f\xffڨ\x9f\xffڨ\x9f\xffڨ\x9f\xff\xacL;\xf8\xabH9C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00͇xB\xbbpd\xd8~#\x1a\xff~#\x1a\xff~#\x1a\xff~#\x1a\xff\u007f#\x1a\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00٨\x9d/ڨ\x9f\xfdڨ\x9f\xffڨ\x9f\xffڨ\x9f\xffڨ\x9f\xff\xb3XI\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4h^\x9a~#\x1a\xff~#\x1a\xff~#\x1a\xff~#\x1a\xff~#\x1a\xfc\x80!\x1c.\x00\x00\x00\x00\x00\x00\x00\x00۩\x9eGۧ\x9fwۧ\x9fwۧ\x9fwۧ\x9fwۧ\x9fwŃu#\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97H@ ~\"\x1aw~\"\x1aw~\"\x1aw~\"\x1aw~\"\x1aw~$\x19G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xfe\u007f\xff\xff\xfc\u007f\xff\xff\xfc?\xff\xff\xf8\x1f\xff\xff\xf8\x1f\xff\xff\xf0\x0f\xff\xff\xf0\x0f\xff\xff\xe0\a\xff\xff\xc0\a\xff\xff\xc0\x03\xff\xff\x81\x83\xff\xff\x81\x81\xff\xff\x03\xc0\xff\xff\x03\xc0\xff\xfe\a\xe0\u007f\xfe\a\xe0\u007f\xfc\x0f\xf0?\xfc\x1f\xf0?\xf8\x1f\xf8\x1f\xf8?\xfc\x1f\xf0?\xfc\x0f\xe0\u007f\xfe\a\xe0\u007f\xfe\a\xc0\xff\xff\x03\xc0\xff\xff\x03\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), } filef := &embedded.EmbeddedFile{ Filename: "fee66e712a8a08eef5805a46892932ad.woff", - FileModTime: time.Unix(1583454780, 0), + FileModTime: time.Unix(1552969058, 0), - Content: string("wOFF\x00\x01\x00\x00\x00\x01~\xe8\x00\r\x00\x00\x00\x02\x86\xac\x00\x04\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FFTM\x00\x00\x010\x00\x00\x00\x1c\x00\x00\x00\x1ck\xbeG\xb9GDEF\x00\x00\x01L\x00\x00\x00\x1f\x00\x00\x00 \x02\xf0\x00\x04OS/2\x00\x00\x01l\x00\x00\x00>\x00\x00\x00`\x882z@cmap\x00\x00\x01\xac\x00\x00\x01i\x00\x00\x02\xf2\n\xbf:\u007fgasp\x00\x00\x03\x18\x00\x00\x00\b\x00\x00\x00\b\xff\xff\x00\x03glyf\x00\x00\x03 \x00\x01_y\x00\x02L\xbc\x8f\xf7\xaeMhead\x00\x01b\x9c\x00\x00\x003\x00\x00\x006\x10\x89\xe5-hhea\x00\x01b\xd0\x00\x00\x00\x1f\x00\x00\x00$\x0f\x03\n\xb5hmtx\x00\x01b\xf0\x00\x00\x02\xf4\x00\x00\n\xf0Ey\x18\x85loca\x00\x01e\xe4\x00\x00\a\x16\x00\x00\v\x10\x02\xf5\xa2\\maxp\x00\x01l\xfc\x00\x00\x00\x1f\x00\x00\x00 \x03,\x02\x1cname\x00\x01m\x1c\x00\x00\x02D\x00\x00\x04\x86㗋\xacpost\x00\x01o`\x00\x00\x0f\x85\x00\x00\x1au\xaf\x8f\x9b\xa1\x00\x00\x00\x01\x00\x00\x00\x00\xcc=\xa2\xcf\x00\x00\x00\x00\xcbO<0\x00\x00\x00\x00\xd41h\xb9x\x9cc`d``\xe0\x03b\t\x06\x10`b`d`d:\x04$Y\xc0<\x06\x00\f\xb8\x00\xf7\x00x\x9cc`f\xcbd\x9c\xc0\xc0\xca\xc0\xc0\xd2\xc3b\xcc\xc0\xc0\xd0\x06\xa1\x99\x8a\x19\x18\x18\xbb\x18\xf0\x80\x82ʢb\x06\a\x06\x85\xaf\fl\f\xff\x81|6\x06F\x900#\x92\x12\x05\x06F\x00\xd0\xcb\bn\x00\x00x\x9c͒\xdfJ\xe2q\x10\xc5\xe7gje\xe6\xf9>\xc0\"\xea\x03D\xbd\x80\xc8>\x80\b{\xd3E\x88O >\x81\xf8\x04\xe2\x13\x88\x97\x1b,\"\xd1u\xc8^\xec\xa5\b[[[\xf9\xc3\xddj\xfbos\xa6\xf5\xd6_\xbfM\xe8\xa2\xeb%:0g80\xcc\a\x86\x11\x91\x05\x99\xd7\a\xf1B\x17\xef.L\xdes\x8ezðפ 1Y\x97\x8clKWv\xe5\x9b\x1ces\xb9t\xae\xa2)Mk^\x8bZֵ֪\xa9m\xed\xea\x8e\x0e\xd4\u05c9Θb\x9ak̳\xc82\xab\xac\xb3\xc96\xbb\xdc\xe3\x80>'\x9cY\xcaҖ\xb7\xa2\x95\xadjukZۺ\xb6g\x03\xf3m2\x95 \b\xc9\x19\xf9\xfc\x8a(\xea4\xab\x05-iEk\xdaЖv\xb4\xa7}\x1d\xeaX\x95B\xc7\f\xd7Y`\x89\x15\xd6\xd8`\x8b\x1d\xf6\xd8\xe7\x90c\xaa\x899\xcbZ\xc1JV\xb1\x9a5\xace\x1d\xebY߆6\xfeG\f\u0382\xad`3\xf8\x14|\f6\xfc\xab\xd1\xfd\xe8\x8b[uI\x97p\xcbn\xc9-\xba\xb8\x8b\xb9\xa8[p\x11L\xf1\x17\x8f0\x10\x8a\aLp\x8f;\xdc\xe2\x06\u05f8\xc2%\xfe\xe0\x02\xe78\xc3o\xfc\xc2\x18>F8\xc5\t\x8e\xf1\x13G8\xc4\x0f\x1c`\x1f\xdfW\xbfί\xfd\xb6\xf2\xe2\xf2\x82\xf5\"\xa1E^\x0f\xcc_\xe1=(\x1eK,F\x93K\xcb+\xffy\xef\x13b\xf9\xc3\xf3\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02x\x9c\xbc\xbd\t\x80TՕ0\xfc\xee\xbdo\xa9}{\xb5uuuwUWի\xean\xe8njmz-\x9a\x9dnv\x04\x04\xc4\x16E\x91EAA\x10\x17J!*\x88\x1b(\xe2\xdehD\xc92c\x16\xf3%F\x9cʦ\x93Eb\x12b6\xbf\xf9\xda$&\x99\xb8\x8c\x93\xe47\x11\xba\x1e߹\xf7UUW7\r\xe8\xcc\xfc\x1ft\xbdw\xf7\xf5\xdc{\xcf9\xf7\x9c\xf38\xccm\xe68b\x13\xe1\xc1I\x1c\x97\tڃ\xc4\x1e\xb4\x0f\xa1\xbc\x9a\u074c\a7\v\x81S\x9bE\xee\x14G\xff!\xee\x923\x9c\xf8\x8c\x90\xe3j\xc0㔐=\x18w;\xc5P\xb0^I\xa6\x13A;RR\xc9n\x94\b\xc6k\x91\xf8LS\xe1.\x94\xf5)\x8ao8G\x9f([\xb8\xab)\x1c\xf3\b9O,,\xcc\bAt\x81S\x92\n\xfc\x11\x0e\xefh\ny\xaau\xbajZ\a\aupPG\x13x\xecN\v\xaeo\xc6\xc9n\x9c\x88{\xec\xc2ho2\x9dA\xe9D\xdc-r\xd3\xd6]\xb5\xe2\xaau\xd3\xe05\xf1\xeae\x85\xd1^\xa5\x96dM\xb6X\x9b\x108=\x18\x9f\xd7\xe4r5ͻ\x02^Q\\\xf5~\xa1\xa32\x80\xbcV\x970 \x8eo\xe30kC\x0e\xda qA跍\v\xd0\x1f\x82\xae\xd6G\x11<\xc2\n\xb69\xd2\xe1\x00\xefv\xb8`\x18\xdc|N\xfdX\xbdW\xfd\x18I\xe8:\"\xf5'\xd3a\xf5\xd8W\u07baO=}\xfc\xdak\x8f#\x01\xd5\"\xe1\xf8\xb57\xa3e\x11\f\t\x90\xa4%Vs\xc9~\x05-\xbdy$ŵ\xc7\xd5\xd3\xf7\xbd\xf5\x15\xf5X\x84\xce\x06w&'q\x02\xc7\xf9\xb8.n.\xc7E\xec\xa2\xc4K\x16\xdc\x04#\x80\xa2JD\x89ڝn\x18봽\x137\x13\x98\x03\xd1\xe5\xf4\xb8=\xb5|\a\x8ew\x93L:Ӎ2vmrRv:=0P\xb9@D\xfdۓ\x89\xec\xa6V\x84Z7e\x13O\xaa\u007f\x8b\x04d\xb3\x907\xcbH\x10M\xbaSY\xb3|\xf0[o\x88\xed\xf5\x99f'B\xce\xe6L}\xbb\xf8Ʒҗ\xe4V\xf7\x9e\xca\xf6\xae^\xdd+\xe4{W\a\b\x17\xae=\xb1\xa7\xa9uҤ֦='j\xc3\x05\xce,\xcb|\f;\xf4v\x9dA\x90\xcd\xcfo=\xfc\xac0\xc9\x17q8\"\xbeI³\x87\x9b\x1e\x188\x9d\xa7\xb9yZ\x866Ǵo9\xce\xcfq<\fi3\x9f\x82\x16\xc6k\xb1\xa7\x9b\xc0\x84\xd21%\x8f&\x1d\x85\xfb\r\xa1\xfe\xce\x16u\xa8\xfb\xb6k\x17\x84\xc3\v\xae\xbd\xad{H}\xa7\xf0@\u0381W\xe8\u0097^q\xefԷ\xfe\xd14;\x1b\x0egg7\xfd\xe3\xad\xff\xfdN\xe1y\xad\xec/\xc2\xdc\rq\xf5\x1a\x8c\xcaP\x1c\x9d\xb7\x88\x00O\x00ЌL\xc14\x13\x91\xd3q\x8f,\xc0\x98\xf8ԇ\x96\"\x97Sv\xa9=j\x0fL\xa8\v/U\x1f\xacjC\x1f\xbd-w\xcao\xa3\x8f\xdaȍn\x9f\xfa\xa4j\x92̮\x1a\xd3{\xef\x99j\\\xa2\x05\xfd\r\xad\xa9vE\xf4\xb3\xd1k\r\r\xea\xe4\xd9z\xba>p\xb9n=\x85^=\x8a\x18ajID(\xb5\xe3\xdc\xcd\u0de0\xb8\xba\xe2\xf8qu\x05\x8a\xcfF;э\xe85֮\x86s7\v;QC7\xbaU\xbd\xbd[\xfd\x85\xba\xf2\xb5\u05c8\xa1\xd4\xcc\xf8yZIۘ\x13\xe8ػ\xe8*\x8e\x14!$\t\x03\xef\x0edⵄ\xb3\x89\x01Ŗ\x0e\b\xdc-ˇ?\xb7\xfc\x16{\xf3\xccm\xfd\xbb\xd1\xc6\xdd\xfd\xdbf6\xdb\xcfpo\xab\xdf~\xfbmԽw\xd3\xe3\x8fo\xba\xe8\xe1G6M\xcf\xe5\xa6oz\xe4a\xf2--\xfcm\x18\a#]?\x12]?V\xae\x8ek\xe1z\xb8\xf9ܥܵ\xdc.\xee>\xee)\xee\x9f9NH%\x95&T/\xd6 \xa7\xbb\x03\x01\b_\xc0\x8f\xecI\x85Ax\x11\xe4\xd1\xd8\xf8O\x99\xfeB\xf5\x8d]8(\xa7\xf8\xd8.v\x8e\a\xcf)\xbe\x02G=\x04\x9e\xc3\xdcH\x8cP\x91S\xcdU\xa6\xbaP\x99\xb0\xe4>f\x8bF\x84E\x93-G\xa1G\xc7s\x16|\x98\x15\xac\xd2'?\x12~z\xc4I*\x93\xa8\xe3\x96R\xe1|\xe9\x14\xab[`\v\x96\xa7\xc0-V\xce'ݙG\x8dP\x15\x1a3b\x17\x88'\\\u007fR\xe5\x92\xfd\xfdI̞#n\x92;W\f\xe6\xe8\x96ٟD\xf4\x89\u007fT\xe1\x19\xfeѹb8\xb60\xd9^s6,rȥ\xb5\xaa\vi\xad\xb2\x8f\xf1\x8f\x8d\xff\x9f\xf6\x8f\xad\x0fsm15\x1fkk\x8b\xa1,}\x8e\xb8q\xae\xd2Wȝ;\ue4e7\xact\xa3\x00s\xd2\a\xfae\xd9Y\x18q\x92qC/\x98\xa0\xa20\x00\xa1q\xe7\xe2\u007f|\x16>\xf9\xa8\n\x103\xcc\xc2\b\x84\x9d\xe6\xce\x1dW\xe9\xfe/\x8eը\xa1\x80s\xeaF\xce\"\xde\xc9\u007f\x99s\x83\x0f\xce\aI\xacoAHI\xf6 8\x11\xf4\xf0\xa8C\xe2\x9d\xfe\u0084\xbb\xfc\v\xfcw\xa9\x87\xfc~\xea@\n\xbe\x9f\xfa\xc9_\x16\xb0(\xff]h=\xf5\xfb\xfd\xea\xaf\xf0\x03\xe0\x85r\xaf9\xf3\x81\xe0\xe0\x0fp!\x8e\v;\xadH\xac\x8f\xea\x11-[If\xf4\xa3\xcbw;%=\x12\x1c\xacd\xf5\xd7꯵\x92\x90\x02\xaebmH)\x96\xfek\b=o\xac\xbf\\\x8a\x86\xbbh\xfbE\b\xce\xc1i\xda\f7i\x0f:-!mn:`[\x86G\xdc]\x83\xe0\xecGE,\x8b;\x17\x96\xc5s\xb2yH6\x03\x8a2\x04\xe8ƈs\x14\xee\u0557:\x17\ue147\xce\xcaI\x9d\u007f\xa8@\xc8^\\\xdfw\x0e\x84\xac\xb2OV\xceõ\x9e\x05\xb5\x9f\xac\xfd\x85<\xad\x15g?]\xabY{?qK\x8bg\xbcH\x97[\x03\x97\xa2X\x10\x16\xf9\x00\xb4&\x95td\xd2n\x8f[\x94,\xd0\xfaZ\xc0\x13!H\x896#\xc0\x15=n\aݳ\xb5\x1d\x9a\xe2\xd4;O\xa8\xbfW\xffU\xfd\xfd\x89\x9dG\x0e4]]\x17\xb06\xaeٰp\xdf\xf17\x8e\xef[\xb8aM\xa35P\xb7\xbe\xf1\xc0\x91B\xae\u007f]?\xfc\xe1\xdc\xe34\xe5\xce\x13\xc8\xff\xf8\xd7P呂\xa5\xa9\xf1\xea\xc0\x9c7o\\\a\xc9!\u05fa\x1bߜ\x13\xb8\xba\xb1\xc9\x12ؤ\xbe\x82\xe7\x14\xd8\x06\x8d\xd9\x06\r\xff\x842>8\xb2/p\x912\xb8h@\x12\xb1k~ھ\xf1\xfc\xe8B~\xcea\xc9[\x1c\xec\x81r\x9f\xce=Pr8\xaeS\x99\x13e\xe1\xf9\x97\x02sc\xeaF\xd7\rӗ\x85\xd0 \xf4\x97S\xcc#P\xcf\xc8|0z\xe2\x1a\xf0'\x95z\xd1\xe9\x8eS\b\x82\xf5)\xc1\x8c8aFB\xb0FE\t\xfe\xd3V\xc3r\x8dJ\x14\x90\x94(E\x13\x01\x97\x87\xa0fD\a\x03\x16p\xa6\x14\x9a\x80U\x9c\x06\\\x9f\xf5\x10\x16\xb4'\x03h4P\x01\x14\x85\xb6 \t\x82j\x01\xee\x0e\x9dd3}Cv\x86f\x19\xf4\xd5\xf7\xbbM\x96}\x13Zlf\xa9\xe6\xdf,.\xe4\x9f\xd4p\x8f\xc1j1\xde\x1a\x95t\xd6Y\x8ej\xcb\xff2\xdblƗ,U\xb1\xa9\x06\xbd\xef\x01\xb7\xd9<:\xf1\xbdz\xab\xd9t[\x98%\xf6Y!1v\xd3\x1a\x0e\xa1M\xfffrc\u007f:\x12_n\xf2\x19\"\xf7\xea7z\xacw\xc5\xfdv\xf3\xd7m\xae\rz\xe3ui\x83\xd9dt\xad\xac\x8aO\xaa\xc6.3K\xdb\xdcu\xe2\x04\xba\f=\x8d.#Cj\x19n(,\x14THu\xa0\x98\x03_Z\x99\xf4\xc4\t6\x8fq\xc0\x97\xe6\xc1\xf6h\ah\xe7P\x8a4#J\xa6H\xc4%jt\x8e3\x04\xd4M\x14\x82)\xb5#\x11\x11\xa8\x9dz\xd8\x18\x10\x85\xdcz\xba\xb9\xb0dt\xe7\b\xd11Dn~\x99\x179\xcd/\x99\x9dȋ\x1c\xa6\xbf\x99\x1c\xf8\xa3\xe6B\xd6\xec@N\bV?\x84p'r\x98\v\xd9f\x1f:\xa2\v;\xd1b\b\xb1B\xc8QHb\x85$h\xb13\xacCG|\xd8\xcf#v2\xa9y\xded\xb3\x01m)\x9b\x11e\x03\x98\xcf\xc0sv\xba\x9bw\xca~٬\xed\x9bfp\x9e~\xaf\xbbDG\x88\x14\t\xb4r\x11\xae\v0\x94\xe2^Xzˣ\xa6\xdd\xe3\x8e\xf7\xd0Շ\xdc\x12\xc5c\x90\x92\xa1l&\r \\\xf6`\\\xd08HHa\xaf\xa3\x00\x0e\fIC?\xb9\xb3\xfd\xf1\xf6\xbb\xd0\x1b\xb16\xf5\x9b\xf6:5\xebH;\xd4l\x9d\xddވ\x804C\x94\xf8\xe2\x1a\x8f&\xb5\\\xf4\x0f\x05F\xf0\xbe\xbb\xda\xe0\x0f\xdb\x1bjԬ,\xa3|MC\x14\xe5\x19ݔ\xad\x80\x15/\x17f8\x80\xb3ܮ2\xa8\xb8\xec\t\xd8.\x8a\xc0ҍl\n_\x01/\xfc\x80A\xfd\x96\xd1kT\xf3V\x9dΝg\v\a\xfe~T\x86\x99\x03\a\u0382\x1a<`2\xa9\xdf\xd2\xebQ\xd6&;\x19\xdcX\xd4A\a\x8eW@\xda\xf1\xb3@g\x9c\xb6j{\x9c\xb6\x19j,\b\x8a\t\xa2s\xb7uuE\v\r\xa8\a\x9a\x8d\xb2֟\x9e\xb7\xa9\x0f:\xd5A\xb6\xc9\r8,&\x13\xea\xd1\xebռ\r}|\x9e\xa6b\x06\x13\x14\x050\xb3\x95\x1flFQ\x12$px\x05=\xc1\xc8\b4ddm7\xf6\xc8nr\x06u\"\x82N\x16:O\xc2\vu^\x8a\xb2x@\U0005d08d\xaa\xea\x03C\xcaG\xb2\xbe\x94\xe1\x83*\x9c%F\x8c>Tm\xf0\xca?\xad\xd62.\xe4o\xbb\xbbp\xac\xaa\xbe\xbe\xaa\xf0ˮ\x8a1\xb2r\xd5\\T\xc3\xc3١K+L\xc3\u061cc\xd9\xf3\x83\x81\u0090\xd5n\xb3\x05\x02\xc1:\x1c8\xef\xa2\xc7\xcf\xceq\xa8y\xbdN\x8e\xe0\\Dv\xc8j\xfe\x87\xe7[\xf5\xa8ܦDy/\x8a*=H\t\xd5[0\xe0l\x898=\xef\xe3\xf4`\x97D\xbe\x8cd&\xe2<\x9c\xfd\x80\xdaq\x14R\x1b\xed\xf6\xba}\x0f~\xbf\x84|m?9[\xb2Y\r{\xf5H\xb7I\xfd\xc1\x17FP\xb5\x83H\xdep;@\xb8\xc0\xa9Y\x9f\x12\x8b\xd6\xee\xdb[D\xf1\xd6]j\xc0\xfa}\xba*Þ\ahJԆ\xfc'v^\xbb\xf66XD\x95\xf8L\x98\x9b\xc9V\x01\xe6\x82\xf5a@XF\xf6k\xa0<\xe0\x98\x8d\x97\x91\x93\xd2\xc2N\xb2\xae\x94\xf1\x9c.\xe4\xe0\x82\xac\xedpV\xff\x11e\xd5u\xea\a\a\xd4\xff\xd8p\x9b\x9c\xa4\xd3\x05+O\xde;\xf3\xab\x97\xdd\xf1\xa7\x19\xc6F\x00G\xb3\\E\xfb\a\xa1нb\xe0kfy\nz\x14\xc9\a\x90s\xc3\xed\x90\r\r\tX\xfd\x9b\xfa\x95k\xae\xbcM֊P\x92\xf2\xde\xdeY\xb7_g\xbf\xc2#\x13\x99f\x87\x90}{\xb5\x00\xb3\x84Lh.tMV((\xea\xce\xc9/\xe0\xd0\x18\x8c4u\x01\xffX\xba4u\x01\xbf<\x86k%\x9fŅ\xd2\b\x81s=x\x88\x1ff\x1e\xc2Ȍ\xf1ݐ\xe8\x14\xf3P\xae\xef(\xbe.\x1a(\x17\xf7\xd7q\\\x85\xf1\x02+\xa2\x13\x84\xb9\x87i}\xfc\xdcJ\x86/[\xe3\xbc\xc6O\xaf\xa3k\xa5\xce\xd5\xfe\xde76\xbct\xab\x12O\xef\xbad\xb1٧\b\xdc,崅v\x9c\xff\x8b2+\xd5\u05f7\xad TU[\xb6NHN8\xa0W|\xf8\x0f\x01\x8f\xa5fG{\x87ܘlT\x18\xdd_\xe2\xa5\xf5\xd1\x16Z1 \xfe\xae\xd18j\r\xfc`A\xa4\x92\x18\xb6\x1a\xecr\xd6\xd1㼌\x9a\x95`\fh\x04\f\xbd*\x12\x98b\xae\xd3\xf9\r\xf7\xde\xe5#\xd8\xe8\xcc\x1b\xea\xa7ռ\xa0\xfeB\xfd\xb2\xfa\x8b\x17j\xa6\xd5\xdf0s$n\xf9^\xf77\x9c\x9dw\f\xa1$\xeaGɡ;\xf0\xbe\xa3\x0fN\n.\xde\x10\x18A>\x033;M\x97\xaey\x10\x89\x8f?\xae\x9ezpͥ\xa6Ι\x81\x11\xa44\xb0aqp҃G\x1fF\xde\xd7w\xee|]\xfd\x93֯\x00\xe1\xf8!\xc0\xe1ؾ\x05\xc7b\x19v\xe1\xa0q\x138\xabe\xf5+\xea)\xb6\x0f\x8bh.,U~\xf04]\xe1h.\x84P4s\xae\xb6\x06)\xbc\x04\xf8\x1c+k\xe2\xf8\xa5q\xdaD2\xc6u\xb2\x99\xb0\xeb\x03ϸu\xa0\xdcE3\fV\x9f⭯\xf7ҟ\xe2\xb3\x1af\x8cS\xb1\xea8\xbc\xdb/D\xaa]5\xae\xaa\x96ޖ*xWG\x84j\x06\xba\xb0\xdf}\x03\xe6l&k\xcflnçi\x13\x1c\xa9\xc5Pv'\x03\xf46#\xde\xc6\xc6\x01\x85\a\x80\xe8\xb0\xe1(%\xc8\xcb)>q\x8f\xd0E\x9f\xdbo6U+\xd16\xe7\x9cŋ\xe78ۢ\x8a\xcflޏ>\xa7\xfe\xcc\f`\x1a\x95\xea\xa4\xe6\xf0M\xfb\xf6\xdd\x14n\x06'\x8b\xfc\xd9'\x1f\x85\x8czB-t\b\x8a/ꬱ\xa6\x9f\xf9\xfa3ik\x8d3\n\xd0\xdf\xf155\xa9\xeeZ\t1a\x0fo\xe6\xab|+\x91\rőm\xa5\xaf\n\xbc\x9e0$Yə\x18\x91Oa\x9e\xde1\x1aag\x959\x0f\x9c\xb8up\xe2\xb7\xc09Gת+\x94\x92\xe1\x17\x84\x1fb\xb4\x8a=H߀\xee\xdbQ1\x1ch\xb7T\xc8\x1e\xb2\a]\x89\x14Ғ\xd8Q\x0e\xfe\x91\x1c\x90^\x94\xec\xa0?\xc2\xd1\xe7\x19\xae\x90\xe3s9\x1a\xad\xe6ػ\x00\xff\x05\xf8\xd1 \xc2\xd1l\xc3\b\xedB\xc5|4\x16\xe7T\x16N\xf9\xcc\x10\x88YB\x1aL\u007f\x1c\xbb\a,\x9d\rg\xf7#\xca5\x15\xfb\xd2A\xf9㉐=!\xff7~=\xf0/\x10X]W\xf7\x04\xfcuw\xdfZW\xd7\xc3\xfe\x9e\xe8避[\xd9\xdfꞞ\xe3\xabW\xd3d==B\xee\xd4m®\xffҏ\u038bv\xa6?$\xbc\xcb\xf6\xe8\x9a\n\x1eE\x11#\x02\n\xa2L\x89!7\xca\xc3\xe6ط\x9e\xbf!\xa2\xba\xa2\xc9T\xa4\x90RR\xfdI4\x98\xca)\xf8\x87\x11\xdeH#\xfb\xd4l*\xa2:#\x11\xfc\xa3H.\x85\x06\x93\xfd)\xa5\x90\x8e\x96pӇ\xa4\rźR\x17\xaaM\xd0B\x81\xfa\x83=\x91ƅ\x12\x9f\xa0\x15(ǂ\xc3͵\xe8\xcd\b\x8d˥\x86>A\xfb\x92,\xd0_\a\x99\xa02\xfc\x03%\xa55\x9bp\x06\xc0yn\x846/\xe1\xae\xe0\xb6\x02\xc4\x02Mb\xa1t\x17,\xe7L\x12֮\x92\xe9\xc6l\x19+\xf49\xd6\x01Q\xa2Gb]*\xe6\x93D\x0f;\xe6\x01\r\x8f\xba\x05\x91\xb9{PZ\x19!\xe5*\xfc\xe2U1\xb7\xfa\xbe|\xfd\x94\xe1\xb5s\xef\xf3{\xdd\"\x823\x11\x9b\\\xa2g\x82\x8e\b\x98\xf8\x89\xab\x91G\x12χy\xb9\x85G:\x8c-nQg7\xcb\xce`ԏ\x143\xfex\xce\x02\xb7\xfaAx\xe6%ÏU\x1b\x8d\x06\xef\x0e\xf2XMZ\x87&HX9\xfd>o\xb2\xe0\x01s\x15\xef\x02Ga\x10\x1c\xeb\xce\n\xe1\xeb'\xcf\x1a\xbe!\xbblü\xa9\x9d|\xb3EW-\x1a\x9d\xd5\x06e\x83b\x88\xe9\x8c\xf5bxs\xbd\xbeY0\x87\x04\xdf6E\x17\xd2\xeb\x9c>\x9d)\x12\x8cV\xb9\x91H\xf4\x9b\xe7\f߰}\xba\xd5V=\xa3\xceG~\xe3\x0eYk\xcbh\x8b\x9a/;\xb5\xbbۇ\x85\xe2\xbd0\x8a{4.\x00c\x83\xe9\x19\\h`\x01\xe75\xbf\xdf\xe3\nF\xa3A\xb9\xaa5\xa4\xceTg\x86[4\xbf\xcb#\xe4\xf4\xe6\xb6\xfaS\u007f\xafo3\xeb\x02\xe8yuy\x90\xfa\x05=\xf8\xf5\xa5\xbd<'j{\x91\th\xfeN\x8ek\xd06\x13\xc6\xf7\t\x96@1c/\xb2\xac5\f-T:\x9e\x8b`Y\xc7X\x14\x14]\x80\xddg\x18~\x83\xf4\xae\x85\xcfi\x84\xa8l\x1e\xd2p\x97!\xb3\xbce>\xe01x06\xe0?\xec\x8fe\xe7oA\x1c\xdds\xdab\x83\x05\x8d\xf6̪\x03fy\x90b3\x83@B\x0f\xce߂\x03\x94Yq\xd8?\x10;\xc3m)\xca\x01h4s\x90k\x80\x1eP\x91\v\xc0\xa3\x8b\xc8\xc0\b\x02UfW\x15\xf9\xd062\xfb\x83c\xc7>8F\x86(\xcat*G\x9fC\tym\ns\xa9\xb5r\xa2p\xd5\b?\x99\f\x1c\xa3I\xf1\xecC\xeb\x87Y:\x02ϻ&͜9\xe9\xae\xd39T\x96Y\x18\xe1-k\xb8\xdc\x02\x98%\x12\a\xc4)\xa3@\xed|FF\x1d\x88\x12h\x0e\x989*\x8a\x80(\x1fRt\xd5\x03\xc2\xcfK\x80\xf8ǻ\x85T\x12\x0e\xb7\x88\bXM-IP.%\x8d\x14C\"\xfe\xf9\xe7\x82?\x9e,+ˆ\u007f\x80=\xbd\xad\t\xc5\xf4>\xf2\xf6\xa5t\xe4\xf5\xe0\x81\x06\xeb\xd2\x1a\xa7U\xdeg\x15Q\x8f\x9a\xedW\xff\x1c\xe5w#\x8fΥ7\v\u074b\x90\xda\xed[\xeb\xefP\xfa\t\xc2\xed\xffޮ\x8b\x90\x05\xe4'j7\x8f\v\xc37̗\x8c\x069Z\x87\xd7\xe1\x93\x16I\r\xccS\x1f\xb9\xb4\xfe\u007f\xb7O4YkDE\x16\xec\xbc͂\x9aB~\x01\xce`\x83Ig;\xf2m\x82\xdb\xd5\xf7\xab\xdcu\x0e\xa0֢z\x87Sg)\xd2\xd1\xec\xecr\xc1\x0e\u007f\x19\xc7E܉\x80=\x19m\x06\xdaK\x82\xce9\xc5ZD\x18\xee\b]\xc34\x8c\xf5\xd9\xc9\x16~7߉R6Hۂ(\x89\x06\xc9j\x89\xcbi!\x12\x00\x0f\xbcBldpӜ^\xb4\xa3\xa1zz拾\xdbg\xfb\x11F:\xb1qꢝk\x12\xedWl\xed\x8d/С\xc2\xef\xb1u\u007fX2\x8a\x02r\xf3\xe1TsB\xe0נ\xdf\xef\xf6\xac\xf0\xcc\xf8\xccͫڂ\x13\x97t\xa7\x1e}}ƶ\xa7\x9e_5\xe1\x85\t\xeb\xd5k\xac\x014\xff\xba\xde\t\x9dA;oH\x9dL\xea\xb6Ϲ\x04\xbf)\xf9z\xb6.\x99qu\x87\xdf\x1c\xffA\xa2z\xbd\xafyx\xf3j\xdek5\xd5F\xfc-\xae\xb8@\xdelҙ\xf5\x02\x8f\x16c\x19\xf9ڗ\xdcҗ\\6\xb9=\xe0\r\xbd\xfa\xd0\x15O]9\xdd/\xba5ڔ\xa7볝\xe3\\tO\x83\xb5\xe8C\xd1T3\x8ef(i\n]\xa6w\v\x12\xf4P\xc4\xf0\xa4\x1ciQ\xaa\xa7\x9bw\x88γ\xdd=\u007fJ\xb5ߌv\xaeGޮy\xb2\x1c\xfc\xa7[\xda[\xd7\xde\xe3\x17,\xb5\xf7Et&Q\x8f\xabo\xb4c\xb7Â\x90\xfdyb66\x19k\xb6\xfa\xf7MK|\xfd\u058b$Y\xb6\x84z%\x9c\xc4\xc6P\x95\xd9(\x90\xab\xb0^\x10\xf48\x1a7D\xacrK\xb0\xdd\xfc`\xe1\xed%\xfa5\x8b.\xb2:\xf8\xea\t\x19\xe2Ď\x11x=\x05m\xae\xe6n\x81ً\xbb\xad\xdam\x18]\xcbЮ\x1e\xed&\x8c2G\x10\xa5\x01(-@\x97Q7\x06xu3\x10\x15%@\xc9p\xb4\x99\xd0~н\xd8\xe3t\xc0\x1c\x97\x00\x1c\xca\vS\x18\x86]\x82\x8e\x88=\x89)AG\xe1\x9c\x11\xba\x16\f\xd9\xed\xe2\x1bA\x87\xf3Vg;\xfc\x1c\xc1\x05\v*=\x1f\xff$mz\r\xe6-|_\x18E\xc4Z\xa3ˢk\xe4\x9d<\x16\xa25U5\xc4fF\xa2I\x96j\xb0\xfd\xf2\xf8\xbc\x80\x1e\xf1\x82`\x88=\x1f\x16H}\xbf\xfa\xfb)0\x93\xc4~\xf1F\xaf,\"\xcc\x13\xe3\xc3\xc1\x1dN\xb96\xe8k\xb4\xe4\"\xbe\xa7}\xf0\x17Ṓk\x98\xe3\xcfT\xc3\xfc\"$\x98\x8d\bm\x1eZPc\xe1',\xd1ϛ\x8etz\x82\x11\xe2\xf9\x85\x99Յ\xaf\x1e\xb1];+\xe8j\xb2\xc5\f\x16+\xc2NG\x02\xe9\xab\x03>K#\xbah-zp\xed6\\\xed\xf1;y\x93\xd7b\xde~\x15\xf69\xd0.m\x8c\t\xe3\a\\\xc6=\xc4qrq\x1cü\xc7=f\x10S\n\x1d\x146\x88u(\xe5\xa4\xcb\xe0\x1c\xe3؍\x93\x80\x033\x81\xb2\xd1#\x89\xa8\x98\x10\xbd0\x81\xe5\xd3\f\x03\x9d\n:\xddNz{\x02S\xa4\x00\x1eM\xe8]\"\xac\xc0`R\x81\xbc\v\xb5\xb1\x9d\x81.C\xdc\xf6\xa0\xa7r`-\x06\xbb\xd0U{낍\x8dz\x04\x8bn\xdcq\x95\xf4\x04\tt\xc4x\xe3\xc3\r\u007f\xb3ic+Ԛ:3Y\xde\xe7㳙N\x93\xd9*\x90a\x8e\bV\xf3\xd8P\x9e\x86\n\xbb`\xcc1\xe2Q\xa0b\xc8\xe7\xce@f\x11c^X\x989\x9c̼\xfa\xf4\xac\xf1\x87ܶ\xf5\x9f\xef\xfc\x02\x91jtҜY\vӂ\xa9\xdahھ\x8e\x8d\xf9\xa93\xd1\ti\xe2js\x91\xf4\x84\xa8+\\\x17\xc28T\x17v\x8d\x1b\xc8i|\xd7Q<\rv\xbb\xf6߹c\x978\xc5\xf71\x93\x16\x11\x8b\x92-\xa7\x99t\x89\xc0\x98\xab\x8a\xef\x14\xf3\x89\\1\x8e\xa5\xe4\xe1\x99\x1f\x116\xb9\xf2\x02\xce\xffG\xed\xd6\xc4\x13I\xae\xd8n\xe6\x13J\xd2:̇\xff\u007fh\xf7X\x19\x85\v\xf9G\xb7\xbbr\xb4+\xc7\xfa\xbf<\xd2\xffO\xda|a\xf7\xa7l\xf3yxuco\x8f\xed\x17\xf0\x8f\a7狿P\xdf\x11'\x9b\x19j{\x8e\x87\b\xf1\xa7\x98G\x00\xe4\xf7\x14w\xae\x98s\xb9\x87ʥ\xa1\xeb\xc7s\x0e\xff\xb5\xec\xe4\xc7\r\x1d?\x1b\xbb\x8b?kL5>4\xbd\xe7Hj\x12\xb7\x9fv4\xce\x1a\x9d\x9cl\xb6\xe8\xd5!\xbd\x1e\x05\xf4\x16\xb3,\x80\xffc\xd6C\x915\xe54{\xf2ٱ\xee\x914d\x88\x8aR\xd0\xec~\xfa\xb8p\xcf*;9n\x1f\x8b\xbc\u007f\x8d\x9fC%d\xfe\xbb}\x1c\xa0\x1dd\x9cA\v4Q8\xf6i\xbb\x88O\xf8i\t\x9a\xb8\b\xb8T\xfd\xa7\xe8\xa2\xc6gd\xf2\xc3ul\xfe\x18\x15U\xeaS\x89\xb8\xaeA\x88q\x99$.j6U;\xd4MǶ\x17\xb2ۏ\x1dێ\xf3ۏ\xa1\x83\x8ej\x939J\x99D\x8dvAF\a\x8f\x96b\x8em\u007f\x16\x1d\x00\x04\xbaLOI\x1a=`\xe1j\xb9f:\x92\x94>Iǁ\xacJ!\x18\xc8\n\x966T\xacxư\xb5qn\xf3\xe0\xe6̓\xfc\xe6S9\x94\x1dĀM|\xcc\xfa!ґ8X)\x05\xc9\xdbh\xc2ͅ\xbc\x9aͳ\xa4(\x00\x83\xc7\x06\x8c\x87,\x81ӌ\x95\xcd\xe7\x8b2\x8b\x80\xb7\xbf+l\xe0D\xa0\xf2\xaa\xb8\b\xc7\x053Qɕp\xa1$`\xe9\bPt\xa0[\x80\xf4\x86\xf6\xd9\x11 \x1f\x88\xb2\x81\x01\x13D\x1bV\xbe\xbb2\x87op\x1b\xa4\xc2o%x\xe2Z)\x8d\x06\x87\xf3\xea\x80\xf0n\xe4\xa8:p4\x9cN)\xefF Ն\x1c\x19t\xd3T\x067M\xf5\x03u`8\x8f\x06\xf1P*r\x14\r>\xab(\u007f\x8e\x16\xf1O^\x93\xfd\xf0\x8c\xe6tX\x10\xe5i(\x8c\xf1M4!\rt(\xa8>h\xeb\x99\xd5cU\x0f\x06\xd1\x04\xf4<\x9a@\x8a\xb2\x15ܦ\x19ç\x82\x8a\x12$\xe2\x8cM'\xd1\x04\xf5\xe4(\xb9\x12\x99J\x88׳\xbb\xaaQ\x17\xd4܃\xf4\xae\x89<8\xe6Vj\x80\xcfj7P\xf8?Ͼ;\xd4\xf8\xf5\x9c\x90\a\x9a\x87\xf2_\x81\xda!Q\xa5\x9e\xa1\xf5.h|:B\xef\xca)Ӓ\x00\x95\x13\a\x04\x8exܘs\xa2\x1a\xb7_\xe2\x81\xd6\xf3\x03d9\xfb\xd6\xf7aN=\xa9.WO.\x14\xb7\\|\x8d_\x1fO&t\xfek.\xde\".D\xb9p\x105\x053\x1e\x9b͓\t6\xa1`8\xd5\xd7\xf7\xe2I\x15\xfau\xf2\x81\xdb\xf5\xcf\xdc\xfd\xabKj\xeb\xebk/\xf9\xd5\xdd\xcf\xe8wi\xebU\xfc\a\xf4S\x04\x18\x9b\xccus\xb3\xa0U\xdalr\n̥;\x83\xe4ѠMe`\xacT\xb8\xa1\xf2B\x05\x96&\xa0\xfbn¦\\\x82\tg2pd\xc7\xd6\xc3[\a0\x17\xb0\xabO\xdb\x03v\xb4z\xe1\xb1\xed\xc3\f\xcaI\xb6'm%\xc44\xc9\xe2\xf0\xb8\x87\x19\x18\x12\x001}\xd6\x1a\x1b@\x81\u0080:įZ\xa5\x0e\xad\xf2/\x00r\x1d\r@1m\x038_.\xa7\xf0\xe3W\xb4R\xb6\x1f\xab\x92lv(F\x145A\x90ս\xb7\x9a\xa1\x14\x1b~]\x1d*@Qؿ\n\x05V\xf9\xa1\x94\x05\xe5\xf1g\xf7\xe4M܊\xb1\xb2\xb6\x93\xe2\x1a:M\x8f\xa7ʞQZ\xcc㖵\xfb\xcb.\x14\nH\xa2\xecf\xab\x9eJ\xd7wK\xf4\x86\x85I\aA\x97\x85\\\xa9\x8b\xdc\x19\xb3\xec\x9b\xdbf\x107\x97z\xe7\xf0\xfbl\xb2\xeb}5\xc7V\xff\xa0z\xfc\xfa\xed\x13\x89G\xc7\xdb\f\x06\xf7\xe4Ɛ\xe4\nu̻vߋ\xeb\aa\xcb\xf0ɰ\x93\xe3\x90Z(\xf5S6W\v\xbez\xbe\xd4\xcb7e\x83\xd9k\xd3\xe9\xd1[j\x0e\xf6\x8b\xc6\xfc\xee\xbd\xea\v\x1e#6[\xea\xaf\x1a\xd8\xd36i\xc9\xc0\x82\xc5Sڣn\xb6\xc1@\x92d\xa9\xef\xbb`\xae[\x98\xe4\xa0}\xbci\xa5]<{b\xe9N&k\xf7\xf1\xa3\xa5\x1cG\xba[\x9eQ\x83\x99\x88\xa3\xe7\xd4`\x16E\xe7\x1f\x87\u007f\xea\xed\xf5\xaa\x8b\xbc\xdek\xe0\x8d$|'\xbc\xae\xf1\xe2\xd5\xea\xb7GO\xa5\x01\x97\xa7R\x85\xa94\x10\x1d:\ty\xbd\xe8\x9fX\x06\xaf\xfa1d\xa5\x85hz3T\x1e\x9eʷL-\x9e3\x8c\xd5D\xd9G%\x01\x02\xc6Z\n\xba\x9cb锥\x9b3\xe3I\x95\xae陌R\x90^cy\x10,\xf73\x9c\x9c\x04\x1c\x15P!\xe6\xa4\x0f@\x8c\x00ieN\x19q좀FS'}@4\xa2шÏ~\xba\xf4\xf2\xe8\xda*\xf8\x00T\x0f(\xcd\xf8P\xd0\xec\xe8\x18Y+\x97=\x9d!?\x93}>\xb9Ю\xe7+\xa4\xe5\xf5\xc2\xf5\xb2\xc9w*\xeb3\xc9\xf8U\xbd\xa1\xb0\xa2\x84s\x03ƽ\u00a0\xaf\xd0\x0fi\x1a[\xfe9\xaaa\x89\xd2\x19\xb1\\\xdb\xd9u\xe2We\xdfY5\xb7\x9f\xa3\t\x90\xd8\xe4+\xb4\xb3\xb6\xec,\xf2\xbb\xaa\xc6iK\xb2\\\xf3\xe2ʚe\xf9<\xb5\xc1\xe8\x8e\x14\xcf\xfaz\xb3\xb0K\xd8C\xb5&\xf4Hd\xddbktݩ7<\xc1\xa0Gh\xf5\xe0\xcb\n\xb5f\xa7O\xc8\xfb\x9cfp\x85+d<\x8b8\xccY\xf2\xf8\xc2X\xd5\x1f\xae(\xf9ϴ\x00\x86s\x95>!;B\xf5TR@J\tvK\xf5\x9cU\x8b8\x8ab\x1aU\xceH^Q\x1b;O\xb9k\x9eb\x0f%\xd6[Q\x9aH\x87\x0e\x06\x88\xa7O\x99\x0e\x1f\f\x1d\x1d9谉\x8e\xa9\x01\xbf\xca\x1c0r\xf00\xf9\xf0\xab\x06}\xb9\xfc\x12\x9c\x9cU\xbe\xc7>\xfaʔV5^\x8d\xa3\xc1\xe4ܵ\x83\xe3\xe8\xc8\x00\xe1\xa3\x06}ecF\xad\x89\xd1m\x19ۈr\xed\x95\xf5\x8e\xaeqLEl\xbe\xa1\x06\x11\t\"\xc0I5\xc7\xc9ڦ\xc0f\x03U\xcc\b\xad\xc72\x02c\x14\xf6\x84W+\xa6\x05O,\r\xb1\xaf\xf0\aM\x16J\U0005d0676\x9e\x8f\x9ey\x94?*\xfc\x010&N\x8fݚ\xf4xq?\xa2\x1b)\u007f\xb0\xf0>\x96e\xf9(\x9d\t\x1f@\xf9\x1f\xc0qT\xe6\u007fVx\xbf\xf0>sjA\xf0\xa0i\xb42W@\x99W\x16\xcb\xea\xf0U\x83\xf3\xec\x10\xb4{L\xdbГ\xe7K^\fA'\xce96\x1e&\xe7E[\vh8\xa0\x95\xac\xad\x1e\xdaJ*\xb7X\xd1>\x81w\xac\x84yW\xd7\xfd\x16\x9e+\x1d\x0e\xb4\x9eV\x81\xeb\x1c\xc3c\xe5*\xeb\xfd\x0e\xa8Y\xbd\xfa\xb7P\xb5\xc3\x0f\x84\xcc!\x99\xa6\x9b3\xa6\r\x95\xf2^\xed\xdc\f\xc0\x98\xc7\xea\x8d%\x9b\x11\x10\a\"\x1b\xb3\xa2`\b\x9cɒ\x05\x95R\xc0\xf9\x9b\xe9\xe6\xc3cD@\xcb2\xe3ܵG\x97\xfd5g\xf5\xec\x91L6}*X\x9fl틵\xf6\\\xcd\"\x9b\x82\x81\xfa\xf6\xba*\x94\x1b\xd3\xfa\xc1\xb2p9\xfe\xa7\xe5\x87\x16\xfd\xdc\xeb\xb8B4M\xf3z\x93A\xa5\xd9\xed\xdf65L\xa3\xe5.\xd9\xe1\x9a\xd42\xa7k,0\x8c\xf4\x89\xd2^\xed\xa5>\xd9G@\x8f\xf1\xb9\xcb@H\xc6ty\x94\xc4\x1f\xe7\xb0\f\x94\x04Z\a4iepWt\x10\x9f\xd5\xf8A\b\xe4h,8\xd4<{9Ƚ\x83\xc5\x10Ƿƶw\x04\x0eZ\x98\xeeOY\x17\xa4\x19E\xcb<\x17\v\x92\x12\x14\x01\xa2\xfeZ\xe4)\xab\x89t#\x8d/\x03\xf1崐\xaf\\F7ʔ\xd3B>(\x83\xff\xe2&\xba\x906\x05\x8eld\xcbi\xe3\x91\xc0\xd8\x00t\xbd\xe2\xbb/\xf2\xee\x11\xe6=\xf2n\xe4>\x1a?&\x00s\xe7\xca]\x0e@\x13Ν\xbd\x180Z.3Ĥ\xd89M\xf1G\xd26\xc6\x1eX\x10I\xedJ\xa2H\x9dXa\xe5:\xd3\xe7\x92C\x9c}\xc0\xe03\xec\xdd\v\x8f\x03\x06\xfa6\x8c\xf1\xbf~>\xc9D\xf4\xfd\xf13\x95\xfdU\xe7\x17O>[vZ_\x81}ס\xe2\xa1qN!ʃ\xea\n\xba\xbc\u007f-\xcbW\xc2\xfb \xa2\x9b\xfc\x95\xf2\xce\xf3\nS\xfe\f\xf2\xc8Ha)Y\x16\x9a\xf7\xd4'l\xe7g8=\xe7`z\xc1\xc9(bwv\x02\x93\xab\x04\xa0\x82\x86i:2E\x8d\x1d!\xb0\xac`\xd9;x\xed\xf7\x0f,\x1d\xae\xc2\u007f\xbd\xf3Y \xa3\x85\xc0\xce\xd7\xd5ߩ\xff\xaa\xfe\x8e\n=\xc1\x96Іj^ǻ\x8f\xdcQ\xb0^\xbc\xec\xc0\x0f_\xc6\u007fYy`\xf8\xc1\xa7Q\x8f\xfa\xaa\xfa[&aY\x8b\xdaQ\ru\xd1s0{&\x05m胑*\xea\x0e\xb1\xd9\xd5\xf8j)\x8d\xb1\xc6T\xb2\x10C\xac\xa6$\vY\x14Q\x94>*\x86P\xd8\x16\x89\xe0\xbb\xe9}H\x9f\xa2\xa8\xbf\xc1\xf9\xe4\x14\x9c˥\xfa\xd4_\x877\x86\xfb!n?\x13Vا(s\x94\xf5\x90\xa0O\xc3GRB\xbeX\x9f\xc6\xdbbG/*\U000e8d09b\x14\xa1\x90\x8f\x14\xb6E\x93\x89(\x94\x8f\"\x85lrʔ$Ϋ\xbf\x81\xfa\x95dJ\xc1wGp6\x1d\xa1\xcd\xe8\x83\nP\xa4/\x05\xb5#\x05j\x87\f\x85mtC\xe7R0\xc6}B\x96j̣R\xc7\xcaX\x8fv\xf0\x17\xbbI\x11\x97>(\x89j=\xfd\x9a\x15\xc5:\x02E\xe1\xbbC\x99t\x84V\x97:O[h[5\xdc\"u\xe6E\xa83W\xd2\xf5.\rf\xb1[eܫ8\xb6P)\xede\n\x9e0Rԁ\x94\xfed.ُ\x14:~}\x11\x9c\x87\xb8\xadt<)\x8f\xa7/\x12Q\u007f\rc\xdd\xdfO\xe7B\x81\xbeGGp\xce<\x85\xf7\"-G\xe5\xa9-\x02\x1cb\u03a2\xaey3\x8eb\xe8\xab#\x98\xb0\x97\xe85\x95RPCk\x1e{d˚\xee\x90 ح6\x93d\xb2\x92]\xa9\xa7\xf1\xf7\x87\x80\xca\xc2\x1c\x01\xaaL\xa5d\x17\xe2Lu鋶\r\xae\xcdL\x13Cz\xabӮ\xf7\xc1IYs\xf4\xb5;\xd0A\x8a\x89@*n\xd4yڢ\xb5\xc4\xe3\x1e\xc1\xceKˏɩ\xb5\xa0\x12\xdeE\xb7\x17\x8d\xe9\xf6W\x83\xfa\xd5\xfbeM\x98\x16\xaa\xbf\x1f\xf5â\xbf\x8ex\xa8[\xfd*u\x1b\f\xa8\xff\xfe\xa2\x04-z\xdf\xc7җ\x85rizH>\x9b\xc9\xe2\xd2\f\x90\xde\xc72$\x95\xa2\f\x9f\xf9\xcc=\xc2_\x85\xeb\xb5\xf6\x9d\xab\x1d\xe7j7\x93{\x1b\xa7!\xe7h7Ύ\xdb\x10|p\xdcfs%9LA\xd3Q,\xae\xc72\xb0\x96WH\x19\x80(EEug\a\x98\xfe&\xd5/\xa1\n$̃\x06cm$0^(K_\xac\vC]D\xa3\xa1\xc6\xf0\x89i\xb9\xa7\x99\x98+\x9f/\x96TR\x12\xd5hOJ?\xa5\x98N\x8c\x15\x0e\xbe\xe8\x88ޛ j\xaa;\x13\xe1\f쁳\xcf#\x94\xdb\x1bISm0Q\x12\x84\x1f4W\xfb\xb2\xbe\xab\x9aՏ\x18\xa4\xab\x1f5_\x05\xfe\xeafd\x00\xa7\x16\x85\f\xda\"0\x14\xa3ԏ\xd0\x1f \xf8\x1a\x88~D}\x9d\xa9R'\x1e\x81\xf0k \xfe\xd1GK1(\xc1\xb4\xb3_/\xc7T\x9e\a\x94F\x99Ȥ8\x1d\xa5\x1d\u007f\xac\x0e>\x91\x93Q\x1a\x008\xaa\xac\x85\xe0\x16m\xcb.m\xf9\xf8\xcb\x0es\xde\xect\xc2Á\x1d\x06\x83\xe5-\x8b\xc1`wZ\xbea\x91\x85\xb1x\xc8\xe9\xffx\xc5\";ͯ\x98\x9d2\xba\x12o2\x89:\x9dh*\x1c4X\xad\xa5\xbb-hW\x963sn\xa0\x96\xe7P,ɞ\n\xba\xec\xae\"ޗ`7\xccNw8ɐ\xe7D\\\xd3\x1b\xab\xd4\t\xd3(,f鄝\xce\t\xcd\xf4I\xdcM\x06\xd5|؟\xf7\x87ն\xef\xdc\xeak\x82\x99ÿl\x8b5\xf9n\xf9v\f\xbd\x00x\x14L/L\xa7\x86M}\xfd\x92ݻ/\xd9Е\xcbum\xa0.\xf4u\x8b\xe3\xabm\xe8d>\xafNh\xab\xaa\xae&k\x8fԵ-h\x83\xbf\xba#\x83\x14\r+\xc1\x94\xa6q\xb8\xfb\xa5\xdds\x9f}v.\xbc\x1c\x1a\x9fL\xd2\xec8\xccc|\xe5P=/2\xfe,\xa0\xaeT\xe8,\x9c\xa0\\f\x91\xd3x\x80\x88\xea\x0fP!:*\x98\xaa\xe9}\xd2\xcbuL\xe5v\xbayj{C\x00\x1c\xe7\v\xea[\xbf\xdb\t\xab\xcb\xeb\xaa^\xed܋\xa4\xaf\xf9\xb0\xe2lV\xdf\xfd͛C\x0f\xee\xb3\x1e\xf0\xd8Z\x9a\xbak\x9a\x1a\xaa\xb0\x8e\x90\xee9\xdd~\xac_\xf6\xf0+\x9b2_\xfdʗ\x1f\x8a\x1a\xa2\xce\xfa\xa87\xda\x13\xb0\x11%\xa9\\~\xecN\x97\x17V\x9cw\xb5|\xf3:$^\xbafH\xfd\xf6\xa6\x8d-\u009cl\u007f6\xd4\xc8[D\xb3\x14\x9a\x9bn\x97\xf9i\x86D\xea\xfa\x9f>\xb5=\xec\xb0\x12}4b\x88\xda=\xfaU{\xb6\x96x\x1c\xd0C\x91\x83u\x93\x80\xd5:\xf6\x86\xc5\xc96ݨ\x8718\x05\xd8\xc1=\xd1Z\x9e\xde%\x8dܓ\x9d\xe1&\xcd\x1f\x18\x98?i*\x8fV\xec\u07fb\"\xa3\xf9z\x89\xe6\x1b,K\xaf\xf3\xf2\xbc=\x97,\x9e5keb \x87PÒ\xad\xb7}aM)d\xf5\xedŐ\".Aǝ\xa72\xe6An\x12\xacK%\n\xbb\xbe\xc6\x0f\x17%7\x00;\x9b\v\x8dQΤx9:\v\x01\x8eJ'\xa4\xe1\xed\x11s\x87\xdf\xe9\xd2\x04\xaf\xba\xde9\xfc\x19\xf4\x00:\x89\x1e(\xbc\xe8w\xde\xf2\x15\u007f̿s\xa9\x93lt\xeeW\xa3\x85\xbf\xa8\xd1\xfdN\xe7~\xf4+lA\xbfڏ\xb3\xefm[w\xe37\xa8\xca\xf07n\\\xb7\xed\xbd\xd7\xff\xfaW<9\xe6\xff\xca-N\xbf߹t\xa7\xfa\xd3i\xa1?\xa8\xef\"\xf7;\xa1i\xa1w\x90[\xfd\xf3;L\xafvP\xa22\xd9z\xae\x8a\xeb\xe2\xa6r\x17\x01\xe4g\x9a\x11k\xaacl;#\xb4\x9dE\xee*\xa4\xa0b\x17\xb4\xc5\xc18\xd3*\xa5<~\x19h!\xe4\xe6\x19\xfb\x99\x87\x93:\x9cQ\xa2\x19@\xb4qӼek\xa0/\xcf\xe1\xbd#\xbd@w\xa2\xf5ꪫ'\x19\x1c\xa6\x9d\xb6\t\xf7\xfd\xe7r\xa7\xf3\x11\xf4*2_\xbc2mp\b\xbepm\x90\xd8\"Oގ\xbc:\x94wFg\x1cR\xb7\xfdۜ\x93\xe8\xea\x1b\xaf\u007f\xae\xe7\xd2\u007f\x9e\xfc\xfd{z\xf2\x1bh?U\x15_3\xd2\xcd\xff\x90\xf0\xf1\x82\xe9\xe5\x8bm3\xa0ؾ)\xbf\xdc[\xd7_\xf7.\xb2\xd9/\xb3\x99d\x87\x8c\rj\xeb\xdd\xef\xc4\xd1G\x13\xf7̨\xcf.\xfc\xc2+{\x1c\x1f\xbc\xfc\x95\xeb7g\xbf|\xa96w6؟>d\xf0\x14\xa4\x105\x96\xfe;{O\"\xc8-\x95\xa5<\x11\xbd\xec\xe0+\xeejaW2\x1b\xdf2\x9a\x8b\xbb\x92\x99p\xa1\x88\xbd\xa3\xfe\x14W\xdfa\x8f\x84\bg\xef\x9c\xd1y\x046&\xd9B\x1fh\x0f\xfa\xa1I2\x1a%\x8b\x9a1\x98\xcd\xe4\x85S\xb9\x9e\x9e\x9a\xfa\xfa\x1a*\xbe[\x17\x0e\x17Ϥ\x8d\xc2F\xaa\xf7\a۷\x15\xc9%nwT\x8f\x18\xe7\xbb\tQ\xb1\u007f\xaa\x10Ķ!=\xd2\xdc\x1e\x01\x96\xbc00!\xdb\u007fdP\xb0\xe7$\x13O\xac\xa2\xfa\xefj!%\x98\a\xf4\x16l\xd5\x1f\x1f6bd\x00\xb7\x88\xbf\x8d\x88\xca[\b6\xe6,6\xfc\xc8`\u007f^\x18H\xe6\xfb\x8f\x14fɖ\x01\x11\x113\x1aV\v߶[\x06\xf4\xd88|\\\xb2\x99M\x97\xe9Q\n\x11\xe4\xd1\xd9lƜYxj\xb0?KO\xb23\xda\x1d\xc5ٲ\xd0%)\xe8\xf9\xdc\xf5\x1c\xe7)JrGƼQ\xa5\xbf̼)\xee\xc7\x15\xe92c\xe2\"\xa3\x84\x1e\xcb\xe4^\xb0\u0096\x80;\x87\x02\xea\x10\x1a@Y5\xaf\x0e\x8eu\xe3!\xe6\xce\xd1'\xe1h\x88\xe6V\aGTi M9\x1c\xb1\xd2\x02#\x91(ן<\xc54\xd8s\xab{\xb3\xbd\xab\x91\xf6\x82\x10\xad\xde@\x96e\xcbfQ`\x18\xcaGy\xed\r\xa18\x80\x02L\xea\x95\x1a\x1f\x18\xfe\"KB3\xe4+\x82\xe7\x9ef\x06O\x04x\x0e\xd0\xeb\x85\x01\xed\xd9_\xa4c`=\vC@\xc5d\xb8-T\xa7Oj\xe6+\xc4\x14Jw\xd8]\b\x88\x9af1\x9a\xce\xd4\U00089826J\x80\x1c\xe5\xc8 \x1c\x05\xb0\x84-\x95\x12\x0eL\x98\xaf[,\xa7Əv\xceu\xd7&\x12}\x13\x86\x98z\xeb)Aԫyz\x9f\x1dX߶\"\xd9\x1f\xefM\xb6Ww\x14\x93P-蒺\x1fMr\x86k\x9d\xd7\xd9\xe8\r4\xd74L\xedZvɎiZ\x19c\x02K\xb9\xf8\xbaU/N\xcc\xccj\xa8a,\x86a\x8b\x9f\x96\x02\xeb\v!\"Y<\xf5\xcd]\xd1K\xbe\xca\xe2\xa9\x1e\xa2\xfa-\xb2\xbd\x94\xa0\xb6\xb3\xa7\xb9{S\xef\x8a\x1d\v\x96&\x82,\xf3\xa8\x10-\xf9\xc8\xfd\vl\x87\x145\x05\x84\x04V\x94(\xc0\x1e\xa6DSJZ\xa1\x87\xa0\x90\xa1\xe6\x11\xba\x11U\xa4\x93\xb8\x0f\xd5+\xfe6\xa3\xefU\xf5Ԥ)\xf6j\x9e\bȀMXju5xk\x8dO\xbcx\uf1e8\xffk\u007fC\x8f\x93f\xf5\xb3\xea\xaf>\xaf\xfb\xe7\xa9\x16\x1dv;\x10o\xe3\xadĂu)O[\xf3\xac\xd8\xc5H\x8b\x1b\xfc\xfa\xb3%\xee\xee\xb3rJ\xc6\xef\xc8r\xa1ZN\x95\xf8\xc3C\xe2Q\xf2n\x89?|\xd6\xed\x9dx\x90\xf1\x87\xcf\xe2\x06\xe3_B\x19\xb4\xac\x14\x14*k\x8c\xe9gY\xa1\x1an\x94\x833:B\xb5\xac4\x1bWͤ\x13u\xa1Q\x9a\xaf\x9a\xde\u007f\x90\xdd\xfa\x97.\xe2R\xdaM\x9cF\xad2\xc3\x1e\xc4\x0f\xa4>\xbd\xab\x138\xaaG\xa73J<\x06Z\u008a\xb2r\xa7\x8c\xb2Vŗ\xc7Y\x9b~P\xc29\xab\x9aw\xb6;\xd5<\r+\xe4i\x18չ+\xe5\x805\xce\x1bD\xbb\xe8D\x83h\x10p,;ʹ\xddj\xce\xee\xa5\xc2fƼ\x01=䵫9\x8f\a\xb1 \x943\xe5\xf5Ƒ,\xea@\x05\xff('h:\xd4\xed\xd4Ƌ&m\xc1\x17\xdfTkP\x12\xe8\x1dq\xd98\x1f\xc3\U000e8d31\xd6!\xdeä.\x98\xe5\x0e\xf2#\xf6\xfaQ\xd0{\xfa=\xb3\x97\x1c\xa6\xf3=\f4\xa6\xcdV\x8d\xbf\xf4#\x8d\xd1m\xab\xb2\x98x\t\xf1_\xf2)If\xedC\xfb#y\x95\xf3F\xc8\xceN\x83\xad\x95\x8a\xb2\xfb\x8c\ru\x93\x04\x92\x01\xb7\xd9Q\xe7R\xa4\xd2\x1dPQ\xdf\xcdy\xf6\xfdQ\r\xe3u\xe4\xf6\xac:\x9d]\xb5g\xcf*\x04O<\xb8j\x0f\x19,0?\xc9\xd3g`O\xf9N\\Z\x06\xe5\xc8\\\xa3F\xedk\xe7rIݝJ%QM\t$%G\x97/-\xabS_hz\xac\xf7t\xbe>U\x87\x16\x80\x8b\xcf֧\xd4c\xc3\xf9\xd5'\xba\xd4\u007f\x16P\xb1\xe2\x00\xfcfՅԭ\x89\x99\xbeں\x10\xda\x0fo\xd4>x\xe9,u\xab\xc8\xdb\xf9\x8a\xc6P^\x0e\x87\xf3\"\x93\xad\xe1\x18\x10\x8d\xbd\xca\x1d\xb9\xb8\xc5yXdc\xaei+\xaeY\xf9_'\xe9z\xad\xb8\x85\xe5\xb9\xf2\xa5\xab6~(+q$\xaf\xd5U\xba;\x1e{S<\xfa^x\xdc\x02Gn}\xc7\xdc\xf2\x16ou\x8bvXt%\xfd&3`\xb8.:gA\xbb\xa6\x85\x15\xb4'\xec%\x1f\xce\xc1\b\xc0O\xe0\xfe\xc1\x010j\x1e\xaa@E\xe5w\x86\x81\xe2:\x9d\x83\x1d\xef\x14м\x05\x8ejd\x9d\xa6\xabq\x84g\xd1\xcae\xd9\xe9\x95\x06\xff\xa7\xc2\x17\xb5\xba4\x12c\xc4&\x0eū\xa8\x86Y3\xd7]\xa4\xf4*\xb0\xf6tI\xda*\x98\nr6% \xda\xdc\x01\xea&A\x00\x13\xa9R\x85^3\xbc\x06\xb4$\x15\xf2p\xb4\xc5,\u007fa2GÇ\xa8}O>W4\xec7\xfc6Ո\x83n\x0e\u007f7[\xb8Y\xcc\xf5\xa5Nq\xa9\xbe\xbe\x94\bO\xfce\xbfcu/=\xcbcm:&\x964\xfc\xed\x1c\xaaC\xddo\xd3\xcc<\xcc\u007f\xfe\x86}\xb9\xdci\x96A\xa0O6\xe7\xb3ă\x8cN\x9dY\x94\u007f\xa2\xd3\xcc\xc8m\xda\x05:\xc1̲f3\x8eJ\x9e\"\x03M\x93\xc4K:\xc2Ek\x90\x99\x92:e-O\xb2\x9b\a7\xcb\r\x8d\v6\x17\xdf\xe4;k\xec\xfah}\x13\x19x\xcb?\xaf1\xe6/\\\xf6\xc2\xf1g^\u007f\x05\xc5\a\x9fy}7\xba|\x804\xd7\a\xd6\xd8\xcd\x06q\xc1\x92\x8b'\x93\x17\x067o^\xd0\xd8 o.\xbeUξ&\x00\x87\x03d\x8e5\xce\xf3\xe3\xa7v\xbf\xfe\xcc \x8a\xbf\xf2\xfa3\xc7_P\x9f\x18 Mp\xc8\xd9\xd7\x18Ĺ\x8bV\xf4jl\x04\xee\x8cU\xca\t\x1f\xc2\f\xd9a^vqǹ\xd3܈\\\x97\xd6?虽쪰\xf3\xe3:\x8f\xa1\x9fOo\xe6\xa7\xc2\xc8\x0fb2AL2\x88\x12\xf9\xb09\xd0zXv\x85\x8a\x03Q\xf1 V\x16Uq\xf6\xc0^\x01\xe5k%@\xab\xec\xff\x9d\xcc$Ǡ\x88\x1c\x82#\xa1o}\x9f\xf6Ts\x16\xfdcFW}\x9b$y\xb6\xcbF\xc3\xf5\x91\x98\xd1$y^2:\x90\xa7\xbe\xe1\x06\xc9l4\xdc/\x19\xbam\x1e\xd3a\x83\xa5\x9cԽ\x83&\xado\xaaL\xaa3Ѥ\xa6N\xab\xc7\bIq\xee!\x93#\xc1\xefĺ~\x8b\xd3\xe9\xb4\xf4\xeb\xf0N>\xe10=\xf4\x90ٞ\xe0\xf9\xee\xb6bD\xa2A\xe4w\xf0\t\xbb\xf9\xa1O\x9b\xbeh\xca\xe8\fC\xc2\x01\x80\xf9Tѡ\xde\xff\r\x83\x8c\xbc\xa1\x86֩F\xbdI\xaa\xdd.\xad\x90M\x1b[\xbcV\xc3#\x06\xd7Œ\xee3\xd5z\x83e\x9e{\x82\xe2EvceR]\xed\r\xd2\n\x87ecsER\x9d\xd1\xd6\xefn\xad\xf7`{ah\xbf\xcdZ]\xb5\xa5\x8a'3W\xbb0v\xad\x9eIx\xf0V[m\x10Q\xe3\xa1\x118\x1c\xb8\x04\xa2f6\xe0\x194\xceSc%\x1f\xfeWr\x95\xe5F\x18.\x1caR\xaf6\x91a\xc3\xcc\x1c\x10Lv\x120\xe1n\x9e\xb1\b\xe8=\b,L\t\xf0\x85Z\x91B\x1aU\\\x8e\x8a\xa1\x00]\xb1a\x80JX\xbb\xd4L\xd0\xcb\xea7\xffe銛\x1f\rljQƀ\xb4c\x81\x88H\b\xdbj\\\x86\x9b\xef}\x19MG\xb7\xa2\xe9\xb8\xf3ޛ\r\xae\x1a[X@\"\xd5W\x84dNS<\xfc\xe8\xcd+\x96\xaa\xff\xf9\xfd\xf6\xda#(\xb6\xf5\x96;<\xb7\x1d\"w\xab\u007f~o\xafmyL\x0f\x94'\x91D\x91\x97\b\x15\xdbpEb\xdeY?\xdd~\xf7{{\xf7\x16\xf6\xee\xf8\xc9,o,\xe2RD\x04\x91\xbc(J\xc4bC\x92>\xb6ܶ\x87_\xb1dՇw\xcc\xed\x9b\xf9f\x19\xeff\xbas\x9dܦ\x11k3\x88ގ&\xd3\xf4~\xbeL\t\xc1\x11\x0e=\xa5$&\xf4\xab\x1b\xc1\x81Cyd\xb0\"\x9dle\xb0\x9f\u0604\xe9 \x8d\xec\xa7tQRʉ\xea\x9c@\x02*\x1a\xad\x99\xa4\xe1\x8f\u038b\xab\x83\x03\xd9\x01\x9f7\xd2\xe0\xce\xf0JՄpC\xd4\x16\b\x98#5-\x9eV\xe1g\xbbo\xcc\v\xb5!G\xcai\r4\xe5&\xe9\x15\xc0N\xbfpO\xf8\x92\x81o\u07b4խ\x0e\xd1\xfd\x139\xc2k\xdb'y=JS4\xb1\xe4\x8e\x19\xad/\xac;\xac٬\xc1\xb9\xc4\xdc\xf6\x1fv\xacY\xed\xbb\xe13M\x9eiB<\x90\n\x85\x1d\x85\x9c(Yuv<\xfb9_\xadm\xf6\x9c@|zU\x97\x1d\xad\n_<'\x18\x9e;\xd5\xe5^;\xf7\xee#\x13\x9bb})\x9cK\xf5yw\xf7\xa5\xaan\xdc\xd3\x18\x99\xb2o\xdb%\x97\x1f\xe6\xca6\x98\x98,i7\xa5-+v\xb4(\x9bk6\x1ei\x8dc\"Y\x04m\xc4\x04\xaa\xe7\x87=t#WRT\x99\x95\x9e\x88\xa5m\x8e\x89\x8dR\x1b[\xe5\xe3\a\xa0\x86na\x92\xab<\xa4\xe5\xf1j\nX\x9d)G\xa8VX\xb3,\xb7\xfbgB\xab\xa7\xa5&b\x0e\x04lц\xf0\x84*\x85ϸ\x1b\"^\x1f\f(\x1a\x88\xcf\xcb\x1d^\xf7Bk(tǒD\xb4>f\xf4ʭ\x1dk\xc3\xea\al\xd0\x02\ueb79W\xae\u07bc\xff\x8b\xa8\x93(\xfaI\xbc\xa6d\xa9r\xa1U\xc8\xdeU5=^\xa7Df\xdbj}\x17-\x9a\x8d\xed:\xab$\x16r\x8ep(\x15\x88\v\xd3%\x12\\\xb3x\xa9+>w\xb7W\x1b\xb7\u0604\tO\xee\x15\xe6\xaeu\xbb\xa6\xce\r\ag\x17q\x82/\x92,\xa3\xc9\x01W:˺/Ɏ\xb5\xde+\f\x9d\xfa\xde\xd9\xe6y+\xd7&\xd5\u007f\x9dLo)\x9b\t\xa3\xd4\xe9@\xd6[\b\x1c\x9b@\x13e\x8ax\xe6\x18\x9b\xc9b\xaei\xea\xc0\xaau;\xd6\xce\xf2:\xba\x1d\xdeYkw\xac[50\xb5\xe9\x9bx:\x9e\xf6r\xee\x9d\xc2\x03\x8es\xd8S&_Xx\xf3\xecf[b\xeeT\xbf\xdb\xed\x9f:7ak\x9e}\xf3\xc2\xe7\xbfYx\x03\xb7\xbc\xfc<5\xaa\xec\x18\xcf\xdcr\x19'\x17\x03\xb0\x97\xc4(>\x17q\xba-\xb8\x12\xd7p\x15\x03\x8ar\x9a\xed\xb8\x96\x94o\xcc\xcaɴ\x1b2\x9c\xc3H\xb0\x9aU&\xa5I-K\x15\xbd\x94\xf7\x81\xa8\xe5m\xbbh\xe0ɠ\\\x18\xa2\x82\x88YF\x98\xe4\xe9\xb5Y`\x80\x0f\xb8|fM0]63\xcf\xea\xdeB\xb6w5\xe6%#\x8e'i\x16H\x1c(\xda8\b\x00\xb2[\x18*\xe9\x01k\xb8.\xb5E\x05tc&a\x0f\xc1\xce\xc7Nm\xedV\x80JQ\xd4K\x89T\xc8M\xc0\xcd\x0eb\xd7X4\xf4\xfd?\xfe\xf1#4c\xeb왓Q\xc7,<\xfb\x8f\av\xdc5\x1b\xff\x91\x90?J\xd6\xce\t[\xd1\xc9J\xd4s'\xfeڛ\xc9iӒ\x89\xe9Ӈ\x9fC\xf7>\xfa䶵\xbd\x85\xfdh\x8f\xe2\bMz\x02__\x89m2\xde7\xb3\x99b\xa42\xf5HC'\xec\f\x9f\xa0\r \x16j\n,J\x18\x05\x94N؋\xc4\x1d\xa5\xf8\xec\xb0\v\r\x01\x86\a\u007f\x18\xe8Luq\x02\xdbM\xa8Z\xe8W7\xfa\x94'./\x9b^L^\xfe\x04\x1eDL\xb4\x83\xd9%S\xff\t\b\xd1\x1a\x93\xbd\x1a\xbd\xa3\xf8n\xfa\x1e\xe64:O\xe5\xbeW\xa6\xbf\xe8^\x1a\x1d\xcf\xfeo\x8df߷Rпl\x85q\xbc{\xbf\x11\x91\\\xcc\x1aPȖ叙y4*x\xfaBa\xabv\xfd\x87\xf7\xbf k\xa2\x8ax@͗\x04qY\u0092\x10.3\xc8H\x16Q\xa1F\x96\x8f\xdd\x02\xd2|\xf4:r\xc4Ɣ\x87\xc2\xe99`P_\xeeSR\x01L\xa7\xa8\xad\x10\n6b\x8a|jAn~<\x10D\xd7\x1f\xdbN\x15\xd9\x19\xcc\"\xd6\x13u\xa8\b\xb3\xc50\xc0\xf4\x1f\x1d\x1f\x14Q\xa2\x90\xad\x80\\\x9c\xd7 W\xa7\x81u\x99ާ\xb2\xeffn6\xbdoH\x01\xf5玤\x82N\tN'\x97S;\xc1\x10\xbb\xf8)̓vG\xc2vejO\xa4\xc8XJUP\xc5\xe8\as\xcep\xc7\xf9\xef\x9c\xe1\xe6\xdcs<\xb7\xf8\x9e\u05f74\xa6\x94\x9a\xae\xa9}\xdb\x1c\x96a\x98\x92m}S\xbbj\x94T\xe3\x96\xd7\xefY\xdc\x16C\x01h\x19eu\x06bm\xf8\x9e\xa7\u007f20\xef\xf9\x8f\x06~\xf2t\xcd\xf3'r3\xef\xdf:_H7\xd4\xcfM\xa4笜\xaeY\x98\x99\xberN:1\xb7\xbe!-\xcc\xdfz\xff\xcc\\\xacM\xe3a\xd2\xcbP}\x85\xce\x02\xa5l\xea\x00\x9e&pq\xee6\xee\x01*_\x1bU\xa8Y\x04\xed\x99IG\x8b~O\x1a\xba\xc1\xde\xcc_KU8\x9c\x19\x1a\x92FT{\xc2\xe5t\x80\x13\xce(\v\xa6\xb7\x16\xd0av\"CBf\x80\x8a\xce_F\xc9\xd0;Q\x98\xe7n\xecqӳ\xc7B$MU\x1b*r\x8c\x85g,\xf1\x92^\x80\x9fG\x00\x1cD\x12\xc4\x16,I\x88H:7FD\xd4\t\xe2Jl\xd4\xf3\xf0k6\x19\xba\xb0\x1bc'\xbe]\xd3u\xf8\xee\xa3\x0e;\x12\xe5\xe4\x84&\x9d\xa7\x1e\vFb\xb4\x88\x8eF\x93\xadiB\xc0\"\xf9&͙\x15Myk\xe4\x99U\xbe\xf6\xfd\xed\xc6P\xbf\\\xe3M\xf9\x9b\xb2]J\b\xd9\x1d\x8f~\x17q\x95\xfb\x05Z JP\xb7$5K\x84\xd7\xe9\b?\x89\xe71/\x10,#\tK:I\x9c)\xf1D\x82\x1fo\xb3Y\xa1\xc5:\x1eMg\xaa!'\x9fS\xff\xbf$\xb1\x99\x92M\x88 }\x9d\xafÊ\x04\xa3N\xe2\xab\xdd~\xbf$\xb6\xb8Ū\xd4\xe53\xe6\xb7w\xcf\x11\xabm6\xbb]r\u05cas\xba\xdb\xe7O^\x96\n\xdb\xf8\xball\r6\xd9H\x12\x19\xf1\x9d\x95{R\xc9vB\x9e\xcd\x1d\xdb\a\xceo\xbf\x8f\x19\xdaLg(\xb8i\xf7\xebZ\x14\xb5hVd\xc1\x9d˂\xdf\xe7]\x97w!\xae\xebr\x17\xfa<3\xe2\xd7H\x85/\xa9\xe4\xe5\x19\x8e\x1a7Cy\a\xccY\xbeN9\x87\x11\xbf\xb6Y\xb3\xda\xda\xf0@\xac\xb4Lc\x80\xa9\xe6eY\xcd֖\xcfY\xe1\f\xc0\xe0$\xeerz\xce2\xd5d\x8a\x0f\xb2k`\xa6\x96\x0f\x84\x15\xd58v1\x91\x0egI1\x9c\"0\x8e\x8c\x13k\x86~\xb4\xb4,\xa3\xc6c\xd3$\x06\xb5\xb4\f\xb4\xe0t\x06\x14y\x97\xc5h2\xe8\f\x06^/\xcfsv\xfe\xa9\xa3骩m{\xa7\f\xec\x9aT\xe5\xf6\xba\xbd\x97UM~{\xf2\x8bW\xdd\xf6\xf3\xed\xb9\xfdÏ\xdd\xfc\x83ɿm\x83\xb0\xd9k\xddU\xe1ٹ\xa5\xf3\x1e\xfd\xf6\xce\xce?\xb6\xcb\xfd΅s\xe0\x044a\x9b\x03\xbf:\xe1\xee\xeaZ\xffD\x9fg\xa5;\xe2@\xfaV\x8fם\x9e4\xfb\xdf\xff\xe3\xb6\xd8`\x83gل\x1aw]x\xe2/\x90\xf3\xeeg\xd5o\x9e\xceL\xa8\xa9\xb9v\xb6w\xb9'v\xa4\xe1ڟ\x9f\xf8ڔ\x8e\xaey\xad\x86\xb5K<+\xc0Ǟ\xa8\x94\x85\xa0\xba~NF\x9b\x02=ΐ7\x8e.'\xbeh\xbc\x88ٖ\xa5}\xc2t\xdb)v\xcfSK4\xd3Yԉ\xa9\x86\x86\x90s\x1a]kW\xaf\xaaN\xf6\xd4-Я\x99\xbbK\xfd`~k\x88\xd4\x1a\x1dR\xa2-^\xb5\xac\xda\"9BF%`%5\x96\xc9S'\x1b$\x17\xea\xff\xee^\\o\xa9\xd6;\xda\xe2\x9dNKM#_5y\x86\xe8r\x8f\xd9֖\x19\r\x9ej\x9f\x97\x10\xa7\x01\xf2K\xa2\x19g\ueedc\xb8M\xb2dn\b7Y\rn\xbf Nl\x9e\x14\xe0ݮ\x83\x93m\xe1\xaa\x06G\xab\xf8Y\xf5\xb5N\xec\x90̂0\xad9E&W\xeeK\x88\xcab\x89K\xe0|\x9fĸ\x8a\xb0\xf6\xb0\x05\xf1\x1a\xa5JﱵW\x17r{\xd8ݷ\x9b\xf7\x14\xedkQ\xfecZ\\2\xf5R\xd4\xff؛\xeaO\xbf\xa0\xfe\xe7ۡ\xa6\xb7_\xb8\xfah]\xd0\xdfԸ\xf9\xe0\xb4y\xbd\xf3&܈V\xbe\xaa;~\xc7\xfe\x81M\x03\x91\xab/\xe1\u05ed\x99n\xf1߮\x16>\xf8_\x9b\x1e\xe0\xf7\xe1[.\x13\x8c\x9e/m\xe3\x152\xe1\xde\xc5\xcb\xfb\x1e\xfa\x8aA\t\xdfq\xfcJ\xd7\xe4\xeb{\f\x8c>\xb8\xf4L\x8e\xfc\v\xe0M\x8c\xff\xcd8\x84A\x12\xa2\xf6f\xec\xda]\x1b\xf9\x97'\x96v\xa2HTUO\x9c\xe1μ\xf1Ń\xc2\xdf\xd4\u007f̚u\\\xfdeA\x8f\xff\x8eb\xbf~\xe9u\x8e\xe9:\x9fy\x8e\xcd\xeb\x12n\x15w\x05\xb7\x81\xbb\x9e\xdb\xc9\xdd\xceݥIٸ\x9c\x9c$j[Q\xb4\x9b\xa7\xd4\x1a\x1c\x98V*b\xdd\f聇nE\xc4C\xd1\x04*\x01\x82Z\x00ɭE\x94o\x04?҃\xd8&\ak=\x95t\xc8\xe5#\xb7\xf2=\xcaK\x8f\xe6\xa4T\xefrf\xe2\x19\x1aW\x12\xdcQ\u007f\xf3\xa7j\x1fJN^yٔ\x86\xf9\x91\x89\xfe\xf5Q\xe5\x92W/\xb1\xa5\xae\xf3O\x8c\xcco\xc8^\xb6rr\xd4\xe0j\xed\x9d\xe2\x91;\x9cN\x97M4I\x92\xbb\xc9`0wϚ\xea\xf6 _\xf5\x9f\xd4ߜ\xb8\x88\x18\f\x84\x18\xf4!Io\x10\xe1\x17\xd6\xebuz\xbd#\xae3\x99tz\xb3i\n\xb1\x01\x8dk\x9dj\xb7\xd9m\xed\xd8f\xe3\x03L\x12\xe8'\xa7\xd5k\xe7\n^\a9\xd8u\xd9Dћ\x9e\xbf\xfb\xa2\xed\xcbVn\xd1Ǽ^\x9f\xcf\x18\x98\xa8߲r\xd9\xf6\x8bn_\x90\xf6\x8a\xe1\xa9\x06CSC \xc6\x13\xbd\xc5\"\b\x866\x8fGi1#\x9eW\xd6\xf2\x0e\xaf0\x17=p\xfa'\xe8\xb2\xe1]\x92@\x048z}\x82Q/\nF\x83\"\x99̒\xe0\v\xeb\x8c&=\xfclF\x81w\xf3\xa2d\xc6F3v\x191\xf1\xeaF\xdduDFY\xa6V\xe8\xa4'F\xdb\xeb\xa1\xd8\x18`.bN\xf1\xc1\x19u\xe8䡁\x91\x8f\f\x00V\xcel\xee\x90|I׀\xda\xe4ɷ\xc5*\xac\x1e~\x83\x9a\xe4)\xf1\xec\x8b\xdfZ\xa9*\xda!+\xf1\xa6\xcbu\xb9\x18\xd4Qv\x87\x9d\xe9C\xd0M/\x93\xa2vԂ.q\x88\xeec\x9a\x92\xadY\x16s\xb2\xd9,\u007f\f\xcf\x01\xc4\xe5\x10\x94\xbb\xbawD\xad\x16\x82\x87\x86\xcc\xf2iN6\xe3\x81\u00a0Y\xa6\xe6\xd2r\x9aL\x8c\xa0\xe9\x00\a\xa9U߲\x06\xb0[cr\xd2c\x84q5)\a\x13V\x9f\xdb!\x94c0\x17\x1e\x8931;\xf4\x9aB0ތeG͝Ua\xecV\xbf\xf9NU\xd0e\xf7\t\x83(\xbc\xe5\xba;\xb1\x19;\x1d\xfe\xfb|\x11d\xfa\xb2\xfa;\xf5\x96_T\x85\x9c\x0e\x1fA\"\xfa?/}\xf3M\xa4i\t\xab\xdf\xf3;]\xc1\xaaw\xd0t7\x0eW\xddY㰛\xef\xbcn\x8b\xfa\xd6\xd3\xd5Ng\xa8\xea\x17h7\xaa\xf9\xb2\x19E\xaa\xee\x03B\xc9\xfc\xe67_R\x83E=S\xaex\xb7V\xc75P\f\x87\x1bs\xbf\xe6\x19\xfbm\x99`\xc9\xfcržYa\xad\x96\xb7\xb5\xf4\xb6\xb4\xf4\xa2\x16\xf6z\xaaRa\xf9t\x9c\u007f\xfc\t\xdek\x19\xfe\x8b\xc5\xcb\xf3_\xd2F\xda\xf6=\xfb\xaa\f\xb1dVٿgC\x97\xf5j\xd9\xe8߇%\x83\xcbT\xd5\xfb}\xf4[\xb3\xddn.\xdcZ$\x91\xb3Uq\xbc:\xd5ۛ*<\x1dgg\xc0n\xc6Gh\xe6\x92\f\x1a(U\b?.b\x81=Ђ\xe0\x98\xb6 z\xae\xa73ek\xe7\x01\n4\xc4\xce\tv^\xccQVJ\u007fR\xbdT\xdd\xd6\xde\xcb+N\xd11\xa9E\xa9y\xf6\v\xcd\xd2D\xb9\x9a\x18\xec;Y\x9dC\xe8+\xe8\xf5d\u007fN\xbdA݇n$9\xc6\xf7M\xf6\xa3\x95Ay\xf5\x86hpJ\xa2\xa3\xa1\xb6=^\xdd蹭\xf3\x86%[ҫ{\xa9\x8d\xd1\\\u007fr8L^R\u007fڠ\xfe\xa5\x91\xf1\x9d\xb2g8\x91ޥ\x19\x01~\xa7\x00a\x9ed8U=\xa5gP\x90\xb3'\x9b\x011\xc0.\x1b#l\xd8\a\n\xe8\x10\xd3=ΑѬzR6\x92\x83np\xe4~[\xc7E\x81\xabf\x17n\x10\x9c\xeaG\xad+\x1ey\xe9\x91\x15\xad|\x1e:\x92\x85\x05\xa6f\x93\xfd\xf1E˻\xa2\u007f~E\u05f6\xa0M\xf7ʟ\xa3]\xcb\x17\xbd\x10\xb8\xa8\xc3f\x9b}\x15jE\x13\xb03\xb1qMOϚ\x8d\x89\xc2{\xea\xc9d?]u\xfd\xc9\xc6U\a?\xf7\x97\xbb\x0f#\xc1/;\xe9\xf2s\xca~\xf5\xf4\xe1\xbb\xff\U000b90ebؚǀK\xaa\xc2-\x8c6\x03\xcaB\xb4\xb2'\x15闘̵\xc4L\xac\xd3g\x0fc\xa1\xd2g&\xad=\xeb\x98\xd5G\xfa\xf4\xb8\xb5'\xcd\r\xf9\x85\x81}\xb5\x06S\xec唩\xae\xa6\xe1\xa5VC\x83I\xaas\xdey\xa7\xbf\xb1\xc1\xd0\xfaRCM\x9d)\xf5r\xccd\xa8\xdd7&UC͝w\xd64\x8cN\x83sc\xb2a7\xcdfl\x18\xc9\xd6\xe8\x1f]t\x83\xc1Tw\xf7ݵFè4\xe5o\x92\xd1u\x9e\xe2֍\xe5\xa72\xa9B\xaa>#\x15o7(\x83\x10\xf6\xbdJ~j\x89E(\x16\x19\xaaEM\xde\x12\xae\xd1-P<\x93\xd7n}\x82en\xaapt^\xbc\x90\xaf\r\xd7^<\xd3\xdb\xeb5\xc7fͬ\x9d>3\x10\x98\xf5\xca\xf7\x16\x1e/rQQ\x1f@\xe2\xc3W\x1fヌ\x93\xfa\x99\xe3\x9f\xed(\xb2Q\x03\x06\x8f\xd7Um\xf1\xe2)!s\xac\xbe\xa5G\xb9\xe5\x197\xba\xa1\x92\x99ꜜZ\xdc4\xb5\xeb\xee\t\xae\xec\u0085U\x93\v\xb9l\xb6\x92\x89ڟ\xba\xfap\xf7d\x8d\x83:\xbdCc\x04\xeae\xbb\xdf\xea's2\xaeE\xdd\xd9\xd0\x1d;\xa7u\x1e\xe6*\xc6'\x05\xbb\xe0\x16\x8e\x8b$\xec\x9a]\"\xf6\x9f\x9a\fc4\x81\x8b}\xac\rv\x0f\x8azyDz\xdfɨ\xf7n4\x86\x8cbTF\x0f\xd2.b4R#\x11\xd4P\x17*\x8e\xe7\xa9\x15\x19~6\x10\b\x84\xa6t\xc6jt\xfc\xac\x98ŋd\x87ۥ\x9by1\fW!\x1f\x9fןD}\x1ag\x95\xbflْW_A\xeb4R\xab/\xa5\x0eu|\xf6\x95]\xf7\xbe\x80P\x17\t\xf2Ǯ~\xf8\xf0:t\x83\xfb\x99[\x94\x9e\x96\xfa\x9894\x05{-\xd5.\xafǀ\x02\xa9\xbe\x1c\xcey\xe3\x8dA\xbd\xb00\xeb\x06\xc2 \xa8x\xba\xa66-NMv\xceM$\xfb\x19c50g\xb6\xcd\x1b\xb8hQ6\xab\x14\a\xb6\x00\xe3\xd41\xfd\xb1\xfdB\xff\x95n\xd7\xe4\xee\xc3W_u\xb8s\xda\xce;B\xd9\xeeE\xae\xcc\x1c\x02\xe3g\x97\xf5}\\\xa5\xfd\xff\"\\\xf1\xa5a\xa0\xa6\x1a\x9aQ=\xbb#\x96\xec\xdaͧ\x9d\x99\xefվv\xc7\xfe\xb3\xa3\x8d1\xeaŊS\xafY(R.i\xed[\x81\x8c9\x02\xf8\v\xc5\xfaJd\xe7\xd1QӜ<\v\x120@B\x8eNya\xfc)\xbfj\x040Vh\x9f2쬄\xc7s\x01\xed\xd2O\x00\x9deP\x1e5>I\xae\x93~\xaf\x91\xea\xa91!\x00\xc6\xfb\xa1\xff-\xbc\x06A8ag\xc4j\xcaNq^7\xac6\xea\xc3e\xab\x13\xb0/\x89쾇ݳRuԢ\xc1Z&\xfdU\xa1EJ\xa9\xb8l\xb6p\x9eYo\x9e<2\xe9\xb9\"\x15_\x9c\xec\xf4\x14:\xd9\xe997\xde9f\xb2\xd9\xda阎\xb3\x00\x88\xb3.\x04\xb5!\rhI\x17\x1b\xda\xc24\rRk\xa5\xf3Cj\x11\xaeG\xd3Bu\f+b\xfa\x98\x99tQ\xf5P\x12\x9du\b\xd1/\fА1\xfa\x99T\x18Z5\x1c\x97\xe5\x95\xf4\xdb\x01\x87V:\x1c+\xd1zp\x82\xe38\xfa\x88j\x84\x8e\xa7\xb1y\\ST\xa4\xe9!\xa9z\br\x81\xe3\xf8\xf9u8Y۸$\xfd\xf8\x13Յ\x84F\x95uFY\x13\xdd\xf1\f\xcaTj\x1c\n\x02+[k\x8cj`\x18\xe2GŦ\xa2\xf5+\x91yl\xd3֦Y닍\xf1\x8d4\x14R\xab\xe7\xd4\xd3,\xb6+\xaa\xe9h\"\xad)=\xa8\xacU\xcb>\xce\x10\x1e\xad\xafyV\xcf˕!\xcb\xd8V]\xc9Z\xeb8G_\n\x17jW\v\x1b\xae\xb2p\xa8\xa6H\xea\xf4 ֬Q6P\xa8\x1e\xe98=w\xb0Q9\xbb]W\x8c\xcc\xf280\xc0\x9d9\x9f\x1e\x9c\x11\xfd\x12{\xb9\xd1z\x0f\x16$\xc55\xeb\xcep\xbe+\x94\x8d҃D%ꔒ\x8a\x18-\x91\xe4\xf5\x16\x14R`5CbJi\xa5\x95h\x82EI@\xa7\xb9\xdc\xf4x\xa0Q@\x87\xb9-\xd8J\xb3\xc3\u007f\x89\xfeh\xean\x94\xa2א!7\x93\xfb\x87#ם\x8e\xbaY\nѣX\x10\xad\xa1\x9e\x16\x99\xa6\x052\xec\xcfM\x8d\xe9\x89n\x89\xd2Ɣ\x18\xa4\xd2\xcdi&\x82#i\x85x2n\x8fB\x85\x02\x80~\x8c\xd2#\x9d\xf2}2n)Ͱ\x13\xda.w\x06\xb6\x14\xc9\x03o\xb1\xc8\x14B\xe0\xa1\xc6\x1e\x19\x1f(\x93\xd6\fY\xc7k\xa1\"\x16\x1b\x8a\xbb5n\x11\xb3\xf7G\x19\rPTF\x8b\xa3\x84\xb8;\x93N\x89Q@\xf7(\xe3\x9a奣$\xba\xea\xe9%l7Q\x18?\x8e\xcalR\x1a\xbe\x1b\xb1P\xe4fB\x12!w\x9aҤJƝa\x95îG\xdbٍ\x00\xf1J\xa6 \x83vK\x1b\x8dg\xea\x01WOӬ\x94\xbbL_\xe9$\x9b\x90t\x88\xb1\x9ba\x8c\xe8[!i&\xfe\x1eM\x17\xed>J\x16\xe2\xa1LBf\xddR\x81\x04\x16\x9e\xba\xa0%\xb5\fۣ6!\xe1o\xac\x06\v\x99\x86\xad\"\x16\x04$\xda,J\xbd\x1d{\b\xf1\x12l2\"Qo\xc1\x06\x83\x88\xb0\x15#B\x04Q'!\"\x12\x11\x13#\xb1\xda\f\xa2\x9eH\x02\xb2:\x89.\to\t\x99\xfd<\xf1\x019*a$\n<1ʔ/-\n᪠(J&\x82\x89\x1e\x99$\x12\xb2\nf^o\x90\x05\vћ\xf4}\xd5\x1d\x8b6\xdf,\xf6\xed\xe8\x98\xda+\xf0\xb9\x037\x0e\x1f\xba\xf1\x80\xe4\n\xa4g\xac\xed2\xf4.\xb8\xe3\xae;\x16\xf4\x1a\xba\xd6\xceH\a\\Ұf\x97\x8f,-Jǒ\xe0\xe6Ew\\\xf5\xf4B\xa1wjǎ>\xf1fM\xf8\x11\x03\x14.\x9c\x87.kl\xf2Dj\xee.Xv\xdc}\xf7\x8e\xd4\xdamW\\:5֔j\x82\xbf\xd8\xd4K\xafضV\x883\xd9B\xb5\xae\xf8\xa9\xec\xc2S\xf3\x16\xde$l\xbb\xbb&\xe2ijD\xebYdIO\xed~q\xb3\xf0!\x17\xe4\xa6rW\x17\xad\xa5\x00)\\\xcb3\xb2\rH\xb1\x11\xc3.iT2\xfcR\n˔D\x83\x88'\xcdi\x9a\xf8\xda>\x13-\xda\x00(*\x8fQ\x1e\x8b\x87\xb9\x84\x17\xfco\xf8c\x8d\xb5$`\x94\xa5\xb6\x98\xb5\xcag\xaa#A\xff\x89ꆘ\xff\xa0\xbf0\xc5\u007f\xc2\x1f\x8b\xd6\x1c\xf4\xfbߨn\x18\x9b\x8a\xec\xba\xe8\xe0\xe2\x1d7.>\xb1x\xf9\xf2\xa5;w,yc\xc9\x18?\xcaƠ\xf4\x00\xa93\xf9\xaa\xac\xb16I6\x82\xbb1\xe6\xffq\xb5\xef\x80\x1f\xff\t\x1c\xfe\xea\x03\xfe($\xaa\xae\x1b\x9d\xa8\xf0\xf6\x87\x8b\x0f,\xbe\xe8Njwܴt\xf9r(y\xb4\xb7h\xe32\xc7l{s\x1a\\p\xd4@\v5\xa9H?\x88\xa5]\xc3J\xb5Hʽ\xfd\xd4\xe9\xb0g\xd1\x1aIhh\xbah\xef\x03{\x16\xaf\x91 \xa5\xee\x1a\xfce\x8b\xddf\xce\xd5\n\xc4\u007fzUs|\xe1\xaa+\xe6D\xb5W\xf3\xc2xst\xce\x15\xab\xb4\x17\xb2\f\x04-\xf3}\xc4\"\x00\x9e\xf4\x8b\x01<\x04;\xe6\xa0\x1ep>\v\xef#\x03\xb9\xc2?\xbe\x84\x8dX;$}\xeau\xcepȖ\x05\x94ow/\x8f&\xb5ν'\xb5dޒ\x9b\xfa\xefM-\xa93\xebg\xcf֛떤\xee\xed\xef\xd8\x18\x9d\xbf$y\xef\xdc\xd6I\x88\xefE\xbbuR\xd6\x16\n;\xf75\xeeIt\x84\xe9\xa3Б\xd8\xd3\x18f\x0f<\xd8n\f;u->b\x03\xb4\b\xfd{\x00g\xb3\xea\xc2-\x03:\xcc\xf36ާ\xe6\xb3\xe8\xf0>\xc2k\xf70ڹQ\xc7\xd5s\x11.A\xbf,1\xea\x1e\xa6xB\x96\xb4U\\\xf6tBBA=\n\xca\xf4\x10)~\xa23\x99.{\xc4\xc1ҍPa\x88~\x11\x02\xd1OBP\xbb\x02\xd3:s\xea\xcfQS\x81=\xbf\x8b:Uf\x99\x00s1\xf2K\xcdɗM\n\xa0@\xf1\xdb\x13\x90\x19\xcaP\xbf\x1e\xfb\xb9\xfas\xfcy\xf5\xe7\xeagQ'\xd5)\xa2_\xad@\\l`\xf8\x1f|N\xf31\x9e6\u007ff\x8fp\xb3p3\xb3\x02\xed,Y\xd5\xd0,w\x14\x05\xf4\x8bZ\x1b\x881\x9b\x92\x15~ט\xf4\xc2\xcdOn\xbb\xf3\x8a\xe1\xbfoy\xeb\xa9'\xafǗ\x18\xbalfC\xe1\xe9\xf9W\xae?\xd0Ot=\x8b\xb2Kz\n\xdf\xf4\xd5\xd7(U\xe8QC\xb7\xcddP\xaf\xec\xb9n\xd1\xf2.<\xfd\x8a\x87\xb7=y\x05\xd1]\xff\xf8S\xff\xb6\xa5\xf0\xb4\xc1d\xeb2\xe0K\xe7\x1eZ\u007fu\xff\xf0\xdf{\x96d\x17\xf5\xe0\xe9^\xa5&P\xad^\tq\xdd\x06\xf4h\xd7\xf2E\xd7AakF\xc9\xf6Q\x1d\xed\xe9\xda7>\x98<\x1f\xfb~̈^\xbf=Qby\x8d\xd5A\x1d\xabs\xe7\xa1X\x1a\xfd \x10Gr9\xa7A\xfd\xa3\xa1ժ\xdd\xc8\xe5`\xb8\t\f\xb7\x9a\xab\xd0\fΕ\xbfMʆ\xdf돱\x8f\x13\xe5,\x93\f\xa8\xca\xe0,)\xf6\x9f\xe64K\x11\x98\xab\xb8ݑ\x87Y\xac\xc0\xbeZ\xaa\xfe\xc9?0J\xf7d\\;|\x95\xd7\xeb\xfc\xc0h\xb5\x15\xed~\x8e\xddki\xf6\x8e?\xb5e\xef\xd1v\xfe\xce宰\xde\xfd\x87\xf1\x9c\xec\x8c\xcfK\xd4\x0e\x83v\xbf\x16\xe52\x14\xa3)i\xb09J\xb7\x86cj\xe7\xce\x11~\xb6Uivo\xa8\xfd\t\x1fV\u07b4\x9dʍ\x13X\xe9~\x83eC\xf7k\x06\x86\aˆ\x94\xc9\xefƆ\xa0\x11K\xd3ڰZ\x99n\xe9߹ZX\xf1\xfd\xb0ko\xe4n\x86퀭\x82\x8c\xb6:\xa4h7Τ\xea\xc5\x10\xfb\x90\x15\x9cG\xb2+Ș\xae\xda}I\xb4\x9b]\x0eSfn\"u\xb6!\xf2`*\x91\xa4ئ(E3\t\xfb\x05\a\xe1\x96M\v\xd7\xf7N\x9e4\xb9\xa6\xe9j\x9fnRX\xb6M\xb1\xadGs/Mtb\xf5\x90\xd8\xd2\xdb\xdbRS\xd5\x1c\xba\xc8{i\xfb\xec+\xa6-\x9a\x8ev\t\u007f\xd6\xc6\xc1a\xd1\x06J\xfd\xd2\x06\x84u\x8d3\xefZ/\xbcW\x19S9ZK\x16\xac\xea]>\xb1Ɵյ\x19\xa668\x10N\x1d^~\xbdi\x0e\xce>\x15v$\x96$\x9b&x\xaa\xaa\xdb;\x12\x93\x17ό/n\xceTu\xaa\xdf\xd2\xc6\xcc\xe2\x90\xc9\r\x97_\xdep\xa4\xc1d\x8f\xf4\xefR7\xaa\xb7\x94#ƌ\xeb\xc8]\x8a\x95Kqk\xd9^:J\xb81\xa2)Ǥ5\xa3\xb0\xda\a$\xa82\r;\xd8ʗ\x03$X\xb4\x96[\xba\x8d\xd3\x14Z(ޜ\xcah\xd2J\x9e\xa2\xad7*\xfd%2E叙\x14#\xfa\x8e\xdf\xd3z\xc7g\x10\x1f\xdf\xd6{\xad\xc1h\x11LK,\xf1\xd4\xf2\x9d\xd7M\x9b\xda\xdb\xfb\xf3\xe9\xeb\xda#\xef\xa1Ǥ\x06Okdւ\xd9\vn\xban\xe1\xfe\xc9V\x1d\xa5\x1b\xaf\xb4\xd6Z\x85\xd0Ħ\xee\x8e\xd9پ\xb9\x13[\x16\xd6\xe3\xdcȷ\xf7\xb2\xa1\x89kV\xbc\x98\xdb%\x9b\xc2ʂ\x9b:\x1d\xd5@S>Զ\xb2\xa3}\xf9\xec\xa9S\xbb\x9d\xcd~\xef\x19.\x9a\xbavm[k\xa8\xb9\xd5\xe1\xf2\xc4l&\x9dż\xb1\xb5V\x89L\xc0\xf5s\x14\xdd\xe4H\xd8\xe5\xae\xf6uvM[2\xbb\xa6\x82/z9ն\x97\x95\x16\xcd\x10.\xebS<#y\\\xa26 n\x97G\xae\xe8\xad\xd6\xe3fmȬ\b@\xcb\xe3\xcexʃEӻe\xf7\xc8\xc8iwX\xb0\xe1D\x95\xb1v\r[#:b\xae\xeeL\xee\xa9_\xbahkm[-\u009d\xd9Nٌ\x90E\x9c\x18\xeaZ~\xf1\xbaemM\xad\xf6\xb0\xdd%Y\x81\xe6\x96뛮\xb0\xe0%\xaf\xf7\xef\x00Z\u007fbt\xb6h%:\x8b\xe8\xb2\xfa\x949}\x1b6\x1dxn\xdb\xf6\xce.\xb7\xcd^%,uXF>\xa3.\x041^\x8ex\x89\x00\x8do\xc9\xea\xf5U\x96\x1b\xccQ\xf1\x1d\xf5O7\xcf\xeb\b\xb6\xf8\x1d\xc1\xb0\xbf\xad}\xf6\xe3\xf3\xd7\x1c\\\xda1\xd5\x15B\x98,5\x103V̒ׄ\x8c\xa2\xd5'Ō\xb2z\xe7w6\xf57Oi\x9f\x1c\b6\xb7\xf4\xf5o_\xf0\x04\x9a\xfbrU\xf8\xd4\xed\xa5\xb9qp\x9c\xa1,\xc31\xf6\x9b\x02\xf7qOi\x16#*\xfbn\x1f\xe3\x1f;6\xff\xd3\xfe\xb1\xf5\x8d\xfdF(\xfdNy\xc5'\xea+ܣcT\xee\xdcq\x9f\x88\xb5\xb3\xbb\xb3\xbb3\xb3\xb33\xcf3\xcf\xf3\xfc~x\xa4h\x03\xe04[\xe6\x87 \xb8A\xfe=,\x13O\x9e\x14c⋢\xc8rx{\xf2\x95\x95+=\x1e\xf4\a.z\xfe\xf9\xe6f\xf4G\xffA=\x92\xbeSM\xd0ϒk߉\xe1kѥ1|\xad\xf8\xe2u\xe4\xa4g\xa5\xbd\\=\x02=j\x82\xac=$\xb2\xf2\xbf\x99rR3\xf2,\xec\x18\v\x1a\xabxٰ\x1c\x8bU`B\x01\xc5!\x82\xfc\"\x01LQ\xfc\x90 \xd3Jc@(\x02\x8f\x11\xc9\x05{˯\x82\xe4\x9dF\xed/\xb5\xac\xe2\xda\x0f\xba4\x92\xe03\x84i\xac\x94bM6A\x87\r>A\xd2 \xc5\x1d0Z\xc9\xf8\xa2\xd4\xe6\xee\x0f\xb9\x18\xa4\xc9(\xb1\x00\x10\t\x8b\xe8zc\xfa\xc7d\x97I\rQ&\x87\xa0\xa5\x01\xc0\xbe\x12\xf8\x0f\x00Z+8L\x18\xd3T\x13\xb3W\xbb\xfd\xe8&\xae\x94\x02 \x90\x93a\xa6Q\x19\x1c\x06<\x10a\xd5\x1e\x87\x18\x11\x90\"\x1a\xc7\xff*F\b\x95\x05S\x11)1\x87^T\x8d}uМ\x03\xe35`\xeb\x0e\x87-q'6nh\x92\xb4\x95־\x96\v\u007fڻ\xe3O\u05ec\u007f\xf2\xe2%\xe5\xdd3<\x1ah\x80\x9c%r\xe2\xc1\x9b\x1eܿ\xa1e\x9a\xa0\t:b\xb5\xad\v\nVY\x98\xd7\xe5\fz\xe8l\xb2N\xeb]6\xc5\xff\x93p\xc3\xfe/\x0foyiOc\xcf\xee\x1f\xb4\xf7\xde\xe95x\xf9\xf1\x9c\xc3\xdar\xd6M\xef\xdd{\xe9\x8f>_\xd8\x12ؾ\xb8\xb8v\xe2\x96\xf9\x9d5\xf2\xf2\xc9\x1b\x96\x80\x8b>9\xa1X\x81ru\xebʓ\xfb3\xb5\x13\x15r0\xb5rd\xf0\xfd\xce\xcae\xf0\xa6\x94\xf8\xe1t\xf9|\x87\xb6¶\xbe\xf9\x89\xbfL\xde\xf5d_\xef\x13\xbb\xcf*\x9f5\xc3hct,g\xa9}\xe3\xfe\x1b\xaf\x19W\xce\x1e\xadi\x99\xef\\\xe9\xb4<\x95\x1fc\xbcs\x91\xff\xe1p=\b\xffi\xde\x1d\x17v6\xf4\xec\xbal\xe2\xda۽\xacN\xa8\xb08\xa4\xd6E\x87߹\xfb\x92\a\xfe\xbe\xb0ٿ}aq̈́\xcds\xa7\xd6\xc8+Wߚ\rD\xceٶ\xdcD^\xc3؉>[DP\xe1\x04j\x1dq\\j3\x16t\x82\x91h \x8ad\x1c[\xc4\x16\x19)\xa1\xd27r\xf2\xe1\xf7h\xf7\xf8\xf9\xb1UW]\xb5jiK\xef97\xf6\x0f\f\xf4\xdf\xf7\nX|\xee\xb9\xe7\xa1\xff\x80\x98/\xc3\xc2\x1d\xae\xd0>g],p\xcdK\xd74\xadY\x8dW_\xdeځ\xb3\x9d\a/\x1b&\xdd\xe2\xf9\xef\x1e-\xc5.S\xb1\x80\xad0\x8f\x14\xdb\xeb\xe0\x89+\xb7\x95\xf40:\xee\x8b\xfa\xecA\x1b\x16\xc3\x02\xd1H4bc\xef\xf8\xb1\xfc\xd37o\x94\xbf|~۶\xe7\x81\xf9F\xe0y\xedW\xdb\x1f\xdeub\xe7\xce\x13\xbb\xe6^yV{1\x87\xf4\xaa\xc7\r\xf4\xaa\x13o\x9d8\xf1\x16\xdc\xf8\xa6\xfc\xecS8#(\x03\xe6緥~\xb6\xf9\xa2w\x86\u07b9\xa8jҢ\x99\x81\xa1\xb66\x9c\xe7ĉ\xec\x1a\"\xc6h0P\x85T\x05\xd1\x04\tu)\xef\x88\xe1 \xa3\x12$\xea\xf9\xab`]+\xacE:\x85E\xf9\x82q؎\xcdW7jD\xc7\xd1\xf3\xc9-7\xcc(3\xe2uŲ\x19{\x0e\xef\x99Q\xa6l`Y\xdf\xe1\xc1$\xfe\xee\x98\xe4\xe1OC\xaeoɊ\x03\x8f\x01\x85\x93= \xb5\xbf;h\x95\a>\xbe\xea\xe0E3g^tP\xd9\xc8e\x90\xc2\x17\xc8\xe4\x97N\xe4\xf8\x82B*\xd6\x00\x83\xf4\x1bʘ\x89\x92!x\x06\xa8\x18\f%\xc9\t\x8c֙\x90\bY\x12}\x16IK %\xd5ep\x1e\x90\xdaH\xd1\t\xe5ZR\x05\x15\x01\x01\x03\x90\f\x11́\x14\xc6\x1cH\x01\xe2+!)\x0e\xf9ʵ\t*\t1B\x801ˬ\xabB\x1b`\xcd>\xf7 &\x91\u007f\x1f)ç\x9c\x84\t&\xaf\xcc\n\x90\xa0\x03\xc0\x04)\xb3\xf2,\x1c~\x93)|H}\xee\xf0ؚ\"\x8a\x8a\xf8\x88od\x10\xf3A\x8e\x9e[\xfbaO:)\xb1禓\xb0G\xa1\xce\xce\xcewLr\xb0\xdf(y\x99\x9e\xc1\xa4ļ\x96\xcfC\x82\xfbg\x8aQ\xb0\xe7\xdc#[U\x1c\xd1N\xc3\xdb84\xa2\xd9~\x97\xd7\x12c\xb4!y\x0ez\xdc\x19\xdfݰ\x1b\xa9\xd7ҔZ\xc63\xbc;z\xe4ss\xf1\xc4.\x8cF\x92\xfb\xee\xed\x0e\xc6\xe1\x81M\x90ؾ\x831\f\x1dF\xf1\x02S\x0eI`A\t\xb1\xe2\xaa4Q\xcaByE\x03軼a\xca\xf9\x11\x00\"\xe7Oi\xf8\x11\x98\xdaP\xbe\xb2S\xbeb\xa9nByḰ\xa6\xe7XK\xf9\x04\xdd\x12\xf9G\xfe\xd6\xf3\xe6\xce`S\x13VЍC\x1f\x13/|WM\xe8߫ʪkj\xaa\xcbv\xfd!\f\x16\xcc:\x18\x91\a\x13|uQ\x89(\x96\x14U\xf3\x89Ϝe\u05f7\xcd\xec]N\xde\xf9#h<;\x87\xc4\xfd\x95\xab\xf8\x16v\xc5U\x17{\x13\x92\x15}\x85\xa2\xdef\xf1\x89\xe6j\xe0\xb3\x05H\x88%X&?\tV\x80u\xf3\xe0\x9c\xd5\xeb~\xb8\x9a\xb9V~j\xf6\x82\xb6\xf96\xbd\xfc\x14\x12\xfbA'\xb4\x96MY\xd7v\xf4M\xfa\xda!\x1f\xfdGP۹re紳\xcf\x1e\xfa \xfd\x12\x14\xd7\xef\x98\x14\xf1D\xd2\xef\x82k\xc1\x97\xe3\xc7\x1f\xf4\x8e\xaf/\xfes\xe6\xbd)\xe3k\x1d\x99\x13q8vI8\x84\xc3\xff#x\xd5\r\xfb\xf4\x90\xb9\x83\xe3G,\xf3c\x80?\x06\xa9\xe6;_\x97?\xba\xfd!\xf9\xe5sy\xa0ٯ3\x99\xf9ηw\xf4>w`\xf6\xec\x03\xcf\xf5\xae||\xf2\xfe\xbc\x95\xf9\xbd\x1b\x80t\xfd\xed\xa0\xf0u\xbaP~I\xfe\xe8\xf5\x9d\xd7\xed\xd3\x15h\x0eh\xa1nE/\xca\xfe&\xbaj\xca\xc4\x03y+\xf7\x97\xacٸ\xf3uT\xc6\xd2S6\xeeo\xeco\xb1O\x9bo\x18h-\x0eN\xf5p8ޗU\x8f\xb52$\x1c\x9au\xa8]\xa8\x8a\xc3\xc8\x01\xac\xbav$0$\xb4\x84\rc\xec\xdb\f\x16\xec߂\x1b\b\xef\ue361\xf2S\xd4\x1e\xa1T\x806\xc6\xcch\xe8Bڭw\x89.ci\xa1\xdc[\xa8\xd5\xda\xf5\x1e\xda\x13ҙ-:\vg\x85\x82\x00\x96\x8e\x95\x15\xdc\x02\xf6\xb8*\x05\xb7K\xde\xcb\xceh\x9eq\xa0\xb4{F\xf3\x16A\xc9\xf1\n\xd9lW\xf2\xa5\xe4\xc1?\x14\x15}\x00\xb8'\xf1M\xae\xf9R~<3.(\x98[v<\xffQHPC\xb2\x0f\x86\xa4\xe7c\n\x1a}I\xcc\x1cbr`\\\x18~`8\x1a\x17\x01\x89\xee\x92{\xe5;N\\\xbbw\xa1\xdbYu\xf3\xae\xf2\x86I-\xaf\x82U'N\x80\xd9y\x18]\xac\xc99\n\xa4\xebKp;\xf8+\xb8\x9dI^\xf9\xf7\xfd\x9b^\x99V۳dv\xdb9!Ns\xe5߁\xf8\xf7_倻l\x961p\xbb~\f\xc2G\x8f\xe6\xd6 p\xecF#\xb5:\xbf\x16\xd9:ԅ\xf0[\xf8\x0e\x14\x05\xf0\xdd\xf8\tH\xfc\xa3\x17˯\xcb\xff\xbe\xa3\xaf\xe7쀿\xb0\":s\xfa-@w\xc7\x1d\xe9;1n\xc2\xf13\xa0+\xb0\x8d\xdf\vU\xe1\x1a&\xd9\xfb\xe8\xda97\xd7\xd7ϳJ\xc5:\xa1\xf7\xd1W\x1f\xfd\xeb\xfe\xbf\x9f\x01ja\xf0\x9b3\xa3,\xec\xba\xe0\x04\x1a\x1f\xc0)\x8a\xbe\b\x8da>\xc5\x0e\xab\x18 \xe2\x12\xab\x18'Tgx4J\xd0A\x1c\xf0\xb2]ԧ?2\x161:\x8b\x85yA\xeec4\xa2Qd\u007f\xcd8\xcd`\xaa\xe4b\x8f\x82\xab4\x8cD\xbflu\x0e\xee*\x80l\xa1\x99.]\x03\xf4&'\xdd \x88\x05\x16\x8dN\xaeY\t\xf3\xb9?\xe6\x0f_\x0fEJ\x0f\x92OG\x92#\x8fy\x8c\x18n\x03\xb9\t^\xc1\xf3\xb1\xf9T\x14A\x9e\xaa/UB\n{d\x8a\xacȎ\xb9\xd7U\a\x95}\x12xX\xda\x031r_i}~8b*\x95\xc9=\xc6^]W*s->\x9a\xea\xaaK\xd5\xe7d\x93\x14\xd2fgQ\x8bU\xb9(\xe3\xf0\x8e\x91s,\xb1Ze\x95\x11\xabM\\\xc6\x14\x84\xbd\xc9\xc0\x88]2\x99)\xb8\x041\n\xcf\x1a\xd8$\x04l!?OnG'o~\xf3\xe6P]h\xe6꙾V\xda'\x19\xf5\x86\x9aE\x8d\x1d\x17\x94\xf36Fo\x11\xf5\x8c\x8d/\xdfq\xc5\x0e\xb2+Z\xc8\xee\x05\x1d\x8d\x8bj\fz\xa3\x04*\xa9S`\xfeO\xaf\x02Ɓ\xfb| M\x95U\x94a\xdf\xdf\xe7\xd3\xc7{o\xbe\xb9\x17\x8b0\xb53g\xd6\xc2\x0e}\xc8(骪\xa65\xebJ8\x8b\x85+\xd15O\xcbOWU\xe9$#\v\x9f\x02\x96+\xba\xaf\xff\xf3\x01\b\xdfZ\t\xe1J,\x942Y\xbb\x8a\x06i\xc4n\xac\x81\xb0>Ŗ\xe2\x1b\xb5X\xe2\xcb\xc6p\xb7\f'E!\xab\xf74\x92l\U0007aedc\xc4\xec\x8ci\xb2\x9a\tS\xa8\x0e\x14(\x97߁T\xce\xd8R_ʠ\x94̈́\xe7\x82$^\xca\a\xfd\xc0\x9bŊM\x9f\x8b\xf2\xcfO\x93wޯ,\xd3cӊф惞\xac\\I\xb8`\xccT)\xb5\x94\xd8&IX\xb9\xaa3\xa1\xe6W\xa3\x1a\xac\nSv$F\xf4ݸ\x15{\xb8e\xa11\xb0fH\x02\xb6ț\xcb\xfcaw\xf2(Q\x1d \x1c\x90\\\xd29u\xb8\\\xb5\xab\xa6\xf7O\xdax\xf9\x81\xcb7N\xeaЍ\xd3%\x8d\x1f\x19\x93hۑ\\W\xd9\xd4\xccT\x17\x14T\x1a۪\xac\xdd˻\xadUm\xc6ʂ\x82j\xa6\xb9\xa9r\xdd\xe2\xeb\x9e\xfa\xe9S\xd7-\xa6\xc9\xcakU-\xba\x9b\xb7\xabn\xeaE\xb3*+g]4u\xcd,}\x85\xfe\x96뮻\x05mf\xad\xb9msM\xd7\xd6\xda\xc2X\xd0\xed\x0e\xd6\x159\x9cU\xb5\x15uu\x15\xb5UNGQ\x1d>\x16+\xac\xdd\xdaU\xb3\xf9\xb6UG7O\x98\xb0\xf9(\x19\xff\x15\xecY\x17\x89A!\xcb\xd49ې\xc2#I\xdc%\xccy\xb8\x94\xa1\\\xa0\xba\x02gf<\xd9/\x19\r\x06\xf9\xe7Z-H\x10\xaa\xc8\x1eL\x86HP&O\xf6\x13\x94\xdf\x1e\x05E\x12\xf4\xa0Z\xa0\u007f:\x94\x0f3.&0B\xa4\x04}\x19\xb0H\xb2\xb4\x9c\x85\x84\xcc`\x04\x12n\xa2(\x89\x01.\xcfY\x802\xb6,L\x10\xc8~\x87]\x99\xa5Da\x80\xdcx\x00\x93Q\xf6`2\xca\x15:\x98\xb16_u>\xb66\xdf\x0e\xe8\xa6)+\xfa\x0e\x8f\xdb{?\xec\x11D\xd0C\xec<\xfd\x84\x01\xb3\x1fUk\x85\xe1mb\x83\xde\xfb~\xdcc|\x1bT\xfc\xf8`\xebᾮ\xd6\xe2\x13\xa3\xcb\x18&\x8e\xcb\n>E\xd6\x0f7\xa2\"B\x9c\xb6\x8c\xf81\xa8\x15\xee\xd2\xe5\x15\xf6;\xca\xd8/\xe0\x9a\xa0\xfc\x06\x83 ʤ\x8dA\x8f$\u007fv\x9aBf\xfa\xbb\x1a\xff\xb5\x88\xea\xc9Ytج\xaf\x06\x1dG_)\x01)P@\tp\x14\xa67\x8e:\x00\xfez3hfa2\x1c\r\xdb\x0f\x85\xeb\xb0\x0f\xa6\x87\xc9:v(\xa6^&\xa4\xb8m胍\xbd\x1d\xf6\xc6ɛ\xfa7Mi(\xd8\a&\xef+\xe8;\xec\xad\xef\xae\xf7v\xf5v\x91\xed\xa4&\x00\x18\x9d\xa6\xa3\xb71\xa8\x97S\xaa\x1b\xc7\xef\x88\t{\xf7\x85\a\x0e\\ر\xe7\xf0\xd6%\xa6\xba\x8eW\xac\xab[\xba7m\xeanYm}\xa5\xb5\xb8\xb7\xb7\xb85q\xb8oqQ\x19\xfe\xb8ˊ\x16c\xbc\x8c\xdc^\xc7\x0e\xbfnBq]\x99dZ\xb2\xf5\xf0\x1e\xfa\xb7\xaaCG6\xb6\\i\x8b\x199I/\x8e\xd4\x1f\x8b\x95\xf1\x96`\xc2\x12\x95b\x94\x98}\xc8\x17\x81ޥ7\xa6\xf8\xe2\x935!\xe5\xed\xe1pa\x9br\x86H\x12\xb5ٰ\x85)\r\n|\xf4\xbd\xef\x87\\\x9c\xce\xd2\x1c\xc0n\xef\xbe\xe2\xe3@s\xbc؇Ӂf\x8b\x8es\x85\u07bf\x17\x1fj\x98\x82Z\x87V\x9c\x0e\x12\xad+m\xf2\xf6#\x1f~xd\x9f\xf5\xb7\a\t\xa4\x86\xa7\x04Iq\xa2|\x1eY\xbd;$\xa2\x9d\x12\x0f\xc4\xfc`\a\u007fk\xddG\x0e^i[ي\x9aF\xe5\xfaT\xec\xaaX\x9b\r*\xbeQl\x0e\x1e\x1d\xe9N\x91\xac+\x94\x8a\xa1\x1e\xc9xD\xc9\xfd\x04Ց\xe9\x1f\xa2\x92\x8a\v\x14\xa4\xf6-M\xa0\x83L\x12\x83\xc6\xed[J\xa3\xf4 \x92\xb7\x14ϧ\x81\xa1\xd4\xd2},\xb5\x0f\xb5i.F,2\"B\xec\xfbG\x85щ\xef\x19\b\xf6\xbd\x02\xbf\x14\xd90\xa1\xca\xf6~\xf2\xa6Ie\x81O\xe9\xf4\xa8Ö\x8f\xe0[咛\xba\x13\x89\xeeo\xbf\xe4\xa9\xc3}\x83T\xdfa>\xf1\xe1\x91ľ\xa5\x18\xed\x12/\xc2\x1c\xa1\xc7\xf7o\x92\x93\xe9\x14z>\xa3E}ʋ\xdb\v\x0e`v\xae\x1c\x16z%5Q\x91\x06\xf8l\x84\xa9ҥH\x97\xb1+\xd8+\xc3\xd3l6g\x9e\xb4\x03\x93S\x1a\b\xf0\u007fÔ|\x18\x05\x1c\xc5B\x91\xe3h\x988\xbe\x0f\xbbڱ\xa9t\x12}\x16C_Ꮐ֣\x0f\x05*\xf0\xb0=\xc4\x19\xaf\u007fd\xfa[\u0099\x01\xd1\xe8M{\xf7\x1dW\xec\xbeJ\xfc\x8a\x84f\x03\x05\x03w.a4\xb0\x8d4\xb2\xf3\x16\x1f\xe6D\x05\xea\fo\xc9\x01\xe4*\xf9\xd8\x11V\xc0\x91VA\xf68\xf6sP-\xef\xc9Ҟ\xc2}\xe0\x02\x9dA\xfe\x95\x01\xac\"\xee\r\x14\x06\x1d\xce@\xce\b\"\x1cȤ\xf2\x8f\x8a\x02\xb3\xaf\xb0\xa7t0\x89\xef\xc2\x11+|\x87|E\x91\x014\x18N\x8a\f\x85Ł\x93\x14ݓ1\x1a\t\xfd9\xeb\xde)*\x97\xc6\x11\xdfY\xfc\xfaѶ\xa4\x87\xa9\x9fQoP\u007f\xa4\xbe@\x12\x94\t\x14\x83J\xd02\x9a\xb7::b\x9f\x1d\xb1?2\xffH\xde\xea\x91\xe7ϴ\xff\xff\xfa\xfa3\xe5\x1fY_\x8c\bn\xc9x[\x8e\xc2b¼\xd2Y1-\x87\xd7M\xe5ҧ\xf2\xd2\xf4i\x8e\x9f.\xfd\u007f#?<\xcd\xf1\xe1e\xc6\xf8\xa9\xb8n\x04\x18\x8b\xcag\u007f\x1f\xc8\xd6\xf4_\xa3+\x9ew,\xfd\xaf1\x0e\x8e\x95\xfa?\x95Q\x1e\xeb`\xee\xe7\xe4\xf5\x18tt@\x11\xe0\xf2܁\xf1\n\xe4w|3OQ\xbf\xa7\xbe\xfa\u007f\xff\x95\xfcozi\xd6/#\xaf\xbf\x16\x80\f\xdf@ :\xdcۨ\x05Dl\xa3\xf1\xed#\xbe\xac\x06\xf3\u007f\xa5w\u007f\xdf\xdew\nk\xc2h\x1c\xc4i\xa5\x17\x92Sy\xe5I\xaa\xf7\xcb\xf4M\x90@\xa3$\xe6\xc1I\xfc\x1f\xeb\xa3g\xe8QC\xd73I/\x1e\xb0\xbd\x83Iү\xe8\x94RО\x9e\xacc\x95\x92\xae\xcc}>\x80\\!\x0f\x84\x90Б\xc8\xf2\x98c\xdbk3F\x06ʷ\xbe\x12\b\u05cc8'\x91חe\x8f\bd($lٷY\x1bS\x00 \x86\x19hC\xc4:\x1bSl\xb3\xd9i\x98,\xbbɯ\x80䝂\xe6\x97F\xf6i\xef\xa8\xfb\xe0$\xac\xc2柌\xe5\x16\xfbt\xf6\xbb\x12\xe8n\xc4_=\x94\xc1\x96Pp\xeb\xc3T\r\xfa\x16;\x95(\xca3V\xfd{I\x85D{\x1a\xa3\x8aiEZL\x12\xe9\x87I\r\xa6\xfasҢ\x17\x1d\x04\xfdc\xd7\xe6\xf3\xef\x14\"3\xf8\x1c\x04\x17\x1e[*8#\xe0\x03\x8a\b^NG#\x96\x00\x1f\bc\xab`4\x1c\x8dcCf4\x1eq\xa0\xa3\xd1&\xa8\xf8\xfa\x82\x88\x83E\xda:\x9f\x04\xf2\x87r\xff@B\xfe\xfd$\xdc\xfc=\xfd\x89D\u007f\xaa\xc7\xebM\xa6RI\xaf\xb7'\x85\xf7\x8904\t\x04\x13\x03\xa0'yP\x03\x13^\xf4?R\xc3\x04\xad\x17\xf4\x0fxS^\x8d3\xe9Ԡ\xed\x00\xe8\xf7j\xb1\"\x98\xf0\x16\x8e\xd7\x11\xfd!\xa1\xfa\x9fp\xa8\x17\x12\xeb\x04\x16sm\xbeh\x9c\xb4g8\xee\x8b\xfb\x90\x98\x84\xf1\xb6\xa7G\x1941$\x93G>Lx\xc1\x80\x97Ny\x138\xde\xe2\x14\x15\x9d.'R\xa9ԇG@\"\x91L\xa6\xbcC\x03\xc38S1\xf3I\x8e.u\x84ߣ\x02\x0fB\xf0\x0fG\xe1\x00\x11?>\x99\xca\xf1\xd6\xc2\fsj\xbe\xed6\xa5خ0\x05FƆ\x85\a\x04\x19{\x01\xd0\xff1\xc27qD\xb9\xbe\x0f\x97\xebX\xe5\x92SJ\xd9Rʳ\x94R%F\x96L!sM(\xa5\x1b~\x01l\x1c^0\x88\xe4\xec\x19\xf4\xbf\x98\b\x92\xe2\xc6a\x8dv$\x17.\xaf\x05\xccX\a\xe1V]\xadΥ\x93\xabt:\xf0\x16J\xd4\xeat\xf2\x0e\xb0\x1f\x1c\x18\xf3\xf01\x92\"GЏ\x92e\x87\xbcC7\xf6aR.#*\xd7\u007ff\xcaE\xe5|[r\x9c\xba\xccX\a\xe1\\\xfcp\xe5\xbe\xfb\xd1\x13\xc8M\xc1[\xa8\\c\x1d\x863\x94\xb2\x92\xbd\xfd`\xbfZ\xe2*\xdd؇q\xb9fPW3\x11f\xee\xb0\xf6\x1a\xce\x0f!\x8eu\x90\x89\x9c\xa9\xd6\xc3\x0e\u007f6\xaa\xa8\xf8\xf9\xe0\xfc1\x0fSJ\xb9\x8e\xa1rm\xcdo\xaf\x11\x1c\x13\xe2X\aQ\xb9N[\xdd1\x0e\xc3c\xa3_.ʁ\v6\xc6a<\x16\xa1\xfe\x05\xb7\x92\xf7\x88K\xa5\x05#\xe9\x96QGRs\x0f\xeb7\xf4gc7\x16\x19\xdfP߀s\xb3\xf7\xfcޝ\xe0to\x9b\xdcs\x0602\x11z\xaer\xcf\xff\xc1\v\x04\xe7\x9e\xee\x9d\xe0{V\xa2{n͕\xf3{6>]y\x9a\xe6T\xedЊ\xdcX\xad\xe0\xa5\xe6\xa3\xf4(\xb6|\xab'\xab\x91\u05f5\x82h\xde\x18\x82\x97\x1a\xbf%\"\x02\x97 \xb6\xfd\xf4\x80\u05eb\x90\xa4{\xbdi\x02\x91\xc4\xe1`./Md\x8a!\x9c\x95\x9e\x81]Ђ\xb3[\x8cx\f\x11\x9a\xbbC9w\xb4<\x1f\x10\x13\x89X\xc7c\xdbpKC\x00\xe4a\xcf\xe1\xb2b\x11P\x95\x19#lm\x1d\x1a\x01\xad\x11Пur\x9b8\xd8/\x19\x19\xf2\xf8\xc1\x14^\b\xedW`\x9b\xfa\xe9Mfs\xbf\xd9\f(\x05=TA\xbf\xa5{r\v\xdc\xd2\xd0\\\xb2X݃f\xa9\xac?8\xa3\xc8:\x0e4\xb3g\xe5\x9c\xe0\x98\xad\x96\xbfd\xa0\xe0<\xfcPm\x01#\xad4V\x0e\vo-Y@\x18PV\x94\x87p\t\xe8׆9\xea1J\x01Ⱥ\x89C\xf1F?\xdd\xd3!i\x82&0\x92\xc2\x00\xbcI\x00\x91\xa8SH\xaa\xa3H\x1d\xd1o\n7A?\x18\xdfU'S\xca\xeaC]\xd7\n\x057\x894\x81\xb2\xdeO\xcf\xf0z\xbdC$\x03\x83\u007f\xf3\xe7\x1f=*\x0fE\xa9L\xb5\xad@1NfY\x9eoȒ\xd2\x1e:4\x8a\x96\x96\xe9\xcf#\xad}n,\xac\auN\xf7\x11\xf6\x9f\\}Za\x13\xc8\x10\x1dgi\xc8\xf2\xe9~\xc6\xce@S\x9b\xba\xe5d\xf7&l\xe2'\xb3Y\xa2\xefp}\xe9@\xf7&:y\x9a\x130\x81\x0fo\xea\x86)\xec\x1a@\xa6\xbe\xc3}H\xf8U\xb2\x8fq\x9c\x1a\xb3\xdc\x02\xccSs\x90\xacG\xe6\xe9|\x9a\xa2\xef\xce@S\xa3\n\xb6\xa9\x1b$q\xb9Os\x82I\xa5\x13#K\fH\x89Os\x1c\x17Y\x83d\xf9\x04Y/\xd4R\x16\x82\x8a\x86\xbf\xbf&5\xd6@\xc1ѩ\xcdF\ff\xa2\v\xac\xca\xf2k.\xde`\xec\x1c\x8a\xd7\x1e\x14\xa6G뺦\xf7\xc1\x16Ÿ~%\xd90iB\x15\xd07}\xa8y\xf9\xbe\xe5\xcb\xf71_\xaa\xa6w\x05\xd0lᆬ\x98\xf5q\xe9\xbe_\xf6M\xc7\x19\xe5\xffR\xa4uŐ\x9e\xbe\x06\xdfp\xfat\xfa\x1f\xf8\xd2\xe5\xe9{\x94\x93JH\x82\xbcE\xb92#\xc7f\xfb,\x95\x8ft\xc1\x8dD%Q}\x1b\xf3:\xe30\xfeZ`\xa51\xa4\x82\nb\x8a\xfd\xc1\xd9\xf2\xe1\xfeW6K\xc4+\xa1\xd1\xf1b\xdad\xe0\rf\x93\x85e\x03\xad+7\xdfr\xdbJLZ+S\x12\xd6!\xd1\a\x0f\u007f}w\x14\xf4\xffP\xfe3\xefwi-V\x936\xc0u\xc4\xd7\xf4o\x9f\x1f+6\xe0\x98]\x92\r\xff`\x14W\xf9\xdc\x1fd\xb1d)\xf2\xdd\xd5P\x8b\xf0L \x00\u007f\x15\xa8#,{yi\x87\x82*\xe5\x0f+\xfe\x91\x1e\x1aӕђ\x95\x17\x98\x80\xbf\x8a\tg,cʺ9^V'\x8b\xbf0Y\xd02\xaf\xa5\x00\xff\xc0[\xb2\xc9g\x0e\x9c?\xee\xd6)\x0fM\xb9\xb9\xfc\xfc\x03\x89\x95\x87~0\xe7\x819?8\xb421\xd0\x12\xba\xfc\xfa\x9f\x1f^:3y\xff\x81+\xfa|\xadW\xb8#\xe7ܻ\xe1\xfa\xbboط\xfe\xde\r\x11\xf7\x15\xa0\xb7{^GǼ\xe1?\x17]\xf0\x80M\xaf\xb7=p\xc1\xa2K\xa7W\nB\xe5\xf4K\x81捋flj\x0eh9i\\\xeb\xea\t\xbb\xde\xfc\xecȜE\xdb\xd6Κ\x17\xf0Ι\xb9v\xdb\xc2\xd9\xfdÿ+\a~\v긇\xbf\x9a\xef\x1c}\x15\xb6$\xa4\x8a\xa7\x139\xf33&\x8d\x1dE\xa04\x00ɹD\x16R\x10\xfeu$\xa3\x92\xc2c\xb9\x9d\xc5<\x96a\x1c!\x05\xea\x14\x10;\xd4\xc2\x04\xb4\x17Ă\xbe\xe8Ȃ!ŕ\xcd1/嗋X\xcc\x1dv\xee\xab\xe8`\xaat\x89K\xfe\x9d\x18e\x12\xa5K\v@H\x1c\xbc\x92\xa62\u0605\xb8Ѐ\xaa8\xc86T\xc9\xef\x95\x1fj\x1fLeˍ4\xbbT\xec,\xbb\t.\v\x94\x17\xcb7:́\x8ab\xb0\xc1\xfex\u007f\xae*GASt\xd2=\xad\x8d\xf2\x8d\xd1I\xb9\xca,\xed\xaf\xa9\"\xf3\x1a\x9b\xc7G^H\x95Pu\x84e\x88\x98PC\x04n\x84\xe0A\xb7\x02\x0f\x18\t\xeaG\x99\xab\xa0W\x80f\x0fD#\xbf\x98OR~^\xf0e\xf9\xe5\xa0\xc6\xe9*\xa8\xd6\x14\\\xfe\xc0\xe5\x05\x9a\xf1\xb5NY\xa7\xf8\xd2LW|i\xa6\xaf=\xfa\x99<\xf4\xd9ѵh\v\x98ώ~<\x92h\xfd\xb5\vo\xb8\xe1Bt\x03t\x9b\xeeU\xab\xba]Ns5x\xa3O\xb9\x9a|\xfa2\xbelm\xee6h\xb8\x1e\xf1ݎ]7;\x81\xf1S\xec\xfd\xd8\xe3\x02\u007f.\xff\x83\xbai\x9c\xb5\xe3\xd5ZU\x17\xb8\x9c\x1a\\W9\xfe?\xab[\xa4\xa0ڜ\xa9\x96\x06\xdd\x06U\x15j\xff\xb7u\xd3\x13\xdf\xfdrl\xe5\xcf\xf8!\xe2.\xf6\xfd\xab\x94\f\xb9\xd2D߄I\x97\x1c\xfa\x9f\xd5D1\n\x82'\xfeG\x85W\xe5<\xb4Qf\x99\xf6\xef\xb7B\u008c\xf0\xef*1S\x01\u007f8\xc0)\x10\x10\xbeZ:!\n)QH\n\xa2\x12\xf1\x90I\u0084Z\x19u#\xbf\xfdv\xea\xd0\xfb\x87Ro\xcbo\x83\x8a\xb7\xe9\xe4\xdb 5\xea\x1a\x9c\\G\xaa\xa3zx\x11\x9c\xf2d\x12T\x80\a\x00f17e\xd7E\xf0X\x8c\xfd\xa8\xf1\\9\x97ZAm\xa0vP\x97\x92\x95\xd7{\xa8Lj\x15\x1f\xd5\t\r\a\xa8\x1e\xf1\xbct8/\x8d\xf2\xa0\xf7\x86Ҩ\x16\xc1\xd3\xe79\xe3\xf1ӥ\xd9\xfc\xb4%\x9b\x8e\xe2}\x89\xb0\x93\x8d\xb4\t\x98{\xcc\xe8_\xd2<`F\xff\xd4=\x862\x0f!\x81\x91\xee1\xa7\xb3\xe7\xc9\x06\x8c\xbd\x9b\xd9ʔ\xba\x9fۢ\xdbn\xc2\x17|\x8b\xa6\xd5\xe9\xd1o\tv&F\xd0\x04\x9bH\x8e/\xf3~\xd3_\x8e:$\x8f\xb1\xa3n\x80\xb2Q\xff\xc9\xfd$\x9f\x19ǟ\x0e%\xf1\x1f~\x10\x8d\u007f\x15\x91:\xa1\xae\xd5٩2j\x01\x96\xd62\xbeA\xbc\x85\xf0\x84\x10l\x000\xc2l\xa8Z\a3\xd1q\xd8єɢGĉ\xdbk&b\f\r\xee\xc9\a\xf7\xcfi[\xfd\xc0\xf2c\x1f\u007fu<~\xf6\xaax\xbc\xb0\xa2\xe1\x82\xc1s\x03E\xc4\xdeU\x14@}\x8bM\x05t\xfc\xefnZ4\xb901yS\xe3Z\xf9\xab\x15&\xd1l\xf6\x16\a\x16^}o\xe7\xa6_l\nEv\x1e\xb7k\x8b\x8b\x8b\xc1\xdf`\xef\x12oM\xfc\xe2\xf4\x83\x9bM\xc1\x02\xb7`\xa77\a\x1a-\x83\x02\xb1\xbf\xfd\xd3҈\x8d\xda\xdb\xd3lXd\x99m\x01\xc1\xe7)\\Ԩ\xd5HA\xf8q\xc0j+o\t\xb5ƥM\x06\xd6,Zq\xecO\xa6\xee,\xea\xc1eT-5\x99ڂ\xbfC\x8e\xb7\xc5$\xf2\x8b\xd2\xe1(\x1a*\xb5\xa89l\xa4R\x0e\x1b\xaa\x17:\x89\xeaj\xb3\xff\xffj\x16:\xf1\xc4+\xaf=\xf6\xd0\xdb\xefҟ\xfc\xedF\xab\xc4\xd6\x1bk\xa5*WE\xa0\xc2\xeepIk\x9f\xd8 Y\xcbj.8\xf6\xe0\xfeJ\xdf\r\x83\x0f\xfd\xaf\xda\n:S\xe65\xcf\xf4\x80G^М\xff\xdcF\xb9\xfe\xe9m\x95\x03\x9c\x96.䜼\xc4\xe9\x19\x86\xfeCcT\xcb\x1d\xb7@\xfe\xb9%\x9a\xe7\xcb\xc0\xe7\xff\xbb\x86\xc4kKH.!\xeb\a%\n\x1b\xe7\x88\xf5\x03\xbbud\xfc)\xec\x1ckAA\xc7T\x8a\xc2\x101\x84\xd2x\xd4\x1a7\xf6*\x8a\\\x99\x17y\x87\xfbp\xe5\xa9\xeb\xf9\xb9\xccg\xe4\xf9\r*\xc7\xe8\xf0\xe55\xbbU\x8bftL\x92\x86\x03\xe91\x84\xf5\x98ń\xeb\xc7Zm\xd3\xc1I\xf2\x95\x8c\xc3\xd0j42`\xbb\x92\x80W\x8fY\x81\xfdc\xafD1\xbe\x93_\xa1\x8b-\x8c\xc3\xc8\xea\x95D\xbaw\xec\xca\xe5|㟥l\x18S\a\xd82\xf04\xb8B\x18\xb7\x92\x00\xd6a\"\n\xc5OR\xc4\xeez#2\xd9\xd0\x13\x90(K\x10l\x14q\xbbh\\X\xde*I\x9c\xd1_\x1e-\xe44V\x8e.\x80\xe57&\u07b9kx\x1ep\xdb\xf1\a\xc1\x8b\x931\xba\x8a*{cG\xf0I\xf2\x16\x1c\t0\xa3\xf1\xa6ݻ\xeb\r\x16\xa0q\x81\x83\xf7M\x99e\x1c\x1c\x91O>Y\xf8\xf3c\x8a\xac\nO\x1d\xe3\xf6\xb0\x03\x94\x8e*Eu\xa8DmO[\x1c,\x1d\xd6\x02\x89\xe0\xb7\x06\t\xe7\x11f<\x8aa\xc2#$\x81K\xac\a0w\x03 \xdf>\xd1s\xa4\t\xb46\x1b\xc0W\xf2\x8d\vX\xbb\xc3\xe2\x90\xdb\xe46\xb4\xb1\xb3\v\xe4\x1b\xbcb%\xf8\xf7\x87֢Bۇ\xe0ߕ\"l?Y\xa7k\x06\x13\x87Z\x8a\x1f\x00\xab&\x82\xa8|\xa7l\xf0\x05\r\u007f\xff\xbb!\xe8\xc3\\I\xde8\x8f\xa9\x92\xc6\xc9\r\x9d|\x9c\xca`\xef&\x89\x8f1\x95\x03\xd5\xf7\xf91\xe0\x1bP\xb0/\xd8\v\xd3IK)\xab\xb3\xbb\xd3){@'ZY\xcahv\x8b&\x9e\xb9g\x90\n@6`\x87\twE\xa9\x0e&yI\x18\x97\xc1\xdaIJ9D\xa3I=A\xf0\xd7\x02\x9fb\x01̚\xf9|\xaa/\x85\xa2\xe8\xe6H\xa8\xe3\xa8\xf7\xe1u<\xe2\xf4R\t禓\xe8\xef\x18\x93̘*\x86\xfa\x87Y.\xe8\xb9\xffF\xfdE\xab\xfd\x9a\x18vP\xd6ߡ\xbf\x9e<\xeb\x06ݓg\xe1\xf8Z\xabE\xb9\xff=tL\xa4T\xfe\"&ǣ2=\xb7\x8e\"\x8e\xf0\x19ǾG\nGL\x11 \v`D\u074bg\xc69\x1b\x1e\xfb\x90X\xccF\xd5\x03\x00\xfbMe\xfe\xc1\xa7\xc9\xe6\xe6\xba\n8\xd0~ErnE\x1d\xd2F\xeb*\xd4Mlu|BWY\xd8Bv\x9d\xe4\x12\xe6i\xb2\x99J~{\xea\x16\x17\xc8\x1f^\x1c*/m\x9d\xe4*X\\\x87\x15wt\x88\xae˥e\x93\xab\xd8R\x10,k\x9e\xa5\x1eT\xb0\xee\x93$\x96ӈ\xb4\xf7 \x92t\x97R\xbd\xd46j\xaf\xca\x10\xac\xae<ڭ\x0e\xc5'\x96\xf8\xb8\x84\xf2\xe4E6\x1b\xa3\x10\xc6\xe0ZhP\xc0\xce\xffq;\x1a\x19\x00\x9f\x05\xcbq\x00>D\x9c\x11\xdb\xd4@\x04&\xef\x16 \xef\xd6찇\x82\xa7NQz\xa7^\xab\x05\x14~y\xfd\n\xd3\xd2@^,,\v\x15\b\x1c\xf9Q\x9b\xed\v`q\xcfq__X(\u007f.\x06l\xa0{^\xfa\xa6/\xe4/T8\x1d \xa2c\xf2#*b\x0e\x98i\x83\xd7\xe4\xdd&\xfdO\xe5\xd6\xe0\xa6a\x0f\x04\xdaS\x14\xe9\t\x80l\"y\xe1\xb8\x03$\u007f\xff\x05\x18&\a̲\x05D\xf9s7P\xc0u\x80\xf4\x85\r=j\x01\\.\x02Q\x05ܑ?\xff҆\x8a\xb4\xe0|r\x81\xfc\x13\xdbz\x854\x8aʻ\xe5}\xc3\x1e\x86ǃ\x1e\xf4\x91\f\x91u\xcdfůs\x98\xe5\x1b\x8ffB\xfeQ\xe2\xe8\xae\xc2B\x93\xb9\x14\xc4E\x1fv^M9\x914\xe3$?\xa0\xb98<\xa5\"<.\x8e\xf6L\xb6\xbd3\x9bj\x97\xb5L(\x0fL5\x8a\x06\xe3\xbdFV\xd3\x0f\xc6w߽w\x0epf.p©\xb1\xe5M\xcdn\xbbc^\x81\xa58(Uν>\xe0n\xac.K\x14\x15\x9ce\xd6\xec\xd6y\x8c@\xd7\xda{SF׆\xf8{\xf6`\x1e\xad|\xe4\v\x85\xa673\x91\xd9\xf07K\x8f\x9cݒ\xca\x1apȕHd\xa8\xb0Q\"\xa9p\xd1(@dY\xd8\v\x90T\rc\xe9T\x88YK\fKJ\xe0+\xa4V\xa2\x1fO\x96wd\xc4C$Zѧ\xc3tH\x8d\xe1ο\xbd\xa7\x10\x84\xf1n\x18\x14\x82 \xb6\xcc\x06\x81w\x00\x9f\xc4?\f\x97&\x19i\x02\x88\x86G,\x8a\x95\xd9\r蛙\x86\xeb\x1a\xc0\xd1\xfd\x84\xe2\xd0\x04|шD\a\xa2>\x02y\x10\x89\xb5A\x9f-@K\xc0\xe6#\xee\xc4L\xe6\x1d\x85\x15\x0e\x1b\x12\xa9\x13\x89җ|sĩ\xa1i@3@g\xbaM\x96\x93/<\xb3\x1fX\xaf\x846t\x90\xd6\x14\\\x05\xc0\xee\xa7_\x85\x9f\xa6e\x9a\xa9\x9by\xd6̺\xa6q\x91*\xc1\xbe\xde\x15\x9c\xbb\xfe\xbc+j\xa6/\xea\x8a\xd3\u007f\xbd\xff\xfe\xa12\xad\x81\xe6\xb5\xd0\xea\xe7\xbc+&\xadZ=\x8d9s\xd5\xde{\xdd]\tF\xd7l\xe2\xfa\xf6Ǝp7\xa9\x17@\xba\xd7Ŭ\x827G\x05\xb1\x0f\xbb\x1d/Ð\x1e\x11\"\xf3\x18^9M\x82\xee4%?\xc2}e\xd2\x17\f%C\x8di*\xd4fFi\x1a\xa5i\x94&8{L\xd4?\xbdp\x88\xaa\x18\xe7G[\x06m\x95\xf5\xbe\xf7\xc9Xګ`d\x11\xf4l\x8c'k\xf3\xf3\x98\x14&\x14\xad\xcb\xc5\x1ecb\x1f5n\xa0\x1a\xf8\xc3\xfe\xa8\x05cd`A\x17\a0g\x02\x96\t-\x12\xa6\x8a\xb1\xe1\xe6\xc7X\x1b\n\x01\x10R\x10\x16\xcf\x1a\xd7Y\xd9\x11<\xcf\v\xecz\xffŽU-\xf3\x02\xe3\x02\xe7̞w\xbe'\xe8\xa9\nv\xaf8\xac\rj\x8d\x00BX\x1c\xa4\x0f\xaf\xe8\x0eV\xa1\xe3\xe7\xcf\xef>\a\xe5\x9aג\xf8k5`Y\xe0\fTT\xda\x1bj\xba\xcb\xe7,\x01O\xceƧ.\n\xdf\x1cf\x91ء\x8b6\x04;*;\xc7\xcdZ\xbcdNywM\x83\xbd\xb2\"\xe0\x84\f\x84\x000ԈKՒ4D=#\x9e\xa6\xcaeL\x92p\xd9E\xc8\xf7H\xf16_\x86-\x9d8\xa0\x87(\xfcu\x92\x95wʫ\xa6\xf1\x94\xe0%S\x82\xd7\xce$\xe5\xf7\xde#0\x84\xeaz\x03\xa0ޓ\xdf\xc3\xcb\a\x04d\x11%NQ\xc7\xe5o\x8ec\xff[:\x91\xfc@~ƹOq\xae\xdc\xe7\x04S>P\x86\f\x05\xbf\x91\xa0䬕\xa9}Ǐ\xef\x83\xf8\x17{\xd7\"\xb9f+\xf1wm\xc73;\xbaa\xb68Z\xa0x\xd1\xf3\xa8\xd1\xf3\n9\xaa\x02a>\x1f\xf3\xc0n\r\x02\x05\x04\x1d\x98\xd6\xe0\x10\rf\xbd|\xd3\xf1}\xf1X\xcf\xd9\xe7\xbbϓѸ?G\xa7c\xde\"[yg\xfa\xfa\xe3\xfb\xd6\xde\ag\xadY\xb7Q\xa9@\x14z䛒\xfb\x8eK=\x11\xb5\"\xaeaU5v\xc8:t\xa5\v\xdf\x02o\xd1\x1dp\r\xcf\xcf\xfaI+\xbf\x9c\xe3'\x9d\xe7\x04\x8a\t/N\x12\xb6\xc5\xe4\xf2\x89\x98AO٠#HzK\x01/\x01\xd1 \xf2]^z\xe6 1Q\xb18\x92\x880\xe7)\xbf]\xa4\xddh\"\xf3\x0e \xb9\xaf+\xe7_\x1eTa\x1d\x83U8\xd4i\xb8cm<\x8a\x91\a\xd4\xcf\x1aǥe\x1d\xa4}\xe8d\x90\xc0\xc5@ų\x9c\xfe\xa1Ac`h9\xa1\x17NQ\x1b\xafS&\xbfݫ\xbcM\x9b\xa6\xb4X\x19K\xa9\xd9\xe8\xb0\x18X\xa9~\xc2\xfa\xfa\x82\xe5\xfb\x96\v\xa0JЃ\x14͠\xabX\xe5\x9d\xf7\xc8)\xb3\x96\a=Pԯu<\xb2u\x88LU\xb4\xb7\xefA\xcf\xc6\xea\xa6i>M\x807\xd4:u\xde\xe9\x13&\x89e\x15\xb8V\xbeb\xbd\b{\x00\xaf\xc5u+9\xe5\xe5\x14\xbbde\xaen\xc0\x8a\xa5W\x1a\xb3\xf0\x11\x04\x1f\xa4jdS\xb8\xfc\xf1X\t6>\xf5\x13A\x158ozt\xf6\x16+\x14\xe4$\xaf5\xe8\x13Fv\xbe\xfc_\xf2\xdfiN\xd0&,\x86\x01\x9d\x19\xec\xea\xe9>\x0e\xe6\x01V\xb02\x8a\xc4\n\x92\xdf\xca7>\xd6\xdd#_f\xd6\r0Z\xfcҬ\xa0`>\xd0&$+H\nкe\xf6\xb3\xd7H\x19\xff!\ue122o\x00ڇ\xb9\x92\xca\xf1և\xfeh\x1f\xc1\xb7\xe6N\xdc+?\xfa\xa8\xb1\xd0]\xff\xe0\xab\xf2\xa3\xaf\xca\u007f¿\xb70Ck~\xd2\xd4\\\x06\a\xd3,\x9d\xa8\xf7\xfa\x86\xa6\xd0\xcf\xe0?0evg\xe7φ\xfb\xc1\xe0\x01\x87\n\xc6cuH\xc3\xca`\xd5s$\x1a%\xdf\xd4C_\xbdV\x92\xe4\xd7@D\x92\xd6b\x8d\xaeQ\x92\xc0\x8bR\x1d\xfc\xc1\x88Uͫ\xf1Y\x10A\xf9\xea$|E\xa3\x92\x19\xbe{Z|u\xe5\xf9\xe8\xd1a\x15\x90ޡU\xc1\xdf\xf3\x9f\x0f_C\x8fSn\x87n\v\"\xf2k\xa4 \xf4\xe4\x91\xcfǥ\xc2ES\x8a\xf9\x1aʇ\xaf8\xd3\xf3A<\x96\x89vQ \xf0\xb5#\x9e\xcf\\\x9dW\x1b)WI0\xb2\x01\x80\xd2\x02#\v\vF\x16`\x8cw\x90i~m\xa6!F\xbe\x83\xcaQ\xf5R^\xc2ȥ\xe5\xcfH#\x8c|ap\xc7\x18m\x90 \xb1#\x16\xd2\xc3\xe2\xa8gaH\x9a\x80\xc4F\xa2A\xc9\x17\x06>\x9a\r2}桫\xaa\xe1j\xfb\v\xcf\x1b\x1f\xb6\x83>\x06\xac\xabM_d\x92\xeb\xd9d2\xfd\xd3\xf4/\xe8\xa3\x0f\xa7?\xfd(\x1a\xbdJ\xfet5X\x05\xbdO\x80wN\xae\xbc\xfbn\xd2\u007f\r\xa7\x12\xdc\u007f\xab\x18r>-\x94|<\x8b\xee+\xf9\xe2> \xb1\x1f\xca\xff\x1ez?=y\n\x18W\x04~\b>\xee\x18\x9c\xda\xc8<\x13\x1a\x9c\x8a\x86\xb7W䯀\x1e\xac\xbe\xfe\xae\xbb\xc0\\0\xeegj[\x99y\x85\xb3c~\u07b7\xaa\x8cCՀC\xad\x14\x1e\x85C\xeb\x01\x8e<\xb59O\x01\xb5E2VnK+\x88g\xc0j\xe9\x942*\xad\xb5j\x18\x83~\xd9\x0ey\xb3\\'oޱL+0\x1a+\x1a1{\xec\x1a\x8diu\xfbW7*\xc2v\xe3\xe4\xc3o\x1f\x9eܨ\xec\xdc\xf8U\xfbj\x93Fc\a=\x82\xc8|LƦ\xa1~\xb9߮\x81\xdae\xd7\xde\u007f\xff\xb5˴P9i\x95̫\x97\xec\xb6\xc2ˉ\xf4~\x8f\u007f\xfbd\xec\r9y\xbb\xff\x1er }\xa1u\xf7\x92\xd5f\xc9**\xdf?\x91\x1b\x02\xa38\xb6\xb0?'a\"U\x91\x04\b[/\xe3͑zyU\xc9@\xa5\xfbʙ\xc4\b\x16p\x82\xf0y=\x83K\x8e\x9f.\xa7\x86۳\x14\x1d\x9fH+9\xa4ې\x973۽\x94\x99R\xffNg\x13Q l\x81]\x8d}\x02g+D\xa5d\xf9\xff\xa13\x18E\xe0\xa7\nd\xed٠\xf5C|=\x9c\x97\xbd\xb4\"\xbd猖\x1d\xb2\x9e\x82D\xf7$\x9d\xc1\xd3\x1a\xa51\x8e\xf4\x9d\x1e\xe5K\x9d\xac/%\xed\x94\xc2\x1e\xa0c\xa7io&5\xe6O\xd6\xe7\x05\xe4p\xbdF\x95\xc3r\x86\xfd\xfcr\x8c\xf5\x03re\x00\xbf\x1d+\x99\xcf9\xcdSn*\x8a\xad\xaeY\xdf\x17L\xb4I\xecD\x84#\x01\x10\xd9#\x04\xab@\tfq \xc7패\x9c\x18\xcd\xd0\b\x15\x97a\xf0#\xa3\xfc\xcc'\x82\xd5b\xbc\xf5}=\x10\x8dI\xa3\x15\\̮\xfd\xc9'\xf2\x87\xb7\nZ\x9dh|\x15,=\xc1\x93\x13:=(\xce\xf7\x8cT\"\xfa\xfd\x9f\x80)F`E\xe7E\xa0\u007f\xffV\xa3\xc5j\xbc\x15\x14\u007f\xf2\x93\xb5,\xd0\xe9\xc8Q\xfe\x84|\xef\xabFQ\xa7\xa5_\x1b\xe9/\x99\xb3\xe1a\x9c\x93|\x06\f2\x94\x13r\x1e\xa2K\x8cbIx\x14\xbbX\x15\xfb\xbc^\xb3\xd9b\x1a\x85\x9c\x9f\xbeI\x9c&\x82\x84$J\xc1t2(i\xb4\xe8]\xc6NE\xb9Wؗ\x89,\x87ޥ\x96\xcd\xcd\x16x\x90V\x96\x84c\xa8m\xf9pF\x02&+a\x0e\xbb\x15)\n\xcd\xe9\xe7\xe5\xe7\xc1z؇\x06d\xcc=\x92>\x8c\xc6\xed>1F_9\xb4=\xb8!\xb8\xa7~S\u007f\xfd\xee`\x90\xbe\x12\xed\xec\xc6;{\x82L\xb3\xfc|\x1ac\xad\xe2\xab\xeapn|U\x1d\xbe\x1e^;\xb4-\x88.\xea߄\xf2m\b\xd2\a\x82\xe8\"\xb4\xb3;\xb8aX\xbb(\xba\xffȐ\xe51|Y\x15\x87Yz\x94_-\xf1^U\x96\x18\x86{\xab\xe6\xf8\xf7\xf2\xfa\xf6\xb0\x15\x863\xf8u\xe1\x05\xca!\xb2\xe6C+Hn9\x87\xaed>\xef)\x1cȮ\xd7˵\x84\x16U\xc9I\xefͧ@E\xe3$*\x11}\x92\xbd\x98*\xc4~\xd6\xe5 \aV\x8e\xbd\xc1\x039\xfa_\xfa\xa4X\x9a\xc2AW6\x8d\xc6Я5\x83D\xaaT\xb4\xb8@BlE\xaf\xdcM\xdf\x17\xc4+\xa6\xa2Ք\xd2\xc3d0X\f\x92v\xbb\x9c\xf4\x92\xb9\f\xc9\xc1\xe8\x19\x14\xeemRf\xfdFu%\xc4T\x82\x16\x1f\x91\x10c^\xec\xfe\x95*-q\xcb)tS9岠G\xca)A\xdfo\xd4jYJ\x12\x86\xee\x9a\xe6\x95\xd1}A\xb28\x14\x84I}J\xb0J\xc3e\x81\x92\xd2r(\x9f\xc4Z`Y~Ir\xe5\b\xe2Ximf\xd0)\x02~\x81U\x96(\xe2\xb10\xc4$\xc6\xca\xde(\x84\xb2\xcf@\x0fz)\xfd\x9ep\xe9\x8e_\\zv\xbdOw\xbf^\xe09;]\xd1W\xf5\xc0U\xa5\x06\x83\v\x86\x865\xd7c(?\x1a\tz\xb0\xb9\xa4?ܶ\xa2g\xe7\x9a\xe6'\xfeh\xa0\xb5N\xb0rG]u\u007f\x99\x85\x85\xa9a\x8d\x95\x1b\xff!z\xb3\"\xe5!\xf6\x14`\x01\x164y\x03\xd5\xf3p\x18\r\x15\x0e\xe4\xc0A72E{\xf3\\\fG9 \x82T2\tf\xa5\xfft\x8aB\x1a\xf9\a\xc4IQ\xc9\rW\x8c\x98\x92sxn\x18\xf1\xaaR\xc5\xebP>\x1a\xd4\f#G\x8a\x91\xad\xc4\\(:\xe4\x944Q\x92S\x0e\xd1R\n\x93\xa57\xab~\x9eF\xec\xf39\xfc\xcd\xd1\xcb\x02\xc5r\xc2\xed\x06\xa9\xe2@ \xed\x1d\xe6\x14:b\xfc\x1aQ&e\xb8P\a\x893\x97\xc9R\x9aN\x96ZD\a\x9a%&J \xe1\xd8~\xfa2\x81{\x02\x81@1H\xb9\xddr\xa2X\xfe\xdd\xf7/\x13\xf1SV\xec\xbf1\a8c\x99\x12\xf8\xfe\x01\xe5Y\xbfϷ\x85\x8e\xe8\xdcw\xe55\xa5\x05\xb7m\xfa\xef4\x19\x89\xc9\x15\xf4\xeb\xc3y\x8e\xb1 \xf3/T\xa6\x1e4\"9\xec\x9c\t\b|\xc0O\x85\xb3\"u(\x9eM\xc6(\xc2֍\x84nb.e1\b\x88\"\x84\xa3\x82r\x0e%\x89\x17\x9e\t\xc6\x14ӆ\x8d\x8d\xf4\x9b\x01ڠg\x19\xa3\xe4t\xa3\x17 }*\xdfݶ\x027\xd0DH\xb7\xe3B\xadl\ag\x0f\xac]\xaa\xd7rt9m72\x8c\xc9Z\xe0.\x16\xf6\xbcT\v\xde6ku\xb4\x93u\xcbN\x9a\x06\xaf\x98\x90\x84\xe0\x84\xa2^\xde=\xfe\x95\x8bŒ\xe2B\x9b\x99a\x8dF\xc3_\x8e\x18l\x98\xa6\x85cY\x96\x81\x80\xfd@2n6J\r\xe3Ea\x8b \xbe\x05(\az\xbe\xf1\b6\xcf\x02\x9a\xa1i\x98\xdcd0\b[\\\xc1\x0e\x83\xc1\xb4Ioھ\x9ffЅ\x00\xb2<\xaf\xea\xe3\xf4\x10j\x8f\xb6\x9cW\xed\xf0\x95}\x05\xe5\x05\x1b\x02q\xf8\x16G\xa8\xb09\xd5aM\x81\\WWr\xe8!\xd4\xe4\x1d\x82(\x19\xcf^\x81k\xba\xe2\xeb\x9f=s\x18\xa9\b\xeb\xb4F\xa3\x8e-멜\xdf\vjH \xd9\x1b\xe0NQ\xb8\x1b\xbd\xc8k\xe5\xebp\xceè\x8b],\x19/\x15\xc4?\x1e\xfd\xc3nM\x81\xeeb=\x80Z\xb6\xb0dy\u05fb\xa2p\xa9Q\x92/{B\x015\x06T\xdd)\x8a~\v\xe9\x0f+\x15\x9e\xf5\xac\x88\x89\xbd\x18\xdb0\xf0\x93c\xbc\x02ы\xd7[\xe9p\x95\x06\x1b\xea\xb2kM\x98\xa5[\xad\x86J%\x89\xa1\x85\xe8\xb7~uD\x14.7J\x13wuw\x14\xb0\x16\xd3:\xdel\xd2\xc2\xcd{\x83\xc1ٻ<\xc1\xee\xbaX\xb8rf\xf5\xc4qU\x05\x96\xe7\uf40c\x97\vbÆ\xf6f\x91\xb3\x18fkL\x82\x91v\xc4[\x17\x96\xad\xb8\xc0R\x16\x9c^U\x1d\xad\xef\x89O\n\xba\xc0\x8a[>p=\x8c[\xe3amEeĉ\x9eu\xb9\x0eB=\\\xe5\xd2,\x98UX\xeb\x1f簙ŀ\xbbb\\CӴq\a\xde\xf4<\x8ea\xa2\x1f\xe1\xfc\xbe23'Z\x0f\x99\x00\xad\xa3\xc5@\x91cA\x87\xab\"\xec\x0eH\xa2\xd5Q\x1dj\x9d\xb0H}g{\xd1;k\xcd\xc8\xe0\x02\xe0\xed*Sp\x98\ng\x9d\x87\xe3Y\x01&\x94\x91\xc33\xa1\xe0\xe5\xc0\xee\xc0֚\xbd\xa2\xf0\x80\xe3\xed\x1f\xdd\x0fJ\x04\x9d\xc6\xf6K\xb3V~\x1dc}l\xdaw\x97]\x9eO\xd6\xd4\xeeh\xf8\xcf\xebp\xd1h\xf2\xfd}Rm9\x8a\xb4\xc1\xb2\xb5\x82x\xf0q\xeb\xa3\xf2\xadfQ4\x80\x8d\xafj\x8d\x17\x1b\xa5\x05sD\x01\x9d\xd8,\x19/\xc3yQ\xb2e\xaeH@\r\x91\xa8\x81ʋ\xa4u_@\x05\xf2WaJ\xb2\xddM\x119j1\xc22R_%\x92F\xe3j$\xd3\xcdl\xb9\x0eg\xe5\xe0\x92\x87P\xa7 1\x8a\xc0\xabl\u007f#\xffL\xa3щ\xbf\x90t\xefJA\xdd8\xfeg\x1a\xdb\xcf,:\xadF\xfeջ\xa4\xcf\xfd\x01\xf8\x95-\xaa\n\x98&\n\xeb\x8c\xd2|Q\xe85Jp\xa2\xd9l\x16兡\x85\xceE\x16p\xafd\x16,\xe9\xe7$c\xaf Η\x8c\xeb\x04Q~\xd2(\xa9\xbc\xf7\x8a\xdeQOtu\xdc\xf11WJ~ɲ\x9d1\xf7\xe9dSʨ\xc6H{\xfbpTW\x1fؘ~I~\b|K\x16,y\xc9x\u007f\xc6D\x9d\xb1[C\xf7K\xf4\xba\x97.\x92\x13\xe0.y\xcf\u007f\x9f?ґ\r\x1d\xb8\x11\x95}\xbb \xe6\xf1\x0fi(\x03\x92v\n\xd0h{\x1e\xea\x19R@\xb2[\x1du1)\xees\xf8\"\xe1\x00>\x80\x94 倢#Ҥ\xc7\xd0\x01Za\x92\xa6\xb3\xa5͍\x87t\xe6\xbd\xf8\xa4a[;Og\x17\x1cxl\xab\x87\xb3\x8fL\a\x00l\v\xc8\xef{\xc1]W\x06&\x83#3\uf78d\x8el\xf4\xc9\xef\x12\xfc\xeew\xee\xe5\x9dG\x9c\xfc\x0fO\u070f\xb6z\v\xec\u007f\x13\xd7\xe7a\xdf5xs\xeebV\xa73\xefw\xb1g\x81ug\xf3\xce=N~%8w\x19\xeb\xdao\xd6\xe9\xd8%\x1bq\x96\xeb\xfc\x8f\xa11c>(G\xea3\x83\x19\xbe\x1eJ&\x93i\xa4J\xcb\xef\xa0\x1dt\xe8X2\xe9E\xbd4}\xb3\xd3\t{ѯ\xa0\x83\xbdD\xd6VV\x96\xc1\"\x93\xd1\xe0\x94o\x06\xbdN\xe5\xd7`4\xc9\x0f\xa8\x19\xb0~[\u007f\x8ab\xfe\x8a\xda1BM%\x98CvL|\"0\xbc-\x10\xf5\x87m\x01\x8b\x1f}Fq$\x05Y\"\xa1\x80\x05;(:j\xe3ш-\x86\x81P=4]W\xc5\xf8\t\bim+\x87w\xd0ԀvZ9\xe6Z\xf1\xc6\xedی|d涋\xe7\xdc\xda]v\xab8Uz\xa9xc\xad\xc6\xcc\xe9\x8c]\x1b\xdfN\xf8n\x9dSz묝\xbd-'<\x15S\x9a\x17\xd5\xce\xd2h\x1aC\x1d5\x13\xaaj<Ҕ\x82\x92\xe6\xda\xce\xf2\t<\xdb\xe4\x9fX\xd1\x14*\x11\xe9\xe4\x93]\x85\x87\xaf\x9cr\xce\xe4j;sj\x10\fQ\xa7\xc0S\x11p\b\x80\xe2\x8e{\x01\x18\xfa\x1a~5\xc4\x177\x9d\x9d\xbe\xa3\xa4\xbe\xa4\xc0\xc0A\xf9ǀf\rf\x97\xbf\n|\xe3\x8b\xf8\x1c:\x0e\x00\xf954=h\x04Gq\x95\x82\x8bA\xb0%\xd4xIl\xe4w\xb0J\xcc`ޔ\xccPv\x01\xdc,\b\xe9\a\xeaK\xa17\v\x11\xe1E\xea\xe0o\x05A\xee\x15\xec\xde\xd2\xfa\xc1\x81\f\xe2\x83\xc2瑽o)\xfan\xa6\xe26u\xf8,\x18T~x\x8c\xb6\xd5.\x9d\x01\xa6{\xe4>{\x1c=\xb3\xd4.t\xe4\x17\xa5\xfe\xa5\xb1\xa0(F\xa6\x99\x12\xc1\x8e\x8b\x9c~>WZ\x8cY\x95\xf6fu3 \x8c\x95\xc4\xf2\xa7\x1f\xd5i7\x87Q\xceK\xa8\x89\xd4\x1cT\xa3\b\xa6\x06\n\xf0h2\x02\n\x0eSF}R&\x1d\xa2U\xb1\x98\xe8*\xd6\x060\x85\x01\xf6\x82\xc1,\x06\x00\t\x1f6\x9c1*a\x86\x82p\x80\x8f\xe0\xad\x14\x91\x98\xfb\u007f2Հ\xa9\xf0\x98\xf4\x97:\xf9\xe7:\xa3A/\xa7\xf0J\\\x8a\xf8\xb2`\xb7\x97\x8e\xf4\xd3`\xb3A\x8bI\xd3\f\xe2_/\x80q\xf9ZΤ\x17\xb4\xb6oޒ\a\xa6W\xff\xabz\xba\xfc\xe1\xe4\x8f\xef\xfe\x98\xe9\xfd]\xb5\x99\xb1\x02\xbfaГ\x01\x812KV\x96@o\x9c\xec\x17/\xfb\xe4,h\x11\xb5Z\x1a\xd0[\xff\xb28\xfd\xb9F\xd4C\bwЗ\xf4\xf5\x1d<\xd8\xd7\a\x0f\xa7\xfb\x14\xdbO~\xbd\xebp\xbd\x83\xb9z\xb3\xa7\xad7\x18Q3\xfa;\xdb\xe1{\xd4\xfb\x8ea\xb5\x93N\xdb\n\xd9j\xffi\xacZ\xcbC\xb9\xea1\x17\x8fj\x02\x1d\x92\xbfv\xa0\xfe\xebWqӰ^\xd6@ub\f\xb9\xe0w\xbc\xe2\xe1+\x06#\x1d!δ\x0f\aƮ2\xe3\xcd_Y\xc0\xaa~\x92t\xe4$ّI\xe7\x04)\xb2s\x8a\";\xe8\xb7g\xacZ\xe7A\xbf\xff\xf3\fIe\xba\xcb\xd4ߔ\xab\xff\xc8Z\x9e\xbe=F\xad\xa0\x9ca\x9f\x19V\x01\xd9;vk\xc0\xfe\x11u\x1e\xd6\x1a\xb9v\xf2f\xab\xb2e\xac\xa6\x00[\xce\xdc\x00\xa4ϳ\xaf\xab}\xbe\x1d{\x04\a\x89\x91\x9fX\xeeO\xdf\xe7\x83V\f\xed\x1d\x0e\x85\xe3\x8a\x1c\x1a\x0f`^B5\xea\t\u007f\x00\x18\xc0\x00\xc9\b\xd8\xed\x02\xf3\x91\xb0\x13\x175յvv\xd4NN\xdfy\x9aJ\u007f\xee\xaa\xef\xde>\xa9\xb5\xca)\x86M\xe6`h\xde\x1a3\xb4ͮ\xe8\xfb\xc1\xc1sw\xdd\xeb\x91\xcb\xef\a\x90\u05c8\xadsR\xbb\xfe\xd8\xd67mKWl\xc1Xu\x8e\xb7\xee8wN\x8dY\xc3o\xe6\x19\xe3\xf6\x85\x8e\xc2k\u05ec?\xf4\x1c\xac\u07b2\x05<\xc2;Y\xb3\xc1(6.x&\xbd\x85\x1aU\xf78\xf1\x86\xce\xd5\xfd\xbbǹ\x11Փ\xbe\xab9\xbeG\xdd\xdf̯\xdf/\xbf\xa3!\x18\xb5\xf2\x83?\x1a\xab\xf6C#\xab\xc9F\xc6l\x8f\fndB]\x87]\x9ay\xeb\x8a\xc3\xc6\xc8u?\x16\xa3\f\xday;\xe1\x12\xe3x\x8c\xcd\f\bm/1\x1b\x13HB\f\xc7\n\x15D_\x9b\x15\x93\x82A\x1e//Q!\x97;\x18t\xbbB\xfd!\x97Ll\xbc\xc0\xeb\n1\xfdq\x13]e\xb1\x98\xc2\xda\xc6\xc4e%]\x96\x89\xb7/\x9c\xb1+\xe0\n\x95\x148{k:|\xa2K\xab\xe5\xf5\x85V\xc9U\xd5Y\xed3i\x81$\x89\xb4\xa0a\x80m\xe6\x16b\xb5A\xf7\x84\xeel\x00\a\xfa]\xd0V\xe1\xedj\xa9oi\bn\x9a\xd4\x05\x8bݮr\x00\x82.xIA\x10\xc2-\x89\x85>\xb19X\x16\xaeh\xb6J\xb6\xe2\xda\xd2f\x8f3\xd4U\xe1\xe7\x9cVa\x8b\xba\xe6\x8f\xc6\xfd\x04\x891s\xab8\x8cٗ7R\x83\x0f\xdamD\x1b\x86\x0e\xec\x04C\xe0\x8c1\xf9/Th\x8c\xd5&\xc1\xed\xd1Dc\x0e5\xf2\xc7[O\xd7\x10\xeb\xe3`\xf3L\xf9o\x8cF\xa0E\xd1\n\xb4&_ug\x95K\xb2\x16\xeay\xad\xd6%\xfa:jz\x9d\x05%!W`\u05cc\x85\xb7O\xb4t\x95\\\x96hԆM\x16K\x15MgZ\"\xfd\x17\xa5\rH{<ܲh\xe6\x16\xc1\xea䂥3BNOsim\xb1M\xb26W\x84˂͢oab\v\x84\xc1\x02x\x89+\b@\xb9\xcb]\f\xbb&m\n6\xa0\x86\xeb\xf2b\x14\xfa\xccZ\x86\x96ؑʩ\x16\xd4\x1a\xab\xa9\x8b\xa9\xab\xa8;\xa9G\xa9_\x10^\x13\xec\x19\x8fW\xc9\"\x18Z-\x88\x04F\xf4\u007f\x94E\u007f\xaa\x11/\xa2.\xdf[X\xd5G\be\xc1\xe2#^e\xb0Y3,1h@$N\xb0E `\xb3\xa2\xdcu\xb1:\xcci\x84\x834jA\x1d\xa1\xa5\xf3y\t:\xa9\n~\xe9%\xfd\f\x89\xf7|8@\xc00m\x11LtJ<\xb6\x90\xb8\xa4,\xdca \x0e\x8bZ\x8e\x80Z\x8eQ\vx7\x15Y\xccfK\xd1\xd3\x13'\xa6_\xe8\x9e6\x13\xfc\xa4=\x1c\xf4i\xb9\x89\x00\bV;h\xe3\r\xe3\x02\xbe\xf6vo\xc98\x03?\bi\x83;ZWd\xb3\x16\xadu\xdb.\xf3;9 _\x92H@\x9b\xa4\x9bX~\x85\xfcw\xf9\xb3+*&\xe8\xacV݄\xf2\xfd0\xb4\xbf\x1c\xa5\xd3Ƴ\xa6G\xa23y\xaf&\xa0\x9f\x06|\xb6\xa2\x9a\x88\xdbfsGj\x8alO\xb4\xb7\x138\xebvN\x8f\xee\x0e\xbe\xce_\xe0\xf9\xe4\x8eZ\xf3\x80\xf9\xa8?\x12\xf9\xebdy1\xb8\u007f\xf2\x1e\xf9\xba\xd2\xcaBK\x10\xf8\xe5\u007f:\xa1\xa9\x1887\x1e\xaa\xb3\x95\x8d+\x01\x9f\xddUZf{R[$\xd8\xc5Ґ\xbb\xe9\x92&w(T\xd4\xd05!\xe2\x02\x06\x9b\x9e\xae\xbf=\x12\xb9\xbd.M\xffdnE\x13k2\xb1M\x15\v\x8f=2\xaf\xbc\x19\xa7\x9b\xcb\xe7\xd1M\xa0\xf4\x97\xbft,u\xac\x8b\xff\xfa\x82\xbd\x8dE\xe8\xdaF\xb2q7\x83-\xf2_\x8a\xcd\xd0\t\xcc\xf2\uf0e2\xbb\x12h\x86\xaf\u18af\x03\x8d\x97\u007f!\xf1\xb2\x99\xfe\xb1\x84ZE\xed\xa6\xf6S\xb7Q\x0f\x13=\x1d\xa3\x14\xa2w\xcd\"\xa1\xa7\xae6\x18\xc1x\xba\x96\x88o\x8cגyyQ\xd4;\xa2\xe4\xe5\x05\xa3\x01\xd2aZ@dԋ\x8dc\x86\x1b?ڭ%\f\xb8<\xe7%]\x04C\x86\xa3^\xe1%=\x04Dhtw\f\x9e\x1c\x912}O\xe9g\xb8\xef\x05\xc7\xe8\xa1\xf4+a\x87\xdd\xee\b\x839g\x9d5ԸA~i\xfdj\xe0]\xbc\xd8\xe3\x16i\xb0Xc\xa8\x1a\x1f\x03Ǵ\x96Xm\xf9\xe2ŕ\xe3c\x16-\x98\xb3\x04\rkU\x8f\xb9\xc3\xed\x1d\xe1¢\xf0\xa4\xa9HQ\x81\xe9\xfe\x05\v\xe0\x1b.aQ\xe3\xd3i\xd7Ӎ\x8b\x8d.\x94nz\n~L\xd2C\xae\xb5\x17\xae\x16\xaa\x83\x85}S\xc0\x93\x85\xa1\x8e\xf6Paa\xa8\xbd#T\bf-\x89\xd6V\x195K\x00-\xba=\xa0\xe4?\xdb\xed\xa0\xd2\xdeQU\xd5qx\xf9\xf2\xf4\xaf\xc0\xe7\xf2\x0f\xcal\xb4\x17\x9c#_X\xe3\f\xb6,\u007f\xa1\xd3U\x1f{/\xbd~|<\xee\x9ek\x8c\xe8J&-\\7+\x18\x89\x04g\x1dC\x9b\xa8ۭ\xa5\u007f\xf1֤IoMN/\xfct[S7g\xb3q\xddM\x9b>\xc7i\xdej\xe5Q\x9a\x11\xe4\xcd\xf2?\x80iځu\xf3\xe4o'?<\x1b]\x1d\xea~\xb8\x1b\xdfd\x8el\x8c\xb7\x06\x9d\x11p@\xbe\xce\a\xed\xe5`\xb7\xe2K\x89ys\xffMI8\xfa\x1fp\x8a\x06\x1d\x97j\xc3\x19\x85\x19\xaf\n\xdb2\x8b2 \x06\xf0A8_\xf7\xb5;\xf4\x85ͪK\x03p\x97A\xafu|Q\xea\xa2_\xd6\xeb\xd3_\x82n\xbdNg\xff\xa2\xcc)\x1f\x13!(\b\xff\xc3N\xaf\x11\xe5iU~\xcc[\x80^\xa1\xc9T\tV\x9bmCg\x81\xf4-V\x8b\xa9\x12\x9e祯\xa9̌\xd1\xca\xd8$e\xf9E\xf0z\x0f\xb6 \xd8h\u0381\xbd\xb0\xe2\x80\x1c\x01v@\xf6ba\x80\xc4p\xc7(\xe3\xcb\x1e[\xf1Ӣ\x86\xd7\xec~^\xab\u0558\x9f)\x96\xe88oy\xd6#\xc9k\x90\xbam\xf5>-\xf2\x1a\xad<\x04n\xd1\xfc~\xd8\"5\r>\xf0\xeb\r\x96\xdf\x02\xf9\x87\x82`,\xa1g\x1b\x02\xe90\x94}\x01\xa4`\x83\xf7\x01\xfcO\xf3\x15\xa31k(\x1dO1\xffF\xa9N\xb2\x86/\xd52\xc5\x00\x83\xde+l\xf6E\x00Ss\x9a\x80\x80\xf4\x04_\xa8\xa4\x1a*3\t\xea\xd9- D\xf8\xe6[\xb9H\f\xfe\n|$\x17>\xf3\x00h\xe8\xec\x04^\xc1\xe7\xf4z\x04N\n\xa3R\x02 \xf1%\x82 x\xbcN\x1f\x1a!\x06\xe5+ސ\xdf\x18_SR\x12\x9c\xe0\x1c\x9dC\xf0\x82Ap\xf3\xc94X\xa7e\x19\x9a\xe6tf\x87\x89+X\x1aO\\7\xae\xf4\x8a뮋/F\x13\xb2ä\xe3hZ\xc2,\xd5\f\xab\xf3\x16\x8c:o\xc6\xe7EJ\xc1\xc1\xe2R\xec\x01b[\xc5\f\xc8\xc5hX`l\xc0\x16\xe6\xa3 \xea@\xff\xe26\xad\x01)\xec\x9f\xcb?\x92\xedl\x85lG\xfa\xb8\xe3z\xb0\x00\x00\xb00=\x1b,\x90E\xf9\xc7l\x15\x98#;\xe4\a\xc1B\xf0\x89\xfccY\xa4[\xe47\xe4?\x836\xf9\xa3s\xe4\xdf\x13>\xf6\xe09=\xa0\x10\xb3\xa5\xc9\x1f1\xbf\x95\xff,\xbf\t\x04\xf9\x9f\xf2?䟃\"z\x8f\xfcs\xf9\x9f`<\x12\xde\xf5h\\\xfa\x8a\xf8\x98\xe8\xd1Ȥ\x94\a\xe3?\a,\xe8/\x18gyLI\x8a\xffh\xc0k\xb1\xe7\x1b\xab\x1d\xbc\xbb\x9f\xbd\xb3\u007fh\x8e\x8f6\xf9ҋ\xda\xe1;\xed\xe9\xff^\v\u05ee}\x0f|\x90\x94\x03\xe9Gio\x0f\x18H'a\xb2\xe2\x8e\xfbn\x87\xaeC\xf2\xb1\xeb\xe0\x93\xbbҧvѻ\xd2\x17\xf7\xc0KN\xdeu\xe4\xc8\x18\xbe\x17\xb3\xa8u9/\x97\f\x18m\x06\xe7\xb6\xc4\x1fBr\x11\x96\x8eh\xbb\x95S\xfa\x80\x87\x8e\xd5ڱ\xf4\x04\xe2\xadt\x88\xa0\xd8b9\x82\xa6\xccy\xe3\x9c97\xcce\xdc4\xbc\x1f\xcbO\u007f\xfc1\x98\n\xe6ĺb\xb1.y\x8ap\xe5\xd4\v\xe7\x17\xd5vY\xf5&\x16\xb7\x1ck\xd2[\xbbj\x8b\xe6_8\xf5\xcaӟ\x82籺\x8f\xde\\$\xc7\x16\xbd\xf9\x91\x8e%i\xf02NC;q\xe8\x00\xf7*O\xf9\x98<$\x96\xfc\x9e\xb7\x1d~J>o\xf4\xfdIz\xd8wm\"8\x1f#\xfde\"\xd9\xc8\xd7L\xb4\n\xa1:R\xbe4p\xebE\x8f\\t\xd1#\xf0\x11\xb2\xc9\xf0\x18)_\xe0\xd0\x03\xf8\x98\xfa/\xff9\x10\xcd^\x98\a\\\xf2\xb1\x11-\x88\xc4}\xc3\\\xb5\xa8_\xcb\xe7\xc1\xd8r9*G\x97\xf7B\x1d\x18\x1c\x89\x94pH~}\x00>\x96\x9e\xd1\x0fjƊO\xeef/a\xefA\xfa\x04\x8e\xael\xc7}\x01ع0\x8e3\x8a\xa1wW\x85\xc9r\xd1KDoSB﹄E\xbd\x01;N#iQ\"\xf1\x10H\x86\xa4\xd1\xfc\xd5\x06\x90\xb8\xe3\x01\x9c\xc4\x11܅ :\xcc\xe03\x983#^\xc2b\xdf\x0f\xbaZ\xb3=\x1a.*\f\x95t\xc67\n/\xael\x9bN3\xd7/]\xb2\xf3#\xebԊ\x1a\xf9\x03\xf9\xb3\xf2\xaa\x84\xe8Y\x1ao\xfe\xe8\xfd\xb6\xe8\xd2\x05\x1a\x93\xb1\xa2d\xc1\x1b/\xac\xab\x9a2'a-\xf0r\xe2\x1fa|\xc0ƙ\x9fp\xcdg+\xca}C\xf2\xad\xdf\x1c2ٌ,\x0f\xb5\x01\x9bKK\x17\xf9\xebK<\xbb\x8f\x83]`\xdcm\xcdf\x00\xefk\xeb\xf2Z\xe6̱\x88\x86&ˆ-\x15\x85\x17NZ\x92\xd4hn\x86;\xdd\x01\xad\xa6\xba\x86\xd7\xf9]\x85\x01-_T\xa8\xd1\x04\x86Dך\xf6N\xeb\xf8jڢ\xb1\xfa\xa3\x81\x9e\xe7\xcd\xda\x1bn\xe0\xfc\xf5\xf4\xd3\xf7\xcbNO]\xa1eOȽ\xc9P4\xce]\xa7\xad}i\xd7CS]\x95\x1e\x8fI_%\x06\x17VuY[\t\x0e\xac\xf2\xae4d\xb4oD:9a\xb7\x0e\x11*\xe2X\x9c\x84\xb3\x93P}\t\xb7\x0f\x1e3\xb1\xf2\x81FU\xa9.\x16\n\xa3\x8f\xc6\x04\b\x87!n\xd8\x18\xe6S`9^ik\x0f\x8d\x8e3XW\x11G\t\x86\xddsJ\xcaAyx\xde4͢}}4\x8cWN\xbe\xf6Ik{\xb8\xe2\xb6\a+B\xed6c\x95\xdf\xf3\xe2[\xbe\x92\xdaz=k\xbaK\xee\xbd\xdb\xc0\xbaL\xd5w|\xfb\x98\xdfc\xba\\k)\xdf\xf4[\xf9\x1f\xfb\x96\x87\xca#\x8c\xc6^\xc2\x01\r'\x1a\xd7?\x06\xe8'\x9c\xc5\xc5\xccxP:̚wky\x95ݺ^t\xc4Z&\x9egX\xda^\xb3\xc8Z<\a4\xda\\\x1ck\xb5r|\x81Ur\xf2H\xb1`\xf9\x824͇\v\x98\xbe>\xcepk\xfdlw\xd5*iB\x1f\xfcU\xd4\x1e\xf7\xb5\xb9\r~\x93u\xbc\xa7㪗K\xd8:\xab_\xdfm-\\b\xb4\x86l@\x0fjG\xccC\x80\xea\xc01`\xa8Y\xfd\xd8\x1e\x88\x87\x95*\x1aIbQԟ\b\u00a0\xcf\xe6\xb3X=\xa8\x05\xe9G\xba\x1d\x8f,\xee=\xb6i\xa6\uf069[:\xc6[Y\xc03\xff\rfȏ\x1a\xbd\xed\xe3g\xbe\xf1Y\xa0\x15\xc0\xfa\xa5\x17\\\xd0\b\xbd\xef\xba\x16.۸\xb0\x92\xe5\xe5EC铞\xba\xa8\a\xc0|;\xbf\xc2 \x1bFS[\x15\x8cZ|Q\xecЁ\x06>\x1e\t\x84\xf8Y\xad`\x94-tSkESI]\x81\x0e\x80S\xd4q\r`\v\xa2k:\xf6\x96/\xbcmդ\xcb\xc1\xdd\xf9\xed7\xfd);p\x94\x8es\x80k~\x01&\xeb*\x16\xf4.(\xb8O^ް\xado\x02\x04\xe3\x99\xea\xe1\xb6P\xfaT\x02\xa6Q\xdd1j\x8f}l\x95\x1e~e6\xcaw댂N\xbeè\xd1ZU\xbc@\xa4\xb4\x99\xe5\xa4N\a\x92fIb\x88\xcdb0\xe3SB\xc14\x9b\xc2\xf7T\xfdV\xb2\xb0\xc9q5H\f\xa6\xb3\xf7\xb1\x99\x8d`9\xbe;Xed$i\x908p3\x03!3@7\x97\x93f\xe5\x1d%\x00\xcdSt\x9a\xdc3\x83\x82\x9f\xc1\xc0w(\xe0\x19<\x85K0\xa2Pp`\xf83V\n\xa4\x06\x8a\x1f2\xa0\xb9\x94zO\xc5.=\x1c=\x1f\xb3\xea\xa4p\x11F\x94\n^\x8a\x9a\xe2NA\x93_\x05\xd4@Y\u007f\xfcͨ=C$\xeaQU簰\x1e\xf0\xd30\xaaJ\xdbXf'\x1a\x9f\xc2\x11\n2ܪ\nѝ\xc3jg7\x87\xe7]\x92\xacY\xb2`B\xcb\xecّ\x9bo\xbc~\xf3\xe6\xa3S\xd7\xf7\xfa+W\xae\x9d\xb2cy]ݬ\xc0\x84\x03\xf2\x87E\x9e\xb6X,\xd8NO\x9f\xf6\b\xa0\xd1\f3a\xf7\xee\xe7\xbd^\x9f\x1f\xed\xb0\xff\xfc\xe8\xd0A\x8f\xc7\xef\x9fP\x92h\x8f,\xdf|ы\xccΖ\xe9\xd3\xdbb\xa2\x9e\xbb\xf1\x9c\r\xe3h3\xcd\x18\xb2\xfe\xfc\x04\x8b\\\x91\x0e(`\tZ\b\x9b\x93\xba\x85?J/\xc0\u007f\\rh;v\xed\x82bz\xfbrX\t\xff+}.\x8c\xa6w\f}\xbe\x1b\xdeH\x9f7\xf41\xbc\x03\xbbu+\xb8\xb3\xec\x1e2\xdf\x17\"It\x06ҁ(\xaa6F\xe6'Fݲ\xca,\xa6tn\x05ʒ\x04T\xb6`u\x97,.\x84\x89\x8d\x10\aZb\xefz\xec\xc9Z\x8c\xdd\x18p\xa08O\xbe\f\xf5è\xb5\x83\x0f\xbc\x0e\x87\xd7\x0e\x8e{\xedv\xafch\xb0\xac\xb9iAs33+Q9\xbdyA\xf3\x81\xe6\xf2\xb2f0\xad*\x01\u007f\xbc!9\xb4*y\xce\x14\xde`䧮x{\xc5T\xdeh\xe0\xc1a|\xbe\xb9\xac\xbc\x99)r\xe0\xfb(\xff\xdeh.\x93\xe7\x9477\x97\x83\x1f\x975K\xe9\xb5U\x89?\xe3\xbd?+\xbf\x89*x+\xb81\xfe\xc2\xf6\xed/\xc4/5\xf2\x9ca_Y\xd9>\x03\xc7\x1b\xd37f\xae*ojB\xf3(\x96\xbb\xbe%\x9c\x1b&\xca\x0f4H\x15\b\x82\b\xe8\x04\xff x*\x01L\xe9T\xeb\xe0B<\xaa\x14\b\xe1q\x87\xe7\xf0\xf8\xddJ7\x83\x10\x12\xe0\xb1\xc0\xa3\xc8;x\x99\x04\x9dĒ\x0f\x99\xe9B1u9\x05\x0f\xf2hԏ\xc7\xea\xa2\xe80\xe7\xb0\x06\xaaP7\xc6\xc4\xf4\x1c\xe6@\u009a!O\x02\xa0\x1c\xb5v\x8e\x04\xaf\x92)\x96\xc6c?\x8d\xa7\x04\xa0p\x9c\xa0Y\"\xa4\xcc\bh\xfa\xc4\xc1#\x02^\xb1\xc1ކV\x01\x92!ю\xb3\xe0\xf7@JI\xbc+\xc9\xd5\x1eh\x8b\xa1\x19\x06\rX\xe8j\x12ȏ3\x10\x03n\f\xcfA\x91V\xa4p\xe0\x02\xd9\xec\x8eZ\x9eC\xba/\xae\x12\xa3LU\xe1:4\xe7\xfbq\xd2aE\x17\xd7aa. `\xb1\x1fM\xfb\xf8\x0e\xb51\xe0\x81\xb88\x80@\xb3\xd0\x04\xbc\b\r\x93a\xa5)\xf0\x03p#`\xe9\x10DI\x11q\xe1hފ\x1a\x92\x94\x10\xaf\xbb\x91ո\x10>I\xd6\xe1P\xbd\xe3\xca\xfc\x18!`6\xbc\x9a\xd7N$Or[\xd4F\xb8Y\xd5\x1b\xab-\xeda\xe1Mz-\xc3J\xecRƤsjh\xf96\xa4\x05\xd04\xaf\xd32\x16\x06@\b =?\xce\xf04\ry\xa0\x05\xbai\x01\xa7o\xa1O\x1f.6\x01\xbd\xd6&\x1a\x8d@\xf0\x17\xd8\x19ƪ\x0f\x9b\x9a8\rg/\b\x16\xea\xf4\"\x92*,\x05v\xf3\x06\x11h\xc7\x15\xd0\xc0_\xe8.\x82@k\xe1u\x1c\xa3\xe7-\x00X\x9d\x16+\x00v\xad&\f\x8c\xacN\xb0\xeb\xdc\xf6\xea8,s{Y\xad\x9e\xa5\xb5\x06k\xa7\xb6\xc2U\x10Cӂ\xb9\xa0\xcc\x12\xf2\xfb\xdcv#\x84\x1c\xa7\xe7\x8dtᬘ\xddVf\xa7\x81\xa7\xc8(:fi \xe046/\x039\x86\x85\xb0\xa4\x8a-e\xac\x0fh\xcdt\xb1GS&T\x85\x19#\ah\xab\xae\xea\x82\xcb*\x1cz\x03D\xcf\xe4l\xb4\x03B\v\xb4\x9bJ@\xfb\xcc\xf4]\xb4\x9e\xd3BZG\xd3z\x1a\xdc\x03\xb5\x16\x8eղ\x1c\xa4\x852Q\xab\u007f\\g\xa09\x86\xa1\x05F\x03c\xac\x916i\xb5,\r\x81\x0e2\x8cF\xd0\x00\xb3\x00\xe3V;䝎\xa0+\xa4\t\xad(\xb4\xac\r\x89\x0e\x9d\xdfS\xb1@\xea\xb2VL)\x89\x14\x16ݛ\x90\x12%\xe5NV\xe7\a\x00\r\xe1:a\x81\xc5\xe3\xb4E\xbd\x11\xbf\xd6(B\x03\xcb\x00?M\xfb\xad\x97\x04\x9c\xab'8\xca\xcbiѪ\xbbp|G\xa5\x9eA\x83\x9f\xe8\xe15A{\xc8z\x9e```]wxB\xb4\xaf\xa4a\x12\x8b\xe4\x84U\xf1\xc5&$n\xe8unw\xcc/\xbaE\xad\x00\xed!\xd1l\x95t\xf5g\x956\xb5tF\xc7\xeb\xc3^\x9f\x8f\x16\x80`r\x99\xdd\xcc\x1a \x01\u0380vM\xb4\xde\xc8\xc9s\x80\xc6²\x1a=j_\x1d\xad\xc1/\x1cʷ\x8aNS\x81\xdb\\\xa4\xf3\xf3\xe5\xec\xf8\xf3\xacֶ\xbb\xb7\x95B\xa6rgU\xb8\xb9X4\x80\xd69\x9e\x12\xbbm\x82_C{\x00\xa8\xad\x03\xf4\xc4\x02\xc9\xc43\t\xd6Sj\xd3Қ=&\xa4@\xf2\r\x13\x01h(6U\x14CZ\xaf\x05E\x92\xdd\x03\xcaJ\x18\x93`p\x00\xc1\xc5j\x1c&=\x80\x16`\xd0Z\xb4\x02\x87JBsŌ\xc4 \t\x94aL\x0e\x00\ffɤe\xb4\x90e\x19\x8e\xe6\x81\xd0\xec2\xe8[\x8b\xb54_\xd06\xbe\xa3\x88{\xa0A\\\xabqڊ\xdb\n\v%\x00\x98\tk\f^\xc6q\xb9\xd6TUJ\x9b\x9aj\xaa\x9c\x1d\x1a\xb3\x06\xb2Z\xbe\xcel\x9a\x1a\xd2pU\x05\xedHݖ\xb6ym\xeb\x17\xbbĠWO\x97Y\\\x10jY`\xb2\xfeB\xc3\xd3\f\xad\xe3x\x00\xcdq\x06\x88\x03z\x8b\x060\f`\xdc4\v?\x85\x9c\x06\x9a\x80\xd1\xc81F\x96\xa3Q\xbb\x01\xe6\xe4K\x86\x02\x87\xddn\xb1\x1aEF\x9a\xe66\xf3\xa2\xb6Ȏz2zK\x85\xde\x02\x00\x9a\x8d\xa8g\x1b,z\xc7B\xbdy|\xb0Dk`t\xa2\xdf\xdf鳲\xb4\xd1T\xc69\rv\xbd\xa9C\xb0h\xb9\x02\r\xe7\x15h\xae\xa2nB\xd8\xf2Ӻi~\xad\xd3l/\xc2t\xdekc\x1d\xd6k\xeb6\xbdx֮r\x1b(r\x97\x1d\xe9X\xb1c\xf3\xfa\xa67\x17\xd6L)\x85\xd0\x1fD\xad\xae\x91\fElP\x98\x17\x9f\xbc{\xc2\x14\xd6W\x13(@\xd5*\xd0\xeb\xa7M1\x14G\xbf3Q\x19_\\Uܶ\xb1\xb3eIsP(\xb1\v\xd6\xd2p\xc4[Y\xe9m\xae\\zip\xf2\xf6\x83G>\xec6o|\x0e\xb0\xd7v\xce\xe8ݫ\xecȃx\x87\xe8\xe7\x15Hwx\x85IJ\xb4Q\x1d$\xe2*c\x0f\x89\x13|\xf2ZBS\x1cʳr\xc6\xe2\x9c\x0e\xbb\x94\x10\a_\x80\t\xed\xb2\xf0\xa9t\xcc\x05\xe8\xbf\x06\xd9B[\xba\xdeQ́\x80\xc3\xe3\xfb\xc2\ue85dF\xa6\xd8&\xff\x0e\xafF\x83\xb3D\xffǦ\x19\xad\f\xc7\xd9ݵ>\xf9\x1fF\xadF^n\xef4Ļ\xe6\xd0\x17\xacH\xd8\xefdZg03\u007f\xe1\xf0\xfb\xad\x83\x8f\xa1\a\xf4\xb8LE\xa6\xbd-6tmYQ\xd0\xfdy\xa7\xbc[\xfe\x95\xc5n\xab\xb0[uZ\xd9]\xc0k\xed]\xec\xde\xf8\x8a\xbe\xbe\xa1O-\xa0\x01\\J\x8dXwP4\x95Q\x9e\x9ag\xc08\xc5vi\"3\x83\x01\xd5b\x9b\xdd\xeb\x0f\xb9N\x12\x93\f\x8b~S\f\xb1\xf7\x0eQ\x84\x98\x1c\x12K.\xb1\xe7\xd2B.S(\x13W\x86\xfd\xaf\x06\b\xff\xa3b\x85\n\xd3\x01\x9bd'~L\xc3\xc8Y\xea\xe2R4@\xablm$\xf6\x1b\xc9\xf2\x99\x98\x1f\x96\xaa/\x8d\x14\xfd\xb9\xf2kmȕ\x9aX\xd5_51\xe5\ni\xbf\xae\xfcsQ\xa4\xb4\xde\f\xa8\xceu \xb9\xae\x13Pf\xb9\xe7\xd2\xff\xb8\xf4\xd2\xff\x00\x03\xa5\xf5\xe5`\xfe>y\x8dIt\x85\xe4/\xab&N\xac\x02\xe6\x90K4\x81\xdb\xf6\xc9G\xcb\xebK\x8b\x9c \xb9a\x83\x9ct\xd2=\xf8\x82K\x95\xb22\xb8\xacA≫\n\xbb\x81\xd3l\x956\xcb\xe2\xb3Q\xf5\xdd\xf5\x89\x89K'\x92?\x94\xde\xd4\r\x93ݛ\xe4\x01R\x1a:!+\vt\xcf³\xeaBGw\x9c\x90\xea$Iz\x815\x8f\xf3\xba08\x9c;\x1c6\no\xd8\xccb\xd4\xfa\xe7-\xfd\xb8b!\xe5B\xe56\xf2\xef uٳϢ\x0f\xfc\xd4)\n\xf0\xbb\x99)\xd4e\xc4g\x10\xaf\xa7\xe1\xa5K\xacY@\xa4\xea\xb1\\\b͍4\x1a\xf5\x1dVB\x81\x81\x97}\xf0\x11\xa4f\x11\xe0\x1c$\xb2\xe09\x12\xffz\xe8\xdax+C\xb0#\x88\u0085{\n\xd2i\xac\x04\x0f\x86\xac\x8a\xe3\xd5<\xc5\xfe\x01\x1dA\xa4\xc3\xf0\xbb\x1dǜ\xe3J=żT\xe5g\xc0յ4\xcfk\xcaB\xa7(g\xc2j\xf5t7Lp\xd2:\xa7d\x02<È\x81\xadS\x0eo^\xe6,\xd0\x05\xce齺\x99\xa3\x19S\x19\x10\rv\x965k\xacu&sQ\xac\xbc\xb4\xd0\b9Q\xabc\xa1\xc0s\x05\xcdF\xd1l\x8f\xfeǜ\xa8\xd5-\xf0\x10\t\xf4\x9cEЈ\xfe\xb2\xd6`s5\x83Dr\xc8Yu\xc0\x1b\xae\xe5\xe8o\x12\x1f{\xa3\x91\xb2\x06w\x19\x12i\xe1\xa5g\xb1\xa6\x90\xa7\x80a\xad\x06\x83m\xc1\xa4j\r`\x9d\x81I\xe5\xa6\x02\x8e\x95hf܄v\xa7SWzM?\xe0\xae6\xdbYNB\xb2&C\xebm\xb5\x1b\n\x8b\x9a\x17\xd5\x14\xb2@S\xd2\xd8\xdbY:\xd1h\xf0k\xa1]һ 0\xb0\x96b_c\xdd\u243e\xd5_]\xac\x85\x8c\xab|Ik\xef\x85:\x13\x06\x1f\xa1\x01dMZ\xc2\x15\xfc#\xeekv:\xa5##^55\x9fZO]\x8c\xbeƬN\x8cgc\x92D\xfa\xa7#\x83\xf7\x89\x1a5X\x05Jx\x8e\xc1\x1fb[\xa2ZB\x0fP\x01CcH\xbbTT\xca 9F\x0e\xa1\x13Xe\xc7*:\xbc\a\x9b~g\xda\xecb\xc7\xecm\x1a\xadQ(\xe2-\x1e\xc1\xf3D\xe5\x9f6n\x98]]}\xa2o\xe3\n\xa4#\xf6˧\x0e\xfdQ\xfe\xbd\xa0\xed\a\xe0\xd0\x1fA\x10\x84\xa6\x1d\xfc\xb9\x9c\x96?\x96\xff\xfb\x9d\xbdW&\x1f\x04\x8b\xa7M\xa8d8\xc1\xc4qW\xfe\xa6\xaa\xb2\x12\xb2\x82\xceа\xb4cۼ\x02IS\xee@\x05\xb3.js\x961\xac\xcb\xd9\f\xe6/\x8c\x84\xb5\xb51\x97\xa6\xb0\xa4\xb5\xf5\xa1\x85\x85\xe3\rŅ\xbb\xfe9\xe4\x9fl\x12\\>\xff$\xaf\xfb6\xa3\x9be\xf5\xc6b\x81\xd5/_\xdbS\xe2\u007ffŲ\xa5\xee\xa2'\x9a{n\x98,8>;\xa4l\xae\xe9\xb8\xf6\xd2\xde\xd6\xf6\x1dO\x9d\xb3\x150\xc9\a\u007f0-q\x9d`@\xbd\x006\xb5\xb4m5\nzԡ\x1a\xd7\xc3\x15\xcbwգ\xa7\xa32\xb4\xf5\x18\xd1ӝ\xe3X㬞\xf4V\xb7K\xacu\xcfy\xbccRT\xe4\x8a\xeb\xab9\xd7\xf4|\xd9b\v\xa5\xa5$\xcc\x17O\xf8m\x91\xa6\xed\xc1k\x9e\x90Ǥ\xcc%\xc0̣\x81\xd2bgD\xe6ܣ/<\u007f\xf4\xc0/\xfd\x81_ʷ\xa5_}\xe2~P\xc2D\x9fx5\xfd\x18(\xb9߿|\xf9\xc2o\x0e\x1e\xfc\x86m\x91\xddC\xf2٫\xde\x05\xceg\xc1\xa4ߤ\xcb俾\xbb\n\x1c\x19\x02\u007f\xf1\xfcF~VY\xebC\xb2\xc3N$\xa7m\xc0k/4\x16U9\x8a'(\x1fh,\x16 6\x1f\x00\xf4q\xc5p\x9a\xc5i\xb6\x18ĢU,\xd2\xfb\x19\x01i8hx\xc2k#\x02\xfe\x909\x9cdwz\x17-\xef]\xb5|V\xb3ٲY>\xf2\xa6\xe4rI\xc7@\xf9ڒ\xa9\xcb\x17\xad\\0\u05f7\xe5\xa5˷\xb4\x15D]\xbc}JNJ9\v\x12\x95\xdc\xe4\x8bW.h\x89\xf8\xec,cи\xa7\xd4\xd7\t\xa1H\xe7\xb9\xcd%,g\x155\x92\xbf\x05\xaeP\x01x\xe7\xb8 j\x8c\x15\xd3\xf6̭\xb6\x06fvU\\\xda\x0fhH[\x8a\xea\xa7m\x9d\\h\x91\xc65\xb5\xb5\u0558\xcc;;9\xeb\xa4i\x9b6_\xddQ\xd0\xd9}֢\xb9\x93c&\x13\xb3\xd4\xc5;ڢ\x8d\xc5\xd01\xf3\xe29-\x1e\x11}>\xf4\xf5W\xf0\x8e\xa6\xaa\x10\xacAb\x8b\r\xc9.\u007fc)\xe2In%\xf1UD\xc2\x02\x8a\xcf>\xb0\xf9,\xf8/h\xcb021\u007f\xdb:\xbbA\x1eJ\u007f1{+\xf3\x9b\xc1\xb2\xcc\xdf\xd6\xd9\xf4\xcc\xd9[\x81{\xe2\xfc\x1d\xf2\xbf\x80q\xc7\xfc\x89`\xf2)\xea\x14\x98\x8a~\xaejo\x9f\xb7cG\x9e\x9c\x89\x11\xcaj\xd4\xf8\xa01iL\xed\xa7\t\xeeb\x92*\x91i\x86dS!2}\xf0\xbb\x02\xbd\xe05c\xf0\x99\x1e\xfd\xae\x80\xafa2\xb1Z\xd6\xe1l\xac\xf9d\xac\xe2iˊ9Kq\x01sT\xac\x98ɴ\xff;\v;\xa0\x16\x11\xb4afT\x85\x91U>\xf5\x9d\xa5\x1d%\xbf+k\xa6\xb9b\x8e\x94\xdfGY\x1b\xa8\x90\xcbjQ\xc2\xce,V\x1cC\xfb\x1d\x01j)\xec[eP\xc3\xc6\f\xa1\xa1\x17\xbfG<\x18\x8f\xbe\xfd\xe2\\\x1c\xbex\x1a\xc6\x00՞[\xf6]\xbc\x01jt=\xf0~'}\x80\xea\xe3\xbe\f\xc9\xe46*\x86#A\x898\x86\xa5\xb1\xb8\x03ϭT\x04\v\xa5\x0e2\x1a\xd1\n\x90X\x9c\x90\x8bbK\x83\xe4\xb3\xf9p\xb4\x97D\x9fZ\xdb(\xbf\xf9\xec\xed\xf2\u05f7\x9d\xf8\x91e\xe7!\xc0?\xb3\xe7\x9d\xed\xd0\xddx\x8a2\x9aK-_ȥ\xce \xdd\x035\u0082\xd8\xc4\xe5\xbd\x1dAp\xbf\xbc\xde\f~Uj\xf9\b,{\xf5\xb1?\xdc\x06\xb4\xb7?\x01\xcaZ/\x8d\xfd\xf1\xb2g\xe4o\xf7~\xe0ڒ\xe4\x03\xe0\x03\x9f\x93\xd6[\n\"m\xcb'N:\x9b\x97\xff\x98L\x06\xe4\x86a:\xb6\xc2\xeb\x13\v\x87h\xf4\xfax\xec>\xa9,j\xe2\xa5Q\x87\x12\x9b\x85\xed\n\x928\xca;Ѡ;\xfa_\xb3+B\xf3\xf5\xccU\x81\xf2\xb0\xd1\xeb\xd9۴\xde}\x8e\xbb\xaeK\xdfPkj6u\xf4\xdc\xf1\xa7\xf7O\x0e{\x9f{\u007f\xcbi\xe4\u007fI=\r\xef?\x18\xfb\xf5s\x06~\x99\xb3\xc7\xd9^\xf7X\xfc\xf7\xf1\xc7@\b\xb8\xc1\xc5\xc3,h*\x9e\x03*#\xd6\u007f\xad\x90Q\u0530\xac\x83Q\x1b\x88\xe6\xa73aXHp)Br\x1fk\xcb$,1J=\xc9$\x9f\x93\x8f\xff\xac_\x10ߥ9\x9d\xd6\xe8\xf8$\xb3\x15\x05t\x10\xec0\xb9\x1c\xf2\x0eus\x1c0\xe4(L\xfdL>\xfe\x9c(\xc0U\x13\x01\xa73'\x1d\x9a)˲\xa9\x93X\xab|b\x1bk\xc5{\x17.\xcb$\xe4\x02#\xb0\xfe\x14{\xfa\xe6b\xbf\x03*\xfa\xb4M\r3R*\x93\x1d\x8c\xb2V\xb1\xef\x19\x0f.+\xac\x96r?Q~{\x94\x18\x94\x9e3F\x87\x8f\xcaO\xee\xf4]\xd1\xe2j\\\xac\x06\xe3x\x86\t\xe3_\xb7b}\x8b*Jp\x15Ph\x8d\xb1\x8f=\xea->\"\xc1\x10WT\xc0\xc7\xd1\xe4\xe6\xc0\x91\xbe>\x8e\xf7#\xf1\x14\b\xa0\x1cБZ: a\x88^\xe0a\"\xac/\x04\xcf9\xef\xce$\xfa\xa4\xf9\xc6\x193\x1ayɘH\xdey\x1e\xb3\xb8\xec\x12\xf3❕\x95;\x17\x9b/)\xe3\xa2\xd1\xd9\x1d\x1d\x83\xf3\xe9\xaf\xdf\xfb\xa2a\x93\xbbP\x1ep-\xae\xecYVt\xc7\x1dE\xcbz\xaa\x16\xb9\x80\x97\x11\xaak;K\xc0KC\xdam\xa0?\x91\xa8\xf69\v\xa0\xc5i\x81\x05N_u\"\xc1\xdbiS\xa4\xa2\xa4\"b\xa2\xed\xfcPɦ\x12\xcf\xf8\x1b\xc6˿\t\x95\x8dw:\xb1W(x\x13\f\x807\xb1\x87(c\xf4\x15غ\x13\xea\xf7\x81\xb1D\xe6\x10\xffd\xfc\xb1b\rQ\xb1\"!\xa52\x97\xcc\x104\xb4\x01:\x97\f\xabn\xacH\xc3\xcc%Ux;\xd4\x10R<\x06\x824\xcb~\xd1:w\xd9C\xf5\xfc\xbc\xa6\xea\x19\xa6\xb8\xfcr\\3\xaf\xb9\xba\xcb\x14\xbf\xa5\xc8\xd62;^q\xfb\xfa\xdb]\xf6\xe69\xf1\x8a;\xa2ʉ\x18\x88\xc54\xf3q\xe6\xe8\xdd6{\xf3\xfc\xe6\x8a;\xd6\xdf\xeb\x1c\x1a\x02\xb1\xf5\xf2\xcb\xf0\x9b\xd9-g\xfb\x9a\uedf9\x9a\x16\xc4*\xef\xeb\xbb\xd7\xe9\xc0\x89{\xa2\xda\xee\x16t\xed\xffG\xdbw\xc0GUe\xff\xbf{\xdf{\xf3\xa6\xb77\xbdf\xfa\xa4'3\x99\x99\xf4N\x80\x90\x84\x10zh\xa1w\t \x1dahb\x03\x15\xa5\xa8(Q\x11\x1bv,(\xbaY\xfbZP\x17\xb7\xe0ς\xbb\xb8\xbb\xb6\xb5\x17 s\xf9\xdf\xfb\xdeL\b\xc8\xfet?\xff\xff?0\xef\xdd\xfa\xca}\xb7\x9cs\xcf9\xdf\x13\x03eq\xe9\br\x95\xd8>\x8b\xb9rt<\xbfgn\x0f)\x92Ȼ=!\x19^\x91?T\x13G/\x96J\xd1鹠b\xfe\x85{5ق&\xd5\x05:\"@\x97vd_\x06Ү\xecC\xe9\x1e\x9b\xe9\xc0i\xbc\fI\xa4\x9aM\x04\xaa\xc1@%\x12\xfa\x84\xdb\xe3})6\xad\xbe~Z\xe1s\x85\xca\x1cyi\x98\xae\r\x97&\xb2\xfbzåU\x81\xc2\xc7C\xb4C\xed\xe0-F\x83\xd1\xc2\xe3\x10\r\x14\xbe\x9a\xf3uMΜ\x00\x87|\x06\xd3:\xff\xa0AY\xab\xb2\xa4A)j!\xce\x14ff\x97\x97\x86\x03íYKl\x90\x97\xe9dD\xe9\x05\x9fx\xf8\xa0y8\x95\x91%\n\xb6\a,\xee̓\xa9\x11\xd4Tj1E\xf1x\x05\vB\x01!\x93\x16D?A\x8d\xb8\xa7Ax'\xbe?\xc9\x1b\xf4\xc5\xfdą\xb7h≩}\x967\x99\x855\x10\u007f[\xc8\xf1\xf1X\t\x95\xc5\xe0\xa5\x1a\x12\x90\x9d ^n\xe2T\x96?\x8e\xe3A\xe2\x03\x04\xc7M\xeb\x1b\xc0\xa2\x17\xff\xcdJY\x8d\xd4δ\xa0\xcf\nrx5Ͽ9l\xbdR'\xa15\xca\xf6\x95\xf7\xa0\u007f\xa5Ӹ,\xf9\\0\xf2\xe5\x1b\x80b\xae<\xd1\xcc0J\x89\x1e\xf7\xe6\x1a$\xf9\x120\xeb6tϥ\xd7Ly\xfb\xa1\xcf+\xfa\xee\x00\v@\xcb\xd7۷\u007f\x8d\x0e\xa1\x1b\xd1!\x12\x02\xa3A'\xa8\xfa\xe4\x8a+>A/\xa0\x03\xe8\x05\x12\x82\xc9;w\xf5\xf1S\xc0\xa5@ʇ*\x1d\x9d\xaa\xb3\x14]N\xb3\xd0\xe3\x04r \x03J=\xaf\x06R\xf4\x14\x92ҵ\x99Ԟg\xe6u\x8dH(-\xbc]\xe3R\xfa\xd9\xf9\xc7R\xab$l^\x16\xd3\xf1\xe0\v\xef\xa0}\xb3\xe0\x81{\xe7\xe7\xc0\x92\xf3n\xdc\"<̩'\xaf\xf8\x04T]\xf0\f\x99\xb5Gh\u007f=\xd1\x17\x03:6\xe8'cğ0J\x18\xa3\x811\xeb\x00\x1fH\x04C1\xc6\xccT\xa3\xafO\xa2k\xfe\xfc\a0\xe9\xf8q\xf4)\x88}F?\x10H}wÊہ\xf1\r\xe2\xa24i؟\xdaq\xcdO\xfbm\a\x83'\xae\xdd\xf3\x0f\x17ێj\xd0\xea%#\x9b\x9c\a=k3:\xe6\x82\xdf)%\x15\xa4\x8a\b\xf2\x80ї\xee¾\x18\xf0袺\x01\xbfs\xd8ql&\x18\xa5{\xe9\xded\xb6\xe3\xb4ܑ\x9d\x04xMJf\xfeW8\xb2O\xe1\x8c\n\t\x0e\xfc\x8c\x03\x12\n%E\x04\x90\xb3T\n\xdf\xf8\xdcO\x84'%\x1e\xed\x92\x19_\xd1I\x99h\xbbN\xe8\x05\xde$t\x94\x04Ϛ\"\x89\xb4\xbf\xad\x00\xb1\xba5\x1a8>\xad\xe3\x89s\xc9d\x1bO\x042~\xbd$\xff\xd63\aџ\xd1~\xf4烌\x1eV\x9bJLL\xbb\xe9L\x0f\xa3dR\x97\xe6\x96Jj\xcaˡ\\\xa6\xe9\xd5\xc8䰼\xbcN1\x16=f21]8\x9b\xe9\x82GЋ\x83\x96\x0f\xc2\xffA\xe5\xe3\x1c\a\xb5\x05R\x84yã\xde[f\xfa\x87\x0e\n\xa2\xe1j\x05\xfeS\x83G\x82\x83\x86\x06\xdfZ3GZ \x05]\x00\xa0\x1e\xfc\xfe\v\xcf&\xd9\x1bD\x9d\x16\xc0\x13\x01\x05\x1f\xa4 \x91g`6Ko\xae\xa6\x13$XL\x00\xed\xe8\t\xaa\xea\xdc\xecZU\x18\x9d}xRy$\xaf\xa1f\xdb\xefs\x02\xd7w\xae,\x8c\xc7J\xcb\x1d\xb5\xbe6\xf9\x0eؐ\xaaR(\xe0\v\x83\xc0K |\xb5F\xb3\xe8K\xfcdU\x9f\xde\xf0\xe6X\xb5:4\xbd\xfcr\xdd\xcfi\x9f8\xec\xc7\xc2\x1aJ\x01\x0f\x19e\xe2~\x17\x1eY\xfeh\x96\x99\xc3O!\x10y\x98\u03a2\x13\x1e\x9a\x82\u007fR>\x81\x1ez\xefVt\xf2\xe8\xaaUG\x81\xe3V\x90\xf7\x97w\xd6<\xb9\xe1\u007f\x92\xc9\xff\xd90v\xc7\xe4&\x8f\x04\xb5\xc0\u007f7T\x1dG\xf7\xf7\x92\x02\xa0\x1c8\x8e\xae\xfa\xc3\x1fVl\xfc\b\xfd\xfc\xd1Ƣ!\x13;\x02\xa2^\x998O\x10\xbbW/\xd5&H#LD90((ѓ\xfd\xb5\x88?\r\xd8\x1ca\xd3\x14\xa7)A\x80m\x82!\xdeL<|\vئ\x98\x9e\xa2%\\\xda\xd0Ì\x0fL4⏕`n\xd0?`\x96\xc0\xb3\x83\x89\x19\xac\xd5V\xa3\u007fWk\xb5\x12\xbd\xa4h\xd5\xcab\x89\x1e\x1d+i\x8eŚ\xc1\xefb\xcd%8t\xa6i\x86\u007f\xe3\xe35\xaf\x92\xc4@\xdc\xf6\x01/\x19th\x83\xaf$\xd2\x14pK\x80套\x81\x85s\xf9\xc1\xac\x8b\x8cG\xb0X\xab\xa9\xae\xd6h%\x92\xe2bɻ\xf8b\xb8/u\x06\xc85K:\x8a\x9b\xfc\x9d\x12`\xcf\x0f\x94Ěc\x91bֈ^\xe5:\x03Mžr\x8dݹ\xfd\xb5\u05f6gY5e\xcf\\pA\x1c:\x1f\aK#xs\"\xf3\xa9\xd0N\xdet;\x91f\nd\x9a\xc9\xc4\xf6\x87\x12B\xe3\x04C\t3\xf9v\xff\xa1\xa9Dk\xfb\xd0/\xf5\x96\xe8\xfbU\xaa\xd8\x171\x95\x8aղ9GsX-B\x05\xd5\x05\xf9\xb5\xf9\xa0C<\xff\xa527ǽ\xf8\xe6\xf8\xfd \xdfM\xe4.E\xc6guL\xe5͋\\y\xb9\x95Y6\xf6\xeb{\xef\xfbZbu\x83\xe8y\xf8\x13\xbb\xf1E\xf15%\x92\x9c\x1c\xc9.wA\x81P3}\x1e\x9cS\xe9nc\xbe\ve\xe5\xe1\xab\xe7\xe6\xb0z\xf4\xbd\xa45\xab2\xc7\x15QYͫ\x1fx`\xb5բ*\x06'/Η\xb8\xf0\xecC\x10\x99\x13i\xf0\xb1~\xb5\x14\xe1\x05E\x95\x13'`ciE\x95*\xc0\x85\x8c\xa4\x03\x9d\xa7&9\xad\xf3ҞK\x1dA\xfb\xee\xa5\x1d#\x96\xda\r\xbc\x1d\\\xb9\x8b\x9c:+/\xbdc)\x18q!\xffr\xd8^=\xbc{\xd1p\xf4\x89\xc1n7\xac\\ݱdq;\xc0\x8b\xa9\x83\x8f\u007f\xb4z\x9d\xc1\xee\xe0\xd7\xd8\x1ckڗ,\x01\x0f\\\xc8Ր9\xeaN.\xc9N\x12\x9e[\xc0E\x12\x1fZ4\xb1\xefw^/<4\xc7z29愘\xc5\x04+GU\xf6=\xf2\xe8\x190\x04\aR\x0f=\xdc\xf7\x02\xb8\x16\f9\xf3\xe8#}\x9b^\xc0)t\xe9r\xa2\x1e\x93\xda\xfb\xd0\xcfg\x1e\x05rt:\xb7\xa2\"\x17.\xb8\xff\xdb\xef\x0f^Q~;\xfa\xf1\xd13\xa7\x1e\x06ʪr\xf4mNEE\xce@~\x85\xe0}P\x01\xe2f\\t\x8fz\x11\xfa\x98\xedMբ\xacI\x9b`/81iS\xed\xc0\xef\xdb\x03N\xc0\xdeM\x93PV\xaav\x13\xe3<_aO\x8a\u007f6)\xc5\xfc\x03\xf7h\x19\xbe\x8fN\xb0v\x0f\b\xb89dy\xf0X\x81O\a\xf0JA\x1b\xa31\x9e`S\xe0\u007f\x01\x1dN\x1b\x18\x1e\xf2F\xea\v0d\r\xb8\xe9\xcd7\xdf\xec\x80\xc6\xd4\xe7`\bz\x8a$\xdc\f\r8g0:\f\x06\xafa\xfeї\r\x0f\xe3\xbc\xc5\xe8Z\\f0<\f\\o\xbc\x81\xfe\xd6\xd7qg\xc7~1\xb1?8`|\xc9\x04l\xd4\"\xe2[\x88\x12\xd8nb\xf31 \xa4M\x03ys\xba\x04\xb1\xed\x80B\xdc'F~\xc1\x88\x9bZb\xb9vGN\f\xfd\x90\x0e\xc0u\x0f_f\xe0͉\xb1k\x8fE\xeb/\xbb\xfb\x91˚\x1b\x9e>\x96\xa8\xba\x8c6\x9f\xa7D٘\xec\xd4\x00\xa3\x0e\x8cHN \xe7T1P>G\xb7\x95O\x91\xa46g\x1f\xe5\xe1\\\x1c\xf5\xf7=\x85\x83\xe0\xe7\xf3\xdbWNe\x9f\x95qo\xe2\xf9t#u\x84z\x8d:J\xbdO\xfd\x9d\xfa'\xf5)\xf5%\xf5\x15\xe1A]4Q\xd0WC\xae\x80\xf5\x11MR\x17\xe7\x06&\x1c\r\x8a\x06$%\x89j\x88\xa7\a¢\n\x9a7\x8cHl\x93%\x11\xcf\xfb\x02Gm\xceP\xd8P\x92F\xe9 \x82\x92\x10\x99@\x04\x1b9sBM\x9b\x13\x05\\\xa8\x00\xe6\x10\xd7+\x98,u\xc1\x1a`4c\xe2NZ#\xea,\x11\x85U̥\xd1\xe4\x82\xf8\x89\x04\xca.a\xe6\x80\bL\x1d\xaa\x86Q<4I&\x1fũ1\xa3\x06\xd4@\xe6\xe5aWN\x9f]\x97\xeb\x99P9\xa8h\xd5^\u007f^\xa5=T0}\xa8\\\xc2\xc8$y\x9c\x9b\xd5\xd3\x12\x00\x00'\xd5Ѿ\xcdY!\x0f\xa4aE\x02\x8fD\xff\xee*\xeb\xccn\x87Ĉ\\n\xadE\xa7\x06\xff\x90*\x8c\xbc\x9de\xcc\x12\x8d\x8d\xbbS\xa6\xb3\xea4O\x00p\x97\xa9\xf0\xba\xc2D\xa1\xbc1\x97\xed\xa8\xceK\xe4\x18\x8cr\x8b2B\x87\xf3}\xa0\x8a\xd5qj\x89\x9c\x931\x9cƦ/T\xaf\x9b\xa0\r7\xd68\aK\x95YY&\xa5駵\x8e\xbcl\xabW\xedS\xe4J9\x98=\xbc\uf43a4OG\xe7\xfe\x14:\x1c\x97ٝf+\\\xb5\xa6\xaa\x16\x9d*Z8\x14\xdcN\xfbʢ\xa5\fg\x1c^\xe7@\x83\xba$\xf2|%\u007f\xcc-ϦW\x01H\xfeM\xa1\v\x9bVL\x1dR:/Q\xe5J\xd4h\x03{\x1f8\xb2s*dX\x19\x1b\xe0\x9cJ\x975`\xf2\xd8j\xb2[p\x9f\x90k\xdd\xcd&UY\x95\x11\xdab\x93\xd6\xddd`l\xdd&\xad\xc6L\xcfS\x9bTr\x86\x85@\x95\xa5\v\x98t\x1a\x13\x1d\xd6ڞ\xec)\xf6{i\x83E\xab\xe7\xf3\x86ڲ\xb4\xb4Z\xe5w\xd7:\xac\xe10Th\xfe\xcc\x1a\xa5\x1a\t&\xe0!̀\\\x97\xc7V`\x1f)\x93\xe5;\x00^\x81\xa6L1\xfaC\xe6|]\x19ߢ\x91\xc5\xc6\xdc\xf5r.-\x93\xcb\xf88\xa7\xe8\x1be\xcbu\xc7\vJ\xd9|\x05\xedW>R\x84\xde\xd6\x00N\xa3\x90r \x17\xaa8x\xa9A\a\x94\xa9\xb5#\x95\x92b\x00\x84+\x8b<\xae\x1e\x8f\xb1\u007fSfL\x93M\xa26\xe1e-\x98\xde\r!\xfa\xb3d#_\xb0\xb6\x14Ԛ\xc5Q&\xa8\xd4q\xb8\x93\b\xba\xe5qPB\xd0k\x88\xfa\x1d\x91\xc7\x00A\x99\x8d(#\bZq\x82Ɨ!\xbd\xd6\xc7Jp\xbf\x13\xbal\"\xcd\x1f1ײ\xbckI\xf3\x86ZV\xaa\xd0p@\xea\x9d?-\x92=6\x97S\xe6\xf1\x06s\xac\xd0\xe2,\xb6\xa9e:3\xad\x91\xa8eZ5\xaf\xb0\xfb\x14R9+7\x83N\xb99\xdf\xe5In\xf4ۇ\x0e\x1fםX\xba\x1f\xc2\x16gCSٮ嫳lmu\x83\r\xbe\xc2,\x873\xb6\xf6m\xf49z\x1b\xfd\xe3O\xc9PEǰ\x8eB^\xdd\xec\xabr\xf9\xf3\xa4\x1b\xca\xf2\x0e\xe6\x1a\xfd\xa3\x1bF&B\x11^m\xf2\x16c\x0e\xc3 \xcfr\xd04\xe3\xb1s\xcaͅj\x8d\\\x99g1H9\x03T1rFBC\x8dZ\xa3\x930JPh\xca\xcfw\x8c\x1c\x05\xc2\xe5\xe5a\x00n\x99\xd9]b\xd0յ\xd6\x02P5\xb4\x1a\xd0ނ\xec\x95G\xf7\xa3\u007f\xfen\xc1\xd2W\x80\xa3g\xfc\xddk\x17\x0f\xabuʥ\x01C\xd8\xe2\x18?■\xb3ͮ\xb2\f\x1a\xb2|\xdd\xfd\xd4@\xec-\x17^%;\xa9\x95x>\xd0@5\be\xecy\x13A\xccU\x9b9\x89\x01\x93\x1354mƄ\x82Wbp\xd3\\!,\x00\x89\x02\x11G\b\x8f\u007f\x93hD\x1a\"\xdb\xe9\t3!\xc0\n鄛HT\\\x806H8\x93`9L\xb4E5t\xa8\x06V\x13\x85\x1a\\\x91)\xe8\xd9\xed\xaa{`\xb4\xb6{\xe8\xe8\x95\xe3\a\x99\nꔻ\x15\x81@`N\xc0\xb5\xfb\xf6\xe7\x94{\x94\x819\xcd\x01瞞ݷ\xefv5\xe6ٛ:W\x8enY\xaa\x1cu?={\xe5\xe8\xe6%\xea1\xcf4*v\ve\\{z\xf0?gm\xa1\xb1e&\x9c\xd5b+hP\xe2\x8c\xe69B\xc6\xed{\x9c\rO\x8dQ,m\x1b\xbd\x12\xbcճ\xc7U[`l\xea\\5zH\xb7ṽu\xca=\x8a\xc0\x9c`\x80\x14\x84zr\xc7\xe6\xb9\xe4\x8e\xf8\x9f\xab\xe1\xf0X\r~\xb0UӚ\r\x85gv\x8e^5y\xb0#\xafQ(2'}CW\xed\x03\xa3\x15K\x19s륊\xd1O6\xa4\x9f7\x9dՐo\x1b6k\x95\xe8\xb7C\xc4\xcc\x18D\x8d\xa3&PS\xa8\xd9\xd4<\xeaJ\xeaN\xb2\x9f\x13,\x14\\ՅDe\xcePZC1\x11$ӡ\xc4 *r\xe2\u007f\x82\xd11ѽ\xc4c\x81ȅ\x04\x1dOQe\x93\x16\x144}\xa4TB\x90\x86%\"\xac9\x04\x02:\x16\x98\xe9\x10\x9ev̀\xd5\xe1OHn! \u0088\xfb\"B]b\xba\x8d\a\x17\xd0\t\xa2\xecPIH'h\xb7$tl$\x0fg\x1aup;0\x1b\fy\xb9\\#\xd3\xd00\xc2¸iI\x8bq\x83Z\xd7\b\xa5\xb3\xa4!\x17\x84\x80\xb5\x99-z9\x03$\x01Ey\xe1\f(\xafWȬ\f\x03i\xab\x83\xb6\x96\xd4*/c\x19\xd5[4\xa7\f\xba\\6\xb3\x9a\x01\xb4\xc7P\xe4\xe7u\U000396ab\xcf\xfc\f\x9fH53\xc7g=>㯳\xf2\x8f\xa1\x02X\x85N\xdf\x16\x0fo\xdcQ\xee\x195\xfc\x9b\x1a\xa9\\\xca8<\xcc\xd0\a\x06O\xb9n\xb4\xc6\x1d\x90\x83\x9d}\xa7թ\x02N\xc5\x12\x85h\rf\u007f\v ft+\x18\x03x\x8d\xe6\xa42\x83\x93\x8d\xc1\xd9mS4\x90\x81\xcc8\xcb\x13vו2\xe0\x85\n)ѻ\x93\xb3\x1c\xc7\xe8$:(\xa1\xb5Z\x1f\xf41\xb4\x1c\x00\xa5\x11F\xca\xd8\xc8\b\x87\xa4\x04\x82bpB\xa32k\x94\xb4Yc\xc3ÐQ+Ꮏ\xe7\xa4n\xfa\x17#\xfd4\x15w\xc3\xebݩ\u007f\xb9/\xa9\xa3+\x9e\x02kO\xebT=\xf5#\xadʶ\x02N\x86\xa7\x0e=\f\x14;\xfd\x9c\x0e3\xd2\xc93\u007f\xf8Q\xf2\x9d\n@&.\x03\x12֯\x06ɗ/\x99oD\x93\x05{\xe3\f\xf6\x02\xb1\xe9\x1bL\x8d\xc5=a\x05\xb5\x95\xdaM\xddM=I\xf5\xf6\xef\xf4\xf4;\x87eχ,'\xf4\x03\xf1\xedd<\xe7FO\xc4c\xd7\xfdJ\xfc\xffwy^\x04\x16\xf3\xe8@\x16\xd9\xcfL\x92\x03{\xa2\xbci\u05fc\xbe\x9e\xfaɥa\xd8\x13\xeer\xecq\x84SY\x02\xd0\xd1\u007f<\x00\xea\xff.\xbf\xab'\\\x9aJ2\xc9\xc9\xf5\xe7\xbc+\xdf\xe9]>(E\xcd\xdb5\xb9^B\x85K\xc3\xf81\xba\xc2g\x92\xfdՀ\xfabAt\xd1\xd4\xff\xa6\x00\xd8\x0e\xa8\xd2p\x0f\xa2\x887o\xa2C/\xa1Ҳ\x9b\x1aj8\x9e\x03\x16Q\xeb\x05\x0f\x82\x0fQ\xbf\xa3ޢ>\u0094\xd8Y\xa0\x01nP\bj.\xb2\xe3\xd7\xef$Qlw\xdd\u007f\x19\xa7\xff\xcb\xef\xf9[\xfaDž@>\xff\xb7\xd7\xfb\u007f\xf9|\xac\xa0\xacrF\xd4R\xe9=\xe7v\xe0\u007f?$\u007fk\xc1s\aH\r\xf0L\xf4\x9bk\x01꿿\x93\x84\n\xdaN\t\xfb\\\x12|D\x03 g\xbf\xfd\xb5\xe0\xa3\xfd\xc1\x8bC ]\xf9ݭ\xb7~w\x0eS$cw\xe4\xc6T<б\xa1|\xa0\"\x1fQDRMc\x85\b\x9b\xa8\x98jI\xc2d*Y\v\x9fN5\xa5\x9a\xd8\xd3~w\xaa\xd6Q\xefHպ\xfd\x05A\xd8k\xca3\xc1\xde`\xc1$0\t\xae\xfdt1B\b\xa6(_\xa5\x0e%\xb5Z\x90\xd4U\xfah*\\\xaf\x06\x94Tz\x96R\u05cbPy\xf8\xfeRя\xc99\xabh\x9c\xc5\x06\x84\xe7`A\xfa\x1c\xca\xc4\xc9s\xb1d\xc7\x17Ӭb \xfd\x80\x01ဟRX|\xf1\x01\nN\x84j\xc1\x8dh\x01Z\xc0\xbe; \x92'\x86\x0f\xa3\xc1h0{*\xe8A\xb5\xd6Z+\xaaehȦ\x83\x9e`\xae\x0f<\x8a\u007f\xbd\xe6\xb8\x19\xf4\xfar\xc1\xa3\xfe\x9c\xae^P\xbe\xbf\xfb\x81\a\x1eHm˄V\xde\x05\xe4\xfb\xbb\x9f}\xf6\xd9T\x15\xea\xf2WkO\xa8\xd5' \xfe#gm\xb5\x1f\xf4\x04k\xb5O\x83\xeb\xf0\xb1W.\xef\xd5\xd6\x06Q\xf7\xd3\xdaZQ\xa6\x82\xa4\x14\v\xf1{\xcbp\xbb\a\xa9\x02\xaa\x8e\xec\xd6\x1a=4A6\rҘ\u008bB\x8f\x173?\x94\xd8#9\x8f\xc1\x14\xf0Db%>O\xccCxu\x9f'@<\x8f\xe1\x1c\xa1\xc3\xd2>\x0fW\x8a\x008\xdb\xd7\xd9-\x01{\xf4\aj\x96\xeb>\x98\x81\x0e\xff9\x05أW\xbd9\x13\xa6.Yz&\x0e\xc2o\xbe\x82\xfe\b\xacm\x13\x9eC}\xe8s\xd81\xf6\x8ae5\a\x97\\Z|犩\x87\x9f]\v\xe5\x8dC\xc0-`\xe7\x86\xe4\xfe\xdb.\u007f\xb3\xfa*\xc5\xd0\xe2\xc5\n\xc44\xcd\x035\xe8\xf7\xe7K\xc1\xd0\xf5}_.]|[NIw\xd9\xf0\x1c\x1dz\xfe\xa9\xce\xc9\xe8\x91\xe3\x8b\xe7d\xb5\f\x92\x1b6?rp\xe3\xd6\xfd\xbf\xf3\x86\xc1%\xabK끼5\xc3kq\x19\x9c\xfb\x10Ag\xed\xf7Z \xec\xc1\x9a3\xfag!B\x99\x83\x01\bE\t\x03\xe5\x03\xc2\x1cR\x88Ǖ\xa0>C\x80l)I\xc1\xb5\xaf]{\xedk\xa9m;\xe6\xd8\xedsZ\xeb\xdc\xee=-\xc6\x0eC\xd6\xf2\xc1s\xe8\xb7\x1f[\xb7\xfe\xb1\xc7֯{l\x17\xfa\xe1\b\x1a\xa6|~\U000ea9ed\xff\x00[\x86OV\x99\bƀ\xe2\x99#@\xc1\xb8I\xfdk\xcf<\xf7\xf6\x0eI\x8e{wKk\xad[\xea\x91V\x0e\xa5?Z\xf7\x18\xae\xff\xe8\xa3\xeb\x9fE?\xa2\xdfoxtϥ\x13\xc1\x03\xb7\x16A\xb0\xfb\x19 E?P\xe7\xf1\x8eR\xfc>\rTk\x1a\t\x80l\x9fR\"7(\x98/\xc7\xf1C\xc7\xcfm\x84Ue\x18\x8f@$\xfd\x9d8\x9a\xbc} \xb3\xbf,\xb6\ta\x0e\xdf[ҳxq\x0f\xd2^\xdaQ:\xd9ZRP\xb9\xd2j\x89Vu\x98\f\x1dt\x9f\xf8%\x0e\x1an\x982\xe7f9\x18\xbf\xebر]7\xfe\x11~,\xe3\x87U\xa3\xbf\x88\x1f\xe8\xa7\xed\xafn\xdb6c\xe66:\xbbg\xf1\x92\xe1\xed\x8bѫ\a\x96\x96\x17\x19\f\xf8\x1a\x95+-\x1e\x16.\x14?\xe6M\x83&\xae\xbcfv߱\x9d\xbb\x8e\xbds#z\x0e\x04V\x80wq:꙱m۫۷\x11\xb4\xf1\xb3c$_\xb1g)\x15\xee\x97\xf9\x98O\x1e&\xa0&\xd1\\@\x10\xbeb\x06\xcad\xc7\x1c3\xad\x014\xd1n\x8d'B\x80X\x1b\x01̡\xd1\x9a\xb4\xdb\xdb1\xa8R\xa7\x03;\xddq\xa5\"\x04\x16\xa1\xebLN\xba,`/m\xf6O䔰\x1cm\x998\xe4\xfa\xb9\xa3\x8cF0\xd3V\xa9\xd3\xd7\\6&\xf5\x19\xba\xc9\xe9\xa3\x19\x8e\xdd\x0f\x16\x81y\x0fhM&\xfa\xd1\x1at\xcd3J0\xc3\xed`\xa0\xc1\x94g\x8d\xa3\x97\xd0\xce@\x9b\xcf\xe05\x99\xe4zz\bX\xf0\u0097#\xd1Ն1\xe3o\x9eԠR\x01ڮ\xd1T\x89}\xa4V*\xf6y\xb2\xaf\xdbp\x0e-\x82\xf7\xe0\xd6\"D$ן2\xd0pԓ1 \xcd8\x12\xc1\xedG\xba\x87\x99\xa80\x80\x13\x937O\x9e\xbcy#\xfd\xf3xh\x91\xa5(\x99\x05\xb2\xb4\x90\x84\xf4\xea\xae\xee\x9e\xee>\n\x1f\xba\xd4\xfaM\x93\x1cs\xcdwL\xa3\xa9iw\x98\xe7:&m\x02\xebH\xa1\xc9\xe0\x04\x98)\xe5yi\xca*F)\x84I\xf6$q\xbd\x99\x14\x8f\x98\x9eK\xe2\xd2wN^\xbf~2\x9a\xb4I\xb4\xab\x95\x92\xe96JU`>\xbeu\x00\xaf\xf6\xbf<\xb0\x88\xb3\xecI{\xc42\xf3\x19\xbbYp\xee\xdd\xd3)\\֤M\x17}\xf4\xa4\x88\x8a\x97$/p\xea\xb4\xf8\xb83\x06\xbc7\xe3\x11\xd2`r\xd3$\xf2\x12\xb5\xe4\xf1k\xc5㹗8AȬ\x13\xe4UP\x96\xd0L`\xa3\xd8\x00}\xcf\bQL\x0fda\x1e\xe5\x84\xf0~\x94\x9f\fTW\x06\xeb\x8fl\x02\x11\xf7i\t\xf2f\xfdGџ0Q\"\x14\x8f쉠\rE\x80\xdcoE\xbdV\xbf\x1c\xa0\x88-ȃ\x1d\x9f\bǗ\xc81I`\xe1\x93|\xd0\xf6\x12\u0601\x8f\x9f\x80\x1d\x9d%Aݶ\xa0\xd5\xe7\xb3\x06\xb7\xe9\x828\xf7\x86\xfeC\x92\xe7\x11\xae\x10D\v\x85À\xb9\xc6H\xe5R\x8d\x82.L\x1a4I\x9c\xe5\xd3f\xd8\xf1\x04N\xf5\fH\xcd\x12Ry\x9c\xea\x17\xf6\x13\xfbK3\x82{>0P5m\xb6\xeb\xf7h\xcb\xcd9v\x13\x9b\xb5y\xd1\xdf\xee\xe7ռ\xa3\xcb\xf7%\xfa\xc3M\xbb\x8a|Vεz\x030\xbfcQ[}\v\xc2\xebУ\x0f\xbf\xd1cvg\xbb\x15\xce-\x0f\xee\x03\xf9\xb3\x8d\xbc3\xf7\xcd\v\xe1盲\xf8\xa5^Y\xae\xc1)\xb5\xcfVؿ\b\x1b\xb7娢V\x9fԳV\xe5\x03\xbaB\xf3\xd0a\x85\\\xc0\xe5Α\x06\x1a\xab\x94\xd9\x13.\x10\x06\x01ї-\xfe&<\xa1\x86\x89_6\x8e\xe60\x8f\x1d¡\x04\x9f\xf00\x14z\xc7\x02̈\xcd\xdb\xeeB\xc7@\xa1\x05}\n\xce\xe00\xc8g\xdeI=\xedFS]\xe8+\x17(\x84\x83]`\x9f\v\xe8\\x\xec\xe9\xf0\xef\x1a\x19\xc5\\J\xa9\xf1\nK<\xdaWRC\xa8Q\xd44j:\xb5\x18s\xa4ۨ\xeb\xa8ۨ\x83T/\xf5.\xf1\xb6Ez\xa9\x97\x18\x8d\x92\x19\x1bGq3\x92\xb6\xe5h\x839\xe3< Fv\a\xbd\x85Ķ7a&\x8a8\xb1P\xa2\x04\xcf\xf6\xb4\x993\xf8\x84\xf4(\xa6\xd9\xcfe\xb8ӊ;8\x82sd\x80\xe7\f\x82g$\xe2\"ٔ\xb80&FD\xbb\xf02@\x93l\xb2\x06\xf2D\x8ci\xee\x8faz\xd5\xc4s\xc5B\f\xf2\xb1x\xda\x18_\xc0o\x16\xa8:\x92@\tB\nZ\x8bIH\x95\\\xa6V\xab\x81Jf\x029\n\xa5J\xaa\x95\xaa\x80\\!\x91\xa9\x152ٙ/\f\x06\xa8\x86:\x1dT\x8f\xb3٠Tf6ˤ\xc0v\xc4jUȡ\xd1\b\xe5\x8a\xc9f3T\xaa\x8cF\x95\xb2\v\xc7\xd5\x12\x99\xc1 \x93\xa8\xc1\x06\xf4\x91\xd1(\xe7\xb4\x10\xf3KZN>\x99\xe7\x15R\x1c\xc2q\xa9b\x1aN3\xf08\xa2\x92ʔ\xe0ʗ5\x1a\rf\t\xd4j\x8dA3]\xad֚\xb4@\xa9\x04Z\x93\xe6Oj\xbdM\x0f$\x12%\x94\xcb\x14RN\r\x99Y\a\x96\xf5\xfd[\xa5w\x8c\xeez\x01\xb8t\xb1\xb2e\a\xf6\u007f\x03\x15r\xb5Z\x9e\xfa\xe1\x1b\xb9\xaa\xe4\x18l\xd6JYV\xaa\x95\xa4\x9e\x05\x9f\x039\xa7\x90q*\xb0 \xb9N&[\x97\x945\xbd\xf5\xbaL\xfe\xda[2<2?\xff\xe1K\x85\xe2\xcb\x1f\x94l\xdf\xf7*\xd5\xf7}*\xf7g?je\u070f\x9fId\xc8\x04\x17\xa2\xcd?r\n\xfd\x8f`\xad^1\x1c\xe5}/U\xf0߃wyE\x16\x92|k4~\vN\xcbT\xaa\x94\x0e~\x86\xe0Wr\x8dZ\xf1\x15@\n\xb5څ\f_(\xb4Z\xc5\x17\xe0\v\xa5V\x8b\xa4\xffT\xe9\xf5\xaa%\xcb\xe0ZZ#\xe3X\xa9>u㲻\xa0^Eo2˽\xe8T\xaf\xe9\x00\x95\xc1'\xa0\x04\x1f\xc6v\x01\x81\x94\xa2\xb2\xfc\t<Ր\x1d\xfa*`\xfa\xdfc\x8c\x00N-FK\xe2\x90\a\uf07d+\x8e\xa2\xdbP\x17\xba\xed\xe8\n\xb0\xf7W\xe2\x87A\x0f\x98v4\x13?JScF\xdd'\xeac\xdc7\xaa\xef\xbe\x01\x11\x903 \xc2\xe4\xe0SR\x8c\xe1Ӏ\xfd\\\x9e\xb2Q>j2\x1e;\x97ⱳ\x15\xcfI\xbfܯ3s:\x0f\xf1\xa7,([\x13\x11.\x10\xa4ed\x13W\xc2\x19\xc5=s\x0e\n~\xfb\x88=; \xd6!F\xb2\aKl\x0e*`D\xb0\xbfǯ\x8d\x0f\x98\xb2P\x03 1\xe3I\x8e\x98\xbc\xc7\U0003f401\xa3I\xd1\x10\xb9\x8a\x84\r\xfaȘ,a\x8f8\xc2\xfd\x00\xca\xc9p\x97c3X)W\xa2W\x94`:\xb15KQ\x10y\xa2\x15\xe57\xb8\xb4j\b$uE\x97\xd7|p\xffM\xe35*\v`\xe5\x8cl\xf2h\xb5\f\x96$\x1a\xfd\x16\x95J\xe16\x02\xb3R/#\xc6\xf0\xca\x04\xb2\x97\x8c\x8e\x0e\x05\x1b4*\xfc8\x02B\x85\x12\xacݺ\x13\x9aؖ\xa8\xbd\xd4\x05WX.m)R3\xccfa\x8b-\x03\xc3\x1cv4\xa2+\x9cJP\xa6<\xadg(b\xd0v\x9a\x82#l.\xae\u0604\x99+\x00\x82a\x8f\xa5\x02\x9d攀\x91\xdb³\xf3e\x1a\bGw_\xb1\xae\xe3\x96HXc,\x94@\x9au\xad\x19\xb4\x1f\xd9-\x97\x87\xc7ѫs:\xb9\x00\x1df\x18\x80\xeb\x9ap{\xa4\xe6\xc6\xed\x98(nX8fQ\xa9\xc2\xe2\x00\x80:\xaf\x9f\x89\xdfh\xd4o\xfb6\xbc\x91\x00\x1a\xe3֏E\xc9\xe6:\x0e\v\x90~\xb4D\x03|%\x05\xc45\x1b\x01V'\xb4\x9d\x0f\xb78\x1d\x8d\xfdjK\xcfmڿ/\xc9ѐ\xa1\x01K'\xf7\xedoB\xefvNg!d\xf0\xd3K\xe0uK\xae\x83,`\x18\b\xd9靿\xa1\xd9\xe8\xe4\xfc\xd4|\xf0\x89\xc1\xa6\x95Zh\xaf\f\xd9\xe1\xce\xf9\xf3Q\xb3\xc1f$\xcev\xd9,\x19\xf4\xa4>\x92\xb9%F\xa3\xcd\x00\x9e\x98\xff\xcbv\x18\xf9\xdbځ\x98\x02\xf8\b\xa8'\x91\x06C7\xf0\x918-6\x86\x00\xe1F\xc4\r\x85@\x88\xf3\xf4\xaf6\x02\xc8\a\xd6a\xb3Y9\x8b_\x9a\x81,G\xcfo\x01\xbe\xc6\xde\x17\x1aЧͳ\x19%\x8d{\x17#Q\xcckA\x1f6>\xfb\xfcoh\x86\xcf\xe6ͻ\x9d㥌\x84\xe1d\xcc\xed\xf3\xe6\x01\x1d\xb0͟\xbf\x8f\xe3\x19\x1a_G\xb9\x0f\xb7\xc9\xd7蓌\x8e\xcc\xc0\xf7/\x15t\x81\u007fk\v`\x8eR\xf4Ӎ)\r\x82\xec\b|:2r\t\xd8⯿s\x16\x18<\xe9ʖ\x9c\x86\xe1\xcd5E\x1d躉\x80]\xb1\xb2\xc4]Z\xed\xfem/x\xb7Ɯ\xec\x18\xb1\xd2\xce\xcfO\xfd\tX\x80R\xef\xe9\x18\xef\xd6\\\xec\x9dr\xa8\xc8o\x9cyt\x9eX\xc2\f\x18Q]\xca\xf0\xab\xaf\xc0$\xfb\xa8^\xb2\xf9\xd1\xdeӍi\xd2\xdf\xf0ܠ\x17\xf5\xf6\x92*\xc9nR\x85 gf\x9e5\xb3/C\x9e7A5\v(\xeb1\x9f\x91\x8d\xf9\x9c\xe9\xb3\xf1\xd7\xdf\xc1G\xc0\xc5u@\xb0\x10\x16\xb4\xa0\xe3|,J\x9c$\xc24\x19\r\x93DI\x90\xfc\xe8\xca\xff\xf5\xed\x92ID\xc1m\xf3\xa5\xd7\u007fx\xbd\xd48=9\xdc\xe4=\"\xf8zc\x92\x03\xfe\xc0\xaf\xbdq2\x89\xa7\xb2wНv\xebȅ\vGZ\xed5\xa05\x99\xb4!\x9b\xe0\x9f\xb1_\xe7u\xc0\xb7*\xa3Z\x04m\xb6ߴN\x183^#\xfb\x1d7$\xe2\x04\xe8Q\x1b\x12\x91\xd5LZ\x01u%\x14!^A\v\x00I1\b)\xbf\xde91\x91C|G\x1e\xd8D\x18\x83M\a\xb4\xe0\x90\x9b߰A\x1b7\x18Y\u074c\x19:֨\u007f\xd6n\x18;V\x1f\x0fB\xbe\xa4\x84\x87\xbc\xe1\xb7\xccN\x05RS\xea\x04q%y\xb7\xb0o|\xb7&5ز\x0f\xec\xd9g\x94\xe8t1\xe3\x1a\xf4\xfc\x1acL\xab\xb9\xd10\xa9o\x12\x0f\xfd1Cٍe\x86\x98^w\x91>\x1d\xfd\xad\xe3\xf4½!6\xd3j\x02\x1af4\xf2\xebK\xa1\xe0\x85\x18\tGz\x01i\x16\xb5\f\xfd\x04d\xb2ߴ\x8e\xd1\xc9L]\x80\x8f\x10\xbf\u007f/y\u007f \xef\x04r\xd9E\xbe\u007f\x82\x1aF\xf0\x93~ӛU\x13\xdbQ@\xb4߉\x85\xa9`\xbe\xe21q\xb4\xe0\xb7\b\x10Uwb\xbe\x88\xa9\\L(\xf0bY\x92\x19\xfa\xf5\x8f\xdf%\xb5)\xa2\nZ\xfa\xc4\x13R\x1a\alҿ\xa9\xf1˪\xd5\u007f\xbb0\x1d-Wi\xe0UФ\xaaI\x9f\u007fS\x8b\xe0+\x04\xf1\x95\xbe\xfb\x0e_!\x88\xaf\x04\xf2y\xfc\x87\x8e]\x98\x9e\x92\xe0+\xd2\xe4\xd2r\x1c\xe8\xfb=\x0e`\x9e'tv7{\x1c\xb7\x17\xd1\xd0\xc5\xe4\x91\x04\x8a\x8e}\xe4\x98\xeb1\xd9\b\xed\x94\b\xf6{\\ǃ\x80\xa8$\r\xdc\xeec\x8fϜZ\xf7\x87;\n\xdb;\x1cusg,\xed\x1ak\av۸U\xab\x87\u07fb|\xfb\x1do\x1fz\xf4\xb9r\xce\xdaPQ\xa7w\x97Gb\xb5\u007f\xbc\xa3\x1a\xbe\xf4\xb2\xf9\n\xf4\xed\xed\xb6\xfc\"]lɵ\x1f\x03\x0e\\\xf2\xd6{h7\xfa\xea\xe5\xae{\xbf\x1c\x02\u0087{\u007f8ֻo=`\x94\xa1\xac\xd9#\xc6vN\x9f\xf0\xf4_\xd22}N\x9c\xd7$\x94\x1csSz̙Z\t6\x00\x0ft\x016\x11\x92\x81@f\xc3\x19\xf3n:6\x80i\x14\x9d!\xedT\x8c\xb0$\"\v\xfdW8\x01=\x8a\x1e\xff\xfd\xef\xe9(\x0e}\x87\x1em\x05Z\xbcx}}5hK\xddż\xf9{\xf48P\xa5\ue8a3\u07be7\x8dyƾ7\xbd^:\x8a\x038\x01,B\x97\x80\xd9\x1f\xf97l\xe8{\x1f\xec8\xf4\xd1\xe5O<\xf1Ĥ\x8f\xc0lt\t\xfaj\x03\x80\xfeC`\a\xba)7\xf5a\xb69\xf5\xa1J\x05\xbd\xe6l\xe8\xcd6C/\xa6\xe4?4g\xf0Z\xf1\x8b\xb0+q\xbf\x1c+\xf6Ia\xd7\xce\xe7Ʌ\x82\x84\xa3\x1f\xc0\x83\xe8\xdd\xebq&\x10\x98g\xa2\xad\x90\xc1\vw\xb1\xd1\xf4.\x1e\x97\xd1\x01\xf3yE\xafZ\xd2EW~q7\xa3\xa1\xcf\f\x06\x90\xbd\xef\x8bK&*\xf7/\x9b\xd2:\f\x84\x1e;\x00,w\x82\xd3oܳ\xf6\xca\xd9\xda\x1aeCk\xa2\xb55\x967\xa2\xaen\xe8\x88\xc5u\xab\xee\xbeg͵\xd3&շ\x94\xb47\x97\xe5\x0e\xaf\xab\x1fڱ\xa8f\xf5}\xb0\xaf\xe0\x95\xd5\xfb?\x05\xf2\u007f\xdeu\xc9\xd3\xf1P\xee\xd2;\xcao>r;\xfa\xe2N\x89\x05}\xbdz\xfbt\xc3Pu]C<֘\xd3\xd8\xd1јs\xed\x8aUۧ.\xa8\xad\x8f\x96\r\x12\x13\xb6\x9do\u007f bo\x12\xab\x9a\x04\xe1?\xce7\x1a\xf0g\xe1W\x89\x98\x13 \x11,I\x84$Z*\v\x1f\xbd!N\x9f\x15\x17|˲f<\x01s&\x03|헪\xff\xb0\x17m\xbe\xff\xf9\x8e\xfb:\x9e?\xf3\xcd\xf3\x0e\xc7\xf3\x9d\xb0\x1e\xac\x15\x13^K\xbb\x8a\xa5g<\xdf\xd9\xf9\xbcCB]DSX\xddI*᪤\xc2\xfdhs\xea9!\x01\x04?\x16+K\x9f\xbf_\xbc\x9c\xb0_\x93%9\xc1\xfe\x85\xa0@\x80s\nNz\xa2\xccO\x11|\x82\xacj\xb2\xe5\x1f\x8a\x99\x18\xbd\xe4ĕ\xffD\xbd\xa8\a\xf5\xfe\xf3\xca\xe7A\xfb\xd1\x0f\xd0\ai\xbf\xb6\xb3\xd0\a\x1f\x1c\x05\xed\xcf\xc3\xe4\xc3$\xf3\xca\u007f\x82ڇ\xff\x04\x96~\xed>\x99\x8fz\xfe\xb1Qtc\xbb\xf1\x1f\xa0+\xff\xa4\xfbk\xb4\x8d\xe8\x84\xf3x>\xfb7n\xc3鸧\xc7\xf5\x89H1\x1e\x85\x8c\xa0L\"\x18\xb0\x03b\xe6N65\x13\xc4|#.h\x03\x11\x82\x91d\n\x01\xb5`\x15/\x1a\xbb\x170\x98뉚\x8a]R\xb3>\xad[\xceK\xff\xfa\x12\v\xa4\xe1\xdaR\x0f;tHdNk\xb5V\x1brh\xec*\xb5<;?G\xad\x9a\x13j3\xf0 d4\xdc\xde\xe3\tьi\xb8\xc31;\xaf\x83\xe7\xdd^C\xa1g\xfc\x88\xc1&c\xe5P\v\x93\x95S\x9c\xadV\xa99y8\u007fxqcn\x91\x83\a\xf4\x87蒳\x87ѡϷ\xc0]\xc7\xc1j^\xb0\xd8\xeb\t\f\xd6閪\x878\x9d\xa5\xb7\x1c\xae\xcdw\x1b<:ml튵ݳGV\xe9t*\xda魏\xb47Ϛ\xb3q0J\xa1\x19\xff\xb8\xf1g\xd0!\xd2=B_Sb>7L\xb5S\x93\xa8\x05\xd4*\xeaJ\xea&\xe2o#\xe8'\x9e\x13\xf0\u007f\xcc\xd4q\xf8\x18\xd4&\xcc\x12\x8e\xa8]\x13+F.\x16O\x84\xe2\ts\x9c\xe6\x88!\x97\x84\xa8\xee\x98q\x17L\x04CDk\x9btK\x92\x8b\x8f\x11|\x01|\x19\xbc\xa2\xdc4c\xceLzbU\xc7\xf5[\xc1\x9b\xaf)\xe5\xb9\xd9\xeb\x1f3K\x83!w\xb6\xd9\xe8\xca\x1fY\x86\u07b6\x96\xcdo\xbe\xab\x92\xc9\x1e\xbd\xd0\xc1X\xee\x1dq\xf5\xe1¾\xe7\xf2\xc7é\x93\xbd\x9e\t\xa9[\xc6?\xf2b(\\\xd95\xae\x02La\xa0乖\xb8/{\xeds\f\xbaa\x13\xa3\xbet\xec\xd8\xf2\x8aq\xd4/\xfcRˀ\x8fƓ\a\xed\x03\xba\xe8/\xec=\xb2\x81\xbc\xfbV\x8b!疕\x80\x9b\t\xffr\x9eR\xba\x01|\x87\xbbB\xdeDP\x8axt\x84\xbe\xea|߳eg)\xe6\x15\xfc\x8d\x9c\x02V\x90\b\x0e\xc6A\"\x01#\xdb^A\x11\xb9\x91\x98\xa4\x10\vq\x01\x1bF\x80\x9d$ڻ\"\xb0\x10\xd9d\x16\xc0\x8f\x89b\x05&B\xe8\xe6%\xc3+\xa3ձ\x9f\xf2\x81\xdd\xc8\xe2a\xa26\x06\x9b\x1a\xc3U\x83\xb5\x8b{\xc0\xbf\xf7\xa2\xefn\xabm0\x9aY\xd6o\x8c\x96M}4\xd9Ғ|\xf4y|*\x91\xab\x82\xd9\xf2\xdaI{\xff\xba\xfc6\xa0b\f=\x8b}\r\xc3\xd16d1y\xa0ݰ\xee\xbb\xdf=\xbe\xb1\xb2s\x98/\xa7}q\x01\x1e\xd8\xdf\xefU\xb3\x01|gF\x95\xae\x8eOS\x97\xcc1\x84\rj~\xcd\xf6\x15\u007f\xdd;q/^\a\xf5\xe9u\x90 5\xa7\x15e\x13\x04Z\x84XnK\xdcDk\x9d\x8cc`LSU\x04\x85\xd2\xc7\x11xM\xb3\x88֔v)#(\xda\xe2\xde&:\x96!\xfb\xe9\x02P\f\x11U\x88\x8d\x14\xd3\x02\xb5Ԥ\x02:\xf5\xe1ˮ>\xbceKqGe\xc4\xeb6(ABO3\xadcC~\x99QgTh\x01&\xb2*\x86\x1aF&\xa4\x90ak\xff\x1d[:\xa2V#U\xd7J\xb3\x1f\xe8\xf05.\x1fUgp+*\f\x8c\x1c¢\x95*\x96\x91\xea\x87f\x03\x86\xa1\xcd\xf0=\xdec(ך\xaa\x95W\x83\xdc\xca\xfa\x841^\xde\xd64\xbd\xbd\x9c\x1d٠.Q\x02\x96\x05K\xfe\xb0 w\x89ƐetC\xc0\xdc<\xc8\x10(\xc8a,\x92\xa9z\x13\xcfB\x06\x80\xfc0\xad\xb1\xc5\x03\xe1\x90\x13\x9a\x00\x84\x90V<[M\x1b\xb2\x1b\x18\x19\x88\x17\x00>CwUc:\xf3y\x01'܃i\xe4\xa1\x02\x86\xec9\xa2}\xa0\xa8\x1b^<\x19\xe0 C\xfa\x8308C\\\xc2OPE\b\xb2\x1c\xd1^1\x8b\xa0sZ\x81R5\xc1\xc6Hvn}}n6m\x8d\x86\xed\xf9\xf9\xf6p\xf4\x8bb1\x05\x1e,\t\x91\x94P\t\xfa\xd1\x1d\xba\x17\x9d\xbc\xd3\xec\xf3؊\xaa\xed\x1d\xb2\xd4\x10\xf4\xe1\v\xa0\xf5\xa5\x87A\xd91\xb8\xe8\xcae\x89Wv5\x92\x02w\x02ǽ\xb7\x03\xc7\xfd\x8c\xbc#\x12\r\x87\xa2h\x8a#/\xdf\xee\xc8\xcf\x03_]\x98p\x1fs3:\xb5\xb7\xad\x99\xa6\xe5\x8c\x0e\xae\u007f\xefu\xe0\xbe\x178\xee\xdc\xfci\xaafٟ\xc6>\xbe0\xb0\xed[\xe0\xfav۶\xefD\xfc\x12\xc9Y\xdc4\xae\xb4\xafa\x81g\r\xd0\"DR\f\xf3\f\x049K\xc0v\x90\x9c\xf4H\xceR\xac]\xadS\xa8Pŷz\xb7Jƛ\xe9\xae3\xc7в\x00\r\xbd\x92\xa4\x06\xaf\b?X§)\xa7V\xca\x1eF\xc7\xcd\f\xe71\x80I\x8c\xafo\xfa\x1d\xea\xec0O\xf7\xca\xce\xe1%\x9ce\u007f\u009ch\xd6yw\x05\x99\xbb\xa6\xef\tx\xc0\xca\xc0\xc0\xfb\xa6\xbeA\u007f\xd6;\xd52ބ\xc2\x01\x9a\xf6I\x92>\xf4\xfa\a\xa7g\x81vz\n\xf2\x9e\xbb\xfb_\xd0a\xa3p\xf7\x17\u007f\xaf\xce\x0e\x19\xe8^\xe3i5\x9b\xdb\xf7ҕp}\xdf\xdfϛwJ\x849\x81\xd0\x1f\xf8ˉ\xbclԔV\xdd\x174\xfa\xf1W5q\x99\x99H\x80\v\x16>.{\xbeC[\xd1|_B\xad>\x8aN\xee=\x88^[\xc8\x01\xe9\x95r\x8d\x96\x1b\xfa\xee\x8a9\xcf^5b\xc4U\xcfΙv\xa8\xe9J\xe2\x8e\x1a\xd5ڂ\xe1\x90k\xe3|\xc0߰\x178\x8e\xa6Ng\x94\xf7N\bJh\xb4\x03\xbdJ\xb0\xb9\xae\xdf,\xb7J\xaf\x92A\xf9\x949\xb8\xfa\xdb\xf8*\x83\xeb\xafr\x85\xc2D\x97\x90x\xe6\xde0s\xd1\xea\xa3{P\xbf6_WF\u007f\xed\x9c\xfe\x8a\x9d\xf0\x15j\xa8\x15\xe8pm\x018Ϛl#\xea\x13)k\x81\x04\x9fu?\xb8\xfe\x02\xc1!K\xe1́\x85Г\xbf\x90\rV\xe3{=\x8f\xef\xb5\x05ӓi\xed3a\x96\xc43\b\x11\xd3\t`\x84F\xda`v\xd1i\xaen`\x89\x10n7\x82<\f2n\x9f\xf0\b\x13\xb87\xa2un\xe4\x89h\xcfC\xe6\"\xbe$T\x00/^B\xb8\xaedG\xde#\xf9y\x0f\xe7Yl\u07bcr\xad\a\x00U 5)\xa8\x02 \xa0\xad\x8d\x84\xad\x96\xc2\xc3\x05\xb9\xf7嘭\xee\xec\xb8\xc6C\xb0/Y\xa9Z\xa6\xa9,\xf0[,\x05\x87\vr\xeeͱZ\xbd\xb9\xa5\x1a\x1f\xaeh\x83\xcfXqE\x9f~D\xd4jŗ\xcc=\x98k\xb5\xfa\xf2\xcbq\xa6W[Y\xe8\xb7$9.\xdb\xeav1r\xb9q\x05\xd8j\x943\x8c܈\xb6m7\xc9%\xc0\xe9\xb6\xe5q\\\x8e\xc5\xe5b\xe5r\xf3\xca2:\x9f.\xb0G\xbc!\x8bD\xce8\x84\xbc<\x9b\xcb\x0e%r\xe3ըר\xa0i\x85\x11\xd4^\x8d\x03\xe6`:\xd3\x01X\xb9\xf9\xaa\xbe\x11+\x8cr\x0e:]\xb6<\x01c\xc8r6\xc9 \xdc\xc6yi\xfc\b\xc1\xfc䜂\xb6\xaf?D\x94\xefE;\xe1x6\xc1\xbb@\x01K\x84\xb1Ih\xbfu\x81\xd5\u007f\xad϶\xc0\xe6\xbbaں\xfa\xdaq\xe3V-\x02\x11\xf0\x91\xd5\xcf6\fu\xd6\x02\x89U\x11;\x93\xb4\xfa\xfdV\xe6\xf93\xd5\xe4\f\xbeV\x16\x96\xafZ\xb6\xfd\xc0\xca\xe5\xd9\x01\xbf\xc0G\x90>E\r\xf0;B4\x88\x1b\xa8\xc1\x98\xda1zb\x81_h\n{b\xbc\xd1\x17#g\xfa¼\v\xf7\xcap9\xe2\xa6\x12t\xa1\x1e(\xb8\xd7J\xe3\xba\xf5\xf4\xf5\x9c8!\xa1RY'\xce%\xd2\xc9saX{\xe2D_\x0f\xd9!\x1d\x00\"\x17\x048\x0e\xa9d\xb2\x0f\xff\x98\xf3r\x1050\x96.&ʷӾ\xe9\x896\x05\xf1\x1e\x82ې\xe0\xec\xe1\x99\x1c\xaf\xa3\x01\xd29\xb3p:\x9e\x9dX\xcc\t\xb1q\xa6w\xcb3Ϡ\x1f\x9f\x81h\xcf\xc4u8\xb8e\xddD0\a\x12\xb87\x12D{ \x04s&B\x8a\x14yf\x8b\xd2th\f\xc9\x1asȤ\x14\xab\xe1\x90\x05'\x9e7V\x03T\x8c\xa2\xfc\xa2\rl\x1c\xb3L\xa6\xa8\xb8\x95\x8c\x97\x1a.\xe3\x1c/!\x18\xc4\xfe\u0094\x8f\xa5.\x1b7\xaa\xea\x1b\b\xbf\xa9\x1a5\xee\xb2\xcb\x1e^\a\xbf\xa9\x1e\x89\x03\xe3FV\u007f\x03\xd7=\f.\x1bH*\xa5\x1e^W\xbeR\xab֮,_\xf70.\xc2iW\x96]\xf6\xf0ee+\xb5ܸ\xcb\xe8\x13\x03\xe9&\xae\x9fw\xd4\xe1o]M\xb5P\xe3\xa8\x19\x98{\xa0(a\xdbW\xd8\xe1\x15\x04\x13\x8980\x13\x9c=\x8d\x80\x80p\x8e\x91\x8b\x12\\\xf5\x88\x1b\xf0\xc2\xe6qZkք\x97\u0381\xb1\xb8\xd8w\x85\xf93\x94V]\x11\xa4\xea\"\xb6K\x89\b\x8df\x80\x83\fE\xd6\x05\a\xf2\xe4\x06\xabJ\x91\xa3\xf7n\x18e\xa5\x9f*\xf8\xbe\x91\xe7k\xc7\x13\xdcT\xf47\x02\xcb*\xc0\xa9>q{-\x1f\xe3\x1b\xcfȕ*\xf9\x04\x99Ln\x93w\xca\xdfWX\x14\x9dr\xb9\xcc.\x9b \xcbҫ\x05\xe0\x93.\xf5\x83z\x87\x1e\xff\xdf=\x81\x14\x95\xe3b6\xb9\x8c\xbe9b\x90\xe7\x1dX`-\x92\xb3\xe1Q\x1b\xbc\n\xf0@\xc1w\x8d\xf8\x82\xb5\xb7?qm\xe6\x1e\xc0Ep_\xc7\xd7\xf2|#\xc8KW\xc4W\xb6\u007f%\x1ceB\xca3µ{ҷ\xd2\xeb\ae\ue3df(\x8dK@ږ\xa1\f\xe4˃\x00K{\xe0\x05[@ Ǹys0df\x03\t\t\x97\xe0\x89Q\xb09\xc1\xf2\x9c)\x92\b\xf1\x018\x15\xb8\x81{!\xba\x95\xfd\xe5\x1e\x10\xb3p笯k.\xdf\xf5U\f}\x8c>\x8e}\xb5kk\xf5׳v\xba@\xd3\u0557.\xfbq٥W\x83&\xf8\xf6\xdbo\xa3\x87\x99\xe4E\x18\xdc3C^?C\x8f?\x01\x1a\x94G[\xd6\xee۷\xb6\xe5\xa8\x12={b<}\xe6\xf5\xcda\xf4\xe7A\xa1\xd0 \x90\x13\xa6\x04\xdfui\xff\xd0\x19\x9b\x82\xa1\x82\xd7\x10\xb2\xc3p\a\xf5(u\x84\xcc\x0e\x19\xcf\xd5iW\xee\x17\xc4\xc1\xaf\xe4\a2JM\xbe_+\xf9\xeb\xf9\x9eX\t\xcb\b\xc0\x0e\xd5\f^\x01]\x8c\xee\x82\"\xba~ǡ@\xf4\x12)\xba\x8a<\x17\x84\xb5\x17MN=\xef\bB\x18\xb4ó\xffM-\x90L!\xb4\x11mL!]\xb4}\xdbc@\x05\xaa\x81\xf2ж\xf6\xa8\xee\\\x99\xa0\x1d%\xed\xc1\x13\xfd:\xf0\x03\xbc\x8b\xa2%\x17K\xdd\x11\xb4o\xd8`\x0f\xa6\xfe\x8b*\xe0*\x95|\x0e\x043\xe5*]I˰\xd6\xf2@\xa0\xbcuXK\t\x1a{\xae\xc4(|I|\xe1~\xb9_\x1a\x17\xc1 h\uf525q\xc0\xfa\xe7%\x9e \x1a\x11A_&A\x10%D̠\x1fڍ\xed\x0f\xc1ޠ-hCxB>\xc5Y\xe0\xbf\b\xbc\xad\x18\xc53\xf9=\x16\xae\xef8\x81:\x02Y\x04\xec7\x13bzS8?%,\x15\x90\xa2\xe7\x9aS\xb5\xb0\xb7/\x89ҋ\x02^$(3H\xa4ݝ\x93\xa3H\xe7\n\xcf\xec$\x14\xa7\x81#\xdaBL\b\xe0\x05*\xa8\xaf\x01f@\x04\x91\x9cp\x96\xfcO \x80\x16\xed\xea\xb9\x13U\x1cF\xbb\x1e\a\xf3\xd6\x16\xdeٳ\v\\\x17\x9c\xd7\x1c@ݟ\x81\xeb\x83\xf3\x98\x8a\xe0\xdc \xea\xc6e\n\xd7\nE\x0e\x83\x97H\x99\xeb\x03\xcd\xf3q\xdd\xcf\xc0u\x01A\xf6o=\xab\x94\xfcS\xf0\xdbg\xa4\xca\x05\xafD\x03Q\x10.\xe2\xeb\xd2\xc5b\xea&.\xc0{\xc6\xcd\x11\x17\xacf\xf1\xa8\u05cb\xd6w\tZ\x10\xfb\xa7\xfd%\xf0\x82\xf3\x05\x170\xa7\xd7\x00\xa3.\x117\xd1s\xd7?\xba\x1e\xff\a?\xae\xeb\x1c\xbf~\xfd\xf8\xceu\x1f\xd7\x0e?s\xcfȊ\xdc\t\x83'D\xc7;F\xc3F\xbb\x84\xb1\xf9\xb8El\x8d\xb9188:\xb4\xaa\xf9\xe5UgFͯ_6\xa7m\f\x03\xa4\x1e\x0e0c\x87\xcfYV7w\xe4\x99U֜\x10\xa3\xa1'70\x9f6L6\x86rh\xc7\xc8\x15+F\x8eZ\xbe|T\xfa\x8c~\x86\xb7\x8c\x1d\xda815\xc5\xec5ipM\xe0\x90\xd0V\xdb\x04\x82\x9aOK\x14Z\xb3۲s6\xfa\xfb\xa1ž\xac\xc2\xe8b\xd0\x04\xa0\x14\xa0\a\x97D\n\xb3\xfcK\x0e\x01\xfb읁\x12;\x94\xd3\xf0\x89!\xb3f\rI5k\xec%\xa4\xcdf\xe0\xf5poZNK\xf0$p\xcf\x12܉\xe9\xf8\x04\xb1\xc17&\x80\x0ex8\"~\xe5\xe9\xe4\xf5\xd0}\xfd\xf5\xa93c@\xd3qL4\xb7\xa1\xa7\x8f\x1fGK\x162m\xa8\rL\xb7\x12\x9f5\xf8\xeb\tT\x9eN\x80y\x8c\x9d\xf7#4\xac\xb0I\xe8\xd1\x19\xb8\xf3 \x1d<1\x86BD\x92\x9f\x12,5X\na\xa2\xe9\xdc\x0f\x13y\xc1\x92\xa0$y\x9aR\xb0\xafc\x9a\xae\xbb\xfdT\xb2\xbd\x1bP\xa4\xd2YL\xddєP\x8f\xea\x97\xc7\v\xbf\xbeZ\xbaW\x04\x12fj\xcf\xf4z\xdcA\xe6\xbd3\x82\xae*S\x9b\xc4Us(\x15\xf7g\x01o\xc1\x8d\xe7\xb6\x11\x98.K\x8fZ\xa3!\xe1\xc5\xccJڊ&A\xf4\xfd\x04 0\x01\xff\xca\xe7%Έ\x05\xf2\x1b\xaf-B:\x8f)\x18\x1cNゝKg\f\xe1\x1d\x97u\\6\a\xb6\xac߸~\x18\xad\xdf-o\xfb\xe2\x1f_\xb4\xc9wSg\x15\xca+\xfe\xb5g\xf4\xfd\xebg\x94C\xdd.\xf9f\xb0\x12$\xc1\xca\xcd\xf2]H\xa1x\f\xadG\xa5h\xfdc\n\x85n\xb7\xfc\x19\xc8@\x1bd\x9e\x91\xefV\xdd`\xc8\xca\xcb\xcb2\xac\x8d\xe0\xbf]z\x95\xbcuܸV\xb9J\xbf\vh\xa5s\xa7\xe7UW\xe7\xed\xd2+\xe5\x9bw\xec\xd8,W\xe2D\x8d\xec\xd6}\xfbn\x95\x91\x82O\xbf\xf1\xc6Ӥ т\x13\xecf\x84}́R\xa9\x1aj\x185\x92\x9aNͧ\xd6\xe0\xc1y\x81O8\xea\xbf<\x13lH\x11\xd5.\x12\x1f\x986\x10\xebN;@\a{ \x8d\v\x92È^\x04x]8!\xf1D\x0f\x1b\x18\xbbh\"=\xaceN\v\xfe\x8f2\xf53\xe6x,>\nI\xaf\xb7\x94\x9c\x16$\xe7,>\xc6扵\xc9\u007f\xf0\xbapB\xaf\x0f\x8c]41\x95\x04\xe7\xa4\xf7\xf0\xac\x98\xd5+\xc0R\x8b\xfc\x06\xbaKH\xa3\xa9\xd3\x14)'!G\xe2\x11\xef,\xc5~%!\xb8z\x83\x84}\x10\xe8\xf1\x11\x98<\x02\x1f \x18A\x91\x8d\xc9\n \xb8\xbf\x11&\x10\xa2d!\xbat2\xf8B\x98\t\xa4\x85&Jd4\xd21Q\xfa\x95\xde4\x16y\xf3\xacA\x96I@6d=c\xb4\xd02\x9f\xde/c\x83\x9b\xb6\xcc~\xa8{V̢\x004\xc3\f\xbf\xa9\xa0\xfd\xc3\xc5Wwv\xce\xd0Ñ@\x81\x8e\x9b\x9c\xf4\xbf\xd8|'\x1c\xe3]_4\u007f1\xbdz\xd4J\xd4\xe8\xb1\xf1\xe8\x80\xc6\xe6q\x19KOt\u007fT\x1a\x80\xe6\xd0\xdc)\xbb\x9bj$4\xa0+\x1e\x9b\xbf\xe1ӎ0\x04\xa0K\x9a\xfaQ\xee1\xb1\xbfs\x06m|\xf6~2\x87\x87\xd2k\xad\x9c\xd2\xe3\x19\x115\x8foZ\xe1D\x10nH\xad\x83\x1b\xb5\xf6\xe5\x93g\r1\xfb\x8d\xae,\x8f\xe2:/X9c^\xa3\xd5k4y\x80UzK\xe4q\xf2j\xbdNo6\xeby\xad\xda\xe0\xf0\x1cu\xb94vg(\xe4t\xa8\xb7\x98\x95N')&]\xeftjJC!\x87S\xddF4\x86!\xa1H!C3\x90Ą'$O={\xe0\x00b\xee\x1f\x8d\x9bj6i\x96\xd1\xf3A\x15\xa8\x1c9\x1d\x1dC\xefN\x9f\x0e\xf2@\xfe\x9a\xf9\xe8\x05\xf4\xc2q\xc8z\xd8|jP\xf8\xa0\xa58uMn\xee˦{\xdb\xc4n\xb82\xeaz$aF/\xbaK\xdf17~\x16\x8f\xa0;\xc1\xd8D\xc91c\x85\xfbA\xa9\x94\x81\xba2\xf7=\x95\xa9|\x8bɪ\xaf\xb3x\a\xd5\xdd\\T\x8e>\xb7\x1am\xba:\x80\x99V\xb3\xbe\xa9\xf6\xa6b̗\xfc\xf5\xaf\xbbo\xbc\x11}Y\x0f\u007f\x9a\xb5n\x9d\xd7[\x1c\xf1\x96\x847\xae\xf0\xfb\x8a\x8b}_Yj/\xbb\xccc\r\xe4\x06\xac\xb1\xf0\x86\xe5\xfe\xf2\xe17N\\\xbd\xd9v\xb9u؆-5\\\x8eƭ\xd4I\xec~\xe7ĩ\v\xa7/\xa1\xc7,H]>|xq\"\xdev\xc9\xf1JϠ\xb0\xb3\n|\xeb\xac\f.(D\u07fc\x8b\xff*+\x81\x06\x9d\x05੧R\xef\x1a\\\x06\x15\a\xc1\x84\xceN\xa0\x19?\xbe\xaf\x14h\xcap\xbd\xd4;\x9f$\x86\x0fO\xc0\x03UU\x05\x05\x85\x85Ӂz\x8cY\xa9\x04\xb0\xaa\xaa\xbc\x1c\xac\xce\xc3\u007f&\xfc7uj^\xdec`+)\x99\xea4\xa5\xff\xca\xcb\xd1\xe5\x15\x15\xe3U\xb3\xa63ұ\x16\xcb\x19sX&\xf3:\xe3\xf9\x1e\xe3t\xa0q\x81{,8\xeeq\xc5d>\x8dI\xceM\x03\x1a\xe0L]\x8a\xefZ\x8a\xef\n\xefE\xdf\x00M\xea\xd21\xe5V\xad\x9c\v\xfaC9eV\xad\fH\x02꙾r\xabJ\tXE\xc0E\x12\r\x8c\x04֣o_\u007f\xbd\xb2r\xcbU\x15xv\x95\xeb\x9c|0\xfc'\xfc5\xa9#G\xc8\xf8T\xf4\x8fO\x05\xe6\xba|x\\\x8e\xa4.\xa1\xb6P\xfb\xa8\a\xa9\xc3\xd4\x1f\xd2ި\xd2\xfbD\xb8K\xfb8\xc2\x11\x10ć\x81\xe9\x02\xe8\bGK\b\xe6\b\xd1g\x13\xa4d,\x1f\x17\x92\aXo\xe33.A\t\xc55 $@\x95\x90\xdek\x163\x12\xe07_\xc9 \xd6\xe0c%ByN\x80;I\x10\xd3p\xf1\x01M\x17\xce\xc3\xf0\xd3h\xc0\xe9\x8b\x04\x1c\x01Z\x87\x99U\x1dT\xe8M6\v\x98\x12\xf5;\xfd$\xf5\xf4=\xad\xd5=<\xac\x03RI\x8b\x01\xea\x81R\xaf5\xd1c\xa6\x81X6IQ\xd3\xf6\xc6!3\a\x95;*\xf5\x8cj\x10\x0f\x9e\x97\xb2\xad\nn^\x1e\xab\x1b\xc6JC\xf9\xa0C\x85\xa3\xd4Y\xb0\xae\xb5z\x9fA\xb8H\x87\x92\xf9\xe5El\x83\xc8E\xf0z@.\xf2\x81\xaaY!\x14\xad\xe7ᩡl\x0e\x9eI\xa0\x82\x0f\xfb\xb9%\xe7\xd1\xd5\xcb\x03\xc5Y\x8e@Գ2\xc7\x05\xe6+\x18\xe3\xbd\xfe\x88\x10\xdf^\x11\xe3\xd1\x1c\x89\x9c\xbfD*\xa7\xe1Կ\x01V\"\xf7\x84\x17\f\xadh\xb2\x18\x942-0\xcae\U000bdef42\x16.\xd9\xcctKUr\xd0]\x9a\xae\xa2\xba\xf4\x97U\x80\x96т\x83@\xad@]\x90\x95\xf1\x80\xf7\x99\xf0\xed\xcc\xe0\xa3\xf3\x96b\xb2\xc7ҿ\x16k\xa8\b5\x04\xaf\xc4\x13\xa8\x05ԥ\xd4\xd5\xd4-\xe2:\x8c\x17TB\xfd\xb2\xbe\xb8\xb0\n\v\xebnz\xd9\xe5҈܄\x96\r\n\xcbn\"\x0e\x12\xbe\x98\x86\x8e\xa6\xcd(E\x85.VX\x80\xf1䫋\x12\\I^X\xc1\x05+\xd7P\x1aM2q\x8e\x81\x172$\xe9\xfa\x02\xf9\x1b\fE\u007f\x81\xc9)\xa92\xf2\x1e\xb3\xde\xe9(\x03O\\\"\x89DO}Q\xdf\xe8\xcf\n\x96\xd7\xeb\x1b:Z\v\x8a\xea\x1aB\xee\"g\x87[?\xa4kDQ\x143[]\x1b\xf4\x05\xba\xea\xbc\xe0Ь\xc2,e\x0e\xb8R\xa3\xca*\x94\xcb7\xed\xb2\x95j\vw킗\xe4\x87\a\xd7Ƥ\x9bw\xf9\xb3FF\xabP^A}AA=\xfdpQdrע\x9aļ\x99\x15ڲ\xc1\xb9\x063\xfb3<\x9fKZ5(\xe0\x93\x9dp\x8d\x99\xf6iE\x9dUeR\xdb<\xddY\xc1PSy\x9dEmֺ\xad\xfa\xc5فl\xe0[\xb4ոD:\xfb\u007fF\xf9]\x8a\xe5\\\xe4%\xeb\xd5t\x96\xab\x14e\x83\x88\x1b=\x04\xfe\xf2\xe1겒\xd2\xc2\xd4\x1a\xebnEi\x1dx\x91ܹ\x10}\xbe\xb8\xa6v\xf3\x92de\"<\xdb\xcd\xf3\x85j\xf8\xc8y\x1f\x8e\xa6Ԙ'\xfeVB\t\xe3\x9c +\xe9ͤ\x81\xc8~p\x88\x8d\x94\bc\x99\xac2\xc0D`J\b\x1a[\x9c\xf8\xa7\xaaf\x88\x1b\x89\xcc\xe6\x13^\xbc\xccD\xd5^b\xaa\xfa\xb2\xa5\x04\xd5\xeezw'\x00\x94V[1:k6\x13\x95\x02\xf9\xcf\x0f\xcb\xed\xd2Q8\xf04\x1f\xe9\x18W\x15\xfa\xec9ii{\xa9t\xeds1p\a\u0381\a\xd1\xdeWKZ\xe6\xed\xda9\uf86c\xd1\x15Z\xed\xd0ْZ\xb9]v\xea>)\x94w\xe1\x02\xb7gys&\xdep߷W\xef\x01\xac\x837\x10\xfdz\x03\xaf\xdf0\t\xcc\xc7\x05D{\xb6s\xefa\xc2tD\x1b\xd9\x15\xea\u007f\xf8\xa8\f\xa4]3jA\xff\xdb%\xeb\xcc\x16\xc1\x8f\x9f\xe0\x9f\x0f\x8c\x03\xf7\xc0S\vVW-80\xb5{\xf5\x96Wt\x8b\x0eN\x8bB\x10\xf3D\xea\xc7\xfd\xee\xc1[\x81\xfc\x96\xc1\xb5|\xa9D\xa9`\x15\xa9\x9b-\x96\x90\r\xc8BU\xcb\xdb0\xf5?1\xd3D\xd7ɠ\xa2X\xa9T\xc9Fv\x92K\x82R\xe08\xba\x1a\x8d\xeb\xd7\xdb\x12\xf6\xf5|dO\x8f2i\x89M\x90A\x03\x88<\x9fx\x04aC<\xf1\x8a\x99\x16\xda\x13\u007f\x172\x10\x02FI\xe3\x91\xc9\x1fϑ\xcb\xff(\xb7\xc9\xe7\xa6\xee\n\xc4^?K\xd5&\x03p\xc2\\1m\xceG\x93\xfa^\x82\xb5\xbd\xa9^\tu\x04\xfd4\xe9\xa398\xf1\x8fr\xa1l\xb2\x16P\xafDŽ\xb2Bڜ\x8f'\x9f\xae\x15\xca\xf6\xa6\xf5Ȑ \x87\xccN\xfb\xe8\xe0\xa8\xcc^;\x88\v\x8e\x1bL\x94\x8fh\xda\x12]\xe4D5#\x19\xde47\x1f\x1d\xda2uպ\xc7'\xc2u\x15}O\x87\xb6\x8e\x04\f\xfa\xe1/k\x9e[Z\xce5\x96Vk\xb2\xd5ֺ\xe6Ys$Ԥ\xa6\x9aq\xa9\xab\xd7L8\xbc>9\n6\xc4\xcf\xfcز\xc04\xf8O\xe8\xfbIw\xbc\xb1\x9c\x8d\x84\xbc\x81\xfaI\x15~\xcdy\xf2\xd0\xfc~4=\x01\xa1:\"`h\x8a\x10\x970*\xc4 \xe96\x82\x97\xca4`\xb1\v\xf2F\xa2\x83)b\xc7r\x02\x84\xd7\xc5#\x84\x93!\x9af\x9e\xfe\u007f\"G#jS1\xb1s2\xc5_F8\xea\x14\x95\xdf\x1et\xb8r}\x96\xb0\xc9\xe4\xf4\xb7\x17\xe4\xb7\xfb]Fs\xc8\xe2\xcbu9\x82\xed\x9db\xa6W\x88\xe4\xa7\xcb\xe4\x17\xb4\xfb\x9d&S\x98\x94\xf9e\x15!\x17\xd7\xe9n\xaf%~\x11\xc4\u007f\xb5\xed\xddg\xa8!\xa5\xb1a\xbc\xc3\xeb\xe0\x83\x9d\xf0?F\x92D\xa8\xe3\xb0[\xec&\xb5\x96\xb7\xda\x1cN\xab\x95תM8\xc1!\xa4\n!P\xdb+\xe6:lb\xee\x05\x05mV\xbb\xa9\xb7\xbd\x1b\xf4\xa2\xda̯\x9bֶ\x8e\x1c\x16s\xe6Y\xb2\xdc\xe5\xc1\x1b[\xfecD\x1c\U000c2f0a%t\xb8\xc7H\xbc@`\xb6\x1d\xff\xa4\xd4\xcf\x14\x9e\x0e\x00u*\tza-\x0e\x9eN2T_\x12⾗\xea\xed\xf7\x8d\xd2+\xac\x83Z\xbc\x12R\x98\xfc\x17\xbc>\xe1Y-\xca{\x88\x1f\x10\xfc\xfd\x19=MA\xef<\xf4ɭ\xef\x88\xf3\xcd;\xcf\xd0\xec\xca\x05\xfbS\xd4;xށ\x97\xa7>\\\xb023\v\xa5\xa8[\xd1'\xf3\xe0\x1d4\x85'\xb8\xf3\x9e͝y6\xb2d\x90\x91F\x86[H\x18a\xc4\xf8\x8e,\x19\xc2\xf3rTH\xbb*\xb5\x15\x0f\x94OQW/\x1cJ\x02\xe0\xedUZ\x9d\x11<\xa6\u058b\xefp\x02\xb5\x1auB\xa9L!\xb1LH\x9f\xf6\xb7\xc4Q\xccX\xaa\x8bP\x92\x04\xb7\x98\x11u\x86%!\xe2]\xb9\x1f\xb4D\xb4\x11\xc1k\x17\x14ա\x89\x13\x14\x11m[\"\x80\xba\x12)\xa7\xcf\x05\xcd\\0$\x10\x92\xacR.w\x95\xf8\x03`б\x9d\x15s\xdbZ\"e\xaebEVŸ\x95\x1d]\x0f\xce\xfaӭ\x8f\x8c(\xb5\x8f\xd28\xc1&t\xf6\x86\x1f\xae\x18{\xfd+s\xc7^7{lyEN\xb9\xad\xeb\xca\x11K\x835\x1dc\xc75\x97*\xe8\x87\x16\xb5\x8d.\x02J\x93\x8b\xd9`s\x98\x9b\x8b\x9b\xe8Z\x89ϙmW\xc9'|\xb3\xe3\xf7\x81\xf8\x94\xf6\xf5\xc3/w\x8c\x98;.\xbc\xe8Ѯ\x9e\xaf\xa6\xd4\xc4\xf6x\xfd`\xcfm\x00\xec\x98\xfb\xda\xee\x89\xc1\xeai3._\xba#\xfe\xea\xd4\xf6\x9c\xca,\xb79\xbfbn\x93Vw\xc9~\x866\xe7(\xec\xf9\xec\xf4b#0֟\xb7\x16\x8c\x15d\xf6D\xf70T\x92پ\xf2\x990)\x1d\x12\xf1H\f\x02\xf2-^\xf8L\x82\xe2*K\xda\xc8l\x14\xe7\xfeD?t\xb10̹\xe8Ep\xea\xf7|\xe6\xf3\x87e\f,\xf6\xc7u\xc0\xc0O\n\xc9=\x83\xa2\xedk\xa1v\xea\fg8b\a#+\xa66\x99\xcbB\x83\x86'G\xce|b\x1e\xcdLzp\xe1ӓ\f\x8aʜ%\xe3\x97\xee\xd9?\xa7\xfb\xd2\x02\xa9ϔ\xedO\x94\xb6\xe4\xcc\xdf3\xe7\xa1\xac1d\xbf\x1a~r\xbe\xc1\x03\x9d\x96\xf1\x8a\x18\xa2Q\xea|ϻ~\xb2\xb1\xef!*L\x9c\aG\xf5Z<\x83\x11C\a-\xee%\x1e<\r2ɴ\x1e\xabx\xa2\x05\xadX\xb4n\xc5\xd5W\xaf\x00\x1b\xe7<{\xd5;dmKQ\x99U\x8e&!h9W!s\xeaDߣ7\xd0\xf7\x9d#\xae\x02w_@\x1f\f\xb0'\xa4\x04\xb4|\xca\x02Ļ\xc3\xf4\xd3\x00\xa6_\xad\x1f\xb3\xbe\xfd\xf7\x99\xd5\u007fo\xe6\xd1\xf3\xee\bP\xfa\xd2\x19\x1a\xe2\xfa\xf3\x1eF\x98\xff\x89\x8a\a>\x11\xebK\v\xa6\x8e\b*\x17\xfe\xce5D\x14\"ђ\xb1\x11\x8ab2\x1fx8\x93\x99\x11@\xf9\x89\xed\x81\xe0\x0f\x8e\xd0\rYx\n\xc9\">\xca\x12!\xb2\x8c\x92~\x83S\b\xcf&\xb8\xa7\x8d\xe2\xd1\x1fJ\x87\b\xe0Z4\x02O\xa3\x97\xc3>ˑ\xba!\x9b\x8f\x1cټ\xf4\xe1;\x9f֗\x81\xc5 \veM\x9fkd\xd9#\x9b+\xab\x1e\xd4\xc8M\x1a\xa3O\xff\xe0\xa4#@\n*\xd1)\xb4\x1d\x9d\x1a\xdeT\x87\xf6\xe9=/\x99\xfb\xee9\x8cN\x01\xee\xf0\x92\x99W\n\xaa\x95 \t\x1e\x1b\xfd\xa1\xa8\x18\xe91\x00ń\x99\x87A\xb2)\xeb\x8c\xfb\b\xfa\xf9\xc8\xf5_\x8d\xae\xb9\x11$7\xcf\xde\xf9\"\x90\x1e\xb1\xa0>s\x89Z\xe1\x04̔\x8d\x9b\x8f\x00\xe1\xba\xf8JS\x1f\xa8\x99\x86rm\xfb\xdf\a\x1cX\x02\xb8ē\xc1\x92`\x92\x88\xe6\x1d\xa8;o\xa0]5'\xf4\x9c\\\x82\xa7G] O\xe63`T\xb4D\x90\x05\xc3\xf3\xfc\b\xfb.ķҕ\x10\xc9'1\x173\xf3\x19\xf90#\xcan\x9dCX\x9f\xb9o\x9e\xd9\xc7\x0ea\x83.&\xe8\n\xfe\xd3aH%\r\x0e\x87\x01&\r\xe0 )\x9c\xa2\xf0!i\x9d-{\x04\xd8\xc1\x18`\u007fD6\xd7\f\x14\x03\xe4\xbfP\t\x92f\xa7ӌ\x92\xae\x82\x02xI\xd8\xe1\b;R\x13Rw%cÆŒ\xe2\x11N\xe8^\x04^n[^Y\xb9\xbc\r\x95\xcf\x12օ+p\xdf\xfb\x19\xaf\v\x05\x04[\x80\x12\x87\xbc\xf0\xed0\x0f-\xe2XE=\x04\x05J0#\xf0\x88\x82,\x8f\x89!\x921@\x18\x03Q\x89\x12\xf7\x81\x908\u007fT\x00\x81\xe0\xf4\x13\xe8 <\x97\xb0OF\xfc\xa9z\u007f$\xe2\x87\xcf\xf9\x81\xd4ܗC\xc2\xf45\xe3\xd0{\x0f<\x82\x8e=d\xa6\xffL\x12\xfa.\x1d\aB\x0fl\xfe\xf6\xc19`iĿI\xb7\xe9}\xf4\xd6\xdd?\xa2\xf9ӟ%\xb9\x9bq\x1c\x14\xdf\xf3\x03\xd89\xfd\x88?\x02\xff\xde\x14\x8d6Enj\x19\x15\xf1\xf9#\xd7\xde\xf3\x10z\xf7\x91Lx\xf6C߀;\xc8\xe8\xd1w\xa3\xb7>\xd8\x04\xe4\xc7#~!\x06\x8a?\u0604~<\x1e!v\x15\x8a\xb3\x14\xf3C\xfa\xdb\xdaq\xff_&`\x8a\xd3f}\f\U000c60adt\x01~5\x82\xa5d&\x10{\x12ZpNM\x84Wd]\x91\xd0i\x91V\\WB\xacQ\xfc\xe2F\x85\x8bID\x04\xf8$\x11\x92\x1c\x8f\x13#N\x0e\x86$\xbe\xb4\xeb5L\xe4\x99\xd2\v\x8f\xb0]q\xcePXT\x15\xe7M\xe6jV\x10\x1b\xd2DI\x1c\x8ah\xfe\x90>\xbcd\xd9]\xc12t\x8d\x8b\x0ex\x959>\xf4\xe6>]\x96\xa6rհ\"\xde0|\xf6f\xafڜ\xa5\n\x96\xd5;\r\xd1۬\x15\xa7n\xfd\xfb-{\xf0w*E\u007fX\x1aP*s\x1bǎ\xebpj9\x8bV\xc38\x1a\xab\xb2j\xc7\ah\xe6J\x99\xd4\x03G\xc4;\xee\xf5\x94H[K\x95·\x9c\xb9\xf1%\xa3';VW9\xb3\xef\xech\xdb\xf4\xbc\x04J\n\xb2\x1b\xaa\x87\a\x06w\xec\xab\x1a\x1eTO\xbe\xafoϢ\xee\x9d\xef1\x97\xa3\xa7\x8c\xe0\x85\x86Ҿ\xeevi\x8e\x15r\x1c\xbde\x1a\x1a/g\xc1\x94\xf7}}?\xf8\x0f\\cS[ڲڧ\xd5\xc6ѭ\xd95\xd7\xef\xbf\xef^\x00s\x8bZ\xf4\xc51\x05\xeb\xf2\x968x\x86\x81<\xefw\xd8L\x96\x82+\x06\xb9\x97\xba\x94J(?\n9ul\xe8\xde\x11^O\xadr\x8eN\xe9\xfdp|b\xe6Z[\xb3\xabz\xb5\x06\x1c\x9d\xdb>3\xf5\x8cN\xa2]\u007f\xc9\xf53\x87L\x1b\xba\x005i\xaa'O\xaa݅\xfa\x9e\xbb$\xa7\f\xa8\xce\xf9\xfb#럍\x8a\v8\xf1\x14\x88\x0e\\\xcc|\xe9Տ,t\x81\xff\x98\x13\x0f\x90\xcd'\x18\nz\xb2\b\x88\xbc\xf0\x05\x89\u007f\x0f\x13\xe3\xc9\"`\xefՀ\xc74,\xad{K}\xef\xc6;\x0e?}͍\xf7\xa8^g\xab\xa2e5r[<4\x05\xfe\xf9\xa8\xfa\x9eL\xfa\x1bLu\x84\xa4\xc7B\xc5\t\xb0Н/\xd18\xe0\x98ԭ\xa9kG\xb3V\x9d$\xdf\xe5ʗ\xe8͒<\xb0\x15\xf0p\xdaX֢c\v\\\xbd?SP{\xdb\xe3\xffz\xf5\xf9\xcf\x1f\xec\xa9mZ\xb5\xachH\x83\xff\xea\v\x13Z\x9ex\xeb\xd5*\xa9R\x0fkj\x18\x8dJZ\xf9\xca;o\xbfR%U\xabYOV\x1d\xa3V\xcb*_\xa6_?M\xa6\xad̺\xc2v\xe1vqR\x15\xa2\xc6c\x1a =8\xc0\xa3\xa30\xd2\x05\x8f\xc3j\x90Y\xec3\x9e\x1d\xe3\x99\b}B\xf0-\xd9Ӎ\xbe\x16\x02\x98a\u007f{\xeb\xc9- \xb9\xe5\xe4VTD\xe28\x11h\xbb{\x84\x00}\x1d\xd2\ne\xbe\xee\xee9\x93$!\x16\xb3\xe5[N\xfe\x1f\xe6\xbe;\xb0\x89#\xfb\u007fg\x8bV\xbd\x17[\x96eɲ$W\xb9Ȓl\x83e٘bl\xc0\x98f\xba馛N\x80\x80\xe8$@BO\x80@\xb8\x10R\b)\xe4\x9b\xde0\xb9KB\n\x1c\xc9A\x0e\x12\x928\xb94\xee\x92\\\xbe\xb9K\x0eli\xf8\xcd\xccJ\xb6l\xb8\xdc}\xef\xfb\xfd\xe3\a\xd6\xee\xec\xec\xec\xec\xcc\xec̛7o\xde\xfb\x89D\x8fNO\x8aŦt\xad^\xaf\xb7'\x89\xe5`\b\x9b\xa6\x97H\xc0T.M\x8fҀF\xc0\x82\f\x15\x98-\x15'\xd9\r\xe8\x9f=I$\x87\a\x80ݨP\xc2Wش\xc8Y0\x19\x1eV3\x16V\"\xe5ར\xb7\xc0\xd8\xd7\xc54h=sF\xdd1\\\xc4U\x0f\x99\t\xa4\xf0l\b\xee\xb0\x00?|\x94U\xa1\xd4'E\x1cX^\x05*\x1f\xfa\xe4Փb\xc6\ah\xa0V\x9c\x04\n\x19|\xfb\x10(\xfb\xeeS1\xbc6\xf0mZ\xde\xf6y\x0e|\x03\x9e\x06^\xd5v\xf8\xe5'\xb9`K\a\x8d\x1a\u0080\xda\v,\a,,\x84/\x82_>\x83_G\xee\x80_\x81\x94?\xfd\xa9\x1f\x98)e\xd1gΌ\xde\xd7\xc0\b\xf2\x12\x82\xff\x8f1\xef(\xd2\xfd;\a\x03\xfa\xd6\t\x8axϯ\xa7\xbf\x06Mϯ\x8f\xfc}\xfd\xf3\xec\xf9\xa7B\x1eh\xf1\x84*\xf3\x98\xc6\xf5\xa7\xc0\xf4\xf6\xaa\r\xaf\xbd\xb6!\xe3\x19\xf0(\xc60\x87zO\x1f\x81ެG\xe3\xedvJJ<{cy\fK1\x98qA|\v\x87\xd8^t\x81\x16\x99@K9\x85\v\x0e#\xc5\xf9\xa9\x80\x8872\x0f\xc1\xdf\xc2\xf4e\xfa\xb3\xa0\xe9|\x03\x98:\xbe?\\\x19}c\xfe\xf8`\v\xed\x87G\x17\xd1\x1a0%S\t\xaf\xc0в\x19\xcc\xefO?\xb1\xf9\xe0\\0\xf0=C}%7\xeb6\x98\nO\x8f\x1eu\x1eL:{g\xe5\x98\x05\xd1\xd3p\xe5\x801`\x1d]\xd6\xd1\x1bL\xa5\xf5K\xc7\xcdX\x0e\x83\xf0c\xa5\xbe\xa8r\xb8\xe9,\xa8\x9dw\xef\x86'c\xb4AL\xb1\xff \xba\xbf\x98\x92\xeb\x04/?d\x87$\a\xe8\xfc\x88\xcd\xf6{mX\xb9\x93\x89\xc73x\xa1\x8b\x18\x19\xc19\x1dO\xbcC\x99\xfc&~\xda\xc1\xf5\xabϜ\xfebϞ/N\x9f\t\xaf\xe2\x0e\xb6\x01\xfa\xea\x81\x03W\x01\r\xff{\xed\xb9C\xab\x1e{\xa3m߾\xb67\x1e[5\xf3\xb6\xa7Ƽs\xe2\xc4O\x81?\xec\xb9\xf7ӧ\x8e,\\\xf5\xfe\x92\xf7\x8f\x9dx\x87]\xde!.\x1d\xbbg\xcf\xd8R\xf6ښY\xb3:\x1e*\xadd\xa2\x83\xb7o\x1f\x1carr\x1ds\xe6\xa43[\xd9{\x0eVE\x86y\x8b\xa6\xcf\xe6\x04>\xfa\x18\x9a\x9b\xc7v\xda[\x8c\xfb\x9fˡo\xba\xee\x02XM@Z!\xb4\xc5\n\xb8+V\xfdx\xbd\x95\x1c\xe0\x97V\xfd4\x1cF\ax\xe5\xd6an\xcbw\x0fud<\xf4\xdd\xea\x99\xd2\xdf,\x98>8\x0fd\xbf\xba7\xb2[\xb9\xf9\xc41\xfa\x13\x83\xd5j\x88:pBZ\x87\x8f\xd1\xef\xf1\x11<\x8e\x8fp\x18\t\xcf\"\xe1}\xe8\xf8\xd0C\xdf}\xf7\xd0\xe27\x8a\xd2\xdd\v~\xd3\xe7\xf9?\xef\x8e\xec\xad*\xb1\u007fLamI\xeaFP$\xd8\xce\b~\xda\f\xc4S\x9b\x9d\xf8jˣ\n)\x1fUJ\x95S\x95T_\xaa\x06\xd1塈2\x8f\xa6\xc6#\xea<\x83\x9aMͧ\x16Q˨\x95\x88BoD\x14z;\xa2\xd1{\xa9\xfd\xd41\xea\"\x1a\x11X\xf4\xe3$G\x9f݀\xad\xd7L=\u007f\x01\x13\x9f\xf8\xc3.\x89\x12\u007f\x00\xe3\x82\xfd\xca\x0f\xdf\xf7\x1a\x02\xff\xe4\xae\t\xeb\xb3\x18\xf8[\xfc\x9cq\x0e\x8b\x80\xdfXi\xbf\xa0\x8e\xe6\xe8ԧ\x03\"\x97\x80\xf5o4y\x03\x1e\x11\x16^\x8b\xa8ȵ\xa8\x98\xbb\xaf\xfd\f\xbd\x97>\xda~f\xa83\xfe\xafB5S\x95\x86~VrnV\r\x99\xa9\x9a\xb9\x1c\xfdn\x8b\x9d#\x95\v\x81~\x110,\x02\xfa\x85\xe4/\x16\xeex\xc1\xb9聞\xf1?\x0e^ԙ\xb13\xbae\xed\v/\xac]\xf7\xfc\xf3\xf0\xb2\xbbwuow\xcb$3\x93\xd6gbj\xa0\xc4\x11\xa8\x1f\x12\xc8\xca4\xa4ר\x107\x9e!\xb1*\xcdFyj\xc0g\x17Q\xed;\xe0\x13\xa0\xa1\x929\x1c\x99\f?\xe22\xdf~\x1b~\xb8hў\x84\xbf\xbb\xd3\xf3\xed\xcatO:\xfe)\xec\x9e\xf4t\x8f=\u007f\x82'݃\u007f\xe3\xf3\xd3=\xec\xfb\x19=\xfe\xc1\x13C\x16u\x8fY4$\xa3[\x9e\xe8\xcf\xf1\xfc:\xa1\xb4\xe0\xf6\x8c,\t\at\x86BoE\xb6Ԙ\x9b\xe6\xc9\xe7\x81LoH\x12\x19Me@\xc5\xc8\x18\x11-5\xe5\xc5\xfd\v,B\xe3o;\xc1{\xc8\uec46\xbd\x95q^̍,f4&\xde\xdfv\xf8p\x1b\x03\x0f\xb7\xdd\u007f\u007f\x1bh\xabȻv)\xaf\xa2\"\x0f<\x99\x1b\xa2\u007f\n\xe5\x82'\xf3*\xc0\x16|\xef0Nز\xe00[\xd2\xfeJnEE.W\x8d\x8f\xbf\xf9\r:\xc6\xf8\xd0LD\xbf.\xa3\xf3\x18D\xbd\xb88\xdc\x11ߵ?O\x04\xcd\x18\x1f\x90\x15\xbcDP\x89\x10I1\xcd\x01\x9f\xb0\xc9\x11We\x17\x1e\xf0s\xfb\x00\xbb烏\x0e\x8f8\xb0ba\xf3\x8c\x85\xcb\xef\x1dv\xe0\xb7\xe7\xef\x9fzi\x04g\xb3\x88\x95\x86\xde\xd3\xe0\xcfk6~\xbe\x19\xa4\x9c[~\xf1\xf0\u038d\x9b\x8e\x8d\x99\xbeq\xedD\xeb\f\x8d>M\xf3\xc7\xfb\xcbf\x97\x17\x89U\x86\xe4^OM8\x05\xd9R\xe6\xc5\xf7\xde\xd8u\xe8\xfd\xc0\xb8\xe5\x1b6.\x1f\x17x~\xff\xa1\x97j\xcb\xd9T\x9dA\x99\xe4k\x9c\xb3\xf8\xc3Mg\x81z\xd4և\x1f\xd9:j崉a\xa7U\xaf\x1d\xac\xbf\xff\xbc3\xd7iP\xe9R\xfa\xd4t\xbc\xe6LU\xc5xY\xec\u007f\x1c\xdb\x12\xe4`\x8c(\xa2\xc2@|R\xa6\x02\xa2*\xd6\v\x10\x90\x11\x8cE\x12Dzgcg\x1d\xf1\xb0@\xfc\n\xa0\x8f\x10'uA\x10`\xe22\x15+\x8b\x97\xe1,vЋ\xa5\x16ć/\tD\xbf\x16t\xc8\x05U\xf2wm\xc9\x1d\xdf\x01\x9eKb\xee\xc5I\"\x94\xd9et\xd2'\xdf\x13\xc4&\xead\x95\x8c\xe5\x01{\xd2\xecb\xba\xe7\x82\x03\xd1D\xc5r\xa6\x15RINf\x05\x9f\x9a$U\x17`\x8c>\xb3\xd2[\xcd2\x01\x14ThӌN\xdeՅk\x8f\xeb-\xe8\xe3\x0f\x13z\x9b*\xaeFO<\xa0\x99\x80\xb1(\x00\xfe\xd3:s\x94\xabX\xb7\x1b\xbdv7b2u\x80\xc2\xd0\xd8Tt\xf7\u007f\\k\xdd.\xe0\xc47\xe0ǻt(\xe7\x1b\x94\x0e\xe7\x97\xfe?\xaf\xbb\xe0GC\xe0߱7N9\xb15C\xb7t\x12\xc6\xee\xd6\xd9%\xb4\xddig\bC\xef\x14\xb6̉g\x0f\x8cS`/\xba@χ\x17\xc0U0>\xda\xef\x8e\xf7`;lc\xa2(\xe6\xd5\xc8\xeb\xf4\xf1\xf7\xe0\x0f\xf4|0\x06\xb6\xc1v0\x1a\x84\x95\xb4:\x12Җi#!5\xad\x04a\xad\x9d\r\xdb\x19*:\x83\xde\x1f\x890,\xf1\xb7\x11\xf9\x86\xdeO\x02 <\x1dR\xda|M\x84\xd2\xebYJ\x93\xaf\xa5)llj*\xc9\u007f\x8f\xe6\xa2\x1a\xea\x1e\xc4\xe9S\x1c\x16\xcb\xf3n\x02E\xfd뇀`\x1c\xfbO\x0f\xce\xc4D\x1a\x06o\x9bk\xbc\xd8ͨ\x01C\x80b\x1f\r\x8c\xa6+\xf5\xbfz%089\x1f\x9efx\x1d\xfa\xc8\xe11Æi\xfd\xdaa\xc3P\xf8\x9f\x1ep\xa2_\xbb?\xac=/!U\xe8\x03\x8d\xdez2,l\x03\x85OZ\xf5\x9a\x0ft\x899\xfd\xea\xeb@\b`\x13\x1f\x88\xfa\x8b\x90\xa1\xee\x9f\xfd~\xe5\xeem\xf8nC\x83N\xd7\x10\x02NPf.\x97\x96\x81\x1cl\x1c\x0e/\x96I\xcb\xcd\xf0M\xf8\xb1\x16\xddl\xf8\xd5LX\xb3\x00\xb9\x19\x1f\u007f\\ܗK\x1fj)E\xd9u\xa8%u*\x00bN \xd3c\xbe \x057\x8e\x12\xec\x80\x1akg1( \x16\f\xa3;\xc7\x1e\x13p{1\xa1\x15\x88-\xc6g1\x16\x11\x90\x16@\x80\\\x8d\xbc\x97\xb72t\xa8\xa9\t7D\xb8\tP4-\x1d\xd9o\x12o\xe1'\xf5\x1b)%z\xba2\xf4\xc7\xc89\x85L\xa35)2<:\xa9B&\x97)\xa4:O\x86¤\xd5\xc8\x14\x9c\x9c\x91\x91T\xe0\x81]\xb7E\xf6ݶK\x92\xea\x19\xea\x1b\xf3\xa1\x91~\xfd\x03M\xdf\f[\xaeuN\xef9\xd6\\[F_\xcd\a\xaf\xf3)\x1f6T\x8c\xceV\x83\xd6p\b\x9bH\x85\xc2t\x11K\x8bu4\xad\x13ӬV\xc2\xf0\x10\xf6\xd56\x11_W\x15\xd3\xca\xd3\xd2ʧU\x14\x0e\xf1;\xe4(+\x94\xa14%ɤfei\x0e\xab^o\xcdH\x93\xb3\xca$S\x8a\x14\xe5\x84\xf2\x93;\xfcC\x98!\x10;\x14\v\v\xfb\x11\xf8竭\x05\x8f\b>\xb1\xe8N\x9f5)D{ʎ!\xfc\x04\fK\xb7\x1d}\xff\x14 \xf8rљ\x8c\x00\xcdy\x18\x98V\xc4\xcbЌ\x80w\x13\xec1\x8cH\xda\x14d\xb0\x00\x9d\x02\x85\x9c\x94e\xa2;\xb5\xc5\xda\xe8\x0eN\r\x16\x18\x1d\\\xbf\xd7D\xe9FC\xbahW\x89\x96vπw\xcf\x17;ty\xb2\xb5\xbf\x139rӹ\xc5p\xf4\f\xd8\x16\\;\xbf>#\xa3~\xfe\xda`\x1b\xa4)\x91\x84a\xa3\x8fh\xb5\xf4\x18Z\x9bb\x00\xc9\xd1iz\xb3Y\x0f\xbejq\x80\x13;\x0f~\xa2\xd1\xd3\\\x16l\xa0\x9fЛS\f\xb0\xe0\xe0\xce+\xd7rjB\x19\x19\xa1\x9a\x9ck\x98\x87\xa3oPl\x98\x8b\x10\xdb\x1a\n\xe8)^\xe3\x8d\xf7\xeaNA]'ޮ\xc6\x03h\xe2}\x96\xd5f\xe0\xbd\"\xf4c\xc3\xf0\xf2\xe5\xb6.\xd0\x18!\xb8\xefok岭\x9fo<\x0e\xb2\x9f\x88PB\x8f\xc3{?L\xeb'\xf0Eԗ\x12\x92\n\xeaD\xac\xfa\t\xa0=\xb8\xe9\xeb]*\xdd.\xf8g\xad\xb0\x9b\x83\x9fJ\xdc\aŶ\x80\xdd}B\x12o\xc8t\xba\x87&\x1b\xc0&\x10\x03\xc2\xf1\ne\xa3\xd4\\\xab\xd9E^\x00\u05ed\x1e{\xf0\xe2\x9f/\x1e\x1c\x8bNK\u07bd\x0f\xac\x86\x1dDX9#^4x\x9dC_\x1b\njK\"\xb8\xf6\xbew\x97\b\xa9\xf1C\xab\xc1j\x92M{\xb8\xab.\x9d\xba(,\xa6\xcd\xe5\x82\xed\x9cր\x9a\xd0\xf0+M\xe8sQD\xe3\fQ\x1c\xac\xb2c\xc5T\x83P\x12^\x14/4\x13\xdcy\x125\xaa\x80\xd8@^+\x04/\xc3\xcb'w\x1e\xab\x10\xe94}\r\xe2\xdc\xd6\xefZsũ\xe5\x1a\x9d\xa8\"\xfa`W%\xd8\xdf\r\x80\u007fy\x18\xb7\xf2\x86\x84GIpC\x12\xe8\xff\xc9\xc3\xc00\xa0\xe9\xa4:E?kݺY\xfa\x14\xf5Ɏ+\tU\"\xfd\x81\xcc5U\xd4@\xbc\xe7\x1cSx\x8fW\x03\x83\xc7\xfd\x8b\xfa\xe1.\xe2\xa70\x11p\xe2\xf1\x1d\xaf\x14Ka\x9b\xf9\xf8\xd7X}\xab\xfa\xed\xfd\xdb:\xb9\x1a\xd8\xde]z\xa5\x91\xba\xb1I\xa9\x8dnN\xf86\xa8\xb3\xa0\xafC\xba̦\x1b\x87߾u\x05Q'\xd2\x1c|\x0f䘔U\xfd\xa0V\xd9є\xf8\xb5\xe8N\xdb\xd2\xd9\x18=\xe4?\xa9\x1b\xfev\x017\xdf\t9l\xe8&m\x8fO\x06\x81N\xa4b\xbf\xad{#p\xff\xba\x11\xd0G^]\x1f/\xd7\xec\t\xb1\x1bSJV\xaf\xbe\xa9\x15\xb1\xec\x87\xc6\xfaN\\\x94*\xa1\x82T-\xd5@vf\x8c\xb4\xe8V\xa4\xc3\xfeO\x88\b\xee!h\xd64Rh\x92t\x8b\xd4L\x11aH\\d\xe2\x05\x1a,\x93Ӏ\"\x14F\xf3'aKDP\xbe\xf6o\xfb\x12(\x06\xa4z\x90\x1b\rp\x9f=\xf7\xd8c\xe7\xce\x02wd7b]Z\x17\xcd8p`\xc6\"2\xb3\xd2\xd7\xefX\xb6\xec\x0e:\xf4\"\xaeŋ\xe4\x06\xf3׃\xf0\x87'\xd4\xddH\xd1\xcd\x04\xe9\x1c\xc8\xd3\x19\x16-2\xe8\xe0\x1f\xa2\xef\xac\as֯\x87{\xe0/\xa5Ǿh{\xb8ThrĐ\xb3\xaa!CT0\x02b\xb4\xa1\xf4\xe1\xb6/\x8e\x95b\xbe\r\xdc\x10\xf1\xb8\xbf\xf5\xa3\xea\xa9\tԜ[\xf59\xc4>\x8b(^\x94\xe1\xf60\x01a\xeatv\xeaav\uf726\u0600\x02ńQ1\x05\x81So4\xa1V\xa3\x02x\xb7\v\xd1E\n\x1b\x16\x92Nl\x05\xa2n=\xad\xae\u0098\x06\u007fz\xfe\x03x\xb4ϒ\xf3\xbb\xebŒ;\xbfؼ\xf4\xe3Ѥ\xff$\xa6\xeb\x95\xfe\xdc.\x12\t)\xf6\x81\x8f\xd0_$\xfc\xe91\x06(\xdf\xf5}\xb2\x195$ӊ\x1a\x10E\xc0\x9fP\x04۔\xd8\xd7&\xfe\x10~\x0eF̩\x1f\x9d\x12\xcd8\xfa\xe9\xb2\xcd\u007fޫ\x12\xc6`(1\xd5\xc0\x89\x92E(\x0e\x1eѻ\x92\xdb\x1f&\x87G\"\xa6T\xeb\a\xa0¹|\x17\xbc\x1e\xe1\x11\x17\x84b,i\x1f\xc0\xd3(\x06\xb5\xa1(\xb6\xaf1\x10\xb5\xe18\xaa\xf9W\xda\x10\xf5\x99\u007f\x8b0\x11w#BS\x92\xbeGX\xbd\x80K\x8d{_g\x9fS\xa3.\x17\xeeф6\xf8\x8fg?{i\xc9֛\xc6\xec\xc1뷛\x92\x81⥶\x97v=\xf1vlTRa\f\x15\x80\xaa\xb3dځ\x03Ӗ\xbcȔ\n\x9d\x8f\\v\x1f\xa7\xa8힁\x91\x94\xf4U\x83U7\x0fV͋ \xfd\x81\x97\x81*5}\xd5$2\x1a\xbf\x89uC0\x1fw\xbf҇A\xebå\x91ή\aC\x0f\x97v\xd3\x1d\xeaE\x90\xe3\x13\xe7L\xbeSY\x92\xef>{\x06\xba4&\xff\xe9\xaf~\xb8MjF\t%ۇt\x9f_\a\x9f\x10\xe2O\\\xfc'\xf3,}\x83%\xf3l)\xf1\xe7h\xa4\fz\x9a%ۺZ\u007f\xc0\xd7\xf5\x91y\x01\xd4I\xa8F\xbc\x9e]݂\x8eՇ\x0e_\x06\xee'\xe0\x87\xc77~\xbeU\x86)\v\xd9\xfc<2N(\xc4;h-\xf8\x8eP\x9fq\u008d\xeb]\xb5aV%\xc1\x17?y\x18\xfey\x97N\xb5\xeb\xebM\a\x81\xf6\t\xb5\xf0َ\x8d\x13\x9ey[\xa7{[\xc8h\xdc1r\xa3#\xdc}\x1eB+:>̮\x8eׅ\xa0\xa0\v\xa5N \x97\"\n\xeb\xf1\tܖ\xd1\xe4\xf5\xc57A\xedq0\xaa\xf8\xb7\xe1\xe7\xeat\xf0#I\x8a$O*}\x11~\x14\xa3\xf1\xff\xa4\x8c\xc0\xf5\xa2T\x9a\x87\x12w\x84\xba\xaaD\xcfE\x15\x86\x1f\t7^\x14\xa8 \x9a\x87\x9e\x00ٝ\xed#D\xbe(\xbc%\xf2\xfdM\xf3*\xf96X>$\xf0\x90\x9d@p\x14^\x11 \x96\xb7\x93\r\xc0\xec\")\tzA\xec\xe3G\xf9\x84\xd6%\fb\xf4>\xa2\x13>\x15\xcfT\xb1^\x12}\xb7\xc7;\x11\x81\r\xb3\x18O\x18\x83\xb7ǘQ\xaa\xb3;c-/\n^\xef\xe4#7w\xf5Vt\x02\ts&\xed\xeb\x8aG'*\x01\x87-#\xc1צ\xc6\x1b\xc0\x8a\xaf\xde\x00Q%\xc4\x00\xc3^M'p\xdcc\x8e\xa2\"\a\xbc\xed-\xebW\xf9\xd5+*\x16m9z\xe6LԎ\xe3\xb8p\x91\xa3\xfd\xb8\xa3\x88\x1e\xf6힒\x12\xf0{ɑ]\x8f}\x1b}\x1c\xdd\x18\xe9(\xa2b\xef\xe20}\xab\xc3;ax]\xc0\x1a\x89\xd3\xd1t\x97[)\xc2\xc6Q\xe8\xa5\xda@\x97\xd8]\xd0\x05g\x89Д\x00\x9b\v\xbb\xb6\x1e\xa6vÉ7g\x1c\x06\xea㮆\xa5'fToJ\x95fȬ\xc6\xec\"\xa7R\xa2\xca\x19\xc3ۚ\xeb˫\x1bDŽ\x02\x13*\nS\x14\x1f?u\x06\xfe=95\xd9j\xa4U\xde!9F\xe6\xb19\xa7\xeej.\xde\b\x8f4\xbdp|\xed\xa0P\x89{wΔ\x9c\x86\x9a\"Nz(m\xdcW`\x8c\xb5\xb2yخ\xa1\xc1\xaa\xf6`Ű\xa2\x91\xcdKf\xe6?~\x1aF\xdf\xcam(ȑX\xc60\xaa\x86\xd9s\xe3r\xe9\x15\xa8\xed6\xa1\xf5D\x10#\x96P\x022\t\xd1='\xeb\xec\x80\xe0\x8e\xccH\xb4\x11\x01\xa9\x10\xc1\x19B\x11L\"\xce-\x1f0j\xe30d\x18\xefNG\x94\x8f\x98\xf7̏r\xb4F=/\xbft\xe3\xe4\x1du\x03\x00\xd3?\xc9\"J\xe2u*\xb1\xb8\xa8/\x97^]2Q.U\xb5\xac\xb9\xfa\xc8ԩ\x8f\\\x85\xe8\xb4|\xc8O\x87\x11Y\a\xa6w\x96/\u007f\a^\xdd\xff\xdb\xe3p\xe2\x969\xcbߡ\x8b\x1a%\x9cԞ\xe3\xf6\x05\xf3v\xb5\xcc\x1e%\x1e\xdb\xc7\xc8(\f\xfa-\xbc\xa1FʋkB\xbe\x02\x1e\x0e\x89e\x82Nk\xde=vuP37\x1dg\x02\xcf\xc1\xab\xef,\x9f\xb0\t\xec}\xfa\x0f\xfbQ\xceįK\f\u007fL\xc0\v\xd2\x11\x19\xb1\x1b\xb5\x02Z\xb1\x04\xec>\xbb\x06\xfd:M\x95\x12\xc2\xdaN\x9c\x11⏆\xfc\xb0\x8a/\x85\u007f\"[I}II}{R\u0085\xf0w\xefu\n\xebR\xe3_\x98\x80\xd2\xdcKn\xb0\xb6x\x88\x16RFmX`HS]\xc7\xce}G\x82ŝ\x83-g(\x9bK\x8dq\x05A\x8c\x85M\xd0\"\x89\xcf\x03\xf6\xb8\xf6\bqpn\x88\v\x938o|\x05\x835R\xb1g\xbc\x89\xf0\xf5\xcf1:?\x1d\x02M\n\x9dN\x01\x8f\xe8\x14\xad\n\x1d<\x82/@\x13\xb9\x88\xda\xea\x8a\x01U=\x03\x8b\x86x\x83\xcd\xdfoZ\xb9N?䞧\xef\x19\xa2\xd7m\x18\xf1Yq\x1d\x1d\x8e\x01\xfc\xc3\xfbo~Z\xc87\xdaZ\\\xf7Cѝ\xb7\xf9\xa6-\x99:\xb1O\xa6\xa6\x1c\xfd\xd34\xd5\x15\xc7u\xa2\xf9\u007f\x90\xfay\xa9\x91\t\xf5\xc3=Q\x05\x04\xb4\f\x01\v\xd0W\\A\x86\x18F[%2\x1d|\xc4\xfd\x95\xe3\t\xdcBbE\x8d6RM\xc2|u\xd5\xf3\xd9\xeb\x12\xc9\x16\x89B)\xb9~]\xa2T\xa0 \x0e\xf4\x88\x89\x1a\x9eu:\x87\x19L\xdd*|\x00\f<\xa0\xd7YR-fgg}\xa3\x9f\xfd\xf3L\xbab\x9eu\xfa}\xceaLW\xe5W\xacЈR\xbd\x951a\x80%\x17O0\x96<\xac;\x03\xc3,\x05\xbcA\x06[w\x99\x04\x91*\xe0\rX\v\x15\x95\x18'\xf2\x06\x81\x95\xdc!(\xa8\x0e=\xef\x17\xdei\xc0\xa8}\xa8\x80&?\xd0\xe3#\xae\x19^$\t^\x14\xd12)\xddm4\x15\xa1\xdasD\xd1\xc2E|g\x99P\xc3\x14b\xbb2\xfcD\x00q\x1e>\x91\x89\xb4\x93\x15\xcbn\x03.*\xe6?\xc1W̸x\x9f\xc8(Ļ8\xf4s\xfbD\x0e\xc1\x8d\x89SD<\\\xa3\xf4\"\x1e\x15\x805\xf93Ps\x14\aA90\x907\x13\xcc@\xb7R\xec\x10\xb9\x95\fF\xc3q\v1x\xc1od\xfc\x18YХ\x04&\xe1\xf3\x10\x85]\xfc\x14b\x12\x8c\x04nʁ\xcadb\x89\x8bz\x11y\xc6a(r\xe2j\xf1~\x9f\x00\x97\x87}@\xa2\xac8\xbf\x80\r\xab\x17\x8a\t>\x15\xbb\xb4\xc9>\x1a4\xa4\xa0J\x15\xf3.]\xb2\x0f\xd0\xc3R\x8c\xc6RŨ\xf4\xbc\x81\x9b\v2\xf3\xdb\x17*F\nA\x0f\xfd6\xc8r\xa4\xa4\xfb]\xc5\x16\xaeeH}KK۔\xbf\xadJ\x99\u007f\xfbҡ\xf4Ob\x1d\x0fƆ\xfd\x05\x8d\xc6\xe8\xd0\xe8\xefL\xa3\nG\xbe\fhN'\x16%+Sx\x89̒jU\x98,\x0e\xb3V/\xe3}\x8d2\x89D5\x98NwY8\x85G\xc9\xd0\xd2,\xa9Je\xaa\x06\xc1\x05\x16\x9bA\xac\x1eh*c\x18\x9a幔\u0082\xa2\xcc\x15\xf9\xe5\xd3wޡ\xcf.\xb6\a\xe5\xf40\xe0\x9b\xdc{D\x06\xe0x\x96\xa6\x01Sf\xaaѢ\x89\xc32\xbfw\xff$\xa5F\x96-\x01\xac:W\xc1Y\\\xe9\xf4\x10\xa5D,o\xf4Iy\xa0ך\x1d\x16\x93\xd2nN\x91I\xc5\x16\x85\t\xfe,i\xb0\xb2)\x16\xbdm\xb0#Y\xd1Ǫ\xe0\x98\x12\xafj\xa0U\x99-3\x18\xd5\xd6\xeb\xafY\x1b$v\x9d%%3\xb5Z\x91\xecp\xaa\xbc\x01V\U00092c97.#\xcfcNf.\x8b5\f\xa3\xd0d\xe6\x82$\xd8\xf6\xedC\x0f}\xfb\x90\u007f\xe6,\xc0KSצIX\x0e\xfe$fX\xfa\x02͊D\xb2\xf4M\xf0^uV\xa9J\xcb0R\xae\xef\xeb\x8cs\x030=t\x02\x18\x0e\xda\x19@k\xaaT\xe6\x12o\x1a\xc7\xf2RZ$\xe1\xe5b\xb5X\xc7\xce*e\xe5V\xb5E\xc4\xfcW\x12\xed\xcfϕ\x8b5\x92\xb2T0\x94\xd1T\xbb\xb3nk\xe4\x1c\xeb\xfcޑ\n\x13\xfb\xdb7&\x1f\x9b$2\xd1i\x12y\xaeT\ahF7\x82\xd6\xd3\xd3\xe0\x13u\xf5bqe\xe8\xfcy\x00\xd8#l\x92R\a\x18\x95*[)I\xa3\xd5\xf2\xf7\xfe\xebM\xba\x89k\\\x9e\xed\xea\xaba\xa4#\xbd\xfeu[\xd5N^\x92\xac3Vq\xacא\x10nL\xa9\x94(\x1cv\xcf\\\x8e\x1b\x91\x9e\x10f\xabT\xe2\xbc\x14GQ\x8eI7p\xe6\xcc=3?\x9a\x9bקw\x8d(sn\xfb\x15Y\x9aIS\xb2\xa0\x1fM\xe7g''g\x15\xd0\xcc\xc1aFm\x9aL*1\xa6\xa6J\xa4J\xbd2U,\xb7\xa0O\xa6\xaa\xa1\xa5}}\xae\x9c\xa0]\xe3\x94&k9-\xc3\x02\x0e\xc8D\x99\x8c\x88\xa5\xedi\x19-%\xab}jS*0\xab\x93\x94\x8c\x92\xf6XX\xad\xa7\xccW\xa3\x10\xab\x14b%\xb3\x1a\xfec\xf8\x9dR\x1d\xa3LR)\x95\x96$M\xf1\xea\xd2\x16\x87\xcdNK\xe9,N\x8e\xf2\xe1\x18\x94c\x92إ\xb1Udf\xf9\xfaI\xe8\xc2$\x15\xeaD\x16\xb9Ģ\xd6*$R\x8b\xd5 f\x9eLM\xb6Mu\xaeLձK\xb37\x96)lJeh\x9aZ%\x05\x8bV1՛\n\xa7ڒS\xb5\xac.u\xe5\xd64e\xd9\xc6l\x91J=\xb5RS\xb9j>\x8b\xdar\xf4l\xc6\xedڮ\xd3\xf2b\xfd\xfa\xde4\xbd\xfe\xd8\xe2%ǎ-Y\f]\xa8#\xa6,E\x83J\xc6\f\xe8\xf3\x12\xdb؈\x9a]?\xbc\x81S\xd1gz-K\x16\x8b\xb4\xea=\xa9\xf4:\x93b\xfb\x9b\x81\xc2\xd7\xf7+\f4\x83A|h\x1e\x8c\xc9FCR\xac(\xe4\xc4\"\x0e\xbb\xb6\x04\x12\xbdF'ch\xa0)\xad\x90\x88=\nEj\x06j\x96\xe8\x06\xa5\xba\xffR\x99\xdc7\xdb\ufae7\xe9\xdeW*J\x16\x94\x17o\x99\xc4J\x80\x88\xd6\xeaL2\x85lX\x9f\xf4\xb3\x06\xc3\xeeB\x87\x91a\f\x96\xdea\x90\xef\xafr\xd9\xc1\xa0:\xd4\u007f\x92\xf4Z\x96cůM\xe8\xb5\xcd?\xdb'\x97-\xeb\xa7V\x16\xa2\xe2\xd7\v\x83\xef\xf5x\xdb\xefn\x81\v\x1d\x1d\xac\x86\xf8]m\xeaP\xad\xcfQ\xa6Y\x88\xe5\x05\v5e\x0e\x1fS\xdb\xc30\x1b\xfe \x88\xd3Ư_?^\b\xed:w.r\x17MP\x11\tToܞL\"\xe0ʛ\b_\x87\xd7b^\x8d\xa3GS\xf8\b7e\xe8\xa9ZUd\xe4\xc3\xd7\xc3\nl\x06\x8cX\xa5\xd1\xdb\xd1\xd1\xe6\x16\xd9\x1d>\xafͧAGM1\t\x9b\xfc\xe8\x0e\x13\x82\xad\xe10\b\x85B\xf0ǖ\x16\xf8c(\x04B\xe10lEguK\vP\x87\xb8p\x1bl\nG\xdb\xda»v\x85\xdbh[\x18\x1c!A\xa19\xe3v\rqo\x0f9\x04\xf5\xa2\x17\x91\x9cb\\\x18\xa2\x88\xa4\xc1#\x15\x9d}v\xce@\x9c0\xfb4>\x87\xc1\x89\nB4ZQ)\x89?ݘ\xc1:>\x13\xfbu\x83\x18\x8dX\x18\xee\xa0 vn\x1b\xe6(\x80\xb1z\xb1HE\x84~\x1d\xc2\x19\xa2\xd8\bJń\xb1s\xd4(\xea\xc17Pz\xec\vXx\x8a\xa5@\xdc?n;\x16\xfa\xa3\b\xc1\xe7\x03\x0eE)҃\xc24\xeeE\xf8\x01J\xc0\xceA\x15CuJ\xeb\x94\x11yc>,Fu\xafU\xf7\xbai\x1c\xf1\x1a\x82\xc4Z:\f^\xa7\xbd\xab\xaa\xd8{\xb0\x1d\xfdP?\xf3\xd9cY\xa1ոOB\xea\x8ak\x82\xfe\x84\xa23Xt\x845\x9eP\xad\xa3T\xb8\x1dEr\xe8ׁn\xa0*\b~)pD\xfc\x11\x86\xc0\x18\v\xcf\xe2\x1fM\xce0\xe6\x1c\x98\x1c;bMA\x93폨p\a\xb5[인\x01\xbaւ\x1a\x8c\xef\t4\x89\xa3\x03]\x88Lv\xdcky\x96\x8a4a\x00\x14.\x94YB\\\x14\x83\xdbUE/\x145\x00\x1bl\x12bK2#M%\x03\x1aP\xa4\x8aJ\xb4\xb5\x11\x11\xbf\xca\x14v\x02W\x01\xfcθ\xf4\x03\xd3n\xecp\xb1\x9b\xa5\xd0\xf2k\xa9\xf2\x17\xe5\xf0'`\xeb@\x1d\xbb\x04\x9cɴ\xbc`iʌP\xf1W\x03\xea\x9a\x14\xa58Ġ\x0e\x01l\x99%\xcc\x11t\xaf\t%ʌ\x15\x02\xf7SQ\x02~V\x12\xfa\xa6\x95\xd4pj*\xb1\xba\xec\x04$\xf4w\x86\x8d^#G\x9c\xa5\xa01i\xc0\xe0\x106\xa7\x0f\xe3}\x17\x93\xf5\"vw\xe5\"\x96\xcc\x01b\xba\xe6\x13\xeb\xfezrMZښ\x93\u007f]\xd7].\x8c\xcb\xde\xeb?+;\x83z\xbb\x03\x8d\x83\u007f\xa7\xe8#\x98\x91#J\xfd\xcf\xcf\xf8z\xc6\xf3\xfe\u007f\xbf\xe4\xe7\x9e~:\xa2\xdc\xfevv\xf6\xdbۻ\xf7\xa7\xfe\xff\xbb\xfe$\xe2\xed\xae\xff\xac3\xdd1\x9b~e\xf6\x1d\xff\xbb\x8e\xe4ݹ\xd3+t\xa1\x84\uf822J\xb1G;\xae\aI\t\x04\xc5\x01\x8f\xd8mW\x8ay\xabؤ\xebq\x97k\xeb*\xf9dƜ^VX_<:7''wtq}aY\xba\x99a#\xb7\x8a\x9d\xdc\xf5TH\xab\f\xe33:\x84\x02\xcd#\x1bC\xb5y\x95V\x8b\xc5Z\x99W\x1bj\x1c\xd9\x1c\xb8U\x1c֕\x89?\x94\xa0;A\xa1Y|\x16\xfa.d\xb77\xe6R]\xe3\x16\x02\xa8\xd4&\xbcODh<*z@\xe7\x8f\x01\x8e\ti݉Aw\x11\xf1\x05N\x0e\xe8A\x02\xd2%L\n@\xa8v\x91I0\xe3c\xd0\xe2\xc8\x16*\xf0T\x91\x83\x03\xf8\xdd.3\x8d\x96\xc5\xd29R\x12[\xe4VJЩ\xb2\x88\x13\x0f\xaf,\xad\xea՜\x9eb\x9b\xbaM1W\xd4R\x1f\r\x0f\x9f\x03߫\xdb>EƉ\xb6N,\xf6\f`õ\xbe\xf0\xf8\x82>U\x1e8\xccz\x02\x9f\xdb\xf2\x1d\xf0\x92\xbb\x02/{\x93\xb32\xc03\x19Y\xbf\xe0h\xdb확b\xba\xca\x13^\xe1\x1dāpQ\xba\xbf\x90\xbf{\xea/\xdeRX\x97\x94_߲d8Ȭ\x99\xde6e;\x98\xb8\xceзk\xaf\xa7\t}\xe3B\n\x03r\xe1fq\b\xb6 \xc9 \x0e\xc2\bHˠf\xf1ŬD\x1c\t\xe7ζ\xf0\xe3%\x12\xcf\b,\x99\x1bĬ\xfe\x84m\n?sx\\\x95\xadj\\\xd5\x01W\xc8W\x8bUqC\xf4S\xe9~\xbe\x8e\xab\x12\xe2m\xcflY\x94\xa63M\xd9>\xf3\x1eq\x9d\xf2\xf6\xa1\xd1\xfa\xdes3`ػo\xd6\xe0\xa2\xedSL\xba4.\\剶\xd0jl\x1e\x1a\xfd\xf1\x06u\xd6[\xeb\xcbI\x87\x9477\x1d쵥\x80\x9f\x88\xdd\xe8\x8f\xf1\x04\xf4\x0e\xcf\xeb\xfd\xcb\xd9\xedS4\xa2m3\xa123\a\xce\x19\xd2\x1cȧ\xa9ꑳ\xf6\xa5\x83\xa7\xa7lg\xcb\xe3\xfb@\x82\x0e\xb0\v͢\x03\xa9\xc9؏1\x87\xd7W\x82\x98%`\x17T\xc6;\x91\xa6\xb9\x98\xba\x12ω\x18\xcc\u007f\n\xf0ExC\x86t\x19\x9e#\x18\xbd8*\b\x18g\x1c\x96\x9a3\xc40G\x02x{\x92!w\x05\x1b\u007f>滢\x1cx\x89i$\x16\xf4pl\xe1ɣ\x15\xa6`\r\a;f\xed\xdb7kA\xee\xc0\xb1\xfbfy\xf2\xe8\xc5h\x00\xef\x9b3\x12>>\xee\xee\x83G\xad\x19U\x1e\xb3\x1e4\x14V\x80\x10\x0e\xc1O-\xda\x1c\xb5\xba\xa2H\xaf\x05M\u058co\xa3K\x93\x8c\xbe\xda<'\xad\x8c\x92\x15)m\xba\xea\x99?\xa7\xa1\x06\f\xcb\xf1\xa3%\xe8{[2p\xbb\x97\x16\xf7\xf5\xb8\xe0;\xe1\xed\x85>κ\xa4\xafK\xba\xef\xc2>\x8de}\xfd\xac}\x9a\xbf\xee\x9b\x15\x9dڸ\xd50\xc2D\xbf\xd5\u007f\xa02`\xf7TI\x0fH\xeb\x8bnP(\xb0A!6\x1b\x9cƢ\x90\xe4\x882\xc0h\xae\x89k}\x99U\xca3\xa1\xdaY\xb5\xb3ެș\x1e\xa1t#d}s\xe9\xfb|\xb5\xab\xed\x85\xf0\x92'\xd8\xcfs\xfe|\xbf\\\xf1P_\xf6\x00\xcd\xf6ξGփ\x19\x04\x1f\x0f\xf5$\xd0\xe9į\x1c8;\x99\x15\xfc\x11\xdcB\x18h\x8aQ\xd7\",\x17Ƙ\xc5\xe0\x86\x06{\f5\xc9k'Z\x15\xb1U\x01\x1eָߚ8\x8c\xce\x1c\x13~\xad)\x9f\x97A\xf7^\xdaR\x0f\xc3\xf5-\xf0\x8b\xe8\xa7\xf5-\x8f.\x03\x0ffG\x1b\xa6\xee\x16W\xb6ԋZ\xc7G\u007f\xeb\x0eE*\xcd.F\xad\x91zӘP\xa4\x15\x85\xc5\x03\xf2\xe8\xf0\xd8\xcc\x12.$-J\x83}\xab&\xa0\xb1\\\xa8V\x80\xf2\xa4T\xacTnv\x89\xa8\x92\xc2\xc8\xdf\xee?\x03\x0fa\x8f/'\xefn\xa9\xb7-{4\xbcyʐ\x19\xb6\xfa\x96\xeb\xad`ʡ5\x8c\xa2\xd8e\xb69<\xfa4\x97\xcde\xceU斕d\xaaT\xad\xa9\xce\tU6\xb3\x8b?\xac\xf0\xa4\xbcA\x04X\x02&\x1e\xe6튨Řf\xa15?\x1aM\xe4\xe0\x8fA\xbc\xa5\x80\x18\xd4\x1b6\xa8eb\x90$\xd8d\xc9\xc1`\xedt\a\x13\a\x93\xd2%\x04Q\x83\xe9p3\x15\x05\x80`\xa8\xc7s\xbeb3\b\xc4\xc1N\x18\x87\x0e\a\xc1\xbb\x83n\xd3MSp\x8b\xf9U\xe35\xebG\r[\xa7\x1f6C\xbfn\xd8\xe8\x8d\xcaq\xcb\xf9\x95Ҁ\xb1 \xbd0y\xe6\xbe\xd2\"\xc8U\x8f(t\x95K\x1e\\\xb3SR\xee*\b1\x1b\xccS$AW~\x15\xb3\x98g\xc5S\xc5\xc5v\xfa\xb9\xect\xd0QR[\x8c\x86\xea\xd9\xd0\x00\x86\r\xe5\xbb\xcb%\x8b\xcd\xfb\x98\x8a\x1b\xd4\xc4Z\xb0\xb3ԛg\x04\x9f\xa4X\xc7o\x91\x8e\x983c(|\x10\x9c\x18:c\xd1(\xe9\x9d\xe3\x93\x1c\x90\xe2s\xd4V\x99l\xcf\xcc`\x8b\vn\xf0\x8a\xc2\x05\xae\xe8Hz\x8c\xab\xa0*_\xa5\x88~\x02\xeeuz\xabP5\xa0\xf8\xacX\"\xd6ݫ\x17\xbf~P\xab\x14\xf4\xa0]\xe1\xe0\x88\xc9#jDy\xf0\x02\xfc\xf1\x8d%K\xde\x00j\x90\v\xd4$\xf4\xd1-v!\x98\xcaF\xbb\x16~3\xf02ܪQ\xaa5`.|\x00\xe7\x83ap\x92\xd2\xee\x9b>nw\x86\x94\xf1/y\x03\xfe\xd8#?X\xdb##\x14J\xacw\x1e\xa25\xc4\xd3\x15(\n\xf8\xf3\xb1\x91\x1f\x9a\xa0\xb8Nx\xa34슩\x02q\x87\x1eV\xe0\x15\xec\xff^\xb2\x9b\x9a\xa6\xc7\xfe\x11=~\u007f\xb3R\x96'Ҫe,\xabҧX\x9d\xba\xba\xc9M\x03\x9d}\xd5j\x99J-\xf6)T\x8c:\xd7א\xb7\xe7w\xaf3r\x94T\x9a'\xd6\xfc\x8b\xa4\xbb\xdfx\xdd}scF\x1f\xbcy\xf3\b\xe47k\xb5\r\n\x96V0\xac\\\xa5\x94\xf3S\a\xd5M\xb1(\x952@\xcb\a\xebu\xac:-Y\u007fzǮS8\x95\x92\xf9W\xa9\xd8\xc2[4;0\xdc\xe2\x1b\xe2q\x14\xba\xd1Ʒr6\xa2SBIX\x13\uf580\x80\x84q\aL\x12\xc0\xa3\xfft\x1b&t\xd1&\xfa\xc8#M\x03\xa0\r\xb4\x9d\x86\x9f\xd1G\xe8#\xd1&t\rڠ\xed4\xb07\xc10݆\x85\x9c\xf8\x06I\x86\xa3\xd3p\xa2X2\xfc\xd8\xe7M Lu\x93\x1b\xe1w\xba\x11\xe9Do2\xf1\x12`\n\xb8%\\\xc0\x1d\x90\x007߳\xeb\xd2g\x81\n^mlm\x82W\x81)s\xd4\x1aX\xc6\xe4\x827a\x19\xfco`B\xb1\xc0\x04\xaff\x8eb\xeanQ\xc9\xe7\xb01J\xe3)\x94\x04?\x18F\x8fT\x817ѣ\xff\x8d\xb2;\x85\xb2C\x0f6\x82\xeb\xb7\xe8\x94XV}EBq\x19\xa8\x9c:\xca\x12\xf3\xb2ٗ\x1a\x86zh\xb8\xbbW\x80\xf8\xae*\x17S/\xf3\x13'\xc2\xc4W\nI\x85\xa9~F,\xe4\x15\xd4앀\x00\xb0\x01\f\xcdUd\xa5\r\xc5A:\xaeɫ\xb3+\x89z:\x96\x06b\x8d\x0e\xb44'\xf0Ŵ\x8f\xa8\xcd؉\xf3szk\xc0\xe5\x0e\x04ܮ\x00\xbb.08\x10\x18\x1cq/8\xb2\x00\xfd\xb1k\x17\xd4\x0fY\xb8\xe0H\xa4\xef\xd1E\x8b\x8f>\xf8\xf5Qv\xdd\xd1ŋ\x8e\xa2\x8b\xc8g\xf0\xbfO\xdd~aժ\v\xb7\x9fb\x1e\x83\xf0\x03x\x1a.\xb9\xb0\u007f쨽\xe7\xe8\xa1\xf0'\xb8\x0e\xbbT\x00\xabY\xb0&7(\x99w\x00^;\xb8\xf1\xdb\xfa\xfc\x06\xd9\b[\xfdՍ\a\xe1\xb5\x03\xf3$\xc1\\0w/\xb8\xef\x8b6p'\x9d\"\xbc>@\xe3\xb7\xfb'\xe0w.X\x00H\x19Zɋ\x8f\x02\xf4\xfb\xfa(\xcc\x04\xab\x81j\xd5\xc5\xf6\x8b\xabX\xd9\xfcyc\x0f\\X\xb2\xe8\xfd{'Dy\x1c\x8d>\x03z-\xcbz\xd7x\xefy\xe9>xm\u007f˔\x92\x95\xc6ۜS\x16\xec\a\xe2\xfb^\xba\a\xc5O]Ђ\xfa\xcc\xf4\x1b\x14{\x80\xd0E\x1d\xd6\x17&`\x8d\xe8`\xd0w)\xe7\x00+\xc0\x1e\xc9ySL\xf9\x1d\xad>c\xca\xe5\x01\xacu\xe4a\x04=$+\x8bh)V,\xb2\x02\xa67\xdc\x02\u007f\x01R\xb0\x1cH\xe1\xbe\x17֯\u007fa=\xc8U\xb0\x8a\xcc<\xf7\xa235@f\xb5\xca\xd3F\xa6\xf59\x03\u007fN\x1b\x89\x82i@6\xe0݅\xee\xbcL\x94D\x9aQ\x10\xb2s\xfa\xaa\x01-\xa5c\x1fr\xba졂\fz\t\x90\xbe\xfc\n\xca\xe9\x97W^\x06\a\u05cf\x1f\xb7~\xfd\xb8\xf1чS\xf22\xb2\xec\xc95\x86\x01$\x17\x85\xd5Z}\x06\xfe݊\x02#q~\x86\x9ad{VF^\x8aުԚY\xa5\xc3l\xf4&'\x9b\xb5Jk\x02~\x18O\xf9\xa9 \xd1V\x8d\xef\xda{\x80\x88W\xd2\xe9\xae|\x12\u009aG&\xac$\x84\x9dd\xa1\x19\x15]\xa2\xa3\xbf8\x9f\xc6\xfc/\xadv\xd9Dj\xa3\xed&\xf1\xf1\xfd\xe37\x8c\x1f\xbf\x01x\xa5\x19\xbdҤ\xaeU떦\xa4\xa4\xf5ʐ\x1a3\xfb\f\xbb\xdb{W\xa1\xd1(1\x96\x1bO-\x1c\x84\x8e\x12\xa3\xf1T\xf1\xf6\xe1}2\xfb\xbf\x06\xff\xfe\xdak@N\xafH\x84:e \xcei|\xf4\x17}\x12\x97,N\xca\xcc\xd0j\x93\xb9$}^\xaf\\\x9f\xb2\xf8\xae\x82X\x06\x8b\xea\x84,_+V\xfar{\x01-\x90\xbf\x86s\x03\xdfv\xc77\x15d\x10/\xa0zk\x05\xbfux\x91C4\xa1\x119\x889/\xef\xe4\xc8%\xa0\x93\x15\x15\xa5V\x8e\xd9\xf2\x15<\xfd\xe4S\xf0\xf4\xd7[ƅ\xe8\xd3\xf9\x0e\xb0\xc7ٷ\x10\xad\xfd_\x85\xaf:<\x85}3\xc0^;\x17\x1e[\x19\xbd\xfe\x14l\xfdz\xf3\xe6\xafA\xe8)\x9a\x0f\x8d\xeb\xb8d\xc7\x00\x8b\x85}\xed\xf0\x1d\xe0\xb7\xf7-\xf4\xa6\xc3U\xf6\x98\x8e\xfa\xbd\x88\x06\xcc\xc0}\x8e\x03\xd8\xd4\xc6\xe5sQ\x18\x10\xba\xd8\xe5\xb3\x1b\x94\xb4\xc9H\x99\xb0\x92:\x8dz\x9b\x8f3\b\n\\D\xbd\xce_\xec+B\xab\x0e\x14\xc53F\xad\txh\x94\x00\u007f&\x8a\xe7>\x84\x97\x93\xe1ϕ\xc0\xd7\x00\x8f\x8d4\x8c]\x9c\v\xe8\xfe\xee\xa1\xc5j3\xb8=/\xed#\xa3\xee\xc3T\xd7Q\x1a\xf4\xeec\xb0ϱͫH\xaa\x9e\bB\x17w\xeb\x82\v\xed\x17\x15_\xf1\xe0Ee\xff^f\xf0\x1e\x00[\x83џ\xec3\xe8\xe7\v\xa376\x02\x00N3\xfaw\x8a\x16\x8d\xe4\\\xe2\"\xdaR\xe6\xe8\x15\xd91\xb5\x1c\x1c\xccv\x83/}}\xe9\"\x90O{<\xfd\xfeZ\xfd\xe1\xde@!\xcdg\x88\x00(\xa4\x83E\xb0\x9f=\n5\xccuW\xa1\x12 \xaa\x92\xcbn\xef\b\xd5&\xe0iK\xa9$j!\xe2jw%P<\xbc\xf2T\xb2<\b\xb2N=\x8f\xb1\xb1Q\xfb\xa3Z\x92UA\x1a\xd9nŀ8\x042\x1b\xd1+\xb2^Ra>?\x801\t\xd1E>\xf1\xec\x879\xdd|\xb2.\x10\x11\xf7mV\xec\x0f\x18\r\xe5\n40\x05\r\x8f\xc4\x19\xbb\xdbl\xc0\x84\x97\xe0K\xf0҇k\xd6|\b2A?\x90\xf9\xe1g\xb7\x98`\xe8\xf5f\x17.\x8e}\x18\xddW\xe7\x1e\aF\xb5\\\xa4\x93\xcb[\x0eXQ:\xaeJ1\xb7D\xa2\b\xd5~\xbaNN\xe3*(\x06|C^\xbe&\xb1@\xf4\xda\u007f\xc6G\x81\xd8\xdcj\xa4\xd21:\x0e\xc0;kN\x17\xfa\\\xfe\f\t0\xb2\x01ƅf\x12\xb5Ө\xa5\x11\xc5p\x02?\xed\xce\xc0\xf8$\x88\xb00\xb7\xff\xf8\x87o\x97G\xcdG\xe0߽\xf0\xbb0\x98\x87\x16\x8dC\a\x00は/\xc0\x87\xde\x12\xfd\xae\x8c\x99z\xee\xee\xaf\xe1\xdf\xc1\xdeF\xd94X\xd2~\xf2d\xfbI\x11E\xaf\xd8\xf4\x83[\xf2\xf0.\xf0\xc8\xfd\x8f\xc39љw\xefI\x85\xe5\xf6\xeb`\xcd\x15 \v샧\xe0'\xd1a\x1b\x95\xf4\xfc\xf5\xa0b\xa9\xe8$~\b\x8f+\x1a\xf7/\xeem\xb2\x9b`\xa3\xdc.\x1a-\xac\x99 \x16Q\x04\xf0\x18b\x88\xce'͛\xdc\"+6\x04\xc2X\x1bJ\x16̓n+\xc0fA\x1e\x1c0\xa1\xb2\xb3\x94\xceH+\x01\xcbl\x86_\xc1\xbesʴ\xfd\xee\x9d!\x93-Td\u007f\xbfؿ\x9eO\xae\xf5\x8e\x10\xabdɜiL\x89j\xab\xd6\xe0\xad\xcf\xf2N\xa8q\x96\x97J\xd0\xf2ɘe\xee\xfd\xe8\xed\x03O\x1e\xd9;;%G\xdc'o\xd4\xd4\x14\xd5\xce;\x00\"),=\xe2\x81K\xf0\xea\r\n\xe4][\x0f\x86\x83\xbe g<\xfcF\xc9h\x86.\xa4\xf3~\xdf[\x8c\x18?\xc0\ru\xf0\xa6\x02\xe9\xab}r\x06\x95\xa4\xf0\x12\xaf\x9bf\xcb2h^\xab\x103\x13\x87\xca\xcas\xd2j\xa6\xfbƾ\xfb\x84\xcb5\xac\xffq0f\xfe 8\x1b\xbe\xb1\xe6\x06u\xe5Ĕ\xb8,'\x86\xe3\x1f\x10\xfc5\xb2D\xc5\x15k\u007f\xa2\xf9)@\f?\\\x98\xe0a\xd8\xd9^\xe8\xbb\x01=M\xa0\x14\xfcZ_1\xed&\xbe\x15\xb5\xdc\xc5c\xaf\x1f\x84\xdfM\xaf\x1dͲ\xa3k\xa7\x03\xfd\xc1\u05cf\xdd\x06\xcf>\x9a\xaa|\x12\xfe\xee\xcbM\xb8o<\xc7<\x02\n\xc1\x83\a\xb64/\xbdc遷\xde<\xb0l\xf3\xb2ٛ\xef\xe1,\xf3v\xad\x19߾={{\xfb\xf85\xbb\xe6\xcdY\x0e\xc4{~\x00\xd5'\x9f\xc3=\t,\x8b\\k\x85\x8f\xad\xae\x18^\x02&\u007f\xf9'0\xb9tX\xe5\xed\xf0Dl}\xa2F\xdf\xedG*\x87\xf2Q\x15T?\xe2\xef\xc6.\xacZ\x11ۂK\x8d\n\x89u-\x02Z\xa7\x88\xd1Rhu\x82\x81\xcc0\f\x8e\x91!$\x1b\u007f7@d~X\xc1\x15\xd8ɢ\x16\x11Ŏ\xb5\x1f\xef\x99\xf2x\x11x\xb8\xe4+x\ue457\x1f\xfd\xf2\xa1\xef\xf34\xe3\xde\x02\xfa\x17\xfeV\x01^\x04\xc9V\x15u\xe3\xe9P\xf3\x88\x82\xdai\xfdf\r\x9f\xb3\xeb\xb6w\xfbz\xaf\xbf9i\xe4\xa2{V<\xef\x99\f\xaeї\xb8Kw\xef\xf8#=\xaa\xa4`\xd7\x1b\xe3\x87\xdf\xff\xf7\x8d\xc3\x16\x03~ёޏ\x82\xe6_\x86\xc0\xefф3\x11,1\a&W->\xfe\x1cxj\xd8\xe4~\xf9\x8f\xce\xdfܱj\xe4\xf8a\x03>\xddt\x96\x1ex\xd7k\xaf\xc5\xe5la^\xf03\x82q\x01n\xb9\xabi\xb8i\xbfЗ\xb81M\xe9\x14\xd7Ɏ\xa5H\xd8͌\xda\x00و\x88\x90\x8d\b\xd0\x14\xb5\xe1\rKQ\xa8j\x02\xb01$a\x04\xefg2g#\x82\xfeK|\xbf!\x1c\xd3y\x11\xcaeD\xf3\xe2\x9fQ\xb9Lx\xe7X\xe7\xc5{i\x82\x124\xfa\x1f{{V\xa7\xb9\xa3\x9f\xe1\xb0N\x9f\x9bl\xb5\t\xae\xafѨr\xba\xee|\xa3_I\x86G\xc9$iu,\xed\xb5\x96N\x84?\x16TW\xb3߂bt*x\xfa\x82\x1a\xe6\xd0\xfa\xecA\x81\x95u\xb6\xec\xf2t\x87A\xaaՏ\xe8\x9d7\xa8\xd4\xebЀ\v\xd5\\84\xa2d\xe9\xc6ه&\x8e\xd6I~\x18\xfbXsu\x01\x97\x84\x1fl\xff\xb6\xa0\xfa\x030eZ\xde\xc0~\x85rsUJ\xf5kG\x8f\x9e\x19\xec\xca\n)\xe42S~\xa1m\xea\x93\xc2\xfaVy\x83\xe2n#\xf2\x92~\xd4c\xd4\x1bhV\xe5\x05\x88\x10A\x15\x1a+\x90c%\xee\x98Y\x14Y\xc4\xe1 Z!\x18\xf9\x9b\xadW\x021\xd3\x15\x93\x91\xd3\x13\x88\xe2t\x92\x89\xcfA\xf21y51\x8b+A\x95\x1dE\xa6\x818\xec\xb1\xe0\x8bI\x13Co\x13.\xd1\x1a\x12\xb7V\xec3\xea\xb1\xe5[\f'\x06\x97\x811\xea;\x8b\x8aS\x13\xcdv2\x10Q\x8d\x16\xec:p\xf4ؽ{\xe6/\bf\xcb\xd9b/\a\xb4\x96\xa2\xe9\x93\xc3\x1bvܽ1\xda\xe8l\b\xa4\xf4^:\xa7\xa1\xb0\xa8f\xfc\x90\xf4\xe8\xe1\x91\xf9\xb9\xc6\xe4\xc9y%\x0f\xd0\xfa\xfc\x89\x9d6?a2Gy\x89\x86\xd6\xec\x04\x9b\xd08\xaar\x97mng\xc8\x19ô\xf4\xc50.\xb9\x1eׂ~\xe9\xafX\xabnj\xb5\x88\x8b\xee\x98cpD\b1\xb1\x14N7\x12\x1d0%\x84\xd9p{\x98\xa1\x12\x90\f\x12\x82\x1cUWܥ\xbf҄\xc9oS\xec(آ\v\x1a\x85\t\xe1v-6=\xa4C=s\"\xc1n\xed\xa3\"^\x0e\xbcD\x83͐8'\x14\x19\xb1\xbeݿ\xc6\x02\xfd\x17\r\x8aڊE\x93BTP\x1bAE\x88\xa0U!\x96DwU\x9dI\xf4O\x15\xbee\xab\xa1\x18p$\x9eF\x1b\xfd\x80\xa5Zo\xaa\xb3\x10\x1e|놪\xeb\xde'܈s!}\xc2\xd9\x05q\xe6\"T\xb9\xd3\xf7P\xcc\x0e\xddd\xd4\xff\x9f\xb5\xc3(le\xfe\xca+\x82\x8d\xf9\xab\xaf\nV\xe7\xf1\xebW^\x91Dl\xffY\xd3\xdcs\xeb\xec:\xafa\xdb\xff\xae\xbd\xf4h\x1d\x95I\x95`\xacX\x89\x00\x9a\x14k\xa5\x98\xb5\xfe\xffU\x03q&HI\xcdR\xd8&\x14\xfd\n\x10\xea\xd2\xd1\xf4\x9f5\v\xdd\x1bR\x12\t\xb0\t\r\x82r#\xd9F\xcb\xfe\x83\xc6\x00\x9d\xf0-\xb8\x8f\xaeM\x80\xf5\x14\xfe\x80\a>\b/?\xa6}\xbcD\xca\x00\xa5Le\xe4\xecJ\xa7\xb9\xa0\xa0\x8f{L\xf4\xee'\x80\xfb\xb1\xc7:\xedy\x13\xca\xed!\x88\xae=l\x83\xe2g\xbcw\x82\xc6K\x1a\xc6sC\xfc8\xe6\xcb3\xfcj\x17\xd0wV\b˩}.\xbf\v\xbb\x94\xe0\x02\xc4'\x15v\nc\x05\xb7\xac\xd9U\xd8\f\x0f\xbd\u007f\xf7\xbaQ)I\x9e{W\xe6\x94\xf6-\u007f\x0fLy\xff}0\x14W\xb8_훰\xbd\xb0\x92S%\xb1\f\a\xa4\xb4\x9c\xe6\v\fYIV١g\xbbD\x1d\xf4\xb37\xd7;\xbc\xf5\xbb;Z\xde\x1dX\xd44vh\xc5\x1c\x97H\xbc\xf5;\xa0\xfd\x0en}\x025\x86\xf8\xc9>J1\xa23\xac\x9aU!\xb6P\xec3\x95x\x06d\x8e\x06\xa2}\xeb\xbe?1mډ\xef\xc9w\x94\xb0\x14\xf7\x0f\xd4\x03E\x94\x94R`*\xadA\u007f \x19\x9036\xe3\x85\xe8?M~h\xc0\x8d\x06\xee\xe8Ix\x89Y\x16=\t2\xd9\xc38L\x0f\x81\x97q,\x91\x1b6\xdch\x15=΅\x88\x1d\xba\bP\x8et\xc6\xc5\xd0\xd8{k0f\xf5\xaa\x15\xd67\x01?\x8a\xd4rF\xd1\xe3R\xf8\x1a\xfc\xaf\xaf\ue69c\xdb8`\x84v\ue824G<\xf7\x8d\x98\xb8ؔk\fTzgL\x13+V\x94\x86\x96\x83a\x1dL\xfbwp\x12\x1c\n\xf8#\xa0\n\x88\xea&\x1b\xeeɼS,Y\xbb\x15~>\xf2\xfao~3b\xab\x19\xdc!\x13w\xaecE\x02.\x83\x94 k\xdb\x01\xa3\xb3\xa3\x0e,\xa2\xda)\xb6\xfc\x93O\xa2\x9b>\xf9\x04\x94\xa3\x89\x81\x02\xc7\xe8e \v\xfe1z\a<\x1f\xef\xd7\xf1g\xb5T%5\"\xf6\x98\x9f\x9f<\xa9\xacaIŽRZ\xa2P3C\x9dy(\x97Q\xc1\x810SrO\xf9\x12\xf8\ryI#l\x92YeRivff\xb6T*M\x93\xe5\x14I$E\xd7\xf0\xcbF\xad\"}\xba\xef\rZ\xf42j\x97\x02,}\b2x\x1b\nk:ح\f\xea\xd4\x1a\x91\x1c\xb1~\x18\x94(\xa0\x04\xbc\xdd\xefa\xf3\xd1\n\xaa/P\x8f\xd8\xf9\x1a\x00{\xbe\x01\xf3\xe67w\x1c\x043\x1f\xf9\xc3\x1f߮\x19\a\xbf\x87\x0fl\u007f\xf5g\x9a\xf9\xf2\x0f\x05\xbd\xd5\xf4J\xb1-8\xa4\xa1\xdah\xdc|\xfd\xcd\x03\xf4W\xab\xbfyw\xef\xc8?\xbc\xf9\xf2\x8dW\xe6\x1fm\xb0\x99\xfbx\xe1\xe6\xc0@\xda_\x03\x9a~\xf7\x13\x18>\xb9\xf7\xfa\t\x83V\x0f*1\xab\x00\xe0\x86\xac\xbb'\xde_\x89n\xbd\x80F\x9fBQ\xa8\xa7\xc5X\n\xdc!\xb1\x11I'\xb3\xe4\x95P\x13\xaa\xae!\x06\a\x1bq`3\x15\x11\xe2Q\xfe\x81\xe2ltS\x14\xab\x98\x83tb\u0082\xb8\xa0\xb6\xb6\xaa\t\x9d\xba\x9d/\x13\xbb\x95\x02<\xbf;ɖ\x1c\xee\b\x82?\xc9\x00\xf1&%\b\xac\x11yD,\x1eeOp8jb\x1c\xd8>\xa5\xc8\n\x94@T\xf0\xd1\xc0\x9f\xb7ᄊc\xc4η歿Z\xf7\xc7y\xf0\xfew~\x03?\xba\xb0z\xf5\x05\xe0\xfa\xcdE\xb0\x00\x86\xe8g\x17\xc3Z\xf8\xc3sq\t\xefs\x80\x05\xc7n\xbf\xdfݴŖ'\x97\xe6\xfd2\u007f\xf9\x9d;\xae\xed\x9a\xf7\xd6\xce\x11\xb7\u0379\xfd\xd1\xd6\xd5\x17\xe0G\x88z\xa0,>\xa4\xfb\xc1#Q\xf8Q\x17\xad\x84?_\x85\x8b\x8f\x00bN\x82\xdaɆ\xea\xd1\x16\xc3Ӎ\xe1\x11\x04\xec\xc0\xad\x01i\x88\xce\xd1v\xc0\xed\x8e\x1e\x18njj\u007f\xf6\x05\xf6~\xfd\xee\xe8w`\x1c\x94G\x1e\x05S\x99^`\xdd=\x91O\x173c\xa2\xc9M\x13#\x0f\x81!\xf4\x9aȧt\xafxۄ\xb9\x1f\xc9~\xee\xed\xa8\xa3\x10\x8f\xe4\x9d.k:\xc3\x1c\xb6D!\x9a,茮\x11\xbf\x1a?\xfb:\xcfA\xda\xe8\xd5t\xfa$6\bp9\xe8\x98*\xec> bi(\xf2[\xe9nϠ\xb3A#\x9c鰺I\x8d\xfeh*~\x8e\x86[\x8e\xb4Dqt珓\xf3j`\xb3\xe7\xdamy.\xc3 \xb5\xa67\xaf\ue5e2\xad\xd1e\x16\x015/\xe7\x12\xd3\xd2\xea6u\xd7_T\rBXa\r\xb6\xd2?\xaa\xd5-t\v:\x90\x9f\x88\xc7\x06\xbf\x9bU\x0e\x93\xcdfr\xa84R\x95J\xfd\x81J\xa1\x92o\x04\x80\xe1E-\xb1\x84\xd1\x1d-j\xc1\xc7#髳\x04\x04,\x81\xdd*\av\xa3\xc9\xca\x11\xbe>\x0e\xf2&\xac$Q?㰗.;Q\xf8\x11\xbc\xbe\xa6 ]'\xa5\x15\xa3\u05ec\x19=f͚S\xaa'\x97\x0e\f\r\xce\xee3rx\x83W\xa9˯\xf4f8\xf2{\xb9\x95\xe9\xf9)V\x1aLo0\xe7床\xf2\xd2\x15|`\xcc\xc2;&\fޱ~Riqì\x99^OMN\xaaT\xaau\xf9G\xf9\xd5:\x00\x82\x83\x9dI.\u007fA\xaf\xd4\xe4R\u007f(\xd0\xcf_\xe3M\xb4\xc3\x13\xec\xd7o\xda=p\xf6\xb8Nt\xc4M\xb7j\x957\xc8\xda\x13\xa0#\xe8~\x15\xee\xe9s\xbb\x89&#\xb9K(\x14\v\x83\x1b=q0:]\xea\xf5p\xaaN\xc78D\xe3G^\x1f>\x92\xc9H\x06\x14Y4\xe1\x03\x95\x9c\x01\u05fb\x8a]\x88F\xa3#\x86\xe3\n÷,F\x83\xc1h\x01\xa5L\xff\xc8u\x86O\xb2'zܴ\xff\xe6\x06%\xf8\x9e\xc0\x14*\x1e\xbe\xff\xf3\xcfcvv\xf8d \bE\xbd\xa8\x1alg\a\xf0\x14\x95\x03\xe2:\xbf1\x0f\x18h\xeer3\x1e\xc4\x11\x115kg\xbc\xe4Fa\x94t\x86u~\xac\xe3\u0088\xf0\xa4\xe7\a\x8c\x83\xe8m\xc6>\x03џ\xc5z\xb19q\x94\u007fL\x9fI)U\x8b\xc4\x03<\x1d\x94g\x80x\x91\n_\x83if\am\xa3\xb3\x8a\xf1љ\f\x8e`\xc7\x17\xc5.\x10\x8e\x9d\x9bl\xb4\xa38\v\xdds\x98\xb9dg\xc7\xea\xf1\x1b\xa6鶍yX\xd0W\u007fx\xcc6ݴ\r\xe3e}\xf3\x1eư_(\"\xaf/\x83[0:\xcbӻ\xb7\x87އ\x82\x916:\xcb\f\x8e\x98\x1dl\x96\x196%\xa7\x87P\x18\xc3,4\x91\xe6\xe9\n\x1bP8\x8bu\xe0\x8b,:\x9d\xfd\bN\x05/6\xceǷ\xe77\xc2\xfe\xe0\xbe\xdc\x12\x1c.A\xfdߎ\xfa\xe5gd\r6\x04{\xc8r0x\xf3\xcb\xce؋LF\"\\b\x886(\xea\x15\x8e\xce\x10\xee%D\x8e\x94\x10\"`\xdbF\x9e\xf1v\x86p\x0e\xccg!\x18b`\t\x9f\x04_\f\x81\x80J*eK83|q(\x9fԦ\x96J\x98\xc1\x10\x85>W\x91\xd0\xdb\xf8\x84R\x82\xfe!\x1c&)A\xff\xa1|r\x9b*\x962\x16\xc2\xf9H\xb08\xea\x06\x05\xae\xb5%ݠ\xe4Je[\x12|\x01MojP\x12?\xa3C[\x12\x10\xee\x81\x018\x0e\x9e\x89\x9f\xe5ra\xfd9\x1b\xcd3{c\xf6\x9a\x1abqo\xe25&\x9e\x910\x1a\x06\xeb\n\x024\xfe\x89\xb5%\x1a\xa4\x04e\x93\xa9ٳw\xef\x9e\xf5\xe0<<\a\x8a`\xc1\x8d\xf1 \x04[\xc7S7\xe8߇\xe6\x1f?\xfd\xcb\xe9\xe3\xf3C\xf1\x00\xf8Ӟ\xbd̶\xbd{\"\x93\xc0yP\x84\xfe\x9f\x8f\x1e\xa2n\x8c\x87\xa7\xe0)\xf4\x00hAc\xf5\xad\xb7W\x15\x16\xaez\x1b\x94\xa2\xf1Z*\x84\x85\xb1\x99y\x83b.u\x96\x8br\x06ܚ\x80[\x87%\x05Xq\x12\x9d\xe8Ꮳ\u007f605\xfa\x15\xfc\xe3\x1c\xb0\x18n\x9b\x03\xb2\xe8\x94\x05'N\x80y'ND\xff\x1b\xde\x17\xfd\x92~\v^\x9a\x03\x96\x80%s\xe0%\xfa\xad藂]ML\xd7\v\xcbc\xb2\xa8B\x8a\xea\x94\x1cuJ\x90D\x04\xcdO\x87\xa5_D~\x88\xa5_\x988\xb3\xb1;\x1cU\xd7\\W\xd7\x1c\xad#'\xb6\xees\x01\xa9o\xad\xa2\xa3MgC=P\xc1\xda\xc89\xda\x14\xbb\xf3\x1eNWǐ\xe4u0-\x0e\xecת\u05f6\xa3Nn\xd6k9tz9\x16M\xe4F̍\xfe\xa2(\xf7\"\x91\x92\xa8QIS\xb1?\x18\xec\xf6E\x97\x05@!&O\xfe\"\x80\xdd>H@!\x0e\x9b\x9a\x99\xa4\xc8}Z%?\r\x9c\xa3\xf7\xc0\xe7\xa2?\xbe\t\x8b\xde\x14\x17q\x05\xd3x\xa56r\x1f\x93D.\xc5L0\"\xa1\x97*r\f\xa08\"\x11\x8d\x8d\xdeGO5E7\xc2\xf7\f9\x8a\xe8\x9d\xcc?Е)A\xdeֆ\xbe\x04\xdeu)\xc4~Q}\x0e@l\xc8\xdd\x18\xf0\x8a Lrz\xbc\\\x17\xd4'\xd3\x05\xe5I\xc1\xed\a\x9e,\xd0\\z\xe4\bӷy\xeb\xe6\xebM\xa0\xf1ڞ\xb50\x93`\x1b\x84\xa7\x8c\x86\xd1\x17V\x9c+\xd3\xd5\xe9\xcaέx\x01FGO\xf9\x11\x1c\x02_\x83C?ҭm\xd1\v\xe32h0\xb1\xb6\xa9~\x12\x00\xb7\xb7\xb5\xbe|l\xfa\x9aC\x9f\xcel\x04\xa0q槇\xd6L?\xf6\xf2\xfb\xc2d\x10\xc7n\x88\xcbO\x84u\x96\x8e\xcaD\xfc\x80`\xf3mp\xf8t\xc4\x13\x99\xbd\xebGD\xfd\xc0\xcd\x13\xe3\x93\xd8\x14\x87Vf\x1c\xfa롷G3\x91H\x84\xf9\t>\x06F`\xb5\xdch\x13㖋mp\xd3\a\x1f\xc0M6\xb1\\.f/\x89ђ\xedE8\x8b\xde\xfa\t:|12ؑ\x19\x1c92\xc8^\n\x8e\xa4\x17\x84\xc3ԍ5k F?\xa0\x84p\xe4A\xfc\xc4\r\xea\xb1\xc7И\x14wd\xa2<\xd8\t\xfb\xf6\xed\xd3w=6\xb2\x9b\xceJ\x1a\x9e\x95@l\xc3^\x94\x06\xb0\xb6\x8e\xc9\xca\xe2}S\x1cC\x03\x0fG\xbbmr\x14\x8f\xc1\xd9\f\xc0\x01\x94\xb4\x87f\xc2\xcd%[ϧg\x8c\x96\xba\xdd\xc1i\x8d\xbe\\\t\x9b[\xbfx\xd1\xee\xda\xfd\x00\x14\xf9,\x83ރ\ru\v\x86\xf5*\xf3Ժ\xd10:\r|W\xefl\xb0rJ\x85\x02\xf4i\x86\xdf\x18\xb76\x9f\xd8\xfb\x12}\xfew\r\xef,\xd6i2\xd5ִ\x9ci\x1b&\f\u05c8\x87\xdfy|\xdd\x12[\x95\x88I\xcf0\x94\xa1\x91\xbf\xba\xf7\xbaC\xf7^y\x13\x14m\x19\xd0r\U00091bce\xffi\xd9\xf0\xe1&\xf8\"H\xa5\x93\x94\xb4m$\x95\xa0ۖOv\xb0\x88\x87y\xca\x03x\xd6\xe6t)\xc9^\xb2\x92F\xf4\x95( \n\x1a\xf0buroQ \x88\xa1\xefi7\xe6\xf1c#\x92\xed\xb1\x16\xe9\x89R\xd4s\xad\xc2M\x95\xe7\x99a\a\xfc\x16v\x98\xf3\xe4)\xe6\xd7\xe7\xd2)f\x8bDjL\x96(s\xd5b\xbf&[\xe3\x17\xabs\x95\x92d\xa3Tb1\xa7\xd0s_7\xc3牀\x93\xde:\xffU\xf4\xe4\x17\xb0\xe3\xd5\xf9\xf3_\x05\x1c\xb0\x02\xeeUX\v\xcf\xc0/ϭXq\x0eX@\t\xb0\x90Й[\xad\u007fF\x14\xa7\x88\x82AQJq\x9e\xc8#?\xfc\xe9\xe8\xfe\x86\xe4\x02)\x9b\xa5ߺ|\xf9V}\x16+-H6\xf4\x1f\xfd\xe9a\xb9Gt\x94\x88S\x17\xf4x\x13\x0e\xcdYq\x0e~\xd9ㅰ\xe0Vjh\xa8\xd7W#\xfa\xfdr\xac\x8d\a\xa0\x18#1\x87!\xab\x1f\x1d\x81\xb5w\xc748Q{\xa2n/\xf2\x00\xa2\x93\x8b\x11\x1a\xd1\xe4\xe6\xa4\x05\xa5i=(\n\x90U\x05\xb6-\xc4z\x82FnU5\x97˖g\x89\x98\xdcR\xc6qw`\xcf\x1dc\xcf\xee\xdc4\xfd\x8e\xe5\x0f\x02\xf1\xdeg\xed\x8de\x9c\xed\xaf\xe6j+\xf86C\xae\xc99\v\x16e\xedin\xde33\xf2Ѭ1[w\xbd\xba\xa7c\xd7⭽\xcfҿ\xf4ˏ^\xce.\x01L\x9f\\\xf0\xb8x\xc1\x9aK\xf7\xdd1m\xd3\xces\xe3\xee\\\x98\x02rG\xfd\xc6\xcaU5\xa6^4\xf1Z\xf8\x95!\xbfOѷz\xf0h3Φ\xfd\xb5\xf2\xad\x8bw\xb5\xefye\xcf\xd6ƹ;\xcfR=}\xfc\x0e&\xbe\xe0z\xf8\xf8\xc5(\x01\xbc\x92\x166\xbbIt\x90\xf9\u007f\xd5}\t|\x1b\xc5\xd9\xf7\xce\xec\xa5\xfbZieݲNˇdK\xb2\xe4ۊ\xed8\x89\x1d'\x8eslj\xe3\xdc\xf7\t9I\x88!\xe4\xe0\x86\x04R \xe4j\x80p\xb6%\xd0p\x15\x1a\xa0%\x94\x16H\xb9\x1bZ\x9a\x04\u07b6\x94\x12(\x94\xb6\x90h\xf3\xcd\xccʎ\xed\x84Ҿ\xef\xf7\xfe~ߗX;;\xb3\xb3\xb3\xb3\xb3\xcf\xcc<\xcf\xcc\xf3<\xff4\xf1kA`\x8b\x886KTV2\x81^\x1d4\xb8\xa1\xb7\x0e\"\x96\xb3?\u007fK/\xcfA\x14\xef\xc7nyܵE!\xaf\xcbJb\x16G\xc2\xe3*/\x9e\x98\xac\b\xbb\x12J\x83Z\xb1X\xc5\xf0\xeb?\xbc\xea\xfd3ҹO\x1f\x9a;\xf7\xa1O\x01CBp\xeb`\xa6\xb8\xbd\xb7D\x138\x1do\xafr[Lf\xa7\x9e\xec\xe35\xf9\xab\x03~\x83\xd6\x16\xf0\x14V;\xcc\xf5\x1a\xae\x83\xb7\xab\x8e>\x06\x1aQq\xfd\x8b\x95\x9e\x18\xc4J\xa3\xf6\b\x9f\xa7\xd9\xc9D>\xacC\\K7\xb6\x91\xed]\xcdA-\x10\xc2\ba\xa8oy\x80@\x13]\r\"\r;\xb0v\x0f\xe9sHH\xa4\x05\xd9'\xa7\a\xf0\xd8\a\xa3\a\x13\x04&\x8f\xb0\x1f\xfb\xf2!\x80zX\xa5\x03\x88X5\xa8\x1c\xfc\xa0g\xeaԞNpCM\xa3N\xba\x95\xd714\xaf^\x0f\x0e4\xda\xf4\xdax\xb9\xcbF\xc3\x17\xd9\xf1~Fe2\xf3\xbc\xe01\xaa\x99\xe8\x9b\xd6)\xad^p?\xcf#fJZRԙ\x97\x17\xe0\xd41\u007f]\x01\xf6\xb5\xb6\x81\xde顕j3\xb7R\xfa%\xad\xa0i5\xf3\x8b\xce!\x99\xce\xce̐\xac?\xee\x17\xad\xe0\x88\x86\x87\xb4B{\xbd\xb4WJ\x1f-\xb4sv\x9b\xb6\xc6a\x84\x93\xc1\xfe{>\xc8\v\bZ\x00i\x8d9O\x0f\x11?\xba\xd1W\x90\xfd\a\xab\xa1\x81\xf6\xbe\x15'+\xd2Ӽ\xcd\x0eQ\xe3\x15\fJ0]z\xa4L\xc1BV\x1dQ=\f>\x06\f\x84J\x05\xf1}FS\x1f*)ƉFZ5\xe2\x9e˨Vj\x0e\xb5\t\xcfp4\x9b\xcc\xd9\x00\x01\xa1\x0f]\x82\xc8\x04!\x19n\rs\x00\xfd\xe6\bDs4\xef\xc7\xee3\x93Q:\x9cpӞ\u007f#\xc5\n\xfe\xf9\x10\xa0'\xcd\xe9N%;\x17g_\x00\x82\xee=\x9d \xfd.\xad2I_Y\x04-,V\x9a\xc0H\x9d\x99\xae>{L\xfaBg6\xeb\x80\xe6ep\a\xd0;k\x8b\x12\xa1J\xbb\x01\x00\xa0\xb3W\x84\x8a\"u.#|\n\xa5\xd7]H\xb7\xf5\xa6\x1f\xc9\xe5\xaf\x18\x98\x0e\xa0\x1b(\uf6f8Pڰ\x12\xbc\x92\xd5\xe0\xd2\xeb\xc6\xe8\x03F\xf8\x95\xce\xfc\x92t\xe5oQ\x1f\xfa\x9b\xce,\xcdV\a\x16\xcdXST\xb2fA\xa7ápuN\xdd\\\x1d[;o\xb2\xdd\xfe\x1f\xa6\xcb\xfb\x9fl\x0f\xfb\x05\xd5BME\x12\xca\xd5hZ\xc0\xc0\xf7ة>\x01g\f\xa36\t%\xd3ؑ\aY\x81$h\xe90g\xdd\xce\x13gyX$\xb4^\xd0T\xab\x03\x02\x1a\xb3\xe4\xa5\x1dD\xefV\x11\x11\xaa\xe8Å\xe0\x05 \x92b\xe0\xe5\x04$R\x86rIh\x96\xe0\xe1\x02;\xe2,\x14J\xa5>`\xed\xca\xf3i9\x15\xab\x00\xc1 P\xb0*N\xeb\xcb\xeb\xb2\x06\xf4J\xa5\x02\xc0\x80}\xa2\u05cc\xe4\x8a\xca\xd1\xf5.\x0fG\x97\x85Be\x15\x8e\xfa\xcbi:㳙\xbd\x13\xf7\xd9CB0\x881\xffZ[-O\xa6L\x82\xb0|9\x8e\xed\xdau\x10G\xa6̘1\x05G\x97\\~\xf9\x92;\xd5]k\x95L\x89C\xa1S\xabY\x8b\xe0bz\xa4\x1e\f\tɪ\xd5:\x85\xa3\x84Q\xae\xedR\x8b\xb5\x1a\x85\xc9\x18\x1b\x9fn\xd4\xf0\x8bNH_\x9cX\xb4>\xdc\x19\x00\xc0\xa4\xd0\xd4҇B\xe5B\x10\xbd)\x86,l}\xabU\xf81ƙ[\tjV\xe2\x84]Ҥ]/\xe3\x84\xce?\x03\xeaϝ8i\t\x9a\xf2~%\xfd\x89\xf8I7モ\xa7\x8f\xd7\xf5\x10l\xa34U\x8f\xe6b\x8c\xa75\x1d\xcd\xc7˨5\x88\xf2\xb7Q7Sߣ\xf6\x11;{\xb2\xa3\x12ȅ0\x17\x0eN\xff\xd6|\x83v4\xbf-\xfe]\xe1\xb7\xdd\x0f\xa0\xec\xb9\xf8\xfb$\x90\xff\xe0\xf7\xfb\xa7e\xbf\u007fq\x8e\xaf\xbd\xc4\xcb2\\N\x02i\xf9%b\xac\x1cd\a\xc4.\x993\x17\x03\xdd]\x17\x9e\x00\xe5@\xea\xba8m@\xe4\x9cn\xbf|7\xfe\x03\xb7\\\x1c9+\a\xf4\x80إ2\xca\u007f9\xdfe\xdc9\x8e\xea\xf3\b?\x92\x1aG-\xa0\xae\xa0n@\xac@\xae\xd5R\xbdH\x99\x80\a\xbd\x16T\xf2lI[\xfa\x8c\xa5R\x04V\rw=b\xedC\xd6\x1b\x89\xbc\xd7\xdb\xf6A9MVꐗ#\xbdbPƝ\xc3\f\xaa\x8c\xbf&\xb2b\xaf\xeef.A\x96\xfb\xff@\x8ec\x015\x05I\xac\x8f\x90\b\xfcؚ\f\xf8=\xae\x90\xfe\xd4>,\x89/\xdceM\x04|\x05ဌ\x99\x80\xf2\xf4b7dI~Ќ\x82\xcdӦ^\x83\x82\xd7@\xe05p\x1d\xe1\xe7\x84|\xbe\xe9n\x8b\xc2`LZ\x9e\x00A\xa5Ŧ\xd6\x14\x1b\xa6\xbe*\xf2\x06C\xd2\xf2\xc9}d\xd1\xe1.y\xe9\xa1\xe4<5\x05P\xdb\xe4\bU=kR,\xe2\x0f\xd55D\xf6\x9d«2\v+g\x8c/\rG\x933\xd22\x8a\n\xaeS\x0e\x18\xe2}r\v\xd1\xf6\xc0.\x1eq\xb8\xe3\xb5\xd7nƬ\x9d(\x1c^\x85\x1e\x84*p\xed\x16\xc2\xea\x9dٍ\xa2\xe8\xe99=\\\xfa<\xa5\xc8\xe6\xf4,\xe6Q?\"\xfc|\xce\xf2\x9dp\xbb)\xec\x81+F\xackr\xe0\x8ax\xf6\xd1\x11\xd3o>.\xab\xc4\xe2\x16\x8d\x13\xcd|4߅\xc2A\x19\xea\x0f\xa3d\n)S:\xe5ƦI|*\x87\x89\x87Έ\xc7\xfc q\xccGs\xb26;^\x05O\xf7~+r.\xf3\x88uD\xcd \xed뻐\xc8%WC\xd1\xca\xe2A\x99QTیu\xc1\xf2ր\xcaW\x1a\xac3\xda\xe0e\xbdgչ+\xd2\x04\xe3H\u007f\xdd\xf0D)\xad\xa5\xa7\xee)0:\x02&\x8b\xc5\x14p\x18\v\xf6L\xe5\fN\xe9\x83\xcft\xfa\x02\xe3~\xb5N\xfc\xf5m\xc6\xdb\xd7yF\xc7yOs\xec\x8a[\n\xea\x19\xb6\xb4`\\k\xb4\xfc\xb2y\x01;\xfdh_\x0e\xbb\xbf\xc4e\x93\xf30\x8a@\xba\u007f.ӿx\x14\xd09\x81\x1f?\vf`\xb9/\xdcZ^\x91\xaf\xf0\x84}\xe5W\xe7BHR\x81\xc9o7z\x8c`\xf6\xd8@\xabQ\xa94\xb6\x06\xc6Άб\x96\xf7\x83\x8c\xb5L\xbb\x06\xa8w\x03\xe3l\x1b_7\xca^=t\x9c\x11=\x1b\xd5SU\xa2\x8a\x9bZ7HGq\x0e\xe9\xab\xdd\xd2g\xb3E\xbfG\xce\x01J\x03}9\x02\xdfR\xf6\x00\x9bc\x81jB<\xecT\xbc\xdfM\xb4\xa3B\xde>=)Ĝ\x12l\n\x12#=\x11\x89v\xb9~\xca\x11\xf5\u007f\xb9\x9f\xd2x\x8f\x04q\xf1\xbdvw\x18o\x87\x0e\x85\xb1\xaa\x1b\xe3\xc5\x1dD\xfa\xedk(\xb8\xe6\xc9k\xe6\xe3.\x84\t\x9e@\x9b\x04\xc2\x05\xbe@ºk!\xa6\xe1}\xa7\xf4!\x97\xc7\x1fHZ;wg_8\x9d}V\xe3\xd3ܯ\xd1p\x19t\xf8\xd8>\xac\xe1\xaa\xce\u05f5>x4G\xee;r\xe4\x0f>\xc4p<8\"\xf7\x93\xf4\x8cd4\\:~F\xe5B\xb2\xac\xb9/\xd2P\x17\xf2Gb\x93fU\xa3ޓ\xbd\x01\x17\x8bJ\xf5i8\x0e\x1d\xb5\x1fۆݹ\xa0\xf3uM\xff5|35\x89\xa0.a\b\x0f\xd9\xcfxn\x8f\ao\xf1\xe7X\x810f\xe51K\x00\x89\xed\xbe\xac\x85\xee\xf7\xe1\xbd\x0e4?\xe2\x1e\x95szRG|\x89\xe7\x14\xc6\x13\x17{G\xa3gj\x11C\x88\xb8B\xb3\xba*\xd9\xdc\xe4\xb4:\x8d\xe0\x0f\xa3\xb4\x16m\xe76H\x97}\x91W\xdcu{ˁ\x9d6\xc0\x88\xba֒B\x8b\xcb-\xf2yC=\xfeJۼ\x89\x1d;&[8\x81\xa5ի\x97\x94\x8e\x064\xab|r\x80q^\xd6\xd1\x18\u007f9\xae\xa6\x01\x9c\x95\x99\xf4pH\x97/U\xea\xae`\x15mP<=\xe4c\xcex\xebO\xa6\xef\xd8\xcbA\xdf\xd8\xe4\xccX^\xcckC\x9d\x93\x17]M\x1d\xbeI\x8b\x17\xeeh\x17'\x8b\x1a\xae\xc6\x04\x94P?\xd0L\x0fq\xa9A\xc4C\x9d`\xcfS6ħR\xc4_\x1d\x92h \x06fA\r\x84\xadtL2\xfajX\xbeBZ\x91\xf6\xfb\xfa`\xd2͘\x80p\xd3\xd0iDl\x85\xb2J\x17A\xd1Lx\x8df\xc8ˮ\x81\xdc\x00\xfe\x89Ѻ\xac\xe1\xf0\x82\xc5\xc6\xc0\xd0\x18\xe3ԘUА1\b\xf0\v\xbd\x82\x13\xdb3\x9eCO\xea9\x95Ka\xed\xda|\xb8{۾\xf0\xc4T\xe8\x1e\x90\x1f\x8dz\xf3\xbd%\xed\xe5E\"˫T*\xf0\xe17C\xafxvi2\x05V\x8fd\xe99\a'\x88\x1ea=\xf3z\x9eˣ\xb7VI\xff\xb8\xb6x\xec\xa8\x18\x00\xacF\xd5\x06\xca\xdb:\xb3\x87x-\xa0\r\xcai\n!p\xbd\xa7\xf3\xd1;\xba\x0em/\xefY\xd0\xe8\x04\xd6p|x(\xbf\xa0~\xda\xea\xeeB%\xa4\xc1W\xa7\x17\x9f~\xe1FA)\xdd1S\xfa~\x80\xae\xac\xd3\xf2?E4\x04\xd0\xfc\xb7\x89=K\xd5R\x1d\x88\x8f\xa10j*^F\xc0R0*9GH\xd8g\v\xf6PR\x02\xe4\xb1\r\xb0Ar\x82\x1d\xe7X㲁\x1c\x16\x90xk\fҽ\x8a\xec\x1e쯎\x13\x81\x80\x17\x81\xf5\x00[\xbf\x93q\x9a\xa7\xe5-E%\x90C!\x17\x17P\v\xe2L\xa94\"\xb2z\xaf\xe3\x83ڲ\x1d\x05\xea\xe1\\̛\xfd\xab\xb4_\x19\xaeL\x85\x00#e\"\x95\x10ք\xc1\xd3\xd9\u007fD\xe2\x1cW\x19T\x81SҁP)ǥ\xfc\x9c\x0e\x1c\xfd\r`\x80Uo~گ\xb39,O\x9f`\x03g\x00\r\xf2\xd4^O\x8b\xe3&\xc8\x01\xaf\x89\xbeW\xcf\xe8K5\xe9\x850\xb2\xa3<\xf3\x81\xaf0\x11\xfcĦ\xf3\xe5\xb7\xe5\x01\x95\xf4\x8d\xc5\x12\xf4\xb7\x9a\xff\xba]o\xf1\x05G\x19\x9f\x9f\xa3p\xe7\x01\r\xac\x88\x84+\xe8\xe9\xa6\xdb\n*\x1f\x8c\xd6H\xb3\xbcEL\x85\xb7\xa2 \x98b\xbd5\x91p\x12d\xd8L\xc4_Rӥ\xaa\x0f\x06J`w\x10D\xb5\x1b\xadc\xf2C\xafl\f\xc2\x10\xe0\x00\v<\xa3lV\xb5s'`a\xc9bpH\xfa\xfb\x88\x96\xf7\xab\x9d\xa9\xba\u0603\xb5\x85\xb7Y\x83\xa0\"\u007f\f⺽\xd2~p\xcc\xdf.\x98\xf2|\xd2T0\xc6?\xca(\xd8CҌ\x9f\xe9Y\xb3\xe1d\xa4\x06T\xcac\xa0\x9b\xa7ؙ\xe8kMC\xf2\x00ba\x822x\x01\xa2G\x0eM\x85x\xad\x95ؚ\xa4\xb06\x87HF\x04\"\x8b\"\xf1\x1d\x12\x97\xffv G\xc3h\xd6\xc3\x10]~l\x9dK\x13\xc0\x02\xc1\x1c\xb4\x06\x04\x18$n\x1a(L\xf1bn$E\x9f-\x18\xb6\x82ѐ\x99po\xa5\x85aT\xbc\x8e3\xc1'\x81f\xa9\xf1r\x8dI\xb5a\xeal\xa0\x02\xaf\xef4\x9b;\xcf\u007f\x0f%\xa9\x05Ն\x8c\xd4\xc4WE\xe8\u007f\x9eQj\xab+i\xa9\"\\\x94\a6\xa8u\xd72\vO\x16\xfb\xa0\x97\xff\x11\x9d,\x03\xc6G\x1f\x97>n\x1c\xde%-u\x9a'\xacw\x168\x0f_i\x06\x1dJ\xfeqX\xf9\xa3\xa9\xee\xb0\xd2l0kD\x85\x95>\xbb\xf2%\xad\xa0\xca\x18\xfeK\x90>\xfd\x93g\xa4\xe7\xa6\xdfg^Қ\x95(a\r\x9d\xe4\U000ecb14\x92\x86\xd3H\xe6\xe5\xe9\x11\u0382\xa2l#\xa3*\xe6~\x0e\xf6\x94\x97\xd3\xc5\x1a\xe9)\xd5\xdc\xcee\xc0\x04,\xcb3\x0fL]\xf8,\xac.p\xae\x9f`v:\xcdW\x1e62|\xaf\x1e\xd9\xf7\x18\x89]\x80\xb8\xfc\x18\xc1\xcbţ\xa9\xac^J\x06\x01+\xc7\xe7\xd4q\xbdXrJ\xa5Ű\x19\xea\x81/\x8ca\x9e\xc2b\xd8\x12\n\xbb\x91`\x85\x17ݰZ\x91<\xfc\xe2\x81T\x06Vb\xec;o\xfbßv\xec\xdc\xfe\xc5\xce\xee\t^\xbe\xa1\xedЇ\xa7@\xc7IoCe\xe4W\xfb\xf6\xe9\\\xf9c7\r/\xd1\xd3\xe9\xf4\x88-\x93\x96dǶ\x9d\x18.\xc0\xc2\x17\x17\xf9}\xf6\xe8\xb2\xea.GK\x9ew\x05\xf8\xc1\xbb\xfb\x0e\x1c\xd8\xf7\xee\xce\u007f\xec\xf0\xd4e\x9c\u007f\xbf\xff\xc1O?}pr\x9b60\xb3\xf5\xa8\xf4\xdal\xc0zo\xbc\xff\x8d\x1fv\x0e\xf5\xed\xff>|\xe7t\xf5y\xe9\xa9ֵ\x9b\x82B\u05ed\xb6Tup\x9c\xbd\xd8m\x18_\xb5\xe0\xb6%\xb5m\x8bz\xfdc\x91\xb9\xc3NE\xa8(\x9aO\xc7\x11\x0f\x1eD}\x8c˹\v\xc08\x19\x04%ٛ\xa2\t\xe0\x15/V\x83\x94\x11\xcf\x16a\x91M\x12\x8d\x03\x02r\x88\xdf8NJ\r\x9a,\x18\xbb3R,\xde\xf5\xa7\xddw_V^\xc2Xk\x86\xdc\xf5\xfa\xeb \xf9\xfaa\xa8\xf2\xc4'VZ,\xaa\xf7CL{\xd5TpU\"2vh{^\xcb\x16\x17scS\xb2*1\xcab\x04#\xfaO\x0e\xe0\xb3QCm\xcaxf\xd5\xc1\x83\xab.{@(*\xb6\xfcFz孷A6/V\xbf\xf6\xd6\xcbf\x88\xf4\xf5\xc0p\xf9\x92\xf6'\xc2wG\xe6\x0e\x9f`\x15\x86\x0e)\b\x1ag\x0fI\xae\t%[\xca\v?\xbfhN\xe8}\xff\xd1Do.\xd9ۇ\xa0̡c\xfb\xc5ܴ\x88m}\xad\xb2J\x0f'cy\xe1\xf5 \xec\x99\n\x12\x85\x1f\x1c\x10\xdd*2u\x0e\xdc\xee=/6\xceu\xf1\xe1X8h\xd6\x14\xa8\x19\x05k\fl\x1d\u007fl\xa4\x91eT\x9a\x02\x95ŏ\xae\xf0\x99\xad\xe2\xb5P\xa17h\x12:\u007f\xa6xX\xa4hxQƯKh\r:\x05\xbc\x16\x80\xc1\xaba\u05c8\xac~RF\xe0\xf4\xa2\xc6%\n6\x03\x9c.\x8c\xf6\x8f\x9ax\xaf\u007f\xb40\x1d\xea\xf3\xcc\x16\x97F\xd4s\xc2u.V\x8c\x8al\xa1\xa0t\xfb\xdd\xe8Oa.`Epv\xf0:\x18\xa0\xf4\xa8\x1dV\xa0v\xc0\xad\x90\x92q\xc0dE&\x82;H\x1cpYs\xf0`P\xd6k\xca\xd93\xc9\xcd$7\x9bL\xeaX\x83\x02ʎ&\x12\xf1\x1cx9ݾ\xf5\xedJ\x87R\xa735\x98\\\xa9\xfa\xd6zMp\xf3hg\xd2\xf9>\xaf0[\xcd\xe3Ġ\xcd[\x97\xaa\x9b\x92JN\xaeM\xd5y\xec\xc1\xbc\xb1F\x9bY\xc1\xbf\x8f\xb2\x8c\xda\x12\xd0ԏ\xacO\xba\xf4\rf\x93N\xe9ȼ\xc7\xf6\x80믨Z\x17\xbb\x85w\x04\x9c\xdeb!\xec\xd4;;\xb6\xe7kԜ\xab9_]\x11Բ\xac?R\xe0p\x14D\xfc,\xab\x0fV\xa9\xf3\x9b]\x9cZ\xe3\xbdn\f\xca\x186\x17y\x1cA;\u007fS\xe9\xfa\xaak\xd7\x0f\xa2\x81\xe9\xffWi`\xb0\a\x03\x96\x92\xe9 \x8a\xe8@]\xa0!t\xb0e\xc2Km&N\x85\x17\xd7̈\xf1 tp\x1dT\xe8\fڄ\xd6?D\xa6\x83!~mR\xab\xd7+\xc0u\x80\x1a\xd0\x19\x10\x11\xe8&\r\xc1Z\xd39\"\xa8O\x8e\n \"\b\xb5\x85FB\x83M&\x02\xb5\x0e\x13A\f\x13\x81J&\x02\xa5PD\x8b\xb4zP_\x00\xb2N\"\xe2\xab\xf1\xa8\xa7ce\xf6\a\xbd`\x80\xe5\xf8:P\x0f\xf0\xe2\x12K\xe4'\x9a\v\x13\v`.\nc Y\x9eD\x9f\xd9D\xa1\xd7g\xad\xe9:\x061\xd5Jj\xe8\xf2\x86rQ\xa4U\t\xab\xbeyH\xbb\"6_zH\xfa\xfd\xd47c\xa3\f\xfaaO\x8e\xdd2\xf2i\xc4s+\xd5\x1c\xf7\x82\xde\xdbsz\x87Dm\xef\xd8\xda^\xa8\x01\xdcu\x1f\x1f\x05K~\xc1\n\x95\xe5\xcd\x15I\xdd\\\x18J\f\x9b\x91lذ\xa6\x81\xa3\xa2S\x9bG\x14\xc68ӧQW}\xa8\x98\xf3\xbc\xac{\xb8\xfcJ\x83\x9b\xe7\x1d\xadޠ\xd6\x13\xa29Q-\x1dr\xf1y\x93!pF}F\x00\x00\x97\x06KA\rP\xea}%#\xa2\x8f2m\xddW\xdc2\xa4cMK~??X͈g\xee\xa2f\x13\xdd63\x1fF\xe3{\xbf\x9f/\x9c\xe6C\xfd\u007fxU\x1f\x8d\xed\xfd~hx\xe4\xd3\xe2\x80_\x12\x06\xfcD\xf8\xc0\xe4\x100\tD/\xdb(\xabg\x93\x03[\xc8\xfe\xe5\xa4\x10~\xe7\xd1\xe2\xfa=\xf3jG\x8fօF\x86t\xa3Z\x1a\xe6\xed\xa9.;\xfcNX8\xf9)˞9\x853Dk\xf7\xcek\x1c\x81\x06\xf7pHα\xb76\xfa\xe8\xdbA\v\xca\xe1\xde#}\xb9w\xcd{{\xa6N\xdd\xf3ޚ\xbd@\xbbgDvYv\x19\xbc\x15\xfe,[\x93\xada\u007f\x96%\xf8\x05\xb0\xa7ģ\x1b5\xa2\t\xdd\x18;\xfcnP\xfc\xe8s\x8e;sZ(x\xf7pѐ\xbd\xf3\x87\x0e\x1f\xad+\xf4\xf9\vu\xa3G4\xce߇s\xa0\x87\xff\x85\xe3>=%\x14\xbcs8V\xbbo~\xdd\xe8Q:Ot?\xd0\uf676\xe7\xc4\xda5'\xb0\xc7f=tg\xa1t\x15\xd8\x04%\xb0\xe9\xeb_\x82\xbb\xe94\xd8-\xcd9\xf7\v\xba\xf3\\\x8f\x94\x01G\xe9\x1ep\xb4Oϒ\xd8\x12E\xa8\x14\xc67\xe3s\xfa0H\xa0\xe8u\xa6\x1cL\x00\x1d\xc7c\xb3W\xd4\xc7@B\x00\xc6\xfcT\x1a\xeb]\x86\xd3n\x00\xc6\xc2\xc7\xec\xd9yK\xf7\xac\x9bfm-\xb9\xe1\xd81\xfa\xf7\xff\x90\xdcV\u007f\xba|\xe4\xd8\xc5u\a+\xcdf\xe9Ï\x9e\xa1'\x9c\xfb\xaf\xa0\x02\xde7\xab\xdd6g#\x1b\x1a\xbew\xe9\xb9\xec\xf4\xdb\x05v\xf8\xcb7\xd0\xf4\r/\x9f\xf8\xe6\x8b\xda\xf1\xcbF\x8e)ˇ/\xda\xefN\x96\xa7\x92\xf0w\xd9'\xc0\x17g\x1fH\x9b\x18\xdd\xf8\x1b\\\x8d\xbeǨ^_\xef9]>3\x95O\x95P\x95h4\\J\xad\xa5n\xa1\xfex\xc1\xda\x00\x89I\xa1\x9c\xf7A4\xd3]:2\xf0\x1cp97\xd9i4T\x98z\xbd\xcaYS\xbd\xaeFMa,\x90qX\bK\xcb\x1e\xd5\xd0\xd0A\x14J\xc8\xdd9%\xbe\xde+dDF\xfd\x91\xc5\xf6\xf5\x8c\xbe\x17\xf5\x8aر\x87\x89DBF\xact(LF_2\x92\xd1d\x12\xc7\x12\x1d\x94\xb9u\"\xd4ၝ\xb8\xa4\xe4E9\x81\x1e\xe7\xab\xf0\xf9*\xae\x8e\xd4\x14D\\\xee\xc8\xc3\x055\x91\x88\xdb\x15\xf9A\x04\x855\xbd\x01Ќ\x93\xde\xfb\xe1\x15o\xdf\xd2a\x99\u007f\xf5Zwm\x85ۛF\xbf\xa5^w\x85\xb3L\xbb\xfcꛆ\x1b\xdd\xd3S\xa7\xddc\x0f\xefX6K+5gff\xeag\xd7\xc3U\xadߛ\xd9vK\xba\xb4sn\xf9\xe4\x801Qδ\x8e\a\xd6ƚ*\xe9L'S]\x94+ \x8d~\xb1\x8a)\x8bWOK%W\f\xf5\x86'\xb7\x1e-\xcd3\x95\fY\xdcP-\nVh\xa6U\xf6<\xc3į\xb7\xfb\x1d\xd5\x13\xc7V\xb2\x1a-\"\x97\x90aO\x81\xcd_\x92\x9e\xc2\xfc\xa9*\x16\xab\x8a}3n\xa5\xbb\xa8Ƚ\xd2]\\\xec\xfe\x97g\xf0\x95\xfd\xc7\xe6=tr\xed\xa4\t?|\xf7\xfb\xd2[s*\xe3\xe4\x9f\xc7\xd6\x05\x84\xc7Z9\xe1\xcb\t\xab7ݶ\xebwͥ\xf0p|\xf4\xe8xb\xf4h\xe9d\xf7}\x8b\x9b\xab\xf7-\x99\xbfP\xe0*\x92vsӋ+\x97I\x9f4d\xf6\xd8\xc1ʢ\x8c|\u007fciS;\x10<\xdd|\xf4\xe8ʊ\xf9\x95\xd7\xde}帤\xcbF\x9b9}4d^v\r\x93\xa9dy֨\x17\x00\x97\xa7A\xf3\xf3\xe7\xee\xb2\xf6\xfe2\xbc\x8d\n\x12-\x81d8ߒ\xe8S\xa0\xb5\xe680De\xc1D\xb9\xbf\xdco\xf1[\x12\x96Ā=\xb7\xdb9i\xd7o4\x1b\xdbg\xddpìi5\xf3\x17߾\xff\xe4\xc9\xfd\xf7\xfe\x12L^\xb2d)\xfa\aL\x83X\b\xb8&\xdfs\xcd\xc8\xc97\xbfts\xf5\x9c\xd9X\xbf\xe2\x8d5KI\xc6Ճ\xb9\x03<7\x04s\xe3e\x98\xa0\xd4ajE\x83\x1co\xf4\x1b\xa39'\x81\x18\xc1F^1#\x9b\v\x88L9\xaa\xec\a\xf7\x8c\x90>\x1c\u007f\xcfk\xfb\xebG\xf6\x1c\xe9\x19Y\xffܝ\xb3f\xe9^L\xb6MR_g\xb6\x87\x18\xea\xdcS\xa5\xbadu\xa9\xf4\x03v\x92mySgOOg\xd3r[S\xb1\x1eFL\x10\xfb\xca\xc4\xe3\xf4\x18\x82\xd3\xc1\xa2\xde8\x81\x9aJ\xddFQ\xa6x\nu\x0e6ʆe\x90\xb8z\x10\x85\xa8>z\xe07Ʊ\xcf\x00\xb2\xf9\x8d1ɰ]5\x99\x8aCքя\xddҡLؤ\x01Mf)7\x06\xa3&\\\rCʓ'ky\xe1D\x87=X!.\x00\xf4M\xdeXu\x19u\x1btpsر\xfa\x1d\xed^o\xbb\x97S\xaa*\xedq\u007fT\xdc8\xf6l{%\xa8zT\xac\n\x8eTOmػ\x9b\xf5j\x1c:\x8b\x02D.[>*V\xb9\xcc\xd8Rn\xf6BU~Q\x93\x87\xbf\xa6{ڞ\x86y\x87&W\xfe\xda\xe9(\xdaZ\xfc\xbc\rɮ\x86v\xb3k\x91:\t(R,P\x84\xec\xd2(\xc7\xd2\xe6\xfc\xe9\xe9\u008d\r5\xd7\\\xb1\xacT:%\xddE\x14\xb3\xee\xd55\xb8\xaa\vk2\x81U\xb3::f\x1d\xf2g\xcaR\xfe\x84\x03\xb1\u07b3\xec!Г\xc9d8m\x8b/S\x98\xb4\xde\xd0\xc5t\x0f=\xdc\xf4\x9aZ\r`\xc3\xde\xecI\x80\xa4;\xb5B\xfa\xed\xb2\x98\xb9\xa2\x92\x8b\x9b\xd2VUaft\x1e\xa4\x1e\x1f\xd9\xf8e\xfe\xb8\xfc\x04\x8c\x9f\xb0\xd2\t\x8f0)/p\xbd\xbe\xa1\x05\x15\x85\xb5\xd1\xed\xa1!cU\xa5\x8d\x9a\xf2JƧ\x0e7ŀ=d\x87\xfb\xed!]\x933iu\xaa+*4ƀ\xbd\xdc3\xc4\x10\x1a\xa0s\x11$\\\xc4\x05\x06(\x8d\xc4R\xacg\v\xad\xa8\x01E\x10\x90\xb5\x13\xb0\x89\x96\x8e\xf6\xe1m\xacp\x88\x93\x95\x18X7\x13\xaf\xa3y\xaa\xab\xe1\x9bLC\x97ZQgin^\u007f\xefRvzi{U{|*\xb7\xf4\xde\xf5\xcd͖:\x85:\xfb+\xc0w\xa8iEHaW\xffq9\xdbU\x86\xae\x97u\xb1O\xefQ\xdbQ\x1a\xad\xee\x00\xbc\xaa=>\xaa\xad\xa5mLi\a\xbd\xf2\\\x94@\xb2\xbc\xa1W\xf2icU\xf9\xb4u\xed\xcc\xf0\xfc`\xd0\xd7̶\xaf\x9bV^eL\xf3\xca\xec\xfd?\xadU\xd8\xd4IT\xe8\x03ch|5\u007f8\xbd\xf5rTVRmS\xd4\xfeTQ\xe3+\x11Ř\xb7~\xa0\xdec\x19Վ%p\x90\xf3\x01\xa3\xa3\x8b\xb0\xa2\x97\xec\xc9\"\x87\b覫!V\x81\x0f\xa4S\xa2`D/\x1b\x8c\xe2\\d\xab\x1d\xb5\xc1\xc5\b\x04\x18\xfe\xbc\x0e߄[\f\xa2Vy!\xac\xa0UE\x87\xaed\u0085\xa3[\x82\x00\x04[F\x15\x87ص\x87¨\xb2A\x85C\xdd\xf5\x16\xdbV<4\x0f\x80\xbc\xa1\xc5m,\x80i\xb5\xfd\xa5)C;\xa5w\xe8\xf6\xc2f\x9c\xdc\\\xd8N\xbf\xfb\x8b\xaar\x1d\x8f\x8d\x04\x89\x9b\x0f\xdc\xc0\x91+\xc0K\\ \xda֊\xcblm\x8b\x06\x8aN\x9f\x9e\x14\x81\xcb\x12\xe8\x8d}W͠\xbd\u07b8\xd5\x1a\xcf\xf70Ӯr\x93\xb6a\x94#\x0e2u\x1e\x9f\xcfSǼT\xac\xa0\xb3!z\xff؊\x96?\xc0\x06\xb7\xdf\xefn\x80\xf7\xed+\x8bk\xf8s\x18\xfa\x95~\xe4\x1c\xb1\xa6\xa5\xf7W\x84V\x82\x19\xac\xdb_\x96\x97W\xe6w\a\x1e>ҁɅRS\x96\xf3\x14\xfbI?\xfb\x0e;\xe5\xa6|T\bɢqj5\"#k\fU+\xcc\x02+\x1d\x06A\x1a\x8514\xa7r\xd8F\x1b\xb0t\x10\xa4y+IN\x87y\xa2\x87\x91\xd6\xc30\x8fMYcX\xa3\x9d\xe5\xfc\xa1\xf2p\x88\x0e\xd5\x03\xecdW>\xa6\x83q++Z\x04b\xe8m\xb1b\x1f\x1bilˊ]m`A\x16\xdd\fZ^\xf1\xbd\aL\xc0\xa4\x96ޒ\xce|X\xfa\x15b\"ku\xd2~p\xe3t8\x0fBf\xd4x>[\x0f\xa8&\xe9cf\xae\xfe\x0f0{\n\xac\x12\xa4\xc9\xf4]\xe6\xd3\xf0\x16\x0e\xf2\x00\xba\x1f3\v\xc3\x14̟y~&\xcfH\xef3P\xf1\x11\x93\x86|m\x17\x18\x0e\x15][`7T\x82GY\x1a\xd4rfn\xf5\x95,\xbb\x8e\xe5\xc6\xd1\xeck\x1c\xfb\x15\x03\xf5f\xe6\xa7\x1cx\xe7/oK\x89\x13_\xbd\v\xb6\xbe\r\x86\xfd*{\xfa\x1d\xd0\xf4\xb2t\xb0\xfd\xb3\xd1@\xaf\xa4\x93\xcd\x1c\xdc\xfb2\xf8\xf5#g\x1f\xfb\xf3=\x9f\xc3\x15/\x80\xa7\x0e\x9e{\xe6\xe3\x9b\x16Lg\xd85S?\xe8\xf9(\xbfl\x15K?òc\x0f\xb0\xf4\x9f!\x04_0\xc0\xc83\xc1\t\x1c\x98γ%\xb3\x15\xe0\r\x15\xbd\r\xdcɰR\x19O\u05ce\x87\xdc\x15-\fS\xb1\x94\xa3\xaf\xa4\xe9m\f\xb7r\x1b\xcd\xc2;\xd9\xfe<\x9c\v\x8d\xfc\xe3ɪ)\xed\xd71X\xf0\xf3ɫ\xa1\x88l\xe9\v̊%\xe7\"a \xe6\xd6\x05\xe7\t\x03ΘG՞\xd2\xf6\x04\x97v'b\xd1X\u009d\xe6\x12\xed\xa5\x1e\xf5\xb8Z\x98\xa9\x1d\xf7ȝ\xef܉\xfe\xe0\x06\x93\xae\xbb\xab\xe1l\x86 f\x1cm\xe8\"&\x1b\xdd}GPX9{ΰ\x12&ߐ\xa7R\xe5\x19\xf2\x99\x92asfW\x8e\x981\x03\xee^|\xc7\x1d\x8b\x17\xddq\x874\xfa\xa8\xcet\x12\xdf\xce\x12؍\x93Dӻ'w\xcc\xed'\x90wTRE\xd4dj\x01\xb1\x9f\xcbi\x81\xa0\x11\x8b\xe9}\x1d\xc4GU\x037\x1b\xafc.\xf1.}\xce!.zs\xcbE\x18m\x8c\xfcj\xa5\xd1\x111\xaf\x81\x1fݐ=\xda0Z\xe9,\x19S\xce\xf2qK\x89+\x12\x8a\xb8J,q\xf8\x98\xa0\xed&\x00ʹ\xe3\x80V\xd0\n\xe7)A{\x96\xa0\x8a0\xa87\xd3\x1bЫ.B\xaf,=\xe9\xab\x1d1yd\xa4q\u07bc\xc6\xd2΅mIƣ\xb6*\xd1?\xab\xda\x03\x18\xd4\xed\t2\xb3|\xec\xdf*\xb80\x96\xb8\xf6\xc1V\xc3B\x0e'G!\xf3$\xf9h\x8c\x1bB\x8d\xa1Va{\xe1(\xec\xa3\x00H\xde\b\xf6\x82e\xe7\xe0Rz\xfdq\x1b\xbf#.O\x0f\xe5\xb2\xd3\x00b\xea\xd6{\xd6o\xe5\x882E\xda+\xb9RGqaaa\xb1\xa3\x94\xabl\x8f\x98ZR\x90J\x8d\xdd\xf2\x93-[~\xc2\xf8\xfa\xab\xd2[\xf4ٗ\xf5\x16\x8b\x1eV\xe8-\x03T\xec\xd1l\"\xed\xef\xef\x80C\"\xd0,\x1czw0\xbegѬJƩ7+\x95f\xbd\x93\xa9\x9c\xb5\xa8g<\xacDžo\x91\xfe\xd0\xe7\x80\x02\x98*p\xc9\xf8\x00\xd4\x17RG\xe1oҟ&\xe5\xef\xd3%c\x03^\xdc~[\x88$\x81\x89\x04[⑩.\x1dw\x03ػ\x9f<\xc8\x1fG\xf9wą\x01\xb4u\t\x17\v\x97\xc0\xb5a\xa8\x96\x94D\xa5Z.n\xd8\xeb\xff\x83&E\x14\xf4uF\xc6\xfa\xee\xef\x9f\x01C~\xa3\x99\xe5\xebL_\xf3\xbe\xdd3\xfe\xa2\x16\x06ϐ\xe6\xcdv\xf75䙾\xd6\xfd\xaa/\xed\\\x9c!\x04\x89\xa9\xbc\u007f\x13\v̫\x17zB\xd7\xc0\xb9\x18kh\x14\xa0y\x838!\xf5\xc9 \xb9\x84G\x96\x9dJR\x86^ό\xbd*\x8e_\x8a\x9b\xd74>\xf5\xdaS\x8dk6\x8b\vA\v\xb8\x12\xb4\\\x9b\xd36\x86\xa7n\xfaLz\xfc\x89#\x03\x14\x06\u007f\xbe\xfbUC\xcbر-\x86Ww\xef\xfa\xe1\x0f\xe1a\x19\r\xfc\x14HI\xb7I?\xfe\xeb \xc5\xc2\v\xf52P\x01\xaa\x98\xd8j\x88&\x8b\xf9\x82\x9a%v\f\x99s\x1eh1[M\tћ\x8e\x87r\x95\x85\xaf\xc8%݈\x15$wH\x8f\u007f\x86\xcad\x96\xdc~A\xad\xf1\xf6\x86\xcf7\x83ś?\u007f Wa\x8eº\x94G~\x8c*|\xf3M\u007f\x05\xad\xe4\xf6\xb3\xc3^\xfd\xe6nY\xd7R\xfa\xe8\xeeo^\x05\xc3zz\x0e\xe4j=\x10\x8f\xc5#[ۀ\x01C^\xbaW\x81\xc1b\xa6H\xadR\x06\x01o\x05\xc00\xe7\rsd\x17\x91y46~ZC\xf1\xcb7\x9e{\xf0Ɨ\x8b\x1b\xa6\x8d\x8f\x8d\x1esݳǟ\xbdn\f\x928d]\xec\xa2I\x1b\xf7\xec\xbcU\xba\xfa֝{6N\x82\x9f\xebJgnys\xf3]\xef\xbf\u007f\xd7\xe67\xb7\xcc,\xd5m\xdc9\x1f\xe5F7\xcd\xdf\t\x85\xdc\xcb|s\xea湟\x013\xbfi\x13/\xfd峹7\xf7\xf9\x9bfe\u007f\v6ʏ\xf5z\xfb\xf5&1>\xa0+a\x83\xdaK\x00;\xf5\xa1i\x0e\xe8\nc*\xda\xdfk\xaf\x18\x13پ\xed\xb9m۞\x03\aΡѕ\x96\xb9\xa4s\x84\xd60\x99\x1f\xc5\xf4\x8dHzBτ\t=\x8bgW\xb6\xb6V\xce\x06O\x11R>\xbb\x9f\xed\xfe\x06#9\xb1\xaf~\x93\xe9\x1dVs#\x02\x86y\xef\x1d\v\xb0nI\x11UM\xb5R\x9d\xd4\x1c<\x9e\x92}H$\xbe\xcb\xdbո\xba\xdf6\x9c\x0e\x8e\a\xfb\xc6K\xf9\x8d.\x1a^\xfbP\xe3\xf3\a\xef\xdd\xf6\xe8}M\xb1̓\x99X\x93O__\f\x1e,\xae\xef!\xaa0\xccr\xd4\xc5I\xff\x83\xe8]\xa5\x9e^\xe3H@\x9c\xae\xe4L\xa4d\x93\xa9\xbe\\\x18LӤ\xfb\x1a\xc5\xf9\x81\x1d\xbf)5mb<\x93\x89O\x9c\x96J\xb7\xb5\x81\x83D\xd7F:ya\xec\xec\xf3\xe7\xd2\xef\xd0/\x11,%\xed\u05ff\xab\xff\xabv\xec#\xd9\x1c!\xc0o\x1bS\x83\x83\xe2\xec \r؋\xc7\xd8K\x13\x12n\xc7\xfabiBq}\xbf\xd6\xfc\xef\xb7c\xcf\u05c8丣\x83\x87\xcf&\xd4v龖\x04\xef\x90V\xcc^p\x8c\xf4\xc5%\x1a\xf1Bڹ\xc3L\xf7YL\x96\x03\x87LH|\x94\x9dF\xfd\xc8N\xd0\x19\r\xd0\xef\x83F\x83\t;9d\x88\x923Y\x99\x02\t\x11o\x80#A\x86\x93\xbd\xd9b玲I$^9J ^\xe6\x8fo\x9c\xfa\xe0\xf8\xf1\x0fZ*E_\xaa|D$\x9a_\xb6\xe0\xa1k\x0e56\x82\xad\xab\x90\xb82\xe2Ʃ\xc3\xd6Lmȟ\xb1x\x97\xf4\xe1\xef\xb6m\xfb\x00\xb8n_\xf7ɱ;'\x1c\xb8.6\xad\xaa\xb6\x01~\x8aģJ\xe9%\xe9E\xe9g\xd2/\x8cE5\xcdE.Ì\xce\xc5sn\x97\xb68ڗv\x0e\t\xb5t\xa4\x1d\x97\xff\x02D\x1ex\x10\x14\xbdr\xf9\xf0\x1b\x9e\xfd\xfa\xda礟/j\x1e\xd1\xda;\x1e\xccQR\xecnʋ$\x86;\xa9\x9f\x12\x1bO\xa26\x85^G \xcb\x10\xb9Ez\x03\xd1\xf9\x0f\xf6Y\xbe\x92\xefg\xbe\xa0&\xd1\xebU\x0fuB\xb2\xa4\x86\xb2\xf4W\x88\xb0\x90\xcd\u007fY{\x12o\x96\x12\xc4\x18\xa23A\x96\xd8\xf0\xc2\ac5\xbbY\xa2Y\x12\"q\xc0\x1a.\xe8\x0f\xa4SF\x82/\x84\xedMeg\x98H\x82\xf9\xb9\xd7\x024\xf5\xb3N\xbd\x1d^\x1e\x12\xbc\xf53\xcb\xd6\\\x11\x9f\x00m:\xb3\x92\xad\xf7\xbb\xce\x1e\xb3\x87\xfc.\xa6\xd2\x1ez\xb7\xd169lP\xf3\x86P\x14\xa5\x18i}\x91\xb5\x81Vi\xabD\x96\xa1\xbd\xa1Ty\xa8\xd0\x157\x00`\xe2\x1ck\xee(\x1b\xd6\\fs9\x84H\xbc&R\x13v\x1a\x14\x1c\xadPi\x8c*\xab\xb3@\xe5h\x18^\v\u07fcN\xa8\x1a5\xcekpW\x8dV>\x11IV-\x80\xa2ZP+\xbcB\xf3\x953\xbb5p\x8e%\x9f\xd6o\x04N\xb0\x1d\x8c\a\xc6\xc4\x02\x87ਟ\xdbq\xec\x1b\xe9\x8fo\x8c\x9fD\xdb\r6q\x83+\x1c\xb2\xa3\x1f\x1c\xb1uVh\x8cY\xa5ᔅ\xf1\xf1ё\xa9BV\x13ӊ\xf6\x91\xfa*\xbd\xcdb\xab\x04\f\x03K\xdd\xc1\xbah\xb4.8\xb3\xae\xc8̲\x906\xa8\x8b\x9e_\x9f^\xb7d\xf1\x9ady\xa4ԠԘ]B\"ђ)\xc5\xfe\xa4,\xa2\xdai\xb5\x8d37\x8fܿM:\xf3_\xde\xf6i\xb5\x1e\x83~\xd8X\xf5\x1f@\xc9\xe6\xe3\x8b\xd6,\xa1-\x1a\xabѬ\x14\xf2\x1f\xd8,}\xf4pa\xff\xf5\x86<2\xeb\v\xa9\x10\x8f\x848\x11\xbb\xa9\xb2\x8a<\xa8\x04|\x1c{\x80\xb9\xc8\b\xfbޝʰ\xf7\xdc~\x97Ő\xf7;\b,j^-\xcd@\x14\xb2\xf8d\x06.\xbe\x84=\xc2\u007f\xc1\x1f\x17\x874\xd2cj\xa7\x8d\x1f\n\x1au\nV%]\xfb\x918\xff\xde\x00\xdc})\x83\x02\xaeϷ\x93\x96\xec$'\b\x0e*\x95\xd3\xfdK\xa5\x8d\t\xa3\x1bX1\x8a\xa2l8HH̛J\x9b\x89\x9f\xf041\x84\xb4\x18E!gy\x83\u007f\x10\x8f,\xcdU=U\xcd=M5账\xe9\x19\xa0z\xa6GV\xf2\xeb!\xe7=G\xc9?l\xfc^3\xdbB_\u007fn\x95evM\xdb\xd6\x12\x9a\xc2IY\xaadkۖg\x9e\xd9\xf2\x94\xf45\xe0\x9f:\xb2\x19\x1eñl\xe5fp\x9dl\\C\fl\xfe\x9f\xa8;\xbc>\xfb\xffm\xdd\xc1\xf5\xd2\xffJ\xdd\xcb\x13\x96\xff\xf5\xba_\u007f\xfd\u007f\xa7\xe6\xfd\xeb\xae$\xf3\xb2\\\xfb\xbe\xba\xa3\xb9\xe4?\xaf7\xfa\xfbwj=zŊ\xd1\xffq\x8d\r}\x18Lx\xa5\t{\xabo\xa6FQ\x13\xa8.j.\xb5\x94ZM]Im\xa5n\xa2vQ{e\x8f\x17\xa0\xd7W`\x14\xa4el\xb9|cΑJJ\xb4b\xecL\x98sI\xcd\xe4\xec\x80R\xbd\xf1\xde0)\xa7\x04\x06\xa7\x0f\xce\xff-\xf7\xf7\xde\xc7\r\n\xd9;U\xaa\xecM*\xbb\xaaC\xa5*\x1e.T\xb4\xcc]\xb8\xeb<\x85\x19\xe9\x85\xcf\r\xebz\xad\xa3\x18]ʗ\x15u\xa7\x90@V\xe4\xcdޗSޕ5\x82\xa9\x01\x89\xfd3J'\xfaGr\x19d\v\xe4)\xfd\x8e,\x8f\x9e\x83ꁪaW\x15w\xfeiְ]\v\xcf\"F\x1ds\xf5\x1d-aאb\x95J:D\xee\x9br\xd11I\x8a\xe8\xf9\x96\xab'.J\t]\x94\x82-[\xfb|\xf5\x05\xa9\x12\x82\x98:\x94j\xa36\"y\xfbF\xeavj\x0fu/\xf5\b\xf5c\xeaY\xec\xc1\x17\xefx\xf5\xb1|\xc4P\xbd/\x86\xfe\xa8A\xdaޡ\\(\x0e\x8a\x87.\xc1]V\x83\x1c\x1e\x9eH\x96\x15\xd1\x04\xc4!\xba\xe9O6q\x91\xfa\x96r\xbe\xad\xfc\xc1\xe9\xbdq\xaeGv\x8eX?$K\r\xa9\x17\xb4\xd8q3̘\x9c&\x93\xb3\x83\x1c\xa3丣߹|d:dn\x1dI&\xbb\x16.\x1e\x19\x9d\x1f\x11\xd5\xeaB\xb5Zz\x89\x04b@\xe9\f&\xca[1\xbe㹞\x8b\xee~\xe3_\xa6\xc8O\x03G\x8f>\xb0\xea\x05\xfc\x84բ\xb8\xd4h\xb5\x1a\x9f^\xf5\xc0Q\xf0\x03|\xcd\x14\xedw4]\x94\x92\xed\x13\x0f`\xcf\xc2]\xa3\x04\x9dw`増\xc7\xfd\x18s\xc9\x04\x8e^toǿL\x91\xff\bψu\x1d)VB\xe3l\x86\x1aN\xad\x90u\xbcx$\xce\x12V\xce\v\xcc\x186\x01\xab\xbe\xe2\xff\xd8}y\x00\xf1q\x84c\xc3<$^\xe6G\xdc\x1fV\x17M\x05\xd2)$\xcf\xf7\x99U\x98e_y\xd8[\x1e\xc0\x8ań\xbb$\xf6`xK)J\xf6_Sn@\x9f6z\xf2D霘\xe71\x82\xa3\xd0-\xfd\xed=\x05F]` P\xec{\xfe\x88\xf4\xf2\x8f7\x9c>0\x1d\x80\x9f\xed\xe3!M\x03\x05\x04z\xc5m\xa7\xd7)\xf8\xd5?\x05\xf4\xcd\xf7\x80\xd8\xfb\x9b\xb3\xa77?\xbdy\xf3\xd3\xe0\xe0\xa2i\n\xc4\xdbXyUUê\x97Vl9\xaaU5\x0eQ\xf1y,4(\xa6/\x82\xf45\x1f\\}\xcb?o\x05\x93&,{w\xe6\x94)3\xdf]:\xf1~@}.m\x98@k\x94\xa5&\xaf^I\x8f\x01\xf1'\x1f\a%\xf7\xab\xf8ŏ\xfcq\xe3\x93\xd2\xeb\xa3i\xa5%O\x19\xd3(5L\xd5\xefA١\x9b\x01\xfb\xfcz\xa5j\xc5q\xe9\xfd ~\xe6\xe6\xf3\xd4\xfa\xb7\x87q\nU\xb2@\xa5J\xed\xe8X\xf6\xf4\f\x8d\xfeg[\xa6\xde_\xa3RE\x92J\x05\xd7rb\xe3\xe6\xd3\xd7r\xfcֿ\xe6|\x93\xcbv\xc5\x02\x9a\x0f\b\x9a\xfb \x94e4L\x9cE\xdfCލ\x90\xe5f\f?\xdc\xdd_^\x01r9\x00\xdb-R\x83\xe57~\xc0\xbd'\xc9rfna\x88\xee\xf3\xef@S\x1a4\xd6S\x11`\x8c@4z\xcb\xeb\xb29\x14\xae\v\xd5\xe9\xab\x13Me\x11\xa1`(x$\xef\xd3\xe8\x01\xd9\xfd\xbd\v\x01\xb0[vr\x0eQ\xa6\xf3\xe8\n\xa4p\xba\xbc\x9e\x88\xd3\xf1\nAW\x9f_v\xfc\xee\xd8\xd7.\x15L\xa7\x921@\x0e!\x9f\x1e\x84Cd/\x12;)̡\xa0X\x91\xc4?x\xa5\xee{;T\xaa\x8f?V\xa9v\xa0a\x15\x85vՠ8\xbc\xac\xff\xab\xbf\xfbm\xd9rqF\xe8ߦt\xbf\xfa\xc9\xeb>\xff\xb6_\xdcA\xb5\xfc\x18?\xe7\x81\a\xe4\xe7\xa0P5(~N{\xf1'\x06\x0f\\:o_\\z\x95\xa1\xba\aʬ\xbdc<\xa1%\f\x84}\x11[\x1f\x05\xf1\xecJ\xe95\xb6\xfb\x12<<\x98\v\x93\xd9_\x81\xe3\x97\xe2\xd7yR6$\xba\x1f\xd8\x17k\x94j\xa4~F\xbd\x85\xadLt\xe8\xb5\xeb\x00\xcbɦq\xd8N\xce\xda\xd7DrÄ{\xaf\x89\xe6 \xe9\xe6\x04\xb5\a\xf5x!E\xb6\x00\xf9:\xe0\x01\xa90\xde\xf0\xc4r \xde\xe9D\x17\xd18\x82\xf5\xccҡ\xb0\x8fhWaY\x13[\x9fp\xe8\x02\xbe\x8eq.\xd1p\x83Qr\xf0Fv:\n\xf9:&!\x12=\x19Q\xbeΊ\xd6PXǠ\x01&e\":\xa6آ}0\xf6\b\xab\xd6\x17hԺ\xa4A\x9a\xa2\xb0\xf2\n\x05oU\xf0{\xfd\x1a\xbf6\xa4\xd1\xc8\xc1:\x9c\xc4+D\x03\xb8\u07b73\x15\x8a2-m\x99\x10\x14y\x81\xd3\xd1,ͿH[\xbd>\xae`\xd2P\xa1P\xa3\x81\x01\x0e\xd0tQ\x05\xa7Z8\xaef\xb1\xd3\xcd\a\x12\x9e\x92\t:g\x8dA\x1b\x0f\vQ\xadV\xab*)\xd3Bȃ\xa0\xdb&\xfa\xe7\xf8\xf2\xa7\x1c1\x00\x95^o)*\x8c\f\x17\xa0\xd2k\xb4V\xe4y,Z\x9d\x82/X\xc8\x02\xa7V˸E\x8f\xa0\x87J?\x14m\x85\x82N+\x94\xbc\xf4\x84g\xc2jGl\xd1\xfc\xfa\xf0\xdfч|\f}\xb1\xc7\xc8\x17kC_\xac\xeds&`4\x16\x98\x8cl\xe0-\x85B!\xe2W\x12;\xfcZmH\xeb\xd3\xfa5\x9a\xb0ƿ\x1a\xa7+\x14\x06qJ\xa6(\xe4l\x9b9\xc1\xec\x0e@\vgQY\xf4\xa29O2\x99]:\xb3jXڠU\x03PRb\x8e\xa8Ty\x1d\xf1q[T|\xa2,1\xbb%\xa5g2\x15\x8bWZ\xd4B\x9e\x1d\x80\xb8\x13\xdd\xe4bh\xe7\xf4\xeb\xcbu\xa2aI,\xea{b\x98A\xad1٪D\xa3P놜\x12\xb0z\x96\a|$X>\xb7t\xde\xe5\xaeB\x8e\xe3\xe3\x91\xfa\xea\xc6\x06wʞ\xe7N\x85\x8a\xbdj\xdba\xa0\xecNn\xaa\x986~,\r\xc1\xbaKڠ\x83\xbeuX\x8c\x10h\x14\x89}y=HЂ\x9fh$\xe6\x16\xa1\xea\x18\x94\xc6A\x8cT\xe3\xcfg\xcb\xf1w\x17La엪\x9c͏\xa71a\xe0\xfcx\xdd\x0fr\xf3\x1e\r\x06\x9bJ\x8c\xf9\xf3t\xfc<\x97\xbe&5Q\xfa\xc7\xc4)`\x8e\xbf\xac6\x16/4M\x9b\xcc%\xd8\x1d\x9f\x94\x14go\x90\xb6oj,\x03\nZ\rcM\x9b\xc0Z\xf8\xdc\xf5\x9fp\x06\x86\x9d\xe6\xf5Lh\xce\xfe֩gGdW\x00\x96\xa6a\xc9\xf0\x9b\xa4\xe7\xa4\xe775Ł\"\xfb֨VFm\v\xd7\x15\xbe\x17\x94:jY\x0eh\xe6ڴ\xa5i\xb8\x19\xec\xf8\xb26\xaa͛\xabq4e\xa7Mݰn\x951\xb7\x1fBt\\\x8cT1U\x8ax\uec79\x95;$\x0f\xe8\x18\xbf1\ue99d\x80\xc5\x11H\x14\xaekh\xccb\x93Ą\xd1\x0fЏ\x0f\x85\xfdH\x84\x13\x12\x02\x8b\xba\v\xeb\xf3\xfb\x8a\x801\x9e\x10S\xe1\x10[.\xdbs\x94\xa3\f\xe9Kګ\xdc\x05\x00d\x15:\xa5\x12I\xef\x10\xd4\x00\xc0\xa8\x15J\x96\xa1\x19\x8e\xe5\x14,\r\xce~\xb0~=8\xbcp\x9fӬٻ\xa8dd\x11x\x80\xa5\r&\xaf%b\xb4(\x98Ns\xe0\x81\n\x1a\x80ZF\xefsE=\xab\x96\xf2\xeeX\xdc\xfbx\xff-9\xf8\xe1\x11FT\x18x\x05\rʡ\x826\xb0\xe2\xacu\xc0\xaa\xd0sJ\xd5n\xa8\xe2\xd5\x1c\x06\x18\xe0Ԭ\xee\fxO*\x00\xef\xfd\xee\xb6\x11(\xa8\x90^\x06\xf5\xbaF\xab\xc1fа4JH\xec\xae۷\xc5\xe5\xf5\xeb}wI\x05\xee@-m\x1a\xb4\xd7\xc1R\xa5硢\x95\xfd'\x9a\xd1,\x94\x1d\xb5\xe2\xcd(1\x14&^\xcbD\n\x0f+1\xac\xd3/\xe0\xd1\x04\xe0\xcd\x05\xa2\xaa\xc9\xd7\xd1\xd8\xf3\x05\x1f\xc2J_\x10\x8di\xb0^F\"\xe0\xd1\xfb\x87\xb1\x815\x1e<\xd0M\xd8ҍ\xe7\u009c\xdfKѾ\x90\x9f\xc30\x04\xa25J\xc7@\x14\xe5\x83\xd6\x1cc\x84\x87\xb2\x00\x83\xb8\"f\r\xc7j\xa3W.Z\xe51\xeem\x00\x1dҴ\xfbm^\x9a\x19\x17d\xd7\x17\xf9\x8a\xdd\xec\xfe\roJ\x1f\xec\xdb)\xfdm\xa1[_s\xdf\xf7\xb6E\n\xf2\v\x94\f}\xe5/\x0f\xaeof\xf4\x15\xbe+\xbe~\xfc\xd6`P\xf4\xdb\x19]\xf9q)\xbb\xedH\xe4\xba\xed\x1b\xc3\xe1\x9b\u05fex\xa6Ego\xfe\xfd륾ᝁ F\xcbi\x01\x88\xa4\x8d\xfe \x1a<\xa2\xc3\x16\xc5]4d+\v\x1a\xca\x12>\x85P\u007f0\x03\xd5c#ۜ\xe5z\x9fw/\xf0\x83\xca]\xbf=\xfds@+ܳ\x97<4\x91\xf6\xbd-\xbd\x03\xab\x9d#\x9fH\x95w\xdc4\x04\x96f\xc6EEi\xef\x01\x10xk\xe3\x82\ueab9\x89!\x16\x8e\xa1\x81+\x18T\xa9-\rm5\x81\x15_Vq\x91\x86&[\x9eA)\xd8f\xe4\xcd\b\x9a\x99\xee\x03ӆ\xa85\xd6\xd0,\xb0\x01(\xb7\xb5\x1d\x97>\xb9,_mW\xd1`\nЂ\xf8\xc6\x05\x9dv\xbb\xa69t\xed͛\v\v\xa1Eo\xcfs84*O\x8d\xc2{\xfb\x8d\xaf\x1c\xbcl\x96ӧo\xa9\t\x8d\xbaLjF\xdf/x^ý\xc7\xfe\x8d\xb2\xa2^\x90\xa1&\x12\x8fS\xa9P8\a\x8d\x86\x15>\xf8\x14\xd0A&\x80\xb9\xcc::\xcdف\x06 V\x937C3\xf1!D6d\x00\x1b\x05\xc5\xe8\x02\a\xad!X\xc7\x10|y:E\x85\xb1_%7\xa3\xa3\xd1\agk]\xc3&Tm\x9bc\xd2\xe8\xfdVO\x95#P_\x14\xcc3k\xd5*\xb0\"\xf9\xfc_\xa4/\xa4o>\u007f|\x1e\v\xf4\xaa\x10\x93\x98\xff\x05\x18\a\xba\xc1\x94\xcb\xcd\xf0\xcb1\xdb\u007fr\xfc'\xdb\xc7\xc8\x01X>\xe4\x8fҧ\xd2/\xa5\xf7%\xe9H\xbb\xbb\x8c\x1dyӳ\xa7>\xfb\xfb\xe9\xd7Z\xf3\xabj4һ\xffT@h\xdf\xf8\xc6\xf6n\x8bu\xf6\xad\xa7\xb6/~\xe6\xc0L\xf8y\xf1C\x95a\x97\xd9aU\xb14\xa3Wi\x83\xc1\x82@~\x9e\x16d\u007f\xb9\xe9\xe9\x19y\x89\xcdG\x81\xf5\x9e\xc8\xc4\xc8Z\xedqi\xab$ݥ9p\x8fC\xcb@\xcf\xf1\xe7\xf0&\xd0sr\xc0\xed<>K1\xe6ѿK\xf7\x1c;\x00J\xfe\xf6\xc6\xf7\xe6D\xac\xe3\xef\xb9,~\x93t\xd5\xdf\xc0\xa4&\x16\x95<\xf5\xb6g\u007f\xfd\xfaOvL\x86\xee\xd9;^\x97\xf5I\xc8\x18C\xf6\x01\xf1\x1aJ=\xd1\xe9^FmB}d\x1f\xf5C\x8a\x12,~\x1f\xf6P\x89xG\xec\xb92\xf1?\x8d\x0f\xe6\x85\xd0XVD~\xe5\xd8\x05h\"^\xfe?\x8c\x1f]n(5\xa0\xbf\xe5\xdf\x112?\xaa(8w\x14\xfbL\xa53\x05\x15\x881\xfa\xee[H\b\xa8\x1e\x83\xc1\xe0E\xbf\u007f\xf7l\xff7\x19\xfc\x18\x16?\xec\xac\x02\xa7\xa0+\x9f\u007fG(\xeb\x10\xc6\xd0\xfc6\x06}\x9b[0\xaf)\xdb\xe1ư4\x15\n\xd3A\xa3\x15k߄b\x80\u061d\xd4\xe2k\xc4Ŋ\x91\xa5uX\x84\xeeU\xf5#\xf8)V\xb6\x04\xb0\xc4\xea\xa07Ń\x8d\xcdD\xab\xc0\x1ae\x80\x95\x1ct\xb1\v[\xa7\xb9\xb1ٙ\x11\xfb>\x16\xf5@\xb6\xee\xd5\x03\xf284\xcd\x04\xb5 \x88-\u007f9\xf7\xa1\xa7\xadZ\xad.n}:\xad\x8d\x0f\xd3Ε\xfez\xdc\x00\xf3\xf2#\x86\xe5\xa1dh\xb9!\x92\x9f\a\rǥ\xbf\xce\xd5\x0e\x8bk\xd3O[\xe3:\xad\xd6\xfa\xf4!\x97]Y\xe8\x02)\x02\f\xf9\n\xa3t\xf8\x18\xbb\x03\x17dO\x8a\xb9r\x80\xfe\x12\xe5\x00\xfd\xa0r\x1cv\xc6\xe7P2\xd2+\x04\xd32\xe5*T\xda\xc1\xc1\xfcEڄ\x15Uj\xe1\xfePB\x15\x04\xc5wK\xc7Θ\n=\x82\xc2\xd4\xf3\x0e\xd6\x05|\xa7Ǥ\x10<\x85\xa63\xa0\xf2n魠*\x11ڿ\x10\x95fMh\x17\xe5s\xd1X>W\xb7gO\x1d\b\x14\x17\xb2\xb8\xa4\xa8N'\x17$\xbdu7\xa8\xbctAұ\xbbA\xf1\xc0\x82\xd8\xc2\xe2\x00\xc0\x05q\xf9\xb1h\xaf͌̇\x9b\xb0D\x050\x93\x8b'\x15\x0e\xcf*\x01\x93\x12\x88&4\x870<\vBXFF\xe3V\x80}\x9eo\xdfq|\xd5\xe5\xef\u07fb\x80Gg\xbf^\xb5\x1b\x98\x1f\x06ä\x83kש\xd4G\xa4\xb7\x8e\x9c\xb3\x81Nr\x0eJ\x8e\x1c\x82w\xc1\xe9\xab\u007fs`\x0eϏ\xba\xf9\xf5U\xe4L\xb9\x9d:\xcf\xd4J\xf7\xac\x92^\xb9\xef\t\xe9\xe5c\xb6k@\xe7\xe5 }ߓ\xa0\xe2\x98M\x9c$\xaf?\xe6\xf0\xfft\xa8^\"\xaaY\x8a\xf8\xa0S\x03\xbf\x10N[yļ\x94\x00+\x1f\x0e\xa2\x1f\xf3]p}\x8f\x1fL\xfc\xf0\xa1\xb2\xc7FY>\xb7HCA\xe9\xd5\xd2qp\xe2\xf3y\x9f\x81M?\xedx\x0e\xd6\xe2\tMzA\xfa\xe0\xcd\r\x1b\xde\x04>Dm\xbe7\xffr)y\xe3\x9c\xf4\x04蒾\x0fV\xe7\x97͍\xc3\x05\xa8\x94\xab\xd7\xcc\xfbl\xee\x941ύ\xe9\"wm\xe8_\x12\\s\t\xae\x10ɬ\xe7\x01?\x85=OM\xa2fR\x8b\xa95\xd4U\xd4C\xd4\x13\xd4\vԫ\xd4{\xd4G\xd4\x19\xf4\x8e\xd8\x06\xa7\x0e\x84eHa\x1a[\xe2\xa0y\x1a\x8b\x18\xb4\xec\xef\n\x9b=sD\x84 R\x82U\x94W%Rd1\xc2\x1a'\xf3=\x9euR\x8c(/_\xd4\x01 \xea\x009\x11\xa9ܺ\x05ַ\x13I\x97\xc4\n\x8c\"\xba%\x8c\xb3\xe4\xd6;\xa20\x95\xc6ݎ\xe0\x95\xa6\x10\x93\x81\xd8b\x90+M\xbe\x81\x94G`\x8dp\xb2\\\f\xe8{\x9e\xd8?sX\u0381R\xd9\x14\x13K\x96\xd0\xec\xc8\x16V7\xaf\xc4M3\x90\xa7y\x96\xc7>\xd0\xd5\n\xb5\x9as\a\x1c\xc0\xa0\xb4h\xd4)wd\xa1\xd5\x10\x0f\x16\x89c\x9a\xdd\x11\x13\u007f\v\xcbyt\x0e\x0e\xce\x04\\\xa2\xd9̌m\xe7\xcc\x16\x17\x037\xf1\x9ax\x99\xb1\xa95~n\bg\xd0\xebl4mp\u0089\x1a\xde\x17Ѩ\xd1!k\tԣI\xdcdBG\x96\x114\x15CB\x1a\x87s\xc85C\xcb\x17OYb\xbejo\xad\x06\xcc\xfb۰8=vMa\xa8.\xc0\x94/l\xf2n\xdd\xf7\xe8\xb0\xe1\xdb\xd7M\x8aq\xc9f\x8b\xf7\xecJ\x9d\xd2,\x94i\xc9\xf1a\xc6\xe4s2\xb4`0:\x99{\x19\x8bY\xf0),fs~v\xb1A\xeft\xd4\x1a\f\xfaT\x1d\xfc\x861\xe8\xf5\xb8\x1a\xa82?\xd1+E1\xe5V\x15\x97\x83h\x9e\x19\xe4\xd9cO=\x1a\x9e\x03\x81\x11B@\x03\x9a\xa1\xa1\x96U\xb1\x1c\rX\x83\x15\xe8y$c9\xb4\xa6h\xa1\xf3\xc6\r\xb7\x80\xa1\xb3\x19h\xcfׂU\n\xb5\x8eׇL_\xaaCAkHq\xff>\xa5\v\x84\f\xd2\xd7\xce\xf2\xd9yJ-\xed\xb9\xdf-?\xcc\xceI'\x8c\x91<\x85\x11\x1f\xe8TJ#\x982v\x87\xc6$d\x81\xb31\xa4\xa9h0\v\x1a\x98Y!}=\xb2\x9en\xefb\xd3J0\xacd\xfe\x88N݊\x9b\x0fT\xd5l_9V9\xfe\xcaJk\xda\xc2\x0f\x99\xbem\x84\xa1\xa3{\x1e\\n.ӡ\xb7>A\x97B0\xa2\xd7f\x84s\xd5f\x1f\xc3X\n|,c\xa5\x17:\xea\xd1k;\x9cu>Cv\x9c\xde\xc6\xd0F\x9dގ\xeasZL\x19\xf4\xaa\xe2\x94W\xf5\u007f\x00T\v\xe1\xb6\x00\x00\x00x\x9cc`d```a<=\xe1|Ed<\xbf\xcdW\x06nv\x06\x10\xb8b|\xd6\bF\xff\xff\xff\x9f\x81\x93\x91\r\xc4\xe5``b\x00\xea\x00\x00d#\v\xd7\x00x\x9cc`d``c\xf8\xcf\xc0\xc0\xc0\xc9\xf0\x1f\b8\x19\x19\x80\"Ȁi+\x00{\n\x05\xce\x00x\x9c\x8dVKk\x14A\x10\xaey\xf4<\x8c\x9b,\x86\x155\x04VIL\x94,\x8a\xa8\xe8E\xe6\xb0\x1e\xbd\x88\x1e\f\x88\"\xe2E\"\x82'sj\xfc\x19\xfe\x0f\xc1\xa3\xbfJ\xbc\xadU3U=ߴ\x93\xacK>\xaa\xbb\xba\xba\xdeՓ\xcc\xd3g\xe2_\xfa\x92(\xf9ET\xd2\u007f\xe1u\xc1\xb4\xf0=O\xd6\x02'{?\x99Law\x18\xae\xe3]+t\xcfw\xef\x99\xcc\x18\xe4^\xde\xe9nD.\xd3}k\xdb\xf7zՇ\v\xce\xfc\x04\x99\x1c쯍U}ɩ\xa7\x18o9\xe4\x9d:\xf4\x1d\u038b\x94\x12\xf6\xe5;\xe3\xf8\xac\xd8FШ\x9e\a\x82\xb2\xe7O\x9c\x0f\xb9;\xc5\xdcX\x0e\x14S\x17\xd5B\xe5\x8e[x\x88\xa3\xcbe#2U\x94o\xcb\x03ا\xccC\x1e\xfa\x9a\x84\xb8\x91\x9a\xaf\xae??✼\t9\xb2Xz{\x12w\x8a>\x9f\tO3\x8d\xdbE\xb5\x9f*\xfd\xc2\xfcDe\xf2\xb8\x97\x18[\x03\xbf=픖wE\xad:s\xade\xea\xa9I5o\xc6ÞR݇\xd8G\x9c\xaf\xc4\xf2\x85=SB\xfcP\xbb\x06s\x12\xce|W\x1f\x8d+\xf8Ⱥ\x16\x8c\t\xd7\xe0\x99\x80}[0\xc2\xdel\xe4]\x8d1V\xcb\xf5\xb0\xa7\xa3~\x81ٴ\xb3F\xe7o\xc2\xfb\x85\xdeM\xd9\xc7\xd4r\xa2\xf4\xad\xe4\x89\xf1\x8e\xef;\x01\xcb'\x85\xfa\xc2\xf2\x13\x9bO^gL\xf7\xc6\xea\xady\xb9h\xb3o\xbc\xc4\x0f\xf2\xfd\xd0\xf8l7\x13\xac\x9b/\xa8\xdd\xfd\xec\x1bӌr\xa7q3}\x04=vC\xc0\xfc\x16\x85\xc1C\xaf\x13\xedH\x0fF=\xbc\x11ǡv\x97\xed\f\xf1\x9f@\xf3i\xf3lr\xe1.\xfbr\xa44\xbcC\xa5\xf2\xb4\x0e\xf3үV\xf8\xa6\xb2\xecldV¬\x8aL\x05\xfe[\xbde\xf6\xebN\xfe\x04\xdf\xe90WԿ\x0f\xe5o\xba\x15ϓ\xfaios\x1bW\x8dwz:\xadz\xfe\xdc\xeaQ\xaf\xa9Y\x84\x03\xf3Y\xfd\x9f3\xb6\xc1\xc6R\xfdy\xcc\xebK \x87>?\xe1\xf3+#\xefB\x8c\xab\x8c\xf7|\xfeJ\xfd\xbe\xadzj\xa6\a\xb5\xfa\x1e\x83\xe56\x05\xf8]@\xbdUD-\xbfP\x87v\xcd>n໌u\xc0;\x83\xb5\xd6W\xf7\xdb\x05\xe8\xd4\x1eO\xad\xaf\xe0\xbdMeFY\xbeг\x94\xd7\xed\\\xd8l@\x9d\x83\xae*\xf2!\xee\x89\xea\x0f\xbd\xa8u?\x96'\xebm\x8c\xbb\x80\xf3\x92\xce\xef\r\xcc'\xe6\xb2\xfc18\v\xfd\xc8\xf6>\xb4w\u007f\xf6\xfaC\xfcÚ\\f\xb9M\xa6\xbbc}\xa1\xef\xf8~5\xce\u007f\x1e\xf9\xf7\x14l\xcd\xcd\x17\x88mo,.\xd5}\x9d\xf7\x1fY\xef\xa1\xf2\xb3r\xa8[\xd6K\x9d\u007f\xe9\xc7\xccf\\\xf5\ay\xb7\xa2\xfdB\xbfG\x0e\xedy\xda\xc2\x1e\xb1o\x95\x9e\xef\xd7C[\xb3\xa8\xbf\xfe\xe9\r\xe0\xef\xda\xdd|\x04\xf0\xbfE\x12\xcfE@\n\xbd\xee\xe9\xae\xe4\\}\xbc\x13d<\xdd\x14z\xde\xef/\xf5\n|\xf1x\x9c\xa5\x96{T\xcfg\x1c\xc7\xdf\xcf\xe3N.\xb9\x86\x10\x1ai\xcdB\x91d\x8a\x10b!\xe3\x10\x8b\xb93\xb3i\x9bM\x86\x89e\x8c$\u05f94\x97\xadM\xc8=\xe4\x1e'4r\x0f\xb9\x87\x90i\xae!\xece\xff\xf8\u007f\xeb\x9c\xf7\xf9\xfe\xbe\xcf\xf3\xb9\xbc\xdf\xef\xcf\xf3}Nҿ\u007f\x1e\xff\x011\x92\xa9\b\x16H6\x02dH\x85\x82A\x9eT8T*\xea\n\xaeH\xc5GJ%\xc6\x02\xf6K\xb2^\xca\r\x9c\x92\x1c\xa2\xa4\xd2\x03\xa52\tRY\xde\xcb\xf1\xeeHY\xc7\xc5Ryr*УB\xa6Tq\"(\x90*ѯ\xb2\x97T\xa5\x9c\xe4D\x9eS\xbaTu\xb4T-\b\xc4I\xd5\xe9\xe7\xccz\r\xf2j\x16\ap\xaaE/\x97\x19\x00N\xb5\xe3\xa5:\x9eR]\x17ɕ\x18W\xb8\xd5\v\x94\xeagKn\xf4l\x007w\xf2\xdcS\x90G\x0f\x8fG\xd2{\xf4o\xe8\x0fx\xbe\x1f\x0e\xd8\xf3D\xb3\xe7J\xa9\x11=\x1bé\t=\xbd\xe0\xe5Ż7\xb5\xbd\xe1\xeb\x9d,5\xe5w\xd30@N386C\xa7\x8f\x03\xa0\x8e\xcf&\xa99^5\xe7\xe9;\x14\xe4J-\xf6H~\xe8i\t>\xf0\x03\xf0j\xc5^+z\xfb\x93\xefO\x9d\x00\xf8\aP\xbbu/\x90/\xb5\xa1w\x1b\xb8\aR+\x90\xf8\xb6\xec\xb5\xe3\xbd=q\xed\xb3\xa4 \xeav@\u007fG\x1f\xa9S\xa2\x14LLgr\xba\xa0\xbf\v<\xbb\xe0\xfb\x87IR\b\x9cB\xe0\xd7\x15\x1d]\xf1\xa9\x1b<\xbb1\x83\xee\xc4ug\xbe\xa1\xec\xf7\xa0fO|\xecE\xdd\xde\xf8\xd4\a_\xfaP;\f\xaeap\xe9K\\?\xfc\xeeG\x8f\x8f\xa9\x11\x8e\x8e\x01\xe4\x0f\xc0ǁ\x85\x01\\\x06\x85\x00\xce\xc1\xe0Ti\b5\x87\xd0s\x18܇\xa1}8\xb3\x18A\xdf\x11p\x1a\t\xb7O\xa9?\x8a\xfc\xcf\xd8\x1f\xcd\xd9\xf8\x1cϿ\xa0\xf7\x18\xceR\x04\xf3\x89 \xf7Kr\xc6Q'\x92s\x13\x89?\xe3Y\x1fO\xdcw\xd1\xd2\x04\xe61\x91\xb5IN\x00\x9e\x93\xf10\x8a\xd9EQ\u007f\n\xb9S\xe09\x15\x8d?\xd0'\x1a\xee\xd3\xe00\x9d\xfc\x19i\xd2O\xc4\xcfdo\x1691\xcc1\x86\xbdٜ\x8fX\xf8Ų\x16\v\x9fX\xd6b9\x97s\xe8?\x87\x9c84\xc6Q+\x0e\x8f\xe6\xc2\u007f\x1e\xe7q>\xf3_\xc0\xac\x16:K\x8bຈ\xf9\xfcL\xaf\xc5\xf8\xb3\x84zK\xd9[\x8aw˘Y<\xfb\xbf\xe0\xcfr4/G\xc3\nf\xb6\x02\x9e+\x99\xd7*\xea$p\xd6V\xe3{\"\xb5\x12\xf1r\r\xefkr\xa4\xb5\xf4Z\x87\xc6u\xcc1\tnI\x9c\xeb\xf5x\xb4\x9e\xefc\x03\xdc7\xf0\x1dl\x80\xdfFzmd\x16\x9b\x98\xcbf\xfc\xdaL\xdd-\xd4ڂ\x1f[9\x87[\xe1\x9dL\xde6\xe2\xb7\xc1i{\xfa[\xec\x80G\n\x9aw\xa2o\x17:wSo\x0f3܇\x1f\xfb\xf0j?\xfcR镊\xdf\a\xf0\xf0\x00:\x0f\xe2\u007f\x1ag&\r>\x87\xe8u\x88:\x87\xa9s\x04\xbeGXK\x87˟\xc4\x1c\xa5\xe7Qt\x1c\x83\u007f\x06\xb5\x8e\xa3\xff8\xf3;\x81\xd6\x13\xde\xe7S\xeb\x19g\xe29\xbd^г\x80o\xa5\x00\x8e/\xd1\xf7\x12\xde/\xe1\xff\nͯX{]\\F\x15e\x8al\x92)\xfaH\xa6X\xbeL\xf1\f\x99\x12\x03eJ\x96\x03\vdJ9\xc98\x14\x06+eJ{Ȕ\xe1*.\x1b-\xe3\xc8o\xc7x\x99\xf2\xe92\x15|@6\xd7t\x8cL%7@l\xe5^\xa0@\xa6\xca\x1e\x19\xa7(\x99\xaace\xaaE\xcaT\x0f\x95q>%S\xc3\x1f\xf0\xacIN-\xea\xd7bυ\xbc\xda\xc4\xd7!\xb6.\xdcꎔqeϕ\x1e\xf5\x87ʸ\xe5ȸ\a\xcbxP\xa3!\xcfF\x11\x00ލ\xaf\xc84\xf1\x04I2^\t2ެ7%\xa6\x99\xab\fw\xa1i\x1e$\xe3\x8b\x1e\xdf<\x99\x16\xf4\xf3\x83\x8f_\xa6L+8\xfa;\xcb\x04гu\x9aL\x1b\x10\xb8X\xa6-\xf1\xed@\xfb\xd12A<;\xc0\xa7\xa3\v@c'8\a\xa3\xbb3\xbetAC\b\xe0.3\xdd\xe0\xd0=P&\x94\xb8\x1ep\xfb(\x1c\x10ۓ\x1e\xbd\xbc\x001\xbd\xd1\xd2\x1b\xef\xfa\xe0o\x1f\xe2\xc3\xd0\xdc\x17\x1e\xfd\xd8\v\x8f\x93\xe9O\xaf\xfe)2\x03\xe0\xf9\ty\x03\x13e\x06\xa1e0ڇd\xc9\feN\xc3\xc2d\x86\xc3g\x14\x1aF\xd3{\fu\xbeB\xdb\xd7p\x1f\x8b\xb6o\xa8\xff\xed\f\x99q\xe4D\xf2\x1c\x8f>\xee*3\x81\xbc\t\xccs\x023\x9e\x88\xaf\x93\xa8\xfb=\xf1\x93\xe16\x99\xfd(\xf2\xa7\xe0\xdfT~G\xb37\x8d\xdc\x1f\x99\xeb\xf47\x80\xdfL4\xcd\xc4\xdbY\xf8\x1aC\xbfٜ\x9b9\xe4\xc7\U0005c2ee\xb9\xccz\x1e\xb5\xe7\x13\xbb\x10]\x8b\xa8\xb7\x98\xb8%\xccq\t\x1a\x97\xb2\xb6\fϖ1\xc3\xf8T\x99\xe5\xcce\x05\xbdW\xa2e\x15}\u007f\x9d(\xf3\x1b=\x12\xe0\xcb\x1dd\x12r\xdf\xe2w\xbc\xf8\x83s\xb5\x1aoWs\x16\x12\xf1e\r\\\xd6\xf2\xbe\x16\xbd\xeb迎\xf7$\xfcH\xe2}\v\x1enEc2\xdepϘ\xed\xeco\xc7\xdf\x1d\x9c\x87\x1d\xe8K\x81S\n}w\xd2o\xd7\x1b\xb0\xb6\x9bZ{\xf0\u007f/\x1c\xf7\xc2o?9\xfb\x99w*z\x0e\xa0\xf9 \xfd\x0f\xc2%\rއ\xc0a\xfa\x1ca/\x1d\xcdG\xe1|\x8c\xfa\x19\xf4<\xcelO0\xab\x93!\x80\xbd\xd3\xcc\xe9\f\xbd\xcer\x96\xce\xe2Q&\xe7\xf5<\xfc/P3\v\\\xa4\x16w\x85\xb9D\xbd\xcbp\xb9\x8a\x0f\xd7\xc8ˆ\xc7\r\xf6n\xfa\xc9܂\xd7-\xf4\xe5\xc0?\x873u\x9b>w\xe8y\x87\xdfwᘋ\x8f\xb9ɀ\xda\xf7\xa8u\x1f}\xf7є\x87\x86<\xfc\xfa\x1bm\x0f\xe0\U000d0f07\xf8\xff\x98\xbaO\xf8~\x9fp\xee\x9f\xc2\xed)>\xe5\xc3\xef\x19k\xcfy\u007f\x81g\x05\xc4\x14\xa0\x85{ü\xe4,\xbc\xa2Ǜ\xfb\xe2u\x86\xac\xf1\x92\xb5β\x85\x03\x00\x1d(\x01M\x00x\x9c\x95\x93\xdfj\x13A\x14ƿݤMk\xa4`\xd1R\xbc\x90AD\xc1\x8bݴ\x94\x16\x827\xdb?\xe9Mhb\b\xa5W\xea6;I\x96&\xbbav\x92\x90k_@\xf0\x05\xc4+\x1f@\xbc\x17\xbc\xf4U\x04\x1f\xc1o'c\x13\xb1BMH\xe67g\xe6\xfc\xf9\xce\xd9\x05\xb0\xed<\x85\x83\xf9\xc7\xc7\x1b\xcb\x0e\xca\xf8d\xd9E\t\xdf,\x17p\x0f?-\x17Qv\x1eZ^\xc1\xa6S\xb7\xbcJ\xfb\xd4r\t/\xddg\x96\xd7p\xd7}oy\x1dw\xdc/\x96\xcbx\xe0\xfe\xb0\xbc\x81G\x85\x80Y\x9c\xe2:w\xafLƜ\x1dl\xe1\x9de\x97\xb7>[.\xe01\xbe[.b\xcbq-\xaf\xe0\tu\xcdy\x95\xf6זK\xf8輵\xbc\x86mwfy\x1d\xf7\xdd\x0f\x96\xcbx\xee~\xb5\xbc\x81\x17\x85\x02\x8e\x90b\x84\x19\x14b\xf4Ї\x86\xc01BL I\xa7\xa4\x04\x11\xcf\x05vQ\xc1\x0e\xf6\xe1\x91\x03\f\xf8\x15K^\x99\xd9I\xae\x92k\xee\x1d\xf1&\x8e\xd2\xd1LŽ\xbe\x16\xc7\xe1D\x8a\xd30\x89fb\xb7\xb2\xb3\xef\x89`0\x10\xe6(\x13JfRMdD\x87\x1a\xebI\x18/\xc0\xd4DK1\xe4\x8aZ\x9a\xe8`*\xb3t\xc8M\x8b\x96\x1eƬ d.\xb4do<\bU\xee\xdb\xc0\x19ڨ\xd3\xfb\x10U\xeeڴ\x9d\xe0\x02Mr\x8b;\xd4\x1ag\xedzpXm\xb4k'\x17\xcdF\xab}\xbb\x8c\xe7FUF\xb5\xf9]\x81=j;௲\xd4\x17\x9cK\x95\xc5i\"\xf6\xbc\x03\xafbD\xde.x\x93B$\xa5d\xa6\xe5y\x13\xbb&\x9d\xa0_j\xfe\xfb\xe6\xe4\xa6Q\xe5>\x1d\xd2\xefº\\ՒO\xd7\xe6\xcf-\x8a9\"Z\x87\xa6mW\xb4\x85\xb4j\x13\xef\x92\xed\\DI\xb8滎\xa9\x99Si\x0ed\x98IΩ+\x95Щ\xd0})\x16\xa3\xcddG\xe7»\xa92']\xaa\x13Z\x85\x91\x1c\x86\xeaJ\x84Z\xab\xf8rl\xae$\xa9\x8e;2\xb3\x83V\xa6\xb2\xbfz\xa3\xb4\xb8n\xceM\xcf\"\x16\xcf\x12L\x1f4\xfbR\xe5+\xee_\xeb\r\xff\x88\xe9\x19e\xe8k=\xaa\xfa~^^8\x8f\xef\xc5\xe9\xffD\xf09\xa9yW\x12\xd3y\xff\x1f1\xfd\x01E&\x99\xf4\xf1\vϋ\xd8\x11x\x9c}W\x05t\xe3ȲuU\x99b'\x19X\xa6\xb7̔ؖ\x9c,O`\x99\x99\xbd\xb2ݶ5\x96-\x8d 0\xcb\xcc\xcc\xcc̏\x99\xf61\xbf}\xcc̰\x8f\x99\xaa\xa4\xf6L\xe6\xfcs~N\xd2$ݾ\xdd}oW))L\xfd\xbf?\xf8\x1a\x17\x90\xc2\x14\xa5nJ]\x9f\xba.uc\xea\x96ԭ\xa9\x1bR\xb7\xa5n\x06\x04\x824d \v9\xc8\xc3\x10\x14\xa0\b\xc30\x02\xa3\xb0\f\x96\xc3\nX\t\x1b\xc1ư\tl\n\x9b\xc1\xe6\xb0\x05l\t[\xc1ְ\r\xbc\t\xb6\x85\xed`{\xd8\x01v\x84\x9d`g\xd8\x05v\x85\xdd`w\xd8\x03\xf6\x84\xbd`o\xd8\a\xf6\x851\x18\x87\x12\x94\xa1\x02\x06\x98P\x85\t\x98\x84\xfd`\u007f8\x00\x0e\x84\x83\xe0`8\x04V\xc1\x14L\xc3\f\xcc¡p\x18\x1c\x0eG\xc0\x91p\x14\x1c\r\xc7\xc0\xb1p\x1c\x1c\x0f'\xc0\x89p\x12\x9c\f\xa7\xc0\xa9p\x1a\x9c\x0eg\xc0\x99p\x16\x9c\r\xe7\xc0\xb9P\x83\xf3\xc0\x82zj4\xf5Fj\x04\x1a\xd0\x04\x05-hC\alX\r]p\xa0\a}p\xc1\x835\xe0C\x00!D0\a\xf3\xb0\x00\x8b\xb0\x16·\v\xe0B\xb8\b.\x86K\xe0R\xb8\f.\x87+\xe0J\xb8\n\xae\x86k\xe0Z\xb8\x0e\xae\x87\x1b\xe0F\xb8\tn\x86[\xe0V\xb8\rn\x87;\xe0N\xb8\v\xee\x86{\xe0^\xb8\x0f\xee\x87\a\xe0Ax\b\x1e\x86G\xe0Qx\f\x1e\x87'\xe0Ix\n\x9e\x86g\xe0Yx\x0e\x9e\x87\x17\xe0Ex\t^\x86W\xe0Ux3\xbc\x05\xde\no\x83\xb7\xc3;\xe0\x9d\xf0.x7\xbc\a\xde\v\xef\x83\xf7\xc3\a\xe0\x83\xf0!\xf80\xbc\x06\x1f\x81\x8f\xc2\xc7\xe0\xe3\xf0\t\xf8$|\n>\r\x9f\x81\xcf\xc2\xe7\xe0\xf3\xf0\x05\xf8\"\xbc\x0e_\x82/\xc3W\xe0\xab\xf05\xf8:|\x03\xbe\t߂o\xc3w\xe0\xbb\xf0=\xf8>\xfc\x00~\b?\x82\x1f\xc3O\xe0\xa7\xf03\xf89\xfc\x02~\t\xbf\x82_\xc3o\xe0\xb7\xf0\x06\xfc\x0e~\x0f\u007f\x80?\u009f\xe0\xcf\xf0\x17\xf8+\xfc\r\xfe\x0e\xff\x80\u007f¿\xe0\xdf\xf0\x1f\xf8/\xa6\x10\x10\x910\x8d\x19\xccb\x0e\xf3\xa9\x1dp\b\vX\xc4a\x1c\xc1Q\\\x86\xcbq\x05\xaečpc\xdc\x047\xc5\xcdps\xdc\x02\xb7ĭpk\xdc\x06߄\xdb\xe2v\xb8=\xee\x80;\xe2N\xb83\ue0bb\xe2n\xb8;\xee\x81{\xe2^\xb87\xee\x83\xfb\xe2\x18\x8ec\t\xcbXA\x03M\xac\xe2\x04N\xe2~\xb8?\x1e\x80\a\xe2Ax0\x1e\x82\xabp\n\xa7q\x06g\xf1P<\f\x0f\xc7#\xf0H<\n\x8f\xc6c\xf0X<\x0e\x8f\xc7\x13\xf0D<)\xf5:\x9e\x8c\xa7\xe0\xa9x\x1a\x9e\x8eg\xe0\x99x\x16\x9e\x8d\xe7\xe0\xb9X\xc3\xf3\xd0\xc2:6\xb0\x89\n[\xd8\xc6\x0eڸ\x1a\xbb\xe8`\x0f\xfb袇k\xd0\xc7\x00C\x8cp\x0e\xe7q\x01\x17q-\x9e\x8f\x17\xe0\x85x\x11^\x8c\x97\xe0\xa5x\x19^\x8eW\xe0\x95x\x15^\x8d\xd7\xe0\xb5x\x1d^\x8f7\xe0\x8dx\x13ތ\xb7\xe0\xadx\x1bގw\xe0\x9dx\x17ލ\xf7\xe0\xbdx\x1fޏ\x0f\xe0\x83\xf8\x10>\x8c\x8f\xe0\xa3\xf8\x18>\x8eO\xe0\x93\xf8\x14>\x8d\xcf\xe0\xb3\xf8\x1c>\x8f/\xe0\x8b\xf8\x12\xbe\x8c\xaf\xe0\xab\xf8f|\v\xbe\x15߆o\xc7w\xe0;\xf1]\xf8n|\x0f\xbe\x17߇\xef\xc7\x0f\xe0\a\xf1C\xf8a|\r?\x82\x1fŏ\xe1\xc7\xf1\x13\xf8I\xfc\x14~\x1a?\x83\x9f\xc5\xcf\xe1\xe7\xf1\v\xf8E|\x1d\xbf\x84_Ư\xe0W\xf1k\xf8u\xfc\x06~\x13\xbf\x85\xdf\xc6\xef\xe0w\xf1{\xf8}\xfc\x01\xfe\x10\u007f\x84?Ɵ\xe0O\xf1g\xf8s\xfc\x05\xfe\x12\u007f\x85\xbf\xc6\xdf\xe0o\xf1\r\xfc\x1d\xfe\x1e\xff\x80\u007f\xc4?\xe1\x9f\xf1/\xf8W\xfc\x1b\xfe\x1d\xff\x81\xff\xc4\u007f\xe1\xbf\xf1?\xf8_J\x11\x10\x12Q\x9a2\x94\xa5\x1c\xe5i\x88\nT\xa4a\x1a\xa1QZF\xcbi\x05\xad\xa4\x8dhcڄ6\xa5\xcdhsڂ\xb6\xa4\xadhkچ\xdeD\xdb\xd2v\xb4=\xed@;\xd2N\xb43\xedB\xbb\xd2n\xb4;\xedA{\xd2^\xb47\xedC\xfb\xd2\x18\x8dS\x89\xcaT!\x83L\xaa\xd2\x04M\xd2~\xb4?\x1d@\a\xd2At0\x1dB\xabh\x8a\xa6i\x86f\xe9P:\x8c\x0e\xa7#\xe8H:\x8a\x8e\xa6c\xe8X:\x8e\x8e\xa7\x13\xe8D:\x89N\xa6S\xe8T:\x8dN\xa73\xe8L:\x8bΦs\xe8\\\xaa\xd1ydQ\x9d\x1a\xd4$E-jS\x87lZM]r\xa8G}rɣ5\xe4S@!E4G\xf3\xb4@\x8b\xb4\x96Χ\v\xe8B\xba\x88.\xa6K\xe8R\xba\x8c.\xa7+\xe8J\xba\x8a\xae\xa6k\xe8Z\xba\x8e\xae\xa7\x1b\xe8F\xba\x89n\xa6[\xe8V\xba\x8dn\xa7;\xe8N\xba\x8b\xee\xa6{\xe8^\xba\x8f\xee\xa7\a\xe8Az\x88\x1e\xa6G\xe8Qz\x8c\x1e\xa7'\xe8Iz\x8a\x9e\xa6g\xe8Yz\x8e\x9e\xa7\x17\xe8Ez\x89^\xa6W\xe8\xd5\xd4\x1d\x99\xb6c\x05A\xa6\x17\x05v#\x1b(\xcbot\xf2\xaa?\xa7\x1c\xd7S\x99\x0e\xf7\xc3t\x10Z~A\x8a\x9a\xeay\xe1b:\n\x94\x9fn\xd9N/\x1fvj\x8e\xe5\xb7\x15\x86\x9d\x9c\xb4\xed D\xb7\x9b\xf5UϝS\xb9\xb5\xae۫\xd9\xfd|\\\xbbQHn\xab\x95\r\xecv\xdfr\xa8\xe1\xb63\xa1o\x05\x9dt\xc7\xed\xa9<Ϧj\x96\x13\xa6C\xbb\xa7Ҿk5\x87\x9b\xee|\xdf\xe1\x86\f\xe7\a\x9dl\xe4I\x95\xb1\xfbuw\xa1\xe89\xd6b\xada\xfb\rG1\xa7\xa7\xac0竖\xaf\x82N^\x96\x12O踍n\xba\xe5X\xed\x02o\xa6\xe9uܾ\n\ns\xae\x13\xf5T\x8d\xd7S\xd4M!\x18\xd2\xed\xc8ˮ\xf1\x1bnS\xe5\xeaV\\Sh\xb5\xd3\xfc\x17\xa4\xeb\xae\xdb\xcdKѳ\xfcn\xc6\xf3\xed~\x98mX=\xe5[\xe9\x96\xdb\x0f\xf9\xb9\xd3\xccڡ\xe5؍b\xa8\x16\xc2ZG\xd9\xedNX\x88\xdb\xf3v3\xec\x14\xf8Y\xbb_sT+\x1cN\x9a\r\xd5\x0f\x95_L:\xbe\xbc>\x92\xb4WGAh\xb7\x16Ӳ\x97\xa2\xddo\xf2{\tN\xb7\xe3wG[VCɩ\xd5\xe6\xec\xa6rs\x9e\xdd\b#_e=\xd5o\xd8N\xa1gy5Y\xab\xf2\xb3VS&\xe4\x13\xe6u\xaa\xa6\x1df\x82\x8e\xe5\xabL\xa3\xa3\xf8\x84D\xb0\x91 T^\xadn5\xba\xf3\x96\xdf\x1ciY|\x84\x83^~\xd0Hˡg<\x8bM\xc0\xc6p\xbd\\\xcb\xf5e|8~}Љgҝ\x8cZ\xad\x1a\xe10\xf3\xcc\xf9n\xb2\xf3\x91A'\xde\u0090\xe7DAM\x8cQ\xe8\xd9}\xdd,&&\x8a\xdb9\xb7\x1b\xd7#k\"\xc5G\xc28\xe9\r\xd9\xfd\x96\x9b\xc0\x82\x86\xafT?\xe8\xb8ሆ%\xae\x18b`\xd2*ԭ\xfe\xa0i\xf9\xbe;\x1f\xaf\xa3\x984\xe3U\xe4\x93v\xe4\xe9\xe7\xb1#\xe2#\x12\x1f\xf1r\x02{\xad\xaa\xb5\"\xc7\x19\xd6\xed\xa0g9\xcer\xb5\xd0p\xac\x9e\xb5nY\xe9\xb6\xddb\xdb)\xab\xc5w\xc4Wy\xb5\xc8Fc5\x86\xa4\xd1p\xdc@\r\xf3\xa9\xf4\xed~;~=\xc3\xe7\xd9W\xf9\x86\xe5\xa8~\xd3\xf2\xb3\xbe\xd5o\xba\xbd\\\xc3\xed\xf5X\xe3l\xcfj\xf7UX\x18\x9cW\xe4\xad;GY\x1f\xdb=\x9cW*\x1c\xe1\xad{\x9eL\xd9\xe0\v;\xdcb\x17*?!+\xea\x8e,a\x99^\xf8\x9c\xf2C\x9b\x19W\xe8~\xc7\xf5\xed\xb5l_\xcb\x19b\xc7\xd7\x1a\x1d\x99$\x9c\xb7C\xf6er\xf0b2\xb1}\xdc\x1bN\x1c_crߥ\xaeZL\xf3m\x0e\xf2z\xc9\xc1H؉z\xf5\x80\xd7*\a\xb7L\xf7d\xb9\xd2\x1f\x8a\x03I\xc7rZ\xc58\xba$1%'\xf3r\x88\x18q\xec~\x97͙\x1ce\u038b\x82\x0eok\x84o\x8f\xf29l\xd4\xe4q\x1cB\xec~\x96ɽ\xceb\xb1m3C=\xf1A\x12\x1d\x84&\xe3\xb0\x0f\xf8p\xe5\xbe\x17c\x8b'D\xa3\x83˛t\v\xf1\v\t\x99\xdep~\xb0\xd7l2s6\xeaK\f)\xb2\xc5\xf8\xd2\xc8\x017\xc9\x0f\x02\xea4\xf9R\xb0\x1b\xf8\xf0\xfa\xe9\xbar\x9cbC\x8e\xb5\xc5\a\x1b\xaaB\x87e\xd4\ue39b\xe2\xb6\\܊\xbcdD\x0edE\xe2\xc8\xdazG\xae\xdc`$\x9e`\xd9\x06C\x91\xb7!H\xa6\xe1\x18\xee\xd6Uv\xde\xe7;\xdfɄV\xd0\r\xb2\x1cQy3Cu\xdfV\xad\x86\x15\xa8\x8287\xb9'\x99\xb6\xefF^Z\xce2\xc3\x1e\x89\x9aٺ\xb28BP#\nYJ\x8fO\xc5\xf2b\xff\xd8^:\xb0\xe6TAΧVg\xa3v\xd9q\xae\xcf~\xc2\xc8A\xd7\xe1\x88\xe1\xdb]\x15vx\xc2vg(\xe2\xb8\xe4\xf3\xb4\x8a\xd7PwT\x86\xcdk78\xccG\x8d\xee\x10\xcb\xc8\xeb\xe1\xeb;\xba\xae\x15\x1f\xfb\xf2\xb6\xeb\xb6y7\xebb@q\xc9@\x865T\x8b\x05>s\x15\xc6;\xcd'M\xbe\xa4I#\xbe\xc4I3>+\xbe7\x1c\xc2\xfbA:p}\xb6\x1a\x17\xc9=\x89[|y\x06\x99-N*\x03\xaf\xa5y\xdd.\x1b\xa6\xcd\xfeorJ\xaa\xbb\xacqQ\xdbY\xde\x1c\x1eX;\xce(\x1c\xe3C\xf6k\xa88\xb6\xe6\xd9\xdb>koqD\xe4\x98Wpd\x115\xb6E=\xcfq\x81un\xab\xd1\xf8\x88k\x83\f6\x9ct\x13\xa7\xe6$\x95\xd6z\xcd\"cÎ\x1b\xf0\xe1\xab|\x10١(\x96\x17S\tc\xb6\xc1\x89J)\xce0.Geɔq:\x91-\xd4#\xdb\xe1\x1d\xb4\xf3\f\xf6$\xef\fY=f\xb7\xfa\r\x95\xed\xa9f\xd7\x0e\x8b-Y\x12\xb3\xacV\xbct\xc5y\xa0\x93\x84\xa9\xd6XK\xadh\xbaQ]\xacԗ\x13\x8f\xfd\xb7\xc1H\xe2\xbf\r\x86\xd8\u007f\x1b\xf4e_\x85\xf5\xf8\xe2\x12`~\x80(\xac\u007f5\xd7TA\x97\xd3Fֱ<\xa9b\xa3\x84\xc3=\xb7.\xfb\x8ao\xe3\xb0\xf6w\xec\xb7\u009a\xc8\r\xf5\xd4I3љw\xdb\xef\xf3f\x92w3\x9c\xfd\x9dł\x0e\x05|0˗\x86\xc08\f-\t\x83\xd2/\xa8\x05Ona\xa2.\v\xe8%\xefe\x82\x1e/$\xd3\xe2\xabէ\x9e\xea\xe4\xda\x1c\xeb<\xab\x99\xe70\x17\xfb\"/\xdf\x12\xf2\xe6h܈C\v\xbb\xb9\x99\xe73\xe6\xece9i\xf9b\x18\x8a\x17į9\xcb\xd6\xc5;\x1d\x808\x98$\xc9\"\xbe\xbf\xe9\x06G\xb1!\x81H\xba\xecJ\xb0aW\xa6k\xa5\xeadqIf)\x06\x11\xdfH\xbe\xbe\xb6Ƕ\x8e\xeaI\x8b_\x9b(\x0f{\xd1ڵrv\xb6j(N\xa02\xa1\x1c\xe3\xe8\xfaf-\xfe\xf0\xea\xd8\xcai\x8e\x0e\x12M\xb2\x9a\x15\x92\xa2j\xec&\xf6Pd\a\x1d>Q\x9f\x83\x9d\x92ij\xd0hr\x80\xd2\xd9&\x18|\xb4\xac\xdc`D\a\xa8\xa5C\x12\xa0\x96\xf6\xe3\x00\xd5\t{\x8e\x91n\x04A9\xcb\xde\xe4\x90YH\xa2\xaa61G&Ύ\x1b\xb1\xdfm/\xb0\x83%\tiź\xb1A\xd2J\xd7\xcac\xe5\xa1\xf8\xd3O\xe6\xcf\xf2 \xafwt\xfd\x97C\x9c\xae\x93\x90\x1f\x0f\xe6\x1dŗ^l\x984b\xc7&\xcf\xe3ψ8\xac\xc7W\xa2V\x1e/\x15\x92\x94\x1fg\x04\xbe\xf6|\xad%\xb3%\x06Y\xef\x14\xb6\xae\xbc]%\x15\xf9Ԯ{\x14\x05M\xb2\xfb>\xad\xf6\x16ɏ\xea\xd4\xf5\xe7\xa9\x1e6\xe43Y\r\xad\xbb\xb3\xcb\xe38T\x17cx\x1d\xab\xce7\xb2V.M\xae\\7\x1ar8\xadG\xa1\n6\xfd\xbfC\xb2\xad\x91\xc1p\x1c\x83WlЋcS\xad\\\xaeHa\f/r6\x8d\xeaz#\xba\x93^`\x99\x87\x16\x06\x9f\x1e\xebޑ\xc3\xcc5\xd9,\xfcQ\xcd!\x9d\xbf\xf4\x06\xc1\x8b\xbf\xb1\xb8\xdf\xf6\xad^\xb6\xc5ߴ]\x9f\xac&\x87\x8e\xf1\xea\xf8h\xdd\x0e\xeb\x91\x1c\xbd\x96\x81#\xa1\xe3\x17\x93*\x1eZ\xe6\xb8L\xb4>K\x8d,\xe9G\xdeҧ\xe2\xab\xe5K\xfa\xc9\x15\x9f\xe7\xcf\\w>\xc8\xf15\xf5]\xbb\x99\xe1\x8b\x11-\xf02\xed\xba䖠\xbb\xe8qRs#?X\x13\xb1b\xfc9\xc0Vq\xb3-\x0eˎJK!\t<\xb4=\n\"\x91\xd64s\xf2ύ=\xa7\xa8\x1e\xb5q\xae\x9b\x99Wv\xdd\xe5\u007f\x1c\xfa\xfc\xcb/TK\xa3\xf1\xdek\x83\xcd\xcbXe\x93dI\x83\x9c\xeb$9G\x1e\x99\xa3M7\\\xf2@\xc6&\x86\xe7\xf8S\x9c\xbfJ\xe35\xf1\xc8\xc4\xd8H\x92\xd9⁚+C%)\xcaR\x88V\x13\x86\x14\xa6\x14U)&\xa4\x98\xccE}\xfb\xd0\xf1Uc|\xd6\xd68\x8fL\nh\xb2,]\x01M\nhR@\x93\x02\x9a\x14\xd0\xe4d\xbaV\x19\x8b\x11ui\x95\xa4(KQIf\x9b\x1a\x97\x8e)EU\x8a\t)\x044>&\x85<\x1d\x17и\x80\xc6+R\x18R\bb\\\x10\xe3\x82\x18\xd7k\x9b\x1eӵ\xe0J\x82+\t\xae$\xb8\x92\xe0J\x82+\t\xae$\xb8\x920\x95\x85\xa9,\x88\xb2 ʂ(\xeb\xe5\xcd\xe8\tg\xc6u\x1d\xbf!в\xa6\x9c1tm\xeaZ&\xaf\xc8\x1c\x15a\xad\bkEX+\xf1\x03\x81V4tV\x88\r!6dZC@\x86\x80\f\x01\x19\x022\x04d\bȐ\xa5\x9a\x820\x05a\n\xc2\x14\x84\xa9\x97zh\xfcL@f\x95ϻ\x15?\x13PU\x1eT\x05T\x15PU\x1eT\x85\xa6*4US^nHKh\xaa\x82\x98\x10Ą \xc4\x17\x15\xf1EE|Q\x11_T\xc4\x17\x15\xf1EE|Q\x99\x10Ĥ &\x05!\xa6\xa8L\nb\xb2\x92n\x95b\x19\xd9\x14܊\x1f\bBLa\xb0)\xb8\x18\x97\xa2$EY\x8a\x8a\x14\x86\x14\xa6\x14U)&\xa4\x98\xcc\xcc)\x0e\x9b\xdc\x14K\x182\x97!\x960\xc4\x12\x86X\xc2\x10K\x18b\tC,a\x8c\vIIHJ\x82\x103\x18b\x06C\xcc`\x88\x19\f1\x83!f0\xc4\f\x86\x98\xc1\x103\x18b\x06C\xcc`\x88\x19\f\t_FY\x10eA\x94\x05!\x1e0ʂ\xa8\b\xa2\"\x88\x8a DzC\xa47DzC\xa47DzC\xa47*\x820\x04!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa6 LA\x88\xe8\x86)\bS\x10,z\xab\xc4\b.\x04\xc1\xa2sK\x10\"\xba!\xa2\x1bUAT\x05!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba1)\b\x89\x04\x86D\x02C\"\x81\xc1\xa2\xb7JU\x15۴41\xa6kƙ\"\xbd)қ:\x1e\x94&\f]\x9b2X\x95bB\n\xe63\xc5K\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfef)\xb9\x96\xa5Uz\x85\xab\xc6u]\xd2uY\xd7z\xa9\xab\xf4RW\x99\xba\xae\xeazB׃\xf9V\xe9zJ\xd7Ӻ\x9e\xd1\xf5lROi\xde)\xcd;\xa5y\xa74\xef\x94\xe6\x9dҼS\x9awJ\xf3Ni\xde)\xcd;\xa5y\xa74\xef\x94\xe6\x9dҼS\x9aW\a\xcdҴ\xe6\x9dּӚwZ\xf3Nk\xdei\xcd;\xady\xa75\xef\xb4\xe6\x9dּӚwZ\xf3Nk\xdeiͫckI\xc7\xd6Ҍ\xe6\x9dѼ3\x9aWGؒ\x8e\xb0\xa5\x19\xcd;\xa3yg4\xef\x8c\xe6\x9dѼ3\x9awF\xf3\xceh\xdeY\xcd;\xabyg5\xef\xac\xe6\x9dռ\xb3\x9awV\xf3ΊS&5\xe9\xac&\x9dդ\xb3\x9atV\x93\xcej\xd2\xd9\xd9\xff\x01\xba\t\a\x8c\x00\x00\x00"), + Content: string("wOFF\x00\x01\x00\x00\x00\x01~\xe8\x00\r\x00\x00\x00\x02\x86\xac\x00\x04\x00\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FFTM\x00\x00\x010\x00\x00\x00\x1c\x00\x00\x00\x1ck\xbeG\xb9GDEF\x00\x00\x01L\x00\x00\x00\x1f\x00\x00\x00 \x02\xf0\x00\x04OS/2\x00\x00\x01l\x00\x00\x00>\x00\x00\x00`\x882z@cmap\x00\x00\x01\xac\x00\x00\x01i\x00\x00\x02\xf2\n\xbf:\u007fgasp\x00\x00\x03\x18\x00\x00\x00\b\x00\x00\x00\b\xff\xff\x00\x03glyf\x00\x00\x03 \x00\x01_y\x00\x02L\xbc\x8f\xf7\xaeMhead\x00\x01b\x9c\x00\x00\x003\x00\x00\x006\x10\x89\xe5-hhea\x00\x01b\xd0\x00\x00\x00\x1f\x00\x00\x00$\x0f\x03\n\xb5hmtx\x00\x01b\xf0\x00\x00\x02\xf4\x00\x00\n\xf0Ey\x18\x85loca\x00\x01e\xe4\x00\x00\a\x16\x00\x00\v\x10\x02\xf5\xa2\\maxp\x00\x01l\xfc\x00\x00\x00\x1f\x00\x00\x00 \x03,\x02\x1cname\x00\x01m\x1c\x00\x00\x02D\x00\x00\x04\x86㗋\xacpost\x00\x01o`\x00\x00\x0f\x85\x00\x00\x1au\xaf\x8f\x9b\xa1\x00\x00\x00\x01\x00\x00\x00\x00\xcc=\xa2\xcf\x00\x00\x00\x00\xcbO<0\x00\x00\x00\x00\xd41h\xb9x\x9cc`d``\xe0\x03b\t\x06\x10`b`d`d:\x04$Y\xc0<\x06\x00\f\xb8\x00\xf7\x00x\x9cc`f\xcbd\x9c\xc0\xc0\xca\xc0\xc0\xd2\xc3b\xcc\xc0\xc0\xd0\x06\xa1\x99\x8a\x19\x18\x18\xbb\x18\xf0\x80\x82ʢb\x06\a\x06\x85\xaf\fl\f\xff\x81|6\x06F\x900#\x92\x12\x05\x06F\x00\xd0\xcb\bn\x00\x00x\x9c͒\xdfJ\xe2q\x10\xc5\xe7gje\xe6\xf9>\xc0\"\xea\x03D\xbd\x80\xc8>\x80\b{\xd3E\x88O >\x81\xf8\x04\xe2\x13\x88\x97\x1b,\"\xd1u\xc8^\xec\xa5\b[[[\xf9\xc3\xddj\xfbos\xa6\xf5\xd6_\xbfM\xe8\xa2\xeb%:0g80\xcc\a\x86\x11\x91\x05\x99\xd7\a\xf1B\x17\xef.L\xdes\x8ezðפ 1Y\x97\x8clKWv\xe5\x9b\x1ces\xb9t\xae\xa2)Mk^\x8bZֵ֪\xa9m\xed\xea\x8e\x0e\xd4\u05c9Θb\x9ak̳\xc82\xab\xac\xb3\xc96\xbb\xdc\xe3\x80>'\x9cY\xcaҖ\xb7\xa2\x95\xadjukZۺ\xb6g\x03\xf3m2\x95 \b\xc9\x19\xf9\xfc\x8a(\xea4\xab\x05-iEk\xdaЖv\xb4\xa7}\x1d\xeaX\x95B\xc7\f\xd7Y`\x89\x15\xd6\xd8`\x8b\x1d\xf6\xd8\xe7\x90c\xaa\x899\xcbZ\xc1JV\xb1\x9a5\xace\x1d\xebY߆6\xfeG\f\u0382\xad`3\xf8\x14|\f6\xfc\xab\xd1\xfd\xe8\x8b[uI\x97p\xcbn\xc9-\xba\xb8\x8b\xb9\xa8[p\x11L\xf1\x17\x8f0\x10\x8a\aLp\x8f;\xdc\xe2\x06\u05f8\xc2%\xfe\xe0\x02\xe78\xc3o\xfc\xc2\x18>F8\xc5\t\x8e\xf1\x13G8\xc4\x0f\x1c`\x1f\xdfW\xbfί\xfd\xb6\xf2\xe2\xf2\x82\xf5\"\xa1E^\x0f\xcc_\xe1=(\x1eK,F\x93K\xcb+\xffy\xef\x13b\xf9\xc3\xf3\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02x\x9c\xbc\xbd\t\x80TՕ0\xfc\xee\xbdo\xa9}{\xb5uuuwUWի\xean\xe8njmz-\x9a\x9dnv\x04\x04\xc4\x16E\x91EAA\x10\x17J!*\x88\x1b(\xe2\xdehD\xc92c\x16\xf3%F\x9cʦ\x93Eb\x12b6\xbf\xf9\xda$&\x99\xb8\x8c\x93\xe47\x11\xba\x1e߹\xf7UUW7\r\xe8\xcc\xfc\x1ft\xbdw\xf7\xf5\xdc{\xcf9\xf7\x9c\xf38\xccm\xe68b\x13\xe1\xc1I\x1c\x97\tڃ\xc4\x1e\xb4\x0f\xa1\xbc\x9a\u074c\a7\v\x81S\x9bE\xee\x14G\xff!\xee\x923\x9c\xf8\x8c\x90\xe3j\xc0㔐=\x18w;\xc5P\xb0^I\xa6\x13A;RR\xc9n\x94\b\xc6k\x91\xf8LS\xe1.\x94\xf5)\x8ao8G\x9f([\xb8\xab)\x1c\xf3\b9O,,\xcc\bAt\x81S\x92\n\xfc\x11\x0e\xefh\ny\xaau\xbajZ\a\aupPG\x13x\xecN\v\xaeo\xc6\xc9n\x9c\x88{\xec\xc2ho2\x9dA\xe9D\xdc-r\xd3\xd6]\xb5\xe2\xaau\xd3\xe05\xf1\xeae\x85\xd1^\xa5\x96dM\xb6X\x9b\x108=\x18\x9f\xd7\xe4r5ͻ\x02^Q\\\xf5~\xa1\xa32\x80\xbcV\x970 \x8eo\xe30kC\x0e\xda qA跍\v\xd0\x1f\x82\xae\xd6G\x11<\xc2\n\xb69\xd2\xe1\x00\xefv\xb8`\x18\xdc|N\xfdX\xbdW\xfd\x18I\xe8:\"\xf5'\xd3a\xf5\xd8W\u07baO=}\xfc\xdak\x8f#\x01\xd5\"\xe1\xf8\xb57\xa3e\x11\f\t\x90\xa4%Vs\xc9~\x05-\xbdy$ŵ\xc7\xd5\xd3\xf7\xbd\xf5\x15\xf5X\x84\xce\x06w&'q\x02\xc7\xf9\xb8.n.\xc7E\xec\xa2\xc4K\x16\xdc\x04#\x80\xa2JD\x89ڝn\x18봽\x137\x13\x98\x03\xd1\xe5\xf4\xb8=\xb5|\a\x8ew\x93L:Ӎ2vmrRv:=0P\xb9@D\xfdۓ\x89\xec\xa6V\x84Z7e\x13O\xaa\u007f\x8b\x04d\xb3\x907\xcbH\x10M\xbaSY\xb3|\xf0[o\x88\xed\xf5\x99f'B\xce\xe6L}\xbb\xf8Ʒҗ\xe4V\xf7\x9e\xca\xf6\xae^\xdd+\xe4{W\a\b\x17\xae=\xb1\xa7\xa9uҤ֦='j\xc3\x05\xce,\xcb|\f;\xf4v\x9dA\x90\xcd\xcfo=\xfc\xac0\xc9\x17q8\"\xbeI³\x87\x9b\x1e\x188\x9d\xa7\xb9yZ\x866Ǵo9\xce\xcfq<\fi3\x9f\x82\x16\xc6k\xb1\xa7\x9b\xc0\x84\xd21%\x8f&\x1d\x85\xfb\r\xa1\xfe\xce\x16u\xa8\xfb\xb6k\x17\x84\xc3\v\xae\xbd\xad{H}\xa7\xf0@\u0381W\xe8\u0097^q\xefԷ\xfe\xd14;\x1b\x0egg7\xfd\xe3\xad\xff\xfdN\xe1y\xad\xec/\xc2\xdc\rq\xf5\x1a\x8c\xcaP\x1c\x9d\xb7\x88\x00O\x00ЌL\xc14\x13\x91\xd3q\x8f,\xc0\x98\xf8ԇ\x96\"\x97Sv\xa9=j\x0fL\xa8\v/U\x1f\xacjC\x1f\xbd-w\xcao\xa3\x8f\xdaȍn\x9f\xfa\xa4j\x92̮\x1a\xd3{\xef\x99j\\\xa2\x05\xfd\r\xad\xa9vE\xf4\xb3\xd1k\r\r\xea\xe4\xd9z\xba>p\xb9n=\x85^=\x8a\x18ajID(\xb5\xe3\xdc\xcd\u0de0\xb8\xba\xe2\xf8qu\x05\x8a\xcfF;э\xe85֮\x86s7\v;QC7\xbaU\xbd\xbd[\xfd\x85\xba\xf2\xb5\u05c8\xa1\xd4\xcc\xf8yZIۘ\x13\xe8ػ\xe8*\x8e\x14!$\t\x03\xef\x0edⵄ\xb3\x89\x01Ŗ\x0e\b\xdc-ˇ?\xb7\xfc\x16{\xf3\xccm\xfd\xbb\xd1\xc6\xdd\xfd\xdbf6\xdb\xcfpo\xab\xdf~\xfbmԽw\xd3\xe3\x8fo\xba\xe8\xe1G6M\xcf\xe5\xa6oz\xe4a\xf2--\xfcm\x18\a#]?\x12]?V\xae\x8ek\xe1z\xb8\xf9ܥܵ\xdc.\xee>\xee)\xee\x9f9NH%\x95&T/\xd6 \xa7\xbb\x03\x01\b_\xc0\x8f\xecI\x85Ax\x11\xe4\xd1\xd8\xf8O\x99\xfeB\xf5\x8d]8(\xa7\xf8\xd8.v\x8e\a\xcf)\xbe\x02G=\x04\x9e\xc3\xdcH\x8cP\x91S\xcdU\xa6\xbaP\x99\xb0\xe4>f\x8bF\x84E\x93-G\xa1G\xc7s\x16|\x98\x15\xac\xd2'?\x12~z\xc4I*\x93\xa8\xe3\x96R\xe1|\xe9\x14\xab[`\v\x96\xa7\xc0-V\xce'ݙG\x8dP\x15\x1a3b\x17\x88'\\\u007fR\xe5\x92\xfd\xfdI̞#n\x92;W\f\xe6\xe8\x96ٟD\xf4\x89\u007fT\xe1\x19\xfeѹb8\xb60\xd9^s6,rȥ\xb5\xaa\vi\xad\xb2\x8f\xf1\x8f\x8d\xff\x9f\xf6\x8f\xad\x0fsm15\x1fkk\x8b\xa1,}\x8e\xb8q\xae\xd2Wȝ;\ue4e7\xact\xa3\x00s\xd2\a\xfae\xd9Y\x18q\x92qC/\x98\xa0\xa20\x00\xa1q\xe7\xe2\u007f|\x16>\xf9\xa8\n\x103\xcc\xc2\b\x84\x9d\xe6\xce\x1dW\xe9\xfe/\x8eը\xa1\x80s\xeaF\xce\"\xde\xc9\u007f\x99s\x83\x0f\xce\aI\xacoAHI\xf6 8\x11\xf4\xf0\xa8C\xe2\x9d\xfe\u0084\xbb\xfc\v\xfcw\xa9\x87\xfc~\xea@\n\xbe\x9f\xfa\xc9_\x16\xb0(\xff]h=\xf5\xfb\xfd\xea\xaf\xf0\x03\xe0\x85r\xaf9\xf3\x81\xe0\xe0\x0fp!\x8e\v;\xadH\xac\x8f\xea\x11-[If\xf4\xa3\xcbw;%=\x12\x1c\xacd\xf5\xd7꯵\x92\x90\x02\xaebmH)\x96\xfek\b=o\xac\xbf\\\x8a\x86\xbbh\xfbE\b\xce\xc1i\xda\f7i\x0f:-!mn:`[\x86G\xdc]\x83\xe0\xecGE,\x8b;\x17\x96\xc5s\xb2yH6\x03\x8a2\x04\xe8ƈs\x14\xee\u0557:\x17\ue147\xce\xcaI\x9d\u007f\xa8@\xc8^\\\xdfw\x0e\x84\xac\xb2OV\xceõ\x9e\x05\xb5\x9f\xac\xfd\x85<\xad\x15g?]\xabY{?qK\x8bg\xbcH\x97[\x03\x97\xa2X\x10\x16\xf9\x00\xb4&\x95td\xd2n\x8f[\x94,\xd0\xfaZ\xc0\x13!H\x896#\xc0\x15=n\aݳ\xb5\x1d\x9a\xe2\xd4;O\xa8\xbfW\xffU\xfd\xfd\x89\x9dG\x0e4]]\x17\xb06\xaeٰp\xdf\xf17\x8e\xef[\xb8aM\xa35P\xb7\xbe\xf1\xc0\x91B\xae\u007f]?\xfc\xe1\xdc\xe34\xe5\xce\x13\xc8\xff\xf8\xd7P呂\xa5\xa9\xf1\xea\xc0\x9c7o\\\a\xc9!\u05fa\x1bߜ\x13\xb8\xba\xb1\xc9\x12ؤ\xbe\x82\xe7\x14\xd8\x06\x8d\xd9\x06\r\xff\x842>8\xb2/p\x912\xb8h@\x12\xb1k~ھ\xf1\xfc\xe8B~\xcea\xc9[\x1c\xec\x81r\x9f\xce=Pr8\xaeS\x99\x13e\xe1\xf9\x97\x02sc\xeaF\xd7\rӗ\x85\xd0 \xf4\x97S\xcc#P\xcf\xc8|0z\xe2\x1a\xf0'\x95z\xd1\xe9\x8eS\b\x82\xf5)\xc1\x8c8aFB\xb0FE\t\xfe\xd3V\xc3r\x8dJ\x14\x90\x94(E\x13\x01\x97\x87\xa0fD\a\x03\x16p\xa6\x14\x9a\x80U\x9c\x06\\\x9f\xf5\x10\x16\xb4'\x03h4P\x01\x14\x85\xb6 \t\x82j\x01\xee\x0e\x9dd3}Cv\x86f\x19\xf4\xd5\xf7\xbbM\x96}\x13Zlf\xa9\xe6\xdf,.\xe4\x9f\xd4p\x8f\xc1j1\xde\x1a\x95t\xd6Y\x8ej\xcb\xff2\xdblƗ,U\xb1\xa9\x06\xbd\xef\x01\xb7\xd9<:\xf1\xbdz\xab\xd9t[\x98%\xf6Y!1v\xd3\x1a\x0e\xa1M\xfffrc\u007f:\x12_n\xf2\x19\"\xf7\xea7z\xacw\xc5\xfdv\xf3\xd7m\xae\rz\xe3ui\x83\xd9dt\xad\xac\x8aO\xaa\xc6.3K\xdb\xdcu\xe2\x04\xba\f=\x8d.#Cj\x19n(,\x14THu\xa0\x98\x03_Z\x99\xf4\xc4\t6\x8fq\xc0\x97\xe6\xc1\xf6h\ah\xe7P\x8a4#J\xa6H\xc4%jt\x8e3\x04\xd4M\x14\x82)\xb5#\x11\x11\xa8\x9dz\xd8\x18\x10\x85\xdcz\xba\xb9\xb0dt\xe7\b\xd11Dn~\x99\x179\xcd/\x99\x9dȋ\x1c\xa6\xbf\x99\x1c\xf8\xa3\xe6B\xd6\xec@N\bV?\x84p'r\x98\v\xd9f\x1f:\xa2\v;\xd1b\b\xb1B\xc8QHb\x85$h\xb13\xacCG|\xd8\xcf#v2\xa9y\xded\xb3\x01m)\x9b\x11e\x03\x98\xcf\xc0sv\xba\x9bw\xca~٬\xed\x9bfp\x9e~\xaf\xbbDG\x88\x14\t\xb4r\x11\xae\v0\x94\xe2^Xzˣ\xa6\xdd\xe3\x8e\xf7\xd0Շ\xdc\x12\xc5c\x90\x92\xa1l&\r \\\xf6`\\\xd08HHa\xaf\xa3\x00\x0e\fIC?\xb9\xb3\xfd\xf1\xf6\xbb\xd0\x1b\xb16\xf5\x9b\xf6:5\xebH;\xd4l\x9d\xddވ\x804C\x94\xf8\xe2\x1a\x8f&\xb5\\\xf4\x0f\x05F\xf0\xbe\xbb\xda\xe0\x0f\xdb\x1bjԬ,\xa3|MC\x14\xe5\x19ݔ\xad\x80\x15/\x17f8\x80\xb3ܮ2\xa8\xb8\xec\t\xd8.\x8a\xc0ҍl\n_\x01/\xfc\x80A\xfd\x96\xd1kT\xf3V\x9dΝg\v\a\xfe~T\x86\x99\x03\a\u0382\x1a<`2\xa9\xdf\xd2\xebQ\xd6&;\x19\xdcX\xd4A\a\x8eW@\xda\xf1\xb3@g\x9c\xb6j{\x9c\xb6\x19j,\b\x8a\t\xa2s\xb7uuE\v\r\xa8\a\x9a\x8d\xb2֟\x9e\xb7\xa9\x0f:\xd5A\xb6\xc9\r8,&\x13\xea\xd1\xebռ\r}|\x9e\xa6b\x06\x13\x14\x050\xb3\x95\x1flFQ\x12$px\x05=\xc1\xc8\b4ddm7\xf6\xc8nr\x06u\"\x82N\x16:O\xc2\vu^\x8a\xb2x@\U0005d08d\xaa\xea\x03C\xcaG\xb2\xbe\x94\xe1\x83*\x9c%F\x8c>Tm\xf0\xca?\xad\xd62.\xe4o\xbb\xbbp\xac\xaa\xbe\xbe\xaa\xf0ˮ\x8a1\xb2r\xd5\\T\xc3\xc3١K+L\xc3\u061cc\xd9\xf3\x83\x81\u0090\xd5n\xb3\x05\x02\xc1:\x1c8\xef\xa2\xc7\xcf\xceq\xa8y\xbdN\x8e\xe0\\Dv\xc8j\xfe\x87\xe7[\xf5\xa8ܦDy/\x8a*=H\t\xd5[0\xe0l\x898=\xef\xe3\xf4`\x97D\xbe\x8cd&\xe2<\x9c\xfd\x80\xdaq\x14R\x1b\xed\xf6\xba}\x0f~\xbf\x84|m?9[\xb2Y\r{\xf5H\xb7I\xfd\xc1\x17FP\xb5\x83H\xdep;@\xb8\xc0\xa9Y\x9f\x12\x8b\xd6\xee\xdb[D\xf1\xd6]j\xc0\xfa}\xba*Þ\ahJԆ\xfc'v^\xbb\xf66XD\x95\xf8L\x98\x9b\xc9V\x01\xe6\x82\xf5a@XF\xf6k\xa0<\xe0\x98\x8d\x97\x91\x93\xd2\xc2N\xb2\xae\x94\xf1\x9c.\xe4\xe0\x82\xac\xedpV\xff\x11e\xd5u\xea\a\a\xd4\xff\xd8p\x9b\x9c\xa4\xd3\x05+O\xde;\xf3\xab\x97\xdd\xf1\xa7\x19\xc6F\x00G\xb3\\E\xfb\a\xa1нb\xe0kfy\nz\x14\xc9\a\x90s\xc3\xed\x90\r\r\tX\xfd\x9b\xfa\x95k\xae\xbcM֊P\x92\xf2\xde\xdeY\xb7_g\xbf\xc2#\x13\x99f\x87\x90}{\xb5\x00\xb3\x84Lh.tMV((\xea\xce\xc9/\xe0\xd0\x18\x8c4u\x01\xffX\xba4u\x01\xbf<\x86k%\x9fŅ\xd2\b\x81s=x\x88\x1ff\x1e\xc2Ȍ\xf1ݐ\xe8\x14\xf3P\xae\xef(\xbe.\x1a(\x17\xf7\xd7q\\\x85\xf1\x02+\xa2\x13\x84\xb9\x87i}\xfc\xdcJ\x86/[\xe3\xbc\xc6O\xaf\xa3k\xa5\xce\xd5\xfe\xde76\xbct\xab\x12O\xef\xbad\xb1٧\b\xdc,崅v\x9c\xff\x8b2+\xd5\u05f7\xad TU[\xb6NHN8\xa0W|\xf8\x0f\x01\x8f\xa5fG{\x87ܘlT\x18\xdd_\xe2\xa5\xf5\xd1\x16Z1 \xfe\xae\xd18j\r\xfc`A\xa4\x92\x18\xb6\x1a\xecr\xd6\xd1㼌\x9a\x95`\fh\x04\f\xbd*\x12\x98b\xae\xd3\xf9\r\xf7\xde\xe5#\xd8\xe8\xcc\x1b\xea\xa7ռ\xa0\xfeB\xfd\xb2\xfa\x8b\x17j\xa6\xd5\xdf0s$n\xf9^\xf77\x9c\x9dw\f\xa1$\xeaGɡ;\xf0\xbe\xa3\x0fN\n.\xde\x10\x18A>\x033;M\x97\xaey\x10\x89\x8f?\xae\x9ezpͥ\xa6Ι\x81\x11\xa44\xb0aqp҃G\x1fF\xde\xd7w\xee|]\xfd\x93֯\x00\xe1\xf8!\xc0\xe1ؾ\x05\xc7b\x19v\xe1\xa0q\x138\xabe\xf5+\xea)\xb6\x0f\x8bh.,U~\xf04]\xe1h.\x84P4s\xae\xb6\x06)\xbc\x04\xf8\x1c+k\xe2\xf8\xa5q\xdaD2\xc6u\xb2\x99\xb0\xeb\x03ϸu\xa0\xdcE3\fV\x9f⭯\xf7ҟ\xe2\xb3\x1af\x8cS\xb1\xea8\xbc\xdb/D\xaa]5\xae\xaa\x96ޖ*xWG\x84j\x06\xba\xb0\xdf}\x03\xe6l&k\xcflnçi\x13\x1c\xa9\xc5Pv'\x03\xf46#\xde\xc6\xc6\x01\x85\a\x80\xe8\xb0\xe1(%\xc8\xcb)>q\x8f\xd0E\x9f\xdbo6U+\xd16\xe7\x9cŋ\xe78ۢ\x8a\xcflޏ>\xa7\xfe\xcc\f`\x1a\x95\xea\xa4\xe6\xf0M\xfb\xf6\xdd\x14n\x06'\x8b\xfc\xd9'\x1f\x85\x8czB-t\b\x8a/ꬱ\xa6\x9f\xf9\xfa3ik\x8d3\n\xd0\xdf\xf155\xa9\xeeZ\t1a\x0fo\xe6\xab|+\x91\rőm\xa5\xaf\n\xbc\x9e0$Yə\x18\x91Oa\x9e\xde1\x1aag\x959\x0f\x9c\xb8up\xe2\xb7\xc09Gת+\x94\x92\xe1\x17\x84\x1fb\xb4\x8a=H߀\xee\xdbQ1\x1ch\xb7T\xc8\x1e\xb2\a]\x89\x14Ғ\xd8Q\x0e\xfe\x91\x1c\x90^\x94\xec\xa0?\xc2\xd1\xe7\x19\xae\x90\xe3s9\x1a\xad\xe6ػ\x00\xff\x05\xf8\xd1 \xc2\xd1l\xc3\b\xedB\xc5|4\x16\xe7T\x16N\xf9\xcc\x10\x88YB\x1aL\u007f\x1c\xbb\a,\x9d\rg\xf7#\xca5\x15\xfb\xd2A\xf9㉐=!\xff7~=\xf0/\x10X]W\xf7\x04\xfcuw\xdfZW\xd7\xc3\xfe\x9e\xe8避[\xd9\xdfꞞ\xe3\xabW\xd3d==B\xee\xd4m®\xffҏ\u038bv\xa6?$\xbc\xcb\xf6\xe8\x9a\n\x1eE\x11#\x02\n\xa2L\x89!7\xca\xc3\xe6ط\x9e\xbf!\xa2\xba\xa2\xc9T\xa4\x90RR\xfdI4\x98\xca)\xf8\x87\x11\xdeH#\xfb\xd4l*\xa2:#\x11\xfc\xa3H.\x85\x06\x93\xfd)\xa5\x90\x8e\x96pӇ\xa4\rźR\x17\xaaM\xd0B\x81\xfa\x83=\x91ƅ\x12\x9f\xa0\x15(ǂ\xc3͵\xe8\xcd\b\x8d˥\x86>A\xfb\x92,\xd0_\a\x99\xa02\xfc\x03%\xa55\x9bp\x06\xc0yn\x846/\xe1\xae\xe0\xb6\x02\xc4\x02Mb\xa1t\x17,\xe7L\x12֮\x92\xe9\xc6l\x19+\xf49\xd6\x01Q\xa2Gb]*\xe6\x93D\x0f;\xe6\x01\r\x8f\xba\x05\x91\xb9{PZ\x19!\xe5*\xfc\xe2U1\xb7\xfa\xbe|\xfd\x94\xe1\xb5s\xef\xf3{\xdd\"\x823\x11\x9b\\\xa2g\x82\x8e\b\x98\xf8\x89\xab\x91G\x12χy\xb9\x85G:\x8c-nQg7\xcb\xce`ԏ\x143\xfex\xce\x02\xb7\xfaAx\xe6%ÏU\x1b\x8d\x06\xef\x0e\xf2XMZ\x87&HX9\xfd>o\xb2\xe0\x01s\x15\xef\x02Ga\x10\x1c\xeb\xce\n\xe1\xeb'\xcf\x1a\xbe!\xbblü\xa9\x9d|\xb3EW-\x1a\x9d\xd5\x06e\x83b\x88\xe9\x8c\xf5bxs\xbd\xbeY0\x87\x04\xdf6E\x17\xd2\xeb\x9c>\x9d)\x12\x8cV\xb9\x91H\xf4\x9b\xe7\f߰}\xba\xd5V=\xa3\xceG~\xe3\x0eYk\xcbh\x8b\x9a/;\xb5\xbbۇ\x85\xe2\xbd0\x8a{4.\x00c\x83\xe9\x19\\h`\x01\xe75\xbf\xdf\xe3\nF\xa3A\xb9\xaa5\xa4\xceTg\x86[4\xbf\xcb#\xe4\xf4\xe6\xb6\xfaS\u007f\xafo3\xeb\x02\xe8yuy\x90\xfa\x05=\xf8\xf5\xa5\xbd<'j{\x91\th\xfeN\x8ek\xd06\x13\xc6\xf7\t\x96@1c/\xb2\xac5\f-T:\x9e\x8b`Y\xc7X\x14\x14]\x80\xddg\x18~\x83\xf4\xae\x85\xcfi\x84\xa8l\x1e\xd2p\x97!\xb3\xbce>\xe01x06\xe0?\xec\x8fe\xe7oA\x1c\xdds\xdab\x83\x05\x8d\xf6̪\x03fy\x90b3\x83@B\x0f\xce߂\x03\x94Yq\xd8?\x10;\xc3m)\xca\x01h4s\x90k\x80\x1eP\x91\v\xc0\xa3\x8b\xc8\xc0\b\x02UfW\x15\xf9\xd062\xfb\x83c\xc7>8F\x86(\xcat*G\x9fC\tym\ns\xa9\xb5r\xa2p\xd5\b?\x99\f\x1c\xa3I\xf1\xecC\xeb\x87Y:\x02ϻ&͜9\xe9\xae\xd39T\x96Y\x18\xe1-k\xb8\xdc\x02\x98%\x12\a\xc4)\xa3@\xed|FF\x1d\x88\x12h\x0e\x989*\x8a\x80(\x1fRt\xd5\x03\xc2\xcfK\x80\xf8ǻ\x85T\x12\x0e\xb7\x88\bXM-IP.%\x8d\x14C\"\xfe\xf9\xe7\x82?\x9e,+ˆ\u007f\x80=\xbd\xad\t\xc5\xf4>\xf2\xf6\xa5t\xe4\xf5\xe0\x81\x06\xeb\xd2\x1a\xa7U\xdeg\x15Q\x8f\x9a\xedW\xff\x1c\xe5w#\x8fΥ7\v\u074b\x90\xda\xed[\xeb\xefP\xfa\t\xc2\xed\xffޮ\x8b\x90\x05\xe4'j7\x8f\v\xc37̗\x8c\x069Z\x87\xd7\xe1\x93\x16I\r\xccS\x1f\xb9\xb4\xfe\u007f\xb7O4YkDE\x16\xec\xbc͂\x9aB~\x01\xce`\x83Ig;\xf2m\x82\xdb\xd5\xf7\xab\xdcu\x0e\xa0֢z\x87Sg)\xd2\xd1\xec\xecr\xc1\x0e\u007f\x19\xc7E܉\x80=\x19m\x06\xdaK\x82\xce9\xc5ZD\x18\xee\b]\xc34\x8c\xf5\xd9\xc9\x16~7߉R6Hۂ(\x89\x06\xc9j\x89\xcbi!\x12\x00\x0f\xbcBldpӜ^\xb4\xa3\xa1zz拾\xdbg\xfb\x11F:\xb1qꢝk\x12\xedWl\xed\x8d/С\xc2\xef\xb1u\u007fX2\x8a\x02r\xf3\xe1TsB\xe0נ\xdf\xef\xf6\xac\xf0\xcc\xf8\xccͫڂ\x13\x97t\xa7\x1e}}ƶ\xa7\x9e_5\xe1\x85\t\xeb\xd5k\xac\x014\xff\xba\xde\t\x9dA;oH\x9dL\xea\xb6Ϲ\x04\xbf)\xf9z\xb6.\x99qu\x87\xdf\x1c\xffA\xa2z\xbd\xafyx\xf3j\xdek5\xd5F\xfc-\xae\xb8@\xdelҙ\xf5\x02\x8f\x16c\x19\xf9ڗ\xdcҗ\\6\xb9=\xe0\r\xbd\xfa\xd0\x15O]9\xdd/\xba5ڔ\xa7볝\xe3\\tO\x83\xb5\xe8C\xd1T3\x8ef(i\n]\xa6w\v\x12\xf4P\xc4\xf0\xa4\x1ciQ\xaa\xa7\x9bw\x88γ\xdd=\u007fJ\xb5ߌv\xaeGޮy\xb2\x1c\xfc\xa7[\xda[\xd7\xde\xe3\x17,\xb5\xf7Et&Q\x8f\xabo\xb4c\xb7Â\x90\xfdyb66\x19k\xb6\xfa\xf7MK|\xfd\u058b$Y\xb6\x84z%\x9c\xc4\xc6P\x95\xd9(\x90\xab\xb0^\x10\xf48\x1a7D\xacrK\xb0\xdd\xfc`\xe1\xed%\xfa5\x8b.\xb2:\xf8\xea\t\x19\xe2Ď\x11x=\x05m\xae\xe6n\x81ً\xbb\xad\xdam\x18]\xcbЮ\x1e\xed&\x8c2G\x10\xa5\x01(-@\x97Q7\x06xu3\x10\x15%@\xc9p\xb4\x99\xd0~н\xd8\xe3t\xc0\x1c\x97\x00\x1c\xca\vS\x18\x86]\x82\x8e\x88=\x89)AG\xe1\x9c\x11\xba\x16\f\xd9\xed\xe2\x1bA\x87\xf3Vg;\xfc\x1c\xc1\x05\v*=\x1f\xff$mz\r\xe6-|_\x18E\xc4Z\xa3ˢk\xe4\x9d<\x16\xa25U5\xc4fF\xa2I\x96j\xb0\xfd\xf2\xf8\xbc\x80\x1e\xf1\x82`\x88=\x1f\x16H}\xbf\xfa\xfb)0\x93\xc4~\xf1F\xaf,\"\xcc\x13\xe3\xc3\xc1\x1dN\xb96\xe8k\xb4\xe4\"\xbe\xa7}\xf0\x17Ṓk\x98\xe3\xcfT\xc3\xfc\"$\x98\x8d\bm\x1eZPc\xe1',\xd1ϛ\x8etz\x82\x11\xe2\xf9\x85\x99Յ\xaf\x1e\xb1];+\xe8j\xb2\xc5\f\x16+\xc2NG\x02\xe9\xab\x03>K#\xbah-zp\xed6\\\xed\xf1;y\x93\xd7b\xde~\x15\xf69\xd0.m\x8c\t\xe3\a\\\xc6=\xc4qrq\x1cü\xc7=f\x10S\n\x1d\x146\x88u(\xe5\xa4\xcb\xe0\x1c\xe3؍\x93\x80\x033\x81\xb2\xd1#\x89\xa8\x98\x10\xbd0\x81\xe5\xd3\f\x03\x9d\n:\xddNz{\x02S\xa4\x00\x1eM\xe8]\"\xac\xc0`R\x81\xbc\v\xb5\xb1\x9d\x81.C\xdc\xf6\xa0\xa7r`-\x06\xbb\xd0U{낍\x8dz\x04\x8bn\xdcq\x95\xf4\x04\tt\xc4x\xe3\xc3\r\u007f\xb3ic+Ԛ:3Y\xde\xe7㳙N\x93\xd9*\x90a\x8e\bV\xf3\xd8P\x9e\x86\n\xbb`\xcc1\xe2Q\xa0b\xc8\xe7\xce@f\x11c^X\x989\x9c̼\xfa\xf4\xac\xf1\x87ܶ\xf5\x9f\xef\xfc\x02\x91jtҜY\vӂ\xa9\xdahھ\x8e\x8d\xf9\xa93\xd1\ti\xe2js\x91\xf4\x84\xa8+\\\x17\xc28T\x17v\x8d\x1b\xc8i|\xd7Q<\rv\xbb\xf6߹c\x978\xc5\xf71\x93\x16\x11\x8b\x92-\xa7\x99t\x89\xc0\x98\xab\x8a\xef\x14\xf3\x89\\1\x8e\xa5\xe4\xe1\x99\x1f\x116\xb9\xf2\x02\xce\xffG\xed\xd6\xc4\x13I\xae\xd8n\xe6\x13J\xd2:̇\xff\u007fh\xf7X\x19\x85\v\xf9G\xb7\xbbr\xb4+\xc7\xfa\xbf<\xd2\xffO\xda|a\xf7\xa7l\xf3yxuco\x8f\xed\x17\xf0\x8f\a7狿P\xdf\x11'\x9b\x19j{\x8e\x87\b\xf1\xa7\x98G\x00\xe4\xf7\x14w\xae\x98s\xb9\x87ʥ\xa1\xeb\xc7s\x0e\xff\xb5\xec\xe4\xc7\r\x1d?\x1b\xbb\x8b?kL5>4\xbd\xe7Hj\x12\xb7\x9fv4\xce\x1a\x9d\x9cl\xb6\xe8\xd5!\xbd\x1e\x05\xf4\x16\xb3,\x80\xffc\xd6C\x915\xe54{\xf2ٱ\xee\x914d\x88\x8aR\xd0\xec~\xfa\xb8p\xcf*;9n\x1f\x8b\xbc\u007f\x8d\x9fC%d\xfe\xbb}\x1c\xa0\x1dd\x9cA\v4Q8\xf6i\xbb\x88O\xf8i\t\x9a\xb8\b\xb8T\xfd\xa7\xe8\xa2\xc6gd\xf2\xc3ul\xfe\x18\x15U\xeaS\x89\xb8\xaeA\x88q\x99$.j6U;\xd4MǶ\x17\xb2ۏ\x1dێ\xf3ۏ\xa1\x83\x8ej\x939J\x99D\x8dvAF\a\x8f\x96b\x8em\u007f\x16\x1d\x00\x04\xbaLOI\x1a=`\xe1j\xb9f:\x92\x94>Iǁ\xacJ!\x18\xc8\n\x966T\xacxư\xb5qn\xf3\xe0\xe6̓\xfc\xe6S9\x94\x1dĀM|\xcc\xfa!ґ8X)\x05\xc9\xdbh\xc2ͅ\xbc\x9aͳ\xa4(\x00\x83\xc7\x06\x8c\x87,\x81ӌ\x95\xcd\xe7\x8b2\x8b\x80\xb7\xbf+l\xe0D\xa0\xf2\xaa\xb8\b\xc7\x053Qɕp\xa1$`\xe9\bPt\xa0[\x80\xf4\x86\xf6\xd9\x11 \x1f\x88\xb2\x81\x01\x13D\x1bV\xbe\xbb2\x87op\x1b\xa4\xc2o%x\xe2Z)\x8d\x06\x87\xf3\xea\x80\xf0n\xe4\xa8:p4\x9cN)\xefF Ն\x1c\x19t\xd3T\x067M\xf5\x03u`8\x8f\x06\xf1P*r\x14\r>\xab(\u007f\x8e\x16\xf1O^\x93\xfd\xf0\x8c\xe6tX\x10\xe5i(\x8c\xf1M4!\rt(\xa8>h\xeb\x99\xd5cU\x0f\x06\xd1\x04\xf4<\x9a@\x8a\xb2\x15ܦ\x19ç\x82\x8a\x12$\xe2\x8cM'\xd1\x04\xf5\xe4(\xb9\x12\x99J\x88׳\xbb\xaaQ\x17\xd4܃\xf4\xae\x89<8\xe6Vj\x80\xcfj7P\xf8?Ͼ;\xd4\xf8\xf5\x9c\x90\a\x9a\x87\xf2_\x81\xda!Q\xa5\x9e\xa1\xf5.h|:B\xef\xca)Ӓ\x00\x95\x13\a\x04\x8exܘs\xa2\x1a\xb7_\xe2\x81\xd6\xf3\x03d9\xfb\xd6\xf7aN=\xa9.WO.\x14\xb7\\|\x8d_\x1fO&t\xfek.\xde\".D\xb9p\x105\x053\x1e\x9b͓\t6\xa1`8\xd5\xd7\xf7\xe2I\x15\xfau\xf2\x81\xdb\xf5\xcf\xdc\xfd\xabKj\xeb\xebk/\xf9\xd5\xdd\xcf\xe8wi\xebU\xfc\a\xf4S\x04\x18\x9b\xccus\xb3\xa0U\xdalr\n̥;\x83\xe4ѠMe`\xacT\xb8\xa1\xf2B\x05\x96&\xa0\xfbn¦\\\x82\tg2pd\xc7\xd6\xc3[\a0\x17\xb0\xabO\xdb\x03v\xb4z\xe1\xb1\xed\xc3\f\xcaI\xb6'm%\xc44\xc9\xe2\xf0\xb8\x87\x19\x18\x12\x001}\xd6\x1a\x1b@\x81\u0080:įZ\xa5\x0e\xad\xf2/\x00r\x1d\r@1m\x038_.\xa7\xf0\xe3W\xb4R\xb6\x1f\xab\x92lv(F\x145A\x90ս\xb7\x9a\xa1\x14\x1b~]\x1d*@Qؿ\n\x05V\xf9\xa1\x94\x05\xe5\xf1g\xf7\xe4M܊\xb1\xb2\xb6\x93\xe2\x1a:M\x8f\xa7ʞQZ\xcc㖵\xfb\xcb.\x14\nH\xa2\xecf\xab\x9eJ\xd7wK\xf4\x86\x85I\aA\x97\x85\\\xa9\x8b\xdc\x19\xb3\xec\x9b\xdbf\x107\x97z\xe7\xf0\xfbl\xb2\xeb}5\xc7V\xff\xa0z\xfc\xfa\xed\x13\x89G\xc7\xdb\f\x06\xf7\xe4Ɛ\xe4\nu̻vߋ\xeb\aa\xcb\xf0ɰ\x93\xe3\x90Z(\xf5S6W\v\xbez\xbe\xd4\xcb7e\x83\xd9k\xd3\xe9\xd1[j\x0e\xf6\x8b\xc6\xfc\xee\xbd\xea\v\x1e#6[\xea\xaf\x1a\xd8\xd36i\xc9\xc0\x82\xc5Sڣn\xb6\xc1@\x92d\xa9\xef\xbb`\xae[\x98\xe4\xa0}\xbci\xa5]<{b\xe9N&k\xf7\xf1\xa3\xa5\x1cG\xba[\x9eQ\x83\x99\x88\xa3\xe7\xd4`\x16E\xe7\x1f\x87\u007f\xea\xed\xf5\xaa\x8b\xbc\xdek\xe0\x8d$|'\xbc\xae\xf1\xe2\xd5\xea\xb7GO\xa5\x01\x97\xa7R\x85\xa94\x10\x1d:\ty\xbd\xe8\x9fX\x06\xaf\xfa1d\xa5\x85hz3T\x1e\x9eʷL-\x9e3\x8c\xd5D\xd9G%\x01\x02\xc6Z\n\xba\x9cb锥\x9b3\xe3I\x95\xae陌R\x90^cy\x10,\xf73\x9c\x9c\x04\x1c\x15P!\xe6\xa4\x0f@\x8c\x00ieN\x19q좀FS'}@4\xa2шÏ~\xba\xf4\xf2\xe8\xda*\xf8\x00T\x0f(\xcd\xf8P\xd0\xec\xe8\x18Y+\x97=\x9d!?\x93}>\xb9Ю\xe7+\xa4\xe5\xf5\xc2\xf5\xb2\xc9w*\xeb3\xc9\xf8U\xbd\xa1\xb0\xa2\x84s\x03ƽ\u00a0\xaf\xd0\x0fi\x1a[\xfe9\xaaa\x89\xd2\x19\xb1\\\xdb\xd9u\xe2We\xdfY5\xb7\x9f\xa3\t\x90\xd8\xe4+\xb4\xb3\xb6\xec,\xf2\xbb\xaa\xc6iK\xb2\\\xf3\xe2ʚe\xf9<\xb5\xc1\xe8\x8e\x14\xcf\xfaz\xb3\xb0K\xd8C\xb5&\xf4Hd\xddbktݩ7<\xc1\xa0Gh\xf5\xe0\xcb\n\xb5f\xa7O\xc8\xfb\x9cfp\x85+d<\x8b8\xccY\xf2\xf8\xc2X\xd5\x1f\xae(\xf9ϴ\x00\x86s\x95>!;B\xf5TR@J\tvK\xf5\x9cU\x8b8\x8ab\x1aU\xceH^Q\x1b;O\xb9k\x9eb\x0f%\xd6[Q\x9aH\x87\x0e\x06\x88\xa7O\x99\x0e\x1f\f\x1d\x1d9谉\x8e\xa9\x01\xbf\xca\x1c0r\xf00\xf9\xf0\xab\x06}\xb9\xfc\x12\x9c\x9cU\xbe\xc7>\xfaʔV5^\x8d\xa3\xc1\xe4ܵ\x83\xe3\xe8\xc8\x00\xe1\xa3\x06}ecF\xad\x89\xd1m\x19ۈr\xed\x95\xf5\x8e\xaeqLEl\xbe\xa1\x06\x11\t\"\xc0I5\xc7\xc9ڦ\xc0f\x03U\xcc\b\xad\xc72\x02c\x14\xf6\x84W+\xa6\x05O,\r\xb1\xaf\xf0\aM\x16J\U0005d0676\x9e\x8f\x9ey\x94?*\xfc\x010&N\x8fݚ\xf4xq?\xa2\x1b)\u007f\xb0\xf0>\x96e\xf9(\x9d\t\x1f@\xf9\x1f\xc0qT\xe6\u007fVx\xbf\xf0>sjA\xf0\xa0i\xb42W@\x99W\x16\xcb\xea\xf0U\x83\xf3\xec\x10\xb4{L\xdbГ\xe7K^\fA'\xce96\x1e&\xe7E[\vh8\xa0\x95\xac\xad\x1e\xdaJ*\xb7X\xd1>\x81w\xac\x84yW\xd7\xfd\x16\x9e+\x1d\x0e\xb4\x9eV\x81\xeb\x1c\xc3c\xe5*\xeb\xfd\x0e\xa8Y\xbd\xfa\xb7P\xb5\xc3\x0f\x84\xcc!\x99\xa6\x9b3\xa6\r\x95\xf2^\xed\xdc\f\xc0\x98\xc7\xea\x8d%\x9b\x11\x10\a\"\x1b\xb3\xa2`\b\x9cɒ\x05\x95R\xc0\xf9\x9b\xe9\xe6\xc3cD@\xcb2\xe3ܵG\x97\xfd5g\xf5\xec\x91L6}*X\x9fl틵\xf6\\\xcd\"\x9b\x82\x81\xfa\xf6\xba*\x94\x1b\xd3\xfa\xc1\xb2p9\xfe\xa7\xe5\x87\x16\xfd\xdc\xeb\xb8B4M\xf3z\x93A\xa5\xd9\xed\xdf65L\xa3\xe5.\xd9\xe1\x9a\xd42\xa7k,0\x8c\xf4\x89\xd2^\xed\xa5>\xd9G@\x8f\xf1\xb9\xcb@H\xc6ty\x94\xc4\x1f\xe7\xb0\f\x94\x04Z\a4iepWt\x10\x9f\xd5\xf8A\b\xe4h,8\xd4<{9Ƚ\x83\xc5\x10Ƿƶw\x04\x0eZ\x98\xeeOY\x17\xa4\x19E\xcb<\x17\v\x92\x12\x14\x01\xa2\xfeZ\xe4)\xab\x89t#\x8d/\x03\xf1崐\xaf\\F7ʔ\xd3B>(\x83\xff\xe2&\xba\x906\x05\x8eld\xcbi\xe3\x91\xc0\xd8\x00t\xbd\xe2\xbb/\xf2\xee\x11\xe6=\xf2n\xe4>\x1a?&\x00s\xe7\xca]\x0e@\x13Ν\xbd\x180Z.3Ĥ\xd89M\xf1G\xd26\xc6\x1eX\x10I\xedJ\xa2H\x9dXa\xe5:\xd3\xe7\x92C\x9c}\xc0\xe03\xec\xdd\v\x8f\x03\x06\xfa6\x8c\xf1\xbf~>\xc9D\xf4\xfd\xf13\x95\xfdU\xe7\x17O>[vZ_\x81}ס\xe2\xa1qN!ʃ\xea\n\xba\xbc\u007f-\xcbW\xc2\xfb \xa2\x9b\xfc\x95\xf2\xce\xf3\nS\xfe\f\xf2\xc8Ha)Y\x16\x9a\xf7\xd4'l\xe7g8=\xe7`z\xc1\xc9(bwv\x02\x93\xab\x04\xa0\x82\x86i:2E\x8d\x1d!\xb0\xac`\xd9;x\xed\xf7\x0f,\x1d\xae\xc2\u007f\xbd\xf3Y \xa3\x85\xc0\xce\xd7\xd5ߩ\xff\xaa\xfe\x8e\n=\xc1\x96Іj^ǻ\x8f\xdcQ\xb0^\xbc\xec\xc0\x0f_\xc6\u007fYy`\xf8\xc1\xa7Q\x8f\xfa\xaa\xfa[&aY\x8b\xdaQ\ru\xd1s0{&\x05m胑*\xea\x0e\xb1\xd9\xd5\xf8j)\x8d\xb1\xc6T\xb2\x10C\xac\xa6$\vY\x14Q\x94>*\x86P\xd8\x16\x89\xe0\xbb\xe9}H\x9f\xa2\xa8\xbf\xc1\xf9\xe4\x14\x9c˥\xfa\xd4_\x877\x86\xfb!n?\x13Vا(s\x94\xf5\x90\xa0O\xc3GRB\xbeX\x9f\xc6\xdbbG/*\U000e8d09b\x14\xa1\x90\x8f\x14\xb6E\x93\x89(\x94\x8f\"\x85lrʔ$Ϋ\xbf\x81\xfa\x95dJ\xc1wGp6\x1d\xa1\xcd\xe8\x83\nP\xa4/\x05\xb5#\x05j\x87\f\x85mtC\xe7R0\xc6}B\x96j̣R\xc7\xcaX\x8fv\xf0\x17\xbbI\x11\x97>(\x89j=\xfd\x9a\x15\xc5:\x02E\xe1\xbbC\x99t\x84V\x97:O[h[5\xdc\"u\xe6E\xa83W\xd2\xf5.\rf\xb1[eܫ8\xb6P)\xede\n\x9e0Rԁ\x94\xfed.ُ\x14:~}\x11\x9c\x87\xb8\xadt<)\x8f\xa7/\x12Q\u007f\rc\xdd\xdfO\xe7B\x81\xbeGGp\xce<\x85\xf7\"-G\xe5\xa9-\x02\x1cb\u03a2\xaey3\x8eb\xe8\xab#\x98\xb0\x97\xe85\x95RPCk\x1e{d˚\xee\x90 ح6\x93d\xb2\x92]\xa9\xa7\xf1\xf7\x87\x80\xca\xc2\x1c\x01\xaaL\xa5d\x17\xe2Lu鋶\r\xae\xcdL\x13Cz\xabӮ\xf7\xc1IYs\xf4\xb5;\xd0A\x8a\x89@*n\xd4yڢ\xb5\xc4\xe3\x1e\xc1\xceKˏɩ\xb5\xa0\x12\xdeE\xb7\x17\x8d\xe9\xf6W\x83\xfa\xd5\xfbeM\x98\x16\xaa\xbf\x1f\xf5â\xbf\x8ex\xa8[\xfd*u\x1b\f\xa8\xff\xfe\xa2\x04-z\xdf\xc7җ\x85rizH>\x9b\xc9\xe2\xd2\f\x90\xde\xc72$\x95\xa2\f\x9f\xf9\xcc=\xc2_\x85\xeb\xb5\xf6\x9d\xab\x1d\xe7j7\x93{\x1b\xa7!\xe7h7Ύ\xdb\x10|p\xdcfs%9LA\xd3Q,\xae\xc72\xb0\x96WH\x19\x80(EEug\a\x98\xfe&\xd5/\xa1\n$̃\x06cm$0^(K_\xac\vC]D\xa3\xa1\xc6\xf0\x89i\xb9\xa7\x99\x98+\x9f/\x96TR\x12\xd5hOJ?\xa5\x98N\x8c\x15\x0e\xbe\xe8\x88ޛ j\xaa;\x13\xe1\f쁳\xcf#\x94\xdb\x1bISm0Q\x12\x84\x1f4W\xfb\xb2\xbe\xab\x9aՏ\x18\xa4\xab\x1f5_\x05\xfe\xeafd\x00\xa7\x16\x85\f\xda\"0\x14\xa3ԏ\xd0\x1f \xf8\x1a\x88~D}\x9d\xa9R'\x1e\x81\xf0k \xfe\xd1GK1(\xc1\xb4\xb3_/\xc7T\x9e\a\x94F\x99Ȥ8\x1d\xa5\x1d\u007f\xac\x0e>\x91\x93Q\x1a\x008\xaa\xac\x85\xe0\x16m\xcb.m\xf9\xf8\xcb\x0es\xde\xect\xc2Á\x1d\x06\x83\xe5-\x8b\xc1`wZ\xbea\x91\x85\xb1x\xc8\xe9\xffx\xc5\";ͯ\x98\x9d2\xba\x12o2\x89:\x9dh*\x1c4X\xad\xa5\xbb-hW\x963sn\xa0\x96\xe7P,ɞ\n\xba\xec\xae\"ޗ`7\xccNw8ɐ\xe7D\\\xd3\x1b\xab\xd4\t\xd3(,f鄝\xce\t\xcd\xf4I\xdcM\x06\xd5|؟\xf7\x87ն\xef\xdc\xeak\x82\x99ÿl\x8b5\xf9n\xf9v\f\xbd\x00x\x14L/L\xa7\x86M}\xfd\x92ݻ/\xd9Е\xcbum\xa0.\xf4u\x8b\xe3\xabm\xe8d>\xafNh\xab\xaa\xae&k\x8fԵ-h\x83\xbf\xba#\x83\x14\r+\xc1\x94\xa6q\xb8\xfb\xa5\xdds\x9f}v.\xbc\x1c\x1a\x9fL\xd2\xec8\xccc|\xe5P=/2\xfe,\xa0\xaeT\xe8,\x9c\xa0\\f\x91\xd3x\x80\x88\xea\x0fP!:*\x98\xaa\xe9}\xd2\xcbuL\xe5v\xbayj{C\x00\x1c\xe7\v\xea[\xbf\xdb\t\xab\xcb\xeb\xaa^\xed܋\xa4\xaf\xf9\xb0\xe2lV\xdf\xfd͛C\x0f\xee\xb3\x1e\xf0\xd8Z\x9a\xbak\x9a\x1a\xaa\xb0\x8e\x90\xee9\xdd~\xac_\xf6\xf0+\x9b2_\xfdʗ\x1f\x8a\x1a\xa2\xce\xfa\xa87\xda\x13\xb0\x11%\xa9\\~\xecN\x97\x17V\x9cw\xb5|\xf3:$^\xbafH\xfd\xf6\xa6\x8d-\u009cl\u007f6\xd4\xc8[D\xb3\x14\x9a\x9bn\x97\xf9i\x86D\xea\xfa\x9f>\xb5=\xec\xb0\x12}4b\x88\xda=\xfaU{\xb6\x96x\x1c\xd0C\x91\x83u\x93\x80\xd5:\xf6\x86\xc5\xc96ݨ\x8718\x05\xd8\xc1=\xd1Z\x9e\xde%\x8dܓ\x9d\xe1&\xcd\x1f\x18\x98?i*\x8fV\xec\u07fb\"\xa3\xf9z\x89\xe6\x1b,K\xaf\xf3\xf2\xbc=\x97,\x9e5keb \x87PÒ\xad\xb7}aM)d\xf5\xedŐ\".Aǝ\xa72\xe6An\x12\xacK%\n\xbb\xbe\xc6\x0f\x17%7\x00;\x9b\v\x8dQΤx9:\v\x01\x8eJ'\xa4\xe1\xed\x11s\x87\xdf\xe9\xd2\x04\xaf\xba\xde9\xfc\x19\xf4\x00:\x89\x1e(\xbc\xe8w\xde\xf2\x15\u007f̿s\xa9\x93lt\xeeW\xa3\x85\xbf\xa8\xd1\xfdN\xe7~\xf4+lA\xbfڏ\xb3\xefm[w\xe37\xa8\xca\xf07n\\\xb7\xed\xbd\xd7\xff\xfaW<9\xe6\xff\xca-N\xbf߹t\xa7\xfa\xd3i\xa1?\xa8\xef\"\xf7;\xa1i\xa1w\x90[\xfd\xf3;L\xafvP\xa22\xd9z\xae\x8a\xeb\xe2\xa6r\x17\x01\xe4g\x9a\x11k\xaacl;#\xb4\x9dE\xee*\xa4\xa0b\x17\xb4\xc5\xc18\xd3*\xa5<~\x19h!\xe4\xe6\x19\xfb\x99\x87\x93:\x9cQ\xa2\x19@\xb4qӼek\xa0/\xcf\xe1\xbd#\xbd@w\xa2\xf5ꪫ'\x19\x1c\xa6\x9d\xb6\t\xf7\xfd\xe7r\xa7\xf3\x11\xf4*2_\xbc2mp\b\xbepm\x90\xd8\"Oގ\xbc:\x94wFg\x1cR\xb7\xfdۜ\x93\xe8\xea\x1b\xaf\u007f\xae\xe7\xd2\u007f\x9e\xfc\xfd{z\xf2\x1bh?U\x15_3\xd2\xcd\xff\x90\xf0\xf1\x82\xe9\xe5\x8bm3\xa0ؾ)\xbf\xdc[\xd7_\xf7.\xb2\xd9/\xb3\x99d\x87\x8c\rj\xeb\xdd\xef\xc4\xd1G\x13\xf7̨\xcf.\xfc\xc2+{\x1c\x1f\xbc\xfc\x95\xeb7g\xbf|\xa96w6؟>d\xf0\x14\xa4\x105\x96\xfe;{O\"\xc8-\x95\xa5<\x11\xbd\xec\xe0+\xeejaW2\x1b\xdf2\x9a\x8b\xbb\x92\x99p\xa1\x88\xbd\xa3\xfe\x14W\xdfa\x8f\x84\bg\xef\x9c\xd1y\x046&\xd9B\x1fh\x0f\xfa\xa1I2\x1a%\x8b\x9a1\x98\xcd\xe4\x85S\xb9\x9e\x9e\x9a\xfa\xfa\x1a*\xbe[\x17\x0e\x17Ϥ\x8d\xc2F\xaa\xf7\a۷\x15\xc9%nwT\x8f\x18\xe7\xbb\tQ\xb1\u007f\xaa\x10Ķ!=\xd2\xdc\x1e\x01\x96\xbc00!\xdb\u007fdP\xb0\xe7$\x13O\xac\xa2\xfa\xefj!%\x98\a\xf4\x16l\xd5\x1f\x1f6bd\x00\xb7\x88\xbf\x8d\x88\xca[\b6\xe6,6\xfc\xc8`\u007f^\x18H\xe6\xfb\x8f\x14fɖ\x01\x11\x113\x1aV\v߶[\x06\xf4\xd88|\\\xb2\x99M\x97\xe9Q\n\x11\xe4\xd1\xd9lƜYxj\xb0?KO\xb23\xda\x1d\xc5ٲ\xd0%)\xe8\xf9\xdc\xf5\x1c\xe7)JrGƼQ\xa5\xbf̼)\xee\xc7\x15\xe92c\xe2\"\xa3\x84\x1e\xcb\xe4^\xb0\u0096\x80;\x87\x02\xea\x10\x1a@Y5\xaf\x0e\x8eu\xe3!\xe6\xce\xd1'\xe1h\x88\xe6V\aGTi M9\x1c\xb1\xd2\x02#\x91(ן<\xc54\xd8s\xab{\xb3\xbd\xab\x91\xf6\x82\x10\xad\xde@\x96e\xcbfQ`\x18\xcaGy\xed\r\xa18\x80\x02L\xea\x95\x1a\x1f\x18\xfe\"KB3\xe4+\x82\xe7\x9ef\x06O\x04x\x0e\xd0\xeb\x85\x01\xed\xd9_\xa4c`=\vC@\xc5d\xb8-T\xa7Oj\xe6+\xc4\x14Jw\xd8]\b\x88\x9af1\x9a\xce\xd4\U00089826J\x80\x1c\xe5\xc8 \x1c\x05\xb0\x84-\x95\x12\x0eL\x98\xaf[,\xa7Əv\xceu\xd7&\x12}\x13\x86\x98z\xeb)Aԫyz\x9f\x1dX߶\"\xd9\x1f\xefM\xb6Ww\x14\x93P-蒺\x1fMr\x86k\x9d\xd7\xd9\xe8\r4\xd74L\xedZvɎiZ\x19c\x02K\xb9\xf8\xbaU/N\xcc\xccj\xa8a,\x86a\x8b\x9f\x96\x02\xeb\v!\"Y<\xf5\xcd]\xd1K\xbe\xca\xe2\xa9\x1e\xa2\xfa-\xb2\xbd\x94\xa0\xb6\xb3\xa7\xb9{S\xef\x8a\x1d\v\x96&\x82,\xf3\xa8\x10-\xf9\xc8\xfd\vl\x87\x145\x05\x84\x04V\x94(\xc0\x1e\xa6DSJZ\xa1\x87\xa0\x90\xa1\xe6\x11\xba\x11U\xa4\x93\xb8\x0f\xd5+\xfe6\xa3\xefU\xf5Ԥ)\xf6j\x9e\bȀMXju5xk\x8dO\xbcx\uf1e8\xffk\u007fC\x8f\x93f\xf5\xb3\xea\xaf>\xaf\xfb\xe7\xa9\x16\x1dv;\x10o\xe3\xadĂu)O[\xf3\xac\xd8\xc5H\x8b\x1b\xfc\xfa\xb3%\xee\xee\xb3rJ\xc6\xef\xc8r\xa1ZN\x95\xf8\xc3C\xe2Q\xf2n\x89?|\xd6\xed\x9dx\x90\xf1\x87\xcf\xe2\x06\xe3_B\x19\xb4\xac\x14\x14*k\x8c\xe9gY\xa1\x1an\x94\x833:B\xb5\xac4\x1bWͤ\x13u\xa1Q\x9a\xaf\x9a\xde\u007f\x90\xdd\xfa\x97.\xe2R\xdaM\x9cF\xad2\xc3\x1e\xc4\x0f\xa4>\xbd\xab\x138\xaaG\xa73J<\x06Z\u008a\xb2r\xa7\x8c\xb2Vŗ\xc7Y\x9b~P\xc29\xab\x9aw\xb6;\xd5<\r+\xe4i\x18չ+\xe5\x805\xce\x1bD\xbb\xe8D\x83h\x10p,;ʹ\xddj\xce\xee\xa5\xc2fƼ\x01=䵫9\x8f\a\xb1 \x943\xe5\xf5Ƒ,\xea@\x05\xff('h:\xd4\xed\xd4Ƌ&m\xc1\x17\xdfTkP\x12\xe8\x1dq\xd98\x1f\xc3\U000e8d31\xd6!\xdeä.\x98\xe5\x0e\xf2#\xf6\xfaQ\xd0{\xfa=\xb3\x97\x1c\xa6\xf3=\f4\xa6\xcdV\x8d\xbf\xf4#\x8d\xd1m\xab\xb2\x98x\t\xf1_\xf2)If\xedC\xfb#y\x95\xf3F\xc8\xceN\x83\xad\x95\x8a\xb2\xfb\x8c\ru\x93\x04\x92\x01\xb7\xd9Q\xe7R\xa4\xd2\x1dPQ\xdf\xcdy\xf6\xfdQ\r\xe3u\xe4\xf6\xac:\x9d]\xb5g\xcf*\x04O<\xb8j\x0f\x19,0?\xc9\xd3g`O\xf9N\\Z\x06\xe5\xc8\\\xa3F\xedk\xe7rIݝJ%QM\t$%G\x97/-\xabS_hz\xac\xf7t\xbe>U\x87\x16\x80\x8b\xcf֧\xd4c\xc3\xf9\xd5'\xba\xd4\u007f\x16P\xb1\xe2\x00\xfcfՅԭ\x89\x99\xbeں\x10\xda\x0fo\xd4>x\xe9,u\xab\xc8\xdb\xf9\x8a\xc6P^\x0e\x87\xf3\"\x93\xad\xe1\x18\x10\x8d\xbd\xca\x1d\xb9\xb8\xc5yXdc\xaei+\xaeY\xf9_'\xe9z\xad\xb8\x85\xe5\xb9\xf2\xa5\xab6~(+q$\xaf\xd5U\xba;\x1e{S<\xfa^x\xdc\x02Gn}\xc7\xdc\xf2\x16ou\x8bvXt%\xfd&3`\xb8.:gA\xbb\xa6\x85\x15\xb4'\xec%\x1f\xce\xc1\b\xc0O\xe0\xfe\xc1\x010j\x1e\xaa@E\xe5w\x86\x81\xe2:\x9d\x83\x1d\xef\x14м\x05\x8ejd\x9d\xa6\xabq\x84g\xd1\xcae\xd9\xe9\x95\x06\xff\xa7\xc2\x17\xb5\xba4\x12c\xc4&\x0eū\xa8\x86Y3\xd7]\xa4\xf4*\xb0\xf6tI\xda*\x98\nr6% \xda\xdc\x01\xea&A\x00\x13\xa9R\x85^3\xbc\x06\xb4$\x15\xf2p\xb4\xc5,\u007fa2GÇ\xa8}O>W4\xec7\xfc6Ո\x83n\x0e\u007f7[\xb8Y\xcc\xf5\xa5Nq\xa9\xbe\xbe\x94\bO\xfce\xbfcu/=\xcbcm:&\x964\xfc\xed\x1c\xaaC\xddo\xd3\xcc<\xcc\u007f\xfe\x86}\xb9\xdci\x96A\xa0O6\xe7\xb3ă\x8cN\x9dY\x94\u007f\xa2\xd3\xcc\xc8m\xda\x05:\xc1̲f3\x8eJ\x9e\"\x03M\x93\xc4K:\xc2Ek\x90\x99\x92:e-O\xb2\x9b\a7\xcb\r\x8d\v6\x17\xdf\xe4;k\xec\xfah}\x13\x19x\xcb?\xaf1\xe6/\\\xf6\xc2\xf1g^\u007f\x05\xc5\a\x9fy}7\xba|\x804\xd7\a\xd6\xd8\xcd\x06q\xc1\x92\x8b'\x93\x17\x067o^\xd0\xd8 o.\xbeUξ&\x00\x87\x03d\x8e5\xce\xf3\xe3\xa7v\xbf\xfe\xcc \x8a\xbf\xf2\xfa3\xc7_P\x9f\x18 Mp\xc8\xd9\xd7\x18Ĺ\x8bV\xf4jl\x04\xee\x8cU\xca\t\x1f\xc2\f\xd9a^vqǹ\xd3܈\\\x97\xd6?虽쪰\xf3\xe3:\x8f\xa1\x9fOo\xe6\xa7\xc2\xc8\x0fb2AL2\x88\x12\xf9\xb09\xd0zXv\x85\x8a\x03Q\xf1 V\x16Uq\xf6\xc0^\x01\xe5k%@\xab\xec\xff\x9d\xcc$Ǡ\x88\x1c\x82#\xa1o}\x9f\xf6Ts\x16\xfdcFW}\x9b$y\xb6\xcbF\xc3\xf5\x91\x98\xd1$y^2:\x90\xa7\xbe\xe1\x06\xc9l4\xdc/\x19\xbam\x1e\xd3a\x83\xa5\x9cԽ\x83&\xado\xaaL\xaa3Ѥ\xa6N\xab\xc7\bIq\xee!\x93#\xc1\xefĺ~\x8b\xd3\xe9\xb4\xf4\xeb\xf0N>\xe10=\xf4\x90ٞ\xe0\xf9\xee\xb6bD\xa2A\xe4w\xf0\t\xbb\xf9\xa1O\x9b\xbeh\xca\xe8\fC\xc2\x01\x80\xf9Tѡ\xde\xff\r\x83\x8c\xbc\xa1\x86֩F\xbdI\xaa\xdd.\xad\x90M\x1b[\xbcV\xc3#\x06\xd7Œ\xee3\xd5z\x83e\x9e{\x82\xe2EvceR]\xed\r\xd2\n\x87ecsER\x9d\xd1\xd6\xefn\xad\xf7`{ah\xbf\xcdZ]\xb5\xa5\x8a'3W\xbb0v\xad\x9eIx\xf0V[m\x10Q\xe3\xa1\x118\x1c\xb8\x04\xa2f6\xe0\x194\xceSc%\x1f\xfeWr\x95\xe5F\x18.\x1caR\xaf6\x91a\xc3\xcc\x1c\x10Lv\x120\xe1n\x9e\xb1\b\xe8=\b,L\t\xf0\x85Z\x91B\x1aU\\\x8e\x8a\xa1\x00]\xb1a\x80JX\xbb\xd4L\xd0\xcb\xea7\xffe銛\x1f\rljQƀ\xb4c\x81\x88H\b\xdbj\\\x86\x9b\xef}\x19MG\xb7\xa2\xe9\xb8\xf3ޛ\r\xae\x1a[X@\"\xd5W\x84dNS<\xfc\xe8\xcd+\x96\xaa\xff\xf9\xfd\xf6\xda#(\xb6\xf5\x96;<\xb7\x1d\"w\xab\u007f~o\xafmyL\x0f\x94'\x91D\x91\x97\b\x15\xdbpEb\xdeY?\xdd~\xf7{{\xf7\x16\xf6\xee\xf8\xc9,o,\xe2RD\x04\x91\xbc(J\xc4bC\x92>\xb6ܶ\x87_\xb1dՇw\xcc\xed\x9b\xf9f\x19\xeff\xbas\x9dܦ\x11k3\x88ގ&\xd3\xf4~\xbeL\t\xc1\x11\x0e=\xa5$&\xf4\xab\x1b\xc1\x81Cyd\xb0\"\x9dle\xb0\x9f\u0604\xe9 \x8d\xec\xa7tQRʉ\xea\x9c@\x02*\x1a\xad\x99\xa4\xe1\x8f\u038b\xab\x83\x03\xd9\x01\x9f7\xd2\xe0\xce\xf0JՄpC\xd4\x16\b\x98#5-\x9eV\xe1g\xbbo\xcc\v\xb5!G\xcai\r4\xe5&\xe9\x15\xc0N\xbfpO\xf8\x92\x81o\u07b4խ\x0e\xd1\xfd\x139\xc2k\xdb'y=JS4\xb1\xe4\x8e\x19\xad/\xac;\xac٬\xc1\xb9\xc4\xdc\xf6\x1fv\xacY\xed\xbb\xe13M\x9eiB<\x90\n\x85\x1d\x85\x9c(Yuv<\xfb9_\xadm\xf6\x9c@|zU\x97\x1d\xad\n_<'\x18\x9e;\xd5\xe5^;\xf7\xee#\x13\x9bb})\x9cK\xf5yw\xf7\xa5\xaan\xdc\xd3\x18\x99\xb2o\xdb%\x97\x1f\xe6\xca6\x98\x98,i7\xa5-+v\xb4(\x9bk6\x1ei\x8dc\"Y\x04m\xc4\x04\xaa\xe7\x87=t#WRT\x99\x95\x9e\x88\xa5m\x8e\x89\x8dR\x1b[\xe5\xe3\a\xa0\x86na\x92\xab<\xa4\xe5\xf1j\nX\x9d)G\xa8VX\xb3,\xb7\xfbgB\xab\xa7\xa5&b\x0e\x04lц\xf0\x84*\x85ϸ\x1b\"^\x1f\f(\x1a\x88\xcf\xcb\x1d^\xf7Bk(tǒD\xb4>f\xf4ʭ\x1dk\xc3\xea\al\xd0\x02\ueb79W\xae\u07bc\xff\x8b\xa8\x93(\xfaI\xbc\xa6d\xa9r\xa1U\xc8\xdeU5=^\xa7Df\xdbj}\x17-\x9a\x8d\xed:\xab$\x16r\x8ep(\x15\x88\v\xd3%\x12\\\xb3x\xa9+>w\xb7W\x1b\xb7\u0604\tO\xee\x15\xe6\xaeu\xbb\xa6\xce\r\ag\x17q\x82/\x92,\xa3\xc9\x01W:˺/Ɏ\xb5\xde+\f\x9d\xfa\xde\xd9\xe6y+\xd7&\xd5\u007f\x9dLo)\x9b\t\xa3\xd4\xe9@\xd6[\b\x1c\x9b@\x13e\x8ax\xe6\x18\x9b\xc9b\xaei\xea\xc0\xaau;\xd6\xce\xf2:\xba\x1d\xdeYkw\xac[50\xb5\xe9\x9bx:\x9e\xf6r\xee\x9d\xc2\x03\x8es\xd8S&_Xx\xf3\xecf[b\xeeT\xbf\xdb\xed\x9f:7ak\x9e}\xf3\xc2\xe7\xbfYx\x03\xb7\xbc\xfc<5\xaa\xec\x18\xcf\xdcr\x19'\x17\x03\xb0\x97\xc4(>\x17q\xba-\xb8\x12\xd7p\x15\x03\x8ar\x9a\xed\xb8\x96\x94o\xcc\xcaɴ\x1b2\x9c\xc3H\xb0\x9aU&\xa5I-K\x15\xbd\x94\xf7\x81\xa8\xe5m\xbbh\xe0ɠ\\\x18\xa2\x82\x88YF\x98\xe4\xe9\xb5Y`\x80\x0f\xb8|fM0]63\xcf\xea\xdeB\xb6w5\xe6%#\x8e'i\x16H\x1c(\xda8\b\x00\xb2[\x18*\xe9\x01k\xb8.\xb5E\x05tc&a\x0f\xc1\xce\xc7Nm\xedV\x80JQ\xd4K\x89T\xc8M\xc0\xcd\x0eb\xd7X4\xf4\xfd?\xfe\xf1#4c\xeb왓Q\xc7,<\xfb\x8f\av\xdc5\x1b\xff\x91\x90?J\xd6\xce\t[\xd1\xc9J\xd4s'\xfeڛ\xc9iӒ\x89\xe9Ӈ\x9fC\xf7>\xfa䶵\xbd\x85\xfdh\x8f\xe2\bMz\x02__\x89m2\xde7\xb3\x99b\xa42\xf5HC'\xec\f\x9f\xa0\r \x16j\n,J\x18\x05\x94N؋\xc4\x1d\xa5\xf8\xec\xb0\v\r\x01\x86\a\u007f\x18\xe8Luq\x02\xdbM\xa8Z\xe8W7\xfa\x94'./\x9b^L^\xfe\x04\x1eDL\xb4\x83\xd9%S\xff\t\b\xd1\x1a\x93\xbd\x1a\xbd\xa3\xf8n\xfa\x1e\xe64:O\xe5\xbeW\xa6\xbf\xe8^\x1a\x1d\xcf\xfeo\x8df߷Rпl\x85q\xbc{\xbf\x11\x91\\\xcc\x1aPȖ叙y4*x\xfaBa\xabv\xfd\x87\xf7\xbf k\xa2\x8ax@͗\x04qY\u0092\x10.3\xc8H\x16Q\xa1F\x96\x8f\xdd\x02\xd2|\xf4:r\xc4Ɣ\x87\xc2\xe99`P_\xeeSR\x01L\xa7\xa8\xad\x10\n6b\x8a|jAn~<\x10D\xd7\x1f\xdbN\x15\xd9\x19\xcc\"\xd6\x13u\xa8\b\xb3\xc50\xc0\xf4\x1f\x1d\x1f\x14Q\xa2\x90\xad\x80\\\x9c\xd7 W\xa7\x81u\x99ާ\xb2\xeffn6\xbdoH\x01\xf5玤\x82N\tN'\x97S;\xc1\x10\xbb\xf8)̓vG\xc2vejO\xa4\xc8XJUP\xc5\xe8\as\xcep\xc7\xf9\xef\x9c\xe1\xe6\xdcs<\xb7\xf8\x9e\u05f74\xa6\x94\x9a\xae\xa9}\xdb\x1c\x96a\x98\x92m}S\xbbj\x94T\xe3\x96\xd7\xefY\xdc\x16C\x01h\x19eu\x06bm\xf8\x9e\xa7\u007f20\xef\xf9\x8f\x06~\xf2t\xcd\xf3'r3\xef\xdf:_H7\xd4\xcfM\xa4笜\xaeY\x98\x99\xberN:1\xb7\xbe!-\xcc\xdfz\xff\xcc\\\xacM\xe3a\xd2\xcbP}\x85\xce\x02\xa5l\xea\x00\x9e&pq\xee6\xee\x01*_\x1bU\xa8Y\x04\xed\x99IG\x8b~O\x1a\xba\xc1\xde\xcc_KU8\x9c\x19\x1a\x92FT{\xc2\xe5t\x80\x13\xce(\v\xa6\xb7\x16\xd0av\"CBf\x80\x8a\xce_F\xc9\xd0;Q\x98\xe7n\xecqӳ\xc7B$MU\x1b*r\x8c\x85g,\xf1\x92^\x80\x9fG\x00\x1cD\x12\xc4\x16,I\x88H:7FD\xd4\t\xe2Jl\xd4\xf3\xf0k6\x19\xba\xb0\x1bc'\xbe]\xd3u\xf8\xee\xa3\x0e;\x12\xe5\xe4\x84&\x9d\xa7\x1e\vFb\xb4\x88\x8eF\x93\xadiB\xc0\"\xf9&͙\x15Myk\xe4\x99U\xbe\xf6\xfd\xed\xc6P\xbf\\\xe3M\xf9\x9b\xb2]J\b\xd9\x1d\x8f~\x17q\x95\xfb\x05Z JP\xb7$5K\x84\xd7\xe9\b?\x89\xe71/\x10,#\tK:I\x9c)\xf1D\x82\x1fo\xb3Y\xa1\xc5:\x1eMg\xaa!'\x9fS\xff\xbf$\xb1\x99\x92M\x88 }\x9d\xafÊ\x04\xa3N\xe2\xab\xdd~\xbf$\xb6\xb8Ū\xd4\xe53\xe6\xb7w\xcf\x11\xabm6\xbb]r\u05cas\xba\xdb\xe7O^\x96\n\xdb\xf8\xball\r6\xd9H\x12\x19\xf1\x9d\x95{R\xc9vB\x9e\xcd\x1d\xdb\a\xceo\xbf\x8f\x19\xdaLg(\xb8i\xf7\xebZ\x14\xb5hVd\xc1\x9d˂\xdf\xe7]\x97w!\xae\xebr\x17\xfa<3\xe2\xd7H\x85/\xa9\xe4\xe5\x19\x8e\x1a7Cy\a\xccY\xbeN9\x87\x11\xbf\xb6Y\xb3\xda\xda\xf0@\xac\xb4Lc\x80\xa9\xe6eY\xcd֖\xcfY\xe1\f\xc0\xe0$\xeerz\xce2\xd5d\x8a\x0f\xb2k`\xa6\x96\x0f\x84\x15\xd58v1\x91\x0egI1\x9c\"0\x8e\x8c\x13k\x86~\xb4\xb4,\xa3\xc6c\xd3$\x06\xb5\xb4\f\xb4\xe0t\x06\x14y\x97\xc5h2\xe8\f\x06^/\xcfsv\xfe\xa9\xa3骩m{\xa7\f\xec\x9aT\xe5\xf6\xba\xbd\x97UM~{\xf2\x8bW\xdd\xf6\xf3\xed\xb9\xfdÏ\xdd\xfc\x83ɿm\x83\xb0\xd9k\xddU\xe1ٹ\xa5\xf3\x1e\xfd\xf6\xce\xce?\xb6\xcb\xfd΅s\xe0\x044a\x9b\x03\xbf:\xe1\xee\xeaZ\xffD\x9fg\xa5;\xe2@\xfaV\x8fם\x9e4\xfb\xdf\xff\xe3\xb6\xd8`\x83gل\x1aw]x\xe2/\x90\xf3\xeeg\xd5o\x9e\xceL\xa8\xa9\xb9v\xb6w\xb9'v\xa4\xe1ڟ\x9f\xf8ڔ\x8e\xaey\xad\x86\xb5K<+\xc0Ǟ\xa8\x94\x85\xa0\xba~NF\x9b\x02=ΐ7\x8e.'\xbeh\xbc\x88ٖ\xa5}\xc2t\xdb)v\xcfSK4\xd3Yԉ\xa9\x86\x86\x90s\x1a]kW\xaf\xaaN\xf6\xd4-Я\x99\xbbK\xfd`~k\x88\xd4\x1a\x1dR\xa2-^\xb5\xac\xda\"9BF%`%5\x96\xc9S'\x1b$\x17\xea\xff\xee^\\o\xa9\xd6;\xda\xe2\x9dNKM#_5y\x86\xe8r\x8f\xd9֖\x19\r\x9ej\x9f\x97\x10\xa7\x01\xf2K\xa2\x19g\ueedc\xb8M\xb2dn\b7Y\rn\xbf Nl\x9e\x14\xe0ݮ\x83\x93m\xe1\xaa\x06G\xab\xf8Y\xf5\xb5N\xec\x90̂0\xad9E&W\xeeK\x88\xcab\x89K\xe0|\x9fĸ\x8a\xb0\xf6\xb0\x05\xf1\x1a\xa5JﱵW\x17r{\xd8ݷ\x9b\xf7\x14\xedkQ\xfecZ\\2\xf5R\xd4\xff؛\xeaO\xbf\xa0\xfe\xe7ۡ\xa6\xb7_\xb8\xfah]\xd0\xdfԸ\xf9\xe0\xb4y\xbd\xf3&܈V\xbe\xaa;~\xc7\xfe\x81M\x03\x91\xab/\xe1\u05ed\x99n\xf1߮\x16>\xf8_\x9b\x1e\xe0\xf7\xe1[.\x13\x8c\x9e/m\xe3\x152\xe1\xde\xc5\xcb\xfb\x1e\xfa\x8aA\t\xdfq\xfcJ\xd7\xe4\xeb{\f\x8c>\xb8\xf4L\x8e\xfc\v\xe0M\x8c\xff\xcd8\x84A\x12\xa2\xf6f\xec\xda]\x1b\xf9\x97'\x96v\xa2HTUO\x9c\xe1μ\xf1Ń\xc2\xdf\xd4\u007f̚u\\\xfdeA\x8f\xff\x8eb\xbf~\xe9u\x8e\xe9:\x9fy\x8e\xcd\xeb\x12n\x15w\x05\xb7\x81\xbb\x9e\xdb\xc9\xdd\xceݥIٸ\x9c\x9c$j[Q\xb4\x9b\xa7\xd4\x1a\x1c\x98V*b\xdd\f聇nE\xc4C\xd1\x04*\x01\x82Z\x00ɭE\x94o\x04?҃\xd8&\ak=\x95t\xc8\xe5#\xb7\xf2=\xcaK\x8f\xe6\xa4T\xefrf\xe2\x19\x1aW\x12\xdcQ\u007f\xf3\xa7j\x1fJN^yٔ\x86\xf9\x91\x89\xfe\xf5Q\xe5\x92W/\xb1\xa5\xae\xf3O\x8c\xcco\xc8^\xb6rr\xd4\xe0j\xed\x9d\xe2\x91;\x9cN\x97M4I\x92\xbb\xc9`0wϚ\xea\xf6 _\xf5\x9f\xd4ߜ\xb8\x88\x18\f\x84\x18\xf4!Io\x10\xe1\x17\xd6\xebuz\xbd#\xae3\x99tz\xb3i\n\xb1\x01\x8dk\x9dj\xb7\xd9m\xed\xd8f\xe3\x03L\x12\xe8'\xa7\xd5k\xe7\n^\a9\xd8u\xd9Dћ\x9e\xbf\xfb\xa2\xed\xcbVn\xd1Ǽ^\x9f\xcf\x18\x98\xa8߲r\xd9\xf6\x8bn_\x90\xf6\x8a\xe1\xa9\x06CSC \xc6\x13\xbd\xc5\"\b\x866\x8fGi1#\x9eW\xd6\xf2\x0e\xaf0\x17=p\xfa'\xe8\xb2\xe1]\x92@\x048z}\x82Q/\nF\x83\"\x99̒\xe0\v\xeb\x8c&=\xfclF\x81w\xf3\xa2d\xc6F3v\x191\xf1\xeaF\xdduDFY\xa6V\xe8\xa4'F\xdb\xeb\xa1\xd8\x18`.bN\xf1\xc1\x19u\xe8䡁\x91\x8f\f\x00V\xcel\xee\x90|I׀\xda\xe4ɷ\xc5*\xac\x1e~\x83\x9a\xe4)\xf1\xec\x8b\xdfZ\xa9*\xda!+\xf1\xa6\xcbu\xb9\x18\xd4Qv\x87\x9d\xe9C\xd0M/\x93\xa2vԂ.q\x88\xeec\x9a\x92\xadY\x16s\xb2\xd9,\u007f\f\xcf\x01\xc4\xe5\x10\x94\xbb\xbawD\xad\x16\x82\x87\x86\xcc\xf2iN6\xe3\x81\u00a0Y\xa6\xe6\xd2r\x9aL\x8c\xa0\xe9\x00\a\xa9U߲\x06\xb0[cr\xd2c\x84q5)\a\x13V\x9f\xdb!\x94c0\x17\x1e\x8931;\xf4\x9aB0ތeG͝Ua\xecV\xbf\xf9NU\xd0e\xf7\t\x83(\xbc\xe5\xba;\xb1\x19;\x1d\xfe\xfb|\x11d\xfa\xb2\xfa;\xf5\x96_T\x85\x9c\x0e\x1fA\"\xfa?/}\xf3M\xa4i\t\xab\xdf\xf3;]\xc1\xaaw\xd0t7\x0eW\xddY㰛\xef\xbcn\x8b\xfa\xd6\xd3\xd5Ng\xa8\xea\x17h7\xaa\xf9\xb2\x19E\xaa\xee\x03B\xc9\xfc\xe67_R\x83E=S\xaex\xb7V\xc75P\f\x87\x1bs\xbf\xe6\x19\xfbm\x99`\xc9\xfcržYa\xad\x96\xb7\xb5\xf4\xb6\xb4\xf4\xa2\x16\xf6z\xaaRa\xf9t\x9c\u007f\xfc\t\xdek\x19\xfe\x8b\xc5\xcb\xf3_\xd2F\xda\xf6=\xfb\xaa\f\xb1dVٿgC\x97\xf5j\xd9\xe8߇%\x83\xcbT\xd5\xfb}\xf4[\xb3\xddn.\xdcZ$\x91\xb3Uq\xbc:\xd5ۛ*<\x1dgg\xc0n\xc6Gh\xe6\x92\f\x1a(U\b?.b\x81=Ђ\xe0\x98\xb6 z\xae\xa73ek\xe7\x01\n4\xc4\xce\tv^\xccQVJ\u007fR\xbdT\xdd\xd6\xde\xcb+N\xd11\xa9E\xa9y\xf6\v\xcd\xd2D\xb9\x9a\x18\xec;Y\x9dC\xe8+\xe8\xf5d\u007fN\xbdA݇n$9\xc6\xf7M\xf6\xa3\x95Ay\xf5\x86hpJ\xa2\xa3\xa1\xb6=^\xdd蹭\xf3\x86%[ҫ{\xa9\x8d\xd1\\\u007fr8L^R\u007fڠ\xfe\xa5\x91\xf1\x9d\xb2g8\x91ޥ\x19\x01~\xa7\x00a\x9ed8U=\xa5gP\x90\xb3'\x9b\x011\xc0.\x1b#l\xd8\a\n\xe8\x10\xd3=ΑѬzR6\x92\x83np\xe4~[\xc7E\x81\xabf\x17n\x10\x9c\xeaG\xad+\x1ey\xe9\x91\x15\xad|\x1e:\x92\x85\x05\xa6f\x93\xfd\xf1E˻\xa2\u007f~E\u05f6\xa0M\xf7ʟ\xa3]\xcb\x17\xbd\x10\xb8\xa8\xc3f\x9b}\x15jE\x13\xb03\xb1qMOϚ\x8d\x89\xc2{\xea\xc9d?]u\xfd\xc9\xc6U\a?\xf7\x97\xbb\x0f#\xc1/;\xe9\xf2s\xca~\xf5\xf4\xe1\xbb\xff\U000b90ebؚǀK\xaa\xc2-\x8c6\x03\xcaB\xb4\xb2'\x15闘̵\xc4L\xac\xd3g\x0fc\xa1\xd2g&\xad=\xeb\x98\xd5G\xfa\xf4\xb8\xb5'\xcd\r\xf9\x85\x81}\xb5\x06S\xec唩\xae\xa6\xe1\xa5VC\x83I\xaas\xdey\xa7\xbf\xb1\xc1\xd0\xfaRCM\x9d)\xf5r\xccd\xa8\xdd7&UC͝w\xd64\x8cN\x83sc\xb2a7\xcdfl\x18\xc9\xd6\xe8\x1f]t\x83\xc1Tw\xf7ݵFè4\xe5o\x92\xd1u\x9e\xe2֍\xe5\xa72\xa9B\xaa>#\x15o7(\x83\x10\xf6\xbdJ~j\x89E(\x16\x19\xaaEM\xde\x12\xae\xd1-P<\x93\xd7n}\x82en\xaapt^\xbc\x90\xaf\r\xd7^<\xd3\xdb\xeb5\xc7fͬ\x9d>3\x10\x98\xf5\xca\xf7\x16\x1e/rQQ\x1f@\xe2\xc3W\x1fヌ\x93\xfa\x99\xe3\x9f\xed(\xb2Q\x03\x06\x8f\xd7Um\xf1\xe2)!s\xac\xbe\xa5G\xb9\xe5\x197\xba\xa1\x92\x99ꜜZ\xdc4\xb5\xeb\xee\t\xae\xec\u0085U\x93\v\xb9l\xb6\x92\x89ڟ\xba\xfap\xf7d\x8d\x83:\xbdCc\x04\xeae\xbb\xdf\xea's2\xaeE\xdd\xd9\xd0\x1d;\xa7u\x1e\xe6*\xc6'\x05\xbb\xe0\x16\x8e\x8b$\xec\x9a]\"\xf6\x9f\x9a\fc4\x81\x8b}\xac\rv\x0f\x8azyDz\xdfɨ\xf7n4\x86\x8cbTF\x0f\xd2.b4R#\x11\xd4P\x17*\x8e\xe7\xa9\x15\x19~6\x10\b\x84\xa6t\xc6jt\xfc\xac\x98ŋd\x87ۥ\x9by1\fW!\x1f\x9fןD}\x1ag\x95\xbflْW_A\xeb4R\xab/\xa5\x0eu|\xf6\x95]\xf7\xbe\x80P\x17\t\xf2Ǯ~\xf8\xf0:t\x83\xfb\x99[\x94\x9e\x96\xfa\x9894\x05{-\xd5.\xafǀ\x02\xa9\xbe\x1c\xcey\xe3\x8dA\xbd\xb00\xeb\x06\xc2 \xa8x\xba\xa66-NMv\xceM$\xfb\x19c50g\xb6\xcd\x1b\xb8hQ6\xab\x14\a\xb6\x00\xe3\xd41\xfd\xb1\xfdB\xff\x95n\xd7\xe4\xee\xc3W_u\xb8s\xda\xce;B\xd9\xeeE\xae\xcc\x1c\x02\xe3g\x97\xf5}\\\xa5\xfd\xff\"\\\xf1\xa5a\xa0\xa6\x1a\x9aQ=\xbb#\x96\xec\xdaͧ\x9d\x99\xefվv\xc7\xfe\xb3\xa3\x8d1\xeaŊS\xafY(R.i\xed[\x81\x8c9\x02\xf8\v\xc5\xfaJd\xe7\xd1QӜ<\v\x120@B\x8eNya\xfc)\xbfj\x040Vh\x9f2쬄\xc7s\x01\xed\xd2O\x00\x9deP\x1e5>I\xae\x93~\xaf\x91\xea\xa91!\x00\xc6\xfb\xa1\xff-\xbc\x06A8ag\xc4j\xcaNq^7\xac6\xea\xc3e\xab\x13\xb0/\x89쾇ݳRuԢ\xc1Z&\xfdU\xa1EJ\xa9\xb8l\xb6p\x9eYo\x9e<2\xe9\xb9\"\x15_\x9c\xec\xf4\x14:\xd9\xe997\xde9f\xb2\xd9\xda阎\xb3\x00\x88\xb3.\x04\xb5!\rhI\x17\x1b\xda\xc24\rRk\xa5\xf3Cj\x11\xaeG\xd3Bu\f+b\xfa\x98\x99tQ\xf5P\x12\x9du\b\xd1/\fА1\xfa\x99T\x18Z5\x1c\x97\xe5\x95\xf4\xdb\x01\x87V:\x1c+\xd1zp\x82\xe38\xfa\x88j\x84\x8e\xa7\xb1y\\ST\xa4\xe9!\xa9z\br\x81\xe3\xf8\xf9u8Y۸$\xfd\xf8\x13Յ\x84F\x95uFY\x13\xdd\xf1\f\xcaTj\x1c\n\x02+[k\x8cj`\x18\xe2GŦ\xa2\xf5+\x91yl\xd3֦Y닍\xf1\x8d4\x14R\xab\xe7\xd4\xd3,\xb6+\xaa\xe9h\"\xad)=\xa8\xacU\xcb>\xce\x10\x1e\xad\xafyV\xcf˕!\xcb\xd8V]\xc9Z\xeb8G_\n\x17jW\v\x1b\xae\xb2p\xa8\xa6H\xea\xf4 ֬Q6P\xa8\x1e\xe98=w\xb0Q9\xbb]W\x8c\xcc\xf280\xc0\x9d9\x9f\x1e\x9c\x11\xfd\x12{\xb9\xd1z\x0f\x16$\xc55\xeb\xcep\xbe+\x94\x8d҃D%ꔒ\x8a\x18-\x91\xe4\xf5\x16\x14R`5CbJi\xa5\x95h\x82EI@\xa7\xb9\xdc\xf4x\xa0Q@\x87\xb9-\xd8J\xb3\xc3\u007f\x89\xfeh\xean\x94\xa2א!7\x93\xfb\x87#ם\x8e\xbaY\nѣX\x10\xad\xa1\x9e\x16\x99\xa6\x052\xec\xcfM\x8d\xe9\x89n\x89\xd2Ɣ\x18\xa4\xd2\xcdi&\x82#i\x85x2n\x8fB\x85\x02\x80~\x8c\xd2#\x9d\xf2}2n)Ͱ\x13\xda.w\x06\xb6\x14\xc9\x03o\xb1\xc8\x14B\xe0\xa1\xc6\x1e\x19\x1f(\x93\xd6\fY\xc7k\xa1\"\x16\x1b\x8a\xbb5n\x11\xb3\xf7G\x19\rPTF\x8b\xa3\x84\xb8;\x93N\x89Q@\xf7(\xe3\x9a奣$\xba\xea\xe9%l7Q\x18?\x8e\xcalR\x1a\xbe\x1b\xb1P\xe4fB\x12!w\x9aҤJƝa\x95îG\xdbٍ\x00\xf1J\xa6 \x83vK\x1b\x8dg\xea\x01WOӬ\x94\xbbL_\xe9$\x9b\x90t\x88\xb1\x9ba\x8c\xe8[!i&\xfe\x1eM\x17\xed>J\x16\xe2\xa1LBf\xddR\x81\x04\x16\x9e\xba\xa0%\xb5\fۣ6!\xe1o\xac\x06\v\x99\x86\xad\"\x16\x04$\xda,J\xbd\x1d{\b\xf1\x12l2\"Qo\xc1\x06\x83\x88\xb0\x15#B\x04Q'!\"\x12\x11\x13#\xb1\xda\f\xa2\x9eH\x02\xb2:\x89.\to\t\x99\xfd<\xf1\x019*a$\n<1ʔ/-\n᪠(J&\x82\x89\x1e\x99$\x12\xb2\nf^o\x90\x05\vћ\xf4}\xd5\x1d\x8b6\xdf,\xf6\xed\xe8\x98\xda+\xf0\xb9\x037\x0e\x1f\xba\xf1\x80\xe4\n\xa4g\xac\xed2\xf4.\xb8\xe3\xae;\x16\xf4\x1a\xba\xd6\xceH\a\\Ұf\x97\x8f,-Jǒ\xe0\xe6Ew\\\xf5\xf4B\xa1wjǎ>\xf1fM\xf8\x11\x03\x14.\x9c\x87.kl\xf2Dj\xee.Xv\xdc}\xf7\x8e\xd4\xdamW\\:5֔j\x82\xbf\xd8\xd4K\xafضV\x883\xd9B\xb5\xae\xf8\xa9\xec\xc2S\xf3\x16\xde$l\xbb\xbb&\xe2ijD\xebYdIO\xed~q\xb3\xf0!\x17\xe4\xa6rW\x17\xad\xa5\x00)\\\xcb3\xb2\rH\xb1\x11\xc3.iT2\xfcR\n˔D\x83\x88'\xcdi\x9a\xf8\xda>\x13-\xda\x00(*\x8fQ\x1e\x8b\x87\xb9\x84\x17\xfco\xf8c\x8d\xb5$`\x94\xa5\xb6\x98\xb5\xcag\xaa#A\xff\x89ꆘ\xff\xa0\xbf0\xc5\u007f\xc2\x1f\x8b\xd6\x1c\xf4\xfbߨn\x18\x9b\x8a\xec\xba\xe8\xe0\xe2\x1d7.>\xb1x\xf9\xf2\xa5;w,yc\xc9\x18?\xcaƠ\xf4\x00\xa93\xf9\xaa\xac\xb16I6\x82\xbb1\xe6\xffq\xb5\xef\x80\x1f\xff\t\x1c\xfe\xea\x03\xfe($\xaa\xae\x1b\x9d\xa8\xf0\xf6\x87\x8b\x0f,\xbe\xe8Njwܴt\xf9r(y\xb4\xb7h\xe32\xc7l{s\x1a\\p\xd4@\v5\xa9H?\x88\xa5]\xc3J\xb5Hʽ\xfd\xd4\xe9\xb0g\xd1\x1aIhh\xbah\xef\x03{\x16\xaf\x91 \xa5\xee\x1a\xfce\x8b\xddf\xce\xd5\n\xc4\u007fzUs|\xe1\xaa+\xe6D\xb5W\xf3\xc2xst\xce\x15\xab\xb4\x17\xb2\f\x04-\xf3}\xc4\"\x00\x9e\xf4\x8b\x01<\x04;\xe6\xa0\x1ep>\v\xef#\x03\xb9\xc2?\xbe\x84\x8dX;$}\xeau\xcepȖ\x05\x94ow/\x8f&\xb5ν'\xb5dޒ\x9b\xfa\xefM-\xa93\xebg\xcf֛떤\xee\xed\xef\xd8\x18\x9d\xbf$y\xef\xdc\xd6I\x88\xefE\xbbuR\xd6\x16\n;\xf75\xeeIt\x84\xe9\xa3Б\xd8\xd3\x18f\x0f<\xd8n\f;u->b\x03\xb4\b\xfd{\x00g\xb3\xea\xc2-\x03:\xcc\xf36ާ\xe6\xb3\xe8\xf0>\xc2k\xf70ڹQ\xc7\xd5s\x11.A\xbf,1\xea\x1e\xa6xB\x96\xb4U\\\xf6tBBA=\n\xca\xf4\x10)~\xa23\x99.{\xc4\xc1ҍPa\x88~\x11\x02\xd1OBP\xbb\x02\xd3:s\xea\xcfQS\x81=\xbf\x8b:Uf\x99\x00s1\xf2K\xcdɗM\n\xa0@\xf1\xdb\x13\x90\x19\xcaP\xbf\x1e\xfb\xb9\xfas\xfcy\xf5\xe7\xeagQ'\xd5)\xa2_\xad@\\l`\xf8\x1f|N\xf31\x9e6\u007ff\x8fp\xb3p3\xb3\x02\xed,Y\xd5\xd0,w\x14\x05\xf4\x8bZ\x1b\x881\x9b\x92\x15~ט\xf4\xc2\xcdOn\xbb\xf3\x8a\xe1\xbfoy\xeb\xa9'\xafǗ\x18\xbalfC\xe1\xe9\xf9W\xae?\xd0Ot=\x8b\xb2Kz\n\xdf\xf4\xd5\xd7(U\xe8QC\xb7\xcddP\xaf\xec\xb9n\xd1\xf2.<\xfd\x8a\x87\xb7=y\x05\xd1]\xff\xf8S\xff\xb6\xa5\xf0\xb4\xc1d\xeb2\xe0K\xe7\x1eZ\u007fu\xff\xf0\xdf{\x96d\x17\xf5\xe0\xe9^\xa5&P\xad^\tq\xdd\x06\xf4h\xd7\xf2E\xd7AakF\xc9\xf6Q\x1d\xed\xe9\xda7>\x98<\x1f\xfb~̈^\xbf=Qby\x8d\xd5A\x1d\xabs\xe7\xa1X\x1a\xfd \x10Gr9\xa7A\xfd\xa3\xa1ժ\xdd\xc8\xe5`\xb8\t\f\xb7\x9a\xab\xd0\fΕ\xbfMʆ\xdf돱\x8f\x13\xe5,\x93\f\xa8\xca\xe0,)\xf6\x9f\xe64K\x11\x98\xab\xb8ݑ\x87Y\xac\xc0\xbeZ\xaa\xfe\xc9?0J\xf7d\\;|\x95\xd7\xeb\xfc\xc0h\xb5\x15\xed~\x8e\xddki\xf6\x8e?\xb5e\xef\xd1v\xfe\xce宰\xde\xfd\x87\xf1\x9c\xec\x8c\xcfK\xd4\x0e\x83v\xbf\x16\xe52\x14\xa3)i\xb09J\xb7\x86cj\xe7\xce\x11~\xb6Uivo\xa8\xfd\t\x1fV\u07b4\x9dʍ\x13X\xe9~\x83eC\xf7k\x06\x86\aˆ\x94\xc9\xefƆ\xa0\x11K\xd3ڰZ\x99n\xe9߹ZX\xf1\xfd\xb0ko\xe4n\x86퀭\x82\x8c\xb6:\xa4h7Τ\xea\xc5\x10\xfb\x90\x15\x9cG\xb2+Ș\xae\xda}I\xb4\x9b]\x0eSfn\"u\xb6!\xf2`*\x91\xa4ئ(E3\t\xfb\x05\a\xe1\x96M\v\xd7\xf7N\x9e4\xb9\xa6\xe9j\x9fnRX\xb6M\xb1\xadGs/Mtb\xf5\x90\xd8\xd2\xdb\xdbRS\xd5\x1c\xba\xc8{i\xfb\xec+\xa6-\x9a\x8ev\t\u007f\xd6\xc6\xc1a\xd1\x06J\xfd\xd2\x06\x84u\x8d3\xefZ/\xbcW\x19S9ZK\x16\xac\xea]>\xb1Ɵյ\x19\xa668\x10N\x1d^~\xbdi\x0e\xce>\x15v$\x96$\x9b&x\xaa\xaa\xdb;\x12\x93\x17ό/n\xceTu\xaa\xdf\xd2\xc6\xcc\xe2\x90\xc9\r\x97_\xdep\xa4\xc1d\x8f\xf4\xefR7\xaa\xb7\x94#ƌ\xeb\xc8]\x8a\x95Kqk\xd9^:J\xb81\xa2)Ǥ5\xa3\xb0\xda\a$\xa82\r;\xd8ʗ\x03$X\xb4\x96[\xba\x8d\xd3\x14Z(ޜ\xcah\xd2J\x9e\xa2\xad7*\xfd%2E叙\x14#\xfa\x8e\xdf\xd3z\xc7g\x10\x1f\xdf\xd6{\xad\xc1h\x11LK,\xf1\xd4\xf2\x9d\xd7M\x9b\xda\xdb\xfb\xf3\xe9\xeb\xda#\xef\xa1Ǥ\x06Okdւ\xd9\vn\xban\xe1\xfe\xc9V\x1d\xa5\x1b\xaf\xb4\xd6Z\x85\xd0Ħ\xee\x8e\xd9پ\xb9\x13[\x16\xd6\xe3\xdcȷ\xf7\xb2\xa1\x89kV\xbc\x98\xdb%\x9b\xc2ʂ\x9b:\x1d\xd5@S>Զ\xb2\xa3}\xf9\xec\xa9S\xbb\x9d\xcd~\xef\x19.\x9a\xbavm[k\xa8\xb9\xd5\xe1\xf2\xc4l&\x9dż\xb1\xb5V\x89L\xc0\xf5s\x14\xdd\xe4H\xd8\xe5\xae\xf6uvM[2\xbb\xa6\x82/z9ն\x97\x95\x16\xcd\x10.\xebS<#y\\\xa26 n\x97G\xae\xe8\xad\xd6\xe3fmȬ\b@\xcb\xe3\xcexʃEӻe\xf7\xc8\xc8iwX\xb0\xe1D\x95\xb1v\r[#:b\xae\xeeL\xee\xa9_\xbahkm[-\u009d\xd9Nٌ\x90E\x9c\x18\xeaZ~\xf1\xbaemM\xad\xf6\xb0\xdd%Y\x81\xe6\x96뛮\xb0\xe0%\xaf\xf7\xef\x00Z\u007fbt\xb6h%:\x8b\xe8\xb2\xfa\x949}\x1b6\x1dxn\xdb\xf6\xce.\xb7\xcd^%,uXF>\xa3.\x041^\x8ex\x89\x00\x8do\xc9\xea\xf5U\x96\x1b\xccQ\xf1\x1d\xf5O7\xcf\xeb\b\xb6\xf8\x1d\xc1\xb0\xbf\xad}\xf6\xe3\xf3\xd7\x1c\\\xda1\xd5\x15B\x98,5\x103V̒ׄ\x8c\xa2\xd5'Ō\xb2z\xe7w6\xf57Oi\x9f\x1c\b6\xb7\xf4\xf5o_\xf0\x04\x9a\xfbrU\xf8\xd4\xed\xa5\xb9qp\x9c\xa1,\xc31\xf6\x9b\x02\xf7qOi\x16#*\xfbn\x1f\xe3\x1f;6\xff\xd3\xfe\xb1\xf5\x8d\xfdF(\xfdNy\xc5'\xea+ܣcT\xee\xdcq\x9f\x88\xb5\xb3\xbb\xb3\xbb3\xb3\xb33\xcf3\xcf\xf3\xfc~x\xa4h\x03\xe04[\xe6\x87 \xb8A\xfe=,\x13O\x9e\x14c⋢\xc8rx{\xf2\x95\x95+=\x1e\xf4\a.z\xfe\xf9\xe6f\xf4G\xffA=\x92\xbeSM\xd0ϒk߉\xe1kѥ1|\xad\xf8\xe2u\xe4\xa4g\xa5\xbd\\=\x02=j\x82\xac=$\xb2\xf2\xbf\x99rR3\xf2,\xec\x18\v\x1a\xabxٰ\x1c\x8bU`B\x01\xc5!\x82\xfc\"\x01LQ\xfc\x90 \xd3Jc@(\x02\x8f\x11\xc9\x05{˯\x82\xe4\x9dF\xed/\xb5\xac\xe2\xda\x0f\xba4\x92\xe03\x84i\xac\x94bM6A\x87\r>A\xd2 \xc5\x1d0Z\xc9\xf8\xa2\xd4\xe6\xee\x0f\xb9\x18\xa4\xc9(\xb1\x00\x10\t\x8b\xe8zc\xfa\xc7d\x97I\rQ&\x87\xa0\xa5\x01\xc0\xbe\x12\xf8\x0f\x00Z+8L\x18\xd3T\x13\xb3W\xbb\xfd\xe8&\xae\x94\x02 \x90\x93a\xa6Q\x19\x1c\x06<\x10a\xd5\x1e\x87\x18\x11\x90\"\x1a\xc7\xff*F\b\x95\x05S\x11)1\x87^T\x8d}uМ\x03\xe35`\xeb\x0e\x87-q'6nh\x92\xb4\x95־\x96\v\u007fڻ\xe3O\u05ec\u007f\xf2\xe2%\xe5\xdd3<\x1ah\x80\x9c%r\xe2\xc1\x9b\x1eܿ\xa1e\x9a\xa0\t:b\xb5\xad\v\nVY\x98\xd7\xe5\fz\xe8l\xb2N\xeb]6\xc5\xff\x93p\xc3\xfe/\x0foyiOc\xcf\xee\x1f\xb4\xf7\xde\xe95x\xf9\xf1\x9c\xc3\xdar\xd6M\xef\xdd{\xe9\x8f>_\xd8\x12ؾ\xb8\xb8v\xe2\x96\xf9\x9d5\xf2\xf2\xc9\x1b\x96\x80\x8b>9\xa1X\x81ru\xebʓ\xfb3\xb5\x13\x15r0\xb5rd\xf0\xfd\xce\xcae\xf0\xa6\x94\xf8\xe1t\xf9|\x87\xb6¶\xbe\xf9\x89\xbfL\xde\xf5d_\xef\x13\xbb\xcf*\x9f5\xc3hct,g\xa9}\xe3\xfe\x1b\xaf\x19W\xce\x1e\xadi\x99\xef\\\xe9\xb4<\x95\x1fc\xbcs\x91\xff\xe1p=\b\xffi\xde\x1d\x17v6\xf4\xec\xbal\xe2\xda۽\xacN\xa8\xb08\xa4\xd6E\x87߹\xfb\x92\a\xfe\xbe\xb0ٿ}aq̈́\xcds\xa7\xd6\xc8+Wߚ\rD\xceٶ\xdcD^\xc3؉>[DP\xe1\x04j\x1dq\\j3\x16t\x82\x91h \x8ad\x1c[\xc4\x16\x19)\xa1\xd27r\xf2\xe1\xf7h\xf7\xf8\xf9\xb1UW]\xb5jiK\xef97\xf6\x0f\f\xf4\xdf\xf7\nX|\xee\xb9\xe7\xa1\xff\x80\x98/\xc3\xc2\x1d\xae\xd0>g],p\xcdK\xd74\xadY\x8dW_\xdeځ\xb3\x9d\a/\x1b&\xdd\xe2\xf9\xef\x1e-\xc5.S\xb1\x80\xad0\x8f\x14\xdb\xeb\xe0\x89+\xb7\x95\xf40:\xee\x8b\xfa\xecA\x1b\x16\xc3\x02\xd1H4bc\xef\xf8\xb1\xfc\xd37o\x94\xbf|~۶\xe7\x81\xf9F\xe0y\xedW\xdb\x1f\xdeub\xe7\xce\x13\xbb\xe6^yV{1\x87\xf4\xaa\xc7\r\xf4\xaa\x13o\x9d8\xf1\x16\xdc\xf8\xa6\xfc\xecS8#(\x03\xe6緥~\xb6\xf9\xa2w\x86\u07b9\xa8jҢ\x99\x81\xa1\xb66\x9c\xe7ĉ\xec\x1a\"\xc6h0P\x85T\x05\xd1\x04\tu)\xef\x88\xe1 \xa3\x12$\xea\xf9\xab`]+\xacE:\x85E\xf9\x82q؎\xcdW7jD\xc7\xd1\xf3\xc9-7\xcc(3\xe2uŲ\x19{\x0e\xef\x99Q\xa6l`Y\xdf\xe1\xc1$\xfe\xee\x98\xe4\xe1OC\xaeoɊ\x03\x8f\x01\x85\x93= \xb5\xbf;h\x95\a>\xbe\xea\xe0E3g^tP\xd9\xc8e\x90\xc2\x17\xc8\xe4\x97N\xe4\xf8\x82B*\xd6\x00\x83\xf4\x1bʘ\x89\x92!x\x06\xa8\x18\f%\xc9\t\x8c֙\x90\bY\x12}\x16IK %\xd5ep\x1e\x90\xdaH\xd1\t\xe5ZR\x05\x15\x01\x01\x03\x90\f\x11́\x14\xc6\x1cH\x01\xe2+!)\x0e\xf9ʵ\t*\t1B\x801ˬ\xabB\x1b`\xcd>\xf7 &\x91\u007f\x1f)ç\x9c\x84\t&\xaf\xcc\n\x90\xa0\x03\xc0\x04)\xb3\xf2,\x1c~\x93)|H}\xee\xf0ؚ\"\x8a\x8a\xf8\x88od\x10\xf3A\x8e\x9e[\xfbaO:)\xb1禓\xb0G\xa1\xce\xce\xcewLr\xb0\xdf(y\x99\x9e\xc1\xa4ļ\x96\xcfC\x82\xfbg\x8aQ\xb0\xe7\xdc#[U\x1c\xd1N\xc3\xdb84\xa2\xd9~\x97\xd7\x12c\xb4!y\x0ez\xdc\x19\xdfݰ\x1b\xa9\xd7ҔZ\xc63\xbc;z\xe4ss\xf1\xc4.\x8cF\x92\xfb\xee\xed\x0e\xc6\xe1\x81M\x90ؾ\x831\f\x1dF\xf1\x02S\x0eI`A\t\xb1\xe2\xaa4Q\xcaByE\x03軼a\xca\xf9\x11\x00\"\xe7Oi\xf8\x11\x98\xdaP\xbe\xb2S\xbeb\xa9nByḰ\xa6\xe7XK\xf9\x04\xdd\x12\xf9G\xfe\xd6\xf3\xe6\xce`S\x13VЍC\x1f\x13/|WM\xe8߫ʪkj\xaa\xcbv\xfd!\f\x16\xcc:\x18\x91\a\x13|uQ\x89(\x96\x14U\xf3\x89Ϝe\u05f7\xcd\xec]N\xde\xf9#h<;\x87\xc4\xfd\x95\xab\xf8\x16v\xc5U\x17{\x13\x92\x15}\x85\xa2\xdef\xf1\x89\xe6j\xe0\xb3\x05H\x88%X&?\tV\x80u\xf3\xe0\x9c\xd5\xeb~\xb8\x9a\xb9V~j\xf6\x82\xb6\xf96\xbd\xfc\x14\x12\xfbA'\xb4\x96MY\xd7v\xf4M\xfa\xda!\x1f\xfdGP۹re紳\xcf\x1e\xfa \xfd\x12\x14\xd7\xef\x98\x14\xf1D\xd2\xef\x82k\xc1\x97\xe3\xc7\x1f\xf4\x8e\xaf/\xfes\xe6\xbd)\xe3k\x1d\x99\x13q8vI8\x84\xc3\xff#x\xd5\r\xfb\xf4\x90\xb9\x83\xe3G,\xf3c\x80?\x06\xa9\xe6;_\x97?\xba\xfd!\xf9\xe5sy\xa0ٯ3\x99\xf9ηw\xf4>w`\xf6\xec\x03\xcf\xf5\xae||\xf2\xfe\xbc\x95\xf9\xbd\x1b\x80t\xfd\xed\xa0\xf0u\xbaP~I\xfe\xe8\xf5\x9d\xd7\xed\xd3\x15h\x0eh\xa1nE/\xca\xfe&\xbaj\xca\xc4\x03y+\xf7\x97\xacٸ\xf3uT\xc6\xd2S6\xeeo\xeco\xb1O\x9bo\x18h-\x0eN\xf5p8ޗU\x8f\xb52$\x1c\x9au\xa8]\xa8\x8a\xc3\xc8\x01\xac\xbav$0$\xb4\x84\rc\xec\xdb\f\x16\xec߂\x1b\b\xef\ue361\xf2S\xd4\x1e\xa1T\x806\xc6\xcch\xe8Bڭw\x89.ci\xa1\xdc[\xa8\xd5\xda\xf5\x1e\xda\x13ҙ-:\vg\x85\x82\x00\x96\x8e\x95\x15\xdc\x02\xf6\xb8*\x05\xb7K\xde\xcb\xceh\x9eq\xa0\xb4{F\xf3\x16A\xc9\xf1\n\xd9lW\xf2\xa5\xe4\xc1?\x14\x15}\x00\xb8'\xf1M\xae\xf9R~<3.(\x98[v<\xffQHPC\xb2\x0f\x86\xa4\xe7c\n\x1a}I\xcc\x1cbr`\\\x18~`8\x1a\x17\x01\x89\xee\x92{\xe5;N\\\xbbw\xa1\xdbYu\xf3\xae\xf2\x86I-\xaf\x82U'N\x80\xd9y\x18]\xac\xc99\n\xa4\xebKp;\xf8+\xb8\x9dI^\xf9\xf7\xfd\x9b^\x99V۳dv\xdb9!Ns\xe5߁\xf8\xf7_倻l\x961p\xbb~\f\xc2G\x8f\xe6\xd6 p\xecF#\xb5:\xbf\x16\xd9:ԅ\xf0[\xf8\x0e\x14\x05\xf0\xdd\xf8\tH\xfc\xa3\x17˯\xcb\xff\xbe\xa3\xaf\xe7쀿\xb0\":s\xfa-@w\xc7\x1d\xe9;1n\xc2\xf13\xa0+\xb0\x8d\xdf\vU\xe1\x1a&\xd9\xfb\xe8\xda97\xd7\xd7ϳJ\xc5:\xa1\xf7\xd1W\x1f\xfd\xeb\xfe\xbf\x9f\x01ja\xf0\x9b3\xa3,\xec\xba\xe0\x04\x1a\x1f\xc0)\x8a\xbe\b\x8da>\xc5\x0e\xab\x18 \xe2\x12\xab\x18'Tgx4J\xd0A\x1c\xf0\xb2]ԧ?2\x161:\x8b\x85yA\xeec4\xa2Qd\u007f\xcd8\xcd`\xaa\xe4b\x8f\x82\xab4\x8cD\xbflu\x0e\xee*\x80l\xa1\x99.]\x03\xf4&'\xdd \x88\x05\x16\x8dN\xaeY\t\xf3\xb9?\xe6\x0f_\x0fEJ\x0f\x92OG\x92#\x8fy\x8c\x18n\x03\xb9\t^\xc1\xf3\xb1\xf9T\x14A\x9e\xaa/UB\n{d\x8a\xacȎ\xb9\xd7U\a\x95}\x12xX\xda\x031r_i}~8b*\x95\xc9=\xc6^]W*s->\x9a\xea\xaaK\xd5\xe7d\x93\x14\xd2fgQ\x8bU\xb9(\xe3\xf0\x8e\x91s,\xb1Ze\x95\x11\xabM\\\xc6\x14\x84\xbd\xc9\xc0\x88]2\x99)\xb8\x041\n\xcf\x1a\xd8$\x04l!?OnG'o~\xf3\xe6P]h\xe6꙾V\xda'\x19\xf5\x86\x9aE\x8d\x1d\x17\x94\xf36Fo\x11\xf5\x8c\x8d/\xdfq\xc5\x0e\xb2+Z\xc8\xee\x05\x1d\x8d\x8bj\fz\xa3\x04*\xa9S`\xfeO\xaf\x02Ɓ\xfb| M\x95U\x94a\xdf\xdf\xe7\xd3\xc7{o\xbe\xb9\x17\x8b0\xb53g\xd6\xc2\x0e}\xc8(骪\xa65\xebJ8\x8b\x85+\xd15O\xcbOWU\xe9$#\v\x9f\x02\x96+\xba\xaf\xff\xf3\x01\b\xdfZ\t\xe1J,\x942Y\xbb\x8a\x06i\xc4n\xac\x81\xb0>Ŗ\xe2\x1b\xb5X\xe2\xcb\xc6p\xb7\f'E!\xab\xf74\x92l\U0007aedc\xc4\xec\x8ci\xb2\x9a\tS\xa8\x0e\x14(\x97߁T\xce\xd8R_ʠ\x94̈́\xe7\x82$^\xca\a\xfd\xc0\x9bŊM\x9f\x8b\xf2\xcfO\x93wޯ,\xd3cӊф惞\xac\\I\xb8`\xccT)\xb5\x94\xd8&IX\xb9\xaa3\xa1\xe6W\xa3\x1a\xac\nSv$F\xf4ݸ\x15{\xb8e\xa11\xb0fH\x02\xb6ț\xcb\xfcaw\xf2(Q\x1d \x1c\x90\\\xd29u\xb8\\\xb5\xab\xa6\xf7O\xdax\xf9\x81\xcb7N\xeaЍ\xd3%\x8d\x1f\x19\x93hۑ\\W\xd9\xd4\xccT\x17\x14T\x1a۪\xac\xdd˻\xadUm\xc6ʂ\x82j\xa6\xb9\xa9r\xdd\xe2\xeb\x9e\xfa\xe9S\xd7-\xa6\xc9\xcakU-\xba\x9b\xb7\xabn\xeaE\xb3*+g]4u\xcd,}\x85\xfe\x96뮻\x05mf\xad\xb9msM\xd7\xd6\xda\xc2X\xd0\xed\x0e\xd6\x159\x9cU\xb5\x15uu\x15\xb5UNGQ\x1d>\x16+\xac\xdd\xdaU\xb3\xf9\xb6UG7O\x98\xb0\xf9(\x19\xff\x15\xecY\x17\x89A!\xcb\xd49ې\xc2#I\xdc%\xccy\xb8\x94\xa1\\\xa0\xba\x02gf<\xd9/\x19\r\x06\xf9\xe7Z-H\x10\xaa\xc8\x1eL\x86HP&O\xf6\x13\x94\xdf\x1e\x05E\x12\xf4\xa0Z\xa0\u007f:\x94\x0f3.&0B\xa4\x04}\x19\xb0H\xb2\xb4\x9c\x85\x84\xcc`\x04\x12n\xa2(\x89\x01.\xcfY\x802\xb6,L\x10\xc8~\x87]\x99\xa5Da\x80\xdcx\x00\x93Q\xf6`2\xca\x15:\x98\xb16_u>\xb66\xdf\x0e\xe8\xa6)+\xfa\x0e\x8f\xdb{?\xec\x11D\xd0C\xec<\xfd\x84\x01\xb3\x1fUk\x85\xe1mb\x83\xde\xfb~\xdcc|\x1bT\xfc\xf8`\xebᾮ\xd6\xe2\x13\xa3\xcb\x18&\x8e\xcb\n>E\xd6\x0f7\xa2\"B\x9c\xb6\x8c\xf81\xa8\x15\xee\xd2\xe5\x15\xf6;\xca\xd8/\xe0\x9a\xa0\xfc\x06\x83 ʤ\x8dA\x8f$\u007fv\x9aBf\xfa\xbb\x1a\xff\xb5\x88\xea\xc9Ytج\xaf\x06\x1dG_)\x01)P@\tp\x14\xa67\x8e:\x00\xfez3hfa2\x1c\r\xdb\x0f\x85\xeb\xb0\x0f\xa6\x87\xc9:v(\xa6^&\xa4\xb8m胍\xbd\x1d\xf6\xc6ɛ\xfa7Mi(\xd8\a&\xef+\xe8;\xec\xad\xef\xae\xf7v\xf5v\x91\xed\xa4&\x00\x18\x9d\xa6\xa3\xb71\xa8\x97S\xaa\x1b\xc7\xef\x88\t{\xf7\x85\a\x0e\\ر\xe7\xf0\xd6%\xa6\xba\x8eW\xac\xab[\xba7m\xeanYm}\xa5\xb5\xb8\xb7\xb7\xb85q\xb8oqQ\x19\xfe\xb8ˊ\x16c\xbc\x8c\xdc^\xc7\x0e\xbfnBq]\x99dZ\xb2\xf5\xf0\x1e\xfa\xb7\xaaCG6\xb6\\i\x8b\x199I/\x8e\xd4\x1f\x8b\x95\xf1\x96`\xc2\x12\x95b\x94\x98}\xc8\x17\x81ޥ7\xa6\xf8\xe2\x935!\xe5\xed\xe1pa\x9br\x86H\x12\xb5ٰ\x85)\r\n|\xf4\xbd\xef\x87\\\x9c\xce\xd2\x1c\xc0n\xef\xbe\xe2\xe3@s\xbc؇Ӂf\x8b\x8es\x85\u07bf\x17\x1fj\x98\x82Z\x87V\x9c\x0e\x12\xad+m\xf2\xf6#\x1f~xd\x9f\xf5\xb7\a\t\xa4\x86\xa7\x04Iq\xa2|\x1eY\xbd;$\xa2\x9d\x12\x0f\xc4\xfc`\a\u007fk\xddG\x0e^i[ي\x9aF\xe5\xfaT\xec\xaaX\x9b\r*\xbeQl\x0e\x1e\x1d\xe9N\x91\xac+\x94\x8a\xa1\x1e\xc9xD\xc9\xfd\x04Ց\xe9\x1f\xa2\x92\x8a\v\x14\xa4\xf6-M\xa0\x83L\x12\x83\xc6\xed[J\xa3\xf4 \x92\xb7\x14ϧ\x81\xa1\xd4\xd2},\xb5\x0f\xb5i.F,2\"B\xec\xfbG\x85щ\xef\x19\b\xf6\xbd\x02\xbf\x14\xd90\xa1\xca\xf6~\xf2\xa6Ie\x81O\xe9\xf4\xa8Ö\x8f\xe0[咛\xba\x13\x89\xeeo\xbf\xe4\xa9\xc3}\x83T\xdfa>\xf1\xe1\x91ľ\xa5\x18\xed\x12/\xc2\x1c\xa1\xc7\xf7o\x92\x93\xe9\x14z>\xa3E}ʋ\xdb\v\x0e`v\xae\x1c\x16z%5Q\x91\x06\xf8l\x84\xa9ҥH\x97\xb1+\xd8+\xc3\xd3l6g\x9e\xb4\x03\x93S\x1a\b\xf0\u007fÔ|\x18\x05\x1c\xc5B\x91\xe3h\x988\xbe\x0f\xbbڱ\xa9t\x12}\x16C_Ꮐ֣\x0f\x05*\xf0\xb0=\xc4\x19\xaf\u007fd\xfa[\u0099\x01\xd1\xe8M{\xf7\x1dW\xec\xbeJ\xfc\x8a\x84f\x03\x05\x03w.a4\xb0\x8d4\xb2\xf3\x16\x1f\xe6D\x05\xea\fo\xc9\x01\xe4*\xf9\xd8\x11V\xc0\x91VA\xf68\xf6sP-\xef\xc9Ҟ\xc2}\xe0\x02\x9dA\xfe\x95\x01\xac\"\xee\r\x14\x06\x1d\xce@\xce\b\"\x1cȤ\xf2\x8f\x8a\x02\xb3\xaf\xb0\xa7t0\x89\xef\xc2\x11+|\x87|E\x91\x014\x18N\x8a\f\x85Ł\x93\x14ݓ1\x1a\t\xfd9\xeb\xde)*\x97\xc6\x11\xdfY\xfc\xfaѶ\xa4\x87\xa9\x9fQoP\u007f\xa4\xbe@\x12\x94\t\x14\x83J\xd02\x9a\xb7::b\x9f\x1d\xb1?2\xffH\xde\xea\x91\xe7ϴ\xff\xff\xfa\xfa3\xe5\x1fY_\x8c\bn\xc9x[\x8e\xc2b¼\xd2Y1-\x87\xd7M\xe5ҧ\xf2\xd2\xf4i\x8e\x9f.\xfd\u007f#?<\xcd\xf1\xe1e\xc6\xf8\xa9\xb8n\x04\x18\x8b\xcag\u007f\x1f\xc8\xd6\xf4_\xa3+\x9ew,\xfd\xaf1\x0e\x8e\x95\xfa?\x95Q\x1e\xeb`\xee\xe7\xe4\xf5\x18tt@\x11\xe0\xf2܁\xf1\n\xe4w|3OQ\xbf\xa7\xbe\xfa\u007f\xff\x95\xfcozi\xd6/#\xaf\xbf\x16\x80\f\xdf@ :\xdcۨ\x05Dl\xa3\xf1\xed#\xbe\xac\x06\xf3\u007f\xa5w\u007f\xdf\xdew\nk\xc2h\x1c\xc4i\xa5\x17\x92Sy\xe5I\xaa\xf7\xcb\xf4M\x90@\xa3$\xe6\xc1I\xfc\x1f\xeb\xa3g\xe8QC\xd73I/\x1e\xb0\xbd\x83Iү\xe8\x94RО\x9e\xacc\x95\x92\xae\xcc}>\x80\\!\x0f\x84\x90Б\xc8\xf2\x98c\xdbk3F\x06ʷ\xbe\x12\b\u05cc8'\x91חe\x8f\bd($lٷY\x1bS\x00 \x86\x19hC\xc4:\x1bSl\xb3\xd9i\x98,\xbbɯ\x80䝂\xe6\x97F\xf6i\xef\xa8\xfb\xe0$\xac\xc2柌\xe5\x16\xfbt\xf6\xbb\x12\xe8n\xc4_=\x94\xc1\x96Pp\xeb\xc3T\r\xfa\x16;\x95(\xca3V\xfd{I\x85D{\x1a\xa3\x8aiEZL\x12\xe9\x87I\r\xa6\xfasҢ\x17\x1d\x04\xfdc\xd7\xe6\xf3\xef\x14\"3\xf8\x1c\x04\x17\x1e[*8#\xe0\x03\x8a\b^NG#\x96\x00\x1f\bc\xab`4\x1c\x8dcCf4\x1eq\xa0\xa3\xd1&\xa8\xf8\xfa\x82\x88\x83E\xda:\x9f\x04\xf2\x87r\xff@B\xfe\xfd$\xdc\xfc=\xfd\x89D\u007f\xaa\xc7\xebM\xa6RI\xaf\xb7'\x85\xf7\x8904\t\x04\x13\x03\xa0'yP\x03\x13^\xf4?R\xc3\x04\xad\x17\xf4\x0fxS^\x8d3\xe9Ԡ\xed\x00\xe8\xf7j\xb1\"\x98\xf0\x16\x8e\xd7\x11\xfd!\xa1\xfa\x9fp\xa8\x17\x12\xeb\x04\x16sm\xbeh\x9c\xb4g8\xee\x8b\xfb\x90\x98\x84\xf1\xb6\xa7G\x1941$\x93G>Lx\xc1\x80\x97Ny\x138\xde\xe2\x14\x15\x9d.'R\xa9ԇG@\"\x91L\xa6\xbcC\x03\xc38S1\xf3I\x8e.u\x84ߣ\x02\x0fB\xf0\x0fG\xe1\x00\x11?>\x99\xca\xf1\xd6\xc2\fsj\xbe\xed6\xa5خ0\x05FƆ\x85\a\x04\x19{\x01\xd0\xff1\xc27qD\xb9\xbe\x0f\x97\xebX\xe5\x92SJ\xd9Rʳ\x94R%F\x96L!sM(\xa5\x1b~\x01l\x1c^0\x88\xe4\xec\x19\xf4\xbf\x98\b\x92\xe2\xc6a\x8dv$\x17.\xaf\x05\xccX\a\xe1V]\xadΥ\x93\xabt:\xf0\x16J\xd4\xeat\xf2\x0e\xb0\x1f\x1c\x18\xf3\xf01\x92\"GЏ\x92e\x87\xbcC7\xf6aR.#*\xd7\u007ff\xcaE\xe5|[r\x9c\xba\xccX\a\xe1\\\xfcp\xe5\xbe\xfb\xd1\x13\xc8M\xc1[\xa8\\c\x1d\x863\x94\xb2\x92\xbd\xfd`\xbfZ\xe2*\xdd؇q\xb9fPW3\x11f\xee\xb0\xf6\x1a\xce\x0f!\x8eu\x90\x89\x9c\xa9\xd6\xc3\x0e\u007f6\xaa\xa8\xf8\xf9\xe0\xfc1\x0fSJ\xb9\x8e\xa1rm\xcdo\xaf\x11\x1c\x13\xe2X\aQ\xb9N[\xdd1\x0e\xc3c\xa3_.ʁ\v6\xc6a<\x16\xa1\xfe\x05\xb7\x92\xf7\x88K\xa5\x05#\xe9\x96QGRs\x0f\xeb7\xf4gc7\x16\x19\xdfP߀s\xb3\xf7\xfcޝ\xe0to\x9b\xdcs\x0602\x11z\xaer\xcf\xff\xc1\v\x04\xe7\x9e\xee\x9d\xe0{V\xa2{n͕\xf3{6>]y\x9a\xe6T\xedЊ\xdcX\xad\xe0\xa5\xe6\xa3\xf4(\xb6|\xab'\xab\x91\u05f5\x82h\xde\x18\x82\x97\x1a\xbf%\"\x02\x97 \xb6\xfd\xf4\x80\u05eb\x90\xa4{\xbdi\x02\x91\xc4\xe1`./Md\x8a!\x9c\x95\x9e\x81]Ђ\xb3[\x8cx\f\x11\x9a\xbbC9w\xb4<\x1f\x10\x13\x89X\xc7c\xdbpKC\x00\xe4a\xcf\xe1\xb2b\x11P\x95\x19#lm\x1d\x1a\x01\xad\x11Пur\x9b8\xd8/\x19\x19\xf2\xf8\xc1\x14^\b\xedW`\x9b\xfa\xe9Mfs\xbf\xd9\f(\x05=TA\xbf\xa5{r\v\xdc\xd2\xd0\\\xb2X݃f\xa9\xac?8\xa3\xc8:\x0e4\xb3g\xe5\x9c\xe0\x98\xad\x96\xbfd\xa0\xe0<\xfcPm\x01#\xad4V\x0e\vo-Y@\x18PV\x94\x87p\t\xe8׆9\xea1J\x01Ⱥ\x89C\xf1F?\xdd\xd3!i\x82&0\x92\xc2\x00\xbcI\x00\x91\xa8SH\xaa\xa3H\x1d\xd1o\n7A?\x18\xdfU'S\xca\xeaC]\xd7\n\x057\x894\x81\xb2\xdeO\xcf\xf0z\xbdC$\x03\x83\u007f\xf3\xe7\x1f=*\x0fE\xa9L\xb5\xad@1NfY\x9eoȒ\xd2\x1e:4\x8a\x96\x96\xe9\xcf#\xad}n,\xac\auN\xf7\x11\xf6\x9f\\}Za\x13\xc8\x10\x1dgi\xc8\xf2\xe9~\xc6\xce@S\x9b\xba\xe5d\xf7&l\xe2'\xb3Y\xa2\xefp}\xe9@\xf7&:y\x9a\x130\x81\x0fo\xea\x86)\xec\x1a@\xa6\xbe\xc3}H\xf8U\xb2\x8fq\x9c\x1a\xb3\xdc\x02\xccSs\x90\xacG\xe6\xe9|\x9a\xa2\xef\xce@S\xa3\n\xb6\xa9\x1b$q\xb9Os\x82I\xa5\x13#K\fH\x89Os\x1c\x17Y\x83d\xf9\x04Y/\xd4R\x16\x82\x8a\x86\xbf\xbf&5\xd6@\xc1ѩ\xcdF\ff\xa2\v\xac\xca\xf2k.\xde`\xec\x1c\x8a\xd7\x1e\x14\xa6G뺦\xf7\xc1\x16Ÿ~%\xd90iB\x15\xd07}\xa8y\xf9\xbe\xe5\xcb\xf71_\xaa\xa6w\x05\xd0lᆬ\x98\xf5q\xe9\xbe_\xf6M\xc7\x19\xe5\xffR\xa4uŐ\x9e\xbe\x06\xdfp\xfat\xfa\x1f\xf8\xd2\xe5\xe9{\x94\x93JH\x82\xbcE\xb92#\xc7f\xfb,\x95\x8ft\xc1\x8dD%Q}\x1b\xf3:\xe30\xfeZ`\xa51\xa4\x82\nb\x8a\xfd\xc1\xd9\xf2\xe1\xfeW6K\xc4+\xa1\xd1\xf1b\xdad\xe0\rf\x93\x85e\x03\xad+7\xdfr\xdbJLZ+S\x12\xd6!\xd1\a\x0f\u007f}w\x14\xf4\xffP\xfe3\xefwi-V\x936\xc0u\xc4\xd7\xf4o\x9f\x1f+6\xe0\x98]\x92\r\xff`\x14W\xf9\xdc\x1fd\xb1d)\xf2\xdd\xd5P\x8b\xf0L \x00\u007f\x15\xa8#,{yi\x87\x82*\xe5\x0f+\xfe\x91\x1e\x1aӕђ\x95\x17\x98\x80\xbf\x8a\tg,cʺ9^V'\x8b\xbf0Y\xd02\xaf\xa5\x00\xff\xc0[\xb2\xc9g\x0e\x9c?\xee\xd6)\x0fM\xb9\xb9\xfc\xfc\x03\x89\x95\x87~0\xe7\x819?8\xb421\xd0\x12\xba\xfc\xfa\x9f\x1f^:3y\xff\x81+\xfa|\xadW\xb8#\xe7ܻ\xe1\xfa\xbboط\xfe\xde\r\x11\xf7\x15\xa0\xb7{^GǼ\xe1?\x17]\xf0\x80M\xaf\xb7=p\xc1\xa2K\xa7W\nB\xe5\xf4K\x81捋flj\x0eh9i\\\xeb\xea\t\xbb\xde\xfc\xecȜE\xdb\xd6Κ\x17\xf0Ι\xb9v\xdb\xc2\xd9\xfdÿ+\a~\v긇\xbf\x9a\xef\x1c}\x15\xb6$\xa4\x8a\xa7\x139\xf33&\x8d\x1dE\xa04\x00ɹD\x16R\x10\xfeu$\xa3\x92\xc2c\xb9\x9d\xc5<\x96a\x1c!\x05\xea\x14\x10;\xd4\xc2\x04\xb4\x17Ă\xbe\xe8Ȃ!ŕ\xcd1/嗋X\xcc\x1dv\xee\xab\xe8`\xaat\x89K\xfe\x9d\x18e\x12\xa5K\v@H\x1c\xbc\x92\xa62\u0605\xb8Ѐ\xaa8\xc86T\xc9\xef\x95\x1fj\x1fLeˍ4\xbbT\xec,\xbb\t.\v\x94\x17\xcb7:́\x8ab\xb0\xc1\xfex\u007f\xae*GASt\xd2=\xad\x8d\xf2\x8d\xd1I\xb9\xca,\xed\xaf\xa9\"\xf3\x1a\x9b\xc7G^H\x95Pu\x84e\x88\x98PC\x04n\x84\xe0A\xb7\x02\x0f\x18\t\xeaG\x99\xab\xa0W\x80f\x0fD#\xbf\x98OR~^\xf0e\xf9\xe5\xa0\xc6\xe9*\xa8\xd6\x14\\\xfe\xc0\xe5\x05\x9a\xf1\xb5NY\xa7\xf8\xd2LW|i\xa6\xaf=\xfa\x99<\xf4\xd9ѵh\v\x98ώ~<\x92h\xfd\xb5\vo\xb8\xe1Bt\x03t\x9b\xeeU\xab\xba]Ns5x\xa3O\xb9\x9a|\xfa2\xbelm\xee6h\xb8\x1e\xf1ݎ]7;\x81\xf1S\xec\xfd\xd8\xe3\x02\u007f.\xff\x83\xbai\x9c\xb5\xe3\xd5ZU\x17\xb8\x9c\x1a\\W9\xfe?\xab[\xa4\xa0ڜ\xa9\x96\x06\xdd\x06U\x15j\xff\xb7u\xd3\x13\xdf\xfdrl\xe5\xcf\xf8!\xe2.\xf6\xfd\xab\x94\f\xb9\xd2D߄I\x97\x1c\xfa\x9f\xd5D1\n\x82'\xfeG\x85W\xe5<\xb4Qf\x99\xf6\xef\xb7B\u008c\xf0\xef*1S\x01\u007f8\xc0)\x10\x10\xbeZ:!\n)QH\n\xa2\x12\xf1\x90I\u0084Z\x19u#\xbf\xfdv\xea\xd0\xfb\x87Ro\xcbo\x83\x8a\xb7\xe9\xe4\xdb 5\xea\x1a\x9c\\G\xaa\xa3zx\x11\x9c\xf2d\x12T\x80\a\x00f17e\xd7E\xf0X\x8c\xfd\xa8\xf1\\9\x97ZAm\xa0vP\x97\x92\x95\xd7{\xa8Lj\x15\x1f\xd5\t\r\a\xa8\x1e\xf1\xbct8/\x8d\xf2\xa0\xf7\x86Ҩ\x16\xc1\xd3\xe79\xe3\xf1ӥ\xd9\xfc\xb4%\x9b\x8e\xe2}\x89\xb0\x93\x8d\xb4\t\x98{\xcc\xe8_\xd2<`F\xff\xd4=\x862\x0f!\x81\x91\xee1\xa7\xb3\xe7\xc9\x06\x8c\xbd\x9b\xd9ʔ\xba\x9fۢ\xdbn\xc2\x17|\x8b\xa6\xd5\xe9\xd1o\tv&F\xd0\x04\x9bH\x8e/\xf3~\xd3_\x8e:$\x8f\xb1\xa3n\x80\xb2Q\xff\xc9\xfd$\x9f\x19ǟ\x0e%\xf1\x1f~\x10\x8d\u007f\x15\x91:\xa1\xae\xd5٩2j\x01\x96\xd62\xbeA\xbc\x85\xf0\x84\x10l\x000\xc2l\xa8Z\a3\xd1q\xd8єɢGĉ\xdbk&b\f\r\xee\xc9\a\xf7\xcfi[\xfd\xc0\xf2c\x1f\u007fu<~\xf6\xaax\xbc\xb0\xa2\xe1\x82\xc1s\x03E\xc4\xdeU\x14@}\x8bM\x05t\xfc\xefnZ4\xb901yS\xe3Z\xf9\xab\x15&\xd1l\xf6\x16\a\x16^}o\xe7\xa6_l\nEv\x1e\xb7k\x8b\x8b\x8b\xc1\xdf`\xef\x12oM\xfc\xe2\xf4\x83\x9bM\xc1\x02\xb7`\xa77\a\x1a-\x83\x02\xb1\xbf\xfd\xd3҈\x8d\xda\xdb\xd3lXd\x99m\x01\xc1\xe7)\\Ԩ\xd5HA\xf8q\xc0j+o\t\xb5ƥM\x06\xd6,Zq\xecO\xa6\xee,\xea\xc1eT-5\x99ڂ\xbfC\x8e\xb7\xc5$\xf2\x8b\xd2\xe1(\x1a*\xb5\xa89l\xa4R\x0e\x1b\xaa\x17:\x89\xeaj\xb3\xff\xffj\x16:\xf1\xc4+\xaf=\xf6\xd0\xdb\xefҟ\xfc\xedF\xab\xc4\xd6\x1bk\xa5*WE\xa0\xc2\xeepIk\x9f\xd8 Y\xcbj.8\xf6\xe0\xfeJ\xdf\r\x83\x0f\xfd\xaf\xda\n:S\xe65\xcf\xf4\x80G^М\xff\xdcF\xb9\xfe\xe9m\x95\x03\x9c\x96.䜼\xc4\xe9\x19\x86\xfeCcT\xcb\x1d\xb7@\xfe\xb9%\x9a\xe7\xcb\xc0\xe7\xff\xbb\x86\xc4kKH.!\xeb\a%\n\x1b\xe7\x88\xf5\x03\xbbud\xfc)\xec\x1ckAA\xc7T\x8a\xc2\x101\x84\xd2x\xd4\x1a7\xf6*\x8a\\\x99\x17y\x87\xfbp\xe5\xa9\xeb\xf9\xb9\xccg\xe4\xf9\r*\xc7\xe8\xf0\xe55\xbbU\x8bftL\x92\x86\x03\xe91\x84\xf5\x98ń\xeb\xc7Zm\xd3\xc1I\xf2\x95\x8c\xc3\xd0j42`\xbb\x92\x80W\x8fY\x81\xfdc\xafD1\xbe\x93_\xa1\x8b-\x8c\xc3\xc8\xea\x95D\xbaw\xec\xca\xe5|㟥l\x18S\a\xd82\xf04\xb8B\x18\xb7\x92\x00\xd6a\"\n\xc5OR\xc4\xeez#2\xd9\xd0\x13\x90(K\x10l\x14q\xbbh\\X\xde*I\x9c\xd1_\x1e-\xe44V\x8e.\x80\xe57&\u07b9kx\x1ep\xdb\xf1\a\xc1\x8b\x931\xba\x8a*{cG\xf0I\xf2\x16\x1c\t0\xa3\xf1\xa6ݻ\xeb\r\x16\xa0q\x81\x83\xf7M\x99e\x1c\x1c\x91O>Y\xf8\xf3c\x8a\xac\nO\x1d\xe3\xf6\xb0\x03\x94\x8e*Eu\xa8DmO[\x1c,\x1d\xd6\x02\x89\xe0\xb7\x06\t\xe7\x11f<\x8aa\xc2#$\x81K\xac\a0w\x03 \xdf>\xd1s\xa4\t\xb46\x1b\xc0W\xf2\x8d\vX\xbb\xc3\xe2\x90\xdb\xe46\xb4\xb1\xb3\v\xe4\x1b\xbcb%\xf8\xf7\x87֢Bۇ\xe0ߕ\"l?Y\xa7k\x06\x13\x87Z\x8a\x1f\x00\xab&\x82\xa8|\xa7l\xf0\x05\r\u007f\xff\xbb!\xe8\xc3\\I\xde8\x8f\xa9\x92\xc6\xc9\r\x9d|\x9c\xca`\xef&\x89\x8f1\x95\x03\xd5\xf7\xf91\xe0\x1bP\xb0/\xd8\v\xd3IK)\xab\xb3\xbb\xd3){@'ZY\xcahv\x8b&\x9e\xb9g\x90\n@6`\x87\twE\xa9\x0e&yI\x18\x97\xc1\xdaIJ9D\xa3I=A\xf0\xd7\x02\x9fb\x01̚\xf9|\xaa/\x85\xa2\xe8\xe6H\xa8\xe3\xa8\xf7\xe1u<\xe2\xf4R\t禓\xe8\xef\x18\x93̘*\x86\xfa\x87Y.\xe8\xb9\xffF\xfdE\xab\xfd\x9a\x18vP\xd6ߡ\xbf\x9e<\xeb\x06ݓg\xe1\xf8Z\xabE\xb9\xff=tL\xa4T\xfe\"&ǣ2=\xb7\x8e\"\x8e\xf0\x19ǾG\nGL\x11 \v`D\u074bg\xc69\x1b\x1e\xfb\x90X\xccF\xd5\x03\x00\xfbMe\xfe\xc1\xa7\xc9\xe6\xe6\xba\n8\xd0~ErnE\x1d\xd2F\xeb*\xd4Mlu|BWY\xd8Bv\x9d\xe4\x12\xe6i\xb2\x99J~{\xea\x16\x17\xc8\x1f^\x1c*/m\x9d\xe4*X\\\x87\x15wt\x88\xae˥e\x93\xab\xd8R\x10,k\x9e\xa5\x1eT\xb0\xee\x93$\x96ӈ\xb4\xf7 \x92t\x97R\xbd\xd46j\xaf\xca\x10\xac\xae<ڭ\x0e\xc5'\x96\xf8\xb8\x84\xf2\xe4E6\x1b\xa3\x10\xc6\xe0ZhP\xc0\xce\xffq;\x1a\x19\x00\x9f\x05\xcbq\x00>D\x9c\x11\xdb\xd4@\x04&\xef\x16 \xef\xd6찇\x82\xa7NQz\xa7^\xab\x05\x14~y\xfd\n\xd3\xd2@^,,\v\x15\b\x1c\xf9Q\x9b\xed\v`q\xcfq__X(\u007f.\x06l\xa0{^\xfa\xa6/\xe4/T8\x1d \xa2c\xf2#*b\x0e\x98i\x83\xd7\xe4\xdd&\xfdO\xe5\xd6\xe0\xa6a\x0f\x04\xdaS\x14\xe9\t\x80l\"y\xe1\xb8\x03$\u007f\xff\x05\x18&\a̲\x05D\xf9s7P\xc0u\x80\xf4\x85\r=j\x01\\.\x02Q\x05ܑ?\xff҆\x8a\xb4\xe0|r\x81\xfc\x13\xdbz\x854\x8aʻ\xe5}\xc3\x1e\x86ǃ\x1e\xf4\x91\f\x91u\xcdfůs\x98\xe5\x1b\x8ffB\xfeQ\xe2\xe8\xae\xc2B\x93\xb9\x14\xc4E\x1fv^M9\x914\xe3$?\xa0\xb98<\xa5\"<.\x8e\xf6L\xb6\xbd3\x9bj\x97\xb5L(\x0fL5\x8a\x06\xe3\xbdFV\xd3\x0f\xc6w߽w\x0epf.p©\xb1\xe5M\xcdn\xbbc^\x81\xa58(Uν>\xe0n\xac.K\x14\x15\x9ce\xd6\xec\xd6y\x8c@\xd7\xda{SF׆\xf8{\xf6`\x1e\xad|\xe4\v\x85\xa673\x91\xd9\xf07K\x8f\x9cݒ\xca\x1apȕHd\xa8\xb0Q\"\xa9p\xd1(@dY\xd8\v\x90T\rc\xe9T\x88YK\fKJ\xe0+\xa4V\xa2\x1fO\x96wd\xc4C$Zѧ\xc3tH\x8d\xe1ο\xbd\xa7\x10\x84\xf1n\x18\x14\x82 \xb6\xcc\x06\x81w\x00\x9f\xc4?\f\x97&\x19i\x02\x88\x86G,\x8a\x95\xd9\r蛙\x86\xeb\x1a\xc0\xd1\xfd\x84\xe2\xd0\x04|шD\a\xa2>\x02y\x10\x89\xb5A\x9f-@K\xc0\xe6#\xee\xc4L\xe6\x1d\x85\x15\x0e\x1b\x12\xa9\x13\x89җ|sĩ\xa1i@3@g\xbaM\x96\x93/<\xb3\x1fX\xaf\x846t\x90\xd6\x14\\\x05\xc0\xee\xa7_\x85\x9f\xa6e\x9a\xa9\x9by\xd6̺\xa6q\x91*\xc1\xbe\xde\x15\x9c\xbb\xfe\xbc+j\xa6/\xea\x8a\xd3\u007f\xbd\xff\xfe\xa12\xad\x81\xe6\xb5\xd0\xea\xe7\xbc+&\xadZ=\x8d9s\xd5\xde{\xdd]\tF\xd7l\xe2\xfa\xf6Ǝp7\xa9\x17@\xba\xd7Ŭ\x827G\x05\xb1\x0f\xbb\x1d/Ð\x1e\x11\"\xf3\x18^9M\x82\xee4%?\xc2}e\xd2\x17\f%C\x8di*\xd4fFi\x1a\xa5i\x94&8{L\xd4?\xbdp\x88\xaa\x18\xe7G[\x06m\x95\xf5\xbe\xf7\xc9Xګ`d\x11\xf4l\x8c'k\xf3\xf3\x98\x14&\x14\xad\xcb\xc5\x1ecb\x1f5n\xa0\x1a\xf8\xc3\xfe\xa8\x05cd`A\x17\a0g\x02\x96\t-\x12\xa6\x8a\xb1\xe1\xe6\xc7X\x1b\n\x01\x10R\x10\x16\xcf\x1a\xd7Y\xd9\x11<\xcf\v\xecz\xffŽU-\xf3\x02\xe3\x02\xe7̞w\xbe'\xe8\xa9\nv\xaf8\xac\rj\x8d\x00BX\x1c\xa4\x0f\xaf\xe8\x0eV\xa1\xe3\xe7\xcf\xef>\a\xe5\x9aג\xf8k5`Y\xe0\fTT\xda\x1bj\xba\xcb\xe7,\x01O\xceƧ.\n\xdf\x1cf\x91ء\x8b6\x04;*;\xc7\xcdZ\xbcdNywM\x83\xbd\xb2\"\xe0\x84\f\x84\x000ԈKՒ4D=#\x9e\xa6\xcaeL\x92p\xd9E\xc8\xf7H\xf16_\x86-\x9d8\xa0\x87(\xfcu\x92\x95wʫ\xa6\xf1\x94\xe0%S\x82\xd7\xce$\xe5\xf7\xde#0\x84\xeaz\x03\xa0ޓ\xdf\xc3\xcb\a\x04d\x11%NQ\xc7\xe5o\x8ec\xff[:\x91\xfc@~ƹOq\xae\xdc\xe7\x04S>P\x86\f\x05\xbf\x91\xa0䬕\xa9}Ǐ\xef\x83\xf8\x17{\xd7\"\xb9f+\xf1wm\xc73;\xbaa\xb68Z\xa0x\xd1\xf3\xa8\xd1\xf3\n9\xaa\x02a>\x1f\xf3\xc0n\r\x02\x05\x04\x1d\x98\xd6\xe0\x10\rf\xbd|\xd3\xf1}\xf1X\xcf\xd9\xe7\xbbϓѸ?G\xa7c\xde\"[yg\xfa\xfa\xe3\xfb\xd6\xde\ag\xadY\xb7Q\xa9@\x14z䛒\xfb\x8eK=\x11\xb5\"\xaeaU5v\xc8:t\xa5\v\xdf\x02o\xd1\x1dp\r\xcf\xcf\xfaI+\xbf\x9c\xe3'\x9d\xe7\x04\x8a\t/N\x12\xb6\xc5\xe4\xf2\x89\x98AO٠#HzK\x01/\x01\xd1 \xf2]^z\xe6 1Q\xb18\x92\x880\xe7)\xbf]\xa4\xddh\"\xf3\x0e \xb9\xaf+\xe7_\x1eTa\x1d\x83U8\xd4i\xb8cm<\x8a\x91\a\xd4\xcf\x1aǥe\x1d\xa4}\xe8d\x90\xc0\xc5@ų\x9c\xfe\xa1Ac`h9\xa1\x17NQ\x1b\xafS&\xbfݫ\xbcM\x9b\xa6\xb4X\x19K\xa9\xd9\xe8\xb0\x18X\xa9~\xc2\xfa\xfa\x82\xe5\xfb\x96\v\xa0JЃ\x14͠\xabX\xe5\x9d\xf7\xc8)\xb3\x96\a=Pԯu<\xb2u\x88LU\xb4\xb7\xefA\xcf\xc6\xea\xa6i>M\x807\xd4:u\xde\xe9\x13&\x89e\x15\xb8V\xbeb\xbd\b{\x00\xaf\xc5u+9\xe5\xe5\x14\xbbde\xaen\xc0\x8a\xa5W\x1a\xb3\xf0\x11\x04\x1f\xa4jdS\xb8\xfc\xf1X\t6>\xf5\x13A\x158ozt\xf6\x16+\x14\xe4$\xaf5\xe8\x13Fv\xbe\xfc_\xf2\xdfiN\xd0&,\x86\x01\x9d\x19\xec\xea\xe9>\x0e\xe6\x01V\xb02\x8a\xc4\n\x92\xdf\xca7>\xd6\xdd#_f\xd6\r0Z\xfcҬ\xa0`>\xd0&$+H\nкe\xf6\xb3\xd7H\x19\xff!\ue122o\x00ڇ\xb9\x92\xca\xf1և\xfeh\x1f\xc1\xb7\xe6N\xdc+?\xfa\xa8\xb1\xd0]\xff\xe0\xab\xf2\xa3\xaf\xca\u007f¿\xb70Ck~\xd2\xd4\\\x06\a\xd3,\x9d\xa8\xf7\xfa\x86\xa6\xd0\xcf\xe0?0evg\xe7φ\xfb\xc1\xe0\x01\x87\n\xc6cuH\xc3\xca`\xd5s$\x1a%\xdf\xd4C_\xbdV\x92\xe4\xd7@D\x92\xd6b\x8d\xaeQ\x92\xc0\x8bR\x1d\xfc\xc1\x88Uͫ\xf1Y\x10A\xf9\xea$|E\xa3\x92\x19\xbe{Z|u\xe5\xf9\xe8\xd1a\x15\x90ޡU\xc1\xdf\xf3\x9f\x0f_C\x8fSn\x87n\v\"\xf2k\xa4 \xf4\xe4\x91\xcfǥ\xc2ES\x8a\xf9\x1aʇ\xaf8\xd3\xf3A<\x96\x89vQ \xf0\xb5#\x9e\xcf\\\x9dW\x1b)WI0\xb2\x01\x80\xd2\x02#\v\vF\x16`\x8cw\x90i~m\xa6!F\xbe\x83\xcaQ\xf5R^\xc2ȥ\xe5\xcfH#\x8c|ap\xc7\x18m\x90 \xb1#\x16\xd2\xc3\xe2\xa8gaH\x9a\x80\xc4F\xa2A\xc9\x17\x06>\x9a\r2}桫\xaa\xe1j\xfb\v\xcf\x1b\x1f\xb6\x83>\x06\xac\xabM_d\x92\xeb\xd9d2\xfd\xd3\xf4/\xe8\xa3\x0f\xa7?\xfd(\x1a\xbdJ\xfet5X\x05\xbdO\x80wN\xae\xbc\xfbn\xd2\u007f\r\xa7\x12\xdc\u007f\xab\x18r>-\x94|<\x8b\xee+\xf9\xe2> \xb1\x1f\xca\xff\x1ez?=y\n\x18W\x04~\b>\xee\x18\x9c\xda\xc8<\x13\x1a\x9c\x8a\x86\xb7W䯀\x1e\xac\xbe\xfe\xae\xbb\xc0\\0\xeegj[\x99y\x85\xb3c~\u07b7\xaa\x8cCՀC\xad\x14\x1e\x85C\xeb\x01\x8e<\xb59O\x01\xb5E2VnK+\x88g\xc0j\xe9\x942*\xad\xb5j\x18\x83~\xd9\x0ey\xb3\\'oޱL+0\x1a+\x1a1{\xec\x1a\x8diu\xfbW7*\xc2v\xe3\xe4\xc3o\x1f\x9eܨ\xec\xdc\xf8U\xfbj\x93Fc\a=\x82\xc8|LƦ\xa1~\xb9߮\x81\xdae\xd7\xde\u007f\xff\xb5˴P9i\x95̫\x97\xec\xb6\xc2ˉ\xf4~\x8f\u007f\xfbd\xec\r9y\xbb\xff\x1er }\xa1u\xf7\x92\xd5f\xc9**\xdf?\x91\x1b\x02\xa38\xb6\xb0?'a\"U\x91\x04\b[/\xe3͑zyU\xc9@\xa5\xfbʙ\xc4\b\x16p\x82\xf0y=\x83K\x8e\x9f.\xa7\x86۳\x14\x1d\x9fH+9\xa4ې\x973۽\x94\x99R\xffNg\x13Q l\x81]\x8d}\x02g+D\xa5d\xf9\xff\xa13\x18E\xe0\xa7\nd\xed٠\xf5C|=\x9c\x97\xbd\xb4\"\xbd猖\x1d\xb2\x9e\x82D\xf7$\x9d\xc1\xd3\x1a\xa51\x8e\xf4\x9d\x1e\xe5K\x9d\xac/%\xed\x94\xc2\x1e\xa0c\xa7io&5\xe6O\xd6\xe7\x05\xe4p\xbdF\x95\xc3r\x86\xfd\xfcr\x8c\xf5\x03re\x00\xbf\x1d+\x99\xcf9\xcdSn*\x8a\xad\xaeY\xdf\x17L\xb4I\xecD\x84#\x01\x10\xd9#\x04\xab@\tfq \xc7패\x9c\x18\xcd\xd0\b\x15\x97a\xf0#\xa3\xfc\xcc'\x82\xd5b\xbc\xf5}=\x10\x8dI\xa3\x15\\̮\xfd\xc9'\xf2\x87\xb7\nZ\x9dh|\x15,=\xc1\x93\x13:=(\xce\xf7\x8cT\"\xfa\xfd\x9f\x80)F`E\xe7E\xa0\u007f\xffV\xa3\xc5j\xbc\x15\x14\u007f\xf2\x93\xb5,\xd0\xe9\xc8Q\xfe\x84|\xef\xabFQ\xa7\xa5_\x1b\xe9/\x99\xb3\xe1a\x9c\x93|\x06\f2\x94\x13r\x1e\xa2K\x8cbIx\x14\xbbX\x15\xfb\xbc^\xb3\xd9b\x1a\x85\x9c\x9f\xbeI\x9c&\x82\x84$J\xc1t2(i\xb4\xe8]\xc6NE\xb9Wؗ\x89,\x87ޥ\x96\xcd\xcd\x16x\x90V\x96\x84c\xa8m\xf9pF\x02&+a\x0e\xbb\x15)\n\xcd\xe9\xe7\xe5\xe7\xc1z؇\x06d\xcc=\x92>\x8c\xc6\xed>1F_9\xb4=\xb8!\xb8\xa7~S\u007f\xfd\xee`\x90\xbe\x12\xed\xec\xc6;{\x82L\xb3\xfc|\x1ac\xad\xe2\xab\xeapn|U\x1d\xbe\x1e^;\xb4-\x88.\xea߄\xf2m\b\xd2\a\x82\xe8\"\xb4\xb3;\xb8aX\xbb(\xba\xffȐ\xe51|Y\x15\x87Yz\x94_-\xf1^U\x96\x18\x86{\xab\xe6\xf8\xf7\xf2\xfa\xf6\xb0\x15\x863\xf8u\xe1\x05\xca!\xb2\xe6C+Hn9\x87\xaed>\xef)\x1cȮ\xd7˵\x84\x16U\xc9I\xefͧ@E\xe3$*\x11}\x92\xbd\x98*\xc4~\xd6\xe5 \aV\x8e\xbd\xc1\x039\xfa_\xfa\xa4X\x9a\xc2AW6\x8d\xc6Я5\x83D\xaaT\xb4\xb8@BlE\xaf\xdcM\xdf\x17\xc4+\xa6\xa2Ք\xd2\xc3d0X\f\x92v\xbb\x9c\xf4\x92\xb9\f\xc9\xc1\xe8\x19\x14\xeemRf\xfdFu%\xc4T\x82\x16\x1f\x91\x10c^\xec\xfe\x95*-q\xcb)tS9岠G\xca)A\xdfo\xd4jYJ\x12\x86\xee\x9a\xe6\x95\xd1}A\xb28\x14\x84I}J\xb0J\xc3e\x81\x92\xd2r(\x9f\xc4Z`Y~Ir\xe5\b\xe2Ximf\xd0)\x02~\x81U\x96(\xe2\xb10\xc4$\xc6\xca\xde(\x84\xb2\xcf@\x0fz)\xfd\x9ep\xe9\x8e_\\zv\xbdOw\xbf^\xe09;]\xd1W\xf5\xc0U\xa5\x06\x83\v\x86\x865\xd7c(?\x1a\tz\xb0\xb9\xa4?ܶ\xa2g\xe7\x9a\xe6'\xfeh\xa0\xb5N\xb0rG]u\u007f\x99\x85\x85\xa9a\x8d\x95\x1b\xff!z\xb3\"\xe5!\xf6\x14`\x01\x164y\x03\xd5\xf3p\x18\r\x15\x0e\xe4\xc0A72E{\xf3\\\fG9 \x82T2\tf\xa5\xfft\x8aB\x1a\xf9\a\xc4IQ\xc9\rW\x8c\x98\x92sxn\x18\xf1\xaaR\xc5\xebP>\x1a\xd4\f#G\x8a\x91\xad\xc4\\(:\xe4\x944Q\x92S\x0e\xd1R\n\x93\xa57\xab~\x9eF\xec\xf39\xfc\xcd\xd1\xcb\x02\xc5r\xc2\xed\x06\xa9\xe2@ \xed\x1d\xe6\x14:b\xfc\x1aQ&e\xb8P\a\x893\x97\xc9R\x9aN\x96ZD\a\x9a%&J \xe1\xd8~\xfa2\x81{\x02\x81@1H\xb9\xddr\xa2X\xfe\xdd\xf7/\x13\xf1SV\xec\xbf1\a8c\x99\x12\xf8\xfe\x01\xe5Y\xbfϷ\x85\x8e\xe8\xdcw\xe55\xa5\x05\xb7m\xfa\xef4\x19\x89\xc9\x15\xf4\xeb\xc3y\x8e\xb1 \xf3/T\xa6\x1e4\"9\xec\x9c\t\b|\xc0O\x85\xb3\"u(\x9eM\xc6(\xc2֍\x84nb.e1\b\x88\"\x84\xa3\x82r\x0e%\x89\x17\x9e\t\xc6\x14ӆ\x8d\x8d\xf4\x9b\x01ڠg\x19\xa3\xe4t\xa3\x17 }*\xdfݶ\x027\xd0DH\xb7\xe3B\xadl\ag\x0f\xac]\xaa\xd7rt9m72\x8c\xc9Z\xe0.\x16\xf6\xbcT\v\xde6ku\xb4\x93u\xcbN\x9a\x06\xaf\x98\x90\x84\xe0\x84\xa2^\xde=\xfe\x95\x8bŒ\xe2B\x9b\x99a\x8dF\xc3_\x8e\x18l\x98\xa6\x85cY\x96\x81\x80\xfd@2n6J\r\xe3Ea\x8b \xbe\x05(\az\xbe\xf1\b6\xcf\x02\x9a\xa1i\x98\xdcd0\b[\\\xc1\x0e\x83\xc1\xb4Ioھ\x9ffЅ\x00\xb2<\xaf\xea\xe3\xf4\x10j\x8f\xb6\x9cW\xed\xf0\x95}\x05\xe5\x05\x1b\x02q\xf8\x16G\xa8\xb09\xd5aM\x81\\WWr\xe8!\xd4\xe4\x1d\x82(\x19\xcf^\x81k\xba\xe2\xeb\x9f=s\x18\xa9\b\xeb\xb4F\xa3\x8e-멜\xdf\vjH \xd9\x1b\xe0NQ\xb8\x1b\xbd\xc8k\xe5\xebp\xceè\x8b],\x19/\x15\xc4?\x1e\xfd\xc3nM\x81\xeeb=\x80Z\xb6\xb0dy\u05fb\xa2p\xa9Q\x92/{B\x015\x06T\xdd)\x8a~\v\xe9\x0f+\x15\x9e\xf5\xac\x88\x89\xbd\x18\xdb0\xf0\x93c\xbc\x02ы\xd7[\xe9p\x95\x06\x1b\xea\xb2kM\x98\xa5[\xad\x86J%\x89\xa1\x85\xe8\xb7~uD\x14.7J\x13wuw\x14\xb0\x16\xd3:\xdel\xd2\xc2\xcd{\x83\xc1ٻ<\xc1\xee\xbaX\xb8rf\xf5\xc4qU\x05\x96\xe7\uf40c\x97\vbÆ\xf6f\x91\xb3\x18fkL\x82\x91v\xc4[\x17\x96\xad\xb8\xc0R\x16\x9c^U\x1d\xad\xef\x89O\n\xba\xc0\x8a[>p=\x8c[\xe3amEeĉ\x9eu\xb9\x0eB=\\\xe5\xd2,\x98UX\xeb\x1f簙ŀ\xbbb\\CӴq\a\xde\xf4<\x8ea\xa2\x1f\xe1\xfc\xbe23'Z\x0f\x99\x00\xad\xa3\xc5@\x91cA\x87\xab\"\xec\x0eH\xa2\xd5Q\x1dj\x9d\xb0H}g{\xd1;k\xcd\xc8\xe0\x02\xe0\xed*Sp\x98\ng\x9d\x87\xe3Y\x01&\x94\x91\xc33\xa1\xe0\xe5\xc0\xee\xc0֚\xbd\xa2\xf0\x80\xe3\xed\x1f\xdd\x0fJ\x04\x9d\xc6\xf6K\xb3V~\x1dc}l\xdaw\x97]\x9eO\xd6\xd4\xeeh\xf8\xcf\xebp\xd1h\xf2\xfd}Rm9\x8a\xb4\xc1\xb2\xb5\x82x\xf0q\xeb\xa3\xf2\xadfQ4\x80\x8d\xafj\x8d\x17\x1b\xa5\x05sD\x01\x9d\xd8,\x19/\xc3yQ\xb2e\xaeH@\r\x91\xa8\x81ʋ\xa4u_@\x05\xf2WaJ\xb2\xddM\x119j1\xc22R_%\x92F\xe3j$\xd3\xcdl\xb9\x0eg\xe5\xe0\x92\x87P\xa7 1\x8a\xc0\xabl\u007f#\xffL\xa3щ\xbf\x90t\xefJA\xdd8\xfeg\x1a\xdb\xcf,:\xadF\xfeջ\xa4\xcf\xfd\x01\xf8\x95-\xaa\n\x98&\n\xeb\x8c\xd2|Q\xe85Jp\xa2\xd9l\x16兡\x85\xceE\x16p\xafd\x16,\xe9\xe7$c\xaf Η\x8c\xeb\x04Q~\xd2(\xa9\xbc\xf7\x8a\xdeQOtu\xdc\xf11WJ~ɲ\x9d1\xf7\xe9dSʨ\xc6H{\xfbpTW\x1fؘ~I~\b|K\x16,y\xc9x\u007f\xc6D\x9d\xb1[C\xf7K\xf4\xba\x97.\x92\x13\xe0.y\xcf\u007f\x9f?ґ\r\x1d\xb8\x11\x95}\xbb \xe6\xf1\x0fi(\x03\x92v\n\xd0h{\x1e\xea\x19R@\xb2[\x1du1)\xees\xf8\"\xe1\x00>\x80\x94 倢#Ҥ\xc7\xd0\x01Za\x92\xa6\xb3\xa5͍\x87t\xe6\xbd\xf8\xa4a[;Og\x17\x1cxl\xab\x87\xb3\x8fL\a\x00l\v\xc8\xef{\xc1]W\x06&\x83#3\uf78d\x8el\xf4\xc9\xef\x12\xfc\xeew\xee\xe5\x9dG\x9c\xfc\x0fO\u070f\xb6z\v\xec\u007f\x13\xd7\xe7a\xdf5xs\xeebV\xa73\xefw\xb1g\x81ug\xf3\xce=N~%8w\x19\xeb\xdao\xd6\xe9\xd8%\x1bq\x96\xeb\xfc\x8f\xa11c>(G\xea3\x83\x19\xbe\x1eJ&\x93i\xa4J\xcb\xef\xa0\x1dt\xe8X2\xe9E\xbd4}\xb3\xd3\t{ѯ\xa0\x83\xbdD\xd6VV\x96\xc1\"\x93\xd1\xe0\x94o\x06\xbdN\xe5\xd7`4\xc9\x0f\xa8\x19\xb0~[\u007f\x8ab\xfe\x8a\xda1BM%\x98CvL|\"0\xbc-\x10\xf5\x87m\x01\x8b\x1f}Fq$\x05Y\"\xa1\x80\x05;(:j\xe3ш-\x86\x81P=4]W\xc5\xf8\t\bim+\x87w\xd0ԀvZ9\xe6Z\xf1\xc6\xedی|d涋\xe7\xdc\xda]v\xab8Uz\xa9xc\xad\xc6\xcc\xe9\x8c]\x1b\xdfN\xf8n\x9dSz묝\xbd-'<\x15S\x9a\x17\xd5\xce\xd2h\x1aC\x1d5\x13\xaaj<Ҕ\x82\x92\xe6\xda\xce\xf2\t<\xdb\xe4\x9fX\xd1\x14*\x11\xe9\xe4\x93]\x85\x87\xaf\x9cr\xce\xe4j;sj\x10\fQ\xa7\xc0S\x11p\b\x80\xe2\x8e{\x01\x18\xfa\x1a~5\xc4\x177\x9d\x9d\xbe\xa3\xa4\xbe\xa4\xc0\xc0A\xf9ǀf\rf\x97\xbf\n|\xe3\x8b\xf8\x1c:\x0e\x00\xf954=h\x04Gq\x95\x82\x8bA\xb0%\xd4xIl\xe4w\xb0J\xcc`ޔ\xccPv\x01\xdc,\b\xe9\a\xeaK\xa17\v\x11\xe1E\xea\xe0o\x05A\xee\x15\xec\xde\xd2\xfa\xc1\x81\f\xe2\x83\xc2瑽o)\xfan\xa6\xe26u\xf8,\x18T~x\x8c\xb6\xd5.\x9d\x01\xa6{\xe4>{\x1c=\xb3\xd4.t\xe4\x17\xa5\xfe\xa5\xb1\xa0(F\xa6\x99\x12\xc1\x8e\x8b\x9c~>WZ\x8cY\x95\xf6fu3 \x8c\x95\xc4\xf2\xa7\x1f\xd5i7\x87Q\xceK\xa8\x89\xd4\x1cT\xa3\b\xa6\x06\n\xf0h2\x02\n\x0eSF}R&\x1d\xa2U\xb1\x98\xe8*\xd6\x060\x85\x01\xf6\x82\xc1,\x06\x00\t\x1f6\x9c1*a\x86\x82p\x80\x8f\xe0\xad\x14\x91\x98\xfb\u007f2Հ\xa9\xf0\x98\xf4\x97:\xf9\xe7:\xa3A/\xa7\xf0J\\\x8a\xf8\xb2`\xb7\x97\x8e\xf4\xd3`\xb3A\x8bI\xd3\f\xe2_/\x80q\xf9ZΤ\x17\xb4\xb6oޒ\a\xa6W\xff\xabz\xba\xfc\xe1\xe4\x8f\xef\xfe\x98\xe9\xfd]\xb5\x99\xb1\x02\xbfaГ\x01\x812KV\x96@o\x9c\xec\x17/\xfb\xe4,h\x11\xb5Z\x1a\xd0[\xff\xb28\xfd\xb9F\xd4C\bwЗ\xf4\xf5\x1d<\xd8\xd7\a\x0f\xa7\xfb\x14\xdbO~\xbd\xebp\xbd\x83\xb9z\xb3\xa7\xad7\x18Q3\xfa;\xdb\xe1{\xd4\xfb\x8ea\xb5\x93N\xdb\n\xd9j\xffi\xacZ\xcbC\xb9\xea1\x17\x8fj\x02\x1d\x92\xbfv\xa0\xfe\xebWqӰ^\xd6@ub\f\xb9\xe0w\xbc\xe2\xe1+\x06#\x1d!δ\x0f\aƮ2\xe3\xcd_Y\xc0\xaa~\x92t\xe4$ّI\xe7\x04)\xb2s\x8a\";\xe8\xb7g\xacZ\xe7A\xbf\xff\xf3\fIe\xba\xcb\xd4ߔ\xab\xff\xc8Z\x9e\xbe=F\xad\xa0\x9ca\x9f\x19V\x01\xd9;vk\xc0\xfe\x11u\x1e\xd6\x1a\xb9v\xf2f\xab\xb2e\xac\xa6\x00[\xce\xdc\x00\xa4ϳ\xaf\xab}\xbe\x1d{\x04\a\x89\x91\x9fX\xeeO\xdf\xe7\x83V\f\xed\x1d\x0e\x85\xe3\x8a\x1c\x1a\x0f`^B5\xea\t\u007f\x00\x18\xc0\x00\xc9\b\xd8\xed\x02\xf3\x91\xb0\x13\x175յvv\xd4NN\xdfy\x9aJ\u007f\xee\xaa\xef\xde>\xa9\xb5\xca)\x86M\xe6`h\xde\x1a3\xb4ͮ\xe8\xfb\xc1\xc1sw\xdd\xeb\x91\xcb\xef\a\x90\u05c8\xadsR\xbb\xfe\xd8\xd67mKWl\xc1Xu\x8e\xb7\xee8wN\x8dY\xc3o\xe6\x19\xe3\xf6\x85\x8e\xc2k\u05ec?\xf4\x1c\xac\u07b2\x05<\xc2;Y\xb3\xc1(6.x&\xbd\x85\x1aU\xf78\xf1\x86\xce\xd5\xfd\xbbǹ\x11Փ\xbe\xab9\xbeG\xdd\xdf̯\xdf/\xbf\xa3!\x18\xb5\xf2\x83?\x1a\xab\xf6C#\xab\xc9F\xc6l\x8f\fndB]\x87]\x9ay\xeb\x8a\xc3\xc6\xc8u?\x16\xa3\f\xday;\xe1\x12\xe3x\x8c\xcd\f\bm/1\x1b\x13HB\f\xc7\n\x15D_\x9b\x15\x93\x82A\x1e//Q!\x97;\x18t\xbbB\xfd!\x97Ll\xbc\xc0\xeb\n1\xfdq\x13]e\xb1\x98\xc2\xda\xc6\xc4e%]\x96\x89\xb7/\x9c\xb1+\xe0\n\x95\x148{k:|\xa2K\xab\xe5\xf5\x85V\xc9U\xd5Y\xed3i\x81$\x89\xb4\xa0a\x80m\xe6\x16b\xb5A\xf7\x84\xeel\x00\a\xfa]\xd0V\xe1\xedj\xa9oi\bn\x9a\xd4\x05\x8bݮr\x00\x82.xIA\x10\xc2-\x89\x85>\xb19X\x16\xaeh\xb6J\xb6\xe2\xda\xd2f\x8f3\xd4U\xe1\xe7\x9cVa\x8b\xba\xe6\x8f\xc6\xfd\x04\x891s\xab8\x8cٗ7R\x83\x0f\xdamD\x1b\x86\x0e\xec\x04C\xe0\x8c1\xf9/Th\x8c\xd5&\xc1\xed\xd1Dc\x0e5\xf2\xc7[O\xd7\x10\xeb\xe3`\xf3L\xf9o\x8cF\xa0E\xd1\n\xb4&_ug\x95K\xb2\x16\xeay\xad\xd6%\xfa:jz\x9d\x05%!W`\u05cc\x85\xb7O\xb4t\x95\\\x96hԆM\x16K\x15MgZ\"\xfd\x17\xa5\rH{<ܲh\xe6\x16\xc1\xea䂥3BNOsim\xb1M\xb26W\x84˂͢oab\v\x84\xc1\x02x\x89+\b@\xb9\xcb]\f\xbb&m\n6\xa0\x86\xeb\xf2b\x14\xfa\xccZ\x86\x96ؑʩ\x16\xd4\x1a\xab\xa9\x8b\xa9\xab\xa8;\xa9G\xa9_\x10^\x13\xec\x19\x8fW\xc9\"\x18Z-\x88\x04F\xf4\u007f\x94E\u007f\xaa\x11/\xa2.\xdf[X\xd5G\be\xc1\xe2#^e\xb0Y3,1h@$N\xb0E `\xb3\xa2\xdcu\xb1:\xcci\x84\x834jA\x1d\xa1\xa5\xf3y\t:\xa9\n~\xe9%\xfd\f\x89\xf7|8@\xc00m\x11LtJ<\xb6\x90\xb8\xa4,\xdca \x0e\x8bZ\x8e\x80Z\x8eQ\vx7\x15Y\xccfK\xd1\xd3\x13'\xa6_\xe8\x9e6\x13\xfc\xa4=\x1c\xf4i\xb9\x89\x00\bV;h\xe3\r\xe3\x02\xbe\xf6vo\xc98\x03?\bi\x83;ZWd\xb3\x16\xadu\xdb.\xf3;9 _\x92H@\x9b\xa4\x9bX~\x85\xfcw\xf9\xb3+*&\xe8\xacV݄\xf2\xfd0\xb4\xbf\x1c\xa5\xd3Ƴ\xa6G\xa23y\xaf&\xa0\x9f\x06|\xb6\xa2\x9a\x88\xdbfsGj\x8alO\xb4\xb7\x138\xebvN\x8f\xee\x0e\xbe\xce_\xe0\xf9\xe4\x8eZ\xf3\x80\xf9\xa8?\x12\xf9\xebdy1\xb8\u007f\xf2\x1e\xf9\xba\xd2\xcaBK\x10\xf8\xe5\u007f:\xa1\xa9\x1887\x1e\xaa\xb3\x95\x8d+\x01\x9f\xddUZf{R[$\xd8\xc5Ґ\xbb\xe9\x92&w(T\xd4\xd05!\xe2\x02\x06\x9b\x9e\xae\xbf=\x12\xb9\xbd.M\xffdnE\x13k2\xb1M\x15\v\x8f=2\xaf\xbc\x19\xa7\x9b\xcb\xe7\xd1M\xa0\xf4\x97\xbft,u\xac\x8b\xff\xfa\x82\xbd\x8dE\xe8\xdaF\xb2q7\x83-\xf2_\x8a\xcd\xd0\t\xcc\xf2\uf0e2\xbb\x12h\x86\xaf\u18af\x03\x8d\x97\u007f!\xf1\xb2\x99\xfe\xb1\x84ZE\xed\xa6\xf6S\xb7Q\x0f\x13=\x1d\xa3\x14\xa2w\xcd\"\xa1\xa7\xae6\x18\xc1x\xba\x96\x88o\x8cגyyQ\xd4;\xa2\xe4\xe5\x05\xa3\x01\xd2aZ@dԋ\x8dc\x86\x1b?ڭ%\f\xb8<\xe7%]\x04C\x86\xa3^\xe1%=\x04Dhtw\f\x9e\x1c\x912}O\xe9g\xb8\xef\x05\xc7\xe8\xa1\xf4+a\x87\xdd\xee\b\x839g\x9d5ԸA~i\xfdj\xe0]\xbc\xd8\xe3\x16i\xb0Xc\xa8\x1a\x1f\x03Ǵ\x96Xm\xf9\xe2ŕ\xe3c\x16-\x98\xb3\x04\rkU\x8f\xb9\xc3\xed\x1d\xe1¢\xf0\xa4\xa9HQ\x81\xe9\xfe\x05\v\xe0\x1b.aQ\xe3\xd3i\xd7Ӎ\x8b\x8d.\x94nz\n~L\xd2C\xae\xb5\x17\xae\x16\xaa\x83\x85}S\xc0\x93\x85\xa1\x8e\xf6Paa\xa8\xbd#T\bf-\x89\xd6V\x195K\x00-\xba=\xa0\xe4?\xdb\xed\xa0\xd2\xdeQU\xd5qx\xf9\xf2\xf4\xaf\xc0\xe7\xf2\x0f\xcal\xb4\x17\x9c#_X\xe3\f\xb6,\u007f\xa1\xd3U\x1f{/\xbd~|<\xee\x9ek\x8c\xe8J&-\\7+\x18\x89\x04g\x1dC\x9b\xa8ۭ\xa5\u007f\xf1֤IoMN/\xfct[S7g\xb3q\xddM\x9b>\xc7i\xdej\xe5Q\x9a\x11\xe4\xcd\xf2?\x80iځu\xf3\xe4o'?<\x1b]\x1d\xea~\xb8\x1b\xdfd\x8el\x8c\xb7\x06\x9d\x11p@\xbe\xce\a\xed\xe5`\xb7\xe2K\x89ys\xffMI8\xfa\x1fp\x8a\x06\x1d\x97j\xc3\x19\x85\x19\xaf\n\xdb2\x8b2 \x06\xf0A8_\xf7\xb5;\xf4\x85ͪK\x03p\x97A\xafu|Q\xea\xa2_\xd6\xeb\xd3_\x82n\xbdNg\xff\xa2\xcc)\x1f\x13!(\b\xff\xc3N\xaf\x11\xe5iU~\xcc[\x80^\xa1\xc9T\tV\x9bmCg\x81\xf4-V\x8b\xa9\x12\x9e祯\xa9̌\xd1\xca\xd8$e\xf9E\xf0z\x0f\xb6 \xd8h\u0381\xbd\xb0\xe2\x80\x1c\x01v@\xf6ba\x80\xc4p\xc7(\xe3\xcb\x1e[\xf1Ӣ\x86\xd7\xec~^\xab\u0558\x9f)\x96\xe88oy\xd6#\xc9k\x90\xbam\xf5>-\xf2\x1a\xad<\x04n\xd1\xfc~\xd8\"5\r>\xf0\xeb\r\x96\xdf\x02\xf9\x87\x82`,\xa1g\x1b\x02\xe90\x94}\x01\xa4`\x83\xf7\x01\xfcO\xf3\x15\xa31k(\x1dO1\xffF\xa9N\xb2\x86/\xd52\xc5\x00\x83\xde+l\xf6E\x00Ss\x9a\x80\x80\xf4\x04_\xa8\xa4\x1a*3\t\xea\xd9- D\xf8\xe6[\xb9H\f\xfe\n|$\x17>\xf3\x00h\xe8\xec\x04^\xc1\xe7\xf4z\x04N\n\xa3R\x02 \xf1%\x82 x\xbcN\x1f\x1a!\x06\xe5+ސ\xdf\x18_SR\x12\x9c\xe0\x1c\x9dC\xf0\x82Ap\xf3\xc94X\xa7e\x19\x9a\xe6tf\x87\x89+X\x1aO\\7\xae\xf4\x8a뮋/F\x13\xb2ä\xe3hZ\xc2,\xd5\f\xab\xf3\x16\x8c:o\xc6\xe7EJ\xc1\xc1\xe2R\xec\x01b[\xc5\f\xc8\xc5hX`l\xc0\x16\xe6\xa3 \xea@\xff\xe26\xad\x01)\xec\x9f\xcb?\x92\xedl\x85lG\xfa\xb8\xe3z\xb0\x00\x00\xb00=\x1b,\x90E\xf9\xc7l\x15\x98#;\xe4\a\xc1B\xf0\x89\xfccY\xa4[\xe47\xe4?\x836\xf9\xa3s\xe4\xdf\x13>\xf6\xe09=\xa0\x10\xb3\xa5\xc9\x1f1\xbf\x95\xff,\xbf\t\x04\xf9\x9f\xf2?䟃\"z\x8f\xfcs\xf9\x9f`<\x12\xde\xf5h\\\xfa\x8a\xf8\x98\xe8\xd1Ȥ\x94\a\xe3?\a,\xe8/\x18gyLI\x8a\xffh\xc0k\xb1\xe7\x1b\xab\x1d\xbc\xbb\x9f\xbd\xb3\u007fh\x8e\x8f6\xf9ҋ\xda\xe1;\xed\xe9\xff^\v\u05ee}\x0f|\x90\x94\x03\xe9Gio\x0f\x18H'a\xb2\xe2\x8e\xfbn\x87\xaeC\xf2\xb1\xeb\xe0\x93\xbbҧvѻ\xd2\x17\xf7\xc0KN\xdeu\xe4\xc8\x18\xbe\x17\xb3\xa8u9/\x97\f\x18m\x06\xe7\xb6\xc4\x1fBr\x11\x96\x8eh\xbb\x95S\xfa\x80\x87\x8e\xd5ڱ\xf4\x04\xe2\xadt\x88\xa0\xd8b9\x82\xa6\xccy\xe3\x9c97\xcce\xdc4\xbc\x1f\xcbO\u007f\xfc1\x98\n\xe6ĺb\xb1.y\x8ap\xe5\xd4\v\xe7\x17\xd5vY\xf5&\x16\xb7\x1ck\xd2[\xbbj\x8b\xe6_8\xf5\xcaӟ\x82籺\x8f\xde\\$\xc7\x16\xbd\xf9\x91\x8e%i\xf02NC;q\xe8\x00\xf7*O\xf9\x98<$\x96\xfc\x9e\xb7\x1d~J>o\xf4\xfdIz\xd8wm\"8\x1f#\xfde\"\xd9\xc8\xd7L\xb4\n\xa1:R\xbe4p\xebE\x8f\\t\xd1#\xf0\x11\xb2\xc9\xf0\x18)_\xe0\xd0\x03\xf8\x98\xfa/\xff9\x10\xcd^\x98\a\\\xf2\xb1\x11-\x88\xc4}\xc3\\\xb5\xa8_\xcb\xe7\xc1\xd8r9*G\x97\xf7B\x1d\x18\x1c\x89\x94pH~}\x00>\x96\x9e\xd1\x0fjƊO\xeef/a\xefA\xfa\x04\x8e\xael\xc7}\x01ع0\x8e3\x8a\xa1wW\x85\xc9r\xd1KDoSB﹄E\xbd\x01;N#iQ\"\xf1\x10H\x86\xa4\xd1\xfc\xd5\x06\x90\xb8\xe3\x01\x9c\xc4\x11܅ :\xcc\xe03\x983#^\xc2b\xdf\x0f\xbaZ\xb3=\x1a.*\f\x95t\xc67\n/\xael\x9bN3\xd7/]\xb2\xf3#\xebԊ\x1a\xf9\x03\xf9\xb3\xf2\xaa\x84\xe8Y\x1ao\xfe\xe8\xfd\xb6\xe8\xd2\x05\x1a\x93\xb1\xa2d\xc1\x1b/\xac\xab\x9a2'a-\xf0r\xe2\x1fa|\xc0ƙ\x9fp\xcdg+\xca}C\xf2\xad\xdf\x1c2ٌ,\x0f\xb5\x01\x9bKK\x17\xf9\xebK<\xbb\x8f\x83]`\xdcm\xcdf\x00\xefk\xeb\xf2Z\xe6̱\x88\x86&ˆ-\x15\x85\x17NZ\x92\xd4hn\x86;\xdd\x01\xad\xa6\xba\x86\xd7\xf9]\x85\x01-_T\xa8\xd1\x04\x86Dך\xf6N\xeb\xf8jڢ\xb1\xfa\xa3\x81\x9e\xe7\xcd\xda\x1bn\xe0\xfc\xf5\xf4\xd3\xf7\xcbNO]\xa1eOȽ\xc9P4\xce]\xa7\xad}i\xd7CS]\x95\x1e\x8fI_%\x06\x17VuY[\t\x0e\xac\xf2\xae4d\xb4oD:9a\xb7\x0e\x11*\xe2X\x9c\x84\xb3\x93P}\t\xb7\x0f\x1e3\xb1\xf2\x81FU\xa9.\x16\n\xa3\x8f\xc6\x04\b\x87!n\xd8\x18\xe6S`9^ik\x0f\x8d\x8e3XW\x11G\t\x86\xddsJ\xcaAyx\xde4͢}}4\x8cWN\xbe\xf6Ik{\xb8\xe2\xb6\a+B\xed6c\x95\xdf\xf3\xe2[\xbe\x92\xdaz=k\xbaK\xee\xbd\xdb\xc0\xbaL\xd5w|\xfb\x98\xdfc\xba\\k)\xdf\xf4[\xf9\x1f\xfb\x96\x87\xca#\x8c\xc6^\xc2\x01\r'\x1a\xd7?\x06\xe8'\x9c\xc5\xc5\xccxP:̚wky\x95ݺ^t\xc4Z&\x9egX\xda^\xb3\xc8Z<\a4\xda\\\x1ck\xb5r|\x81Ur\xf2H\xb1`\xf9\x824͇\v\x98\xbe>\xcepk\xfdlw\xd5*iB\x1f\xfcU\xd4\x1e\xf7\xb5\xb9\r~\x93u\xbc\xa7㪗K\xd8:\xab_\xdfm-\\b\xb4\x86l@\x0fjG\xccC\x80\xea\xc01`\xa8Y\xfd\xd8\x1e\x88\x87\x95*\x1aIbQԟ\b\u00a0\xcf\xe6\xb3X=\xa8\x05\xe9G\xba\x1d\x8f,\xee=\xb6i\xa6\uf069[:\xc6[Y\xc03\xff\rfȏ\x1a\xbd\xed\xe3g\xbe\xf1Y\xa0\x15\xc0\xfa\xa5\x17\\\xd0\b\xbd\xef\xba\x16.۸\xb0\x92\xe5\xe5EC铞\xba\xa8\a\xc0|;\xbf\xc2 \x1bFS[\x15\x8cZ|Q\xecЁ\x06>\x1e\t\x84\xf8Y\xad`\x94-tSkESI]\x81\x0e\x80S\xd4q\r`\v\xa2k:\xf6\x96/\xbcmդ\xcb\xc1\xdd\xf9\xed7\xfd);p\x94\x8es\x80k~\x01&\xeb*\x16\xf4.(\xb8O^ް\xado\x02\x04\xe3\x99\xea\xe1\xb6P\xfaT\x02\xa6Q\xdd1j\x8f}l\x95\x1e~e6\xcaw댂N\xbeè\xd1ZU\xbc@\xa4\xb4\x99\xe5\xa4N\a\x92fIb\x88\xcdb0\xe3SB\xc14\x9b\xc2\xf7T\xfdV\xb2\xb0\xc9q5H\f\xa6\xb3\xf7\xb1\x99\x8d`9\xbe;Xed$i\x908p3\x03!3@7\x97\x93f\xe5\x1d%\x00\xcdSt\x9a\xdc3\x83\x82\x9f\xc1\xc0w(\xe0\x19<\x85K0\xa2Pp`\xf83V\n\xa4\x06\x8a\x1f2\xa0\xb9\x94zO\xc5.=\x1c=\x1f\xb3\xea\xa4p\x11F\x94\n^\x8a\x9a\xe2NA\x93_\x05\xd4@Y\u007f\xfcͨ=C$\xeaQU簰\x1e\xf0\xd30\xaaJ\xdbXf'\x1a\x9f\xc2\x11\n2ܪ\nѝ\xc3jg7\x87\xe7]\x92\xacY\xb2`B\xcb\xecّ\x9bo\xbc~\xf3\xe6\xa3S\xd7\xf7\xfa+W\xae\x9d\xb2cy]ݬ\xc0\x84\x03\xf2\x87E\x9e\xb6X,\xd8NO\x9f\xf6\b\xa0\xd1\f3a\xf7\xee\xe7\xbd^\x9f\x1f\xed\xb0\xff\xfc\xe8\xd0A\x8f\xc7\xef\x9fP\x92h\x8f,\xdf|ы\xccΖ\xe9\xd3\xdbb\xa2\x9e\xbb\xf1\x9c\r\xe3h3\xcd\x18\xb2\xfe\xfc\x04\x8b\\\x91\x0e(`\tZ\b\x9b\x93\xba\x85?J/\xc0\u007f\\rh;v\xed\x82bz\xfbrX\t\xff+}.\x8c\xa6w\f}\xbe\x1b\xdeH\x9f7\xf41\xbc\x03\xbbu+\xb8\xb3\xec\x1e2\xdf\x17\"It\x06ҁ(\xaa6F\xe6'Fݲ\xca,\xa6tn\x05ʒ\x04T\xb6`u\x97,.\x84\x89\x8d\x10\aZb\xefz\xec\xc9Z\x8c\xdd\x18p\xa08O\xbe\f\xf5è\xb5\x83\x0f\xbc\x0e\x87\xd7\x0e\x8e{\xedv\xafch\xb0\xac\xb9iAs33+Q9\xbdyA\xf3\x81\xe6\xf2\xb2f0\xad*\x01\u007f\xbc!9\xb4*y\xce\x14\xde`䧮x{\xc5T\xdeh\xe0\xc1a|\xbe\xb9\xac\xbc\x99)r\xe0\xfb(\xff\xdeh.\x93\xe7\x9477\x97\x83\x1f\x975K\xe9\xb5U\x89?\xe3\xbd?+\xbf\x89*x+\xb81\xfe\xc2\xf6\xed/\xc4/5\xf2\x9ca_Y\xd9>\x03\xc7\x1b\xd37f\xae*ojB\xf3(\x96\xbb\xbe%\x9c\x1b&\xca\x0f4H\x15\b\x82\b\xe8\x04\xff x*\x01L\xe9T\xeb\xe0B<\xaa\x14\b\xe1q\x87\xe7\xf0\xf8\xddJ7\x83\x10\x12\xe0\xb1\xc0\xa3\xc8;x\x99\x04\x9dĒ\x0f\x99\xe9B1u9\x05\x0f\xf2hԏ\xc7\xea\xa2\xe80\xe7\xb0\x06\xaaP7\xc6\xc4\xf4\x1c\xe6@\u009a!O\x02\xa0\x1c\xb5v\x8e\x04\xaf\x92)\x96\xc6c?\x8d\xa7\x04\xa0p\x9c\xa0Y\"\xa4\xcc\bh\xfa\xc4\xc1#\x02^\xb1\xc1ކV\x01\x92!ю\xb3\xe0\xf7@JI\xbc+\xc9\xd5\x1eh\x8b\xa1\x19\x06\rX\xe8j\x12ȏ3\x10\x03n\f\xcfA\x91V\xa4p\xe0\x02\xd9\xec\x8eZ\x9eC\xba/\xae\x12\xa3LU\xe1:4\xe7\xfbq\xd2aE\x17\xd7aa. `\xb1\x1fM\xfb\xf8\x0e\xb51\xe0\x81\xb88\x80@\xb3\xd0\x04\xbc\b\r\x93a\xa5)\xf0\x03p#`\xe9\x10DI\x11q\xe1hފ\x1a\x92\x94\x10\xaf\xbb\x91ո\x10>I\xd6\xe1P\xbd\xe3\xca\xfc\x18!`6\xbc\x9a\xd7N$Or[\xd4F\xb8Y\xd5\x1b\xab-\xeda\xe1Mz-\xc3J\xecRƤsjh\xf96\xa4\x05\xd04\xaf\xd32\x16\x06@\b =?\xce\xf04\ry\xa0\x05\xbai\x01\xa7o\xa1O\x1f.6\x01\xbd\xd6&\x1a\x8d@\xf0\x17\xd8\x19ƪ\x0f\x9b\x9a8\rg/\b\x16\xea\xf4\"\x92*,\x05v\xf3\x06\x11h\xc7\x15\xd0\xc0_\xe8.\x82@k\xe1u\x1c\xa3\xe7-\x00X\x9d\x16+\x00v\xad&\f\x8c\xacN\xb0\xeb\xdc\xf6\xea8,s{Y\xad\x9e\xa5\xb5\x06k\xa7\xb6\xc2U\x10Cӂ\xb9\xa0\xcc\x12\xf2\xfb\xdcv#\x84\x1c\xa7\xe7\x8dtᬘ\xddVf\xa7\x81\xa7\xc8(:fi \xe046/\x039\x86\x85\xb0\xa4\x8a-e\xac\x0fh\xcdt\xb1GS&T\x85\x19#\ah\xab\xae\xea\x82\xcb*\x1cz\x03D\xcf\xe4l\xb4\x03B\v\xb4\x9bJ@\xfb\xcc\xf4]\xb4\x9e\xd3BZG\xd3z\x1a\xdc\x03\xb5\x16\x8eղ\x1c\xa4\x852Q\xab\u007f\\g\xa09\x86\xa1\x05F\x03c\xac\x916i\xb5,\r\x81\x0e2\x8cF\xd0\x00\xb3\x00\xe3V;䝎\xa0+\xa4\t\xad(\xb4\xac\r\x89\x0e\x9d\xdfS\xb1@\xea\xb2VL)\x89\x14\x16ݛ\x90\x12%\xe5NV\xe7\a\x00\r\xe1:a\x81\xc5\xe3\xb4E\xbd\x11\xbf\xd6(B\x03\xcb\x00?M\xfb\xad\x97\x04\x9c\xab'8\xca\xcbiѪ\xbbp|G\xa5\x9eA\x83\x9f\xe8\xe15A{\xc8z\x9e```]wxB\xb4\xaf\xa4a\x12\x8b\xe4\x84U\xf1\xc5&$n\xe8unw\xcc/\xbaE\xad\x00\xed!\xd1l\x95t\xf5g\x956\xb5tF\xc7\xeb\xc3^\x9f\x8f\x16\x80`r\x99\xdd\xcc\x1a \x01\u0380vM\xb4\xde\xc8\xc9s\x80\xc6²\x1a=j_\x1d\xad\xc1/\x1cʷ\x8aNS\x81\xdb\\\xa4\xf3\xf3\xe5\xec\xf8\xf3\xacֶ\xbb\xb7\x95B\xa6rgU\xb8\xb9X4\x80\xd69\x9e\x12\xbbm\x82_C{\x00\xa8\xad\x03\xf4\xc4\x02\xc9\xc43\t\xd6Sj\xd3Қ=&\xa4@\xf2\r\x13\x01h(6U\x14CZ\xaf\x05E\x92\xdd\x03\xcaJ\x18\x93`p\x00\xc1\xc5j\x1c&=\x80\x16`\xd0Z\xb4\x02\x87JBsŌ\xc4 \t\x94aL\x0e\x00\ffɤe\xb4\x90e\x19\x8e\xe6\x81\xd0\xec2\xe8[\x8b\xb54_\xd06\xbe\xa3\x88{\xa0A\\\xabqڊ\xdb\n\v%\x00\x98\tk\f^\xc6q\xb9\xd6TUJ\x9b\x9aj\xaa\x9c\x1d\x1a\xb3\x06\xb2Z\xbe\xcel\x9a\x1a\xd2pU\x05\xedHݖ\xb6ym\xeb\x17\xbbĠWO\x97Y\\\x10jY`\xb2\xfeB\xc3\xd3\f\xad\xe3x\x00\xcdq\x06\x88\x03z\x8b\x060\f`\xdc4\v?\x85\x9c\x06\x9a\x80\xd1\xc81F\x96\xa3Q\xbb\x01\xe6\xe4K\x86\x02\x87\xddn\xb1\x1aEF\x9a\xe66\xf3\xa2\xb6Ȏz2zK\x85\xde\x02\x00\x9a\x8d\xa8g\x1b,z\xc7B\xbdy|\xb0Dk`t\xa2\xdf\xdf鳲\xb4\xd1T\xc69\rv\xbd\xa9C\xb0h\xb9\x02\r\xe7\x15h\xae\xa2nB\xd8\xf2Ӻi~\xad\xd3l/\xc2t\xdekc\x1d\xd6k\xeb6\xbdx֮r\x1b(r\x97\x1d\xe9X\xb1c\xf3\xfa\xa67\x17\xd6L)\x85\xd0\x1fD\xad\xae\x91\fElP\x98\x17\x9f\xbc{\xc2\x14\xd6W\x13(@\xd5*\xd0\xeb\xa7M1\x14G\xbf3Q\x19_\\Uܶ\xb1\xb3eIsP(\xb1\v\xd6\xd2p\xc4[Y\xe9m\xae\\zip\xf2\xf6\x83G>\xec6o|\x0e\xb0\xd7v\xce\xe8ݫ\xecȃx\x87\xe8\xe7\x15Hwx\x85IJ\xb4Q\x1d$\xe2*c\x0f\x89\x13|\xf2ZBS\x1cʳr\xc6\xe2\x9c\x0e\xbb\x94\x10\a_\x80\t\xed\xb2\xf0\xa9t\xcc\x05\xe8\xbf\x06\xd9B[\xba\xdeQ́\x80\xc3\xe3\xfb\xc2\ue85dF\xa6\xd8&\xff\x0e\xafF\x83\xb3D\xffǦ\x19\xad\f\xc7\xd9ݵ>\xf9\x1fF\xadF^n\xef4Ļ\xe6\xd0\x17\xacH\xd8\xefdZg03\u007f\xe1\xf0\xfb\xad\x83\x8f\xa1\a\xf4\xb8LE\xa6\xbd-6tmYQ\xd0\xfdy\xa7\xbc[\xfe\x95\xc5n\xab\xb0[uZ\xd9]\xc0k\xed]\xec\xde\xf8\x8a\xbe\xbe\xa1O-\xa0\x01\\J\x8dXwP4\x95Q\x9e\x9ag\xc08\xc5vi\"3\x83\x01\xd5b\x9b\xdd\xeb\x0f\xb9N\x12\x93\f\x8b~S\f\xb1\xf7\x0eQ\x84\x98\x1c\x12K.\xb1\xe7\xd2B.S(\x13W\x86\xfd\xaf\x06\b\xff\xa3b\x85\n\xd3\x01\x9bd'~L\xc3\xc8Y\xea\xe2R4@\xablm$\xf6\x1b\xc9\xf2\x99\x98\x1f\x96\xaa/\x8d\x14\xfd\xb9\xf2kmȕ\x9aX\xd5_51\xe5\ni\xbf\xae\xfcsQ\xa4\xb4\xde\f\xa8\xceu \xb9\xae\x13Pf\xb9\xe7\xd2\xff\xb8\xf4\xd2\xff\x00\x03\xa5\xf5\xe5`\xfe>y\x8dIt\x85\xe4/\xab&N\xac\x02\xe6\x90K4\x81\xdb\xf6\xc9G\xcb\xebK\x8b\x9c \xb9a\x83\x9ct\xd2=\xf8\x82K\x95\xb22\xb8\xacA≫\n\xbb\x81\xd3l\x956\xcb\xe2\xb3Q\xf5\xdd\xf5\x89\x89K'\x92?\x94\xde\xd4\r\x93ݛ\xe4\x01R\x1a:!+\vt\xcf³\xeaBGw\x9c\x90\xea$Iz\x815\x8f\xf3\xba08\x9c;\x1c6\no\xd8\xccb\xd4\xfa\xe7-\xfd\xb8b!\xe5B\xe56\xf2\xef uٳϢ\x0f\xfc\xd4)\n\xf0\xbb\x99)\xd4e\xc4g\x10\xaf\xa7\xe1\xa5K\xacY@\xa4\xea\xb1\\\b͍4\x1a\xf5\x1dVB\x81\x81\x97}\xf0\x11\xa4f\x11\xe0\x1c$\xb2\xe09\x12\xffz\xe8\xdax+C\xb0#\x88\u0085{\n\xd2i\xac\x04\x0f\x86\xac\x8a\xe3\xd5<\xc5\xfe\x01\x1dA\xa4\xc3\xf0\xbb\x1dǜ\xe3J=żT\xe5g\xc0յ4\xcfk\xcaB\xa7(g\xc2j\xf5t7Lp\xd2:\xa7d\x02<È\x81\xadS\x0eo^\xe6,\xd0\x05\xce齺\x99\xa3\x19S\x19\x10\rv\x965k\xacu&sQ\xac\xbc\xb4\xd0\b9Q\xabc\xa1\xc0s\x05\xcdF\xd1l\x8f\xfeǜ\xa8\xd5-\xf0\x10\t\xf4\x9cEЈ\xfe\xb2\xd6`s5\x83Dr\xc8Yu\xc0\x1b\xae\xe5\xe8o\x12\x1f{\xa3\x91\xb2\x06w\x19\x12i\xe1\xa5g\xb1\xa6\x90\xa7\x80a\xad\x06\x83m\xc1\xa4j\r`\x9d\x81I\xe5\xa6\x02\x8e\x95hf܄v\xa7SWzM?\xe0\xae6\xdbYNB\xb2&C\xebm\xb5\x1b\n\x8b\x9a\x17\xd5\x14\xb2@S\xd2\xd8\xdbY:\xd1h\xf0k\xa1]һ 0\xb0\x96b_c\xdd\u243e\xd5_]\xac\x85\x8c\xab|Ik\xef\x85:\x13\x06\x1f\xa1\x01dMZ\xc2\x15\xfc#\xeekv:\xa5##^55\x9fZO]\x8c\xbeƬN\x8cgc\x92D\xfa\xa7#\x83\xf7\x89\x1a5X\x05Jx\x8e\xc1\x1fb[\xa2ZB\x0fP\x01CcH\xbbTT\xca 9F\x0e\xa1\x13Xe\xc7*:\xbc\a\x9b~g\xda\xecb\xc7\xecm\x1a\xadQ(\xe2-\x1e\xc1\xf3D\xe5\x9f6n\x98]]}\xa2o\xe3\n\xa4#\xf6˧\x0e\xfdQ\xfe\xbd\xa0\xed\a\xe0\xd0\x1fA\x10\x84\xa6\x1d\xfc\xb9\x9c\x96?\x96\xff\xfb\x9d\xbdW&\x1f\x04\x8b\xa7M\xa8d8\xc1\xc4qW\xfe\xa6\xaa\xb2\x12\xb2\x82\xceа\xb4cۼ\x02IS\xee@\x05\xb3.js\x961\xac\xcb\xd9\f\xe6/\x8c\x84\xb5\xb51\x97\xa6\xb0\xa4\xb5\xf5\xa1\x85\x85\xe3\rŅ\xbb\xfe9\xe4\x9fl\x12\\>\xff$\xaf\xfb6\xa3\x9be\xf5\xc6b\x81\xd5/_\xdbS\xe2\u007ffŲ\xa5\xee\xa2'\x9a{n\x98,8>;\xa4l\xae\xe9\xb8\xf6\xd2\xde\xd6\xf6\x1dO\x9d\xb3\x150\xc9\a\u007f0-q\x9d`@\xbd\x006\xb5\xb4m5\nzԡ\x1a\xd7\xc3\x15\xcbwգ\xa7\xa32\xb4\xf5\x18\xd1ӝ\xe3X㬞\xf4V\xb7K\xacu\xcfy\xbccRT\xe4\x8a\xeb\xab9\xd7\xf4|\xd9b\v\xa5\xa5$\xcc\x17O\xf8m\x91\xa6\xed\xc1k\x9e\x90Ǥ\xcc%\xc0̣\x81\xd2bgD\xe6ܣ/<\u007f\xf4\xc0/\xfd\x81_ʷ\xa5_}\xe2~P\xc2D\x9fx5\xfd\x18(\xb9߿|\xf9\xc2o\x0e\x1e\xfc\x86m\x91\xddC\xf2٫\xde\x05\xceg\xc1\xa4ߤ\xcb俾\xbb\n\x1c\x19\x02\u007f\xf1\xfcF~VY\xebC\xb2\xc3N$\xa7m\xc0k/4\x16U9\x8a'(\x1fh,\x16 6\x1f\x00\xf4q\xc5p\x9a\xc5i\xb6\x18ĢU,\xd2\xfb\x19\x01i8hx\xc2k#\x02\xfe\x909\x9cdwz\x17-\xef]\xb5|V\xb3ٲY>\xf2\xa6\xe4rI\xc7@\xf9ڒ\xa9\xcb\x17\xad\\0\u05f7\xe5\xa5˷\xb4\x15D]\xbc}JNJ9\v\x12\x95\xdc\xe4\x8bW.h\x89\xf8\xec,cи\xa7\xd4\xd7\t\xa1H\xe7\xb9\xcd%,g\x155\x92\xbf\x05\xaeP\x01x\xe7\xb8 j\x8c\x15\xd3\xf6̭\xb6\x06fvU\\\xda\x0fhH[\x8a\xea\xa7m\x9d\\h\x91\xc65\xb5\xb5\u0558\xcc;;9\xeb\xa4i\x9b6_\xddQ\xd0\xd9}֢\xb9\x93c&\x13\xb3\xd4\xc5;ڢ\x8d\xc5\xd01\xf3\xe29-\x1e\x11}>\xf4\xf5W\xf0\x8e\xa6\xaa\x10\xacAb\x8b\r\xc9.\u007fc)\xe2In%\xf1UD\xc2\x02\x8a\xcf>\xb0\xf9,\xf8/h\xcb021\u007f\xdb:\xbbA\x1eJ\u007f1{+\xf3\x9b\xc1\xb2\xcc\xdf\xd6\xd9\xf4\xcc\xd9[\x81{\xe2\xfc\x1d\xf2\xbf\x80q\xc7\xfc\x89`\xf2)\xea\x14\x98\x8a~\xaejo\x9f\xb7cG\x9e\x9c\x89\x11\xcaj\xd4\xf8\xa01iL\xed\xa7\t\xeeb\x92*\x91i\x86dS!2}\xf0\xbb\x02\xbd\xe05c\xf0\x99\x1e\xfd\xae\x80\xafa2\xb1Z\xd6\xe1l\xac\xf9d\xac\xe2iˊ9Kq\x01sT\xac\x98ɴ\xff;\v;\xa0\x16\x11\xb4afT\x85\x91U>\xf5\x9d\xa5\x1d%\xbf+k\xa6\xb9b\x8e\x94\xdfGY\x1b\xa8\x90\xcbjQ\xc2\xce,V\x1cC\xfb\x1d\x01j)\xec[eP\xc3\xc6\f\xa1\xa1\x17\xbfG<\x18\x8f\xbe\xfd\xe2\\\x1c\xbex\x1a\xc6\x00՞[\xf6]\xbc\x01jt=\xf0~'}\x80\xea\xe3\xbe\f\xc9\xe46*\x86#A\x898\x86\xa5\xb1\xb8\x03ϭT\x04\v\xa5\x0e2\x1a\xd1\n\x90X\x9c\x90\x8bbK\x83\xe4\xb3\xf9p\xb4\x97D\x9fZ\xdb(\xbf\xf9\xec\xed\xf2\u05f7\x9d\xf8\x91e\xe7!\xc0?\xb3\xe7\x9d\xed\xd0\xddx\x8a2\x9aK-_ȥ\xce \xdd\x035\u0082\xd8\xc4\xe5\xbd\x1dAp\xbf\xbc\xde\f~Uj\xf9\b,{\xf5\xb1?\xdc\x06\xb4\xb7?\x01\xcaZ/\x8d\xfd\xf1\xb2g\xe4o\xf7~\xe0ڒ\xe4\x03\xe0\x03\x9f\x93\xd6[\n\"m\xcb'N:\x9b\x97\xff\x98L\x06\xe4\x86a:\xb6\xc2\xeb\x13\v\x87h\xf4\xfax\xec>\xa9,j\xe2\xa5Q\x87\x12\x9b\x85\xed\n\x928\xca;Ѡ;\xfa_\xb3+B\xf3\xf5\xccU\x81\xf2\xb0\xd1\xeb\xd9۴\xde}\x8e\xbb\xaeK\xdfPkj6u\xf4\xdc\xf1\xa7\xf7O\x0e{\x9f{\u007f\xcbi\xe4\u007fI=\r\xef?\x18\xfb\xf5s\x06~\x99\xb3\xc7\xd9^\xf7X\xfc\xf7\xf1\xc7@\b\xb8\xc1\xc5\xc3,h*\x9e\x03*#\xd6\u007f\xad\x90Q\u0530\xac\x83Q\x1b\x88\xe6\xa73aXHp)Br\x1fk\xcb$,1J=\xc9$\x9f\x93\x8f\xff\xac_\x10ߥ9\x9d\xd6\xe8\xf8$\xb3\x15\x05t\x10\xec0\xb9\x1c\xf2\x0eus\x1c0\xe4(L\xfdL>\xfe\x9c(\xc0U\x13\x01\xa73'\x1d\x9a)˲\xa9\x93X\xab|b\x1bk\xc5{\x17.\xcb$\xe4\x02#\xb0\xfe\x14{\xfa\xe6b\xbf\x03*\xfa\xb4M\r3R*\x93\x1d\x8c\xb2V\xb1\xef\x19\x0f.+\xac\x96r?Q~{\x94\x18\x94\x9e3F\x87\x8f\xcaO\xee\xf4]\xd1\xe2j\\\xac\x06\xe3x\x86\t\xe3_\xb7b}\x8b*Jp\x15Ph\x8d\xb1\x8f=\xea->\"\xc1\x10WT\xc0\xc7\xd1\xe4\xe6\xc0\x91\xbe>\x8e\xf7#\xf1\x14\b\xa0\x1cБZ: a\x88^\xe0a\"\xac/\x04\xcf9\xef\xce$\xfa\xa4\xf9\xc6\x193\x1ayɘH\xdey\x1e\xb3\xb8\xec\x12\xf3❕\x95;\x17\x9b/)\xe3\xa2\xd1\xd9\x1d\x1d\x83\xf3\xe9\xaf\xdf\xfb\xa2a\x93\xbbP\x1ep-\xae\xecYVt\xc7\x1dE\xcbz\xaa\x16\xb9\x80\x97\x11\xaak;K\xc0KC\xdam\xa0?\x91\xa8\xf69\v\xa0\xc5i\x81\x05N_u\"\xc1\xdbiS\xa4\xa2\xa4\"b\xa2\xed\xfcPɦ\x12\xcf\xf8\x1b\xc6˿\t\x95\x8dw:\xb1W(x\x13\f\x807\xb1\x87(c\xf4\x15غ\x13\xea\xf7\x81\xb1D\xe6\x10\xffd\xfc\xb1b\rQ\xb1\"!\xa52\x97\xcc\x104\xb4\x01:\x97\f\xabn\xacH\xc3\xcc%Ux;\xd4\x10R<\x06\x824\xcb~\xd1:w\xd9C\xf5\xfc\xbc\xa6\xea\x19\xa6\xb8\xfcr\\3\xaf\xb9\xba\xcb\x14\xbf\xa5\xc8\xd62;^q\xfb\xfa\xdb]\xf6\xe69\xf1\x8a;\xa2ʉ\x18\x88\xc54\xf3q\xe6\xe8\xdd6{\xf3\xfc\xe6\x8a;\xd6\xdf\xeb\x1c\x1a\x02\xb1\xf5\xf2\xcb\xf0\x9b\xd9-g\xfb\x9a\uedf9\x9a\x16\xc4*\xef\xeb\xbb\xd7\xe9\xc0\x89{\xa2\xda\xee\x16t\xed\xffG\xdbw\xc0GUe\xff\xbf{\xdf{\xf3\xa6\xb77\xbdf\xfa\xa4'3\x99\x99\xf4N\x80\x90\x84\x10zh\xa1w\t \x1dahb\x03\x15\xa5\xa8(Q\x11\x1bv,(\xbaY\xfbZP\x17\xb7\xe0ς\xbb\xb8\xbb\xb6\xb5\x17 s\xf9\xdf\xfb\xdeL\b\xc8\xfet?\xff\xff?0\xef\xdd\xfa\xca}\xb7\x9cs\xcf9\xdf\x13\x03eq\xe9\br\x95\xd8>\x8b\xb9rt<\xbfgn\x0f)\x92Ȼ=!\x19^\x91?T\x13G/\x96J\xd1鹠b\xfe\x85{5ق&\xd5\x05:\"@\x97vd_\x06Ү\xecC\xe9\x1e\x9b\xe9\xc0i\xbc\fI\xa4\x9aM\x04\xaa\xc1@%\x12\xfa\x84\xdb\xe3})6\xad\xbe~Z\xe1s\x85\xca\x1cyi\x98\xae\r\x97&\xb2\xfbzåU\x81\xc2\xc7C\xb4C\xed\xe0-F\x83\xd1\xc2\xe3\x10\r\x14\xbe\x9a\xf3uMΜ\x00\x87|\x06\xd3:\xff\xa0AY\xab\xb2\xa4A)j!\xce\x14ff\x97\x97\x86\x03íYKl\x90\x97\xe9dD\xe9\x05\x9fx\xf8\xa0y8\x95\x91%\n\xb6\a,\xee̓\xa9\x11\xd4Tj1E\xf1x\x05\vB\x01!\x93\x16D?A\x8d\xb8\xa7Ax'\xbe?\xc9\x1b\xf4\xc5\xfdą\xb7h≩}\x967\x99\x855\x10\u007f[\xc8\xf1\xf1X\t\x95\xc5\xe0\xa5\x1a\x12\x90\x9d ^n\xe2T\x96?\x8e\xe3A\xe2\x03\x04\xc7M\xeb\x1b\xc0\xa2\x17\xff\xcdJY\x8d\xd4δ\xa0\xcf\nrx5Ͽ9l\xbdR'\xa15\xca\xf6\x95\xf7\xa0\u007f\xa5Ӹ,\xf9\\0\xf2\xe5\x1b\x80b\xae<\xd1\xcc0J\x89\x1e\xf7\xe6\x1a$\xf9\x120\xeb6tϥ\xd7Ly\xfb\xa1\xcf+\xfa\xee\x00\v@\xcb\xd7۷\u007f\x8d\x0e\xa1\x1b\xd1!\x12\x02\xa3A'\xa8\xfa\xe4\x8a+>A/\xa0\x03\xe8\x05\x12\x82\xc9;w\xf5\xf1S\xc0\xa5@ʇ*\x1d\x9d\xaa\xb3\x14]N\xb3\xd0\xe3\x04r \x03J=\xaf\x06R\xf4\x14\x92ҵ\x99Ԟg\xe6u\x8dH(-\xbc]\xe3R\xfa\xd9\xf9\xc7R\xab$l^\x16\xd3\xf1\xe0\v\xef\xa0}\xb3\xe0\x81{\xe7\xe7\xc0\x92\xf3n\xdc\"<̩'\xaf\xf8\x04T]\xf0\f\x99\xb5Gh\u007f=\xd1\x17\x03:6\xe8'cğ0J\x18\xa3\x811\xeb\x00\x1fH\x04C1\xc6\xccT\xa3\xafO\xa2k\xfe\xfc\a0\xe9\xf8q\xf4)\x88}F?\x10H}wÊہ\xf1\r\xe2\xa24i؟\xdaq\xcdO\xfbm\a\x83'\xae\xdd\xf3\x0f\x17ێj\xd0\xea%#\x9b\x9c\a=k3:\xe6\x82\xdf)%\x15\xa4\x8a\b\xf2\x80ї\xee¾\x18\xf0袺\x01\xbfs\xd8ql&\x18\xa5{\xe9\xded\xb6\xe3\xb4ܑ\x9d\x04xMJf\xfeW8\xb2O\xe1\x8c\n\t\x0e\xfc\x8c\x03\x12\n%E\x04\x90\xb3T\n\xdf\xf8\xdcO\x84'%\x1e\xed\x92\x19_\xd1I\x99h\xbbN\xe8\x05\xde$t\x94\x04Ϛ\"\x89\xb4\xbf\xad\x00\xb1\xba5\x1a8>\xad\xe3\x89s\xc9d\x1bO\x042~\xbd$\xff\xd63\aџ\xd1~\xf4烌\x1eV\x9bJLL\xbb\xe9L\x0f\xa3dR\x97\xe6\x96Jj\xcaˡ\\\xa6\xe9\xd5\xc8䰼\xbcN1\x16=f21]8\x9b\xe9\x82GЋ\x83\x96\x0f\xc2\xffA\xe5\xe3\x1c\a\xb5\x05R\x84yã\xde[f\xfa\x87\x0e\n\xa2\xe1j\x05\xfeS\x83G\x82\x83\x86\x06\xdfZ3GZ \x05]\x00\xa0\x1e\xfc\xfe\v\xcf&\xd9\x1bD\x9d\x16\xc0\x13\x01\x05\x1f\xa4 \x91g`6Ko\xae\xa6\x13$XL\x00\xed\xe8\t\xaa\xea\xdc\xecZU\x18\x9d}xRy$\xaf\xa1f\xdb\xefs\x02\xd7w\xae,\x8c\xc7J\xcb\x1d\xb5\xbe6\xf9\x0eؐ\xaaR(\xe0\v\x83\xc0K |\xb5F\xb3\xe8K\xfcdU\x9f\xde\xf0\xe6X\xb5:4\xbd\xfcr\xdd\xcfi\x9f8\xec\xc7\xc2\x1aJ\x01\x0f\x19e\xe2~\x17\x1eY\xfeh\x96\x99\xc3O!\x10y\x98\u03a2\x13\x1e\x9a\x82\u007fR>\x81\x1ez\xefVt\xf2\xe8\xaaUG\x81\xe3V\x90\xf7\x97w\xd6<\xb9\xe1\u007f\x92\xc9\xff\xd90v\xc7\xe4&\x8f\x04\xb5\xc0\u007f7T\x1dG\xf7\xf7\x92\x02\xa0\x1c8\x8e\xae\xfa\xc3\x1fVl\xfc\b\xfd\xfc\xd1Ƣ!\x13;\x02\xa2^\x998O\x10\xbbW/\xd5&H#LD90((ѓ\xfd\xb5\x88?\r\xd8\x1ca\xd3\x14\xa7)A\x80m\x82!\xdeL<|\vئ\x98\x9e\xa2%\\\xda\xd0Ì\x0fL4⏕`n\xd0?`\x96\xc0\xb3\x83\x89\x19\xac\xd5V\xa3\u007fWk\xb5\x12\xbd\xa4h\xd5\xcab\x89\x1e\x1d+i\x8eŚ\xc1\xefb\xcd%8t\xa6i\x86\u007f\xe3\xe35\xaf\x92\xc4@\xdc\xf6\x01/\x19th\x83\xaf$\xd2\x14pK\x80套\x81\x85s\xf9\xc1\xac\x8b\x8cG\xb0X\xab\xa9\xae\xd6h%\x92\xe2bɻ\xf8b\xb8/u\x06\xc85K:\x8a\x9b\xfc\x9d\x12`\xcf\x0f\x94Ěc\x91bֈ^\xe5:\x03Mžr\x8dݹ\xfd\xb5\u05f6gY5e\xcf\\pA\x1c:\x1f\aK#xs\"\xf3\xa9\xd0N\xdet;\x91f\nd\x9a\xc9\xc4\xf6\x87\x12B\xe3\x04C\t3\xf9v\xff\xa1\xa9Dk\xfb\xd0/\xf5\x96\xe8\xfbU\xaa\xd8\x171\x95\x8aղ9GsX-B\x05\xd5\x05\xf9\xb5\xf9\xa0C<\xff\xa527ǽ\xf8\xe6\xf8\xfd \xdfM\xe4.E\xc6guL\xe5͋\\y\xb9\x95Y6\xf6\xeb{\xef\xfbZbu\x83\xe8y\xf8\x13\xbb\xf1E\xf15%\x92\x9c\x1c\xc9.wA\x81P3}\x1e\x9cS\xe9nc\xbe\ve\xe5\xe1\xab\xe7\xe6\xb0z\xf4\xbd\xa45\xab2\xc7\x15QYͫ\x1fx`\xb5բ*\x06'/Η\xb8\xf0\xecC\x10\x99\x13i\xf0\xb1~\xb5\x14\xe1\x05E\x95\x13'`ciE\x95*\xc0\x85\x8c\xa4\x03\x9d\xa7&9\xad\xf3ҞK\x1dA\xfb\xee\xa5\x1d#\x96\xda\r\xbc\x1d\\\xb9\x8b\x9c:+/\xbdc)\x18q!\xffr\xd8^=\xbc{\xd1p\xf4\x89\xc1n7\xac\\ݱdq;\xc0\x8b\xa9\x83\x8f\u007f\xb4z\x9d\xc1\xee\xe0\xd7\xd8\x1ckڗ,\x01\x0f\\\xc8Ր9\xeaN.\xc9N\x12\x9e[\xc0E\x12\x1fZ4\xb1\xefw^/<4\xc7z29愘\xc5\x04+GU\xf6=\xf2\xe8\x190\x04\aR\x0f=\xdc\xf7\x02\xb8\x16\f9\xf3\xe8#}\x9b^\xc0)t\xe9r\xa2\x1e\x93\xda\xfb\xd0\xcfg\x1e\x05rt:\xb7\xa2\"\x17.\xb8\xff\xdb\xef\x0f^Q~;\xfa\xf1\xd13\xa7\x1e\x06ʪr\xf4mNEE\xce@~\x85\xe0}P\x01\xe2f\\t\x8fz\x11\xfa\x98\xedMբ\xacI\x9b`/81iS\xed\xc0\xef\xdb\x03N\xc0\xdeM\x93PV\xaav\x13\xe3<_aO\x8a\u007f6)\xc5\xfc\x03\xf7h\x19\xbe\x8fN\xb0v\x0f\b\xb89dy\xf0X\x81O\a\xf0JA\x1b\xa31\x9e`S\xe0\u007f\x01\x1dN\x1b\x18\x1e\xf2F\xea\v0d\r\xb8\xe9\xcd7\xdf\xec\x80\xc6\xd4\xe7`\bz\x8a$\xdc\f\r8g0:\f\x06\xafa\xfeї\r\x0f\xe3\xbc\xc5\xe8Z\\f0<\f\\o\xbc\x81\xfe\xd6\xd7qg\xc7~1\xb1?8`|\xc9\x04l\xd4\"\xe2[\x88\x12\xd8nb\xf31 \xa4M\x03ys\xba\x04\xb1\xed\x80B\xdc'F~\xc1\x88\x9bZb\xb9vGN\f\xfd\x90\x0e\xc0u\x0f_f\xe0͉\xb1k\x8fE\xeb/\xbb\xfb\x91˚\x1b\x9e>\x96\xa8\xba\x8c6\x9f\xa7D٘\xec\xd4\x00\xa3\x0e\x8cHN \xe7T1P>G\xb7\x95O\x91\xa46g\x1f\xe5\xe1\\\x1c\xf5\xf7=\x85\x83\xe0\xe7\xf3\xdbWNe\x9f\x95qo\xe2\xf9t#u\x84z\x8d:J\xbdO\xfd\x9d\xfa'\xf5)\xf5%\xf5\x15\xe1A]4Q\xd0WC\xae\x80\xf5\x11MR\x17\xe7\x06&\x1c\r\x8a\x06$%\x89j\x88\xa7\a¢\n\x9a7\x8cHl\x93%\x11\xcf\xfb\x02Gm\xceP\xd8P\x92F\xe9 \x82\x92\x10\x99@\x04\x1b9sBM\x9b\x13\x05\\\xa8\x00\xe6\x10\xd7+\x98,u\xc1\x1a`4c\xe2NZ#\xea,\x11\x85U̥\xd1\xe4\x82\xf8\x89\x04\xca.a\xe6\x80\bL\x1d\xaa\x86Q<4I&\x1fũ1\xa3\x06\xd4@\xe6\xe5aWN\x9f]\x97\xeb\x99P9\xa8h\xd5^\u007f^\xa5=T0}\xa8\\\xc2\xc8$y\x9c\x9b\xd5\xd3\x12\x00\x00'\xd5Ѿ\xcdY!\x0f\xa4aE\x02\x8fD\xff\xee*\xeb\xccn\x87Ĉ\\n\xadE\xa7\x06\xff\x90*\x8c\xbc\x9de\xcc\x12\x8d\x8d\xbbS\xa6\xb3\xea4O\x00p\x97\xa9\xf0\xba\xc2D\xa1\xbc1\x97\xed\xa8\xceK\xe4\x18\x8cr\x8b2B\x87\xf3}\xa0\x8a\xd5qj\x89\x9c\x931\x9cƦ/T\xaf\x9b\xa0\r7\xd68\aK\x95YY&\xa5駵\x8e\xbcl\xabW\xedS\xe4J9\x98=\xbc\uf43a4OG\xe7\xfe\x14:\x1c\x97ٝf+\\\xb5\xa6\xaa\x16\x9d*Z8\x14\xdcN\xfbʢ\xa5\fg\x1c^\xe7@\x83\xba$\xf2|%\u007f\xcc-ϦW\x01H\xfeM\xa1\v\x9bVL\x1dR:/Q\xe5J\xd4h\x03{\x1f8\xb2s*dX\x19\x1b\xe0\x9cJ\x975`\xf2\xd8j\xb2[p\x9f\x90k\xdd\xcd&UY\x95\x11\xdab\x93\xd6\xddd`l\xdd&\xad\xc6L\xcfS\x9bTr\x86\x85@\x95\xa5\v\x98t\x1a\x13\x1d\xd6ڞ\xec)\xf6{i\x83E\xab\xe7\xf3\x86ڲ\xb4\xb4Z\xe5w\xd7:\xac\xe10Th\xfe\xcc\x1a\xa5\x1a\t&\xe0!̀\\\x97\xc7V`\x1f)\x93\xe5;\x00^\x81\xa6L1\xfaC\xe6|]\x19ߢ\x91\xc5\xc6\xdc\xf5r.-\x93\xcb\xf88\xa7\xe8\x1be\xcbu\xc7\vJ\xd9|\x05\xedW>R\x84\xde\xd6\x00N\xa3\x90r \x17\xaa8x\xa9A\a\x94\xa9\xb5#\x95\x92b\x00\x84+\x8b<\xae\x1e\x8f\xb1\u007fSfL\x93M\xa26\xe1e-\x98\xde\r!\xfa\xb3d#_\xb0\xb6\x14Ԛ\xc5Q&\xa8\xd4q\xb8\x93\b\xba\xe5qPB\xd0k\x88\xfa\x1d\x91\xc7\x00A\x99\x8d(#\bZq\x82Ɨ!\xbd\xd6\xc7Jp\xbf\x13\xbal\"\xcd\x1f1ײ\xbckI\xf3\x86ZV\xaa\xd0p@\xea\x9d?-\x92=6\x97S\xe6\xf1\x06s\xac\xd0\xe2,\xb6\xa9e:3\xad\x91\xa8eZ5\xaf\xb0\xfb\x14R9+7\x83N\xb99\xdf\xe5In\xf4ۇ\x0e\x1fםX\xba\x1f\xc2\x16gCSٮ嫳lmu\x83\r\xbe\xc2,\x873\xb6\xf6m\xf49z\x1b\xfd\xe3O\xc9PEǰ\x8eB^\xdd\xec\xabr\xf9\xf3\xa4\x1b\xca\xf2\x0e\xe6\x1a\xfd\xa3\x1bF&B\x11^m\xf2\x16c\x0e\xc3 \xcfr\xd04\xe3\xb1s\xcaͅj\x8d\\\x99g1H9\x03T1rFBC\x8dZ\xa3\x930JPh\xca\xcfw\x8c\x1c\x05\xc2\xe5\xe5a\x00n\x99\xd9]b\xd0յ\xd6\x02P5\xb4\x1a\xd0ނ\xec\x95G\xf7\xa3\u007f\xfen\xc1\xd2W\x80\xa3g\xfc\xddk\x17\x0f\xabuʥ\x01C\xd8\xe2\x18?■\xb3ͮ\xb2\f\x1a\xb2|\xdd\xfd\xd4@\xec-\x17^%;\xa9\x95x>\xd0@5\be\xecy\x13A\xccU\x9b9\x89\x01\x93\x1354mƄ\x82Wbp\xd3\\!,\x00\x89\x02\x11G\b\x8f\u007f\x93hD\x1a\"\xdb\xe9\t3!\xc0\n鄛HT\\\x806H8\x93`9L\xb4E5t\xa8\x06V\x13\x85\x1a\\\x91)\xe8\xd9\xed\xaa{`\xb4\xb6{\xe8\xe8\x95\xe3\a\x99\nꔻ\x15\x81@`N\xc0\xb5\xfb\xf6\xe7\x94{\x94\x819\xcd\x01瞞ݷ\xefv5\xe6ٛ:W\x8enY\xaa\x1cu?={\xe5\xe8\xe6%\xea1\xcf4*v\ve\\{z\xf0?gm\xa1\xb1e&\x9c\xd5b+hP\xe2\x8c\xe69B\xc6\xed{\x9c\rO\x8dQ,m\x1b\xbd\x12\xbcճ\xc7U[`l\xea\\5zH\xb7ṽu\xca=\x8a\xc0\x9c`\x80\x14\x84zr\xc7\xe6\xb9\xe4\x8e\xf8\x9f\xab\xe1\xf0X\r~\xb0UӚ\r\x85gv\x8e^5y\xb0#\xafQ(2'}CW\xed\x03\xa3\x15K\x19s륊\xd1O6\xa4\x9f7\x9dՐo\x1b6k\x95\xe8\xb7C\xc4\xcc\x18D\x8d\xa3&PS\xa8\xd9\xd4<\xeaJ\xeaN\xb2\x9f\x13,\x14\\ՅDe\xcePZC1\x11$ӡ\xc4 *r\xe2\u007f\x82\xd11ѽ\xc4c\x81ȅ\x04\x1dOQe\x93\x16\x144}\xa4TB\x90\x86%\"\xac9\x04\x02:\x16\x98\xe9\x10\x9ev̀\xd5\xe1OHn! \u0088\xfb\"B]b\xba\x8d\a\x17\xd0\t\xa2\xecPIH'h\xb7$tl$\x0fg\x1aup;0\x1b\fy\xb9\\#\xd3\xd00\xc2¸iI\x8bq\x83Z\xd7\b\xa5\xb3\xa4!\x17\x84\x80\xb5\x99-z9\x03$\x01Ey\xe1\f(\xafWȬ\f\x03i\xab\x83\xb6\x96\xd4*/c\x19\xd5[4\xa7\f\xba\\6\xb3\x9a\x01\xb4\xc7P\xe4\xe7u\U000396ab\xcf\xfc\f\x9fH53\xc7g=>㯳\xf2\x8f\xa1\x02X\x85N\xdf\x16\x0fo\xdcQ\xee\x195\xfc\x9b\x1a\xa9\\\xca8<\xcc\xd0\a\x06O\xb9n\xb4\xc6\x1d\x90\x83\x9d}\xa7թ\x02N\xc5\x12\x85h\rf\u007f\v ft+\x18\x03x\x8d\xe6\xa42\x83\x93\x8d\xc1\xd9mS4\x90\x81\xcc8\xcb\x13vו2\xe0\x85\n)ѻ\x93\xb3\x1c\xc7\xe8$:(\xa1\xb5Z\x1f\xf41\xb4\x1c\x00\xa5\x11F\xca\xd8\xc8\b\x87\xa4\x04\x82bpB\xa32k\x94\xb4Yc\xc3ÐQ+Ꮏ\xe7\xa4n\xfa\x17#\xfd4\x15w\xc3\xebݩ\u007f\xb9/\xa9\xa3+\x9e\x02kO\xebT=\xf5#\xadʶ\x02N\x86\xa7\x0e=\f\x14;\xfd\x9c\x0e3\xd2\xc93\u007f\xf8Q\xf2\x9d\n@&.\x03\x12֯\x06ɗ/\x99oD\x93\x05{\xe3\f\xf6\x02\xb1\xe9\x1bL\x8d\xc5=a\x05\xb5\x95\xdaM\xddM=I\xf5\xf6\xef\xf4\xf4;\x87eχ,'\xf4\x03\xf1\xedd<\xe7FO\xc4c\xd7\xfdJ\xfc\xffwy^\x04\x16\xf3\xe8@\x16\xd9\xcfL\x92\x03{\xa2\xbci\u05fc\xbe\x9e\xfaɥa\xd8\x13\xeer\xecq\x84SY\x02\xd0\xd1\u007f<\x00\xea\xff.\xbf\xab'\\\x9aJ2\xc9\xc9\xf5\xe7\xbc+\xdf\xe9]>(E\xcd\xdb5\xb9^B\x85K\xc3\xf81\xba\xc2g\x92\xfdՀ\xfabAt\xd1\xd4\xff\xa6\x00\xd8\x0e\xa8\xd2p\x0f\xa2\x887o\xa2C/\xa1Ҳ\x9b\x1aj8\x9e\x03\x16Q\xeb\x05\x0f\x82\x0fQ\xbf\xa3ޢ>\u0094\xd8Y\xa0\x01nP\bj.\xb2\xe3\xd7\xef$Qlw\xdd\u007f\x19\xa7\xff\xcb\xef\xf9[\xfaDž@>\xff\xb7\xd7\xfb\u007f\xf9|\xac\xa0\xacrF\xd4R\xe9=\xe7v\xe0\u007f?$\u007fk\xc1s\aH\r\xf0L\xf4\x9bk\x01꿿\x93\x84\n\xdaN\t\xfb\\\x12|D\x03 g\xbf\xfd\xb5\xe0\xa3\xfd\xc1\x8bC ]\xf9ݭ\xb7~w\x0eS$cw\xe4\xc6T<б\xa1|\xa0\"\x1fQDRMc\x85\b\x9b\xa8\x98jI\xc2d*Y\v\x9fN5\xa5\x9a\xd8\xd3~w\xaa\xd6Q\xefHպ\xfd\x05A\xd8k\xca3\xc1\xde`\xc1$0\t\xae\xfdt1B\b\xa6(_\xa5\x0e%\xb5Z\x90\xd4U\xfah*\\\xaf\x06\x94Tz\x96R\u05cbPy\xf8\xfeRя\xc99\xabh\x9c\xc5\x06\x84\xe7`A\xfa\x1c\xca\xc4\xc9s\xb1d\xc7\x17Ӭb \xfd\x80\x01ဟRX|\xf1\x01\nN\x84j\xc1\x8dh\x01Z\xc0\xbe; \x92'\x86\x0f\xa3\xc1h0{*\xe8A\xb5\xd6Z+\xaaehȦ\x83\x9e`\xae\x0f<\x8a\u007f\xbd\xe6\xb8\x19\xf4\xfar\xc1\xa3\xfe\x9c\xae^P\xbe\xbf\xfb\x81\a\x1eHm˄V\xde\x05\xe4\xfb\xbb\x9f}\xf6\xd9T\x15\xea\xf2WkO\xa8\xd5' \xfe#gm\xb5\x1f\xf4\x04k\xb5O\x83\xeb\xf0\xb1W.\xef\xd5\xd6\x06Q\xf7\xd3\xdaZQ\xa6\x82\xa4\x14\v\xf1{\xcbp\xbb\a\xa9\x02\xaa\x8e\xec\xd6\x1a=4A6\rҘ\u008bB\x8f\x173?\x94\xd8#9\x8f\xc1\x14\xf0Db%>O\xccCxu\x9f'@<\x8f\xe1\x1c\xa1\xc3\xd2>\x0fW\x8a\x008\xdb\xd7\xd9-\x01{\xf4\aj\x96\xeb>\x98\x81\x0e\xff9\x05أW\xbd9\x13\xa6.Yz&\x0e\xc2o\xbe\x82\xfe\b\xacm\x13\x9eC}\xe8s\xd81\xf6\x8ae5\a\x97\\Z|犩\x87\x9f]\v\xe5\x8dC\xc0-`\xe7\x86\xe4\xfe\xdb.\u007f\xb3\xfa*\xc5\xd0\xe2\xc5\n\xc44\xcd\x035\xe8\xf7\xe7K\xc1\xd0\xf5}_.]|[NIw\xd9\xf0\x1c\x1dz\xfe\xa9\xce\xc9\xe8\x91\xe3\x8b\xe7d\xb5\f\x92\x1b6?rp\xe3\xd6\xfd\xbf\xf3\x86\xc1%\xabK끼5\xc3kq\x19\x9c\xfb\x10Ag\xed\xf7Z \xec\xc1\x9a3\xfag!B\x99\x83\x01\bE\t\x03\xe5\x03\xc2\x1cR\x88Ǖ\xa0>C\x80l)I\xc1\xb5\xaf]{\xedk\xa9m;\xe6\xd8\xedsZ\xeb\xdc\xee=-\xc6\x0eC\xd6\xf2\xc1s\xe8\xb7\x1f[\xb7\xfe\xb1\xc7֯{l\x17\xfa\xe1\b\x1a\xa6|~\U000ea9ed\xff\x00[\x86OV\x99\bƀ\xe2\x99#@\xc1\xb8I\xfdk\xcf<\xf7\xf6\x0eI\x8e{wKk\xad[\xea\x91V\x0e\xa5?Z\xf7\x18\xae\xff\xe8\xa3\xeb\x9fE?\xa2\xdfoxtϥ\x13\xc1\x03\xb7\x16A\xb0\xfb\x19 E?P\xe7\xf1\x8eR\xfc>\rTk\x1a\t\x80l\x9fR\"7(\x98/\xc7\xf1C\xc7\xcfm\x84Ue\x18\x8f@$\xfd\x9d8\x9a\xbc} \xb3\xbf,\xb6\ta\x0e\xdf[ҳxq\x0f\xd2^\xdaQ:\xd9ZRP\xb9\xd2j\x89Vu\x98\f\x1dt\x9f\xf8%\x0e\x1an\x982\xe7f9\x18\xbf\xebر]7\xfe\x11~,\xe3\x87U\xa3\xbf\x88\x1f\xe8\xa7\xed\xafn\xdb6c\xe66:\xbbg\xf1\x92\xe1\xed\x8bѫ\a\x96\x96\x17\x19\f\xf8\x1a\x95+-\x1e\x16.\x14?\xe6M\x83&\xae\xbcfv߱\x9d\xbb\x8e\xbds#z\x0e\x04V\x80wq:꙱m۫۷\x11\xb4\xf1\xb3c$_\xb1g)\x15\xee\x97\xf9\x98O\x1e&\xa0&\xd1\\@\x10\xbeb\x06\xcad\xc7\x1c3\xad\x014\xd1n\x8d'B\x80X\x1b\x01̡\xd1\x9a\xb4\xdb\xdb1\xa8R\xa7\x03;\xddq\xa5\"\x04\x16\xa1\xebLN\xba,`/m\xf6O䔰\x1cm\x998\xe4\xfa\xb9\xa3\x8cF0\xd3V\xa9\xd3\xd7\\6&\xf5\x19\xba\xc9\xe9\xa3\x19\x8e\xdd\x0f\x16\x81y\x0fhM&\xfa\xd1\x1at\xcd3J0\xc3\xed`\xa0\xc1\x94g\x8d\xa3\x97\xd0\xce@\x9b\xcf\xe05\x99\xe4zz\bX\xf0\u0097#\xd1Ն1\xe3o\x9eԠR\x01ڮ\xd1T\x89}\xa4V*\xf6y\xb2\xaf\xdbp\x0e-\x82\xf7\xe0\xd6\"D$ן2\xd0pԓ1 \xcd8\x12\xc1\xedG\xba\x87\x99\xa80\x80\x13\x937O\x9e\xbcy#\xfd\xf3xh\x91\xa5(\x99\x05\xb2\xb4\x90\x84\xf4\xea\xae\xee\x9e\xee>\n\x1f\xba\xd4\xfaM\x93\x1cs\xcdwL\xa3\xa9iw\x98\xe7:&m\x02\xebH\xa1\xc9\xe0\x04\x98)\xe5yi\xca*F)\x84I\xf6$q\xbd\x99\x14\x8f\x98\x9eK\xe2\xd2wN^\xbf~2\x9a\xb4I\xb4\xab\x95\x92\xe96JU`>\xbeu\x00\xaf\xf6\xbf<\xb0\x88\xb3\xecI{\xc42\xf3\x19\xbbYp\xee\xdd\xd3)\\֤M\x17}\xf4\xa4\x88\x8a\x97$/p\xea\xb4\xf8\xb83\x06\xbc7\xe3\x11\xd2`r\xd3$\xf2\x12\xb5\xe4\xf1k\xc5㹗8AȬ\x13\xe4UP\x96\xd0L`\xa3\xd8\x00}\xcf\bQL\x0fda\x1e\xe5\x84\xf0~\x94\x9f\fTW\x06\xeb\x8fl\x02\x11\xf7i\t\xf2f\xfdGџ0Q\"\x14\x8f쉠\rE\x80\xdcoE\xbdV\xbf\x1c\xa0\x88-ȃ\x1d\x9f\bǗ\xc81I`\xe1\x93|\xd0\xf6\x12\u0601\x8f\x9f\x80\x1d\x9d%Aݶ\xa0\xd5\xe7\xb3\x06\xb7\xe9\x828\xf7\x86\xfeC\x92\xe7\x11\xae\x10D\v\x85À\xb9\xc6H\xe5R\x8d\x82.L\x1a4I\x9c\xe5\xd3f\xd8\xf1\x04N\xf5\fH\xcd\x12Ry\x9c\xea\x17\xf6\x13\xfbK3\x82{>0P5m\xb6\xeb\xf7h\xcb\xcd9v\x13\x9b\xb5y\xd1\xdf\xee\xe7ռ\xa3\xcb\xf7%\xfa\xc3M\xbb\x8a|Vεz\x030\xbfcQ[}\v\xc2\xebУ\x0f\xbf\xd1cvg\xbb\x15\xce-\x0f\xee\x03\xf9\xb3\x8d\xbc3\xf7\xcd\v\xe1盲\xf8\xa5^Y\xae\xc1)\xb5\xcfVؿ\b\x1b\xb7娢V\x9fԳV\xe5\x03\xbaB\xf3\xd0a\x85\\\xc0\xe5Α\x06\x1a\xab\x94\xd9\x13.\x10\x06\x01ї-\xfe&<\xa1\x86\x89_6\x8e\xe60\x8f\x1d¡\x04\x9f\xf00\x14z\xc7\x02̈\xcd\xdb\xeeB\xc7@\xa1\x05}\n\xce\xe00\xc8g\xdeI=\xedFS]\xe8+\x17(\x84\x83]`\x9f\v\xe8\\x\xec\xe9\xf0\xef\x1a\x19\xc5\\J\xa9\xf1\nK<\xdaWRC\xa8Q\xd44j:\xb5\x18s\xa4ۨ\xeb\xa8ۨ\x83T/\xf5.\xf1\xb6Ez\xa9\x97\x18\x8d\x92\x19\x1bGq3\x92\xb6\xe5h\x839\xe3< Fv\a\xbd\x85Ķ7a&\x8a8\xb1P\xa2\x04\xcf\xf6\xb4\x993\xf8\x84\xf4(\xa6\xd9\xcfe\xb8ӊ;8\x82sd\x80\xe7\f\x82g$\xe2\"ٔ\xb80&FD\xbb\xf02@\x93l\xb2\x06\xf2D\x8ci\xee\x8faz\xd5\xc4s\xc5B\f\xf2\xb1x\xda\x18_\xc0o\x16\xa8:\x92@\tB\nZ\x8bIH\x95\\\xa6V\xab\x81Jf\x029\n\xa5J\xaa\x95\xaa\x80\\!\x91\xa9\x152ٙ/\f\x06\xa8\x86:\x1dT\x8f\xb3٠Tf6ˤ\xc0v\xc4jUȡ\xd1\b\xe5\x8a\xc9f3T\xaa\x8cF\x95\xb2\v\xc7\xd5\x12\x99\xc1 \x93\xa8\xc1\x06\xf4\x91\xd1(\xe7\xb4\x10\xf3KZN>\x99\xe7\x15R\x1c\xc2q\xa9b\x1aN3\xf08\xa2\x92ʔ\xe0ʗ5\x1a\rf\t\xd4j\x8dA3]\xad֚\xb4@\xa9\x04Z\x93\xe6Oj\xbdM\x0f$\x12%\x94\xcb\x14RN\r\x99Y\a\x96\xf5\xfd[\xa5w\x8c\xeez\x01\xb8t\xb1\xb2e\a\xf6\u007f\x03\x15r\xb5Z\x9e\xfa\xe1\x1b\xb9\xaa\xe4\x18l\xd6JYV\xaa\x95\xa4\x9e\x05\x9f\x039\xa7\x90q*\xb0 \xb9N&[\x97\x945\xbd\xf5\xbaL\xfe\xda[2<2?\xff\xe1K\x85\xe2\xcb\x1f\x94l\xdf\xf7*\xd5\xf7}*\xf7g?je\u070f\x9fId\xc8\x04\x17\xa2\xcd?r\n\xfd\x8f`\xad^1\x1c\xe5}/U\xf0߃wyE\x16\x92|k4~\vN\xcbT\xaa\x94\x0e~\x86\xe0Wr\x8dZ\xf1\x15@\n\xb5څ\f_(\xb4Z\xc5\x17\xe0\v\xa5V\x8b\xa4\xffT\xe9\xf5\xaa%\xcb\xe0ZZ#\xe3X\xa9>u㲻\xa0^Eo2˽\xe8T\xaf\xe9\x00\x95\xc1'\xa0\x04\x1f\xc6v\x01\x81\x94\xa2\xb2\xfc\t<Ր\x1d\xfa*`\xfa\xdfc\x8c\x00N-FK\xe2\x90\a\uf07d+\x8e\xa2\xdbP\x17\xba\xed\xe8\n\xb0\xf7W\xe2\x87A\x0f\x98v4\x13?JScF\xdd'\xeac\xdc7\xaa\xef\xbe\x01\x11\x903 \xc2\xe4\xe0SR\x8c\xe1Ӏ\xfd\\\x9e\xb2Q>j2\x1e;\x97ⱳ\x15\xcfI\xbfܯ3s:\x0f\xf1\xa7,([\x13\x11.\x10\xa4ed\x13W\xc2\x19\xc5=s\x0e\n~\xfb\x88=; \xd6!F\xb2\aKl\x0e*`D\xb0\xbfǯ\x8d\x0f\x98\xb2P\x03 1\xe3I\x8e\x98\xbc\xc7\U0003f401\xa3I\xd1\x10\xb9\x8a\x84\r\xfaȘ,a\x8f8\xc2\xfd\x00\xca\xc9p\x97c3X)W\xa2W\x94`:\xb15KQ\x10y\xa2\x15\xe57\xb8\xb4j\b$uE\x97\xd7|p\xffM\xe35*\v`\xe5\x8cl\xf2h\xb5\f\x96$\x1a\xfd\x16\x95J\xe16\x02\xb3R/#\xc6\xf0\xca\x04\xb2\x97\x8c\x8e\x0e\x05\x1b4*\xfc8\x02B\x85\x12\xacݺ\x13\x9aؖ\xa8\xbd\xd4\x05WX.m)R3\xccfa\x8b-\x03\xc3\x1cv4\xa2+\x9cJP\xa6<\xadg(b\xd0v\x9a\x82#l.\xae\u0604\x99+\x00\x82a\x8f\xa5\x02\x9d攀\x91\xdb³\xf3e\x1a\bGw_\xb1\xae\xe3\x96HXc,\x94@\x9au\xad\x19\xb4\x1f\xd9-\x97\x87\xc7ѫs:\xb9\x00\x1df\x18\x80\xeb\x9ap{\xa4\xe6\xc6\xed\x98(nX8fQ\xa9\xc2\xe2\x00\x80:\xaf\x9f\x89\xdfh\xd4o\xfb6\xbc\x91\x00\x1a\xe3֏E\xc9\xe6:\x0e\v\x90~\xb4D\x03|%\x05\xc45\x1b\x01V'\xb4\x9d\x0f\xb78\x1d\x8d\xfdjK\xcfmڿ/\xc9ѐ\xa1\x01K'\xf7\xedoB\xefvNg!d\xf0\xd3K\xe0uK\xae\x83,`\x18\b\xd9靿\xa1\xd9\xe8\xe4\xfc\xd4|\xf0\x89\xc1\xa6\x95Zh\xaf\f\xd9\xe1\xce\xf9\xf3Q\xb3\xc1f$\xcev\xd9,\x19\xf4\xa4>\x92\xb9%F\xa3\xcd\x00\x9e\x98\xff\xcbv\x18\xf9\xdbځ\x98\x02\xf8\b\xa8'\x91\x06C7\xf0\x918-6\x86\x00\xe1F\xc4\r\x85@\x88\xf3\xf4\xaf6\x02\xc8\a\xd6a\xb3Y9\x8b_\x9a\x81,G\xcfo\x01\xbe\xc6\xde\x17\x1aЧͳ\x19%\x8d{\x17#Q\xcckA\x1f6>\xfb\xfcoh\x86\xcf\xe6ͻ\x9d㥌\x84\xe1d\xcc\xed\xf3\xe6\x01\x1d\xb0͟\xbf\x8f\xe3\x19\x1a_G\xb9\x0f\xb7\xc9\xd7蓌\x8e\xcc\xc0\xf7/\x15t\x81\u007fk\v`\x8eR\xf4Ӎ)\r\x82\xec\b|:2r\t\xd8\u2bffs\x16\x18<\xe9ʖ\x9c\x86\xe1\xcd5E\x1d躉\x80]\xb1\xb2\xc4]Z\xed\xfem/x\xb7Ɯ\xec\x18\xb1\xd2\xce\xcfO\xfd\tX\x80R\xef\xe9\x18\xef\xd6\\\xec\x9dr\xa8\xc8o\x9cyt\x9eX\xc2\f\x18Q]\xca\xf0\xab\xaf\xc0$\xfb\xa8^\xb2\xf9\xd1\xdeӍi\xd2\xdf\xf0ܠ\x17\xf5\xf6\x92*\xc9nR\x85 gf\x9e5\xb3/C\x9e7A5\v(\xeb1\x9f\x91\x8d\xf9\x9c\xe9\xb3\xf1\xd7\xdf\xc1G\xc0\xc5u@\xb0\x10\x16\xb4\xa0\xe3|,J\x9c$\xc24\x19\r\x93DI\x90\xfc\xe8\xca\xff\xf5\xed\x92ID\xc1m\xf3\xa5\xd7\u007fx\xbd\xd48=9\xdc\xe4=\"\xf8zc\x92\x03\xfe\xc0\xaf\xbdq2\x89\xa7\xb2wНv\xebȅ\vGZ\xed5\xa05\x99\xb4!\x9b\xe0\x9f\xb1_\xe7u\xc0\xb7*\xa3Z\x04m\xb6ߴN\x183^#\xfb\x1d7$\xe2\x04\xe8Q\x1b\x12\x91\xd5LZ\x01u%\x14!^A\v\x00I1\b)\xbf\xde91\x91C|G\x1e\xd8D\x18\x83M\a\xb4\xe0\x90\x9b߰A\x1b7\x18Y\u074c\x19:֨\u007f\xd6n\x18;V\x1f\x0fB\xbe\xa4\x84\x87\xbc\xe1\xb7\xccN\x05RS\xea\x04q%y\xb7\xb0o|\xb7&5ز\x0f\xec\xd9g\x94\xe8t1\xe3\x1a\xf4\xfc\x1acL\xab\xb9\xd10\xa9o\x12\x0f\xfd1Cٍe\x86\x98^w\x91>\x1d\xfd\xad\xe3\xf4½!6\xd3j\x02\x1af4\xf2\xebK\xa1\xe0\x85\x18\tGz\x01i\x16\xb5\f\xfd\x04d\xb2ߴ\x8e\xd1\xc9L]\x80\x8f\x10\xbf\u007f/y\u007f \xef\x04r\xd9E\xbe\u007f\x82\x1aF\xf0\x93~ӛU\x13\xdbQ@\xb4߉\x85\xa9`\xbe\xe21q\xb4\xe0\xb7\b\x10Uwb\xbe\x88\xa9\\L(\xf0bY\x92\x19\xfa\xf5\x8f\xdf%\xb5)\xa2\nZ\xfa\xc4\x13R\x1a\alҿ\xa9\xf1˪\xd5\u007f\xbb0\x1d-Wi\xe0UФ\xaaI\x9f\u007fS\x8b\xe0+\x04\xf1\x95\xbe\xfb\x0e_!\x88\xaf\x04\xf2y\xfc\x87\x8e]\x98\x9e\x92\xe0+\xd2\xe4\xd2r\x1c\xe8\xfb=\x0e`\x9e'tv7{\x1c\xb7\x17\xd1\xd0\xc5\xe4\x91\x04\x8a\x8e}\xe4\x98\xeb1\xd9\b\xed\x94\b\xf6{\\ǃ\x80\xa8$\r\xdc\xeec\x8fϜZ\xf7\x87;\n\xdb;\x1cusg,\xed\x1ak\av۸U\xab\x87\u07fb|\xfb\x1do\x1fz\xf4\xb9r\xce\xdaPQ\xa7w\x97Gb\xb5\u007f\xbc\xa3\x1a\xbe\xf4\xb2\xf9\n\xf4\xed\xed\xb6\xfc\"]lɵ\x1f\x03\x0e\\\xf2\xd6{h7\xfa\xea\xe5\xae{\xbf\x1c\x02\u0087{\u007f8ֻo=`\x94\xa1\xac\xd9#\xc6vN\x9f\xf0\xf4_\xd22}N\x9c\xd7$\x94\x1csSz̙Z\t6\x00\x0ft\x016\x11\x92\x81@f\xc3\x19\xf3n:6\x80i\x14\x9d!\xedT\x8c\xb0$\"\v\xfdW8\x01=\x8a\x1e\xff\xfd\xef\xe9(\x0e}\x87\x1em\x05Z\xbcx}}5hK\xddż\xf9{\xf48P\xa5\ue8a3\u07be7\x8dyƾ7\xbd^:\x8a\x038\x01,B\x97\x80\xd9\x1f\xf97l\xe8{\x1f\xec8\xf4\xd1\xe5O<\xf1Ĥ\x8f\xc0lt\t\xfaj\x03\x80\xfeC`\a\xba)7\xf5a\xb69\xf5\xa1J\x05\xbd\xe6l\xe8\xcd6C/\xa6\xe4?4g\xf0Z\xf1\x8b\xb0+q\xbf\x1c+\xf6Ia\xd7\xce\xe7Ʌ\x82\x84\xa3\x1f\xc0\x83\xe8\xdd\xebq&\x10\x98g\xa2\xad\x90\xc1\vw\xb1\xd1\xf4.\x1e\x97\xd1\x01\xf3yE\xafZ\xd2EW~q7\xa3\xa1\xcf\f\x06\x90\xbd\xef\x8bK&*\xf7/\x9b\xd2:\f\x84\x1e;\x00,w\x82\xd3oܳ\xf6\xca\xd9\xda\x1aeCk\xa2\xb55\x967\xa2\xaen\xe8\x88\xc5u\xab\xee\xbeg͵\xd3&շ\x94\xb47\x97\xe5\x0e\xaf\xab\x1fڱ\xa8f\xf5}\xb0\xaf\xe0\x95\xd5\xfb?\x05\xf2\u007f\xdeu\xc9\xd3\xf1P\xee\xd2;\xcao>r;\xfa\xe2N\x89\x05}\xbdz\xfbt\xc3Pu]C<֘\xd3\xd8\xd1јs\xed\x8aUۧ.\xa8\xad\x8f\x96\r\x12\x13\xb6\x9do\u007f bo\x12\xab\x9a\x04\xe1?\xce7\x1a\xf0g\xe1W\x89\x98\x13 \x11,I\x84$Z*\v\x1f\xbd!N\x9f\x15\x17|˲f<\x01s&\x03|헪\xff\xb0\x17m\xbe\xff\xf9\x8e\xfb:\x9e?\xf3\xcd\xf3\x0e\xc7\xf3\x9d\xb0\x1e\xac\x15\x13^K\xbb\x8a\xa5g<\xdf\xd9\xf9\xbcCB]DSX\xddI*᪤\xc2\xfdhs\xea9!\x01\x04?\x16+K\x9f\xbf_\xbc\x9c\xb0_\x93%9\xc1\xfe\x85\xa0@\x80s\nNz\xa2\xccO\x11|\x82\xacj\xb2\xe5\x1f\x8a\x99\x18\xbd\xe4ĕ\xffD\xbd\xa8\a\xf5\xfe\xf3\xca\xe7A\xfb\xd1\x0f\xd0\ai\xbf\xb6\xb3\xd0\a\x1f\x1c\x05\xed\xcf\xc3\xe4\xc3$\xf3\xca\u007f\x82ڇ\xff\x04\x96~\xed>\x99\x8fz\xfe\xb1Qtc\xbb\xf1\x1f\xa0+\xff\xa4\xfbk\xb4\x8d\xe8\x84\xf3x>\xfb7n\xc3鸧\xc7\xf5\x89H1\x1e\x85\x8c\xa0L\"\x18\xb0\x03b\xe6N65\x13\xc4|#.h\x03\x11\x82\x91d\n\x01\xb5`\x15/\x1a\xbb\x170\x98뉚\x8a]R\xb3>\xad[\xceK\xff\xfa\x12\v\xa4\xe1\xdaR\x0f;tHdNk\xb5V\x1brh\xec*\xb5<;?G\xad\x9a\x13j3\xf0 d4\xdc\xde\xe3\tьi\xb8\xc31;\xaf\x83\xe7\xdd^C\xa1g\xfc\x88\xc1&c\xe5P\v\x93\x95S\x9c\xadV\xa99y8\u007fxqcn\x91\x83\a\xf4\x87蒳\x87ѡϷ\xc0]\xc7\xc1j^\xb0\xd8\xeb\t\f\xd6閪\x878\x9d\xa5\xb7\x1c\xae\xcdw\x1b<:ml튵ݳGV\xe9t*\xda魏\xb47Ϛ\xb3q0J\xa1\x19\xff\xb8\xf1g\xd0!\xd2=B_Sb>7L\xb5S\x93\xa8\x05\xd4*\xeaJ\xea&\xe2o#\xe8'\x9e\x13\xf0\u007f\xcc\xd4q\xf8\x18\xd4&\xcc\x12\x8e\xa8]\x13+F.\x16O\x84\xe2\ts\x9c\xe6\x88!\x97\x84\xa8\xee\x98q\x17L\x04CDk\x9btK\x92\x8b\x8f\x11|\x01|\x19\xbc\xa2\xdc4c\xceLzbU\xc7\xf5[\xc1\x9b\xaf)\xe5\xb9\xd9\xeb\x1f3K\x83!w\xb6\xd9\xe8\xca\x1fY\x86\u07b6\x96\xcdo\xbe\xab\x92\xc9\x1e\xbd\xd0\xc1X\xee\x1dq\xf5\xe1¾\xe7\xf2\xc7é\x93\xbd\x9e\t\xa9[\xc6?\xf2b(\\\xd95\xae\x02La\xa0乖\xb8/{\xeds\f\xbaa\x13\xa3\xbet\xec\xd8\xf2\x8aq\xd4/\xfcRˀ\x8fƓ\a\xed\x03\xba\xe8/\xec=\xb2\x81\xbc\xfbV\x8b!疕\x80\x9b\t\xffr\x9eR\xba\x01|\x87\xbbB\xdeDP\x8axt\x84\xbe\xea|߳eg)\xe6\x15\xfc\x8d\x9c\x02V\x90\b\x0e\xc6A\"\x01#\xdb^A\x11\xb9\x91\x98\xa4\x10\vq\x01\x1bF\x80\x9d$ڻ\"\xb0\x10\xd9d\x16\xc0\x8f\x89b\x05&B\xe8\xe6%\xc3+\xa3ձ\x9f\xf2\x81\xdd\xc8\xe2a\xa26\x06\x9b\x1a\xc3U\x83\xb5\x8b{\xc0\xbf\xf7\xa2\xefn\xabm0\x9aY\xd6o\x8c\x96M}4\xd9Ғ|\xf4y|*\x91\xab\x82\xd9\xf2\xdaI{\xff\xba\xfc6\xa0b\f=\x8b}\r\xc3\xd16d1y\xa0ݰ\xee\xbb\xdf=\xbe\xb1\xb2s\x98/\xa7}q\x01\x1e\xd8\xdf\xefU\xb3\x01|gF\x95\xae\x8eOS\x97\xcc1\x84\rj~\xcd\xf6\x15\u007f\xdd;q/^\a\xf5\xe9u\x90 5\xa7\x15e\x13\x04Z\x84XnK\xdcDk\x9d\x8cc`LSU\x04\x85\xd2\xc7\x11xM\xb3\x88֔v)#(\xda\xe2\xde&:\x96!\xfb\xe9\x02P\f\x11U\x88\x8d\x14\xd3\x02\xb5Ԥ\x02:\xf5\xe1ˮ>\xbceKqGe\xc4\xeb6(ABO3\xadcC~\x99QgTh\x01&\xb2*\x86\x1aF&\xa4\x90ak\xff\x1d[:\xa2V#U\xd7J\xb3\x1f\xe8\xf05.\x1fUgp+*\f\x8c\x1c¢\x95*\x96\x91\xea\x87f\x03\x86\xa1\xcd\xf0=\xdec(ך\xaa\x95W\x83\xdc\xca\xfa\x841^\xde\xd64\xbd\xbd\x9c\x1d٠.Q\x02\x96\x05K\xfe\xb0 w\x89ƐetC\xc0\xdc<\xc8\x10(\xc8a,\x92\xa9z\x13\xcfB\x06\x80\xfc0\xad\xb1\xc5\x03\xe1\x90\x13\x9a\x00\x84\x90V<[M\x1b\xb2\x1b\x18\x19\x88\x17\x00>CwUc:\xf3y\x01'܃i\xe4\xa1\x02\x86\xec9\xa2}\xa0\xa8\x1b^<\x19\xe0 C\xfa\x8308C\\\xc2OPE\b\xb2\x1c\xd1^1\x8b\xa0sZ\x81R5\xc1\xc6Hvn}}n6m\x8d\x86\xed\xf9\xf9\xf6p\xf4\x8bb1\x05\x1e,\t\x91\x94P\t\xfa\xd1\x1d\xba\x17\x9d\xbc\xd3\xec\xf3؊\xaa\xed\x1d\xb2\xd4\x10\xf4\xe1\v\xa0\xf5\xa5\x87A\xd91\xb8\xe8\xcae\x89Wv5\x92\x02w\x02ǽ\xb7\x03\xc7\xfd\x8c\xbc#\x12\r\x87\xa2h\x8a#/\xdf\xee\xc8\xcf\x03_]\x98p\x1fs3:\xb5\xb7\xad\x99\xa6\xe5\x8c\x0e\xae\u007f\xefu\xe0\xbe\x178\xee\xdc\xfci\xaafٟ\xc6>\xbe0\xb0\xed[\xe0\xfav۶\xefD\xfc\x12\xc9Y\xdc4\xae\xb4\xafa\x81g\r\xd0\"DR\f\xf3\f\x049K\xc0v\x90\x9c\xf4H\xceR\xac]\xadS\xa8Pŷz\xb7Jƛ\xe9\xae3\xc7в\x00\r\xbd\x92\xa4\x06\xaf\b?X§)\xa7V\xca\x1eF\xc7\xcd\f\xe71\x80I\x8c\xafo\xfa\x1d\xea\xec0O\xf7\xca\xce\xe1%\x9ce\u007f\u009ch\xd6yw\x05\x99\xbb\xa6\xef\tx\xc0\xca\xc0\xc0\xfb\xa6\xbeA\u007f\xd6;\xd52ބ\xc2\x01\x9a\xf6I\x92>\xf4\xfa\a\xa7g\x81vz\n\xf2\x9e\xbb\xfb_\xd0a\xa3p\xf7\x17\u007f\xaf\xce\x0e\x19\xe8^\xe3i5\x9b\xdb\xf7ҕp}\xdf\xdfϛwJ\x849\x81\xd0\x1f\xf8ˉ\xbclԔV\xdd\x174\xfa\xf1W5q\x99\x99H\x80\v\x16>.{\xbeC[\xd1|_B\xad>\x8aN\xee=\x88^[\xc8\x01\xe9\x95r\x8d\x96\x1b\xfa\xee\x8a9\xcf^5b\xc4U\xcfΙv\xa8\xe9J\xe2\x8e\x1a\xd5ڂ\xe1\x90k\xe3|\xc0߰\x178\x8e\xa6Ng\x94\xf7N\bJh\xb4\x03\xbdJ\xb0\xb9\xae\xdf,\xb7J\xaf\x92A\xf9\x949\xb8\xfa\xdb\xf8*\x83\xeb\xafr\x85\xc2D\x97\x90x\xe6\xde0s\xd1\xea\xa3{P\xbf6_WF\u007f\xed\x9c\xfe\x8a\x9d\xf0\x15j\xa8\x15\xe8pm\x018Ϛl#\xea\x13)k\x81\x04\x9fu?\xb8\xfe\x02\xc1!K\xe1́\x85Г\xbf\x90\rV\xe3{=\x8f\xef\xb5\x05ӓi\xed3a\x96\xc43\b\x11\xd3\t`\x84F\xda`v\xd1i\xaen`\x89\x10n7\x82<\f2n\x9f\xf0\b\x13\xb87\xa2un\xe4\x89h\xcfC\xe6\"\xbe$T\x00/^B\xb8\xaedG\xde#\xf9y\x0f\xe7Yl\u07bcr\xad\a\x00U 5)\xa8\x02 \xa0\xad\x8d\x84\xad\x96\xc2\xc3\x05\xb9\xf7嘭\xee\xec\xb8\xc6C\xb0/Y\xa9Z\xa6\xa9,\xf0[,\x05\x87\vr\xeeͱZ\xbd\xb9\xa5\x1a\x1f\xaeh\x83\xcfXqE\x9f~D\xd4jŗ\xcc=\x98k\xb5\xfa\xf2\xcbq\xa6W[Y\xe8\xb7$9.\xdb\xeav1r\xb9q\x05\xd8j\x943\x8c܈\xb6m7\xc9%\xc0\xe9\xb6\xe5q\\\x8e\xc5\xe5b\xe5r\xf3\xca2:\x9f.\xb0G\xbc!\x8bD\xce8\x84\xbc<\x9b\xcb\x0e%r\xe3ըר\xa0i\x85\x11\xd4^\x8d\x03\xe6`:\xd3\x01X\xb9\xf9\xaa\xbe\x11+\x8cr\x0e:]\xb6<\x01c\xc8r6\xc9 \xdc\xc6yi\xfc\b\xc1\xfc䜂\xb6\xaf?D\x94\xefE;\xe1x6\xc1\xbb@\x01K\x84\xb1Ih\xbfu\x81\xd5\u007f\xad϶\xc0\xe6\xbbaں\xfa\xdaq\xe3V-\x02\x11\xf0\x91\xd5\xcf6\fu\xd6\x02\x89U\x11;\x93\xb4\xfa\xfdV\xe6\xf93\xd5\xe4\f\xbeV\x16\x96\xafZ\xb6\xfd\xc0\xca\xe5\xd9\x01\xbf\xc0G\x90>E\r\xf0;B4\x88\x1b\xa8\xc1\x98\xda1zb\x81_h\n{b\xbc\xd1\x17#g\xfa¼\v\xf7\xcap9\xe2\xa6\x12t\xa1\x1e(\xb8\xd7J\xe3\xba\xf5\xf4\xf5\x9c8!\xa1RY'\xce%\xd2\xc9saX{\xe2D_\x0f\xd9!\x1d\x00\"\x17\x048\x0e\xa9d\xb2\x0f\xff\x98\xf3r\x1050\x96.&ʷӾ\xe9\x896\x05\xf1\x1e\x82ې\xe0\xec\xe1\x99\x1c\xaf\xa3\x01\xd29\xb3p:\x9e\x9dX\xcc\t\xb1q\xa6w\xcb3Ϡ\x1f\x9f\x81h\xcf\xc4u8\xb8e\xddD0\a\x12\xb87\x12D{ \x04s&B\x8a\x14yf\x8b\xd2th\f\xc9\x1asȤ\x14\xab\xe1\x90\x05'\x9e7V\x03T\x8c\xa2\xfc\xa2\rl\x1c\xb3L\xa6\xa8\xb8\x95\x8c\x97\x1a.\xe3\x1c/!\x18\xc4\xfe\u0094\x8f\xa5.\x1b7\xaa\xea\x1b\b\xbf\xa9\x1a5\xee\xb2\xcb\x1e^\a\xbf\xa9\x1e\x89\x03\xe3FV\u007f\x03\xd7=\f.\x1bH*\xa5\x1e^W\xbeR\xab֮,_\xf70.\xc2iW\x96]\xf6\xf0ee+\xb5ܸ\xcb\xe8\x13\x03\xe9&\xae\x9fw\xd4\xe1o]M\xb5P\xe3\xa8\x19\x98{\xa0(a\xdbW\xd8\xe1\x15\x04\x13\x8980\x13\x9c=\x8d\x80\x80p\x8e\x91\x8b\x12\\\xf5\x88\x1b\xf0\xc2\xe6qZkք\x97\u0381\xb1\xb8\xd8w\x85\xf93\x94V]\x11\xa4\xea\"\xb6K\x89\b\x8df\x80\x83\fE\xd6\x05\a\xf2\xe4\x06\xabJ\x91\xa3\xf7n\x18e\xa5\x9f*\xf8\xbe\x91\xe7k\xc7\x13\xdcT\xf47\x02\xcb*\xc0\xa9>q{-\x1f\xe3\x1b\xcfȕ*\xf9\x04\x99Ln\x93w\xca\xdfWX\x14\x9dr\xb9\xcc.\x9b \xcbҫ\x05\xe0\x93.\xf5\x83z\x87\x1e\xff\xdf=\x81\x14\x95\xe3b6\xb9\x8c\xbe9b\x90\xe7\x1dX`-\x92\xb3\xe1Q\x1b\xbc\n\xf0@\xc1w\x8d\xf8\x82\xb5\xb7?qm\xe6\x1e\xc0Ep_\xc7\xd7\xf2|#\xc8KW\xc4W\xb6\u007f%\x1ceB\xca3µ{ҷ\xd2\xeb\ae\ue3df(\x8dK@ږ\xa1\f\xe4˃\x00K{\xe0\x05[@ Ǹys0df\x03\t\t\x97\xe0\x89Q\xb09\xc1\xf2\x9c)\x92\b\xf1\x018\x15\xb8\x81{!\xba\x95\xfd\xe5\x1e\x10\xb3p笯k.\xdf\xf5U\f}\x8c>\x8e}\xb5kk\xf5׳v\xba@\xd3\u0557.\xfbq٥W\x83&\xf8\xf6\xdbo\xa3\x87\x99\xe4E\x18\xdc3C^?C\x8f?\x01\x1a\x94G[\xd6\xee۷\xb6\xe5\xa8\x12={b<}\xe6\xf5\xcda\xf4\xe7A\xa1\xd0 \x90\x13\xa6\x04\xdfui\xff\xd0\x19\x9b\x82\xa1\x82\xd7\x10\xb2\xc3p\a\xf5(u\x84\xcc\x0e\x19\xcf\xd5iW\xee\x17\xc4\xc1\xaf\xe4\a2JM\xbe_+\xf9\xeb\xf9\x9eX\t\xcb\b\xc0\x0e\xd5\f^\x01]\x8c\xee\x82\"\xba~ǡ@\xf4\x12)\xba\x8a<\x17\x84\xb5\x17MN=\xef\bB\x18\xb4ó\xffM-\x90L!\xb4\x11mL!]\xb4}\xdbc@\x05\xaa\x81\xf2ж\xf6\xa8\xee\\\x99\xa0\x1d%\xed\xc1\x13\xfd:\xf0\x03\xbc\x8b\xa2%\x17K\xdd\x11\xb4o\xd8`\x0f\xa6\xfe\x8b*\xe0*\x95|\x0e\x043\xe5*]I˰\xd6\xf2@\xa0\xbcuXK\t\x1a{\xae\xc4(|I|\xe1~\xb9_\x1a\x17\xc1 h\uf525q\xc0\xfa\xe7%\x9e \x1a\x11A_&A\x10%D̠\x1fڍ\xed\x0f\xc1ޠ-hCxB>\xc5Y\xe0\xbf\b\xbc\xad\x18\xc53\xf9=\x16\xae\xef8\x81:\x02Y\x04\xec7\x13bzS8?%,\x15\x90\xa2\xe7\x9aS\xb5\xb0\xb7/\x89ҋ\x02^$(3H\xa4ݝ\x93\xa3H\xe7\n\xcf\xec$\x14\xa7\x81#\xdaBL\b\xe0\x05*\xa8\xaf\x01f@\x04\x91\x9cp\x96\xfcO \x80\x16\xed\xea\xb9\x13U\x1cF\xbb\x1e\a\xf3\xd6\x16\xdeٳ\v\\\x17\x9c\xd7\x1c@ݟ\x81\xeb\x83\xf3\x98\x8a\xe0\xdc \xea\xc6e\n\xd7\nE\x0e\x83\x97H\x99\xeb\x03\xcd\xf3q\xdd\xcf\xc0u\x01A\xf6o=\xab\x94\xfcS\xf0\xdbg\xa4\xca\x05\xafD\x03Q\x10.\xe2\xeb\xd2\xc5b\xea&.\xc0{\xc6\xcd\x11\x17\xacf\xf1\xa8\u05cb\xd6w\tZ\x10\xfb\xa7\xfd%\xf0\x82\xf3\x05\x170\xa7\xd7\x00\xa3.\x117\xd1s\xd7?\xba\x1e\xff\a?\xae\xeb\x1c\xbf~\xfd\xf8\xceu\x1f\xd7\x0e?s\xcfȊ\xdc\t\x83'D\xc7;F\xc3F\xbb\x84\xb1\xf9\xb8El\x8d\xb9188:\xb4\xaa\xf9\xe5UgFͯ_6\xa7m\f\x03\xa4\x1e\x0e0c\x87\xcfYV7w\xe4\x99U֜\x10\xa3\xa1'70\x9f6L6\x86rh\xc7\xc8\x15+F\x8eZ\xbe|T\xfa\x8c~\x86\xb7\x8c\x1d\xda815\xc5\xec5ipM\xe0\x90\xd0V\xdb\x04\x82\x9aOK\x14Z\xb3۲s6\xfa\xfb\xa1ž\xac\xc2\xe8b\xd0\x04\xa0\x14\xa0\a\x97D\n\xb3\xfcK\x0e\x01\xfb읁\x12;\x94\xd3\xf0\x89!\xb3f\rI5k\xec%\xa4\xcdf\xe0\xf5poZNK\xf0$p\xcf\x12܉\xe9\xf8\x04\xb1\xc17&\x80\x0ex8\"~\xe5\xe9\xe4\xf5\xd0}\xfd\xf5\xa93c@\xd3qL4\xb7\xa1\xa7\x8f\x1fGK\x162m\xa8\rL\xb7\x12\x9f5\xf8\xeb\tT\x9eN\x80y\x8c\x9d\xf7#4\xac\xb0I\xe8\xd1\x19\xb8\xf3 \x1d<1\x86BD\x92\x9f\x12,5X\na\xa2\xe9\xdc\x0f\x13y\xc1\x92\xa0$y\x9aR\xb0\xafc\x9a\xae\xbb\xfdT\xb2\xbd\x1bP\xa4\xd2YL\xddєP\x8f\xea\x97\xc7\v\xbf\xbeZ\xbaW\x04\x12fj\xcf\xf4z\xdcA\xe6\xbd3\x82\xae*S\x9b\xc4Us(\x15\xf7g\x01o\xc1\x8d\xe7\xb6\x11\x98.K\x8fZ\xa3!\xe1\xc5\xccJڊ&A\xf4\xfd\x04 0\x01\xff\xca\xe7%Έ\x05\xf2\x1b\xaf-B:\x8f)\x18\x1cNゝKg\f\xe1\x1d\x97u\\6\a\xb6\xac߸~\x18\xad\xdf-o\xfb\xe2\x1f_\xb4\xc9wSg\x15\xca+\xfe\xb5g\xf4\xfd\xebg\x94C\xdd.\xf9f\xb0\x12$\xc1\xca\xcd\xf2]H\xa1x\f\xadG\xa5h\xfdc\n\x85n\xb7\xfc\x19\xc8@\x1bd\x9e\x91\xefV\xdd`\xc8\xca\xcb\xcb2\xac\x8d\xe0\xbf]z\x95\xbcuܸV\xb9J\xbf\vh\xa5s\xa7\xe7UW\xe7\xed\xd2+\xe5\x9bw\xec\xd8,W\xe2D\x8d\xec\xd6}\xfbn\x95\x91\x82O\xbf\xf1\xc6Ӥ т\x13\xecf\x84}́R\xa9\x1aj\x185\x92\x9aNͧ\xd6\xe0\xc1y\x81O8\xea\xbf<\x13lH\x11\xd5.\x12\x1f\x986\x10\xebN;@\a{ \x8d\v\x92È^\x04x]8!\xf1D\x0f\x1b\x18\xbbh\"=\xaceN\v\xfe\x8f2\xf53\xe6x,>\nI\xaf\xb7\x94\x9c\x16$\xe7,>\xc6扵\xc9\u007f\xf0\xbapB\xaf\x0f\x8c]41\x95\x04\xe7\xa4\xf7\xf0\xac\x98\xd5+\xc0R\x8b\xfc\x06\xbaKH\xa3\xa9\xd3\x14)'!G\xe2\x11\xef,\xc5~%!\xb8z\x83\x84}\x10\xe8\xf1\x11\x98<\x02\x1f \x18A\x91\x8d\xc9\n \xb8\xbf\x11&\x10\xa2d!\xbat2\xf8B\x98\t\xa4\x85&Jd4\xd21Q\xfa\x95\xde4\x16y\xf3\xacA\x96I@6d=c\xb4\xd02\x9f\xde/c\x83\x9b\xb6\xcc~\xa8{V̢\x004\xc3\f\xbf\xa9\xa0\xfd\xc3\xc5Wwv\xce\xd0Ñ@\x81\x8e\x9b\x9c\xf4\xbf\xd8|'\x1c\xe3]_4\u007f1\xbdz\xd4J\xd4\xe8\xb1\xf1\xe8\x80\xc6\xe6q\x19KOt\u007fT\x1a\x80\xe6\xd0\xdc)\xbb\x9bj$4\xa0+\x1e\x9b\xbf\xe1ӎ0\x04\xa0K\x9a\xfaQ\xee1\xb1\xbfs\x06m|\xf6~2\x87\x87\xd2k\xad\x9c\xd2\xe3\x19\x115\x8foZ\xe1D\x10nH\xad\x83\x1b\xb5\xf6\xe5\x93g\r1\xfb\x8d\xae,\x8f\xe2:/X9c^\xa3\xd5k4y\x80UzK\xe4q\xf2j\xbdNo6\xeby\xad\xda\xe0\xf0\x1cu\xb94vg(\xe4t\xa8\xb7\x98\x95N')&]\xeftjJC!\x87S\xddF4\x86!\xa1H!C3\x90Ą'$O={\xe0\x00b\xee\x1f\x8d\x9bj6i\x96\xd1\xf3A\x15\xa8\x1c9\x1d\x1dC\xefN\x9f\x0e\xf2@\xfe\x9a\xf9\xe8\x05\xf4\xc2q\xc8z\xd8|jP\xf8\xa0\xa58uMn\xee˦{\xdb\xc4n\xb82\xeaz$aF/\xbaK\xdf17~\x16\x8f\xa0;\xc1\xd8D\xc91c\x85\xfbA\xa9\x94\x81\xba2\xf7=\x95\xa9|\x8bɪ\xaf\xb3x\a\xd5\xdd\\T\x8e>\xb7\x1am\xba:\x80\x99V\xb3\xbe\xa9\xf6\xa6b̗\xfc\xf5\xaf\xbbo\xbc\x11}Y\x0f\u007f\x9a\xb5n\x9d\xd7[\x1c\xf1\x96\x847\xae\xf0\xfb\x8a\x8b}_Yj/\xbb\xccc\r\xe4\x06\xac\xb1\xf0\x86\xe5\xfe\xf2\xe17N\\\xbd\xd9v\xb9u؆-5\\\x8eƭ\xd4I\xec~\xe7ĩ\v\xa7/\xa1\xc7,H]>|xq\"\xdev\xc9\xf1JϠ\xb0\xb3\n|\xeb\xac\f.(D\u07fc\x8b\xff*+\x81\x06\x9d\x05੧R\xef\x1a\\\x06\x15\a\xc1\x84\xceN\xa0\x19?\xbe\xaf\x14h\xcap\xbd\xd4;\x9f$\x86\x0fO\xc0\x03UU\x05\x05\x85\x85Ӂz\x8cY\xa9\x04\xb0\xaa\xaa\xbc\x1c\xac\xce\xc3\u007f&\xfc7uj^\xdec`+)\x99\xea4\xa5\xff\xca\xcb\xd1\xe5\x15\x15\xe3U\xb3\xa63ұ\x16\xcb\x19sX&\xf3:\xe3\xf9\x1e\xe3t\xa0q\x81{,8\xeeq\xc5d>\x8dI\xceM\x03\x1a\xe0L]\x8a\xefZ\x8a\xef\n\xefE\xdf\x00M\xea\xd21\xe5V\xad\x9c\v\xfaC9eV\xad\fH\x02꙾r\xabJ\tXE\xc0E\x12\r\x8c\x04֣o_\u007f\xbd\xb2r\xcbU\x15xv\x95\xeb\x9c|0\xfc'\xfc5\xa9#G\xc8\xf8T\xf4\x8fO\x05\xe6\xba|x\\\x8e\xa4.\xa1\xb6P\xfb\xa8\a\xa9\xc3\xd4\x1f\xd2ި\xd2\xfbD\xb8K\xfb8\xc2\x11\x10ć\x81\xe9\x02\xe8\bGK\b\xe6\b\xd1g\x13\xa4d,\x1f\x17\x92\aXo\xe33.A\t\xc55 $@\x95\x90\xdek\x163\x12\xe07_\xc9 \xd6\xe0c%ByN\x80;I\x10\xd3p\xf1\x01M\x17\xce\xc3\xf0\xd3h\xc0\xe9\x8b\x04\x1c\x01Z\x87\x99U\x1dT\xe8M6\v\x98\x12\xf5;\xfd$\xf5\xf4=\xad\xd5=<\xac\x03RI\x8b\x01\xea\x81R\xaf5\xd1c\xa6\x81X6IQ\xd3\xf6\xc6!3\a\x95;*\xf5\x8cj\x10\x0f\x9e\x97\xb2\xad\nn^\x1e\xab\x1b\xc6JC\xf9\xa0C\x85\xa3\xd4Y\xb0\xae\xb5z\x9fA\xb8H\x87\x92\xf9\xe5El\x83\xc8E\xf0z@.\xf2\x81\xaaY!\x14\xad\xe7ᩡl\x0e\x9eI\xa0\x82\x0f\xfb\xb9%\xe7\xd1\xd5\xcb\x03\xc5Y\x8e@Գ2\xc7\x05\xe6+\x18\xe3\xbd\xfe\x88\x10\xdf^\x11\xe3\xd1\x1c\x89\x9c\xbfD*\xa7\xe1Կ\x01V\"\xf7\x84\x17\f\xadh\xb2\x18\x942-0\xcae\U000bdef42\x16.\xd9\xcctKUr\xd0]\x9a\xae\xa2\xba\xf4\x97U\x80\x96т\x83@\xad@]\x90\x95\xf1\x80\xf7\x99\xf0\xed\xcc\xe0\xa3\xf3\x96b\xb2\xc7ҿ\x16k\xa8\b5\x04\xaf\xc4\x13\xa8\x05ԥ\xd4\xd5\xd4-\xe2:\x8c\x17TB\xfd\xb2\xbe\xb8\xb0\n\v\xebnz\xd9\xe5҈܄\x96\r\n\xcbn\"\x0e\x12\xbe\x98\x86\x8e\xa6\xcd(E\x85.VX\x80\xf1䫋\x12\\I^X\xc1\x05+\xd7P\x1aM2q\x8e\x81\x172$\xe9\xfa\x02\xf9\x1b\fE\u007f\x81\xc9)\xa92\xf2\x1e\xb3\xde\xe9(\x03O\\\"\x89DO}Q\xdf\xe8\xcf\n\x96\xd7\xeb\x1b:Z\v\x8a\xea\x1aB\xee\"g\x87[?\xa4kDQ\x143[]\x1b\xf4\x05\xba\xea\xbc\xe0Ь\xc2,e\x0e\xb8R\xa3\xca*\x94\xcb7\xed\xb2\x95j\vw킗\xe4\x87\a\xd7Ƥ\x9bw\xf9\xb3FF\xabP^A}AA=\xfdpQdrע\x9aļ\x99\x15ڲ\xc1\xb9\x063\xfb3<\x9fKZ5(\xe0\x93\x9dp\x8d\x99\xf6iE\x9dUeR\xdb<\xddY\xc1PSy\x9dEmֺ\xad\xfa\xc5فl\xe0[\xb4ոD:\xfb\u007fF\xf9]\x8a\xe5\\\xe4%\xeb\xd5t\x96\xab\x14e\x83\x88\x1b=\x04\xfe\xf2\xe1겒\xd2\xc2\xd4\x1a\xebnEi\x1dx\x91ܹ\x10}\xbe\xb8\xa6v\xf3\x92de\"<\xdb\xcd\xf3\x85j\xf8\xc8y\x1f\x8e\xa6Ԙ'\xfeVB\t\xe3\x9c +\xe9ͤ\x81\xc8~p\x88\x8d\x94\bc\x99\xac2\xc0D`J\b\x1a[\x9c\xf8\xa7\xaaf\x88\x1b\x89\xcc\xe6\x13^\xbc\xccD\xd5^b\xaa\xfa\xb2\xa5\x04\xd5\xeezw'\x00\x94V[1:k6\x13\x95\x02\xf9\xcf\x0f\xcb\xed\xd2Q8\xf04\x1f\xe9\x18W\x15\xfa\xec9ii{\xa9t\xeds1p\a\u0381\a\xd1\xdeWKZ\xe6\xed\xda9\uf86c\xd1\x15Z\xed\xd0ْZ\xb9]v\xea>)\x94w\xe1\x02\xb7gys&\xdep߷W\xef\x01\xac\x837\x10\xfdz\x03\xaf\xdf0\t\xcc\xc7\x05D{\xb6s\xefa\xc2tD\x1b\xd9\x15\xea\u007f\xf8\xa8\f\xa4]3jA\xff\xdb%\xeb\xcc\x16\xc1\x8f\x9f\xe0\x9f\x0f\x8c\x03\xf7\xc0S\vVW-80\xb5{\xf5\x96Wt\x8b\x0eN\x8bB\x10\xf3D\xea\xc7\xfd\xee\xc1[\x81\xfc\x96\xc1\xb5|\xa9D\xa9`\x15\xa9\x9b-\x96\x90\r\xc8BU\xcb\xdb0\xf5?1\xd3D\xd7ɠ\xa2X\xa9T\xc9Fv\x92K\x82R\xe08\xba\x1a\x8d\xeb\xd7\xdb\x12\xf6\xf5|dO\x8f2i\x89M\x90A\x03\x88<\x9fx\x04aC<\xf1\x8a\x99\x16\xda\x13\u007f\x172\x10\x02FI\xe3\x91\xc9\x1fϑ\xcb\xff(\xb7\xc9\xe7\xa6\xee\n\xc4^?K\xd5&\x03p\xc2\\1m\xceG\x93\xfa^\x82\xb5\xbd\xa9^\tu\x04\xfd4\xe9\xa398\xf1\x8fr\xa1l\xb2\x16P\xafDŽ\xb2Bڜ\x8f'\x9f\xae\x15\xca\xf6\xa6\xf5Ȑ \x87\xccN\xfb\xe8\xe0\xa8\xcc^;\x88\v\x8e\x1bL\x94\x8fh\xda\x12]\xe4D5#\x19\xde47\x1f\x1d\xda2uպ\xc7'\xc2u\x15}O\x87\xb6\x8e\x04\f\xfa\xe1/k\x9e[Z\xce5\x96Vk\xb2\xd5ֺ\xe6Ys$Ԥ\xa6\x9aq\xa9\xab\xd7L8\xbc>9\n6\xc4\xcf\xfcز\xc04\xf8O\xe8\xfbIw\xbc\xb1\x9c\x8d\x84\xbc\x81\xfaI\x15~\xcdy\xf2\xd0\xfc~4=\x01\xa1:\"`h\x8a\x10\x970*\xc4 \xe96\x82\x97\xca4`\xb1\v\xf2F\xa2\x83)b\xc7r\x02\x84\xd7\xc5#\x84\x93!\x9af\x9e\xfe\u007f\"G#jS1\xb1s2\xc5_F8\xea\x14\x95\xdf\x1et\xb8r}\x96\xb0\xc9\xe4\xf4\xb7\x17\xe4\xb7\xfb]Fs\xc8\xe2\xcbu9\x82\xed\x9db\xa6W\x88\xe4\xa7\xcb\xe4\x17\xb4\xfb\x9d&S\x98\x94\xf9e\x15!\x17\xd7\xe9n\xaf%~\x11\xc4\u007f\xb5\xed\xddg\xa8!\xa5\xb1a\xbc\xc3\xeb\xe0\x83\x9d\xf0?F\x92D\xa8\xe3\xb0[\xec&\xb5\x96\xb7\xda\x1cN\xab\x95תM8\xc1!\xa4\n!P\xdb+\xe6:lb\xee\x05\x05mV\xbb\xa9\xb7\xbd\x1b\xf4\xa2\xda̯\x9bֶ\x8e\x1c\x16s\xe6Y\xb2\xdc\xe5\xc1\x1b[\xfecD\x1c\U000c2f0a%t\xb8\xc7H\xbc@`\xb6\x1d\xff\xa4\xd4\xcf\x14\x9e\x0e\x00u*\tza-\x0e\x9eN2T_\x12⾗\xea\xed\xf7\x8d\xd2+\xac\x83Z\xbc\x12R\x98\xfc\x17\xbc>\xe1Y-\xca{\x88\x1f\x10\xfc\xfd\x19=MA\xef<\xf4ɭ\xef\x88\xf3\xcd;\xcf\xd0\xec\xca\x05\xfbS\xd4;xށ\x97\xa7>\\\xb023\v\xa5\xa8[\xd1'\xf3\xe0\x1d4\x85'\xb8\xf3\x9e͝y6\xb2d\x90\x91F\x86[H\x18a\xc4\xf8\x8e,\x19\xc2\xf3rTH\xbb*\xb5\x15\x0f\x94OQW/\x1cJ\x02\xe0\xedUZ\x9d\x11<\xa6\u058b\xefp\x02\xb5\x1auB\xa9L!\xb1LH\x9f\xf6\xb7\xc4Q\xccX\xaa\x8bP\x92\x04\xb7\x98\x11u\x86%!\xe2]\xb9\x1f\xb4D\xb4\x11\xc1k\x17\x14ա\x89\x13\x14\x11m[\"\x80\xba\x12)\xa7\xcf\x05\xcd\\0$\x10\x92\xacR.w\x95\xf8\x03`б\x9d\x15s\xdbZ\"e\xaebEVŸ\x95\x1d]\x0f\xce\xfaӭ\x8f\x8c(\xb5\x8f\xd28\xc1&t\xf6\x86\x1f\xae\x18{\xfd+s\xc7^7{lyEN\xb9\xad\xeb\xca\x11K\x835\x1dc\xc75\x97*\xe8\x87\x16\xb5\x8d.\x02J\x93\x8b\xd9`s\x98\x9b\x8b\x9b\xe8Z\x89ϙmW\xc9'|\xb3\xe3\xf7\x81\xf8\x94\xf6\xf5\xc3/w\x8c\x98;.\xbc\xe8Ѯ\x9e\xaf\xa6\xd4\xc4\xf6x\xfd`\xcfm\x00\xec\x98\xfb\xda\xee\x89\xc1\xeai3._\xba#\xfe\xea\xd4\xf6\x9c\xca,\xb79\xbfbn\x93Vw\xc9~\x866\xe7(\xec\xf9\xec\xf4b#0֟\xb7\x16\x8c\x15d\xf6D\xf70T\x92پ\xf2\x990)\x1d\x12\xf1H\f\x02\xf2-^\xf8L\x82\xe2*K\xda\xc8l\x14\xe7\xfeD?t\xb10̹\xe8Ep\xea\xf7|\xe6\xf3\x87e\f,\xf6\xc7u\xc0\xc0O\n\xc9=\x83\xa2\xedk\xa1v\xea\fg8b\a#+\xa66\x99\xcbB\x83\x86'G\xce|b\x1e\xcdLzp\xe1ӓ\f\x8aʜ%\xe3\x97\xee\xd9?\xa7\xfb\xd2\x02\xa9ϔ\xedO\x94\xb6\xe4\xcc\xdf3\xe7\xa1\xac1d\xbf\x1a~r\xbe\xc1\x03\x9d\x96\xf1\x8a\x18\xa2Q\xea|ϻ~\xb2\xb1\xef!*L\x9c\aG\xf5Z<\x83\x11C\a-\xee%\x1e<\r2ɴ\x1e\xabx\xa2\x05\xadX\xb4n\xc5\xd5W\xaf\x00\x1b\xe7<{\xd5;dmKQ\x99U\x8e&!h9W!s\xeaDߣ7\xd0\xf7\x9d#\xae\x02w_@\x1f\f\xb0'\xa4\x04\xb4|\xca\x02Ļ\xc3\xf4\xd3\x00\xa6_\xad\x1f\xb3\xbe\xfd\xf7\x99\xd5\u007fo\xe6\xd1\xf3\xee\bP\xfa\xd2\x19\x1a\xe2\xfa\xf3\x1eF\x98\xff\x89\x8a\a>\x11\xebK\v\xa6\x8e\b*\x17\xfe\xce5D\x14\"ђ\xb1\x11\x8ab2\x1fx8\x93\x99\x11@\xf9\x89\xed\x81\xe0\x0f\x8e\xd0\rYx\n\xc9\">\xca\x12!\xb2\x8c\x92~\x83S\b\xcf&\xb8\xa7\x8d\xe2\xd1\x1fJ\x87\b\xe0Z4\x02O\xa3\x97\xc3>ˑ\xba!\x9b\x8f\x1cټ\xf4\xe1;\x9f֗\x81\xc5 \veM\x9fkd\xd9#\x9b+\xab\x1e\xd4\xc8M\x1a\xa3O\xff\xe0\xa4#@\n*\xd1)\xb4\x1d\x9d\x1a\xdeT\x87\xf6\xe9=/\x99\xfb\xee9\x8cN\x01\xee\xf0\x92\x99W\n\xaa\x95 \t\x1e\x1b\xfd\xa1\xa8\x18\xe91\x00ń\x99\x87A\xb2)\xeb\x8c\xfb\b\xfa\xf9\xc8\xf5_\x8d\xae\xb9\x11$7\xcf\xde\xf9\"\x90\x1e\xb1\xa0>s\x89Z\xe1\x04̔\x8d\x9b\x8f\x00\xe1\xba\xf8JS\x1f\xa8\x99\x86rm\xfb\xdf\a\x1cX\x02\xb8ē\xc1\x92`\x92\x88\xe6\x1d\xa8;o\xa0]5'\xf4\x9c\\\x82\xa7G] O\xe63`T\xb4D\x90\x05\xc3\xf3\xfc\b\xfb.ķҕ\x10\xc9'1\x173\xf3\x19\xf90#\xcan\x9dCX\x9f\xb9o\x9e\xd9\xc7\x0ea\x83.&\xe8\n\xfe\xd3aH%\r\x0e\x87\x01&\r\xe0 )\x9c\xa2\xf0!i\x9d-{\x04\xd8\xc1\x18`\u007fD6\xd7\f\x14\x03\xe4\xbfP\t\x92f\xa7ӌ\x92\xae\x82\x02xI\xd8\xe1\b;R\x13Rw%cÆŒ\xe2\x11N\xe8^\x04^n[^Y\xb9\xbc\r\x95\xcf\x12օ+p\xdf\xfb\x19\xaf\v\x05\x04[\x80\x12\x87\xbc\xf0\xed0\x0f-\xe2XE=\x04\x05J0#\xf0\x88\x82,\x8f\x89!\x921@\x18\x03Q\x89\x12\xf7\x81\x908\u007fT\x00\x81\xe0\xf4\x13\xe8 <\x97\xb0OF\xfc\xa9z\u007f$\xe2\x87\xcf\xf9\x81\xd4ܗC\xc2\xf45\xe3\xd0{\x0f<\x82\x8e=d\xa6\xffL\x12\xfa.\x1d\aB\x0fl\xfe\xf6\xc19`iĿI\xb7\xe9}\xf4\xd6\xdd?\xa2\xf9ӟ%\xb9\x9bq\x1c\x14\xdf\xf3\x03\xd89\xfd\x88?\x02\xff\xde\x14\x8d6Enj\x19\x15\xf1\xf9#\xd7\xde\xf3\x10z\xf7\x91Lx\xf6C߀;\xc8\xe8\xd1w\xa3\xb7>\xd8\x04\xe4\xc7#~!\x06\x8a?\u0604~<\x1e!v\x15\x8a\xb3\x14\xf3C\xfa\xdb\xdaq\xff_&`\x8a\xd3f}\f\U000c60adt\x01~5\x82\xa5d&\x10{\x12ZpNM\x84Wd]\x91\xd0i\x91V\\WB\xacQ\xfc\xe2F\x85\x8bID\x04\xf8$\x11\x92\x1c\x8f\x13#N\x0e\x86$\xbe\xb4\xeb5L\xe4\x99\xd2\v\x8f\xb0]q\xcePXT\x15\xe7M\xe6jV\x10\x1b\xd2DI\x1c\x8ah\xfe\x90>\xbcd\xd9]\xc12t\x8d\x8b\x0ex\x959>\xf4\xe6>]\x96\xa6rհ\"\xde0|\xf6f\xafڜ\xa5\n\x96\xd5;\r\xd1۬\x15\xa7n\xfd\xfb-{\xf0w*E\u007fX\x1aP*s\x1bǎ\xebpj9\x8bV\xc38\x1a\xab\xb2j\xc7\ah\xe6J\x99\xd4\x03G\xc4;\xee\xf5\x94H[K\x95·\x9c\xb9\xf1%\xa3';VW9\xb3\xef\xech\xdb\xf4\xbc\x04J\n\xb2\x1b\xaa\x87\a\x06w\xec\xab\x1a\x1eTO\xbe\xafoϢ\xee\x9d\xef1\x97\xa3\xa7\x8c\xe0\x85\x86Ҿ\xeevi\x8e\x15r\x1c\xbde\x1a\x1a/g\xc1\x94\xf7}}?\xf8\x0f\\cS[ڲڧ\xd5\xc6ѭ\xd95\xd7\xef\xbf\xef^\x00s\x8bZ\xf4\xc51\x05\xeb\xf2\x968x\x86\x81<\xefw\xd8L\x96\x82+\x06\xb9\x97\xba\x94J(?\n9ul\xe8\xde\x11^O\xadr\x8eN\xe9\xfdp|b\xe6Z[\xb3\xabz\xb5\x06\x1c\x9d\xdb>3\xf5\x8cN\xa2]\u007f\xc9\xf53\x87L\x1b\xba\x005i\xaa'O\xaa݅\xfa\x9e\xbb$\xa7\f\xa8\xce\xf9\xfb#럍\x8a\v8\xf1\x14\x88\x0e\\\xcc|\xe9Տ,t\x81\xff\x98\x13\x0f\x90\xcd'\x18\nz\xb2\b\x88\xbc\xf0\x05\x89\u007f\x0f\x13\xe3\xc9\"`\xefՀ\xc74,\xad{K}\xef\xc6;\x0e?}͍\xf7\xa8^g\xab\xa2e5r[<4\x05\xfe\xf9\xa8\xfa\x9eL\xfa\x1bLu\x84\xa4\xc7B\xc5\t\xb0Н/\xd18\xe0\x98ԭ\xa9kG\xb3V\x9d$\xdf\xe5ʗ\xe8͒<\xb0\x15\xf0p\xdaX֢c\v\\\xbd?SP{\xdb\xe3\xffz\xf5\xf9\xcf\x1f\xec\xa9mZ\xb5\xachH\x83\xff\xea\v\x13Z\x9ex\xeb\xd5*\xa9R\x0fkj\x18\x8dJZ\xf9\xca;o\xbfR%U\xabYOV\x1d\xa3V\xcb*_\xa6_?M\xa6\xad̺\xc2v\xe1vqR\x15\xa2\xc6c\x1a =8\xc0\xa3\xa30\xd2\x05\x8f\xc3j\x90Y\xec3\x9e\x1d\xe3\x99\b}B\xf0-\xd9Ӎ\xbe\x16\x02\x98a\u007f{\xeb\xc9- \xb9\xe5\xe4VTD\xe28\x11h\xbb{\x84\x00}\x1d\xd2\ne\xbe\xee\xee9\x93$!\x16\xb3\xe5[N\xfe\x1f\xe6\xbe;\xb0\x89#\xfb\u007fg\x8bV\xbd\x17[\x96eɲ$W\xb9Ȓl\x83e٘bl\xc0\x98f\xba馛N\x80\x80\xe8$@BO\x80@\xb8\x10R\b)\xe4\x9b\xde0\xb9KB\n\x1c\xc9A\x0e\x12\x928\xb94\xee\x92\\\xbe\xb9K\x0eli\xf8\xcd\xccJ\xb6l\xb8\xdc}\xef\xfb\xfd\xe3\a\xd6\xee\xec\xec\xec\xec\xcc\xec̛7o\xde\xfb\x89D\x8fNO\x8aŦt\xad^\xaf\xb7'\x89\xe5`\b\x9b\xa6\x97H\xc0T.M\x8fҀF\xc0\x82\f\x15\x98-\x15'\xd9\r\xe8\x9f=I$\x87\a\x80ݨP\xc2Wش\xc8Y0\x19\x1eV3\x16V\"\xe5ར\xb7\xc0\xd8\xd7\xc54h=sF\xdd1\\\xc4U\x0f\x99\t\xa4\xf0l\b\xee\xb0\x00?|\x94U\xa1\xd4'E\x1cX^\x05*\x1f\xfa\xe4Փb\xc6\ah\xa0V\x9c\x04\n\x19|\xfb\x10(\xfb\xeeS1\xbc6\xf0mZ\xde\xf6y\x0e|\x03\x9e\x06^\xd5v\xf8\xe5'\xb9`K\a\x8d\x1a\u0080\xda\v,\a,,\x84/\x82_>\x83_G\xee\x80_\x81\x94?\xfd\xa9\x1f\x98)e\xd1gΌ\xde\xd7\xc0\b\xf2\x12\x82\xff\x8f1\xef(\xd2\xfd;\a\x03\xfa\xd6\t\x8axϯ\xa7\xbf\x06Mϯ\x8f\xfc}\xfd\xf3\xec\xf9\xa7B\x1eh\xf1\x84*\xf3\x98\xc6\xf5\xa7\xc0\xf4\xf6\xaa\r\xaf\xbd\xb6!\xe3\x19\xf0(\xc60\x87zO\x1f\x81ެG\xe3\xedvJJ<{cy\fK1\x98qA|\v\x87\xd8^t\x81\x16\x99@K9\x85\v\x0e#\xc5\xf9\xa9\x80\x8872\x0f\xc1\xdf\xc2\xf4e\xfa\xb3\xa0\xe9|\x03\x98:\xbe?\\\x19}c\xfe\xf8`\v\xed\x87G\x17\xd1\x1a0%S\t\xaf\xc0в\x19\xcc\xefO?\xb1\xf9\xe0\\0\xf0=C}%7\xeb6\x98\nO\x8f\x1eu\x1eL:{g\xe5\x98\x05\xd1\xd3p\xe5\x801`\x1d]\xd6\xd1\x1bL\xa5\xf5K\xc7\xcdX\x0e\x83\xf0c\xa5\xbe\xa8r\xb8\xe9,\xa8\x9dw\xef\x86'c\xb4AL\xb1\xff \xba\xbf\x98\x92\xeb\x04/?d\x87$\a\xe8\xfc\x88\xcd\xf6{mX\xb9\x93\x89\xc73x\xa1\x8b\x18\x19\xc19\x1dO\xbcC\x99\xfc&~\xda\xc1\xf5\xabϜ\xfebϞ/N\x9f\t\xaf\xe2\x0e\xb6\x01\xfa\xea\x81\x03W\x01\r\xff{\xed\xb9C\xab\x1e{\xa3m߾\xb67\x1e[5\xf3\xb6\xa7Ƽs\xe2\xc4O\x81?\xec\xb9\xf7ӧ\x8e,\\\xf5\xfe\x92\xf7\x8f\x9dx\x87]\xde!.\x1d\xbbg\xcf\xd8R\xf6ښY\xb3:\x1e*\xadd\xa2\x83\xb7o\x1f\x1carr\x1ds\xe6\xa43[\xd9{\x0eVE\x86y\x8b\xa6\xcf\xe6\x04>\xfa\x18\x9a\x9b\xc7v\xda[\x8c\xfb\x9fˡo\xba\xee\x02XM@Z!\xb4\xc5\n\xb8+V\xfdx\xbd\x95\x1c\xe0\x97V\xfd4\x1cF\ax\xe5\xd6an\xcbw\x0fud<\xf4\xdd\xea\x99\xd2\xdf,\x98>8\x0fd\xbf\xba7\xb2[\xb9\xf9\xc41\xfa\x13\x83\xd5j\x88:pBZ\x87\x8f\xd1\xef\xf1\x11<\x8e\x8fp\x18\t\xcf\"\xe1}\xe8\xf8\xd0C\xdf}\xf7\xd0\xe27\x8a\xd2\xdd\v~\xd3\xe7\xf9?\xef\x8e\xec\xad*\xb1\u007fLamI\xeaFP$\xd8\xce\b~\xda\f\xc4S\x9b\x9d\xf8jˣ\n)\x1fUJ\x95S\x95T_\xaa\x06\xd1塈2\x8f\xa6\xc6#\xea<\x83\x9aMͧ\x16Q˨\x95\x88BoD\x14z;\xa2\xd1{\xa9\xfd\xd41\xea\"\x1a\x11X\xf4\xe3$G\x9f݀\xad\xd7L=\u007f\x01\x13\x9f\xf8\xc3.\x89\x12\u007f\x00\xe3\x82\xfd\xca\x0f\xdf\xf7\x1a\x02\xff\xe4\xae\t\xeb\xb3\x18\xf8[\xfc\x9cq\x0e\x8b\x80\xdfXi\xbf\xa0\x8e\xe6\xe8ԧ\x03\"\x97\x80\xf5o4y\x03\x1e\x11\x16^\x8b\xa8ȵ\xa8\x98\xbb\xaf\xfd\f\xbd\x97>\xda~f\xa83\xfe\xafB5S\x95\x86~VrnV\r\x99\xa9\x9a\xb9\x1c\xfdn\x8b\x9d#\x95\v\x81~\x110,\x02\xfa\x85\xe4/\x16\xeex\xc1\xb9聞\xf1?\x0e^ԙ\xb13\xbae\xed\v/\xac]\xf7\xfc\xf3\xf0\xb2\xbbwuow\xcb$3\x93\xd6gbj\xa0\xc4\x11\xa8\x1f\x12\xc8\xca4\xa4ר\x107\x9e!\xb1*\xcdFyj\xc0g\x17Q\xed;\xe0\x13\xa0\xa1\x929\x1c\x99\f?\xe22\xdf~\x1b~\xb8hў\x84\xbf\xbb\xd3\xf3\xed\xcatO:\xfe)\xec\x9e\xf4t\x8f=\u007f\x82'݃\u007f\xe3\xf3\xd3=\xec\xfb\x19=\xfe\xc1\x13C\x16u\x8fY4$\xa3[\x9e\xe8\xcf\xf1\xfc:\xa1\xb4\xe0\xf6\x8c,\t\at\x86BoE\xb6Ԙ\x9b\xe6\xc9\xe7\x81LoH\x12\x19Me@\xc5\xc8\x18\x11-5\xe5\xc5\xfd\v,B\xe3o;\xc1{\xc8\uec46\xbd\x95q^̍,f4&\xde\xdfv\xf8p\x1b\x03\x0f\xb7\xdd\u007f\u007f\x1bh\xabȻv)\xaf\xa2\"\x0f<\x99\x1b\xa2\u007f\n\xe5\x82'\xf3*\xc0\x16|\xef0Nز\xe00[\xd2\xfeJnEE.W\x8d\x8f\xbf\xf9\r:\xc6\xf8\xd0LD\xbf.\xa3\xf3\x18D\xbd\xb88\xdc\x11ߵ?O\x04\xcd\x18\x1f\x90\x15\xbcDP\x89\x10I1\xcd\x01\x9f\xb0\xc9\x11We\x17\x1e\xf0s\xfb\x00\xbb烏\x0e\x8f8\xb0ba\xf3\x8c\x85\xcb\xef\x1dv\xe0\xb7\xe7\xef\x9fzi\x04g\xb3\x88\x95\x86\xde\xd3\xe0\xcfk6~\xbe\x19\xa4\x9c[~\xf1\xf0\u038d\x9b\x8e\x8d\x99\xbeq\xedD\xeb\f\x8d>M\xf3\xc7\xfb\xcbf\x97\x17\x89U\x86\xe4^OM8\x05\xd9R\xe6\xc5\xf7\xde\xd8u\xe8\xfd\xc0\xb8\xe5\x1b6.\x1f\x17x~\xff\xa1\x97j\xcb\xd9T\x9dA\x99\xe4k\x9c\xb3\xf8\xc3Mg\x81z\xd4և\x1f\xd9:j崉a\xa7U\xaf\x1d\xac\xbf\xff\xbc3\xd7iP\xe9R\xfa\xd4t\xbc\xe6LU\xc5xY\xec\u007f\x1c\xdb\x12\xe4`\x8c(\xa2\xc2@|R\xa6\x02\xa2*\xd6\v\x10\x90\x11\x8cE\x12Dzgcg\x1d\xf1\xb0@\xfc\n\xa0\x8f\x10'uA\x10`\xe22\x15+\x8b\x97\xe1,vЋ\xa5\x16ć/\tD\xbf\x16t\xc8\x05U\xf2wm\xc9\x1d\xdf\x01\x9eKb\xee\xc5I\"\x94\xd9et\xd2'\xdf\x13\xc4&\xead\x95\x8c\xe5\x01{\xd2\xecb\xba\xe7\x82\x03\xd1D\xc5r\xa6\x15RINf\x05\x9f\x9a$U\x17`\x8c>\xb3\xd2[\xcd2\x01\x14ThӌN\xdeՅk\x8f\xeb-\xe8\xe3\x0f\x13z\x9b*\xaeFO<\xa0\x99\x80\xb1(\x00\xfe\xd3:s\x94\xabX\xb7\x1b\xbdv7b2u\x80\xc2\xd0\xd8Tt\xf7\u007f\\k\xdd.\xe0\xc47\xe0ǻt(\xe7\x1b\x94\x0e\xe7\x97\xfe?\xaf\xbb\xe0GC\xe0߱7N9\xb15C\xb7t\x12\xc6\xee\xd6\xd9%\xb4\xddig\bC\xef\x14\xb6̉g\x0f\x8cS`/\xba@χ\x17\xc0U0>\xda\xef\x8e\xf7`;lc\xa2(\xe6\xd5\xc8\xeb\xf4\xf1\xf7\xe0\x0f\xf4|0\x06\xb6\xc1v0\x1a\x84\x95\xb4:\x12Җi#!5\xad\x04a\xad\x9d\r\xdb\x19*:\x83\xde\x1f\x890,\xf1\xb7\x11\xf9\x86\xdeO\x02 <\x1dR\xda|M\x84\xd2\xebYJ\x93\xaf\xa5)llj*\xc9\u007f\x8f\xe6\xa2\x1a\xea\x1e\xc4\xe9S\x1c\x16\xcb\xf3n\x02E\xfd뇀`\x1c\xfbO\x0f\xce\xc4D\x1a\x06o\x9bk\xbc\xd8ͨ\x01C\x80b\x1f\r\x8c\xa6+\xf5\xbfz%089\x1f\x9efx\x1d\xfa\xc8\xe11Æi\xfd\xdaa\xc3P\xf8\x9f\x1ep\xa2_\xbb?\xac=/!U\xe8\x03\x8d\xdez2,l\x03\x85OZ\xf5\x9a\x0ft\x899\xfd\xea\xeb@\b`\x13\x1f\x88\xfa\x8b\x90\xa1\xee\x9f\xfd~\xe5\xeem\xf8nC\x83N\xd7\x10\x02NPf.\x97\x96\x81\x1cl\x1c\x0e/\x96I\xcb\xcd\xf0M\xf8\xb1\x16\xddl\xf8\xd5LX\xb3\x00\xb9\x19\x1f\u007f\\ܗK\x1fj)E\xd9u\xa8%u*\x00bN \xd3c\xbe \x057\x8e\x12\xec\x80\x1akg1( \x16\f\xa3;\xc7\x1e\x13p{1\xa1\x15\x88-\xc6g1\x16\x11\x90\x16@\x80\\\x8d\xbc\x97\xb72t\xa8\xa9\t7D\xb8\tP4-\x1d\xd9o\x12o\xe1'\xf5\x1b)%z\xba2\xf4\xc7\xc89\x85L\xa35)2<:\xa9B&\x97)\xa4:O\x86¤\xd5\xc8\x14\x9c\x9c\x91\x91T\xe0\x81]\xb7E\xf6ݶK\x92\xea\x19\xea\x1b\xf3\xa1\x91~\xfd\x03M\xdf\f[\xaeuN\xef9\xd6\\[F_\xcd\a\xaf\xf3)\x1f6T\x8c\xceV\x83\xd6p\b\x9bH\x85\xc2t\x11K\x8bu4\xad\x13ӬV\xc2\xf0\x10\xf6\xd56\x11_W\x15\xd3\xca\xd3\xd2ʧU\x14\x0e\xf1;\xe4(+\x94\xa14%ɤfei\x0e\xab^o\xcdH\x93\xb3\xca$S\x8a\x14\xe5\x84\xf2\x93;\xfcC\x98!\x10;\x14\v\v\xfb\x11\xf8竭\x05\x8f\b>\xb1\xe8N\x9f5)D{ʎ!\xfc\x04\fK\xb7\x1d}\xff\x14 \xf8rљ\x8c\x00\xcdy\x18\x98V\xc4\xcbЌ\x80w\x13\xec1\x8cH\xda\x14d\xb0\x00\x9d\x02\x85\x9c\x94e\xa2;\xb5\xc5\xda\xe8\x0eN\r\x16\x18\x1d\\\xbf\xd7D\xe9FC\xbahW\x89\x96vπw\xcf\x17;ty\xb2\xb5\xbf\x139rӹ\xc5p\xf4\f\xd8\x16\\;\xbf>#\xa3~\xfe\xda`\x1b\xa4)\x91\x84a\xa3\x8fh\xb5\xf4\x18Z\x9bb\x00\xc9\xd1iz\xb3Y\x0f\xbejq\x80\x13;\x0f~\xa2\xd1\xd3\\\x16l\xa0\x9fЛS\f\xb0\xe0\xe0\xce+\xd7rjB\x19\x19\xa1\x9a\x9ck\x98\x87\xa3oPl\x98\x8b\x10\xdb\x1a\n\xe8)^\xe3\x8d\xf7\xeaNA]'ޮ\xc6\x03h\xe2}\x96\xd5f\xe0\xbd\"\xf4c\xc3\xf0\xf2\xe5\xb6.\xd0\x18!\xb8\xefok岭\x9fo<\x0e\xb2\x9f\x88PB\x8f\xc3{?L\xeb'\xf0Eԗ\x12\x92\n\xeaD\xac\xfa\t\xa0=\xb8\xe9\xeb]*\xdd.\xf8g\xad\xb0\x9b\x83\x9fJ\xdc\aŶ\x80\xdd}B\x12o\xc8t\xba\x87&\x1b\xc0&\x10\x03\xc2\xf1\ne\xa3\xd4\\\xab\xd9E^\x00\u05ed\x1e{\xf0\xe2\x9f/\x1e\x1c\x8bNK\u07bd\x0f\xac\x86\x1dDX9#^4x\x9dC_\x1b\njK\"\xb8\xf6\xbew\x97\b\xa9\xf1C\xab\xc1j\x92M{\xb8\xab.\x9d\xba(,\xa6\xcd\xe5\x82\xed\x9cր\x9a\xd0\xf0+M\xe8sQD\xe3\fQ\x1c\xac\xb2c\xc5T\x83P\x12^\x14/4\x13\xdcy\x125\xaa\x80\xd8@^+\x04/\xc3\xcb'w\x1e\xab\x10\xe94}\r\xe2\xdc\xd6\xefZsũ\xe5\x1a\x9d\xa8\"\xfa`W%\xd8\xdf\r\x80\u007fy\x18\xb7\xf2\x86\x84GIpC\x12\xe8\xff\xc9\xc3\xc00\xa0\xe9\xa4:E?kݺY\xfa\x14\xf5Ɏ+\tU\"\xfd\x81\xcc5U\xd4@\xbc\xe7\x1cSx\x8fW\x03\x83\xc7\xfd\x8b\xfa\xe1.\xe2\xa70\x11p\xe2\xf1\x1d\xaf\x14Ka\x9b\xf9\xf8\xd7X}\xab\xfa\xed\xfd\xdb:\xb9\x1a\xd8\xde]z\xa5\x91\xba\xb1I\xa9\x8dnN\xf86\xa8\xb3\xa0\xafC\xba̦\x1b\x87߾u\x05Q'\xd2\x1c|\x0f䘔U\xfd\xa0V\xd9є\xf8\xb5\xe8N\xdb\xd2\xd9\x18=\xe4?\xa9\x1b\xfev\x017\xdf\t9l\xe8&m\x8fO\x06\x81N\xa4b\xbf\xad{#p\xff\xba\x11\xd0G^]\x1f/\xd7\xec\t\xb1\x1bSJV\xaf\xbe\xa9\x15\xb1\xec\x87\xc6\xfaN\\\x94*\xa1\x82T-\xd5@vf\x8c\xb4\xe8V\xa4\xc3\xfeO\x88\b\xee!h\xd64Rh\x92t\x8b\xd4L\x11aH\\d\xe2\x05\x1a,\x93Ӏ\"\x14F\xf3'aKDP\xbe\xf6o\xfb\x12(\x06\xa4z\x90\x1b\rp\x9f=\xf7\xd8c\xe7\xce\x02wd7b]Z\x17\xcd8p`\xc6\"2\xb3\xd2\xd7\xefX\xb6\xec\x0e:\xf4\"\xaeŋ\xe4\x06\xf3׃\xf0\x87'\xd4\xddH\xd1\xcd\x04\xe9\x1c\xc8\xd3\x19\x16-2\xe8\xe0\x1f\xa2\xef\xac\as֯\x87{\xe0/\xa5Ǿh{\xb8ThrĐ\xb3\xaa!CT0\x02b\xb4\xa1\xf4\xe1\xb6/\x8e\x95b\xbe\r\xdc\x10\xf1\xb8\xbf\xf5\xa3\xea\xa9\tԜ[\xf59\xc4>\x8b(^\x94\xe1\xf60\x01a\xeatv\xeaav\uf726\u0600\x02ńQ1\x05\x81So4\xa1V\xa3\x02x\xb7\v\xd1E\n\x1b\x16\x92Nl\x05\xa2n=\xad\xae\u0098\x06\u007fz\xfe\x03x\xb4ϒ\xf3\xbb\xebŒ;\xbfؼ\xf4\xe3Ѥ\xff$\xa6\xeb\x95\xfe\xdc.\x12\t)\xf6\x81\x8f\xd0_$\xfc\xe91\x06(\xdf\xf5}\xb2\x195$ӊ\x1a\x10E\xc0\x9fP\x04۔\xd8\xd7&\xfe\x10~\x0eF̩\x1f\x9d\x12\xcd8\xfa\xe9\xb2\xcd\u007fޫ\x12\xc6`(1\xd5\xc0\x89\x92E(\x0e\x1eѻ\x92\xdb\x1f&\x87G\"\xa6T\xeb\a\xa0¹|\x17\xbc\x1e\xe1\x11\x17\x84b,i\x1f\xc0\xd3(\x06\xb5\xa1(\xb6\xaf1\x10\xb5\xe18\xaa\xf9W\xda\x10\xf5\x99\u007f\x8b0\x11w#BS\x92\xbeGX\xbd\x80K\x8d{_g\x9fS\xa3.\x17\xeeф6\xf8\x8fg?{i\xc9֛\xc6\xec\xc1뷛\x92\x81⥶\x97v=\xf1vlTRa\f\x15\x80\xaa\xb3dځ\x03Ӗ\xbcȔ\n\x9d\x8f\\v\x1f\xa7\xa8힁\x91\x94\xf4U\x83U7\x0fV͋ \xfd\x81\x97\x81*5}\xd5$2\x1a\xbf\x89uC0\x1fw\xbf҇A\xebå\x91ή\aC\x0f\x97v\xd3\x1d\xeaE\x90\xe3\x13\xe7L\xbeSY\x92\xef>{\x06\xba4&\xff\xe9\xaf~\xb8MjF\t%ۇt\x9f_\a\x9f\x10\xe2O\\\xfc'\xf3,}\x83%\xf3l)\xf1\xe7h\xa4\fz\x9a%ۺZ\u007f\xc0\xd7\xf5\x91y\x01\xd4I\xa8F\xbc\x9e]݂\x8eՇ\x0e_\x06\xee'\xe0\x87\xc77~\xbeU\x86)\v\xd9\xfc<2N(\xc4;h-\xf8\x8eP\x9fq\u008d\xeb]\xb5aV%\xc1\x17?y\x18\xfey\x97N\xb5\xeb\xebM\a\x81\xf6\t\xb5\xf0َ\x8d\x13\x9ey[\xa7{[\xc8h\xdc1r\xa3#\xdc}\x1eB+:>̮\x8eׅ\xa0\xa0\v\xa5N \x97\"\n\xeb\xf1\tܖ\xd1\xe4\xf5\xc57A\xedq0\xaa\xf8\xb7\xe1\xe7\xeat\xf0#I\x8a$O*}\x11~\x14\xa3\xf1\xff\xa4\x8c\xc0\xf5\xa2T\x9a\x87\x12w\x84\xba\xaaD\xcfE\x15\x86\x1f\t7^\x14\xa8 \x9a\x87\x9e\x00ٝ\xed#D\xbe(\xbc%\xf2\xfdM\xf3*\xf96X>$\xf0\x90\x9d@p\x14^\x11 \x96\xb7\x93\r\xc0\xec\")\tzA\xec\xe3G\xf9\x84\xd6%\fb\xf4>\xa2\x13>\x15\xcfT\xb1^\x12}\xb7\xc7;\x11\x81\r\xb3\x18O\x18\x83\xb7ǘQ\xaa\xb3;c-/\n^\xef\xe4#7w\xf5Vt\x02\ts&\xed\xeb\x8aG'*\x01\x87-#\xc1צ\xc6\x1b\xc0\x8a\xaf\xde\x00Q%\xc4\x00\xc3^M'p\xdcc\x8e\xa2\"\a\xbc\xed-\xebW\xf9\xd5+*\x16m9z\xe6LԎ\xe3\xb8p\x91\xa3\xfd\xb8\xa3\x88\x1e\xf6힒\x12\xf0{ɑ]\x8f}\x1b}\x1c\xdd\x18\xe9(\xa2b\xef\xe20}\xab\xc3;ax]\xc0\x1a\x89\xd3\xd1t\x97[)\xc2\xc6Q\xe8\xa5\xda@\x97\xd8]\xd0\x05g\x89Д\x00\x9b\v\xbb\xb6\x1e\xa6vÉ7g\x1c\x06\xea㮆\xa5'fToJ\x95fȬ\xc6\xec\"\xa7R\xa2\xca\x19\xc3ۚ\xeb˫\x1bDŽ\x02\x13*\nS\x14\x1f?u\x06\xfe=95\xd9j\xa4U\xde!9F\xe6\xb19\xa7\xeej.\xde\b\x8f4\xbdp|\xed\xa0P\x89{wΔ\x9c\x86\x9a\"Nz(m\xdcW`\x8c\xb5\xb2yخ\xa1\xc1\xaa\xf6`Ű\xa2\x91\xcdKf\xe6?~\x1aF\xdf\xcam(ȑX\xc60\xaa\x86\xd9s\xe3r\xe9\x15\xa8\xed6\xa1\xf5D\x10#\x96P\x022\t\xd1='\xeb\xec\x80\xe0\x8e\xccH\xb4\x11\x01\xa9\x10\xc1\x19B\x11L\"\xce-\x1f0j\xe30d\x18\xefNG\x94\x8f\x98\xf7̏r\xb4F=/\xbft\xe3\xe4\x1du\x03\x00\xd3?\xc9\"J\xe2u*\xb1\xb8\xa8/\x97^]2Q.U\xb5\xac\xb9\xfa\xc8ԩ\x8f\\\x85\xe8\xb4|\xc8O\x87\x11Y\a\xa6w\x96/\u007f\a^\xdd\xff\xdb\xe3p\xe2\x969\xcbߡ\x8b\x1a%\x9cԞ\xe3\xf6\x05\xf3v\xb5\xcc\x1e%\x1e\xdb\xc7\xc8(\f\xfa-\xbc\xa1FʋkB\xbe\x02\x1e\x0e\x89e\x82Nk\xde=vuP37\x1dg\x02\xcf\xc1\xab\xef,\x9f\xb0\t\xec}\xfa\x0f\xfbQ\xceįK\f\u007fL\xc0\v\xd2\x11\x19\xb1\x1b\xb5\x02Z\xb1\x04\xec>\xbb\x06\xfd:M\x95\x12\xc2\xdaN\x9c\x11⏆\xfc\xb0\x8a/\x85\u007f\"[I}II}{R\u0085\xf0w\xefu\n\xebR\xe3_\x98\x80\xd2\xdcKn\xb0\xb6x\x88\x16RFmX`HS]\xc7\xce}G\x82ŝ\x83-g(\x9bK\x8dq\x05A\x8c\x85M\xd0\"\x89\xcf\x03\xf6\xb8\xf6\bqpn\x88\v\x938o|\x05\x835R\xb1g\xbc\x89\xf0\xf5\xcf1:?\x1d\x02M\n\x9dN\x01\x8f\xe8\x14\xad\n\x1d<\x82/@\x13\xb9\x88\xda\xea\x8a\x01U=\x03\x8b\x86x\x83\xcd\xdfoZ\xb9N?䞧\xef\x19\xa2\xd7m\x18\xf1Yq\x1d\x1d\x8e\x01\xfc\xc3\xfbo~Z\xc87\xdaZ\\\xf7Cѝ\xb7\xf9\xa6-\x99:\xb1O\xa6\xa6\x1c\xfd\xd34\xd5\x15\xc7u\xa2\xf9\u007f\x90\xfay\xa9\x91\t\xf5\xc3=Q\x05\x04\xb4\f\x01\v\xd0W\\A\x86\x18F[%2\x1d|\xc4\xfd\x95\xe3\t\xdcBbE\x8d6RM\xc2|u\xd5\xf3\xd9\xeb\x12\xc9\x16\x89B)\xb9~]\xa2T\xa0 \x0e\xf4\x88\x89\x1a\x9eu:\x87\x19L\xdd*|\x00\f<\xa0\xd7YR-fgg}\xa3\x9f\xfd\xf3L\xbab\x9eu\xfa}\xceaLW\xe5W\xacЈR\xbd\x951a\x80%\x17O0\x96<\xac;\x03\xc3,\x05\xbcA\x06[w\x99\x04\x91*\xe0\rX\v\x15\x95\x18'\xf2\x06\x81\x95\xdc!(\xa8\x0e=\xef\x17\xdei\xc0\xa8}\xa8\x80&?\xd0\xe3#\xae\x19^$\t^\x14\xd12)\xddm4\x15\xa1\xdasD\xd1\xc2E|g\x99P\xc3\x14b\xbb2\xfcD\x00q\x1e>\x91\x89\xb4\x93\x15\xcbn\x03.*\xe6?\xc1W̸x\x9f\xc8(Ļ8\xf4s\xfbD\x0e\xc1\x8d\x89SD<\\\xa3\xf4\"\x1e\x15\x805\xf93Ps\x14\aA90\x907\x13\xcc@\xb7R\xec\x10\xb9\x95\fF\xc3q\v1x\xc1od\xfc\x18YХ\x04&\xe1\xf3\x10\x85]\xfc\x14b\x12\x8c\x04nʁ\xcadb\x89\x8bz\x11y\xc6a(r\xe2j\xf1~\x9f\x00\x97\x87}@\xa2\xac8\xbf\x80\r\xab\x17\x8a\t>\x15\xbb\xb4\xc9>\x1a4\xa4\xa0J\x15\xf3.]\xb2\x0f\xd0\xc3R\x8c\xc6RŨ\xf4\xbc\x81\x9b\v2\xf3\xdb\x17*F\nA\x0f\xfd6\xc8r\xa4\xa4\xfb]\xc5\x16\xaeeH}KK۔\xbf\xadJ\x99\u007f\xfbҡ\xf4Ob\x1d\x0fƆ\xfd\x05\x8d\xc6\xe8\xd0\xe8\xefL\xa3\nG\xbe\fhN'\x16%+Sx\x89̒jU\x98,\x0e\xb3V/\xe3}\x8d2\x89D5\x98NwY8\x85G\xc9\xd0\xd2,\xa9Je\xaa\x06\xc1\x05\x16\x9bA\xac\x1eh*c\x18\x9a幔\u0082\xa2\xcc\x15\xf9\xe5\xd3wޡ\xcf.\xb6\a\xe5\xf40\xe0\x9b\xdc{D\x06\xe0x\x96\xa6\x01Sf\xaaѢ\x89\xc32\xbfw\xff$\xa5F\x96-\x01\xac:W\xc1Y\\\xe9\xf4\x10\xa5D,o\xf4Iy\xa0ך\x1d\x16\x93\xd2nN\x91I\xc5\x16\x85\t\xfe,i\xb0\xb2)\x16\xbdm\xb0#Y\xd1Ǫ\xe0\x98\x12\xafj\xa0U\x99-3\x18\xd5\xd6\xeb\xafY\x1b$v\x9d%%3\xb5Z\x91\xecp\xaa\xbc\x01V\U00092c97.#\xcfcNf.\x8b5\f\xa3\xd0d\xe6\x82$\xd8\xf6\xedC\x0f}\xfb\x90\u007f\xe6,\xc0KSצIX\x0e\xfe$fX\xfa\x02͊D\xb2\xf4M\xf0^uV\xa9J\xcb0R\xae\xef\xeb\x8cs\x030=t\x02\x18\x0e\xda\x19@k\xaaT\xe6\x12o\x1a\xc7\xf2RZ$\xe1\xe5b\xb5X\xc7\xce*e\xe5V\xb5E\xc4\xfcW\x12\xed\xcfϕ\x8b5\x92\xb2T0\x94\xd1T\xbb\xb3nk\xe4\x1c\xeb\xfcޑ\n\x13\xfb\xdb7&\x1f\x9b$2\xd1i\x12y\xaeT\ahF7\x82\xd6\xd3\xd3\xe0\x13u\xf5bqe\xe8\xfcy\x00\xd8#l\x92R\a\x18\x95*[)I\xa3\xd5\xf2\xf7\xfe\xebM\xba\x89k\\\x9e\xed\xea\xaba\xa4#\xbd\xfeu[\xd5N^\x92\xac3Vq\xacא\x10nL\xa9\x94(\x1cv\xcf\\\x8e\x1b\x91\x9e\x10f\xabT\xe2\xbc\x14GQ\x8eI7p\xe6\xcc=3?\x9a\x9bקw\x8d(sn\xfb\x15Y\x9aIS\xb2\xa0\x1fM\xe7g''g\x15\xd0\xcc\xc1aFm\x9aL*1\xa6\xa6J\xa4J\xbd2U,\xb7\xa0O\xa6\xaa\xa1\xa5}}\xae\x9c\xa0]\xe3\x94&k9-\xc3\x02\x0e\xc8D\x99\x8c\x88\xa5\xedi\x19-%\xab}jS*0\xab\x93\x94\x8c\x92\xf6XX\xad\xa7\xccW\xa3\x10\xab\x14b%\xb3\x1a\xfec\xf8\x9dR\x1d\xa3LR)\x95\x96$M\xf1\xea\xd2\x16\x87\xcdNK\xe9,N\x8e\xf2\xe1\x18\x94c\x92إ\xb1Udf\xf9\xfaI\xe8\xc2$\x15\xeaD\x16\xb9Ģ\xd6*$R\x8b\xd5 f\x9eLM\xb6Mu\xaeLձK\xb37\x96)lJeh\x9aZ%\x05\x8bV1՛\n\xa7ڒS\xb5\xac.u\xe5\xd64e\xd9\xc6l\x91J=\xb5RS\xb9j>\x8b\xdar\xf4l\xc6\xedڮ\xd3\xf2b\xfd\xfa\xde4\xbd\xfe\xd8\xe2%ǎ-Y\f]\xa8#\xa6,E\x83J\xc6\f\xe8\xf3\x12\xdb؈\x9a]?\xbc\x81S\xd1gz-K\x16\x8b\xb4\xea=\xa9\xf4:\x93b\xfb\x9b\x81\xc2\xd7\xf7+\f4\x83A|h\x1e\x8c\xc9FCR\xac(\xe4\xc4\"\x0e\xbb\xb6\x04\x12\xbdF'ch\xa0)\xad\x90\x88=\nEj\x06j\x96\xe8\x06\xa5\xba\xffR\x99\xdc7\xdb\ufae7\xe9\xdeW*J\x16\x94\x17o\x99\xc4J\x80\x88\xd6\xeaL2\x85lX\x9f\xf4\xb3\x06\xc3\xeeB\x87\x91a\f\x96\xdea\x90\xef\xafr\xd9\xc1\xa0:\xd4\u007f\x92\xf4Z\x96cůM\xe8\xb5\xcd?\xdb'\x97-\xeb\xa7V\x16\xa2\xe2\xd7\v\x83\xef\xf5x\xdb\xefn\x81\v\x1d\x1d\xac\x86\xf8]m\xeaP\xad\xcfQ\xa6Y\x88\xe5\x05\v5e\x0e\x1fS\xdb\xc30\x1b\xfe \x88\xd3Ư_?^\b\xed:w.r\x17MP\x11\tToܞL\"\xe0ʛ\b_\x87\xd7b^\x8d\xa3GS\xf8\b7e\xe8\xa9ZUd\xe4\xc3\xd7\xc3\nl\x06\x8cX\xa5\xd1\xdb\xd1\xd1\xe6\x16\xd9\x1d>\xafͧAGM1\t\x9b\xfc\xe8\x0e\x13\x82\xad\xe10\b\x85B\xf0ǖ\x16\xf8c(\x04B\xe10lEguK\vP\x87\xb8p\x1bl\nG\xdb\xda»v\x85\xdbh[\x18\x1c!A\xa19\xe3v\rqo\x0f9\x04\xf5\xa2\x17\x91\x9cb\\\x18\xa2\x88\xa4\xc1#\x15\x9d}v\xce@\x9c0\xfb4>\x87\xc1\x89\nB4ZQ)\x89?ݘ\xc1:>\x13\xfbu\x83\x18\x8dX\x18\xee\xa0 vn\x1b\xe6(\x80\xb1z\xb1HE\x84~\x1d\xc2\x19\xa2\xd8\bJń\xb1s\xd4(\xea\xc17Pz\xec\vXx\x8a\xa5@\xdc?n;\x16\xfa\xa3\b\xc1\xe7\x03\x0eE)҃\xc24\xeeE\xf8\x01J\xc0\xceA\x15CuJ\xeb\x94\x11yc>,Fu\xafU\xf7\xbai\x1c\xf1\x1a\x82\xc4Z:\f^\xa7\xbd\xab\xaa\xd8{\xb0\x1d\xfdP?\xf3\xd9cY\xa1ոOB\xea\x8ak\x82\xfe\x84\xa23Xt\x845\x9eP\xad\xa3T\xb8\x1dEr\xe8ׁn\xa0*\b~)pD\xfc\x11\x86\xc0\x18\v\xcf\xe2\x1fM\xce0\xe6\x1c\x98\x1c;bMA\x93폨p\a\xb5[인\x01\xbaւ\x1a\x8c\xef\t4\x89\xa3\x03]\x88Lv\xdcky\x96\x8a4a\x00\x14.\x94YB\\\x14\x83\xdbUE/\x145\x00\x1bl\x12bK2#M%\x03\x1aP\xa4\x8aJ\xb4\xb5\x11\x11\xbf\xca\x14v\x02W\x01\xfcθ\xf4\x03\xd3n\xecp\xb1\x9b\xa5\xd0\xf2k\xa9\xf2\x17\xe5\xf0'`\xeb@\x1d\xbb\x04\x9cɴ\xbc`iʌP\xf1W\x03\xea\x9a\x14\xa58Ġ\x0e\x01l\x99%\xcc\x11t\xaf\t%ʌ\x15\x02\xf7SQ\x02~V\x12\xfa\xa6\x95\xd4pj*\xb1\xba\xec\x04$\xf4w\x86\x8d^#G\x9c\xa5\xa01i\xc0\xe0\x106\xa7\x0f\xe3}\x17\x93\xf5\"vw\xe5\"\x96\xcc\x01b\xba\xe6\x13\xeb\xfezrMZښ\x93\u007f]\xd7].\x8c\xcb\xde\xeb?+;\x83z\xbb\x03\x8d\x83\u007f\xa7\xe8#\x98\x91#J\xfd\xcf\xcf\xf8z\xc6\xf3\xfe\u007f\xbf\xe4\xe7\x9e~:\xa2\xdc\xfevv\xf6\xdbۻ\xf7\xa7\xfe\xff\xbb\xfe$\xe2\xed\xae\xff\xac3\xdd1\x9b~e\xf6\x1d\xff\xbb\x8e\xe4ݹ\xd3+t\xa1\x84\uf822J\xb1G;\xae\aI\t\x04\xc5\x01\x8f\xd8mW\x8ay\xabؤ\xebq\x97k\xeb*\xf9dƜ^VX_<:7''wtq}aY\xba\x99a#\xb7\x8a\x9d\xdc\xf5TH\xab\f\xe33:\x84\x02\xcd#\x1bC\xb5y\x95V\x8b\xc5Z\x99W\x1bj\x1c\xd9\x1c\xb8U\x1c֕\x89?\x94\xa0;A\xa1Y|\x16\xfa.d\xb77\xe6R]\xe3\x16\x02\xa8\xd4&\xbcODh<*z@\xe7\x8f\x01\x8e\ti݉Aw\x11\xf1\x05N\x0e\xe8A\x02\xd2%L\n@\xa8v\x91I0\xe3c\xd0\xe2\xc8\x16*\xf0T\x91\x83\x03\xf8\xdd.3\x8d\x96\xc5\xd29R\x12[\xe4VJЩ\xb2\x88\x13\x0f\xaf,\xad\xea՜\x9eb\x9b\xbaM1W\xd4R\x1f\r\x0f\x9f\x03߫\xdb>EƉ\xb6N,\xf6\f`õ\xbe\xf0\xf8\x82>U\x1e8\xccz\x02\x9f\xdb\xf2\x1d\xf0\x92\xbb\x02/{\x93\xb32\xc03\x19Y\xbf\xe0h\xdb확b\xba\xca\x13^\xe1\x1dāpQ\xba\xbf\x90\xbf{\xea/\xdeRX\x97\x94_߲d8Ȭ\x99\xde6e;\x98\xb8\xceзk\xaf\xa7\t}\xe3B\n\x03r\xe1fq\b\xb6 \xc9 \x0e\xc2\bHˠf\xf1ŬD\x1c\t\xe7ζ\xf0\xe3%\x12\xcf\b,\x99\x1bĬ\xfe\x84m\n?sx\\\x95\xadj\\\xd5\x01W\xc8W\x8bUqC\xf4S\xe9~\xbe\x8e\xab\x12\xe2m\xcflY\x94\xa63M\xd9>\xf3\x1eq\x9d\xf2\xf6\xa1\xd1\xfa\xdes3`ػo\xd6\xe0\xa2\xedSL\xba4.\\剶\xd0jl\x1e\x1a\xfd\xf1\x06u\xd6[\xeb\xcbI\x87\x9477\x1d쵥\x80\x9f\x88\xdd\xe8\x8f\xf1\x04\xf4\x0e\xcf\xeb\xfd\xcb\xd9\xedS4\xa2m3\xa123\a\xce\x19\xd2\x1cȧ\xa9ꑳ\xf6\xa5\x83\xa7\xa7lg\xcb\xe3\xfb@\x82\x0e\xb0\v͢\x03\xa9\xc9؏1\x87\xd7W\x82\x98%`\x17T\xc6;\x91\xa6\xb9\x98\xba\x12ω\x18\xcc\u007f\n\xf0ExC\x86t\x19\x9e#\x18\xbd8*\b\x18g\x1c\x96\x9a3\xc40G\x02x{\x92!w\x05\x1b\u007f>滢\x1cx\x89i$\x16\xf4pl\xe1ɣ\x15\xa6`\r\a;f\xed\xdb7kA\xee\xc0\xb1\xfbfy\xf2\xe8\xc5h\x00\xef\x9b3\x12>>\xee\xee\x83G\xad\x19U\x1e\xb3\x1e4\x14V\x80\x10\x0e\xc1O-\xda\x1c\xb5\xba\xa2H\xaf\x05M\u058co\xa3K\x93\x8c\xbe\xda<'\xad\x8c\x92\x15)m\xba\xea\x99?\xa7\xa1\x06\f\xcb\xf1\xa3%\xe8{[2p\xbb\x97\x16\xf7\xf5\xb8\xe0;\xe1\xed\x85>κ\xa4\xafK\xba\xef\xc2>\x8de}\xfd\xac}\x9a\xbf\xee\x9b\x15\x9dڸ\xd50\xc2D\xbf\xd5\u007f\xa02`\xf7TI\x0fH\xeb\x8bnP(\xb0A!6\x1b\x9cƢ\x90\xe4\x882\xc0h\xae\x89k}\x99U\xca3\xa1\xdaY\xb5\xb3ެș\x1e\xa1t#d}s\xe9\xfb|\xb5\xab\xed\x85\xf0\x92'\xd8\xcfs\xfe|\xbf\\\xf1P_\xf6\x00\xcd\xf6ξGփ\x19\x04\x1f\x0f\xf5$\xd0\xe9į\x1c8;\x99\x15\xfc\x11\xdcB\x18h\x8aQ\xd7\",\x17Ƙ\xc5\xe0\x86\x06{\f5\xc9k'Z\x15\xb1U\x01\x1eָߚ8\x8c\xce\x1c\x13~\xad)\x9f\x97A\xf7^\xdaR\x0f\xc3\xf5-\xf0\x8b\xe8\xa7\xf5-\x8f.\x03\x0ffG\x1b\xa6\xee\x16W\xb6ԋZ\xc7G\u007f\xeb\x0eE*\xcd.F\xad\x91zӘP\xa4\x15\x85\xc5\x03\xf2\xe8\xf0\xd8\xcc\x12.$-J\x83}\xab&\xa0\xb1\\\xa8V\x80\xf2\xa4T\xacTnv\x89\xa8\x92\xc2\xc8\xdf\xee?\x03\x0fa\x8f/'\xefn\xa9\xb7-{4\xbcyʐ\x19\xb6\xfa\x96\xeb\xad`ʡ5\x8c\xa2\xd8e\xb69<\xfa4\x97\xcde\xceU斕d\xaaT\xad\xa9\xce\tU6\xb3\x8b?\xac\xf0\xa4\xbcA\x04X\x02&\x1e\xe6튨Řf\xa15?\x1aM\xe4\xe0\x8fA\xbc\xa5\x80\x18\xd4\x1b6\xa8eb\x90$\xd8d\xc9\xc1`\xedt\a\x13\a\x93\xd2%\x04Q\x83\xe9p3\x15\x05\x80`\xa8\xc7s\xbeb3\b\xc4\xc1N\x18\x87\x0e\a\xc1\xbb\x83n\xd3MSp\x8b\xf9U\xe35\xebG\r[\xa7\x1f6C\xbfn\xd8\xe8\x8d\xcaq\xcb\xf9\x95Ҁ\xb1 \xbd0y\xe6\xbe\xd2\"\xc8U\x8f(t\x95K\x1e\\\xb3SR\xee*\b1\x1b\xccS$AW~\x15\xb3\x98g\xc5S\xc5\xc5v\xfa\xb9\xect\xd0QR[\x8c\x86\xea\xd9\xd0\x00\x86\r\xe5\xbb\xcb%\x8b\xcd\xfb\x98\x8a\x1b\xd4\xc4Z\xb0\xb3ԛg\x04\x9f\xa4X\xc7o\x91\x8e\x983c(|\x10\x9c\x18:c\xd1(\xe9\x9d\xe3\x93\x1c\x90\xe2s\xd4V\x99l\xcf\xcc`\x8b\vn\xf0\x8a\xc2\x05\xae\xe8Hz\x8c\xab\xa0*_\xa5\x88~\x02\xeeuz\xabP5\xa0\xf8\xacX\"\xd6ݫ\x17\xbf~P\xab\x14\xf4\xa0]\xe1\xe0\x88\xc9#jDy\xf0\x02\xfc\xf1\x8d%K\xde\x00j\x90\v\xd4$\xf4\xd1-v!\x98\xcaF\xbb\x16~3\xf02ܪQ\xaa5`.|\x00\xe7\x83ap\x92\xd2\xee\x9b>nw\x86\x94\xf1/y\x03\xfe\xd8#?X\xdb##\x14J\xacw\x1e\xa25\xc4\xd3\x15(\n\xf8\xf3\xb1\x91\x1f\x9a\xa0\xb8Nx\xa34슩\x02q\x87\x1eV\xe0\x15\xec\xff^\xb2\x9b\x9a\xa6\xc7\xfe\x11=~\u007f\xb3R\x96'Ҫe,\xabҧX\x9d\xba\xba\xc9M\x03\x9d}\xd5j\x99J-\xf6)T\x8c:\xd7א\xb7\xe7w\xaf3r\x94T\x9a'\xd6\xfc\x8b\xa4\xbb\xdfx\xdd}scF\x1f\xbcy\xf3\b\xe47k\xb5\r\n\x96V0\xac\\\xa5\x94\xf3S\a\xd5M\xb1(\x952@\xcb\a\xebu\xac:-Y\u007fzǮS8\x95\x92\xf9W\xa9\xd8\xc2[4;0\xdc\xe2\x1b\xe2q\x14\xba\xd1Ʒr6\xa2SBIX\x13\uf580\x80\x84q\aL\x12\xc0\xa3\xfft\x1b&t\xd1&\xfa\xc8#M\x03\xa0\r\xb4\x9d\x86\x9f\xd1G\xe8#\xd1&t\rڠ\xed4\xb07\xc10݆\x85\x9c\xf8\x06I\x86\xa3\xd3p\xa2X2\xfc\xd8\xe7M Lu\x93\x1b\xe1w\xba\x11\xe9Do2\xf1\x12`\n\xb8%\\\xc0\x1d\x90\x007߳\xeb\xd2g\x81\n^mlm\x82W\x81)s\xd4\x1aX\xc6\xe4\x827a\x19\xfco`B\xb1\xc0\x04\xaff\x8eb\xeanQ\xc9\xe7\xb01J\xe3)\x94\x04?\x18F\x8fT\x817ѣ\xff\x8d\xb2;\x85\xb2C\x0f6\x82\xeb\xb7\xe8\x94XV}EBq\x19\xa8\x9c:\xca\x12\xf3\xb2ٗ\x1a\x86zh\xb8\xbbW\x80\xf8\xae*\x17S/\xf3\x13'\xc2\xc4W\nI\x85\xa9~F,\xe4\x15\xd4앀\x00\xb0\x01\f\xcdUd\xa5\r\xc5A:\xaeɫ\xb3+\x89z:\x96\x06b\x8d\x0e\xb44'\xf0Ŵ\x8f\xa8\xcd؉\xf3szk\xc0\xe5\x0e\x04ܮ\x00\xbb.08\x10\x18\x1cq/8\xb2\x00\xfd\xb1k\x17\xd4\x0fY\xb8\xe0H\xa4\xef\xd1E\x8b\x8f>\xf8\xf5Qv\xdd\xd1ŋ\x8e\xa2\x8b\xc8g\xf0\xbfO\xdd~aժ\v\xb7\x9fb\x1e\x83\xf0\x03x\x1a.\xb9\xb0\u007f쨽\xe7\xe8\xa1\xf0'\xb8\x0e\xbbT\x00\xabY\xb0&7(\x99w\x00^;\xb8\xf1\xdb\xfa\xfc\x06\xd9\b[\xfdՍ\a\xe1\xb5\x03\xf3$\xc1\\0w/\xb8\xef\x8b6p'\x9d\"\xbc>@\xe3\xb7\xfb'\xe0w.X\x00H\x19Zɋ\x8f\x02\xf4\xfb\xfa(\xcc\x04\xab\x81j\xd5\xc5\xf6\x8b\xabX\xd9\xfcyc\x0f\\X\xb2\xe8\xfd{'Dy\x1c\x8d>\x03z-\xcbz\xd7x\xefy\xe9>xm\u007f˔\x92\x95\xc6ۜS\x16\xec\a\xe2\xfb^\xba\a\xc5O]Ђ\xfa\xcc\xf4\x1b\x14{\x80\xd0E\x1d\xd6\x17&`\x8d\xe8`\xd0w)\xe7\x00+\xc0\x1e\xc9ySL\xf9\x1d\xad>c\xca\xe5\x01\xacu\xe4a\x04=$+\x8bh)V,\xb2\x02\xa67\xdc\x02\u007f\x01R\xb0\x1cH\xe1\xbe\x17֯\u007fa=\xc8U\xb0\x8a\xcc<\xf7\xa235@f\xb5\xca\xd3F\xa6\xf59\x03\u007fN\x1b\x89\x82i@6\xe0݅\xee\xbcL\x94D\x9aQ\x10\xb2s\xfa\xaa\x01-\xa5c\x1fr\xba졂\fz\t\x90\xbe\xfc\n\xca\xe9\x97W^\x06\a\u05cf\x1f\xb7~\xfd\xb8\xf1чS\xf22\xb2\xec\xc95\x86\x01$\x17\x85\xd5Z}\x06\xfe݊\x02#q~\x86\x9ad{VF^\x8aުԚY\xa5\xc3l\xf4&'\x9b\xb5Jk\x02~\x18O\xf9\xa9 \xd1V\x8d\xef\xda{\x80\x88W\xd2\xe9\xae|\x12\u009aG&\xac$\x84\x9dd\xa1\x19\x15]\xa2\xa3\xbf8\x9f\xc6\xfc/\xadv\xd9Dj\xa3\xed&\xf1\xf1\xfd\xe37\x8c\x1f\xbf\x01x\xa5\x19\xbdҤ\xaeU떦\xa4\xa4\xf5ʐ\x1a3\xfb\f\xbb\xdb{W\xa1\xd1(1\x96\x1bO-\x1c\x84\x8e\x12\xa3\xf1T\xf1\xf6\xe1}2\xfb\xbf\x06\xff\xfe\xdak@N\xafH\x84:e \xcei|\xf4\x17}\x12\x97,N\xca\xcc\xd0j\x93\xb9$}^\xaf\\\x9f\xb2\xf8\xae\x82X\x06\x8b\xea\x84,_+V\xfar{\x01-\x90\xbf\x86s\x03\xdfv\xc77\x15d\x10/\xa0zk\x05\xbfux\x91C4\xa1\x119\x889/\xef\xe4\xc8%\xa0\x93\x15\x15\xa5V\x8e\xd9\xf2\x15<\xfd\xe4S\xf0\xf4\xd7[ƅ\xe8\xd3\xf9\x0e\xb0\xc7ٷ\x10\xad\xfd_\x85\xaf:<\x85}3\xc0^;\x17\x1e[\x19\xbd\xfe\x14l\xfdz\xf3\xe6\xafA\xe8)\x9a\x0f\x8d\xeb\xb8d\xc7\x00\x8b\x85}\xed\xf0\x1d\xe0\xb7\xf7-\xf4\xa6\xc3U\xf6\x98\x8e\xfa\xbd\x88\x06\xcc\xc0}\x8e\x03\xd8\xd4\xc6\xe5sQ\x18\x10\xba\xd8\xe5\xb3\x1b\x94\xb4\xc9H\x99\xb0\x92:\x8dz\x9b\x8f3\b\n\\D\xbd\xce_\xec+B\xab\x0e\x14\xc53F\xad\txh\x94\x00\u007f&\x8a\xe7>\x84\x97\x93\xe1ϕ\xc0\xd7\x00\x8f\x8d4\x8c]\x9c\v\xe8\xfe\xee\xa1\xc5j3\xb8=/\xed#\xa3\xee\xc3T\xd7Q\x1a\xf4\xeec\xb0ϱͫH\xaa\x9e\bB\x17w\xeb\x82\v\xed\x17\x15_\xf1\xe0Ee\xff^f\xf0\x1e\x00[\x83џ\xec3\xe8\xe7\v\xa376\x02\x00N3\xfaw\x8a\x16\x8d\xe4\\\xe2\"\xdaR\xe6\xe8\x15\xd91\xb5\x1c\x1c\xccv\x83/}}\xe9\"\x90O{<\xfd\xfeZ\xfd\xe1\xde@!\xcdg\x88\x00(\xa4\x83E\xb0\x9f=\n5\xccuW\xa1\x12 \xaa\x92\xcbn\xef\b\xd5&\xe0iK\xa9$j!\xe2jw%P<\xbc\xf2T\xb2<\b\xb2N=\x8f\xb1\xb1Q\xfb\xa3Z\x92UA\x1a\xd9nŀ8\x042\x1b\xd1+\xb2^Ra>?\x801\t\xd1E>\xf1\xec\x879\xdd|\xb2.\x10\x11\xf7mV\xec\x0f\x18\r\xe5\n40\x05\r\x8f\xc4\x19\xbb\xdbl\xc0\x84\x97\xe0K\xf0҇k\xd6|\b2A?\x90\xf9\xe1g\xb7\x98`\xe8\xf5f\x17.\x8e}\x18\xddW\xe7\x1e\aF\xb5\\\xa4\x93\xcb[\x0eXQ:\xaeJ1\xb7D\xa2\b\xd5~\xbaNN\xe3*(\x06|C^\xbe&\xb1@\xf4\xda\u007f\xc6G\x81\xd8\xdcj\xa4\xd21:\x0e\xc0;kN\x17\xfa\\\xfe\f\t0\xb2\x01ƅf\x12\xb5Ө\xa5\x11\xc5p\x02?\xed\xce\xc0\xf8$\x88\xb00\xb7\xff\xf8\x87o\x97G\xcdG\xe0߽\xf0\xbb0\x98\x87\x16\x8dC\a\x00は/\xc0\x87\xde\x12\xfd\xae\x8c\x99z\xee\xee\xaf\xe1\xdf\xc1\xdeF\xd94X\xd2~\xf2d\xfbI\x11E\xaf\xd8\xf4\x83[\xf2\xf0.\xf0\xc8\xfd\x8f\xc39љw\xefI\x85\xe5\xf6\xeb`\xcd\x15 \v샧\xe0'\xd1a\x1b\x95\xf4\xfc\xf5\xa0b\xa9\xe8$~\b\x8f+\x1a\xf7/\xeem\xb2\x9b`\xa3\xdc.\x1a-\xac\x99 \x16Q\x04\xf0\x18b\x88\xce'͛\xdc\"+6\x04\xc2X\x1bJ\x16̓n+\xc0fA\x1e\x1c0\xa1\xb2\xb3\x94\xceH+\x01\xcbl\x86_\xc1\xbesʴ\xfd\xee\x9d!\x93-Td\u007f\xbfؿ\x9eO\xae\xf5\x8e\x10\xabdɜiL\x89j\xab\xd6\xe0\xad\xcf\xf2N\xa8q\x96\x97J\xd0\xf2ɘe\xee\xfd\xe8\xed\x03O\x1e\xd9;;%G\xdc'o\xd4\xd4\x14\xd5\xce;\x00\"),=\xe2\x81K\xf0\xea\r\n\xe4][\x0f\x86\x83\xbe g<\xfcF\xc9h\x86.\xa4\xf3~\xdf[\x8c\x18?\xc0\ru\xf0\xa6\x02\xe9\xab}r\x06\x95\xa4\xf0\x12\xaf\x9bf\xcb2h^\xab\x103\x13\x87\xca\xcas\xd2j\xa6\xfbƾ\xfb\x84\xcb5\xac\xffq0f\xfe 8\x1b\xbe\xb1\xe6\x06u\xe5Ĕ\xb8,'\x86\xe3\x1f\x10\xfc5\xb2D\xc5\x15k\u007f\xa2\xf9)@\f?\\\x98\xe0a\xd8\xd9^\xe8\xbb\x01=M\xa0\x14\xfcZ_1\xed&\xbe\x15\xb5\xdc\xc5c\xaf\x1f\x84\xdfM\xaf\x1dͲ\xa3k\xa7\x03\xfd\xc1\u05cf\xdd\x06\xcf>\x9a\xaa|\x12\xfe\xee\xcbM\xb8o<\xc7<\x02\n\xc1\x83\a\xb64/\xbdc遷\xde<\xb0l\xf3\xb2ٛ\xef\xe1,\xf3v\xad\x19߾={{\xfb\xf85\xbb\xe6\xcdY\x0e\xc4{~\x00\xd5'\x9f\xc3=\t,\x8b\\k\x85\x8f\xad\xae\x18^\x02&\u007f\xf9'0\xb9tX\xe5\xed\xf0Dl}\xa2F\xdf\xedG*\x87\xf2Q\x15T?\xe2\xef\xc6.\xacZ\x11ۂK\x8d\n\x89u-\x02Z\xa7\x88\xd1Rhu\x82\x81\xcc0\f\x8e\x91!$\x1b\u007f7@d~X\xc1\x15\xd8ɢ\x16\x11Ŏ\xb5\x1f\xef\x99\xf2x\x11x\xb8\xe4+x\ue457\x1f\xfd\xf2\xa1\xef\xf34\xe3\xde\x02\xfa\x17\xfeV\x01^\x04\xc9V\x15u\xe3\xe9P\xf3\x88\x82\xdai\xfdf\r\x9f\xb3\xeb\xb6w\xfbz\xaf\xbf9i\xe4\xa2{V<\xef\x99\f\xaeї\xb8Kw\xef\xf8#=\xaa\xa4`\xd7\x1b\xe3\x87\xdf\xff\xf7\x8d\xc3\x16\x03~ёޏ\x82\xe6_\x86\xc0\xefф3\x11,1\a&W->\xfe\x1cxj\xd8\xe4~\xf9\x8f\xce\xdfܱj\xe4\xf8a\x03>\xddt\x96\x1ex\xd7k\xaf\xc5\xe5la^\xf03\x82q\x01n\xb9\xabi\xb8i\xbfЗ\xb81M\xe9\x14\xd7Ɏ\xa5H\xd8͌\xda\x00و\x88\x90\x8d\b\xd0\x14\xb5\xe1\rKQ\xa8j\x02\xb01$a\x04\xefg2g#\x82\xfeK|\xbf!\x1c\xd3y\x11\xcaeD\xf3\xe2\x9fQ\xb9Lx\xe7X\xe7\xc5{i\x82\x124\xfa\x1f{{V\xa7\xb9\xa3\x9f\xe1\xb0N\x9f\x9bl\xb5\t\xae\xafѨr\xba\xee|\xa3_I\x86G\xc9$iu,\xed\xb5\x96N\x84?\x16TW\xb3߂bt*x\xfa\x82\x1a\xe6\xd0\xfa\xecA\x81\x95u\xb6\xec\xf2t\x87A\xaaՏ\xe8\x9d7\xa8\xd4\xebЀ\v\xd5\\84\xa2d\xe9\xc6ه&\x8e\xd6I~\x18\xfbXsu\x01\x97\x84\x1fl\xff\xb6\xa0\xfa\x030eZ\xde\xc0~\x85rsUJ\xf5kG\x8f\x9e\x19\xec\xca\n)\xe42S~\xa1m\xea\x93\xc2\xfaVy\x83\xe2n#\xf2\x92~\xd4c\xd4\x1bhV\xe5\x05\x88\x10A\x15\x1a+\x90c%\xee\x98Y\x14Y\xc4\xe1 Z!\x18\xf9\x9b\xadW\x021\xd3\x15\x93\x91\xd3\x13\x88\xe2t\x92\x89\xcfA\xf21y51\x8b+A\x95\x1dE\xa6\x818\xec\xb1\xe0\x8bI\x13Co\x13.\xd1\x1a\x12\xb7V\xec3\xea\xb1\xe5[\f'\x06\x97\x811\xea;\x8b\x8aS\x13\xcdv2\x10Q\x8d\x16\xec:p\xf4ؽ{\xe6/\bf\xcb\xd9b/\a\xb4\x96\xa2\xe9\x93\xc3\x1bvܽ1\xda\xe8l\b\xa4\xf4^:\xa7\xa1\xb0\xa8f\xfc\x90\xf4\xe8\xe1\x91\xf9\xb9\xc6\xe4\xc9y%\x0f\xd0\xfa\xfc\x89\x9d6?a2Gy\x89\x86\xd6\xec\x04\x9b\xd08\xaar\x97mng\xc8\x19ô\xf4\xc50.\xb9\x1eׂ~\xe9\xafX\xabnj\xb5\x88\x8b\xee\x98cpD\b1\xb1\x14N7\x12\x1d0%\x84\xd9p{\x98\xa1\x12\x90\f\x12\x82\x1cUWܥ\xbf҄\xc9oS\xec(آ\v\x1a\x85\t\xe1v-6=\xa4C=s\"\xc1n\xed\xa3\"^\x0e\xbcD\x83͐8'\x14\x19\xb1\xbeݿ\xc6\x02\xfd\x17\r\x8aڊE\x93BTP\x1bAE\x88\xa0U!\x96DwU\x9dI\xf4O\x15\xbee\xab\xa1\x18p$\x9eF\x1b\xfd\x80\xa5Zo\xaa\xb3\x10\x1e|놪\xeb\xde'܈s!}\xc2\xd9\x05q\xe6\"T\xb9\xd3\xf7P\xcc\x0e\xddd\xd4\xff\x9f\xb5\xc3(le\xfe\xca+\x82\x8d\xf9\xab\xaf\nV\xe7\xf1\xebW^\x91Dl\xffY\xd3\xdcs\xeb\xec:\xafa\xdb\xff\xae\xbd\xf4h\x1d\x95I\x95`\xacX\x89\x00\x9a\x14k\xa5\x98\xb5\xfe\xffU\x03q&HI\xcdR\xd8&\x14\xfd\n\x10\xea\xd2\xd1\xf4\x9f5\v\xdd\x1bR\x12\t\xb0\t\r\x82r#\xd9F\xcb\xfe\x83\xc6\x00\x9d\xf0-\xb8\x8f\xaeM\x80\xf5\x14\xfe\x80\a>\b/?\xa6}\xbcD\xca\x00\xa5Le\xe4\xecJ\xa7\xb9\xa0\xa0\x8f{L\xf4\xee'\x80\xfb\xb1\xc7:\xedy\x13\xca\xed!\x88\xae=l\x83\xe2g\xbcw\x82\xc6K\x1a\xc6sC\xfc8\xe6\xcb3\xfcj\x17\xd0wV\b˩}.\xbf\v\xbb\x94\xe0\x02\xc4'\x15v\nc\x05\xb7\xac\xd9U\xd8\f\x0f\xbd\u007f\xf7\xbaQ)I\x9e{W\xe6\x94\xf6-\u007f\x0fLy\xff}0\x14W\xb8_훰\xbd\xb0\x92S%\xb1\f\a\xa4\xb4\x9c\xe6\v\fYIV١g\xbbD\x1d\xf4\xb37\xd7;\xbc\xf5\xbb;Z\xde\x1dX\xd44vh\xc5\x1c\x97H\xbc\xf5;\xa0\xfd\x0en}\x025\x86\xf8\xc9>J1\xa23\xac\x9aU!\xb6P\xec3\x95x\x06d\x8e\x06\xa2}\xeb\xbe?1mډ\xef\xc9w\x94\xb0\x14\xf7\x0f\xd4\x03E\x94\x94R`*\xadA\u007f \x19\x9036\xe3\x85\xe8?M~h\xc0\x8d\x06\xee\xe8Ix\x89Y\x16=\t2\xd9\xc38L\x0f\x81\x97q,\x91\x1b6\xdch\x15=΅\x88\x1d\xba\bP\x8et\xc6\xc5\xd0\xd8{k0f\xf5\xaa\x15\xd67\x01?\x8a\xd4rF\xd1\xe3R\xf8\x1a\xfc\xaf\xaf\ue69c\xdb8`\x84v\ue824G<\xf7\x8d\x98\xb8ؔk\fTzgL\x13+V\x94\x86\x96\x83a\x1dL\xfbwp\x12\x1c\n\xf8#\xa0\n\x88\xea&\x1b\xeeɼS,Y\xbb\x15~>\xf2\xfao~3b\xab\x19\xdc!\x13w\xaecE\x02.\x83\x94 k\xdb\x01\xa3\xb3\xa3\x0e,\xa2\xda)\xb6\xfc\x93O\xa2\x9b>\xf9\x04\x94\xa3\x89\x81\x02\xc7\xe8e \v\xfe1z\a<\x1f\xef\xd7\xf1g\xb5T%5\"\xf6\x98\x9f\x9f<\xa9\xacaIŽRZ\xa2P3C\x9dy(\x97Q\xc1\x810SrO\xf9\x12\xf8\ryI#l\x92YeRivff\xb6T*M\x93\xe5\x14I$E\xd7\xf0\xcbF\xad\"}\xba\xef\rZ\xf42j\x97\x02,}\b2x\x1b\nk:ح\f\xea\xd4\x1a\x91\x1c\xb1~\x18\x94(\xa0\x04\xbc\xdd\xefa\xf3\xd1\n\xaa/P\x8f\xd8\xf9\x1a\x00{\xbe\x01\xf3\xe67w\x1c\x043\x1f\xf9\xc3\x1f߮\x19\a\xbf\x87\x0fl\u007f\xf5g\x9a\xf9\xf2\x0f\x05\xbd\xd5\xf4J\xb1-8\xa4\xa1\xdah\xdc|\xfd\xcd\x03\xf4W\xab\xbfyw\xef\xc8?\xbc\xf9\xf2\x8dW\xe6\x1fm\xb0\x99\xfbx\xe1\xe6\xc0@\xda_\x03\x9a~\xf7\x13\x18>\xb9\xf7\xfa\t\x83V\x0f*1\xab\x00\xe0\x86\xac\xbb'\xde_\x89n\xbd\x80F\x9fBQ\xa8\xa7\xc5X\n\xdc!\xb1\x11I'\xb3\xe4\x95P\x13\xaa\xae!\x06\a\x1bq`3\x15\x11\xe2Q\xfe\x81\xe2ltS\x14\xab\x98\x83tb\u0082\xb8\xa0\xb6\xb6\xaa\t\x9d\xba\x9d/\x13\xbb\x95\x02<\xbf;ɖ\x1c\xee\b\x82?\xc9\x00\xf1&%\b\xac\x11yD,\x1eeOp8jb\x1c\xd8>\xa5\xc8\n\x94@T\xf0\xd1\xc0\x9f\xb7ᄊc\xc4η歿Z\xf7\xc7y\xf0\xfew~\x03?\xba\xb0z\xf5\x05\xe0\xfa\xcdE\xb0\x00\x86\xe8g\x17\xc3Z\xf8\xc3sq\t\xefs\x80\x05\xc7n\xbf\xdfݴŖ'\x97\xe6\xfd2\u007f\xf9\x9d;\xae\xed\x9a\xf7\xd6\xce\x11\xb7\u0379\xfd\xd1\xd6\xd5\x17\xe0G\x88z\xa0,>\xa4\xfb\xc1#Q\xf8Q\x17\xad\x84?_\x85\x8b\x8f\x00bN\x82\xdaɆ\xea\xd1\x16\xc3Ӎ\xe1\x11\x04\xec\xc0\xad\x01i\x88\xce\xd1v\xc0\xed\x8e\x1e\x18njj\u007f\xf6\x05\xf6~\xfd\xee\xe8w`\x1c\x94G\x1e\x05S\x99^`\xdd=\x91O\x173c\xa2\xc9M\x13#\x0f\x81!\xf4\x9aȧt\xafxۄ\xb9\x1f\xc9~\xee\xed\xa8\xa3\x10\x8f\xe4\x9d.k:\xc3\x1c\xb6D!\x9a,茮\x11\xbf\x1a?\xfb:\xcfA\xda\xe8\xd5t\xfa$6\bp9\xe8\x98*\xec> bi(\xf2[\xe9nϠ\xb3A#\x9c鰺I\x8d\xfeh*~\x8e\x86[\x8e\xb4Dqt珓\xf3j`\xb3\xe7\xdamy.\xc3 \xb5\xa67\xaf\ue5e2\xad\xd1e\x16\x015/\xe7\x12\xd3\xd2\xea6u\xd7_T\rBXa\r\xb6\xd2?\xaa\xd5-t\v:\x90\x9f\x88\xc7\x06\xbf\x9bU\x0e\x93\xcdfr\xa84R\x95J\xfd\x81J\xa1\x92o\x04\x80\xe1E-\xb1\x84\xd1\x1d-j\xc1\xc7#髳\x04\x04,\x81\xdd*\av\xa3\xc9\xca\x11\xbe>\x0e\xf2&\xac$Q?㰗.;Q\xf8\x11\xbc\xbe\xa6 ]'\xa5\x15\xa3\u05ec\x19=f͚S\xaa'\x97\x0e\f\r\xce\xee3rx\x83W\xa9˯\xf4f8\xf2{\xb9\x95\xe9\xf9)V\x1aLo0\xe7床\xf2\xd2\x15|`\xcc\xc2;&\fޱ~Riqì\x99^OMN\xaaT\xaau\xf9G\xf9\xd5:\x00\x82\x83\x9dI.\u007fA\xaf\xd4\xe4R\u007f(\xd0\xcf_\xe3M\xb4\xc3\x13\xec\xd7o\xda=p\xf6\xb8Nt\xc4M\xb7j\x957\xc8\xda\x13\xa0#\xe8~\x15\xee\xe9s\xbb\x89&#\xb9K(\x14\v\x83\x1b=q0:]\xea\xf5p\xaaN\xc78D\xe3G^\x1f>\x92\xc9H\x06\x14Y4\xe1\x03\x95\x9c\x01\u05fb\x8a]\x88F\xa3#\x86\xe3\n÷,F\x83\xc1h\x01\xa5L\xff\xc8u\x86O\xb2'zܴ\xff\xe6\x06%\xf8\x9e\xc0\x14*\x1e\xbe\xff\xf3\xcfcvv\xf8d \bE\xbd\xa8\x1alg\a\xf0\x14\x95\x03\xe2:\xbf1\x0f\x18h\xeer3\x1e\xc4\x11\x115kg\xbc\xe4Fa\x94t\x86u~\xac\xe3\u0088\xf0\xa4\xe7\a\x8c\x83\xe8m\xc6>\x03џ\xc5z\xb19q\x94\u007fL\x9fI)U\x8b\xc4\x03<\x1d\x94g\x80x\x91\n_\x83if\am\xa3\xb3\x8a\xf1љ\f\x8e`\xc7\x17\xc5.\x10\x8e\x9d\x9bl\xb4\xa38\v\xdds\x98\xb9dg\xc7\xea\xf1\x1b\xa6鶍yX\xd0W\u007fx\xcc6ݴ\r\xe3e}\xf3\x1eư_(\"\xaf/\x83[0:\xcbӻ\xb7\x87އ\x82\x916:\xcb\f\x8e\x98\x1dl\x96\x196%\xa7\x87P\x18\xc3,4\x91\xe6\xe9\n\x1bP8\x8bu\xe0\x8b,:\x9d\xfd\bN\x05/6\xceǷ\xe77\xc2\xfe\xe0\xbe\xdc\x12\x1c.A\xfdߎ\xfa\xe5gd\r6\x04{\xc8r0x\xf3\xcb\xce؋LF\"\\b\x886(\xea\x15\x8e\xce\x10\xee%D\x8e\x94\x10\"`\xdbF\x9e\xf1v\x86p\x0e\xccg!\x18b`\t\x9f\x04_\f\x81\x80J*eK83|q(\x9fԦ\x96J\x98\xc1\x10\x85>W\x91\xd0\xdb\xf8\x84R\x82\xfe!\x1c&)A\xff\xa1|r\x9b*\x962\x16\xc2\xf9H\xb08\xea\x06\x05\xae\xb5%ݠ\xe4Je[\x12|\x01MojP\x12?\xa3C[\x12\x10\xee\x81\x018\x0e\x9e\x89\x9f\xe5ra\xfd9\x1b\xcd3{c\xf6\x9a\x1abqo\xe25&\x9e\x910\x1a\x06\xeb\n\x024\xfe\x89\xb5%\x1a\xa4\x04e\x93\xa9ٳw\xef\x9e\xf5\xe0<<\a\x8a`\xc1\x8d\xf1 \x04[\xc7S7\xe8߇\xe6\x1f?\xfd\xcb\xe9\xe3\xf3C\xf1\x00\xf8Ӟ\xbd̶\xbd{\"\x93\xc0yP\x84\xfe\x9f\x8f\x1e\xa2n\x8c\x87\xa7\xe0)\xf4\x00hAc\xf5\xad\xb7W\x15\x16\xaez\x1b\x94\xa2\xf1Z*\x84\x85\xb1\x99y\x83b.u\x96\x8br\x06ܚ\x80[\x87%\x05Xq\x12\x9d\xe8Ꮳ\u007f605\xfa\x15\xfc\xe3\x1c\xb0\x18n\x9b\x03\xb2\xe8\x94\x05'N\x80y'ND\xff\x1b\xde\x17\xfd\x92~\v^\x9a\x03\x96\x80%s\xe0%\xfa\xad藂]ML\xd7\v\xcbc\xb2\xa8B\x8a\xea\x94\x1cuJ\x90D\x04\xcdO\x87\xa5_D~\x88\xa5_\x988\xb3\xb1;\x1cU\xd7\\W\xd7\x1c\xad#'\xb6\xees\x01\xa9o\xad\xa2\xa3MgC=P\xc1\xda\xc89\xda\x14\xbb\xf3\x1eNWǐ\xe4u0-\x0e\xecת\u05f6\xa3Nn\xd6k9tz9\x16M\xe4F̍\xfe\xa2(\xf7\"\x91\x92\xa8QIS\xb1?\x18\xec\xf6E\x97\x05@!&O\xfe\"\x80\xdd>H@!\x0e\x9b\x9a\x99\xa4\xc8}Z%?\r\x9c\xa3\xf7\xc0\xe7\xa2?\xbe\t\x8b\xde\x14\x17q\x05\xd3x\xa56r\x1f\x93D.\xc5L0\"\xa1\x97*r\f\xa08\"\x11\x8d\x8d\xdeGO5E7\xc2\xf7\f9\x8a\xe8\x9d\xcc?Е)A\xdeֆ\xbe\x04\xdeu)\xc4~Q}\x0e@l\xc8\xdd\x18\xf0\x8a Lrz\xbc\\\x17\xd4'\xd3\x05\xe5I\xc1\xed\a\x9e,\xd0\\z\xe4\bӷy\xeb\xe6\xebM\xa0\xf1ڞ\xb50\x93`\x1b\x84\xa7\x8c\x86\xd1\x17V\x9c+\xd3\xd5\xe9\xcaέx\x01FGO\xf9\x11\x1c\x02_\x83C?ҭm\xd1\v\xe32h0\xb1\xb6\xa9~\x12\x00\xb7\xb7\xb5\xbe|l\xfa\x9aC\x9f\xcel\x04\xa0q槇\xd6L?\xf6\xf2\xfb\xc2d\x10\xc7n\x88\xcbO\x84u\x96\x8e\xcaD\xfc\x80`\xf3mp\xf8t\xc4\x13\x99\xbd\xebGD\xfd\xc0\xcd\x13\xe3\x93\xd8\x14\x87Vf\x1c\xfa롷G3\x91H\x84\xf9\t>\x06F`\xb5\xdch\x13㖋mp\xd3\a\x1f\xc0M6\xb1\\.f/\x89ђ\xedE8\x8b\xde\xfa\t:|12ؑ\x19\x1c92\xc8^\n\x8e\xa4\x17\x84\xc3ԍ5k F?\xa0\x84p\xe4A\xfc\xc4\r\xea\xb1\xc7И\x14wd\xa2<\xd8\t\xfb\xf6\xed\xd3w=6\xb2\x9b\xceJ\x1a\x9e\x95@l\xc3^\x94\x06\xb0\xb6\x8e\xc9\xca\xe2}S\x1cC\x03\x0fG\xbbmr\x14\x8f\xc1\xd9\f\xc0\x01\x94\xb4\x87f\xc2\xcd%[ϧg\x8c\x96\xba\xdd\xc1i\x8d\xbe\\\t\x9b[\xbfx\xd1\xee\xda\xfd\x00\x14\xf9,\x83ރ\ru\v\x86\xf5*\xf3Ժ\xd10:\r|W\xefl\xb0rJ\x85\x02\xf4i\x86\xdf\x18\xb76\x9f\xd8\xfb\x12}\xfew\r\xef,\xd6i2\xd5ִ\x9ci\x1b&\f\u05c8\x87\xdfy|\xdd\x12[\x95\x88I\xcf0\x94\xa1\x91\xbf\xba\xf7\xbaC\xf7^y\x13\x14m\x19\xd0r\U00091bce\xffi\xd9\xf0\xe1&\xf8\"H\xa5\x93\x94\xb4m$\x95\xa0ۖOv\xb0\x88\x87y\xca\x03x\xd6\xe6t)\xc9^\xb2\x92F\xf4\x95( \n\x1a\xf0buroQ \x88\xa1\xefi7\xe6\xf1c#\x92\xed\xb1\x16\xe9\x89R\xd4s\xad\xc2M\x95\xe7\x99a\a\xfc\x16v\x98\xf3\xe4)\xe6\xd7\xe7\xd2)f\x8bDjL\x96(s\xd5b\xbf&[\xe3\x17\xabs\x95\x92d\xa3Tb1\xa7\xd0s_7\xc3牀\x93\xde:\xffU\xf4\xe4\x17\xb0\xe3\xd5\xf9\xf3_\x05\x1c\xb0\x02\xeeUX\v\xcf\xc0/ϭXq\x0eX@\t\xb0\x90Й[\xad\u007fF\x14\xa7\x88\x82AQJq\x9e\xc8#?\xfc\xe9\xe8\xfe\x86\xe4\x02)\x9b\xa5ߺ|\xf9V}\x16+-H6\xf4\x1f\xfd\xe9a\xb9Gt\x94\x88S\x17\xf4x\x13\x0e\xcdYq\x0e~\xd9ㅰ\xe0Vjh\xa8\xd7W#\xfa\xfdr\xac\x8d\a\xa0\x18#1\x87!\xab\x1f\x1d\x81\xb5w\xc748Q{\xa2n/\xf2\x00\xa2\x93\x8b\x11\x1a\xd1\xe4\xe6\xa4\x05\xa5i=(\n\x90U\x05\xb6-\xc4z\x82FnU5\x97˖g\x89\x98\xdcR\xc6qw`\xcf\x1dc\xcf\xee\xdc4\xfd\x8e\xe5\x0f\x02\xf1\xdeg\xed\x8de\x9c\xed\xaf\xe6j+\xf86C\xae\xc99\v\x16e\xedin\xde33\xf2Ѭ1[w\xbd\xba\xa7c\xd7⭽\xcfҿ\xf4ˏ^\xce.\x01L\x9f\\\xf0\xb8x\xc1\x9aK\xf7\xdd1m\xd3\xces\xe3\xee\\\x98\x02rG\xfd\xc6\xcaU5\xa6^4\xf1Z\xf8\x95!\xbfOѷz\xf0h3Φ\xfd\xb5\xf2\xad\x8bw\xb5\xefye\xcf\xd6ƹ;\xcfR=}\xfc\x0e&\xbe\xe0z\xf8\xf8\xc5(\x01\xbc\x92\x166\xbbIt\x90\xf9\u007f\xd5}\t|\x1b\xc5\xd9\xf7\xce\xec\xa5\xfbZieݲNˇdK\xb2\xe4ۊ\xed8\x89\x1d'\x8eslj\xe3\xdc\xf7\t9I\x88!\xe4\xe0\x86\x04R \xe4j\x80p\xb6%\xd0p\x15\x1a\xa0%\x94\x16H\xb9\x1bZ\x9a\x04\u07b6\x94\x12(\x94\xb6\x90h\xf3\xcd\xccʎ\xed\x84Ҿ\xef\xf7\xfe~ߗX;;\xb3\xb3\xb3\xb3\xb3\xcf\xcc<\xcf\xcc\xf3<\xff4\xf1kA`\x8b\x886KTV2\x81^\x1d4\xb8\xa1\xb7\x0e\"\x96\xb3?\u007fK/\xcfA\x14\xef\xc7nyܵE!\xaf\xcbJb\x16G\xc2\xe3*/\x9e\x98\xac\b\xbb\x12J\x83Z\xb1X\xc5\xf0\xeb?\xbc\xea\xfd3ҹO\x1f\x9a;\xf7\xa1O\x01CBp\xeb`\xa6\xb8\xbd\xb7D\x138\x1do\xafr[Lf\xa7\x9e\xec\xe35\xf9\xab\x03~\x83\xd6\x16\xf0\x14V;\xcc\xf5\x1a\xae\x83\xb7\xab\x8e>\x06\x1aQq\xfd\x8b\x95\x9e\x18\xc4J\xa3\xf6\b\x9f\xa7\xd9\xc9D>\xacC\\K7\xb6\x91\xed]\xcdA-\x10\xc2\ba\xa8oy\x80@\x13]\r\"\r;\xb0v\x0f\xe9sHH\xa4\x05\xd9'\xa7\a\xf0\xd8\a\xa3\a\x13\x04&\x8f\xb0\x1f\xfb\xf2!\x80zX\xa5\x03\x88X5\xa8\x1c\xfc\xa0g\xeaԞNpCM\xa3N\xba\x95\xd714\xaf^\x0f\x0e4\xda\xf4\xdax\xb9\xcbF\xc3\x17\xd9\xf1~Fe2\xf3\xbc\xe01\xaa\x99\xe8\x9b\xd6)\xad^p?\xcf#fJZRԙ\x97\x17\xe0\xd41\u007f]\x01\xf6\xb5\xb6\x81\xde顕j3\xb7R\xfa%\xad\xa0i5\xf3\x8b\xce!\x99\xce\xce̐\xac?\xee\x17\xad\xe0\x88\x86\x87\xb4B{\xbd\xb4WJ\x1f-\xb4sv\x9b\xb6\xc6a\x84\x93\xc1\xfe{>\xc8\v\bZ\x00i\x8d9O\x0f\x11?\xba\xd1W\x90\xfd\a\xab\xa1\x81\xf6\xbe\x15'+\xd2Ӽ\xcd\x0eQ\xe3\x15\fJ0]z\xa4L\xc1BV\x1dQ=\f>\x06\f\x84J\x05\xf1}FS\x1f*)ƉFZ5\xe2\x9e˨Vj\x0e\xb5\t\xcfp4\x9b\xcc\xd9\x00\x01\xa1\x0f]\x82\xc8\x04!\x19n\rs\x00\xfd\xe6\bDs4\xef\xc7\xee3\x93Q:\x9cpӞ\u007f#\xc5\n\xfe\xf9\x10\xa0'\xcd\xe9N%;\x17g_\x00\x82\xee=\x9d \xfd.\xad2I_Y\x04-,V\x9a\xc0H\x9d\x99\xae>{L\xfaBg6\xeb\x80\xe6ep\a\xd0;k\x8b\x12\xa1J\xbb\x01\x00\xa0\xb3W\x84\x8a\"u.#|\n\xa5\xd7]H\xb7\xf5\xa6\x1f\xc9\xe5\xaf\x18\x98\x0e\xa0\x1b(\uf6f8Pڰ\x12\xbc\x92\xd5\xe0\xd2\xeb\xc6\xe8\x03F\xf8\x95\xce\xfc\x92t\xe5oQ\x1f\xfa\x9b\xce,\xcdV\a\x16\xcdXST\xb2fA\xa7ápuN\xdd\\\x1d[;o\xb2\xdd\xfe\x1f\xa6\xcb\xfb\x9fl\x0f\xfb\x05\xd5BME\x12\xca\xd5hZ\xc0\xc0\xf7ة>\x01g\f\xa36\t%\xd3ؑ\aY\x81$h\xe90g\xdd\xce\x13gyX$\xb4^\xd0T\xab\x03\x02\x1a\xb3\xe4\xa5\x1dD\xefV\x11\x11\xaa\xe8Å\xe0\x05 \x92b\xe0\xe5\x04$R\x86rIh\x96\xe0\xe1\x02;\xe2,\x14J\xa5>`\xed\xca\xf3i9\x15\xab\x00\xc1 P\xb0*N\xeb\xcb\xeb\xb2\x06\xf4J\xa5\x02\xc0\x80}\xa2\u05cc\xe4\x8a\xca\xd1\xf5.\x0fG\x97\x85Be\x15\x8e\xfa\xcbi:㳙\xbd\x13\xf7\xd9CB0\x881\xffZ[-O\xa6L\x82\xb0|9\x8e\xed\xdau\x10G\xa6̘1\x05G\x97\\~\xf9\x92;\xd5]k\x95L\x89C\xa1S\xabY\x8b\xe0bz\xa4\x1e\f\tɪ\xd5:\x85\xa3\x84Q\xae\xedR\x8b\xb5\x1a\x85\xc9\x18\x1b\x9fn\xd4\xf0\x8bNH_\x9cX\xb4>\xdc\x19\x00\xc0\xa4\xd0\xd4҇B\xe5B\x10\xbd)\x86,l}\xabU\xf81ƙ[\tjV\xe2\x84]Ҥ]/\xe3\x84\xce?\x03\xeaϝ8i\t\x9a\xf2~%\xfd\x89\xf8I7モ\xa7\x8f\xd7\xf5\x10l\xa34U\x8f\xe6b\x8c\xa75\x1d\xcd\xc7˨5\x88\xf2\xb7Q7Sߣ\xf6\x11;{\xb2\xa3\x12ȅ0\x17\x0eN\xff\xd6|\x83v4\xbf-\xfe]\xe1\xb7\xdd\x0f\xa0\xec\xb9\xf8\xfb$\x90\xff\xe0\xf7\xfb\xa7e\xbf\u007fq\x8e\xaf\xbd\xc4\xcb2\\N\x02i\xf9%b\xac\x1cd\a\xc4.\x993\x17\x03\xdd]\x17\x9e\x00\xe5@\xea\xba8m@\xe4\x9cn\xbf|7\xfe\x03\xb7\\\x1c9+\a\xf4\x80إ2\xca\u007f9\xdfe\xdc9\x8e\xea\xf3\b?\x92\x1aG-\xa0\xae\xa0n@\xac@\xae\xd5R\xbdH\x99\x80\a\xbd\x16T\xf2lI[\xfa\x8c\xa5R\x04V\rw=b\xedC\xd6\x1b\x89\xbc\xd7\xdb\xf6A9MVꐗ#\xbdbPƝ\xc3\f\xaa\x8c\xbf&\xb2b\xaf\xeef.A\x96\xfb\xff@\x8ec\x015\x05I\xac\x8f\x90\b\xfcؚ\f\xf8=\xae\x90\xfe\xd4>,\x89/\xdceM\x04|\x05ဌ\x99\x80\xf2\xf4b7dI~Ќ\x82\xcdӦ^\x83\x82\xd7@\xe05p\x1d\xe1\xe7\x84|\xbe\xe9n\x8b\xc2`LZ\x9e\x00A\xa5Ŧ\xd6\x14\x1b\xa6\xbe*\xf2\x06C\xd2\xf2\xc9}d\xd1\xe1.y\xe9\xa1\xe4<5\x05P\xdb\xe4\bU=kR,\xe2\x0f\xd55D\xf6\x9d«2\v+g\x8c/\rG\x933\xd22\x8a\n\xaeS\x0e\x18\xe2}r\v\xd1\xf6\xc0.\x1eq\xb8\xe3\xb5\xd7nƬ\x9d(\x1c^\x85\x1e\x84*p\xed\x16\xc2\xea\x9dٍ\xa2\xe8\xe99=\\\xfa<\xa5\xc8\xe6\xf4,\xe6Q?\"\xfc|\xce\xf2\x9dp\xbb)\xec\x81+F\xackr\xe0\x8ax\xf6\xd1\x11\xd3o>.\xab\xc4\xe2\x16\x8d\x13\xcd|4߅\xc2A\x19\xea\x0f\xa3d\n)S:\xe5ƦI|*\x87\x89\x87Έ\xc7\xfc q\xccGs\xb26;^\x05O\xf7~+r.\xf3\x88uD\xcd \xed뻐\xc8%WC\xd1\xca\xe2A\x99QTیu\xc1\xf2ր\xcaW\x1a\xac3\xda\xe0e\xbdgչ+\xd2\x04\xe3H\u007f\xdd\xf0D)\xad\xa5\xa7\xee)0:\x02&\x8b\xc5\x14p\x18\v\xf6L\xe5\fN\xe9\x83\xcft\xfa\x02\xe3~\xb5N\xfc\xf5m\xc6\xdb\xd7yF\xc7yOs\xec\x8a[\n\xea\x19\xb6\xb4`\\k\xb4\xfc\xb2y\x01;\xfdh_\x0e\xbb\xbf\xc4e\x93\xf30\x8a@\xba\u007f.ӿx\x14\xd09\x81\x1f?\vf`\xb9/\xdcZ^\x91\xaf\xf0\x84}\xe5W\xe7BHR\x81\xc9o7z\x8c`\xf6\xd8@\xabQ\xa94\xb6\x06\xc6Άб\x96\xf7\x83\x8c\xb5L\xbb\x06\xa8w\x03\xe3l\x1b_7\xca^=t\x9c\x11=\x1b\xd5SU\xa2\x8a\x9bZ7HGq\x0e\xe9\xab\xdd\xd2g\xb3E\xbfG\xce\x01J\x03}9\x02\xdfR\xf6\x00\x9bc\x81jB<\xecT\xbc\xdfM\xb4\xa3B\xde>=)Ĝ\x12l\n\x12#=\x11\x89v\xb9~\xca\x11\xf5\u007f\xb9\x9f\xd2x\x8f\x04q\xf1\xbdvw\x18o\x87\x0e\x85\xb1\xaa\x1b\xe3\xc5\x1dD\xfa\xedk(\xb8\xe6\xc9k\xe6\xe3.\x84\t\x9e@\x9b\x04\xc2\x05\xbe@ºk!\xa6\xe1}\xa7\xf4!\x97\xc7\x1fHZ;wg_8\x9d}V\xe3\xd3ܯ\xd1p\x19t\xf8\xd8>\xac\xe1\xaa\xce\u05f5>x4G\xee;r\xe4\x0f>\xc4p<8\"\xf7\x93\xf4\x8cd4\\:~F\xe5B\xb2\xac\xb9/\xd2P\x17\xf2Gb\x93fU\xa3ޓ\xbd\x01\x17\x8bJ\xf5i8\x0e\x1d\xb5\x1fۆݹ\xa0\xf3uM\xff5|35\x89\xa0.a\b\x0f\xd9\xcfxn\x8f\ao\xf1\xe7X\x810f\xe51K\x00\x89\xed\xbe\xac\x85\xee\xf7\xe1\xbd\x0e4?\xe2\x1e\x95szRG|\x89\xe7\x14\xc6\x13\x17{G\xa3gj\x11C\x88\xb8B\xb3\xba*\xd9\xdc\xe4\xb4:\x8d\xe0\x0f\xa3\xb4\x16m\xe76H\x97}\x91W\xdcu{ˁ\x9d6\xc0\x88\xba֒B\x8b\xcb-\xf2yC=\xfeJۼ\x89\x1d;&[8\x81\xa5ի\x97\x94\x8e\x064\xab|r\x80q^\xd6\xd1\x18\u007f9\xae\xa6\x01\x9c\x95\x99\xf4pH\x97/U\xea\xae`\x15mP<=\xe4c\xcex\xebO\xa6\xef\xd8\xcbA\xdf\xd8\xe4\xccX^\xcckC\x9d\x93\x17]M\x1d\xbeI\x8b\x17\xeeh\x17'\x8b\x1a\xae\xc6\x04\x94P?\xd0L\x0fq\xa9A\xc4C\x9d`\xcfS6ħR\xc4_\x1d\x92h \x06fA\r\x84\xadtL2\xfajX\xbeBZ\x91\xf6\xfb\xfa`\xd2͘\x80p\xd3\xd0iDl\x85\xb2J\x17A\xd1Lx\x8df\xc8ˮ\x81\xdc\x00\xfe\x89Ѻ\xac\xe1\xf0\x82\xc5\xc6\xc0\xd0\x18\xe3ԘUА1\b\xf0\v\xbd\x82\x13\xdb3\x9eCO\xea9\x95Ka\xed\xda|\xb8{۾\xf0\xc4T\xe8\x1e\x90\x1f\x8dz\xf3\xbd%\xed\xe5E\"˫T*\xf0\xe17C\xafxvi2\x05V\x8fd\xe99\a'\x88\x1ea=\xf3z\x9eˣ\xb7VI\xff\xb8\xb6x\xec\xa8\x18\x00\xacF\xd5\x06\xca\xdb:\xb3\x87x-\xa0\r\xcai\n!p\xbd\xa7\xf3\xd1;\xba\x0em/\xefY\xd0\xe8\x04\xd6p|x(\xbf\xa0~\xda\xea\xeeB%\xa4\xc1W\xa7\x17\x9f~\xe1FA)\xdd1S\xfa~\x80\xae\xac\xd3\xf2?E4\x04\xd0\xfc\xb7\x89=K\xd5R\x1d\x88\x8f\xa10j*^F\xc0R0*9GH\xd8g\v\xf6PR\x02\xe4\xb1\r\xb0Ar\x82\x1d\xe7X㲁\x1c\x16\x90xk\fҽ\x8a\xec\x1e쯎\x13\x81\x80\x17\x81\xf5\x00[\xbf\x93q\x9a\xa7\xe5-E%\x90C!\x17\x17P\v\xe2L\xa94\"\xb2z\xaf\xe3\x83ڲ\x1d\x05\xea\xe1\\̛\xfd\xab\xb4_\x19\xaeL\x85\x00#e\"\x95\x10ք\xc1\xd3\xd9\u007fD\xe2\x1cW\x19T\x81SҁP)ǥ\xfc\x9c\x0e\x1c\xfd\r`\x80Uo~گ\xb39,O\x9f`\x03g\x00\r\xf2\xd4^O\x8b\xe3&\xc8\x01\xaf\x89\xbeW\xcf\xe8K5\xe9\x850\xb2\xa3<\xf3\x81\xaf0\x11\xfcĦ\xf3\xe5\xb7\xe5\x01\x95\xf4\x8d\xc5\x12\xf4\xb7\x9a\xff\xba]o\xf1\x05G\x19\x9f\x9f\xa3p\xe7\x01\r\xac\x88\x84+\xe8\xe9\xa6\xdb\n*\x1f\x8c\xd6H\xb3\xbcEL\x85\xb7\xa2 \x98b\xbd5\x91p\x12d\xd8L\xc4_Rӥ\xaa\x0f\x06J`w\x10D\xb5\x1b\xadc\xf2C\xafl\f\xc2\x10\xe0\x00\v<\xa3lV\xb5s'`a\xc9bpH\xfa\xfb\x88\x96\xf7\xab\x9d\xa9\xba\u0603\xb5\x85\xb7Y\x83\xa0\"\u007f\f⺽\xd2~p\xcc\xdf.\x98\xf2|\xd2T0\xc6?\xca(\xd8CҌ\x9f\xe9Y\xb3\xe1d\xa4\x06T\xcac\xa0\x9b\xa7ؙ\xe8kMC\xf2\x00ba\x822x\x01\xa2G\x0eM\x85x\xad\x95ؚ\xa4\xb06\x87HF\x04\"\x8b\"\xf1\x1d\x12\x97\xffv G\xc3h\xd6\xc3\x10]~l\x9dK\x13\xc0\x02\xc1\x1c\xb4\x06\x04\x18$n\x1a(L\xf1bn$E\x9f-\x18\xb6\x82ѐ\x99po\xa5\x85aT\xbc\x8e3\xc1'\x81f\xa9\xf1r\x8dI\xb5a\xeal\xa0\x02\xaf\xef4\x9b;\xcf\u007f\x0f%\xa9\x05Ն\x8c\xd4\xc4WE\xe8\u007f\x9eQj\xab+i\xa9\"\\\x94\a6\xa8u\xd72\vO\x16\xfb\xa0\x97\xff\x11\x9d,\x03\xc6G\x1f\x97>n\x1c\xde%-u\x9a'\xacw\x168\x0f_i\x06\x1dJ\xfeqX\xf9\xa3\xa9\xee\xb0\xd2l0kD\x85\x95>\xbb\xf2%\xad\xa0\xca\x18\xfeK\x90>\xfd\x93g\xa4\xe7\xa6\xdfg^Қ\x95(a\r\x9d\xe4\U000ecb14\x92\x86\xd3H\xe6\xe5\xe9\x11\u0382\xa2l#\xa3*\xe6~\x0e\xf6\x94\x97\xd3\xc5\x1a\xe9)\xd5\xdc\xcee\xc0\x04,\xcb3\x0fL]\xf8,\xac.p\xae\x9f`v:\xcdW\x1e62|\xaf\x1e\xd9\xf7\x18\x89]\x80\xb8\xfc\x18\xc1\xcbţ\xa9\xac^J\x06\x01+\xc7\xe7\xd4q\xbdXrJ\xa5Ű\x19\xea\x81/\x8ca\x9e\xc2b\xd8\x12\n\xbb\x91`\x85\x17ݰZ\x91<\xfc\xe2\x81T\x06Vb\xec;o\xfbßv\xec\xdc\xfe\xc5\xce\xee\t^\xbe\xa1\xedЇ\xa7@\xc7IoCe\xe4W\xfb\xf6\xe9\\\xf9c7\r/\xd1\xd3\xe9\xf4\x88-\x93\x96dǶ\x9d\x18.\xc0\xc2\x17\x17\xf9}\xf6\xe8\xb2\xea.GK\x9ew\x05\xf8\xc1\xbb\xfb\x0e\x1c\xd8\xf7\xee\xce\u007f\xec\xf0\xd4e\x9c\u007f\xbf\xff\xc1O?}pr\x9b60\xb3\xf5\xa8\xf4\xdal\xc0zo\xbc\xff\x8d\x1fv\x0e\xf5\xed\xff>|\xe7t\xf5y\xe9\xa9ֵ\x9b\x82B\u05ed\xb6Tup\x9c\xbd\xd8m\x18_\xb5\xe0\xb6%\xb5m\x8bz\xfdc\x91\xb9\xc3NE\xa8(\x9aO\xc7\x11\x0f\x1eD}\x8c˹\v\xc08\x19\x04%ٛ\xa2\t\xe0\x15/V\x83\x94\x11\xcf\x16a\x91M\x12\x8d\x03\x02r\x88\xdf8NJ\r\x9a,\x18\xbb3R,\xde\xf5\xa7\xddw_V^\xc2Xk\x86\xdc\xf5\xfa\xeb \xf9\xfaa\xa8\xf2\xc4'VZ,\xaa\xf7CL{\xd5TpU\"2vh{^\xcb\x16\x17scS\xb2*1\xcab\x04#\xfaO\x0e\xe0\xb3QCm\xcaxf\xd5\xc1\x83\xab.{@(*\xb6\xfcFz孷A6/V\xbf\xf6\xd6\xcbf\x88\xf4\xf5\xc0p\xf9\x92\xf6'\xc2wG\xe6\x0e\x9f`\x15\x86\x0e)\b\x1ag\x0fI\xae\t%[\xca\v?\xbfhN\xe8}\xff\xd1Do.\xd9ۇ\xa0̡c\xfb\xc5ܴ\x88m}\xad\xb2J\x0f'cy\xe1\xf5 \xec\x99\n\x12\x85\x1f\x1c\x10\xdd*2u\x0e\xdc\xee=/6\xceu\xf1\xe1X8h\xd6\x14\xa8\x19\x05k\fl\x1d\u007fl\xa4\x91eT\x9a\x02\x95ŏ\xae\xf0\x99\xad\xe2\xb5P\xa17h\x12:\u007f\xa6xX\xa4hxQƯKh\r:\x05\xbc\x16\x80\xc1\xaba\u05c8\xac~RF\xe0\xf4\xa2\xc6%\n6\x03\x9c.\x8c\xf6\x8f\x9ax\xaf\u007f\xb40\x1d\xea\xf3\xcc\x16\x97F\xd4s\xc2u.V\x8c\x8al\xa1\xa0t\xfb\xdd\xe8Oa.`Epv\xf0:\x18\xa0\xf4\xa8\x1dV\xa0v\xc0\xad\x90\x92q\xc0dE&\x82;H\x1cpYs\xf0`P\xd6k\xca\xd93\xc9\xcd$7\x9bL\xeaX\x83\x02ʎ&\x12\xf1\x1cx9ݾ\xf5\xedJ\x87R\xa735\x98\\\xa9\xfa\xd6zMp\xf3hg\xd2\xf9>\xaf0[\xcd\xe3Ġ\xcd[\x97\xaa\x9b\x92JN\xaeM\xd5y\xec\xc1\xbc\xb1F\x9bY\xc1\xbf\x8f\xb2\x8c\xda\x12\xd0ԏ\xacO\xba\xf4\rf\x93N\xe9ȼ\xc7\xf6\x80믨Z\x17\xbb\x85w\x04\x9c\xdeb!\xec\xd4;;\xb6\xe7kԜ\xab9_]\x11Բ\xac?R\xe0p\x14D\xfc,\xab\x0fV\xa9\xf3\x9b]\x9cZ\xe3\xbdn\f\xca\x186\x17y\x1cA;\u007fS\xe9\xfa\xaak\xd7\x0f\xa2\x81\xe9\xffWi`\xb0\a\x03\x96\x92\xe9 \x8a\xe8@]\xa0!t\xb0e\xc2Km&N\x85\x17\xd7̈\xf1 tp\x1dT\xe8\fڄ\xd6?D\xa6\x83!~mR\xab\xd7+\xc0u\x80\x1a\xd0\x19\x10\x11\xe8&\r\xc1Z\xd39\"\xa8O\x8e\n \"\b\xb5\x85FB\x83M&\x02\xb5\x0e\x13A\f\x13\x81J&\x02\xa5PD\x8b\xb4zP_\x00\xb2N\"\xe2\xab\xf1\xa8\xa7ce\xf6\a\xbd`\x80\xe5\xf8:P\x0f\xf0\xe2\x12K\xe4'\x9a\v\x13\v`.\nc Y\x9eD\x9f\xd9D\xa1\xd7g\xad\xe9:\x061\xd5Jj\xe8\xf2\x86rQ\xa4U\t\xab\xbeyH\xbb\"6_zH\xfa\xfd\xd47c\xa3\f\xfaaO\x8e\xdd2\xf2i\xc4s+\xd5\x1c\xf7\x82\xde\xdbsz\x87Dm\xef\xd8\xda^\xa8\x01\xdcu\x1f\x1f\x05K~\xc1\n\x95\xe5\xcd\x15I\xdd\\\x18J\f\x9b\x91lذ\xa6\x81\xa3\xa2S\x9bG\x14\xc68ӧQW}\xa8\x98\xf3\xbc\xac{\xb8\xfcJ\x83\x9b\xe7\x1d\xadޠ\xd6\x13\xa29Q-\x1dr\xf1y\x93!pF}F\x00\x00\x97\x06KA\rP\xea}%#\xa2\x8f2m\xddW\xdc2\xa4cMK~??X͈g\xee\xa2f\x13\xdd63\x1fF\xe3{\xbf\x9f/\x9c\xe6C\xfd\u007fxU\x1f\x8d\xed\xfd~hx\xe4\xd3\xe2\x80_\x12\x06\xfcD\xf8\xc0\xe4\x100\tD/\xdb(\xabg\x93\x03[\xc8\xfe\xe5\xa4\x10~\xe7\xd1\xe2\xfa=\xf3jG\x8fօF\x86t\xa3Z\x1a\xe6\xed\xa9.;\xfcNX8\xf9)˞9\x853Dk\xf7\xcek\x1c\x81\x06\xf7pHα\xb76\xfa\xe8\xdbA\v\xca\xe1\xde#}\xb9w\xcd{{\xa6N\xdd\xf3ޚ\xbd@\xbbgDvYv\x19\xbc\x15\xfe,[\x93\xada\u007f\x96%\xf8\x05\xb0\xa7ģ\x1b5\xa2\t\xdd\x18;\xfcnP\xfc\xe8s\x8e;sZ(x\xf7pѐ\xbd\xf3\x87\x0e\x1f\xad+\xf4\xf9\vu\xa3G4\xce߇s\xa0\x87\xff\x85\xe3>=%\x14\xbcs8V\xbbo~\xdd\xe8Q:Ot?\xd0\uf676\xe7\xc4\xda5'\xb0\xc7f=tg\xa1t\x15\xd8\x04%\xb0\xe9\xeb_\x82\xbb\xe94\xd8-\xcd9\xf7\v\xba\xf3\\\x8f\x94\x01G\xe9\x1ep\xb4Oϒ\xd8\x12E\xa8\x14\xc67\xe3s\xfa0H\xa0\xe8u\xa6\x1cL\x00\x1d\xc7c\xb3W\xd4\xc7@B\x00\xc6\xfcT\x1a\xeb]\x86\xd3n\x00\xc6\xc2\xc7\xec\xd9yK\xf7\xac\x9bfm-\xb9\xe1\xd81\xfa\xf7\xff\x90\xdcV\u007f\xba|\xe4\xd8\xc5u\a+\xcdf\xe9Ï\x9e\xa1'\x9c\xfb\xaf\xa0\x02\xde7\xab\xdd6g#\x1b\x1a\xbew\xe9\xb9\xec\xf4\xdb\x05v\xf8\xcb7\xd0\xf4\r/\x9f\xf8\xe6\x8b\xda\xf1\xcbF\x8e)ˇ/\xda\xefN\x96\xa7\x92\xf0w\xd9'\xc0\x17g\x1fH\x9b\x18\xdd\xf8\x1b\\\x8d\xbeǨ^_\xef9]>3\x95O\x95P\x95h4\\J\xad\xa5n\xa1\xfex\xc1\xda\x00\x89I\xa1\x9c\xf7A4\xd3]:2\xf0\x1cp97\xd9i4T\x98z\xbd\xcaYS\xbd\xaeFMa,\x90qX\bK\xcb\x1e\xd5\xd0\xd0A\x14J\xc8\xdd9%\xbe\xde+dDF\xfd\x91\xc5\xf6\xf5\x8c\xbe\x17\xf5\x8aر\x87\x89DBF\xact(LF_2\x92\xd1d\x12\xc7\x12\x1d\x94\xb9u\"\xd4ၝ\xb8\xa4\xe4E9\x81\x1e\xe7\xab\xf0\xf9*\xae\x8e\xd4\x14D\\\xee\xc8\xc3\x055\x91\x88\xdb\x15\xf9A\x04\x855\xbd\x01Ќ\x93\xde\xfb\xe1\x15o\xdf\xd2a\x99\u007f\xf5Zwm\x85ۛF\xbf\xa5^w\x85\xb3L\xbb\xfcꛆ\x1b\xdd\xd3S\xa7\xddc\x0f\xefX6K+5gff\xeag\xd7\xc3U\xadߛ\xd9vK\xba\xb4sn\xf9\xe4\x801Qδ\x8e\a\xd6ƚ*\xe9L'S]\x94+ \x8d~\xb1\x8a)\x8bWOK%W\f\xf5\x86'\xb7\x1e-\xcd3\x95\fY\xdcP-\nVh\xa6U\xf6<\xc3į\xb7\xfb\x1d\xd5\x13\xc7V\xb2\x1a-\"\x97\x90aO\x81\xcd_\x92\x9e\xc2\xfc\xa9*\x16\xab\x8a}3n\xa5\xbb\xa8Ƚ\xd2]\\\xec\xfe\x97g\xf0\x95\xfd\xc7\xe6=tr\xed\xa4\t?|\xf7\xfb\xd2[s*\xe3\xe4\x9f\xc7\xd6\x05\x84\xc7Z9\xe1\xcb\t\xab7ݶ\xebwͥ\xf0p|\xf4\xe8xb\xf4h\xe9d\xf7}\x8b\x9b\xab\xf7-\x99\xbfP\xe0*\x92vsӋ+\x97I\x9f4d\xf6\xd8\xc1ʢ\x8c|\u007fciS;\x10<\xdd|\xf4\xe8ʊ\xf9\x95\xd7\xde}帤\xcbF\x9b9}4d^v\r\x93\xa9dy֨\x17\x00\x97\xa7A\xf3\xf3\xe7\xee\xb2\xf6\xfe2\xbc\x8d\n\x12-\x81d8ߒ\xe8S\xa0\xb5\xe680De\xc1D\xb9\xbf\xdco\xf1[\x12\x96Ā=\xb7\xdb9i\xd7o4\x1b\xdbg\xddpìi5\xf3\x17߾\xff\xe4\xc9\xfd\xf7\xfe\x12L^\xb2d)\xfa\aL\x83X\b\xb8&\xdfs\xcd\xc8\xc97\xbfts\xf5\x9c\xd9X\xbf\xe2\x8d5KI\xc6Ճ\xb9\x03<7\x04s\xe3e\x98\xa0\xd4ajE\x83\x1co\xf4\x1b\xa39'\x81\x18\xc1F^1#\x9b\v\x88L9\xaa\xec\a\xf7\x8c\x90>\x1c\u007f\xcfk\xfb\xebG\xf6\x1c\xe9\x19Y\xffܝ\xb3f\xe9^L\xb6MR_g\xb6\x87\x18\xea\xdcS\xa5\xbadu\xa9\xf4\x03v\x92mySgOOg\xd3r[S\xb1\x1eFL\x10\xfb\xca\xc4\xe3\xf4\x18\x82\xd3\xc1\xa2\xde8\x81\x9aJ\xddFQ\xa6x\nu\x0e6ʆe\x90\xb8z\x10\x85\xa8>z\xe07Ʊ\xcf\x00\xb2\xf9\x8d1ɰ]5\x99\x8aCքя\xddҡLؤ\x01Mf)7\x06\xa3&\\\rCʓ'ky\xe1D\x87=X!.\x00\xf4M\xdeXu\x19u\x1btpsر\xfa\x1d\xed^o\xbb\x97S\xaa*\xedq\u007fT\xdc8\xf6l{%\xa8zT\xac\n\x8eTOmػ\x9b\xf5j\x1c:\x8b\x02D.[>*V\xb9\xcc\xd8Rn\xf6BU~Q\x93\x87\xbf\xa6{ڞ\x86y\x87&W\xfe\xda\xe9(\xdaZ\xfc\xbc\rɮ\x86v\xb3k\x91:\t(R,P\x84\xec\xd2(\xc7\xd2\xe6\xfc\xe9\xe9\u008d\r5\xd7\\\xb1\xacT:%\xddE\x14\xb3\xee\xd55\xb8\xaa\vk2\x81U\xb3::f\x1d\xf2g\xcaR\xfe\x84\x03\xb1\u07b3\xec!Г\xc9d8m\x8b/S\x98\xb4\xde\xd0\xc5t\x0f=\xdc\xf4\x9aZ\r`\xc3\xde\xecI\x80\xa4;\xb5B\xfa\xed\xb2\x98\xb9\xa2\x92\x8b\x9b\xd2VUaft\x1e\xa4\x1e\x1f\xd9\xf8e\xfe\xb8\xfc\x04\x8c\x9f\xb0\xd2\t\x8f0)/p\xbd\xbe\xa1\x05\x15\x85\xb5\xd1\xed\xa1!cU\xa5\x8d\x9a\xf2JƧ\x0e7ŀ=d\x87\xfb\xed!]\x933iu\xaa+*4ƀ\xbd\xdc3\xc4\x10\x1a\xa0s\x11$\\\xc4\x05\x06(\x8d\xc4R\xacg\v\xad\xa8\x01E\x10\x90\xb5\x13\xb0\x89\x96\x8e\xf6\xe1m\xacp\x88\x93\x95\x18X7\x13\xaf\xa3y\xaa\xab\xe1\x9bLC\x97ZQgin^\u007f\xefRvzi{U{|*\xb7\xf4\xde\xf5\xcd͖:\x85:\xfb+\xc0w\xa8iEHaW\xffq9\xdbU\x86\xae\x97u\xb1O\xefQ\xdbQ\x1a\xad\xee\x00\xbc\xaa=>\xaa\xad\xa5mLi\a\xbd\xf2\\\x94@\xb2\xbc\xa1W\xf2icU\xf9\xb4u\xed\xcc\xf0\xfc`\xd0\xd7̶\xaf\x9bV^eL\xf3\xca\xec\xfd?\xadU\xd8\xd4IT\xe8\x03ch|5\u007f8\xbd\xf5rTVRmS\xd4\xfeTQ\xe3+\x11Ř\xb7~\xa0\xdec\x19Վ%p\x90\xf3\x01\xa3\xa3\x8b\xb0\xa2\x97\xec\xc9\"\x87\b覫!V\x81\x0f\xa4S\xa2`D/\x1b\x8c\xe2\\d\xab\x1d\xb5\xc1\xc5\b\x04\x18\xfe\xbc\x0e߄[\f\xa2Vy!\xac\xa0UE\x87\xaed\u0085\xa3[\x82\x00\x04[F\x15\x87ص\x87¨\xb2A\x85C\xdd\xf5\x16\xdbV<4\x0f\x80\xbc\xa1\xc5m,\x80i\xb5\xfd\xa5)C;\xa5w\xe8\xf6\xc2f\x9c\xdc\\\xd8N\xbf\xfb\x8b\xaar\x1d\x8f\x8d\x04\x89\x9b\x0f\xdc\xc0\x91+\xc0K\\ \xda֊\xcblm\x8b\x06\x8aN\x9f\x9e\x14\x81\xcb\x12\xe8\x8d}W͠\xbd\u07b8\xd5\x1a\xcf\xf70Ӯr\x93\xb6a\x94#\x0e2u\x1e\x9f\xcfSǼT\xac\xa0\xb3!z\xff؊\x96?\xc0\x06\xb7\xdf\xefn\x80\xf7\xed+\x8bk\xf8s\x18\xfa\x95~\xe4\x1c\xb1\xa6\xa5\xf7W\x84V\x82\x19\xac\xdb_\x96\x97W\xe6w\a\x1e>ҁɅRS\x96\xf3\x14\xfbI?\xfb\x0e;\xe5\xa6|T\bɢqj5\"#k\fU+\xcc\x02+\x1d\x06A\x1a\x8514\xa7r\xd8F\x1b\xb0t\x10\xa4y+IN\x87y\xa2\x87\x91\xd6\xc30\x8fMYcX\xa3\x9d\xe5\xfc\xa1\xf2p\x88\x0e\xd5\x03\xecdW>\xa6\x83q++Z\x04b\xe8m\xb1b\x1f\x1bilˊ]m`A\x16\xdd\fZ^\xf1\xbd\aL\xc0\xa4\x96ޒ\xce|X\xfa\x15b\"ku\xd2~p\xe3t8\x0fBf\xd4x>[\x0f\xa8&\xe9cf\xae\xfe\x0f0{\n\xac\x12\xa4\xc9\xf4]\xe6\xd3\xf0\x16\x0e\xf2\x00\xba\x1f3\v\xc3\x14̟y~&\xcfH\xef3P\xf1\x11\x93\x86|m\x17\x18\x0e\x15][`7T\x82GY\x1a\xd4rfn\xf5\x95,\xbb\x8e\xe5\xc6\xd1\xeck\x1c\xfb\x15\x03\xf5f\xe6\xa7\x1cx\xe7/oK\x89\x13_\xbd\v\xb6\xbe\r\x86\xfd*{\xfa\x1d\xd0\xf4\xb2t\xb0\xfd\xb3\xd1@\xaf\xa4\x93\xcd\x1c\xdc\xfb2\xf8\xf5#g\x1f\xfb\xf3=\x9f\xc3\x15/\x80\xa7\x0e\x9e{\xe6\xe3\x9b\x16Lg\xd85S?\xe8\xf9(\xbfl\x15K?òc\x0f\xb0\xf4\x9f!\x04_0\xc0\xc83\xc1\t\x1c\x98γ%\xb3\x15\xe0\r\x15\xbd\r\xdcɰR\x19O\u05ce\x87\xdc\x15-\fS\xb1\x94\xa3\xaf\xa4\xe9m\f\xb7r\x1b\xcd\xc2;\xd9\xfe<\x9c\v\x8d\xfc\xe3ɪ)\xed\xd71X\xf0\xf3ɫ\xa1\x88l\xe9\v̊%\xe7\"a \xe6\xd6\x05\xe7\t\x03ΘG՞\xd2\xf6\x04\x97v'b\xd1X\u009d\xe6\x12\xed\xa5\x1e\xf5\xb8Z\x98\xa9\x1d\xf7ȝ\xef܉\xfe\xe0\x06\x93\xae\xbb\xab\xe1l\x86 f\x1cm\xe8\"&\x1b\xdd}GPX9{ΰ\x12&ߐ\xa7R\xe5\x19\xf2\x99\x92asfW\x8e\x981\x03\xee^|\xc7\x1d\x8b\x17\xddq\x874\xfa\xa8\xcet\x12\xdf\xce\x12؍\x93Dӻ'w\xcc\xed'\x90wTRE\xd4dj\x01\xb1\x9f\xcbi\x81\xa0\x11\x8b\xe9}\x1d\xc4GU\x037\x1b\xafc.\xf1.}\xce!.zs\xcbE\x18m\x8c\xfcj\xa5\xd1\x111\xaf\x81\x1fݐ=\xda0Z\xe9,\x19S\xce\xf2qK\x89+\x12\x8a\xb8J,q\xf8\x98\xa0\xed&\x00ʹ\xe3\x80V\xd0\n\xe7)A{\x96\xa0\x8a0\xa87\xd3\x1bЫ.B\xaf,=\xe9\xab\x1d1yd\xa4q\u07bc\xc6\xd2΅mIƣ\xb6*\xd1?\xab\xda\x03\x18\xd4\xed\t2\xb3|\xec\xdf*\xb80\x96\xb8\xf6\xc1V\xc3B\x0e'G!\xf3$\xf9h\x8c\x1bB\x8d\xa1Va{\xe1(\xec\xa3\x00H\xde\b\xf6\x82e\xe7\xe0Rz\xfdq\x1b\xbf#.O\x0f\xe5\xb2\xd3\x00b\xea\xd6{\xd6o\xe5\x882E\xda+\xb9RGqaaa\xb1\xa3\x94\xabl\x8f\x98ZR\x90J\x8d\xdd\xf2\x93-[~\xc2\xf8\xfa\xab\xd2[\xf4ٗ\xf5\x16\x8b\x1eV\xe8-\x03T\xec\xd1l\"\xed\xef\xef\x80C\"\xd0,\x1czw0\xbegѬJƩ7+\x95f\xbd\x93\xa9\x9c\xb5\xa8g<\xacDžo\x91\xfe\xd0\xe7\x80\x02\x98*p\xc9\xf8\x00\xd4\x17RG\xe1oҟ&\xe5\xef\xd3%c\x03^\xdc~[\x88$\x81\x89\x04[⑩.\x1dw\x03ػ\x9f<\xc8\x1fG\xf9wą\x01\xb4u\t\x17\v\x97\xc0\xb5a\xa8\x96\x94D\xa5Z.n\xd8\xeb\xff\x83&E\x14\xf4uF\xc6\xfa\xee\xef\x9f\x01C~\xa3\x99\xe5\xebL_\xf3\xbe\xdd3\xfe\xa2\x16\x06ϐ\xe6\xcdv\xf75䙾\xd6\xfd\xaa/\xed\\\x9c!\x04\x89\xa9\xbc\u007f\x13\v̫\x17zB\xd7\xc0\xb9\x18kh\x14\xa0y\x838!\xf5\xc9 \xb9\x84G\x96\x9dJR\x86^ό\xbd*\x8e_\x8a\x9b\xd74>\xf5\xdaS\x8dk6\x8b\vA\v\xb8\x12\xb4\\\x9b\xd36\x86\xa7n\xfaLz\xfc\x89#\x03\x14\x06\u007f\xbe\xfbUC\xcbر-\x86Ww\xef\xfa\xe1\x0f\xe1a\x19\r\xfc\x14HI\xb7I?\xfe\xeb \xc5\xc2\v\xf52P\x01\xaa\x98\xd8j\x88&\x8b\xf9\x82\x9a%v\f\x99s\x1eh1[M\tћ\x8e\x87r\x95\x85\xaf\xc8%݈\x15$wH\x8f\u007f\x86\xcad\x96\xdc~A\xad\xf1\xf6\x86\xcf7\x83ś?\u007f Wa\x8eº\x94G~\x8c*|\xf3M\u007f\x05\xad\xe4\xf6\xb3\xc3^\xfd\xe6nY\xd7R\xfa\xe8\xeeo^\x05\xc3zz\x0e\xe4j=\x10\x8f\xc5#[ۀ\x01C^\xbaW\x81\xc1b\xa6H\xadR\x06\x01o\x05\xc00\xe7\rsd\x17\x91y46~ZC\xf1\xcb7\x9e{\xf0Ɨ\x8b\x1b\xa6\x8d\x8f\x8d\x1esݳǟ\xbdn\f\x928d]\xec\xa2I\x1b\xf7\xec\xbcU\xba\xfa֝{6N\x82\x9f\xebJgnys\xf3]\xef\xbf\u007f\xd7\xe67\xb7\xcc,\xd5m\xdc9\x1f\xe5F7\xcd\xdf\t\x85\xdc\xcb|s\xea湟\x013\xbfi\x13/\xfd峹7\xf7\xf9\x9bfe\u007f\v6ʏ\xf5z\xfb\xf5&1>\xa0+a\x83\xdaK\x00;\xf5\xa1i\x0e\xe8\nc*\xda\xdfk\xaf\x18\x13پ\xed\xb9m۞\x03\aΡѕ\x96\xb9\xa4s\x84\xd60\x99\x1f\xc5\xf4\x8dHzBτ\t=\x8bgW\xb6\xb6V\xce\x06O\x11R>\xbb\x9f\xed\xfe\x06#9\xb1\xaf~\x93\xe9\x1dVs#\x02\x86y\xef\x1d\v\xb0nI\x11UM\xb5R\x9d\xd4\x1c<\x9e\x92}H$\xbe\xcb\xdbո\xba\xdf6\x9c\x0e\x8e\a\xfb\xc6K\xf9\x8d.\x1a^\xfbP\xe3\xf3\a\xef\xdd\xf6\xe8}M\xb1̓\x99X\x93O__\f\x1e,\xae\xef!\xaa0\xccr\xd4\xc5I\xff\x83\xe8]\xa5\x9e^\xe3H@\x9c\xae\xe4L\xa4d\x93\xa9\xbe\\\x18LӤ\xfb\x1a\xc5\xf9\x81\x1d\xbf)5mb<\x93\x89O\x9c\x96J\xb7\xb5\x81\x83D\xd7F:ya\xec\xec\xf3\xe7\xd2\xef\xd0/\x11,%\xed\u05ff\xab\xff\xabv\xec#\xd9\x1c!\xc0o\x1bS\x83\x83\xe2\xec \r؋\xc7\xd8K\x13\x12n\xc7\xfabiBq}\xbf\xd6\xfc\xef\xb7c\xcf\u05c8丣\x83\x87\xcf&\xd4v龖\x04\xef\x90V\xcc^p\x8c\xf4\xc5%\x1a\xf1Bڹ\xc3L\xf7YL\x96\x03\x87LH|\x94\x9dF\xfd\xc8N\xd0\x19\r\xd0\xef\x83F\x83\t;9d\x88\x923Y\x99\x02\t\x11o\x80#A\x86\x93\xbd\xd9b玲I$^9J ^\xe6\x8fo\x9c\xfa\xe0\xf8\xf1\x0fZ*E_\xaa|D$\x9a_\xb6\xe0\xa1k\x0e56\x82\xad\xab\x90\xb82\xe2Ʃ\xc3\xd6Lmȟ\xb1x\x97\xf4\xe1\xef\xb6m\xfb\x00\xb8n_\xf7ɱ;'\x1c\xb8.6\xad\xaa\xb6\x01~\x8aģJ\xe9%\xe9E\xe9g\xd2/\x8cE5\xcdE.Ì\xce\xc5sn\x97\xb68ڗv\x0e\t\xb5t\xa4\x1d\x97\xff\x02D\x1ex\x10\x14\xbdr\xf9\xf0\x1b\x9e\xfd\xfa\xda礟/j\x1e\xd1\xda;\x1e\xccQR\xecnʋ$\x86;\xa9\x9f\x12\x1bO\xa26\x85^G \xcb\x10\xb9Ez\x03\xd1\xf9\x0f\xf6Y\xbe\x92\xefg\xbe\xa0&\xd1\xebU\x0fuB\xb2\xa4\x86\xb2\xf4W\x88\xb0\x90\xcd\u007fY{\x12o\x96\x12\xc4\x18\xa23A\x96\xd8\xf0\xc2\ac5\xbbY\xa2Y\x12\"q\xc0\x1a.\xe8\x0f\xa4SF\x82/\x84\xedMeg\x98H\x82\xf9\xb9\xd7\x024\xf5\xb3N\xbd\x1d^\x1e\x12\xbc\xf53\xcb\xd6\\\x11\x9f\x00m:\xb3\x92\xad\xf7\xbb\xce\x1e\xb3\x87\xfc.\xa6\xd2\x1ez\xb7\xd169lP\xf3\x86P\x14\xa5\x18i}\x91\xb5\x81Vi\xabD\x96\xa1\xbd\xa1Ty\xa8\xd0\x157\x00`\xe2\x1ck\xee(\x1b\xd6\\fs9\x84H\xbc&R\x13v\x1a\x14\x1c\xadPi\x8c*\xab\xb3@\xe5h\x18^\v\u07fcN\xa8\x1a5\xcekpW\x8dV>\x11IV-\x80\xa2ZP+\xbcB\xf3\x953\xbb5p\x8e%\x9f\xd6o\x04N\xb0\x1d\x8c\a\xc6\xc4\x02\x87ਟ\xdbq\xec\x1b\xe9\x8fo\x8c\x9fD\xdb\r6q\x83+\x1c\xb2\xa3\x1f\x1c\xb1uVh\x8cY\xa5ᔅ\xf1\xf1ё\xa9BV\x13ӊ\xf6\x91\xfa*\xbd\xcdb\xab\x04\f\x03K\xdd\xc1\xbah\xb4.8\xb3\xae\xc8̲\x906\xa8\x8b\x9e_\x9f^\xb7d\xf1\x9ady\xa4ԠԘ]B\"ђ)\xc5\xfe\xa4,\xa2\xdai\xb5\x8d37\x8fܿM:\xf3_\xde\xf6i\xb5\x1e\x83~\xd8X\xf5\x1f@\xc9\xe6\xe3\x8b\xd6,\xa1-\x1a\xabѬ\x14\xf2\x1f\xd8,}\xf4pa\xff\xf5\x86<2\xeb\v\xa9\x10\x8f\x848\x11\xbb\xa9\xb2\x8a<\xa8\x04|\x1c{\x80\xb9\xc8\b\xfbޝʰ\xf7\xdc~\x97Ő\xf7;\b,j^-\xcd@\x14\xb2\xf8d\x06.\xbe\x84=\xc2\u007f\xc1\x1f\x17\x874\xd2cj\xa7\x8d\x1f\n\x1au\nV%]\xfb\x918\xff\xde\x00\xdc})\x83\x02\xaeϷ\x93\x96\xec$'\b\x0e*\x95\xd3\xfdK\xa5\x8d\t\xa3\x1bX1\x8a\xa2l8HH̛J\x9b\x89\x9f\xf041\x84\xb4\x18E!gy\x83\u007f\x10\x8f,\xcdU=U\xcd=M5账\xe9\x19\xa0z\xa6GV\xf2\xeb!\xe7=G\xc9?l\xfc^3\xdbB_\u007fn\x95evM\xdb\xd6\x12\x9a\xc2IY\xaadkۖg\x9e\xd9\xf2\x94\xf45\xe0\x9f:\xb2\x19\x1eñl\xe5fp\x9dl\\C\fl\xfe\x9f\xa8;\xbc>\xfb\xffm\xdd\xc1\xf5\xd2\xffJ\xdd\xcb\x13\x96\xff\xf5\xba_\u007f\xfd\u007f\xa7\xe6\xfd\xeb\xae$\xf3\xb2\\\xfb\xbe\xba\xa3\xb9\xe4?\xaf7\xfa\xfbwj=zŊ\xd1\xffq\x8d\r}\x18Lx\xa5\t{\xabo\xa6FQ\x13\xa8.j.\xb5\x94ZM]Im\xa5n\xa2vQ{e\x8f\x17\xa0\xd7W`\x14\xa4el\xb9|cΑJJ\xb4b\xecL\x98sI\xcd\xe4\xec\x80R\xbd\xf1\xde0)\xa7\x04\x06\xa7\x0f\xce\xff-\xf7\xf7\xde\xc7\r\n\xd9;U\xaa\xecM*\xbb\xaaC\xa5*\x1e.T\xb4\xcc]\xb8\xeb<\x85\x19\xe9\x85\xcf\r\xebz\xad\xa3\x18]ʗ\x15u\xa7\x90@V\xe4\xcdޗSޕ5\x82\xa9\x01\x89\xfd3J'\xfaGr\x19d\v\xe4)\xfd\x8e,\x8f\x9e\x83ꁪaW\x15w\xfeiְ]\v\xcf\"F\x1ds\xf5\x1d-aאb\x95J:D\xee\x9br\xd11I\x8a\xe8\xf9\x96\xab'.J\t]\x94\x82-[\xfb|\xf5\x05\xa9\x12\x82\x98:\x94j\xa36\"y\xfbF\xeavj\x0fu/\xf5\b\xf5c\xeaY\xec\xc1\x17\xefx\xf5\xb1|\xc4P\xbd/\x86\xfe\xa8A\xdaޡ\\(\x0e\x8a\x87.\xc1]V\x83\x1c\x1e\x9eH\x96\x15\xd1\x04\xc4!\xba\xe9O6q\x91\xfa\x96r\xbe\xad\xfc\xc1\xe9\xbdq\xaeGv\x8eX?$K\r\xa9\x17\xb4\xd8q3̘\x9c&\x93\xb3\x83\x1c\xa3丣߹|d:dn\x1dI&\xbb\x16.\x1e\x19\x9d\x1f\x11\xd5\xeaB\xb5Zz\x89\x04b@\xe9\f&\xca[1\xbe㹞\x8b\xee~\xe3_\xa6\xc8O\x03G\x8f>\xb0\xea\x05\xfc\x84բ\xb8\xd4h\xb5\x1a\x9f^\xf5\xc0Q\xf0\x03|\xcd\x14\xedw4]\x94\x92\xed\x13\x0f`\xcf\xc2]\xa3\x04\x9dw`増\xc7\xfd\x18s\xc9\x04\x8e^toǿL\x91\xff\bψu\x1d)VB\xe3l\x86\x1aN\xad\x90u\xbcx$\xce\x12V\xce\v\xcc\x186\x01\xab\xbe\xe2\xff\xd8}y\x00\xf1q\x84c\xc3<$^\xe6G\xdc\x1fV\x17M\x05\xd2)$\xcf\xf7\x99U\x98e_y\xd8[\x1e\xc0\x8ań\xbb$\xf6`xK)J\xf6_Sn@\x9f6z\xf2D霘\xe71\x82\xa3\xd0-\xfd\xed=\x05F]` P\xec{\xfe\x88\xf4\xf2\x8f7\x9c>0\x1d\x80\x9f\xed\xe3!M\x03\x05\x04z\xc5m\xa7\xd7)\xf8\xd5?\x05\xf4\xcd\xf7\x80\xd8\xfb\x9b\xb3\xa77?\xbdy\xf3\xd3\xe0\xe0\xa2i\n\xc4\xdbXyUUê\x97Vl9\xaaU5\x0eQ\xf1y,4(\xa6/\x82\xf45\x1f\\}\xcb?o\x05\x93&,{w\xe6\x94)3\xdf]:\xf1~@}.m\x98@k\x94\xa5&\xaf^I\x8f\x01\xf1'\x1f\a%\xf7\xab\xf8ŏ\xfcq\xe3\x93\xd2\xeb\xa3i\xa5%O\x19\xd3(5L\xd5\xefA١\x9b\x01\xfb\xfcz\xa5j\xc5q\xe9\xfd ~\xe6\xe6\xf3\xd4\xfa\xb7\x87q\nU\xb2@\xa5J\xed\xe8X\xf6\xf4\f\x8d\xfeg[\xa6\xde_\xa3RE\x92J\x05\xd7rb\xe3\xe6\xd3\xd7r\xfcֿ\xe6|\x93\xcbv\xc5\x02\x9a\x0f\b\x9a\xfb \x94e4L\x9cE\xdfCލ\x90\xe5f\f?\xdc\xdd_^\x01r9\x00\xdb-R\x83\xe57~\xc0\xbd'\xc9rfna\x88\xee\xf3\xef@S\x1a4\xd6S\x11`\x8c@4z\xcb\xeb\xb29\x14\xae\v\xd5\xe9\xab\x13Me\x11\xa1`(x$\xef\xd3\xe8\x01\xd9\xfd\xbd\v\x01\xb0[vr\x0eQ\xa6\xf3\xe8\n\xa4p\xba\xbc\x9e\x88\xd3\xf1\nAW\x9f_v\xfc\xee\xd8\xd7.\x15L\xa7\x921@\x0e!\x9f\x1e\x84Cd/\x12;)̡\xa0X\x91\xc4?x\xa5\xee{;T\xaa\x8f?V\xa9v\xa0a\x15\x85vՠ8\xbc\xac\xff\xab\xbf\xfbm\xd9rqF\xe8ߦt\xbf\xfa\xc9\xeb>\xff\xb6_\xdcA\xb5\xfc\x18?\xe7\x81\a\xe4\xe7\xa0P5(~N{\xf1'\x06\x0f\\:o_\\z\x95\xa1\xba\aʬ\xbdc<\xa1%\f\x84}\x11[\x1f\x05\xf1\xecJ\xe95\xb6\xfb\x12<<\x98\v\x93\xd9_\x81\xe3\x97\xe2\xd7yR6$\xba\x1f\xd8\x17k\x94j\xa4~F\xbd\x85\xadLt\xe8\xb5\xeb\x00\xcbɦq\xd8N\xce\xda\xd7DrÄ{\xaf\x89\xe6 \xe9\xe6\x04\xb5\a\xf5x!E\xb6\x00\xf9:\xe0\x01\xa90\xde\xf0\xc4r \xde\xe9D\x17\xd18\x82\xf5\xccҡ\xb0\x8fhWaY\x13[\x9fp\xe8\x02\xbe\x8eq.\xd1p\x83Qr\xf0Fv:\n\xf9:&!\x12=\x19Q\xbeΊ\xd6PXǠ\x01&e\":\xa6آ}0\xf6\b\xab\xd6\x17hԺ\xa4A\x9a\xa2\xb0\xf2\n\x05oU\xf0{\xfd\x1a\xbf6\xa4\xd1\xc8\xc1:\x9c\xc4+D\x03\xb8\u07b73\x15\x8a2-m\x99\x10\x14y\x81\xd3\xd1,ͿH[\xbd>\xae`\xd2P\xa1P\xa3\x81\x01\x0e\xd0tQ\x05\xa7Z8\xaef\xb1\xd3\xcd\a\x12\x9e\x92\t:g\x8dA\x1b\x0f\vQ\xadV\xab*)\xd3Bȃ\xa0\xdb&\xfa\xe7\xf8\xf2\xa7\x1c1\x00\x95^o)*\x8c\f\x17\xa0\xd2k\xb4V\xe4y,Z\x9d\x82/X\xc8\x02\xa7V˸E\x8f\xa0\x87J?\x14m\x85\x82N+\x94\xbc\xf4\x84g\xc2jGl\xd1\xfc\xfa\xf0\xdfч|\f}\xb1\xc7\xc8\x17kC_\xac\xeds&`4\x16\x98\x8cl\xe0-\x85B!\xe2W\x12;\xfcZmH\xeb\xd3\xfa5\x9a\xb0ƿ\x1a\xa7+\x14\x06qJ\xa6(\xe4l\x9b9\xc1\xec\x0e@\vgQY\xf4\xa29O2\x99]:\xb3jXڠU\x03PRb\x8e\xa8Ty\x1d\xf1q[T|\xa2,1\xbb%\xa5g2\x15\x8bWZ\xd4B\x9e\x1d\x80\xb8\x13\xdd\xe4bh\xe7\xf4\xeb\xcbu\xa2aI,\xea{b\x98A\xad1٪D\xa3P놜\x12\xb0z\x96\a|$X>\xb7t\xde\xe5\xaeB\x8e\xe3\xe3\x91\xfa\xea\xc6\x06wʞ\xe7N\x85\x8a\xbdj\xdba\xa0\xecNn\xaa\x986~,\r\xc1\xbaKڠ\x83\xbeuX\x8c\x10h\x14\x89}y=HЂ\x9fh$\xe6\x16\xa1\xea\x18\x94\xc6A\x8cT\xe3\xcfg\xcb\xf1w\x17La엪\x9c͏\xa71a\xe0\xfcx\xdd\x0fr\xf3\x1e\r\x06\x9bJ\x8c\xf9\xf3t\xfc<\x97\xbe&5Q\xfa\xc7\xc4)`\x8e\xbf\xac6\x16/4M\x9b\xcc%\xd8\x1d\x9f\x94\x14go\x90\xb6oj,\x03\nZ\rcM\x9b\xc0Z\xf8\xdc\xf5\x9fp\x06\x86\x9d\xe6\xf5Lh\xce\xfe֩gGdW\x00\x96\xa6a\xc9\xf0\x9b\xa4\xe7\xa4\xe775Ł\"\xfb֨VFm\v\xd7\x15\xbe\x17\x94:jY\x0eh\xe6ڴ\xa5i\xb8\x19\xec\xf8\xb26\xaa͛\xabq4e\xa7Mݰn\x951\xb7\x1fBt\\\x8cT1U\x8ax\uec79\x95;$\x0f\xe8\x18\xbf1\ue99d\x80\xc5\x11H\x14\xaekh\xccb\x93Ą\xd1\x0fЏ\x0f\x85\xfdH\x84\x13\x12\x02\x8b\xba\v\xeb\xf3\xfb\x8a\x801\x9e\x10S\xe1\x10[.\xdbs\x94\xa3\f\xe9Kګ\xdc\x05\x00d\x15:\xa5\x12I\xef\x10\xd4\x00\xc0\xa8\x15J\x96\xa1\x19\x8e\xe5\x14,\r\xce~\xb0~=8\xbcp\x9fӬٻ\xa8dd\x11x\x80\xa5\r&\xaf%b\xb4(\x98Ns\xe0\x81\n\x1a\x80ZF\xefsE=\xab\x96\xf2\xeeX\xdc\xfbx\xff-9\xf8\xe1\x11FT\x18x\x05\rʡ\x826\xb0\xe2\xacu\xc0\xaa\xd0sJ\xd5n\xa8\xe2\xd5\x1c\x06\x18\xe0Ԭ\xee\fxO*\x00\xef\xfd\xee\xb6\x11(\xa8\x90^\x06\xf5\xbaF\xab\xc1fа4JH\xec\xae۷\xc5\xe5\xf5\xeb}wI\x05\xee@-m\x1a\xb4\xd7\xc1R\xa5硢\x95\xfd'\x9a\xd1,\x94\x1d\xb5\xe2\xcd(1\x14&^\xcbD\n\x0f+1\xac\xd3/\xe0\xd1\x04\xe0\xcd\x05\xa2\xaa\xc9\xd7\xd1\xd8\xf3\x05\x1f\xc2J_\x10\x8di\xb0^F\"\xe0\xd1\xfb\x87\xb1\x815\x1e<\xd0M\xd8ҍ\xe7\u009c\xdfKѾ\x90\x9f\xc30\x04\xa25J\xc7@\x14\xe5\x83\xd6\x1cc\x84\x87\xb2\x00\x83\xb8\"f\r\xc7j\xa3W.Z\xe51\xeem\x00\x1dҴ\xfbm^\x9a\x19\x17d\xd7\x17\xf9\x8a\xdd\xec\xfe\roJ\x1f\xec\xdb)\xfdm\xa1[_s\xdf\xf7\xb6E\n\xf2\v\x94\f}\xe5/\x0f\xaeof\xf4\x15\xbe+\xbe~\xfc\xd6`P\xf4\xdb\x19]\xf9q)\xbb\xedH\xe4\xba\xed\x1b\xc3\xe1\x9b\u05fex\xa6Ego\xfe\xfd륾ᝁ F\xcbi\x01\x88\xa4\x8d\xfe \x1a<\xa2\xc3\x16\xc5]4d+\v\x1a\xca\x12>\x85P\u007f0\x03\xd5c#ۜ\xe5z\x9fw/\xf0\x83\xca]\xbf=\xfds@+ܳ\x97<4\x91\xf6\xbd-\xbd\x03\xab\x9d#\x9fH\x95w\xdc4\x04\x96f\xc6EEi\xef\x01\x10xk\xe3\x82\ueab9\x89!\x16\x8e\xa1\x81+\x18T\xa9-\rm5\x81\x15_Vq\x91\x86&[\x9eA)\xd8f\xe4\xcd\b\x9a\x99\xee\x03ӆ\xa85\xd6\xd0,\xb0\x01(\xb7\xb5\x1d\x97>\xb9,_mW\xd1`\nЂ\xf8\xc6\x05\x9dv\xbb\xa69t\xed͛\v\v\xa1Eo\xcfs84*O\x8d\xc2{\xfb\x8d\xaf\x1c\xbcl\x96ӧo\xa9\t\x8d\xbaLjF\xdf/x^ý\xc7\xfe\x8d\xb2\xa2^\x90\xa1&\x12\x8fS\xa9P8\a\x8d\x86\x15>\xf8\x14\xd0A&\x80\xb9\xcc::\xcdف\x06 V\x937C3\xf1!D6d\x00\x1b\x05\xc5\xe8\x02\a\xad!X\xc7\x10|y:E\x85\xb1_%7\xa3\xa3\xd1\agk]\xc3&Tm\x9bc\xd2\xe8\xfdVO\x95#P_\x14\xcc3k\xd5*\xb0\"\xf9\xfc_\xa4/\xa4o>\u007f|\x1e\v\xf4\xaa\x10\x93\x98\xff\x05\x18\a\xba\xc1\x94\xcb\xcd\xf0\xcb1\xdb\u007fr\xfc'\xdb\xc7\xc8\x01X>\xe4\x8fҧ\xd2/\xa5\xf7%\xe9H\xbb\xbb\x8c\x1dyӳ\xa7>\xfb\xfb\xe9\xd7Z\xf3\xabj4һ\xffT@h\xdf\xf8\xc6\xf6n\x8bu\xf6\xad\xa7\xb6/~\xe6\xc0L\xf8y\xf1C\x95a\x97\xd9aU\xb14\xa3Wi\x83\xc1\x82@~\x9e\x16d\u007f\xb9\xe9\xe9\x19y\x89\xcdG\x81\xf5\x9e\xc8\xc4\xc8Z\xedqi\xab$ݥ9p\x8fC\xcb@\xcf\xf1\xe7\xf0&\xd0sr\xc0\xed<>K1\xe6ѿK\xf7\x1c;\x00J\xfe\xf6\xc6\xf7\xe6D\xac\xe3\xef\xb9,~\x93t\xd5\xdf\xc0\xa4&\x16\x95<\xf5\xb6g\u007f\xfd\xfaOvL\x86\xee\xd9;^\x97\xf5I\xc8\x18C\xf6\x01\xf1\x1aJ=\xd1\xe9^FmB}d\x1f\xf5C\x8a\x12,~\x1f\xf6P\x89xG\xec\xb92\xf1?\x8d\x0f\xe6\x85\xd0XVD~\xe5\xd8\x05h\"^\xfe?\x8c\x1f]n(5\xa0\xbf\xe5\xdf\x112?\xaa(8w\x14\xfbL\xa53\x05\x15\x881\xfa\xee[H\b\xa8\x1e\x83\xc1\xe0E\xbf\u007f\xf7l\xff7\x19\xfc\x18\x16?\xec\xac\x02\xa7\xa0+\x9f\u007fG(\xeb\x10\xc6\xd0\xfc6\x06}\x9b[0\xaf)\xdb\xe1ư4\x15\n\xd3A\xa3\x15k߄b\x80\u061d\xd4\xe2k\xc4Ŋ\x91\xa5uX\x84\xeeU\xf5#\xf8)V\xb6\x04\xb0\xc4\xea\xa07Ń\x8d\xcdD\xab\xc0\x1ae\x80\x95\x1ct\xb1\v[\xa7\xb9\xb1ٙ\x11\xfb>\x16\xf5@\xb6\xee\xd5\x03\xf284\xcd\x04\xb5 \x88-\u007f9\xf7\xa1\xa7\xadZ\xad.n}:\xad\x8d\x0f\xd3Ε\xfez\xdc\x00\xf3\xf2#\x86\xe5\xa1dh\xb9!\x92\x9f\a\rǥ\xbf\xce\xd5\x0e\x8bk\xd3O[\xe3:\xad\xd6\xfa\xf4!\x97]Y\xe8\x02)\x02\f\xf9\n\xa3t\xf8\x18\xbb\x03\x17dO\x8a\xb9r\x80\xfe\x12\xe5\x00\xfd\xa0r\x1cv\xc6\xe7P2\xd2+\x04\xd32\xe5*T\xda\xc1\xc1\xfcEڄ\x15Uj\xe1\xfePB\x15\x04\xc5wK\xc7Θ\n=\x82\xc2\xd4\xf3\x0e\xd6\x05|\xa7Ǥ\x10<\x85\xa63\xa0\xf2n魠*\x11ڿ\x10\x95fMh\x17\xe5s\xd1X>W\xb7gO\x1d\b\x14\x17\xb2\xb8\xa4\xa8N'\x17$\xbdu7\xa8\xbctAұ\xbbA\xf1\xc0\x82\xd8\xc2\xe2\x00\xc0\x05q\xf9\xb1h\xaf͌̇\x9b\xb0D\x050\x93\x8b'\x15\x0e\xcf*\x01\x93\x12\x88&4\x870<\vBXFF\xe3V\x80}\x9eo\xdfq|\xd5\xe5\xef\u07fb\x80Gg\xbf^\xb5\x1b\x98\x1f\x06ä\x83kש\xd4G\xa4\xb7\x8e\x9c\xb3\x81Nr\x0eJ\x8e\x1c\x82w\xc1\xe9\xab\u007fs`\x0eϏ\xba\xf9\xf5U\xe4L\xb9\x9d:\xcf\xd4J\xf7\xac\x92^\xb9\xef\t\xe9\xe5c\xb6k@\xe7\xe5 }ߓ\xa0\xe2\x98M\x9c$\xaf?\xe6\xf0\xfft\xa8^\"\xaaY\x8a\xf8\xa0S\x03\xbf\x10N[yļ\x94\x00+\x1f\x0e\xa2\x1f\xf3]p}\x8f\x1fL\xfc\xf0\xa1\xb2\xc7FY>\xb7HCA\xe9\xd5\xd2qp\xe2\xf3y\x9f\x81M?\xedx\x0e\xd6\xe2\tMzA\xfa\xe0\xcd\r\x1b\xde\x04>Dm\xbe7\xffr)y\xe3\x9c\xf4\x04蒾\x0fV\xe7\x97͍\xc3\x05\xa8\x94\xab\xd7\xcc\xfbl\xee\x941ύ\xe9\"wm\xe8_\x12\\s\t\xae\x10ɬ\xe7\x01?\x85=OM\xa2fR\x8b\xa95\xd4U\xd4C\xd4\x13\xd4\vԫ\xd4{\xd4G\xd4\x19\xf4\x8e\xd8\x06\xa7\x0e\x84eHa\x1a[\xe2\xa0y\x1a\x8b\x18\xb4\xec\xef\n\x9b=sD\x84 R\x82U\x94W%Rd1\xc2\x1a'\xf3=\x9euR\x8c(/_\xd4\x01 \xea\x009\x11\xa9ܺ\x05ַ\x13I\x97\xc4\n\x8c\"\xba%\x8c\xb3\xe4\xd6;\xa20\x95\xc6ݎ\xe0\x95\xa6\x10\x93\x81\xd8b\x90+M\xbe\x81\x94G`\x8dp\xb2\\\f\xe8{\x9e\xd8?sX\u0381R\xd9\x14\x13K\x96\xd0\xec\xc8\x16V7\xaf\xc4M3\x90\xa7y\x96\xc7>\xd0\xd5\n\xb5\x9as\a\x1c\xc0\xa0\xb4h\xd4)wd\xa1\xd5\x10\x0f\x16\x89c\x9a\xdd\x11\x13\u007f\v\xcbyt\x0e\x0e\xce\x04\\\xa2\xd9̌m\xe7\xcc\x16\x17\x037\xf1\x9ax\x99\xb1\xa95~n\bg\xd0\xebl4mp\u0089\x1a\xde\x17Ѩ\xd1!k\tԣI\xdcdBG\x96\x114\x15CB\x1a\x87s\xc85C\xcb\x17OYb\xbejo\xad\x06\xcc\xfb۰8=vMa\xa8.\xc0\x94/l\xf2n\xdd\xf7\xe8\xb0\xe1\xdb\xd7M\x8aq\xc9f\x8b\xf7\xecJ\x9d\xd2,\x94i\xc9\xf1a\xc6\xe4s2\xb4`0:\x99{\x19\x8bY\xf0),fs~v\xb1A\xeft\xd4\x1a\f\xfaT\x1d\xfc\x861\xe8\xf5\xb8\x1a\xa82?\xd1+E1\xe5V\x15\x97\x83h\x9e\x19\xe4\xd9cO=\x1a\x9e\x03\x81\x11B@\x03\x9a\xa1\xa1\x96U\xb1\x1c\rX\x83\x15\xe8y$c9\xb4\xa6h\xa1\xf3\xc6\r\xb7\x80\xa1\xb3\x19h\xcfׂU\n\xb5\x8eׇL_\xaaCAkHq\xff>\xa5\v\x84\f\xd2\xd7\xce\xf2\xd9yJ-\xed\xb9\xdf-?\xcc\xceI'\x8c\x91<\x85\x11\x1f\xe8TJ#\x982v\x87\xc6$d\x81\xb31\xa4\xa9h0\v\x1a\x98Y!}=\xb2\x9en\xefb\xd3J0\xacd\xfe\x88N݊\x9b\x0fT\xd5l_9V9\xfe\xcaJk\xda\xc2\x0f\x99\xbem\x84\xa1\xa3{\x1e\\n.ӡ\xb7>A\x97B0\xa2\xd7f\x84s\xd5f\x1f\xc3X\n|,c\xa5\x17:\xea\xd1k;\x9cu>Cv\x9c\xde\xc6\xd0F\x9dގ\xeasZL\x19\xf4\xaa\xe2\x94W\xf5\u007f\x00T\v\xe1\xb6\x00\x00\x00x\x9cc`d```a<=\xe1|Ed<\xbf\xcdW\x06nv\x06\x10\xb8b|\xd6\bF\xff\xff\xff\x9f\x81\x93\x91\r\xc4\xe5``b\x00\xea\x00\x00d#\v\xd7\x00x\x9cc`d``c\xf8\xcf\xc0\xc0\xc0\xc9\xf0\x1f\b8\x19\x19\x80\"Ȁi+\x00{\n\x05\xce\x00x\x9c\x8dVKk\x14A\x10\xaey\xf4<\x8c\x9b,\x86\x155\x04VIL\x94,\x8a\xa8\xe8E\xe6\xb0\x1e\xbd\x88\x1e\f\x88\"\xe2E\"\x82'sj\xfc\x19\xfe\x0f\xc1\xa3\xbfJ\xbc\xadU3U=ߴ\x93\xacK>\xaa\xbb\xba\xba\xdeՓ\xcc\xd3g\xe2_\xfa\x92(\xf9ET\xd2\u007f\xe1u\xc1\xb4\xf0=O\xd6\x02'{?\x99Law\x18\xae\xe3]+t\xcfw\xef\x99\xcc\x18\xe4^\xde\xe9nD.\xd3}k\xdb\xf7zՇ\v\xce\xfc\x04\x99\x1c쯍U}ɩ\xa7\x18o9\xe4\x9d:\xf4\x1d\u038b\x94\x12\xf6\xe5;\xe3\xf8\xac\xd8FШ\x9e\a\x82\xb2\xe7O\x9c\x0f\xb9;\xc5\xdcX\x0e\x14S\x17\xd5B\xe5\x8e[x\x88\xa3\xcbe#2U\x94o\xcb\x03ا\xccC\x1e\xfa\x9a\x84\xb8\x91\x9a\xaf\xae??✼\t9\xb2Xz{\x12w\x8a>\x9f\tO3\x8d\xdbE\xb5\x9f*\xfd\xc2\xfcDe\xf2\xb8\x97\x18[\x03\xbf=픖wE\xad:s\xade\xea\xa9I5o\xc6ÞR݇\xd8G\x9c\xaf\xc4\xf2\x85=SB\xfcP\xbb\x06s\x12\xce|W\x1f\x8d+\xf8Ⱥ\x16\x8c\t\xd7\xe0\x99\x80}[0\xc2\xdel\xe4]\x8d1V\xcb\xf5\xb0\xa7\xa3~\x81ٴ\xb3F\xe7o\xc2\xfb\x85\xdeM\xd9\xc7\xd4r\xa2\xf4\xad\xe4\x89\xf1\x8e\xef;\x01\xcb'\x85\xfa\xc2\xf2\x13\x9bO^gL\xf7\xc6\xea\xady\xb9h\xb3o\xbc\xc4\x0f\xf2\xfd\xd0\xf8l7\x13\xac\x9b/\xa8\xdd\xfd\xec\x1bӌr\xa7q3}\x04=vC\xc0\xfc\x16\x85\xc1C\xaf\x13\xedH\x0fF=\xbc\x11ǡv\x97\xed\f\xf1\x9f@\xf3i\xf3lr\xe1.\xfbr\xa44\xbcC\xa5\xf2\xb4\x0e\xf3үV\xf8\xa6\xb2\xecldV¬\x8aL\x05\xfe[\xbde\xf6\xebN\xfe\x04\xdf\xe90WԿ\x0f\xe5o\xba\x15ϓ\xfaios\x1bW\x8dwz:\xadz\xfe\xdc\xeaQ\xaf\xa9Y\x84\x03\xf3Y\xfd\x9f3\xb6\xc1\xc6R\xfdy\xcc\xebK \x87>?\xe1\xf3+#\xefB\x8c\xab\x8c\xf7|\xfeJ\xfd\xbe\xadzj\xa6\a\xb5\xfa\x1e\x83\xe56\x05\xf8]@\xbdUD-\xbfP\x87v\xcd>n໌u\xc0;\x83\xb5\xd6W\xf7\xdb\x05\xe8\xd4\x1eO\xad\xaf\xe0\xbdMeFY\xbeг\x94\xd7\xed\\\xd8l@\x9d\x83\xae*\xf2!\xee\x89\xea\x0f\xbd\xa8u?\x96'\xebm\x8c\xbb\x80\xf3\x92\xce\xef\r\xcc'\xe6\xb2\xfc18\v\xfd\xc8\xf6>\xb4w\u007f\xf6\xfaC\xfcÚ\\f\xb9M\xa6\xbbc}\xa1\xef\xf8~5\xce\u007f\x1e\xf9\xf7\x14l\xcd\xcd\x17\x88mo,.\xd5}\x9d\xf7\x1fY\xef\xa1\xf2\xb3r\xa8[\xd6K\x9d\u007f\xe9\xc7\xccf\\\xf5\ay\xb7\xa2\xfdB\xbfG\x0e\xedy\xda\xc2\x1e\xb1o\x95\x9e\xef\xd7C[\xb3\xa8\xbf\xfe\xe9\r\xe0\xef\xda\xdd|\x04\xf0\xbfE\x12\xcfE@\n\xbd\xee\xe9\xae\xe4\\}\xbc\x13d<\xdd\x14z\xde\xef/\xf5\n|\xf1x\x9c\xa5\x96{T\xcfg\x1c\xc7\xdf\xcf\xe3N.\xb9\x86\x10\x1ai\xcdB\x91d\x8a\x10b!\xe3\x10\x8b\xb93\xb3i\x9bM\x86\x89e\x8c$\u05f94\x97\xadM\xc8=\xe4\x1e'4r\x0f\xb9\x87\x90i\xae!\xece\xff\xf8\u007f\xeb\x9c\xf7\xf9\xfe\xbe\xcf\xf3\xb9\xbc\xdf\xef\xcf\xf3}Nҿ\u007f\x1e\xff\x011\x92\xa9\b\x16H6\x02dH\x85\x82A\x9eT8T*\xea\n\xaeH\xc5GJ%\xc6\x02\xf6K\xb2^\xca\r\x9c\x92\x1c\xa2\xa4\xd2\x03\xa52\tRY\xde\xcb\xf1\xeeHY\xc7\xc5Ryr*УB\xa6Tq\"(\x90*ѯ\xb2\x97T\xa5\x9c\xe4D\x9eS\xbaTu\xb4T-\b\xc4I\xd5\xe9\xe7\xccz\r\xf2j\x16\ap\xaaE/\x97\x19\x00N\xb5\xe3\xa5:\x9eR]\x17ɕ\x18W\xb8\xd5\v\x94\xeagKn\xf4l\x007w\xf2\xdcS\x90G\x0f\x8fG\xd2{\xf4o\xe8\x0fx\xbe\x1f\x0e\xd8\xf3D\xb3\xe7J\xa9\x11=\x1bé\t=\xbd\xe0\xe5Ż7\xb5\xbd\xe1\xeb\x9d,5\xe5w\xd30@N386C\xa7\x8f\x03\xa0\x8e\xcf&\xa99^5\xe7\xe9;\x14\xe4J-\xf6H~\xe8i\t>\xf0\x03\xf0j\xc5^+z\xfb\x93\xefO\x9d\x00\xf8\aP\xbbu/\x90/\xb5\xa1w\x1b\xb8\aR+\x90\xf8\xb6\xec\xb5\xe3\xbd=q\xed\xb3\xa4 \xeav@\u007fG\x1f\xa9S\xa2\x14LLgr\xba\xa0\xbf\v<\xbb\xe0\xfb\x87IR\b\x9cB\xe0\xd7\x15\x1d]\xf1\xa9\x1b<\xbb1\x83\xee\xc4ug\xbe\xa1\xec\xf7\xa0fO|\xecE\xdd\xde\xf8\xd4\a_\xfaP;\f\xaeap\xe9K\\?\xfc\xeeG\x8f\x8f\xa9\x11\x8e\x8e\x01\xe4\x0f\xc0ǁ\x85\x01\\\x06\x85\x00\xce\xc1\xe0Ti\b5\x87\xd0s\x18܇\xa1}8\xb3\x18A\xdf\x11p\x1a\t\xb7O\xa9?\x8a\xfc\xcf\xd8\x1f\xcd\xd9\xf8\x1cϿ\xa0\xf7\x18\xceR\x04\xf3\x89 \xf7Kr\xc6Q'\x92s\x13\x89?\xe3Y\x1fO\xdcw\xd1\xd2\x04\xe61\x91\xb5IN\x00\x9e\x93\xf10\x8a\xd9EQ\u007f\n\xb9S\xe09\x15\x8d?\xd0'\x1a\xee\xd3\xe00\x9d\xfc\x19i\xd2O\xc4\xcfdo\x1691\xcc1\x86\xbdٜ\x8fX\xf8Ų\x16\v\x9fX\xd6b9\x97s\xe8?\x87\x9c84\xc6Q+\x0e\x8f\xe6\xc2\u007f\x1e\xe7q>\xf3_\xc0\xac\x16:K\x8bຈ\xf9\xfcL\xaf\xc5\xf8\xb3\x84zK\xd9[\x8aw˘Y<\xfb\xbf\xe0\xcfr4/G\xc3\nf\xb6\x02\x9e+\x99\xd7*\xea$p\xd6V\xe3{\"\xb5\x12\xf1r\r\xefkr\xa4\xb5\xf4Z\x87\xc6u\xcc1\tnI\x9c\xeb\xf5x\xb4\x9e\xefc\x03\xdc7\xf0\x1dl\x80\xdfFzmd\x16\x9b\x98\xcbf\xfc\xdaL\xdd-\xd4ڂ\x1f[9\x87[\xe1\x9dL\xde6\xe2\xb7\xc1i{\xfa[\xec\x80G\n\x9aw\xa2o\x17:wSo\x0f3܇\x1f\xfb\xf0j?\xfcR镊\xdf\a\xf0\xf0\x00:\x0f\xe2\u007f\x1ag&\r>\x87\xe8u\x88:\x87\xa9s\x04\xbeGXK\x87˟\xc4\x1c\xa5\xe7Qt\x1c\x83\u007f\x06\xb5\x8e\xa3\xff8\xf3;\x81\xd6\x13\xde\xe7S\xeb\x19g\xe29\xbd^г\x80o\xa5\x00\x8e/\xd1\xf7\x12\xde/\xe1\xff\nͯX{]\\F\x15e\x8al\x92)\xfaH\xa6X\xbeL\xf1\f\x99\x12\x03eJ\x96\x03\vdJ9\xc98\x14\x06+eJ{Ȕ\xe1*.\x1b-\xe3\xc8o\xc7x\x99\xf2\xe92\x15|@6\xd7t\x8cL%7@l\xe5^\xa0@\xa6\xca\x1e\x19\xa7(\x99\xaace\xaaE\xcaT\x0f\x95q>%S\xc3\x1f\xf0\xacIN-\xea\xd7bυ\xbc\xda\xc4\xd7!\xb6.\xdcꎔqeϕ\x1e\xf5\x87ʸ\xe5ȸ\a\xcbxP\xa3!\xcfF\x11\x00ލ\xaf\xc84\xf1\x04I2^\t2ެ7%\xa6\x99\xab\fw\xa1i\x1e$\xe3\x8b\x1e\xdf<\x99\x16\xf4\xf3\x83\x8f_\xa6L+8\xfa;\xcb\x04гu\x9aL\x1b\x10\xb8X\xa6-\xf1\xed@\xfb\xd12A<;\xc0\xa7\xa3\v@c'8\a\xa3\xbb3\xbetAC\b\xe0.3\xdd\xe0\xd0=P&\x94\xb8\x1ep\xfb(\x1c\x10ۓ\x1e\xbd\xbc\x001\xbd\xd1\xd2\x1b\xef\xfa\xe0o\x1f\xe2\xc3\xd0\xdc\x17\x1e\xfd\xd8\v\x8f\x93\xe9O\xaf\xfe)2\x03\xe0\xf9\ty\x03\x13e\x06\xa1e0ڇd\xc9\feN\xc3\xc2d\x86\xc3g\x14\x1aF\xd3{\fu\xbeB\xdb\xd7p\x1f\x8b\xb6o\xa8\xff\xed\f\x99q\xe4D\xf2\x1c\x8f>\xee*3\x81\xbc\t\xccs\x023\x9e\x88\xaf\x93\xa8\xfb=\xf1\x93\xe16\x99\xfd(\xf2\xa7\xe0\xdfT~G\xb37\x8d\xdc\x1f\x99\xeb\xf47\x80\xdfL4\xcd\xc4\xdbY\xf8\x1aC\xbfٜ\x9b9\xe4\xc7\U0005c2ee\xb9\xccz\x1e\xb5\xe7\x13\xbb\x10]\x8b\xa8\xb7\x98\xb8%\xccq\t\x1a\x97\xb2\xb6\fϖ1\xc3\xf8T\x99\xe5\xcce\x05\xbdW\xa2e\x15}\u007f\x9d(\xf3\x1b=\x12\xe0\xcb\x1dd\x12r\xdf\xe2w\xbc\xf8\x83s\xb5\x1aoWs\x16\x12\xf1e\r\\\xd6\xf2\xbe\x16\xbd\xeb迎\xf7$\xfcH\xe2}\v\x1enEc2\xdepϘ\xed\xeco\xc7\xdf\x1d\x9c\x87\x1d\xe8K\x81S\n}w\xd2o\xd7\x1b\xb0\xb6\x9bZ{\xf0\u007f/\x1c\xf7\xc2o?9\xfb\x99w*z\x0e\xa0\xf9 \xfd\x0f\xc2%\rއ\xc0a\xfa\x1ca/\x1d\xcdG\xe1|\x8c\xfa\x19\xf4<\xcelO0\xab\x93!\x80\xbd\xd3\xcc\xe9\f\xbd\xcer\x96\xce\xe2Q&\xe7\xf5<\xfc/P3\v\\\xa4\x16w\x85\xb9D\xbd\xcbp\xb9\x8a\x0f\xd7\xc8ˆ\xc7\r\xf6n\xfa\xc9܂\xd7-\xf4\xe5\xc0?\x873u\x9b>w\xe8y\x87\xdfwᘋ\x8f\xb9ɀ\xda\xf7\xa8u\x1f}\xf7є\x87\x86<\xfc\xfa\x1bm\x0f\xe0\U000d0f07\xf8\xff\x98\xbaO\xf8~\x9fp\xee\x9f\xc2\xed)>\xe5\xc3\xef\x19k\xcfy\u007f\x81g\x05\xc4\x14\xa0\x85{ü\xe4,\xbc\xa2Ǜ\xfb\xe2u\x86\xac\xf1\x92\xb5β\x85\x03\x00\x1d(\x01M\x00x\x9c\x95\x93\xdfj\x13A\x14ƿݤMk\xa4`\xd1R\xbc\x90AD\xc1\x8bݴ\x94\x16\x827\xdb?\xe9Mhb\b\xa5W\xea6;I\x96&\xbbav\x92\x90k_@\xf0\x05\xc4+\x1f@\xbc\x17\xbc\xf4U\x04\x1f\xc1o'c\x13\xb1BMH\xe67g\xe6\xfc\xf9\xce\xd9\x05\xb0\xed<\x85\x83\xf9\xc7\xc7\x1b\xcb\x0e\xca\xf8d\xd9E\t\xdf,\x17p\x0f?-\x17Qv\x1eZ^\xc1\xa6S\xb7\xbcJ\xfb\xd4r\t/\xddg\x96\xd7p\xd7}oy\x1dw\xdc/\x96\xcbx\xe0\xfe\xb0\xbc\x81G\x85\x80Y\x9c\xe2:w\xafLƜ\x1dl\xe1\x9de\x97\xb7>[.\xe01\xbe[.b\xcbq-\xaf\xe0\tu\xcdy\x95\xf6זK\xf8輵\xbc\x86mwfy\x1d\xf7\xdd\x0f\x96\xcbx\xee~\xb5\xbc\x81\x17\x85\x02\x8e\x90b\x84\x19\x14b\xf4Ї\x86\xc01BL I\xa7\xa4\x04\x11\xcf\x05vQ\xc1\x0e\xf6\xe1\x91\x03\f\xf8\x15K^\x99\xd9I\xae\x92k\xee\x1d\xf1&\x8e\xd2\xd1LŽ\xbe\x16\xc7\xe1D\x8a\xd30\x89fb\xb7\xb2\xb3\xef\x89`0\x10\xe6(\x13JfRMdD\x87\x1a\xebI\x18/\xc0\xd4DK1\xe4\x8aZ\x9a\xe8`*\xb3t\xc8M\x8b\x96\x1eƬ d.\xb4do<\bU\xee\xdb\xc0\x19ڨ\xd3\xfb\x10U\xeeڴ\x9d\xe0\x02Mr\x8b;\xd4\x1ag\xedzpXm\xb4k'\x17\xcdF\xab}\xbb\x8c\xe7FUF\xb5\xf9]\x81=j;௲\xd4\x17\x9cK\x95\xc5i\"\xf6\xbc\x03\xafbD\xde.x\x93B$\xa5d\xa6\xe5y\x13\xbb&\x9d\xa0_j\xfe\xfb\xe6\xe4\xa6Q\xe5>\x1d\xd2\xefº\\ՒO\xd7\xe6\xcf-\x8a9\"Z\x87\xa6mW\xb4\x85\xb4j\x13\xef\x92\xed\\DI\xb8滎\xa9\x99Si\x0ed\x98IΩ+\x95Щ\xd0})\x16\xa3\xcddG\xe7»\xa92']\xaa\x13Z\x85\x91\x1c\x86\xeaJ\x84Z\xab\xf8rl\xae$\xa9\x8e;2\xb3\x83V\xa6\xb2\xbfz\xa3\xb4\xb8n\xceM\xcf\"\x16\xcf\x12L\x1f4\xfbR\xe5+\xee_\xeb\r\xff\x88\xe9\x19e\xe8k=\xaa\xfa~^^8\x8f\xef\xc5\xe9\xffD\xf09\xa9yW\x12\xd3y\xff\x1f1\xfd\x01E&\x99\xf4\xf1\vϋ\xd8\x11x\x9c}W\x05t\xe3ȲuU\x99b'\x19X\xa6\xb7̔ؖ\x9c,O`\x99\x99\xbd\xb2ݶ5\x96-\x8d 0\xcb\xcc\xcc\xcc̏\x99\xf61\xbf}\xcc̰\x8f\x99\xaa\xa4\xf6L\xe6\xfcs~N\xd2$ݾ\xdd}oW))L\xfd\xbf?\xf8\x1a\x17\x90\xc2\x14\xa5nJ]\x9f\xba.uc\xea\x96ԭ\xa9\x1bR\xb7\xa5n\x06\x04\x824d \v9\xc8\xc3\x10\x14\xa0\b\xc30\x02\xa3\xb0\f\x96\xc3\nX\t\x1b\xc1ư\tl\n\x9b\xc1\xe6\xb0\x05l\t[\xc1ְ\r\xbc\t\xb6\x85\xed`{\xd8\x01v\x84\x9d`g\xd8\x05v\x85\xdd`w\xd8\x03\xf6\x84\xbd`o\xd8\a\xf6\x851\x18\x87\x12\x94\xa1\x02\x06\x98P\x85\t\x98\x84\xfd`\u007f8\x00\x0e\x84\x83\xe0`8\x04V\xc1\x14L\xc3\f\xcc¡p\x18\x1c\x0eG\xc0\x91p\x14\x1c\r\xc7\xc0\xb1p\x1c\x1c\x0f'\xc0\x89p\x12\x9c\f\xa7\xc0\xa9p\x1a\x9c\x0eg\xc0\x99p\x16\x9c\r\xe7\xc0\xb9P\x83\xf3\xc0\x82zj4\xf5Fj\x04\x1a\xd0\x04\x05-hC\alX\r]p\xa0\a}p\xc1\x835\xe0C\x00!D0\a\xf3\xb0\x00\x8b\xb0\x16·\v\xe0B\xb8\b.\x86K\xe0R\xb8\f.\x87+\xe0J\xb8\n\xae\x86k\xe0Z\xb8\x0e\xae\x87\x1b\xe0F\xb8\tn\x86[\xe0V\xb8\rn\x87;\xe0N\xb8\v\xee\x86{\xe0^\xb8\x0f\xee\x87\a\xe0Ax\b\x1e\x86G\xe0Qx\f\x1e\x87'\xe0Ix\n\x9e\x86g\xe0Yx\x0e\x9e\x87\x17\xe0Ex\t^\x86W\xe0Ux3\xbc\x05\xde\no\x83\xb7\xc3;\xe0\x9d\xf0.x7\xbc\a\xde\v\xef\x83\xf7\xc3\a\xe0\x83\xf0!\xf80\xbc\x06\x1f\x81\x8f\xc2\xc7\xe0\xe3\xf0\t\xf8$|\n>\r\x9f\x81\xcf\xc2\xe7\xe0\xf3\xf0\x05\xf8\"\xbc\x0e_\x82/\xc3W\xe0\xab\xf05\xf8:|\x03\xbe\t߂o\xc3w\xe0\xbb\xf0=\xf8>\xfc\x00~\b?\x82\x1f\xc3O\xe0\xa7\xf03\xf89\xfc\x02~\t\xbf\x82_\xc3o\xe0\xb7\xf0\x06\xfc\x0e~\x0f\u007f\x80?\u009f\xe0\xcf\xf0\x17\xf8+\xfc\r\xfe\x0e\xff\x80\u007f¿\xe0\xdf\xf0\x1f\xf8/\xa6\x10\x10\x910\x8d\x19\xccb\x0e\xf3\xa9\x1dp\b\vX\xc4a\x1c\xc1Q\\\x86\xcbq\x05\xaečpc\xdc\x047\xc5\xcdps\xdc\x02\xb7ĭpk\xdc\x06߄\xdb\xe2v\xb8=\xee\x80;\xe2N\xb83\ue0bb\xe2n\xb8;\xee\x81{\xe2^\xb87\xee\x83\xfb\xe2\x18\x8ec\t\xcbXA\x03M\xac\xe2\x04N\xe2~\xb8?\x1e\x80\a\xe2Ax0\x1e\x82\xabp\n\xa7q\x06g\xf1P<\f\x0f\xc7#\xf0H<\n\x8f\xc6c\xf0X<\x0e\x8f\xc7\x13\xf0D<)\xf5:\x9e\x8c\xa7\xe0\xa9x\x1a\x9e\x8eg\xe0\x99x\x16\x9e\x8d\xe7\xe0\xb9X\xc3\xf3\xd0\xc2:6\xb0\x89\n[\xd8\xc6\x0eڸ\x1a\xbb\xe8`\x0f\xfb袇k\xd0\xc7\x00C\x8cp\x0e\xe7q\x01\x17q-\x9e\x8f\x17\xe0\x85x\x11^\x8c\x97\xe0\xa5x\x19^\x8eW\xe0\x95x\x15^\x8d\xd7\xe0\xb5x\x1d^\x8f7\xe0\x8dx\x13ތ\xb7\xe0\xadx\x1bގw\xe0\x9dx\x17ލ\xf7\xe0\xbdx\x1fޏ\x0f\xe0\x83\xf8\x10>\x8c\x8f\xe0\xa3\xf8\x18>\x8eO\xe0\x93\xf8\x14>\x8d\xcf\xe0\xb3\xf8\x1c>\x8f/\xe0\x8b\xf8\x12\xbe\x8c\xaf\xe0\xab\xf8f|\v\xbe\x15߆o\xc7w\xe0;\xf1]\xf8n|\x0f\xbe\x17߇\xef\xc7\x0f\xe0\a\xf1C\xf8a|\r?\x82\x1fŏ\xe1\xc7\xf1\x13\xf8I\xfc\x14~\x1a?\x83\x9f\xc5\xcf\xe1\xe7\xf1\v\xf8E|\x1d\xbf\x84_Ư\xe0W\xf1k\xf8u\xfc\x06~\x13\xbf\x85\xdf\xc6\xef\xe0w\xf1{\xf8}\xfc\x01\xfe\x10\u007f\x84?Ɵ\xe0O\xf1g\xf8s\xfc\x05\xfe\x12\u007f\x85\xbf\xc6\xdf\xe0o\xf1\r\xfc\x1d\xfe\x1e\xff\x80\u007f\xc4?\xe1\x9f\xf1/\xf8W\xfc\x1b\xfe\x1d\xff\x81\xff\xc4\u007f\xe1\xbf\xf1?\xf8_J\x11\x10\x12Q\x9a2\x94\xa5\x1c\xe5i\x88\nT\xa4a\x1a\xa1QZF\xcbi\x05\xad\xa4\x8dhcڄ6\xa5\xcdhsڂ\xb6\xa4\xadhkچ\xdeD\xdb\xd2v\xb4=\xed@;\xd2N\xb43\xedB\xbb\xd2n\xb4;\xedA{\xd2^\xb47\xedC\xfb\xd2\x18\x8dS\x89\xcaT!\x83L\xaa\xd2\x04M\xd2~\xb4?\x1d@\a\xd2At0\x1dB\xabh\x8a\xa6i\x86f\xe9P:\x8c\x0e\xa7#\xe8H:\x8a\x8e\xa6c\xe8X:\x8e\x8e\xa7\x13\xe8D:\x89N\xa6S\xe8T:\x8dN\xa73\xe8L:\x8bΦs\xe8\\\xaa\xd1ydQ\x9d\x1a\xd4$E-jS\x87lZM]r\xa8G}rɣ5\xe4S@!E4G\xf3\xb4@\x8b\xb4\x96Χ\v\xe8B\xba\x88.\xa6K\xe8R\xba\x8c.\xa7+\xe8J\xba\x8a\xae\xa6k\xe8Z\xba\x8e\xae\xa7\x1b\xe8F\xba\x89n\xa6[\xe8V\xba\x8dn\xa7;\xe8N\xba\x8b\xee\xa6{\xe8^\xba\x8f\xee\xa7\a\xe8Az\x88\x1e\xa6G\xe8Qz\x8c\x1e\xa7'\xe8Iz\x8a\x9e\xa6g\xe8Yz\x8e\x9e\xa7\x17\xe8Ez\x89^\xa6W\xe8\xd5\xd4\x1d\x99\xb6c\x05A\xa6\x17\x05v#\x1b(\xcbot\xf2\xaa?\xa7\x1c\xd7S\x99\x0e\xf7\xc3t\x10Z~A\x8a\x9a\xeay\xe1b:\n\x94\x9fn\xd9N/\x1fvj\x8e\xe5\xb7\x15\x86\x9d\x9c\xb4\xed D\xb7\x9b\xf5UϝS\xb9\xb5\xae۫\xd9\xfd|\\\xbbQHn\xab\x95\r\xecv\xdfr\xa8\xe1\xb63\xa1o\x05\x9dt\xc7\xed\xa9<Ϧj\x96\x13\xa6C\xbb\xa7Ҿk5\x87\x9b\xee|\xdf\xe1\x86\f\xe7\a\x9dl\xe4I\x95\xb1\xfbuw\xa1\xe89\xd6b\xada\xfb\rG1\xa7\xa7\xac0竖\xaf\x82N^\x96\x12O踍n\xba\xe5X\xed\x02o\xa6\xe9uܾ\n\ns\xae\x13\xf5T\x8d\xd7S\xd4M!\x18\xd2\xed\xc8ˮ\xf1\x1bnS\xe5\xeaV\\Sh\xb5\xd3\xfc\x17\xa4\xeb\xae\xdb\xcdKѳ\xfcn\xc6\xf3\xed~\x98mX=\xe5[\xe9\x96\xdb\x0f\xf9\xb9\xd3\xccڡ\xe5؍b\xa8\x16\xc2ZG\xd9\xedNX\x88\xdb\xf3v3\xec\x14\xf8Y\xbb_sT+\x1cN\x9a\r\xd5\x0f\x95_L:\xbe\xbc>\x92\xb4WGAh\xb7\x16Ӳ\x97\xa2\xddo\xf2{\tN\xb7\xe3wG[VCɩ\xd5\xe6\xec\xa6rs\x9e\xdd\b#_e=\xd5o\xd8N\xa1gy5Y\xab\xf2\xb3VS&\xe4\x13\xe6u\xaa\xa6\x1df\x82\x8e\xe5\xabL\xa3\xa3\xf8\x84D\xb0\x91 T^\xadn5\xba\xf3\x96\xdf\x1ciY|\x84\x83^~\xd0Hˡg<\x8bM\xc0\xc6p\xbd\\\xcb\xf5e|8~}Љgҝ\x8cZ\xad\x1a\xe10\xf3\xcc\xf9n\xb2\xf3\x91A'\xde\u0090\xe7DAM\x8cQ\xe8\xd9}\xdd,&&\x8a\xdb9\xb7\x1b\xd7#k\"\xc5G\xc28\xe9\r\xd9\xfd\x96\x9b\xc0\x82\x86\xafT?\xe8\xb8ሆ%\xae\x18b`\xd2*ԭ\xfe\xa0i\xf9\xbe;\x1f\xaf\xa3\x984\xe3U\xe4\x93v\xe4\xe9\xe7\xb1#\xe2#\x12\x1f\xf1r\x02{\xad\xaa\xb5\"\xc7\x19\xd6\xed\xa0g9\xcer\xb5\xd0p\xac\x9e\xb5nY\xe9\xb6\xddb\xdb)\xab\xc5w\xc4Wy\xb5\xc8Fc5\x86\xa4\xd1p\xdc@\r\xf3\xa9\xf4\xed~;~=\xc3\xe7\xd9W\xf9\x86\xe5\xa8~\xd3\xf2\xb3\xbe\xd5o\xba\xbd\\\xc3\xed\xf5X\xe3l\xcfj\xf7UX\x18\x9cW\xe4\xad;GY\x1f\xdb=\x9cW*\x1c\xe1\xad{\x9eL\xd9\xe0\v;\xdcb\x17*?!+\xea\x8e,a\x99^\xf8\x9c\xf2C\x9b\x19W\xe8~\xc7\xf5\xed\xb5l_\xcb\x19b\xc7\xd7\x1a\x1d\x99$\x9c\xb7C\xf6er\xf0b2\xb1}\xdc\x1bN\x1c_crߥ\xaeZL\xf3m\x0e\xf2z\xc9\xc1H؉z\xf5\x80\xd7*\a\xb7L\xf7d\xb9\xd2\x1f\x8a\x03I\xc7rZ\xc58\xba$1%'\xf3r\x88\x18q\xec~\x97͙\x1ce\u038b\x82\x0eok\x84o\x8f\xf29l\xd4\xe4q\x1cB\xec~\x96ɽ\xceb\xb1m3C=\xf1A\x12\x1d\x84&\xe3\xb0\x0f\xf8p\xe5\xbe\x17c\x8b'D\xa3\x83˛t\v\xf1\v\t\x99\xdep~\xb0\xd7l2s6\xeaK\f)\xb2\xc5\xf8\xd2\xc8\x017\xc9\x0f\x02\xea4\xf9R\xb0\x1b\xf8\xf0\xfa\xe9\xbar\x9cbC\x8e\xb5\xc5\a\x1b\xaaB\x87e\xd4\ue39b\xe2\xb6\\܊\xbcdD\x0edE\xe2\xc8\xdazG\xae\xdc`$\x9e`\xd9\x06C\x91\xb7!H\xa6\xe1\x18\xee\xd6Uv\xde\xe7;\xdfɄV\xd0\r\xb2\x1cQy3Cu\xdfV\xad\x86\x15\xa8\x8287\xb9'\x99\xb6\xefF^Z\xce2\xc3\x1e\x89\x9aٺ\xb28BP#\nYJ\x8fO\xc5\xf2b\xff\xd8^:\xb0\xe6TAΧVg\xa3v\xd9q\xae\xcf~\xc2\xc8A\xd7\xe1\x88\xe1\xdb]\x15vx\xc2vg(\xe2\xb8\xe4\xf3\xb4\x8a\xd7PwT\x86\xcdk78\xccG\x8d\xee\x10\xcb\xc8\xeb\xe1\xeb;\xba\xae\x15\x1f\xfb\xf2\xb6\xeb\xb6y7\xebb@q\xc9@\x865T\x8b\x05>s\x15\xc6;\xcd'M\xbe\xa4I#\xbe\xc4I3>+\xbe7\x1c\xc2\xfbA:p}\xb6\x1a\x17\xc9=\x89[|y\x06\x99-N*\x03\xaf\xa5y\xdd.\x1b\xa6\xcd\xfeorJ\xaa\xbb\xacqQ\xdbY\xde\x1c\x1eX;\xce(\x1c\xe3C\xf6k\xa88\xb6\xe6\xd9\xdb>koqD\xe4\x98Wpd\x115\xb6E=\xcfq\x81un\xab\xd1\xf8\x88k\x83\f6\x9ct\x13\xa7\xe6$\x95\xd6z\xcd\"cÎ\x1b\xf0\xe1\xab|\x10١(\x96\x17S\tc\xb6\xc1\x89J)\xce0.Geɔq:\x91-\xd4#\xdb\xe1\x1d\xb4\xf3\f\xf6$\xef\fY=f\xb7\xfa\r\x95\xed\xa9f\xd7\x0e\x8b-Y\x12\xb3\xacV\xbct\xc5y\xa0\x93\x84\xa9\xd6XK\xadh\xbaQ]\xacԗ\x13\x8f\xfd\xb7\xc1H\xe2\xbf\r\x86\xd8\u007f\x1b\xf4e_\x85\xf5\xf8\xe2\x12`~\x80(\xac\u007f5\xd7TA\x97\xd3Fֱ<\xa9b\xa3\x84\xc3=\xb7.\xfb\x8ao\xe3\xb0\xf6w\xec\xb7\u009a\xc8\r\xf5\xd4I3љw\xdb\xef\xf3f\x92w3\x9c\xfd\x9dł\x0e\x05|0˗\x86\xc08\f-\t\x83\xd2/\xa8\x05Ona\xa2.\v\xe8%\xefe\x82\x1e/$\xd3\xe2\xabէ\x9e\xea\xe4\xda\x1c\xeb<\xab\x99\xe70\x17\xfb\"/\xdf\x12\xf2\xe6h܈C\v\xbb\xb9\x99\xe73\xe6\xece9i\xf9b\x18\x8a\x17į9\xcb\xd6\xc5;\x1d\x808\x98$\xc9\"\xbe\xbf\xe9\x06G\xb1!\x81H\xba\xecJ\xb0aW\xa6k\xa5\xeadqIf)\x06\x11\xdfH\xbe\xbe\xb6Ƕ\x8e\xeaI\x8b_\x9b(\x0f{\xd1ڵrv\xb6j(N\xa02\xa1\x1c\xe3\xe8\xfaf-\xfe\xf0\xea\xd8\xcai\x8e\x0e\x12M\xb2\x9a\x15\x92\xa2j\xec&\xf6Pd\a\x1d>Q\x9f\x83\x9d\x92ij\xd0hr\x80\xd2\xd9&\x18|\xb4\xac\xdc`D\a\xa8\xa5C\x12\xa0\x96\xf6\xe3\x00\xd5\t{\x8e\x91n\x04A9\xcb\xde\xe4\x90YH\xa2\xaa61G&Ύ\x1b\xb1\xdfm/\xb0\x83%\tiź\xb1A\xd2J\xd7\xcac\xe5\xa1\xf8\xd3O\xe6\xcf\xf2 \xafwt\xfd\x97C\x9c\xae\x93\x90\x1f\x0f\xe6\x1dŗ^l\x984b\xc7&\xcf\xe3ψ8\xac\xc7W\xa2V\x1e/\x15\x92\x94\x1fg\x04\xbe\xf6|\xad%\xb3%\x06Y\xef\x14\xb6\xae\xbc]%\x15\xf9Ԯ{\x14\x05M\xb2\xfb>\xad\xf6\x16ɏ\xea\xd4\xf5\xe7\xa9\x1e6\xe43Y\r\xad\xbb\xb3\xcb\xe38T\x17cx\x1d\xab\xce7\xb2V.M\xae\\7\x1ar8\xadG\xa1\n6\xfd\xbfC\xb2\xad\x91\xc1p\x1c\x83WlЋcS\xad\\\xaeHa\f/r6\x8d\xeaz#\xba\x93^`\x99\x87\x16\x06\x9f\x1e\xebޑ\xc3\xcc5\xd9,\xfcQ\xcd!\x9d\xbf\xf4\x06\xc1\x8b\xbf\xb1\xb8\xdf\xf6\xad^\xb6\xc5ߴ]\x9f\xac&\x87\x8e\xf1\xea\xf8h\xdd\x0e\xeb\x91\x1c\xbd\x96\x81#\xa1\xe3\x17\x93*\x1eZ\xe6\xb8L\xb4>K\x8d,\xe9G\xdeҧ\xe2\xab\xe5K\xfa\xc9\x15\x9f\xe7\xcf\\w>\xc8\xf15\xf5]\xbb\x99\xe1\x8b\x11-\xf02\xed\xba䖠\xbb\xe8qRs#?X\x13\xb1b\xfc9\xc0Vq\xb3-\x0eˎJK!\t<\xb4=\n\"\x91\xd64s\xf2ύ=\xa7\xa8\x1e\xb5q\xae\x9b\x99Wv\xdd\xe5\u007f\x1c\xfa\xfc\xcb/TK\xa3\xf1\xdek\x83\xcd\xcbXe\x93dI\x83\x9c\xeb$9G\x1e\x99\xa3M7\\\xf2@\xc6&\x86\xe7\xf8S\x9c\xbfJ\xe35\xf1\xc8\xc4\xd8H\x92\xd9⁚+C%)\xcaR\x88V\x13\x86\x14\xa6\x14U)&\xa4\x98\xccE}\xfb\xd0\xf1Uc|\xd6\xd68\x8fL\nh\xb2,]\x01M\nhR@\x93\x02\x9a\x14\xd0\xe4d\xbaV\x19\x8b\x11ui\x95\xa4(KQIf\x9b\x1a\x97\x8e)EU\x8a\t)\x044>&\x85<\x1d\x17и\x80\xc6+R\x18R\bb\\\x10\xe3\x82\x18\xd7k\x9b\x1eӵ\xe0J\x82+\t\xae$\xb8\x92\xe0J\x82+\t\xae$\xb8\x920\x95\x85\xa9,\x88\xb2 ʂ(\xeb\xe5\xcd\xe8\tg\xc6u\x1d\xbf!в\xa6\x9c1tm\xeaZ&\xaf\xc8\x1c\x15a\xad\bkEX+\xf1\x03\x81V4tV\x88\r!6dZC@\x86\x80\f\x01\x19\x022\x04d\bȐ\xa5\x9a\x820\x05a\n\xc2\x14\x84\xa9\x97zh\xfcL@f\x95ϻ\x15?\x13PU\x1eT\x05T\x15PU\x1eT\x85\xa6*4US^nHKh\xaa\x82\x98\x10Ą \xc4\x17\x15\xf1EE|Q\x11_T\xc4\x17\x15\xf1EE|Q\x99\x10Ĥ &\x05!\xa6\xa8L\nb\xb2\x92n\x95b\x19\xd9\x14܊\x1f\bBLa\xb0)\xb8\x18\x97\xa2$EY\x8a\x8a\x14\x86\x14\xa6\x14U)&\xa4\x98\xcc\xcc)\x0e\x9b\xdc\x14K\x182\x97!\x960\xc4\x12\x86X\xc2\x10K\x18b\tC,a\x8c\vIIHJ\x82\x103\x18b\x06C\xcc`\x88\x19\f1\x83!f0\xc4\f\x86\x98\xc1\x103\x18b\x06C\xcc`\x88\x19\f\t_FY\x10eA\x94\x05!\x1e0ʂ\xa8\b\xa2\"\x88\x8a DzC\xa47DzC\xa47DzC\xa47*\x820\x04!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa2\xbb!\xba\x1b\xa6 LA\x88\xe8\x86)\bS\x10,z\xab\xc4\b.\x04\xc1\xa2sK\x10\"\xba!\xa2\x1bUAT\x05!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba!\xa2\x1b\"\xba1)\b\x89\x04\x86D\x02C\"\x81\xc1\xa2\xb7JU\x15۴41\xa6kƙ\"\xbd)қ:\x1e\x94&\f]\x9b2X\x95bB\n\xe63\xc5K\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfe\xa6\xe8o\x8a\xfef)\xb9\x96\xa5Uz\x85\xab\xc6u]\xd2uY\xd7z\xa9\xab\xf4RW\x99\xba\xae\xeazB׃\xf9V\xe9zJ\xd7Ӻ\x9e\xd1\xf5lROi\xde)\xcd;\xa5y\xa74\xef\x94\xe6\x9dҼS\x9awJ\xf3Ni\xde)\xcd;\xa5y\xa74\xef\x94\xe6\x9dҼS\x9aW\a\xcdҴ\xe6\x9dּӚwZ\xf3Nk\xdei\xcd;\xady\xa75\xef\xb4\xe6\x9dּӚwZ\xf3Nk\xdeiͫckI\xc7\xd6Ҍ\xe6\x9dѼ3\x9aWGؒ\x8e\xb0\xa5\x19\xcd;\xa3yg4\xef\x8c\xe6\x9dѼ3\x9awF\xf3\xceh\xdeY\xcd;\xabyg5\xef\xac\xe6\x9dռ\xb3\x9awV\xf3ΊS&5\xe9\xac&\x9dդ\xb3\x9atV\x93\xcej\xd2\xd9\xd9\xff\x01\xba\t\a\x8c\x00\x00\x00"), } fileg := &embedded.EmbeddedFile{ Filename: "index.html", - FileModTime: time.Unix(1585527421, 0), + FileModTime: time.Unix(1574654896, 0), Content: string("\n\n\n \n Vitess\n \n\n \n \n \n \n\n \n \n\n \n \n\n \n\n\n Loading...\n\n\n"), } fileh := &embedded.EmbeddedFile{ Filename: "inline.js", - FileModTime: time.Unix(1585527421, 0), + FileModTime: time.Unix(1574654896, 0), Content: string("!function(e){function __webpack_require__(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,__webpack_require__),n.l=!0,n.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,o,c){for(var _,a,i,u=0,p=[];u1;){var o=r.shift();i=i.hasOwnProperty(o)&&isPresent(i[o])?i[o]:i[o]={}}void 0!==i&&null!==i||(i={}),i[r.shift()]=n}function getSymbolIterator(){if(isBlank(h))if(isPresent(n.Symbol)&&isPresent(Symbol.iterator))h=Symbol.iterator;else for(var e=Object.getOwnPropertyNames(Map.prototype),t=0;t=0&&e[r]==t;r--)n--;e=e.substring(0,n)}return e},StringWrapper.replace=function(e,t,n){return e.replace(t,n)},StringWrapper.replaceAll=function(e,t,n){return e.replace(t,n)},StringWrapper.slice=function(e,t,n){return void 0===t&&(t=0),void 0===n&&(n=null),e.slice(t,null===n?void 0:n)},StringWrapper.replaceAllMapped=function(e,t,n){return e.replace(t,function(){for(var e=[],t=0;tt?1:0},StringWrapper}();t.StringWrapper=s;var a=function(){function StringJoiner(e){void 0===e&&(e=[]),this.parts=e}return StringJoiner.prototype.add=function(e){this.parts.push(e)},StringJoiner.prototype.toString=function(){return this.parts.join(\"\")},StringJoiner}();t.StringJoiner=a;var l=function(e){function NumberParseError(t){e.call(this),this.message=t}return r(NumberParseError,e),NumberParseError.prototype.toString=function(){return this.message},NumberParseError}(Error);t.NumberParseError=l;var c=function(){function NumberWrapper(){}return NumberWrapper.toFixed=function(e,t){return e.toFixed(t)},NumberWrapper.equal=function(e,t){return e===t},NumberWrapper.parseIntAutoRadix=function(e){var t=parseInt(e);if(isNaN(t))throw new l(\"Invalid integer literal when parsing \"+e);return t},NumberWrapper.parseInt=function(e,t){if(10==t){if(/^(\\-|\\+)?[0-9]+$/.test(e))return parseInt(e,t)}else if(16==t){if(/^(\\-|\\+)?[0-9ABCDEFabcdef]+$/.test(e))return parseInt(e,t)}else{var n=parseInt(e,t);if(!isNaN(n))return n}throw new l(\"Invalid integer literal when parsing \"+e+\" in base \"+t)},NumberWrapper.parseFloat=function(e){return parseFloat(e)},Object.defineProperty(NumberWrapper,\"NaN\",{get:function(){return NaN},enumerable:!0,configurable:!0}),NumberWrapper.isNumeric=function(e){return!isNaN(e-parseFloat(e))},NumberWrapper.isNaN=function(e){return isNaN(e)},NumberWrapper.isInteger=function(e){return Number.isInteger(e)},NumberWrapper}();t.NumberWrapper=c,t.RegExp=i.RegExp;var u=function(){function FunctionWrapper(){}return FunctionWrapper.apply=function(e,t){return e.apply(null,t)},FunctionWrapper.bind=function(e,t){return e.bind(t)},FunctionWrapper}();t.FunctionWrapper=u,t.looseIdentical=looseIdentical,t.getMapKey=getMapKey,t.normalizeBlank=normalizeBlank,t.normalizeBool=normalizeBool,t.isJsObject=isJsObject,t.print=print,t.warn=warn;var p=function(){function Json(){}return Json.parse=function(e){return i.JSON.parse(e)},Json.stringify=function(e){return i.JSON.stringify(e,null,2)},Json}();t.Json=p;var d=function(){function DateWrapper(){}return DateWrapper.create=function(e,n,r,i,o,s,a){return void 0===n&&(n=1),void 0===r&&(r=1),void 0===i&&(i=0),void 0===o&&(o=0),void 0===s&&(s=0),void 0===a&&(a=0),new t.Date(e,n-1,r,i,o,s,a)},DateWrapper.fromISOString=function(e){return new t.Date(e)},DateWrapper.fromMillis=function(e){return new t.Date(e)},DateWrapper.toMillis=function(e){return e.getTime()},DateWrapper.now=function(){return new t.Date},DateWrapper.toJson=function(e){return e.toJSON()},DateWrapper}();t.DateWrapper=d,t.setValueOnPath=setValueOnPath;var h=null;t.getSymbolIterator=getSymbolIterator,t.evalExpression=evalExpression,t.isPrimitive=isPrimitive,t.hasConstructor=hasConstructor,t.escape=escape,t.escapeRegExp=escapeRegExp}).call(t,n(82))},4,function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(217),o=n(41),s=n(215),a=n(897),l=function(e){function Subscriber(t,n,r){switch(e.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a.empty;break;case 1:if(!t){this.destination=a.empty;break}if(\"object\"==typeof t){t instanceof Subscriber?(this.destination=t,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new c(this,t));break}default:this.syncErrorThrowable=!0,this.destination=new c(this,t,n,r)}}return r(Subscriber,e),Subscriber.create=function(e,t,n){var r=new Subscriber(e,t,n);return r.syncErrorThrowable=!1,r},Subscriber.prototype.next=function(e){this.isStopped||this._next(e)},Subscriber.prototype.error=function(e){this.isStopped||(this.isStopped=!0,this._error(e))},Subscriber.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},Subscriber.prototype.unsubscribe=function(){this.isUnsubscribed||(this.isStopped=!0,e.prototype.unsubscribe.call(this))},Subscriber.prototype._next=function(e){this.destination.next(e)},Subscriber.prototype._error=function(e){this.destination.error(e),this.unsubscribe()},Subscriber.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},Subscriber.prototype[s.$$rxSubscriber]=function(){return this},Subscriber}(o.Subscription);t.Subscriber=l;var c=function(e){function SafeSubscriber(t,n,r,o){e.call(this),this._parent=t;var s,a=this;i.isFunction(n)?s=n:n&&(a=n,s=n.next,r=n.error,o=n.complete,i.isFunction(a.unsubscribe)&&this.add(a.unsubscribe.bind(a)),a.unsubscribe=this.unsubscribe.bind(this)),this._context=a,this._next=s,this._error=r,this._complete=o}return r(SafeSubscriber,e),SafeSubscriber.prototype.next=function(e){if(!this.isStopped&&this._next){var t=this._parent;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,e)&&this.unsubscribe():this.__tryOrUnsub(this._next,e)}},SafeSubscriber.prototype.error=function(e){if(!this.isStopped){var t=this._parent;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,e),this.unsubscribe()):(this.__tryOrUnsub(this._error,e),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),e;t.syncErrorValue=e,t.syncErrorThrown=!0,this.unsubscribe()}}},SafeSubscriber.prototype.complete=function(){if(!this.isStopped){var e=this._parent;this._complete?e.syncErrorThrowable?(this.__tryOrSetError(e,this._complete),this.unsubscribe()):(this.__tryOrUnsub(this._complete),this.unsubscribe()):this.unsubscribe()}},SafeSubscriber.prototype.__tryOrUnsub=function(e,t){try{e.call(this._context,t)}catch(n){throw this.unsubscribe(),n}},SafeSubscriber.prototype.__tryOrSetError=function(e,t,n){try{t.call(this._context,n)}catch(r){return e.syncErrorValue=r,e.syncErrorThrown=!0,!0}return!1},SafeSubscriber.prototype._unsubscribe=function(){var e=this._parent;this._context=null,this._parent=null,e.unsubscribe()},SafeSubscriber}(l)},4,function(e,t,n){var r=n(15);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},function(e,t,n){\"use strict\";var r=this&&this.__decorate||function(e,t,n,r){var i,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},i=this&&this.__metadata||function(e,t){if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},o=n(0),s=function(){function DomHandler(){}return DomHandler.prototype.addClass=function(e,t){e.classList?e.classList.add(t):e.className+=\" \"+t},DomHandler.prototype.addMultipleClasses=function(e,t){if(e.classList)for(var n=t.split(\" \"),r=0;rwindow.innerHeight?-1*i.height:o,r=a.left+i.width>window.innerWidth?s-i.width:0,e.style.top=n+\"px\",e.style.left=r+\"px\"},DomHandler.prototype.absolutePosition=function(e,t){var n,r,i=e.offsetParent?{width:e.offsetWidth,height:e.offsetHeight}:this.getHiddenElementDimensions(e),o=i.height,s=i.width,a=t.offsetHeight,l=t.offsetWidth,c=t.getBoundingClientRect(),u=this.getWindowScrollTop(),p=this.getWindowScrollLeft();n=c.top+a+o>window.innerHeight?c.top+u-o:a+c.top+u,r=c.left+l+s>window.innerWidth?c.left+p+l-s:c.left+p,e.style.top=n+\"px\",e.style.left=r+\"px\"},DomHandler.prototype.getHiddenElementOuterHeight=function(e){e.style.visibility=\"hidden\",e.style.display=\"block\";var t=e.offsetHeight;return e.style.display=\"none\",e.style.visibility=\"visible\",t},DomHandler.prototype.getHiddenElementOuterWidth=function(e){e.style.visibility=\"hidden\",e.style.display=\"block\";var t=e.offsetWidth;return e.style.display=\"none\",e.style.visibility=\"visible\",t},DomHandler.prototype.getHiddenElementDimensions=function(e){var t={};return e.style.visibility=\"hidden\",e.style.display=\"block\",t.width=e.offsetWidth,t.height=e.offsetHeight,e.style.display=\"none\",e.style.visibility=\"visible\",t},DomHandler.prototype.scrollInView=function(e,t){var n=getComputedStyle(e).getPropertyValue(\"borderTopWidth\"),r=n?parseFloat(n):0,i=getComputedStyle(e).getPropertyValue(\"paddingTop\"),o=i?parseFloat(i):0,s=e.getBoundingClientRect(),a=t.getBoundingClientRect(),l=a.top+document.body.scrollTop-(s.top+document.body.scrollTop)-r-o,c=e.scrollTop,u=e.clientHeight,p=this.getOuterHeight(t);l<0?e.scrollTop=c+l:l+p>u&&(e.scrollTop=c+l-u+p)},DomHandler.prototype.fadeIn=function(e,t){e.style.opacity=0;var n=+new Date,r=function(){e.style.opacity=+e.style.opacity+((new Date).getTime()-n)/t,n=+new Date,+e.style.opacity<1&&(window.requestAnimationFrame&&requestAnimationFrame(r)||setTimeout(r,16))};r()},DomHandler.prototype.fadeOut=function(e,t){var n=1,r=50,i=t,o=r/i,s=setInterval(function(){n-=o,e.style.opacity=n,n<=0&&clearInterval(s)},r)},DomHandler.prototype.getWindowScrollTop=function(){var e=document.documentElement;return(window.pageYOffset||e.scrollTop)-(e.clientTop||0)},DomHandler.prototype.getWindowScrollLeft=function(){var e=document.documentElement;return(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0)},DomHandler.prototype.matches=function(e,t){var n=Element.prototype,r=n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(e){return[].indexOf.call(document.querySelectorAll(e),this)!==-1};return r.call(e,t)},DomHandler.prototype.getOuterWidth=function(e,t){var n=e.offsetWidth;if(t){var r=getComputedStyle(e);n+=parseInt(r.paddingLeft)+parseInt(r.paddingRight)}return n},DomHandler.prototype.getHorizontalMargin=function(e){var t=getComputedStyle(e);return parseInt(t.marginLeft)+parseInt(t.marginRight)},DomHandler.prototype.innerWidth=function(e){var t=e.offsetWidth,n=getComputedStyle(e);return t+=parseInt(n.paddingLeft)+parseInt(n.paddingRight)},DomHandler.prototype.width=function(e){var t=e.offsetWidth,n=getComputedStyle(e);return t-=parseInt(n.paddingLeft)+parseInt(n.paddingRight)},DomHandler.prototype.getOuterHeight=function(e,t){var n=e.offsetHeight;if(t){var r=getComputedStyle(e);n+=parseInt(r.marginTop)+parseInt(r.marginBottom)}return n},DomHandler.prototype.getHeight=function(e){var t=e.offsetHeight,n=getComputedStyle(e);return t-=parseInt(n.paddingTop)+parseInt(n.paddingBottom)+parseInt(n.borderTopWidth)+parseInt(n.borderBottomWidth)},DomHandler.prototype.getViewport=function(){var e=window,t=document,n=t.documentElement,r=t.getElementsByTagName(\"body\")[0],i=e.innerWidth||n.clientWidth||r.clientWidth,o=e.innerHeight||n.clientHeight||r.clientHeight;return{width:i,height:o}},DomHandler.prototype.equals=function(e,t){if(null==e||null==t)return!1;if(e==t)return!0;if(\"object\"==typeof e&&\"object\"==typeof t){for(var n in e){if(e.hasOwnProperty(n)!==t.hasOwnProperty(n))return!1;switch(typeof e[n]){case\"object\":if(!this.equals(e[n],t[n]))return!1;break;case\"function\":if(\"undefined\"==typeof t[n]||\"compare\"!=n&&e[n].toString()!=t[n].toString())return!1;break;default:if(e[n]!=t[n])return!1}}for(var n in t)if(\"undefined\"==typeof e[n])return!1;return!0}return!1},DomHandler.zindex=1e3,DomHandler=r([o.Injectable(),i(\"design:paramtypes\",[])],DomHandler)}();t.DomHandler=s},[1104,5],function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(6),o=function(e){function OuterSubscriber(){e.apply(this,arguments)}return r(OuterSubscriber,e),OuterSubscriber.prototype.notifyNext=function(e,t,n,r,i){this.destination.next(t)},OuterSubscriber.prototype.notifyError=function(e,t){this.destination.error(e)},OuterSubscriber.prototype.notifyComplete=function(e){this.destination.complete()},OuterSubscriber}(i.Subscriber);t.OuterSubscriber=o},function(e,t,n){\"use strict\";function subscribeToResult(e,t,n,u){var p=new c.InnerSubscriber(e,n,u);if(!p.isUnsubscribed){if(t instanceof s.Observable)return t._isScalar?(p.next(t.value),void p.complete()):t.subscribe(p);if(i.isArray(t)){for(var d=0,h=t.length;d=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},i=this&&this.__metadata||function(e,t){if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},o=n(0),s=n(3),a=n(0),l=function(){function Header(){}return Header=r([a.Component({selector:\"header\",template:\"\"}),i(\"design:paramtypes\",[])],Header)}();t.Header=l;var c=function(){function Footer(){}return Footer=r([a.Component({selector:\"footer\",template:\"\"}),i(\"design:paramtypes\",[])],Footer)}();t.Footer=c;var u=function(){function TemplateWrapper(e){this.viewContainer=e}return TemplateWrapper.prototype.ngOnInit=function(){this.viewContainer.createEmbeddedView(this.templateRef,{$implicit:this.item})},r([o.Input(),i(\"design:type\",Object)],TemplateWrapper.prototype,\"item\",void 0),r([o.Input(\"pTemplateWrapper\"),i(\"design:type\",o.TemplateRef)],TemplateWrapper.prototype,\"templateRef\",void 0),TemplateWrapper=r([o.Directive({selector:\"[pTemplateWrapper]\"}),i(\"design:paramtypes\",[o.ViewContainerRef])],TemplateWrapper)}();t.TemplateWrapper=u;var p=function(){function Column(){this.sortFunction=new o.EventEmitter}return r([o.Input(),i(\"design:type\",String)],Column.prototype,\"field\",void 0),r([o.Input(),i(\"design:type\",String)],Column.prototype,\"header\",void 0),r([o.Input(),i(\"design:type\",String)],Column.prototype,\"footer\",void 0),r([o.Input(),i(\"design:type\",Object)],Column.prototype,\"sortable\",void 0),r([o.Input(),i(\"design:type\",Boolean)],Column.prototype,\"editable\",void 0),r([o.Input(),i(\"design:type\",Boolean)],Column.prototype,\"filter\",void 0),r([o.Input(),i(\"design:type\",String)],Column.prototype,\"filterMatchMode\",void 0),r([o.Input(),i(\"design:type\",Number)],Column.prototype,\"rowspan\",void 0),r([o.Input(),i(\"design:type\",Number)],Column.prototype,\"colspan\",void 0),r([o.Input(),i(\"design:type\",Object)],Column.prototype,\"style\",void 0),r([o.Input(),i(\"design:type\",String)],Column.prototype,\"styleClass\",void 0),r([o.Input(),i(\"design:type\",Boolean)],Column.prototype,\"hidden\",void 0),r([o.Input(),i(\"design:type\",Boolean)],Column.prototype,\"expander\",void 0),r([o.Input(),i(\"design:type\",String)],Column.prototype,\"selectionMode\",void 0),r([o.Output(),i(\"design:type\",o.EventEmitter)],Column.prototype,\"sortFunction\",void 0),r([o.ContentChild(o.TemplateRef),i(\"design:type\",o.TemplateRef)],Column.prototype,\"template\",void 0),Column=r([a.Component({selector:\"p-column\",template:\"\"}),i(\"design:paramtypes\",[])],Column)}();t.Column=p;var d=function(){function ColumnTemplateLoader(e){this.viewContainer=e}return ColumnTemplateLoader.prototype.ngOnInit=function(){this.viewContainer.createEmbeddedView(this.column.template,{$implicit:this.column,rowData:this.rowData,rowIndex:this.rowIndex})},r([o.Input(),i(\"design:type\",Object)],ColumnTemplateLoader.prototype,\"column\",void 0),r([o.Input(),i(\"design:type\",Object)],ColumnTemplateLoader.prototype,\"rowData\",void 0),r([o.Input(),i(\"design:type\",Number)],ColumnTemplateLoader.prototype,\"rowIndex\",void 0),ColumnTemplateLoader=r([a.Component({selector:\"p-columnTemplateLoader\",template:\"\"}),i(\"design:paramtypes\",[o.ViewContainerRef])],ColumnTemplateLoader)}();t.ColumnTemplateLoader=d;var h=function(){function SharedModule(){}return SharedModule=r([o.NgModule({imports:[s.CommonModule],exports:[l,c,p,u,d],declarations:[l,c,p,u,d]}),i(\"design:paramtypes\",[])],SharedModule)}();t.SharedModule=h},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(1),o=n(6),s=n(41),a=n(899),l=n(215),c=n(517),u=n(317),p=function(e){function Subject(t,n){e.call(this),this.destination=t,this.source=n,this.observers=[],this.isUnsubscribed=!1,this.isStopped=!1,this.hasErrored=!1,this.dispatching=!1,this.hasCompleted=!1,this.source=n}return r(Subject,e),Subject.prototype.lift=function(e){var t=new Subject(this.destination||this,this);return t.operator=e,t},Subject.prototype.add=function(e){return s.Subscription.prototype.add.call(this,e)},Subject.prototype.remove=function(e){s.Subscription.prototype.remove.call(this,e)},Subject.prototype.unsubscribe=function(){s.Subscription.prototype.unsubscribe.call(this)},Subject.prototype._subscribe=function(e){if(this.source)return this.source.subscribe(e);if(!e.isUnsubscribed){if(this.hasErrored)return e.error(this.errorValue);if(this.hasCompleted)return e.complete();this.throwIfUnsubscribed();var t=new a.SubjectSubscription(this,e);return this.observers.push(e),t}},Subject.prototype._unsubscribe=function(){this.source=null,this.isStopped=!0,this.observers=null,this.destination=null},Subject.prototype.next=function(e){this.throwIfUnsubscribed(),this.isStopped||(this.dispatching=!0,this._next(e),this.dispatching=!1,this.hasErrored?this._error(this.errorValue):this.hasCompleted&&this._complete())},Subject.prototype.error=function(e){this.throwIfUnsubscribed(),this.isStopped||(this.isStopped=!0,this.hasErrored=!0,this.errorValue=e,this.dispatching||this._error(e))},Subject.prototype.complete=function(){this.throwIfUnsubscribed(),this.isStopped||(this.isStopped=!0,this.hasCompleted=!0,this.dispatching||this._complete())},Subject.prototype.asObservable=function(){var e=new d(this);return e},Subject.prototype._next=function(e){this.destination?this.destination.next(e):this._finalNext(e)},Subject.prototype._finalNext=function(e){for(var t=-1,n=this.observers.slice(0),r=n.length;++t\"+i+\"\"};e.exports=function(e,t){var n={};n[e]=t(a),r(r.P+r.F*i(function(){var t=\"\"[e]('\"');return t!==t.toLowerCase()||t.split('\"').length>3}),\"String\",n)}},function(e,t,n){\"use strict\";var r=n(81),i=n(514),o=n(217),s=n(42),a=n(38),l=n(513),c=function(){function Subscription(e){this.isUnsubscribed=!1,e&&(this._unsubscribe=e)}return Subscription.prototype.unsubscribe=function(){var e,t=!1;if(!this.isUnsubscribed){this.isUnsubscribed=!0;var n=this,c=n._unsubscribe,u=n._subscriptions;if(this._subscriptions=null,o.isFunction(c)){var p=s.tryCatch(c).call(this);p===a.errorObject&&(t=!0,(e=e||[]).push(a.errorObject.e))}if(r.isArray(u))for(var d=-1,h=u.length;++d0?i(r(e),9007199254740991):0}},function(e,t,n){\"use strict\";var r=n(1082);t.async=new r.AsyncScheduler},function(e,t,n){\"use strict\";function __export(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}var r=n(86);t.HostMetadata=r.HostMetadata,t.InjectMetadata=r.InjectMetadata,t.InjectableMetadata=r.InjectableMetadata,t.OptionalMetadata=r.OptionalMetadata,t.SelfMetadata=r.SelfMetadata,t.SkipSelfMetadata=r.SkipSelfMetadata,__export(n(115));var i=n(162);t.forwardRef=i.forwardRef,t.resolveForwardRef=i.resolveForwardRef;var o=n(163);t.Injector=o.Injector;var s=n(571);t.ReflectiveInjector=s.ReflectiveInjector;var a=n(250);t.Binding=a.Binding,t.ProviderBuilder=a.ProviderBuilder,t.bind=a.bind,t.Provider=a.Provider,t.provide=a.provide;var l=n(253);t.ResolvedReflectiveFactory=l.ResolvedReflectiveFactory;var c=n(252);t.ReflectiveKey=c.ReflectiveKey;var u=n(251);t.NoProviderError=u.NoProviderError,t.AbstractProviderError=u.AbstractProviderError,t.CyclicDependencyError=u.CyclicDependencyError,t.InstantiationError=u.InstantiationError,t.InvalidProviderError=u.InvalidProviderError,t.NoAnnotationError=u.NoAnnotationError,t.OutOfBoundsError=u.OutOfBoundsError;var p=n(374);t.OpaqueToken=p.OpaqueToken},[1104,32],function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){\"use strict\";var r=n(13);e.exports=function(e,t){return!!e&&r(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t,n){var r=n(75);e.exports=function(e){return Object(r(e))}},function(e,t,n){\"use strict\";(function(e,n){var r={\"boolean\":!1,\"function\":!0,object:!0,number:!1,string:!1,undefined:!1};t.root=r[typeof self]&&self||r[typeof window]&&window;var i=(r[typeof t]&&t&&!t.nodeType&&t,r[typeof e]&&e&&!e.nodeType&&e,r[typeof n]&&n);!i||i.global!==i&&i.window!==i||(t.root=i)}).call(t,n(1100)(e),n(82))},function(e,t,n){\"use strict\";var r=n(0);t.NG_VALUE_ACCESSOR=new r.OpaqueToken(\"NgValueAccessor\")},52,function(e,t,n){\"use strict\";function _convertToPromise(e){return s.isPromise(e)?e:i.toPromise.call(e)}function _executeValidators(e,t){return t.map(function(t){return t(e)})}function _executeAsyncValidators(e,t){return t.map(function(t){return t(e)})}function _mergeErrors(e){var t=e.reduce(function(e,t){return s.isPresent(t)?o.StringMapWrapper.merge(e,t):e},{});return o.StringMapWrapper.isEmpty(t)?null:t}var r=n(0),i=n(313),o=n(47),s=n(32);t.NG_VALIDATORS=new r.OpaqueToken(\"NgValidators\"),t.NG_ASYNC_VALIDATORS=new r.OpaqueToken(\"NgAsyncValidators\");var a=function(){function Validators(){}return Validators.required=function(e){return s.isBlank(e.value)||s.isString(e.value)&&\"\"==e.value?{required:!0}:null},Validators.minLength=function(e){return function(t){if(s.isPresent(Validators.required(t)))return null;var n=t.value;return n.lengthe?{maxlength:{requiredLength:e,actualLength:n.length}}:null}},Validators.pattern=function(e){return function(t){if(s.isPresent(Validators.required(t)))return null;var n=new RegExp(\"^\"+e+\"$\"),r=t.value;return n.test(r)?null:{pattern:{requiredPattern:\"^\"+e+\"$\",actualValue:r}}}},Validators.nullValidator=function(e){return null},Validators.compose=function(e){if(s.isBlank(e))return null;var t=e.filter(s.isPresent);return 0==t.length?null:function(e){return _mergeErrors(_executeValidators(e,t))}},Validators.composeAsync=function(e){if(s.isBlank(e))return null;var t=e.filter(s.isPresent);return 0==t.length?null:function(e){var n=_executeAsyncValidators(e,t).map(_convertToPromise);return Promise.all(n).then(_mergeErrors)}},Validators}();t.Validators=a},function(e,t,n){\"use strict\";var r=n(0),i=n(123),o=n(72),s=n(16),a=n(126),l=n(278);t.PRIMITIVE=String;var c=function(){function Serializer(e){this._renderStore=e}return Serializer.prototype.serialize=function(e,n){var i=this;if(!s.isPresent(e))return null;if(s.isArray(e))return e.map(function(e){return i.serialize(e,n)});if(n==t.PRIMITIVE)return e;if(n==u)return this._renderStore.serialize(e);if(n===r.RenderComponentType)return this._serializeRenderComponentType(e);if(n===r.ViewEncapsulation)return s.serializeEnum(e);if(n===l.LocationType)return this._serializeLocation(e);throw new o.BaseException(\"No serializer for \"+n.toString())},Serializer.prototype.deserialize=function(e,n,a){var c=this;if(!s.isPresent(e))return null;if(s.isArray(e)){var p=[];return e.forEach(function(e){return p.push(c.deserialize(e,n,a))}),p}if(n==t.PRIMITIVE)return e;if(n==u)return this._renderStore.deserialize(e);if(n===r.RenderComponentType)return this._deserializeRenderComponentType(e);if(n===r.ViewEncapsulation)return i.VIEW_ENCAPSULATION_VALUES[e];if(n===l.LocationType)return this._deserializeLocation(e);throw new o.BaseException(\"No deserializer for \"+n.toString())},Serializer.prototype._serializeLocation=function(e){return{href:e.href,protocol:e.protocol,host:e.host,hostname:e.hostname,port:e.port,pathname:e.pathname,search:e.search,hash:e.hash,origin:e.origin}},Serializer.prototype._deserializeLocation=function(e){return new l.LocationType(e.href,e.protocol,e.host,e.hostname,e.port,e.pathname,e.search,e.hash,e.origin)},Serializer.prototype._serializeRenderComponentType=function(e){return{id:e.id,templateUrl:e.templateUrl,slotCount:e.slotCount,encapsulation:this.serialize(e.encapsulation,r.ViewEncapsulation),styles:this.serialize(e.styles,t.PRIMITIVE)}},Serializer.prototype._deserializeRenderComponentType=function(e){return new r.RenderComponentType(e.id,e.templateUrl,e.slotCount,this.deserialize(e.encapsulation,r.ViewEncapsulation),this.deserialize(e.styles,t.PRIMITIVE),{})},Serializer.decorators=[{type:r.Injectable}],Serializer.ctorParameters=[{type:a.RenderStore}],Serializer}();t.Serializer=c;var u=function(){function RenderStoreObject(){}return RenderStoreObject}();t.RenderStoreObject=u},function(e,t,n){var r=n(2),i=n(24),o=n(13);e.exports=function(e,t){var n=(i.Object||{})[e]||Object[e],s={};s[e]=t(n),r(r.S+r.F*o(function(){n(1)}),\"Object\",s)}},function(e,t,n){var r=n(133),i=n(75);e.exports=function(e){return r(i(e))}},function(e,t,n){\"use strict\";function _convertToPromise(e){return s.isPromise(e)?e:i.toPromise.call(e)}function _executeValidators(e,t){return t.map(function(t){return t(e)})}function _executeAsyncValidators(e,t){return t.map(function(t){return t(e)})}function _mergeErrors(e){var t=e.reduce(function(e,t){return s.isPresent(t)?o.StringMapWrapper.merge(e,t):e},{});return o.StringMapWrapper.isEmpty(t)?null:t}var r=n(0),i=n(313),o=n(34),s=n(7);t.NG_VALIDATORS=new r.OpaqueToken(\"NgValidators\"),t.NG_ASYNC_VALIDATORS=new r.OpaqueToken(\"NgAsyncValidators\");var a=function(){function Validators(){}return Validators.required=function(e){return s.isBlank(e.value)||s.isString(e.value)&&\"\"==e.value?{required:!0}:null},Validators.minLength=function(e){return function(t){if(s.isPresent(Validators.required(t)))return null;var n=t.value;return n.lengthe?{maxlength:{requiredLength:e,actualLength:n.length}}:null}},Validators.pattern=function(e){return function(t){if(s.isPresent(Validators.required(t)))return null;var n=new RegExp(\"^\"+e+\"$\"),r=t.value;return n.test(r)?null:{pattern:{requiredPattern:\"^\"+e+\"$\",actualValue:r}}}},Validators.nullValidator=function(e){return null},Validators.compose=function(e){if(s.isBlank(e))return null;var t=e.filter(s.isPresent);return 0==t.length?null:function(e){return _mergeErrors(_executeValidators(e,t))}},Validators.composeAsync=function(e){if(s.isBlank(e))return null;var t=e.filter(s.isPresent);return 0==t.length?null:function(e){var n=_executeAsyncValidators(e,t).map(_convertToPromise);return Promise.all(n).then(_mergeErrors)}},Validators}();t.Validators=a},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(83),o=n(7),s=function(e){function InvalidPipeArgumentException(t,n){e.call(this,\"Invalid argument '\"+n+\"' for pipe '\"+o.stringify(t)+\"'\")}return r(InvalidPipeArgumentException,e),InvalidPipeArgumentException}(i.BaseException);t.InvalidPipeArgumentException=s},function(e,t,n){\"use strict\";/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nvar r=n(5),i=function(){function ParseLocation(e,t,n,r){this.file=e,this.offset=t,this.line=n,this.col=r}return ParseLocation.prototype.toString=function(){return r.isPresent(this.offset)?this.file.url+\"@\"+this.line+\":\"+this.col:this.file.url},ParseLocation}();t.ParseLocation=i;var o=function(){function ParseSourceFile(e,t){this.content=e,this.url=t}return ParseSourceFile}();t.ParseSourceFile=o;var s=function(){function ParseSourceSpan(e,t,n){void 0===n&&(n=null),this.start=e,this.end=t,this.details=n}return ParseSourceSpan.prototype.toString=function(){return this.start.file.content.substring(this.start.offset,this.end.offset)},ParseSourceSpan}();t.ParseSourceSpan=s,function(e){e[e.WARNING=0]=\"WARNING\",e[e.FATAL=1]=\"FATAL\"}(t.ParseErrorLevel||(t.ParseErrorLevel={}));var a=t.ParseErrorLevel,l=function(){function ParseError(e,t,n){void 0===n&&(n=a.FATAL),this.span=e,this.msg=t,this.level=n}return ParseError.prototype.toString=function(){var e=this.span.start.file.content,t=this.span.start.offset,n=\"\",i=\"\";if(r.isPresent(t)){t>e.length-1&&(t=e.length-1);for(var o=t,s=0,a=0;s<100&&t>0&&(t--,s++,\"\\n\"!=e[t]||3!=++a););for(s=0,a=0;s<100&&o]\"+e.substring(this.span.start.offset,o+1);n=' (\"'+l+'\")'}return this.span.details&&(i=\", \"+this.span.details),\"\"+this.msg+n+\": \"+this.span.start+i},ParseError}();t.ParseError=l},function(e,t,n){\"use strict\";function templateVisitAll(e,t,n){void 0===n&&(n=null);var i=[];return t.forEach(function(t){var o=t.visit(e,n);r.isPresent(o)&&i.push(o)}),i}var r=n(5),i=function(){function TextAst(e,t,n){this.value=e,this.ngContentIndex=t,this.sourceSpan=n}return TextAst.prototype.visit=function(e,t){return e.visitText(this,t)},TextAst}();t.TextAst=i;var o=function(){function BoundTextAst(e,t,n){this.value=e,this.ngContentIndex=t,this.sourceSpan=n}return BoundTextAst.prototype.visit=function(e,t){return e.visitBoundText(this,t)},BoundTextAst}();t.BoundTextAst=o;var s=function(){function AttrAst(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}return AttrAst.prototype.visit=function(e,t){return e.visitAttr(this,t)},AttrAst}();t.AttrAst=s;var a=function(){function BoundElementPropertyAst(e,t,n,r,i,o){this.name=e,this.type=t,this.securityContext=n,this.value=r,this.unit=i,this.sourceSpan=o}return BoundElementPropertyAst.prototype.visit=function(e,t){return e.visitElementProperty(this,t)},BoundElementPropertyAst}();t.BoundElementPropertyAst=a;var l=function(){function BoundEventAst(e,t,n,r){this.name=e,this.target=t,this.handler=n,this.sourceSpan=r}return BoundEventAst.prototype.visit=function(e,t){return e.visitEvent(this,t)},Object.defineProperty(BoundEventAst.prototype,\"fullName\",{get:function(){return r.isPresent(this.target)?this.target+\":\"+this.name:this.name},enumerable:!0,configurable:!0}),BoundEventAst}();t.BoundEventAst=l;var c=function(){function ReferenceAst(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}return ReferenceAst.prototype.visit=function(e,t){return e.visitReference(this,t)},ReferenceAst}();t.ReferenceAst=c;var u=function(){function VariableAst(e,t,n){this.name=e,this.value=t,this.sourceSpan=n}return VariableAst.prototype.visit=function(e,t){return e.visitVariable(this,t)},VariableAst}();t.VariableAst=u;var p=function(){function ElementAst(e,t,n,r,i,o,s,a,l,c,u){this.name=e,this.attrs=t,this.inputs=n,this.outputs=r,this.references=i,this.directives=o,this.providers=s,this.hasViewContainer=a,this.children=l,this.ngContentIndex=c,this.sourceSpan=u}return ElementAst.prototype.visit=function(e,t){return e.visitElement(this,t)},ElementAst}();t.ElementAst=p;var d=function(){function EmbeddedTemplateAst(e,t,n,r,i,o,s,a,l,c){this.attrs=e,this.outputs=t,this.references=n,this.variables=r,this.directives=i,this.providers=o,this.hasViewContainer=s,this.children=a,this.ngContentIndex=l,this.sourceSpan=c}return EmbeddedTemplateAst.prototype.visit=function(e,t){return e.visitEmbeddedTemplate(this,t)},EmbeddedTemplateAst}();t.EmbeddedTemplateAst=d;var h=function(){function BoundDirectivePropertyAst(e,t,n,r){this.directiveName=e,this.templateName=t,this.value=n,this.sourceSpan=r}return BoundDirectivePropertyAst.prototype.visit=function(e,t){return e.visitDirectiveProperty(this,t)},BoundDirectivePropertyAst}();t.BoundDirectivePropertyAst=h;var f=function(){function DirectiveAst(e,t,n,r,i){this.directive=e,this.inputs=t,this.hostProperties=n,this.hostEvents=r,this.sourceSpan=i}return DirectiveAst.prototype.visit=function(e,t){return e.visitDirective(this,t)},DirectiveAst}();t.DirectiveAst=f;var m=function(){function ProviderAst(e,t,n,r,i,o,s){this.token=e,this.multiProvider=t,this.eager=n,this.providers=r,this.providerType=i,this.lifecycleHooks=o,this.sourceSpan=s}return ProviderAst.prototype.visit=function(e,t){return null},ProviderAst}();t.ProviderAst=m,function(e){e[e.PublicService=0]=\"PublicService\",e[e.PrivateService=1]=\"PrivateService\",e[e.Component=2]=\"Component\",e[e.Directive=3]=\"Directive\",e[e.Builtin=4]=\"Builtin\"}(t.ProviderAstType||(t.ProviderAstType={}));var g=(t.ProviderAstType,function(){function NgContentAst(e,t,n){this.index=e,this.ngContentIndex=t,this.sourceSpan=n}return NgContentAst.prototype.visit=function(e,t){return e.visitNgContent(this,t)},NgContentAst}());t.NgContentAst=g,function(e){e[e.Property=0]=\"Property\",e[e.Attribute=1]=\"Attribute\",e[e.Class=2]=\"Class\",e[e.Style=3]=\"Style\",e[e.Animation=4]=\"Animation\"}(t.PropertyBindingType||(t.PropertyBindingType={}));t.PropertyBindingType;t.templateVisitAll=templateVisitAll},function(e,t){\"use strict\";var n=function(){function MessageBus(){}return MessageBus}();t.MessageBus=n},function(e,t){\"use strict\";t.PRIMARY_OUTLET=\"primary\"},function(e,t,n){var r=n(106),i=n(133),o=n(50),s=n(44),a=n(676);e.exports=function(e,t){var n=1==e,l=2==e,c=3==e,u=4==e,p=6==e,d=5==e||p,h=t||a;return function(t,a,f){for(var m,g,y=o(t),v=i(y),b=r(a,f,3),_=s(v.length),w=0,S=n?h(t,_):l?h(t,0):void 0;_>w;w++)if((d||w in v)&&(m=v[w],g=b(m,w,y),e))if(n)S[w]=g;else if(g)switch(e){case 3:return!0;case 5:return m;case 6:return w;case 2:S.push(m)}else if(u)return!1;return p?-1:c||u?u:S}}},function(e,t,n){var r=n(30),i=n(109);e.exports=n(35)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(472),i=n(2),o=n(199)(\"metadata\"),s=o.store||(o.store=new(n(798))),a=function(e,t,n){var i=s.get(e);if(!i){if(!n)return;s.set(e,i=new r)}var o=i.get(t);if(!o){if(!n)return;i.set(t,o=new r)}return o},l=function(e,t,n){var r=a(t,n,!1);return void 0!==r&&r.has(e)},c=function(e,t,n){var r=a(t,n,!1);return void 0===r?void 0:r.get(e)},u=function(e,t,n,r){a(n,r,!0).set(e,t)},p=function(e,t){var n=a(e,t,!1),r=[];return n&&n.forEach(function(e,t){r.push(t)}),r},d=function(e){return void 0===e||\"symbol\"==typeof e?e:String(e)},h=function(e){i(i.S,\"Reflect\",e)};e.exports={store:s,map:a,has:l,get:c,set:u,keys:p,key:d,exp:h}},function(e,t,n){var r=n(48),i=n(50),o=n(300)(\"IE_PROTO\"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=i(e),r(e,o)?e[o]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,n){\"use strict\";var r=n(347),i=function(){function InterpolationConfig(e,t){this.start=e,this.end=t}return InterpolationConfig.fromArray=function(e){return e?(r.assertInterpolationSymbols(\"interpolation\",e),new InterpolationConfig(e[0],e[1])):t.DEFAULT_INTERPOLATION_CONFIG},InterpolationConfig}();t.InterpolationConfig=i,t.DEFAULT_INTERPOLATION_CONFIG=new i(\"{{\",\"}}\")},[1107,263],function(e,t,n){\"use strict\";function controlPath(e,t){var n=r.ListWrapper.clone(t.path);return n.push(e),n}function setUpControl(e,t){o.isBlank(e)&&_throwError(t,\"Cannot find control with\"),o.isBlank(t.valueAccessor)&&_throwError(t,\"No value accessor for form control with\"),e.validator=s.Validators.compose([e.validator,t.validator]),e.asyncValidator=s.Validators.composeAsync([e.asyncValidator,t.asyncValidator]),t.valueAccessor.writeValue(e.value),t.valueAccessor.registerOnChange(function(n){t.viewToModelUpdate(n),e.markAsDirty(),e.setValue(n,{emitModelToViewChange:!1})}),e.registerOnChange(function(e,n){t.valueAccessor.writeValue(e),n&&t.viewToModelUpdate(e)}),t.valueAccessor.registerOnTouched(function(){return e.markAsTouched()})}function setUpFormContainer(e,t){o.isBlank(e)&&_throwError(t,\"Cannot find control with\"),e.validator=s.Validators.compose([e.validator,t.validator]),e.asyncValidator=s.Validators.composeAsync([e.asyncValidator,t.asyncValidator])}function _throwError(e,t){var n;throw n=e.path.length>1?\"path: '\"+e.path.join(\" -> \")+\"'\":e.path[0]?\"name: '\"+e.path+\"'\":\"unspecified name attribute\",new i.BaseException(t+\" \"+n)}function composeValidators(e){return o.isPresent(e)?s.Validators.compose(e.map(c.normalizeValidator)):null}function composeAsyncValidators(e){return o.isPresent(e)?s.Validators.composeAsync(e.map(c.normalizeAsyncValidator)):null}function isPropertyUpdated(e,t){if(!r.StringMapWrapper.contains(e,\"model\"))return!1;var n=e.model;return!!n.isFirstChange()||!o.looseIdentical(t,n.currentValue)}function selectValueAccessor(e,t){if(o.isBlank(t))return null;var n,r,i;return t.forEach(function(t){o.hasConstructor(t,l.DefaultValueAccessor)?n=t:o.hasConstructor(t,a.CheckboxControlValueAccessor)||o.hasConstructor(t,u.NumberValueAccessor)||o.hasConstructor(t,d.SelectControlValueAccessor)||o.hasConstructor(t,h.SelectMultipleControlValueAccessor)||o.hasConstructor(t,p.RadioControlValueAccessor)?(o.isPresent(r)&&_throwError(e,\"More than one built-in value accessor matches form control with\"),r=t):(o.isPresent(i)&&_throwError(e,\"More than one custom value accessor matches form control with\"),i=t)}),o.isPresent(i)?i:o.isPresent(r)?r:o.isPresent(n)?n:(_throwError(e,\"No valid value accessor for form control with\"),null)}var r=n(47),i=n(88),o=n(32),s=n(54),a=n(169),l=n(170),c=n(587),u=n(266),p=n(172),d=n(173),h=n(174);t.controlPath=controlPath,t.setUpControl=setUpControl,t.setUpFormContainer=setUpFormContainer,t.composeValidators=composeValidators,t.composeAsyncValidators=composeAsyncValidators,t.isPropertyUpdated=isPropertyUpdated,t.selectValueAccessor=selectValueAccessor},function(e,t){\"use strict\";!function(e){e[e.Get=0]=\"Get\",e[e.Post=1]=\"Post\",e[e.Put=2]=\"Put\",e[e.Delete=3]=\"Delete\",e[e.Options=4]=\"Options\",e[e.Head=5]=\"Head\",e[e.Patch=6]=\"Patch\"}(t.RequestMethod||(t.RequestMethod={}));t.RequestMethod;!function(e){e[e.Unsent=0]=\"Unsent\",e[e.Open=1]=\"Open\",e[e.HeadersReceived=2]=\"HeadersReceived\",e[e.Loading=3]=\"Loading\",e[e.Done=4]=\"Done\",e[e.Cancelled=5]=\"Cancelled\"}(t.ReadyState||(t.ReadyState={}));t.ReadyState;!function(e){e[e.Basic=0]=\"Basic\",e[e.Cors=1]=\"Cors\",e[e.Default=2]=\"Default\",e[e.Error=3]=\"Error\",e[e.Opaque=4]=\"Opaque\"}(t.ResponseType||(t.ResponseType={}));t.ResponseType;!function(e){e[e.NONE=0]=\"NONE\",e[e.JSON=1]=\"JSON\",e[e.FORM=2]=\"FORM\",e[e.FORM_DATA=3]=\"FORM_DATA\",e[e.TEXT=4]=\"TEXT\",e[e.BLOB=5]=\"BLOB\",e[e.ARRAY_BUFFER=6]=\"ARRAY_BUFFER\"}(t.ContentType||(t.ContentType={}));t.ContentType;!function(e){e[e.Text=0]=\"Text\",e[e.Json=1]=\"Json\",e[e.ArrayBuffer=2]=\"ArrayBuffer\",e[e.Blob=3]=\"Blob\"}(t.ResponseContentType||(t.ResponseContentType={}));t.ResponseContentType},[1106,418,419,419],function(e,t,n){\"use strict\";function createEmptyUrlTree(){return new o(new s([],{}),{},null)}function containsTree(e,t,n){return n?equalSegmentGroups(e.root,t.root):containsSegmentGroup(e.root,t.root)}function equalSegmentGroups(e,t){if(!equalPath(e.segments,t.segments))return!1;if(e.numberOfChildren!==t.numberOfChildren)return!1;for(var n in t.children){if(!e.children[n])return!1;if(!equalSegmentGroups(e.children[n],t.children[n]))return!1}return!0}function containsSegmentGroup(e,t){return containsSegmentGroupHelper(e,t,t.segments)}function containsSegmentGroupHelper(e,t,n){if(e.segments.length>n.length){var i=e.segments.slice(0,n.length);return!!equalPath(i,n)&&!t.hasChildren()}if(e.segments.length===n.length){if(!equalPath(e.segments,n))return!1;for(var o in t.children){if(!e.children[o])return!1;if(!containsSegmentGroup(e.children[o],t.children[o]))return!1}return!0}var i=n.slice(0,e.segments.length),s=n.slice(e.segments.length);return!!equalPath(e.segments,i)&&(!!e.children[r.PRIMARY_OUTLET]&&containsSegmentGroupHelper(e.children[r.PRIMARY_OUTLET],t,s))}function equalSegments(e,t){if(e.length!==t.length)return!1;for(var n=0;n0?n+\"(\"+o.join(\"//\")+\")\":\"\"+n}if(e.hasChildren()&&!t){var s=mapChildrenIntoArray(e,function(t,n){return n===r.PRIMARY_OUTLET?[serializeSegment(e.children[r.PRIMARY_OUTLET],!1)]:[n+\":\"+serializeSegment(t,!1)]});return serializePaths(e)+\"/(\"+s.join(\"//\")+\")\"}return serializePaths(e)}function encode(e){return encodeURIComponent(e)}function decode(e){return decodeURIComponent(e)}function serializePath(e){return\"\"+encode(e.path)+serializeParams(e.parameters)}function serializeParams(e){return pairs(e).map(function(e){return\";\"+encode(e.first)+\"=\"+encode(e.second)}).join(\"\")}function serializeQueryParams(e){var t=pairs(e).map(function(e){return encode(e.first)+\"=\"+encode(e.second)});return t.length>0?\"?\"+t.join(\"&\"):\"\"}function pairs(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(new u(n,e[n]));return t}function matchSegments(e){p.lastIndex=0;var t=e.match(p);return t?t[0]:\"\"}function matchQueryParams(e){d.lastIndex=0;var t=e.match(p);return t?t[0]:\"\"}function matchUrlQueryParamValue(e){h.lastIndex=0;var t=e.match(h);return t?t[0]:\"\"}var r=n(63),i=n(74);t.createEmptyUrlTree=createEmptyUrlTree,t.containsTree=containsTree;var o=function(){function UrlTree(e,t,n){this.root=e,this.queryParams=t,this.fragment=n}return UrlTree.prototype.toString=function(){return(new c).serialize(this)},UrlTree}();t.UrlTree=o;var s=function(){function UrlSegmentGroup(e,t){var n=this;this.segments=e,this.children=t,this.parent=null,i.forEach(t,function(e,t){return e.parent=n})}return UrlSegmentGroup.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(UrlSegmentGroup.prototype,\"numberOfChildren\",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),UrlSegmentGroup.prototype.toString=function(){return serializePaths(this)},UrlSegmentGroup}();t.UrlSegmentGroup=s;var a=function(){function UrlSegment(e,t){this.path=e,this.parameters=t}return UrlSegment.prototype.toString=function(){return serializePath(this)},UrlSegment}();t.UrlSegment=a,t.equalSegments=equalSegments,t.equalPath=equalPath,t.mapChildrenIntoArray=mapChildrenIntoArray;var l=function(){function UrlSerializer(){}return UrlSerializer}();t.UrlSerializer=l;var c=function(){function DefaultUrlSerializer(){}return DefaultUrlSerializer.prototype.parse=function(e){var t=new f(e);return new o(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())},DefaultUrlSerializer.prototype.serialize=function(e){var t=\"/\"+serializeSegment(e.root,!0),n=serializeQueryParams(e.queryParams),r=null!==e.fragment&&void 0!==e.fragment?\"#\"+encodeURIComponent(e.fragment):\"\";return\"\"+t+n+r},DefaultUrlSerializer}();t.DefaultUrlSerializer=c,t.serializePaths=serializePaths,t.encode=encode,t.decode=decode,t.serializePath=serializePath;var u=function(){function Pair(e,t){this.first=e,this.second=t}return Pair}(),p=/^[^\\/\\(\\)\\?;=&#]+/,d=/^[^=\\?&#]+/,h=/^[^\\?&#]+/,f=function(){function UrlParser(e){this.url=e,this.remaining=e}return UrlParser.prototype.peekStartsWith=function(e){return this.remaining.startsWith(e)},UrlParser.prototype.capture=function(e){if(!this.remaining.startsWith(e))throw new Error('Expected \"'+e+'\".');this.remaining=this.remaining.substring(e.length)},UrlParser.prototype.parseRootSegment=function(){return this.remaining.startsWith(\"/\")&&this.capture(\"/\"),\"\"===this.remaining||this.remaining.startsWith(\"?\")||this.remaining.startsWith(\"#\")?new s([],{}):new s([],this.parseChildren())},UrlParser.prototype.parseChildren=function(){if(0==this.remaining.length)return{};this.peekStartsWith(\"/\")&&this.capture(\"/\");var e=[];for(this.peekStartsWith(\"(\")||e.push(this.parseSegments());this.peekStartsWith(\"/\")&&!this.peekStartsWith(\"//\")&&!this.peekStartsWith(\"/(\");)this.capture(\"/\"),e.push(this.parseSegments());var t={};this.peekStartsWith(\"/(\")&&(this.capture(\"/\"),t=this.parseParens(!0));var n={};return this.peekStartsWith(\"(\")&&(n=this.parseParens(!1)),(e.length>0||Object.keys(t).length>0)&&(n[r.PRIMARY_OUTLET]=new s(e,t)),n},UrlParser.prototype.parseSegments=function(){var e=matchSegments(this.remaining);if(\"\"===e&&this.peekStartsWith(\";\"))throw new Error(\"Empty path url segment cannot have parameters: '\"+this.remaining+\"'.\");this.capture(e);var t={};return this.peekStartsWith(\";\")&&(t=this.parseMatrixParams()),new a(decode(e),t)},UrlParser.prototype.parseQueryParams=function(){var e={};if(this.peekStartsWith(\"?\"))for(this.capture(\"?\"),this.parseQueryParam(e);this.remaining.length>0&&this.peekStartsWith(\"&\");)this.capture(\"&\"),this.parseQueryParam(e);return e},UrlParser.prototype.parseFragment=function(){return this.peekStartsWith(\"#\")?decode(this.remaining.substring(1)):null},UrlParser.prototype.parseMatrixParams=function(){for(var e={};this.remaining.length>0&&this.peekStartsWith(\";\");)this.capture(\";\"),this.parseParam(e);return e},UrlParser.prototype.parseParam=function(e){var t=matchSegments(this.remaining);if(t){this.capture(t);var n=\"true\";if(this.peekStartsWith(\"=\")){this.capture(\"=\");var r=matchSegments(this.remaining);r&&(n=r,this.capture(n))}e[decode(t)]=decode(n)}},UrlParser.prototype.parseQueryParam=function(e){var t=matchQueryParams(this.remaining);if(t){this.capture(t);var n=\"\";if(this.peekStartsWith(\"=\")){this.capture(\"=\");var r=matchUrlQueryParamValue(this.remaining);r&&(n=r,this.capture(n))}e[decode(t)]=decode(n)}},UrlParser.prototype.parseParens=function(e){var t={};for(this.capture(\"(\");!this.peekStartsWith(\")\")&&this.remaining.length>0;){var n=matchSegments(this.remaining),i=this.remaining[n.length];if(\"/\"!==i&&\")\"!==i&&\";\"!==i)throw new Error(\"Cannot parse url '\"+this.url+\"'\");var o=void 0;n.indexOf(\":\")>-1?(o=n.substr(0,n.indexOf(\":\")),this.capture(o),this.capture(\":\")):e&&(o=r.PRIMARY_OUTLET);var a=this.parseChildren();t[o]=1===Object.keys(a).length?a[r.PRIMARY_OUTLET]:new s([],a),this.peekStartsWith(\"//\")&&this.capture(\"//\")}return this.capture(\")\"),t},UrlParser}()},function(e,t,n){\"use strict\";function shallowEqualArrays(e,t){if(e.length!==t.length)return!1;for(var n=0;n0?e[0]:null}function last(e){return e.length>0?e[e.length-1]:null}function and(e){return e.reduce(function(e,t){return e&&t},!0)}function merge(e,t){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);for(var r in t)t.hasOwnProperty(r)&&(n[r]=t[r]);return n}function forEach(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function waitForMap(e,t){var n=[],r={};return forEach(e,function(e,i){i===s.PRIMARY_OUTLET&&n.push(t(i,e).map(function(e){return r[i]=e,e}))}),forEach(e,function(e,i){i!==s.PRIMARY_OUTLET&&n.push(t(i,e).map(function(e){return r[i]=e,e}))}),n.length>0?o.of.apply(void 0,n).concatAll().last().map(function(e){return r}):o.of(r)}function andObservables(e){return e.mergeAll().every(function(e){return e===!0})}function wrapIntoObservable(e){return e instanceof r.Observable?e:e instanceof Promise?i.fromPromise(e):o.of(e)}n(304),n(497);var r=n(1),i=n(211),o=n(141),s=n(63);t.shallowEqualArrays=shallowEqualArrays,t.shallowEqual=shallowEqual,t.flatten=flatten,t.first=first,t.last=last,t.and=and,t.merge=merge,t.forEach=forEach,t.waitForMap=waitForMap,t.andObservables=andObservables,t.wrapIntoObservable=wrapIntoObservable},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError(\"Can't call method on \"+e);return e}},function(e,t,n){var r=n(137)(\"meta\"),i=n(15),o=n(48),s=n(30).f,a=0,l=Object.isExtensible||function(){return!0},c=!n(13)(function(){return l(Object.preventExtensions({}))}),u=function(e){s(e,r,{value:{i:\"O\"+ ++a,w:{}}})},p=function(e,t){if(!i(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!o(e,r)){if(!l(e))return\"F\";if(!t)return\"E\";u(e)}return e[r].i},d=function(e,t){if(!o(e,r)){if(!l(e))return!0;if(!t)return!1;u(e)}return e[r].w},h=function(e){return c&&f.NEED&&l(e)&&!o(e,r)&&u(e),e},f=e.exports={KEY:r,NEED:!1,fastKey:p,getWeak:d,onFreeze:h}},function(e,t,n){var r=n(197),i=n(109),o=n(57),s=n(97),a=n(48),l=n(453),c=Object.getOwnPropertyDescriptor;t.f=n(35)?c:function(e,t){if(e=o(e),t=s(t,!0),l)try{return c(e,t)}catch(n){}if(a(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t){e.exports=\".vt-row {\\n display: flex;\\n flex-wrap: wrap;\\n height: 100%;\\n width: 100%;\\n}\\n\\n.vt-card {\\n display: inline-table;\\n margin-left: 25px;\\n margin-bottom: 10px;\\n margin-top: 10px;\\n}\\n\\n.stats-container {\\n width: 100%;\\n}\\n\\n.vt-padding{\\n padding-left: 25px;\\n padding-right: 25px;\\n}\\n\\n>>> p-dialog .ui-dialog{\\n position: fixed !important;\\n top: 50% !important;\\n left: 50% !important;\\n transform: translate(-50%, -50%);\\n margin: 0;\\n width: auto !important;\\n}\\n\\n.vt-popUpContainer{\\n position: fixed;\\n padding: 0;\\n margin: 0;\\n z-index: 0;\\n bottom: 0;\\n right: 0;\\n top: 0;\\n left: 0;\\n min-height: 1000vh;\\n min-width: 1000vw;\\n height: 100%;\\n width: 100%;\\n background: rgba(0,0,0,0.6);\\n}\\n\\n.vt-dark-link:link {\\n text-decoration: none;\\n color: black;\\n}\\n\\n.vt-dark-link:visited {\\n text-decoration: none;\\n color: black;\\n}\\n\\n.vt-dark-link:hover {\\n text-decoration: none;\\n color: black;\\n}\\n\\n.vt-dark-link:active {\\n text-decoration: none;\\n color: black;\\n}\\n\\n/* Toolbar */\\n.vt-toolbar {\\n width: 100%;\\n text-align: center;\\n}\\n\\n>>> p-accordiontab a {\\n padding-left: 25px! important;\\n}\\n\\n>>> .ui-accordion-content button {\\n margin-top: 2px;\\n}\\n\\n>>> p-menu .ui-menu {\\n margin-top: 19px;\\n display: inline-block;\\n top: auto !important;\\n left: auto !important;\\n float: right;\\n \\n}\\n\\np-menu {\\n display: inline-block;\\n float: left;\\n}\\n\\n.vt-toolbar .vt-menu {\\n padding-top: 19px;\\n float: left;\\n}\\n\\n.vt-toolbar .vt-right-menu {\\n padding-top: 19px;\\n position: fixed;\\n right: 25px;\\n top: 19px;\\n}\\n\\n.vt-card-toolbar {\\n display: inline-block;\\n width: 100%;\\n}\\n\\n.vt-card-toolbar .vt-menu {\\n float: left;\\n}\\n.vt-card-toolbar .vt-title {\\n float: right;\\n margin: 0;\\n padding-left: 25px;\\n}\\n\\nmd-list:hover {\\n background: #E8E8E8\\n}\\n\"},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(1),o=n(308),s=n(80),a=n(98),l=function(e){function ArrayObservable(t,n){e.call(this),this.array=t,this.scheduler=n,n||1!==t.length||(this._isScalar=!0,this.value=t[0])}return r(ArrayObservable,e),ArrayObservable.create=function(e,t){return new ArrayObservable(e,t)},ArrayObservable.of=function(){for(var e=[],t=0;t1?new ArrayObservable(e,n):1===r?new o.ScalarObservable(e[0],n):new s.EmptyObservable(n)},ArrayObservable.dispatch=function(e){var t=e.array,n=e.index,r=e.count,i=e.subscriber;return n>=r?void i.complete():(i.next(t[n]),void(i.isUnsubscribed||(e.index=n+1,this.schedule(e))))},ArrayObservable.prototype._subscribe=function(e){var t=0,n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(ArrayObservable.dispatch,0,{array:n,index:t,count:r,subscriber:e});for(var o=0;o0?\" { \"+e.children.map(serializeNode).join(\", \")+\" } \":\"\";return\"\"+e.value+t}function advanceActivatedRoute(e){e.snapshot?(a.shallowEqual(e.snapshot.queryParams,e._futureSnapshot.queryParams)||e.queryParams.next(e._futureSnapshot.queryParams),e.snapshot.fragment!==e._futureSnapshot.fragment&&e.fragment.next(e._futureSnapshot.fragment),a.shallowEqual(e.snapshot.params,e._futureSnapshot.params)||(e.params.next(e._futureSnapshot.params),e.data.next(e._futureSnapshot.data)),a.shallowEqualArrays(e.snapshot.url,e._futureSnapshot.url)||e.url.next(e._futureSnapshot.url),e.snapshot=e._futureSnapshot):(e.snapshot=e._futureSnapshot,e.data.next(e._futureSnapshot.data))}var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(207),o=n(63),s=n(73),a=n(74),l=n(281),c=function(e){function RouterState(t,n){e.call(this,t),this.snapshot=n,setRouterStateSnapshot(this,t)}return r(RouterState,e),Object.defineProperty(RouterState.prototype,\"queryParams\",{get:function(){return this.root.queryParams},enumerable:!0,configurable:!0}),Object.defineProperty(RouterState.prototype,\"fragment\",{get:function(){return this.root.fragment},enumerable:!0,configurable:!0}),RouterState.prototype.toString=function(){return this.snapshot.toString()},RouterState}(l.Tree);t.RouterState=c,t.createEmptyState=createEmptyState;var u=function(){function ActivatedRoute(e,t,n,r,i,o,s,a){this.url=e,this.params=t,this.queryParams=n,this.fragment=r,this.data=i,this.outlet=o,this.component=s,this._futureSnapshot=a}return Object.defineProperty(ActivatedRoute.prototype,\"routeConfig\",{get:function(){return this._futureSnapshot.routeConfig},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRoute.prototype,\"root\",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRoute.prototype,\"parent\",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRoute.prototype,\"firstChild\",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRoute.prototype,\"children\",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRoute.prototype,\"pathFromRoot\",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),ActivatedRoute.prototype.toString=function(){return this.snapshot?this.snapshot.toString():\"Future(\"+this._futureSnapshot+\")\"},ActivatedRoute}();t.ActivatedRoute=u;var p=function(){function InheritedResolve(e,t){this.parent=e,this.current=t,this.resolvedData={}}return Object.defineProperty(InheritedResolve.prototype,\"flattenedResolvedData\",{get:function(){return this.parent?a.merge(this.parent.flattenedResolvedData,this.resolvedData):this.resolvedData},enumerable:!0,configurable:!0}),Object.defineProperty(InheritedResolve,\"empty\",{get:function(){return new InheritedResolve(null,{})},enumerable:!0,configurable:!0}),InheritedResolve}();t.InheritedResolve=p;var d=function(){function ActivatedRouteSnapshot(e,t,n,r,i,o,s,a,l,c,u){this.url=e,this.params=t,this.queryParams=n,this.fragment=r,this.data=i,this.outlet=o,this.component=s,this._routeConfig=a,this._urlSegment=l,this._lastPathIndex=c,this._resolve=u}return Object.defineProperty(ActivatedRouteSnapshot.prototype,\"routeConfig\",{get:function(){return this._routeConfig},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRouteSnapshot.prototype,\"root\",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRouteSnapshot.prototype,\"parent\",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRouteSnapshot.prototype,\"firstChild\",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRouteSnapshot.prototype,\"children\",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(ActivatedRouteSnapshot.prototype,\"pathFromRoot\",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),ActivatedRouteSnapshot.prototype.toString=function(){var e=this.url.map(function(e){return e.toString()}).join(\"/\"),t=this._routeConfig?this._routeConfig.path:\"\";return\"Route(url:'\"+e+\"', path:'\"+t+\"')\"},ActivatedRouteSnapshot}();t.ActivatedRouteSnapshot=d;var h=function(e){function RouterStateSnapshot(t,n){e.call(this,n),this.url=t,setRouterStateSnapshot(this,n)}return r(RouterStateSnapshot,e),Object.defineProperty(RouterStateSnapshot.prototype,\"queryParams\",{get:function(){return this.root.queryParams},enumerable:!0,configurable:!0}),Object.defineProperty(RouterStateSnapshot.prototype,\"fragment\",{get:function(){return this.root.fragment},enumerable:!0,configurable:!0}),RouterStateSnapshot.prototype.toString=function(){return serializeNode(this._root)},RouterStateSnapshot}(l.Tree);t.RouterStateSnapshot=h,t.advanceActivatedRoute=advanceActivatedRoute},function(e,t,n){\"use strict\";var r=n(43),i=(n.n(r),n(0));n.n(i);n.d(t,\"a\",function(){return a});var o=this&&this.__decorate||function(e,t,n,r){var i,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__metadata||function(e,t){if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},a=function(){function VtctlService(e){this.http=e,this.vtctlUrl=\"../api/vtctl/\"}return VtctlService.prototype.sendPostRequest=function(e,t){var n=new r.Headers({\"Content-Type\":\"application/json\"}),i=new r.RequestOptions({headers:n});return this.http.post(e,JSON.stringify(t),i).map(function(e){return e.json()})},VtctlService.prototype.runCommand=function(e){return this.sendPostRequest(this.vtctlUrl,e)},VtctlService=o([n.i(i.Injectable)(),s(\"design:paramtypes\",[\"function\"==typeof(e=\"undefined\"!=typeof r.Http&&r.Http)&&e||Object])],VtctlService);var e}()},function(e,t,n){\"use strict\";var r=n(192);n.d(t,\"a\",function(){return i});var i=function(){function DialogContent(e,t,n,r,i){void 0===e&&(e=\"\"),void 0===t&&(t={}),void 0===n&&(n={}),void 0===r&&(r=void 0),void 0===i&&(i=\"\"),this.nameId=e,this.flags=t,this.requiredFlags=n,this.prepareFunction=r,this.action=i}return DialogContent.prototype.getName=function(){return this.flags[this.nameId]?this.flags[this.nameId].getStrValue():\"\"},DialogContent.prototype.setName=function(e){this.flags[this.nameId]&&this.flags[this.nameId].setValue(e)},DialogContent.prototype.getPostBody=function(e){void 0===e&&(e=void 0),e||(e=this.getFlags());var t=[],n=[];t.push(this.action);for(var r=0,i=e;r1?\"path: '\"+e.path.join(\" -> \")+\"'\":e.path[0]?\"name: '\"+e.path+\"'\":\"unspecified name\",new i.BaseException(t+\" \"+n)}function composeValidators(e){return o.isPresent(e)?s.Validators.compose(e.map(c.normalizeValidator)):null}function composeAsyncValidators(e){return o.isPresent(e)?s.Validators.composeAsync(e.map(c.normalizeAsyncValidator)):null}function isPropertyUpdated(e,t){if(!r.StringMapWrapper.contains(e,\"model\"))return!1;var n=e.model;return!!n.isFirstChange()||!o.looseIdentical(t,n.currentValue)}function selectValueAccessor(e,t){if(o.isBlank(t))return null;var n,r,i;return t.forEach(function(t){o.hasConstructor(t,l.DefaultValueAccessor)?n=t:o.hasConstructor(t,a.CheckboxControlValueAccessor)||o.hasConstructor(t,u.NumberValueAccessor)||o.hasConstructor(t,d.SelectControlValueAccessor)||o.hasConstructor(t,h.SelectMultipleControlValueAccessor)||o.hasConstructor(t,p.RadioControlValueAccessor)?(o.isPresent(r)&&_throwError(e,\"More than one built-in value accessor matches form control with\"),r=t):(o.isPresent(i)&&_throwError(e,\"More than one custom value accessor matches form control with\"),i=t)}),o.isPresent(i)?i:o.isPresent(r)?r:o.isPresent(n)?n:(_throwError(e,\"No valid value accessor for form control with\"),null)}var r=n(34),i=n(83),o=n(7),s=n(58),a=n(144),l=n(145),c=n(526),u=n(227),p=n(146),d=n(147),h=n(228);t.controlPath=controlPath,t.setUpControl=setUpControl,t.setUpControlGroup=setUpControlGroup,t.composeValidators=composeValidators,t.composeAsyncValidators=composeAsyncValidators,t.isPropertyUpdated=isPropertyUpdated,t.selectValueAccessor=selectValueAccessor},function(e,t,n){\"use strict\";var r=n(0),i=n(18),o=n(28),s=function(){function CompilerConfig(e){var t=void 0===e?{}:e,n=t.renderTypes,i=void 0===n?new l:n,o=t.defaultEncapsulation,s=void 0===o?r.ViewEncapsulation.Emulated:o,a=t.genDebugInfo,c=t.logBindingUpdate,u=t.useJit,p=void 0===u||u,d=t.deprecatedPlatformDirectives,h=void 0===d?[]:d,f=t.deprecatedPlatformPipes,m=void 0===f?[]:f;this.renderTypes=i,this.defaultEncapsulation=s,this._genDebugInfo=a,this._logBindingUpdate=c,this.useJit=p,this.platformDirectives=h,this.platformPipes=m}return Object.defineProperty(CompilerConfig.prototype,\"genDebugInfo\",{get:function(){return void 0===this._genDebugInfo?r.isDevMode():this._genDebugInfo},enumerable:!0,configurable:!0}),Object.defineProperty(CompilerConfig.prototype,\"logBindingUpdate\",{get:function(){return void 0===this._logBindingUpdate?r.isDevMode():this._logBindingUpdate},enumerable:!0,configurable:!0}),CompilerConfig}();t.CompilerConfig=s;var a=function(){function RenderTypes(){}return Object.defineProperty(RenderTypes.prototype,\"renderer\",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(RenderTypes.prototype,\"renderText\",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(RenderTypes.prototype,\"renderElement\",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(RenderTypes.prototype,\"renderComment\",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(RenderTypes.prototype,\"renderNode\",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(RenderTypes.prototype,\"renderEvent\",{get:function(){return i.unimplemented()},enumerable:!0,configurable:!0}),RenderTypes}();t.RenderTypes=a;var l=function(){function DefaultRenderTypes(){this.renderer=o.Identifiers.Renderer,this.renderText=null,this.renderElement=null,this.renderComment=null,this.renderNode=null,this.renderEvent=null}return DefaultRenderTypes}();t.DefaultRenderTypes=l},function(e,t){\"use strict\";function splitNsName(e){if(\":\"!=e[0])return[null,e];var t=e.indexOf(\":\",1);if(t==-1)throw new Error('Unsupported format \"'+e+'\" expecting \":namespace:name\"');return[e.slice(1,t),e.slice(t+1)]}function getNsPrefix(e){return null===e?null:splitNsName(e)[0]}function mergeNsAndName(e,t){return e?\":\"+e+\":\"+t:t}!function(e){e[e.RAW_TEXT=0]=\"RAW_TEXT\",e[e.ESCAPABLE_RAW_TEXT=1]=\"ESCAPABLE_RAW_TEXT\",e[e.PARSABLE_DATA=2]=\"PARSABLE_DATA\"}(t.TagContentType||(t.TagContentType={}));t.TagContentType;t.splitNsName=splitNsName,t.getNsPrefix=getNsPrefix,t.mergeNsAndName=mergeNsAndName,t.NAMED_ENTITIES={Aacute:\"Á\",aacute:\"á\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",AElig:\"Æ\",aelig:\"æ\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",Alpha:\"Α\",alpha:\"α\",amp:\"&\",and:\"∧\",ang:\"∠\",apos:\"'\",Aring:\"Å\",aring:\"å\",asymp:\"≈\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",bdquo:\"„\",Beta:\"Β\",beta:\"β\",brvbar:\"¦\",bull:\"•\",cap:\"∩\",Ccedil:\"Ç\",ccedil:\"ç\",cedil:\"¸\",cent:\"¢\",Chi:\"Χ\",chi:\"χ\",circ:\"ˆ\",clubs:\"♣\",cong:\"≅\",copy:\"©\",crarr:\"↵\",cup:\"∪\",curren:\"¤\",dagger:\"†\",Dagger:\"‡\",darr:\"↓\",dArr:\"⇓\",deg:\"°\",Delta:\"Δ\",delta:\"δ\",diams:\"♦\",divide:\"÷\",Eacute:\"É\",eacute:\"é\",Ecirc:\"Ê\",ecirc:\"ê\",Egrave:\"È\",egrave:\"è\",empty:\"∅\",emsp:\"\u2003\",ensp:\"\u2002\",Epsilon:\"Ε\",epsilon:\"ε\",equiv:\"≡\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",exist:\"∃\",fnof:\"ƒ\",forall:\"∀\",frac12:\"½\",frac14:\"¼\",frac34:\"¾\",frasl:\"⁄\",Gamma:\"Γ\",gamma:\"γ\",ge:\"≥\",gt:\">\",harr:\"↔\",hArr:\"⇔\",hearts:\"♥\",hellip:\"…\",Iacute:\"Í\",iacute:\"í\",Icirc:\"Î\",icirc:\"î\",iexcl:\"¡\",Igrave:\"Ì\",igrave:\"ì\",image:\"ℑ\",infin:\"∞\",\"int\":\"∫\",Iota:\"Ι\",iota:\"ι\",iquest:\"¿\",isin:\"∈\",Iuml:\"Ï\",iuml:\"ï\",Kappa:\"Κ\",kappa:\"κ\",Lambda:\"Λ\",lambda:\"λ\",lang:\"⟨\",laquo:\"«\",larr:\"←\",lArr:\"⇐\",lceil:\"⌈\",ldquo:\"“\",le:\"≤\",lfloor:\"⌊\",lowast:\"∗\",loz:\"◊\",lrm:\"\u200e\",lsaquo:\"‹\",lsquo:\"‘\",lt:\"<\",macr:\"¯\",mdash:\"—\",micro:\"µ\",middot:\"·\",minus:\"−\",Mu:\"Μ\",mu:\"μ\",nabla:\"∇\",nbsp:\"\u00a0\",ndash:\"–\",ne:\"≠\",ni:\"∋\",not:\"¬\",notin:\"∉\",nsub:\"⊄\",Ntilde:\"Ñ\",ntilde:\"ñ\",Nu:\"Ν\",nu:\"ν\",Oacute:\"Ó\",oacute:\"ó\",Ocirc:\"Ô\",ocirc:\"ô\",OElig:\"Œ\",oelig:\"œ\",Ograve:\"Ò\",ograve:\"ò\",oline:\"‾\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",oplus:\"⊕\",or:\"∨\",ordf:\"ª\",ordm:\"º\",Oslash:\"Ø\",oslash:\"ø\",Otilde:\"Õ\",otilde:\"õ\",otimes:\"⊗\",Ouml:\"Ö\",ouml:\"ö\",para:\"¶\",permil:\"‰\",perp:\"⊥\",Phi:\"Φ\",phi:\"φ\",Pi:\"Π\",pi:\"π\",piv:\"ϖ\",plusmn:\"±\",pound:\"£\",prime:\"′\",Prime:\"″\",prod:\"∏\",prop:\"∝\",Psi:\"Ψ\",psi:\"ψ\",quot:'\"',radic:\"√\",rang:\"⟩\",raquo:\"»\",rarr:\"→\",rArr:\"⇒\",rceil:\"⌉\",rdquo:\"”\",real:\"ℜ\",reg:\"®\",rfloor:\"⌋\",Rho:\"Ρ\",rho:\"ρ\",rlm:\"\u200f\",rsaquo:\"›\",rsquo:\"’\",sbquo:\"‚\",Scaron:\"Š\",scaron:\"š\",sdot:\"⋅\",sect:\"§\",shy:\"\u00ad\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sim:\"∼\",spades:\"♠\",sub:\"⊂\",sube:\"⊆\",sum:\"∑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supe:\"⊇\",szlig:\"ß\",Tau:\"Τ\",tau:\"τ\",there4:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thinsp:\"\u2009\",THORN:\"Þ\",thorn:\"þ\",tilde:\"˜\",times:\"×\",trade:\"™\",Uacute:\"Ú\",uacute:\"ú\",uarr:\"↑\",uArr:\"⇑\",Ucirc:\"Û\",ucirc:\"û\",Ugrave:\"Ù\",ugrave:\"ù\",uml:\"¨\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",Uuml:\"Ü\",uuml:\"ü\",weierp:\"℘\",Xi:\"Ξ\",xi:\"ξ\",Yacute:\"Ý\",yacute:\"ý\",yen:\"¥\",yuml:\"ÿ\",Yuml:\"Ÿ\",Zeta:\"Ζ\",zeta:\"ζ\",zwj:\"\u200d\",zwnj:\"\u200c\"}},function(e,t,n){\"use strict\";function createUrlResolverWithoutPackagePrefix(){return new s}function createOfflineCompileUrlResolver(){return new s(o)}function getUrlScheme(e){var t=_split(e);return t&&t[a.Scheme]||\"\"}function _buildFromEncodedParts(e,t,n,r,o,s,a){var l=[];return i.isPresent(e)&&l.push(e+\":\"),i.isPresent(n)&&(l.push(\"//\"),i.isPresent(t)&&l.push(t+\"@\"),l.push(n),i.isPresent(r)&&l.push(\":\"+r)),i.isPresent(o)&&l.push(o),i.isPresent(s)&&l.push(\"?\"+s),i.isPresent(a)&&l.push(\"#\"+a),l.join(\"\")}function _split(e){return e.match(l)}function _removeDotSegments(e){if(\"/\"==e)return\"/\";for(var t=\"/\"==e[0]?\"/\":\"\",n=\"/\"===e[e.length-1]?\"/\":\"\",r=e.split(\"/\"),i=[],o=0,s=0;s0?i.pop():o++;break;default:i.push(a)}}if(\"\"==t){for(;o-- >0;)i.unshift(\"..\");0===i.length&&i.push(\".\")}return t+i.join(\"/\")+n}function _joinAndCanonicalizePath(e){var t=e[a.Path];return t=i.isBlank(t)?\"\":_removeDotSegments(t),e[a.Path]=t,_buildFromEncodedParts(e[a.Scheme],e[a.UserInfo],e[a.Domain],e[a.Port],t,e[a.QueryData],e[a.Fragment])}function _resolveUrl(e,t){var n=_split(encodeURI(t)),r=_split(e);if(i.isPresent(n[a.Scheme]))return _joinAndCanonicalizePath(n);n[a.Scheme]=r[a.Scheme];for(var o=a.Scheme;o<=a.Port;o++)i.isBlank(n[o])&&(n[o]=r[o]);if(\"/\"==n[a.Path][0])return _joinAndCanonicalizePath(n);var s=r[a.Path];i.isBlank(s)&&(s=\"/\");var l=s.lastIndexOf(\"/\");return s=s.substring(0,l+1)+n[a.Path],n[a.Path]=s,_joinAndCanonicalizePath(n)}var r=n(0),i=n(5),o=\"asset:\";t.createUrlResolverWithoutPackagePrefix=createUrlResolverWithoutPackagePrefix,t.createOfflineCompileUrlResolver=createOfflineCompileUrlResolver,t.DEFAULT_PACKAGE_URL_PROVIDER={provide:r.PACKAGE_ROOT_URL,useValue:\"/\"};var s=function(){function UrlResolver(e){void 0===e&&(e=null),this._packagePrefix=e}return UrlResolver.prototype.resolve=function(e,t){var n=t;i.isPresent(e)&&e.length>0&&(n=_resolveUrl(e,n));var r=_split(n),s=this._packagePrefix;if(i.isPresent(s)&&i.isPresent(r)&&\"package\"==r[a.Scheme]){var l=r[a.Path];if(this._packagePrefix!==o)return s=i.StringWrapper.stripRight(s,\"/\"),l=i.StringWrapper.stripLeft(l,\"/\"),s+\"/\"+l;var c=l.split(/\\//);n=\"asset:\"+c[0]+\"/lib/\"+c.slice(1).join(\"/\")}return n},UrlResolver.decorators=[{type:r.Injectable}],UrlResolver.ctorParameters=[{type:void 0,decorators:[{type:r.Inject,args:[r.PACKAGE_ROOT_URL]}]}],UrlResolver}();t.UrlResolver=s,t.getUrlScheme=getUrlScheme;var a,l=new RegExp(\"^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([\\\\w\\\\d\\\\-\\\\u0100-\\\\uffff.%]*)(?::([0-9]+))?)?([^?#]+)?(?:\\\\?([^#]*))?(?:#(.*))?$\");!function(e){e[e.Scheme=1]=\"Scheme\",e[e.UserInfo=2]=\"UserInfo\",e[e.Domain=3]=\"Domain\",e[e.Port=4]=\"Port\",e[e.Path=5]=\"Path\",e[e.QueryData=6]=\"QueryData\",e[e.Fragment=7]=\"Fragment\"}(a||(a={}))},function(e,t,n){\"use strict\";function _enumExpression(e,t){if(s.isBlank(t))return l.NULL_EXPR;var n=s.resolveEnumToken(e.runtime,t);return l.importExpr(new o.CompileIdentifierMetadata({name:e.name+\".\"+n,moduleUrl:e.moduleUrl,runtime:t}))}var r=n(0),i=n(27),o=n(31),s=n(5),a=n(28),l=n(17),c=function(){function ViewTypeEnum(){}return ViewTypeEnum.fromValue=function(e){return _enumExpression(a.Identifiers.ViewType,e)},ViewTypeEnum.HOST=ViewTypeEnum.fromValue(i.ViewType.HOST),ViewTypeEnum.COMPONENT=ViewTypeEnum.fromValue(i.ViewType.COMPONENT),ViewTypeEnum.EMBEDDED=ViewTypeEnum.fromValue(i.ViewType.EMBEDDED),ViewTypeEnum}();t.ViewTypeEnum=c;var u=function(){function ViewEncapsulationEnum(){}return ViewEncapsulationEnum.fromValue=function(e){return _enumExpression(a.Identifiers.ViewEncapsulation,e)},ViewEncapsulationEnum.Emulated=ViewEncapsulationEnum.fromValue(r.ViewEncapsulation.Emulated),ViewEncapsulationEnum.Native=ViewEncapsulationEnum.fromValue(r.ViewEncapsulation.Native),ViewEncapsulationEnum.None=ViewEncapsulationEnum.fromValue(r.ViewEncapsulation.None),ViewEncapsulationEnum}();t.ViewEncapsulationEnum=u;var p=function(){function ChangeDetectionStrategyEnum(){}return ChangeDetectionStrategyEnum.fromValue=function(e){return _enumExpression(a.Identifiers.ChangeDetectionStrategy,e)},ChangeDetectionStrategyEnum.OnPush=ChangeDetectionStrategyEnum.fromValue(r.ChangeDetectionStrategy.OnPush),ChangeDetectionStrategyEnum.Default=ChangeDetectionStrategyEnum.fromValue(r.ChangeDetectionStrategy.Default),ChangeDetectionStrategyEnum}();t.ChangeDetectionStrategyEnum=p;var d=function(){function ChangeDetectorStatusEnum(){}return ChangeDetectorStatusEnum.fromValue=function(e){return _enumExpression(a.Identifiers.ChangeDetectorStatus,e)},ChangeDetectorStatusEnum.CheckOnce=ChangeDetectorStatusEnum.fromValue(i.ChangeDetectorStatus.CheckOnce),ChangeDetectorStatusEnum.Checked=ChangeDetectorStatusEnum.fromValue(i.ChangeDetectorStatus.Checked),ChangeDetectorStatusEnum.CheckAlways=ChangeDetectorStatusEnum.fromValue(i.ChangeDetectorStatus.CheckAlways),ChangeDetectorStatusEnum.Detached=ChangeDetectorStatusEnum.fromValue(i.ChangeDetectorStatus.Detached),ChangeDetectorStatusEnum.Errored=ChangeDetectorStatusEnum.fromValue(i.ChangeDetectorStatus.Errored),ChangeDetectorStatusEnum.Destroyed=ChangeDetectorStatusEnum.fromValue(i.ChangeDetectorStatus.Destroyed),ChangeDetectorStatusEnum}();t.ChangeDetectorStatusEnum=d;var h=function(){function ViewConstructorVars(){}return ViewConstructorVars.viewUtils=l.variable(\"viewUtils\"),ViewConstructorVars.parentInjector=l.variable(\"parentInjector\"),ViewConstructorVars.declarationEl=l.variable(\"declarationEl\"),ViewConstructorVars}();t.ViewConstructorVars=h;var f=function(){function ViewProperties(){}return ViewProperties.renderer=l.THIS_EXPR.prop(\"renderer\"),ViewProperties.projectableNodes=l.THIS_EXPR.prop(\"projectableNodes\"),ViewProperties.viewUtils=l.THIS_EXPR.prop(\"viewUtils\"),ViewProperties}();t.ViewProperties=f;var m=function(){function EventHandlerVars(){}return EventHandlerVars.event=l.variable(\"$event\"),EventHandlerVars}();t.EventHandlerVars=m;var g=function(){function InjectMethodVars(){}return InjectMethodVars.token=l.variable(\"token\"),InjectMethodVars.requestNodeIndex=l.variable(\"requestNodeIndex\"),InjectMethodVars.notFoundResult=l.variable(\"notFoundResult\"),InjectMethodVars}();t.InjectMethodVars=g;var y=function(){function DetectChangesVars(){}return DetectChangesVars.throwOnChange=l.variable(\"throwOnChange\"),DetectChangesVars.changes=l.variable(\"changes\"),DetectChangesVars.changed=l.variable(\"changed\"),DetectChangesVars.valUnwrapper=l.variable(\"valUnwrapper\"),DetectChangesVars}();t.DetectChangesVars=y},99,function(e,t,n){var r=n(95);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(8),i=n(462),o=n(288),s=n(300)(\"IE_PROTO\"),a=function(){},l=\"prototype\",c=function(){var e,t=n(451)(\"iframe\"),r=o.length,i=\"<\",s=\">\";for(t.style.display=\"none\",n(452).appendChild(t),t.src=\"javascript:\",e=t.contentWindow.document,e.open(),e.write(i+\"script\"+s+\"document.F=Object\"+i+\"/script\"+s),e.close(),c=e.F;r--;)delete c[l][o[r]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[l]=r(e),n=new a,a[l]=null,n[s]=e):n=c(),void 0===t?n:i(n,t)}},function(e,t,n){var r=n(464),i=n(288);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){\"use strict\";function multicast(e){var t;return t=\"function\"==typeof e?e:function(){return e},new r.ConnectableObservable(this,t)}var r=n(502);t.multicast=multicast},[1107,219],function(e,t){\"use strict\";var n=function(){function ElementSchemaRegistry(){}return ElementSchemaRegistry}();t.ElementSchemaRegistry=n},function(e,t,n){\"use strict\";function getPropertyInView(e,t,n){if(t===n)return e;for(var o=s.THIS_EXPR,a=t;a!==n&&i.isPresent(a.declarationElement.view);)a=a.declarationElement.view,o=o.prop(\"parent\");if(a!==n)throw new r.BaseException(\"Internal error: Could not calculate a property in a parent view: \"+e);if(e instanceof s.ReadPropExpr){var l=e;(n.fields.some(function(e){return e.name==l.name})||n.getters.some(function(e){return e.name==l.name}))&&(o=o.cast(n.classType))}return s.replaceVarInExpression(s.THIS_EXPR.name,o,e)}function injectFromViewParentInjector(e,t){var n=[a.createDiTokenExpression(e)];return t&&n.push(s.NULL_EXPR),s.THIS_EXPR.prop(\"parentInjector\").callMethod(\"get\",n)}function getViewFactoryName(e,t){return\"viewFactory_\"+e.type.name+t}function createFlatArray(e){for(var t=[],n=s.literalArr([]),r=0;r0&&(n=n.callMethod(s.BuiltinMethod.ConcatArray,[s.literalArr(t)]),t=[]),n=n.callMethod(s.BuiltinMethod.ConcatArray,[i])):t.push(i)}return t.length>0&&(n=n.callMethod(s.BuiltinMethod.ConcatArray,[s.literalArr(t)])),n}function createPureProxy(e,t,n,a){a.fields.push(new s.ClassField(n.name,null));var l=t0){var r=e.substring(0,n),i=e.substring(n+1).trim();t.set(r,i)}}),t},Headers.prototype.append=function(e,t){e=normalize(e);var n=this._headersMap.get(e),i=r.isListLikeIterable(n)?n:[];i.push(t),this._headersMap.set(e,i)},Headers.prototype.delete=function(e){this._headersMap.delete(normalize(e))},Headers.prototype.forEach=function(e){this._headersMap.forEach(e)},Headers.prototype.get=function(e){return r.ListWrapper.first(this._headersMap.get(normalize(e)))},Headers.prototype.has=function(e){return this._headersMap.has(normalize(e))},Headers.prototype.keys=function(){return r.MapWrapper.keys(this._headersMap)},Headers.prototype.set=function(e,t){var n=[];if(r.isListLikeIterable(t)){var i=t.join(\",\");n.push(i)}else n.push(t);this._headersMap.set(normalize(e),n)},Headers.prototype.values=function(){return r.MapWrapper.values(this._headersMap)},Headers.prototype.toJSON=function(){var e={};return this._headersMap.forEach(function(t,n){var i=[];r.iterateListLike(t,function(e){return i=r.ListWrapper.concat(i,e.split(\",\"))}),e[normalize(n)]=i}),e},Headers.prototype.getAll=function(e){var t=this._headersMap.get(normalize(e));return r.isListLikeIterable(t)?t:[]},Headers.prototype.entries=function(){throw new i.BaseException('\"entries\" method is not implemented on Headers class')},Headers}();t.Headers=s},function(e,t){\"use strict\";var n=function(){function ConnectionBackend(){}return ConnectionBackend}();t.ConnectionBackend=n;var r=function(){function Connection(){}return Connection}();t.Connection=r;var i=function(){function XSRFStrategy(){}return XSRFStrategy}();t.XSRFStrategy=i},function(e,t,n){\"use strict\";var r=n(0);t.RenderDebugInfo=r.__core_private__.RenderDebugInfo,t.wtfInit=r.__core_private__.wtfInit,t.ReflectionCapabilities=r.__core_private__.ReflectionCapabilities,t.VIEW_ENCAPSULATION_VALUES=r.__core_private__.VIEW_ENCAPSULATION_VALUES,t.DebugDomRootRenderer=r.__core_private__.DebugDomRootRenderer,t.reflector=r.__core_private__.reflector,t.NoOpAnimationPlayer=r.__core_private__.NoOpAnimationPlayer,t.AnimationPlayer=r.__core_private__.AnimationPlayer,t.AnimationSequencePlayer=r.__core_private__.AnimationSequencePlayer,t.AnimationGroupPlayer=r.__core_private__.AnimationGroupPlayer,t.AnimationKeyframe=r.__core_private__.AnimationKeyframe,t.AnimationStyles=r.__core_private__.AnimationStyles,t.prepareFinalAnimationStyles=r.__core_private__.prepareFinalAnimationStyles,t.balanceAnimationKeyframes=r.__core_private__.balanceAnimationKeyframes,t.flattenStyles=r.__core_private__.flattenStyles,t.clearStyles=r.__core_private__.clearStyles,t.collectAndResolveStyles=r.__core_private__.collectAndResolveStyles},function(e,t,n){\"use strict\";var r=n(0);t.DOCUMENT=new r.OpaqueToken(\"DocumentToken\")},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(0),o=n(33),s=n(16),a=n(62),l=n(55),c=function(){function ClientMessageBrokerFactory(){}return ClientMessageBrokerFactory}();t.ClientMessageBrokerFactory=c;var u=function(e){function ClientMessageBrokerFactory_(t,n){e.call(this),this._messageBus=t,this._serializer=n}return r(ClientMessageBrokerFactory_,e),ClientMessageBrokerFactory_.prototype.createMessageBroker=function(e,t){return void 0===t&&(t=!0),this._messageBus.initChannel(e,t),new d(this._messageBus,this._serializer,e)},ClientMessageBrokerFactory_.decorators=[{type:i.Injectable}],ClientMessageBrokerFactory_.ctorParameters=[{type:a.MessageBus},{type:l.Serializer}],ClientMessageBrokerFactory_}(c);t.ClientMessageBrokerFactory_=u;var p=function(){function ClientMessageBroker(){}return ClientMessageBroker}();t.ClientMessageBroker=p;var d=function(e){function ClientMessageBroker_(t,n,r){var i=this;e.call(this),this.channel=r,this._pending=new Map,this._sink=t.to(r),this._serializer=n;var o=t.from(r);o.subscribe({next:function(e){return i._handleMessage(e)}})}return r(ClientMessageBroker_,e),ClientMessageBroker_.prototype._generateMessageId=function(e){for(var t=s.stringify(s.DateWrapper.toMillis(s.DateWrapper.now())),n=0,r=e+t+s.stringify(n);s.isPresent(this._pending[r]);)r=\"\"+e+t+n,n++;return r},ClientMessageBroker_.prototype.runOnService=function(e,t){var n=this,r=[];s.isPresent(e.args)&&e.args.forEach(function(e){null!=e.type?r.push(n._serializer.serialize(e.value,e.type)):r.push(e.value)});var i,o=null;if(null!=t){var a;i=new Promise(function(e,t){a={resolve:e,reject:t}}),o=this._generateMessageId(e.method),this._pending.set(o,a),i.catch(function(e){s.print(e),a.reject(e)}),i=i.then(function(e){return null==n._serializer?e:n._serializer.deserialize(e,t)})}else i=null;var l={method:e.method,args:r};return null!=o&&(l.id=o),this._sink.emit(l),i},ClientMessageBroker_.prototype._handleMessage=function(e){var t=new h(e);if(s.StringWrapper.equals(t.type,\"result\")||s.StringWrapper.equals(t.type,\"error\")){var n=t.id;this._pending.has(n)&&(s.StringWrapper.equals(t.type,\"result\")?this._pending.get(n).resolve(t.value):this._pending.get(n).reject(t.value),this._pending.delete(n))}},ClientMessageBroker_}(p);t.ClientMessageBroker_=d;var h=function(){function MessageData(e){this.type=o.StringMapWrapper.get(e,\"type\"),this.id=this._getValueIfPresent(e,\"id\"),this.value=this._getValueIfPresent(e,\"value\")}return MessageData.prototype._getValueIfPresent=function(e,t){return o.StringMapWrapper.contains(e,t)?o.StringMapWrapper.get(e,t):null},MessageData}(),f=function(){function FnArg(e,t){this.value=e,this.type=t}return FnArg}();t.FnArg=f;var m=function(){function UiArguments(e,t){this.method=e,this.args=t}return UiArguments}();t.UiArguments=m},function(e,t,n){\"use strict\";var r=n(0),i=function(){function RenderStore(){this._nextIndex=0,this._lookupById=new Map,this._lookupByObject=new Map}return RenderStore.prototype.allocateId=function(){return this._nextIndex++},RenderStore.prototype.store=function(e,t){this._lookupById.set(t,e),this._lookupByObject.set(e,t)},RenderStore.prototype.remove=function(e){var t=this._lookupByObject.get(e);this._lookupByObject.delete(e),this._lookupById.delete(t)},RenderStore.prototype.deserialize=function(e){return null==e?null:this._lookupById.has(e)?this._lookupById.get(e):null},RenderStore.prototype.serialize=function(e){return null==e?null:this._lookupByObject.get(e)},RenderStore.decorators=[{type:r.Injectable}],RenderStore.ctorParameters=[],RenderStore}();t.RenderStore=i},function(e,t,n){\"use strict\";var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(0),o=n(33),s=n(16),a=n(62),l=n(55),c=function(){function ServiceMessageBrokerFactory(){}return ServiceMessageBrokerFactory}();t.ServiceMessageBrokerFactory=c;var u=function(e){function ServiceMessageBrokerFactory_(t,n){e.call(this),this._messageBus=t,this._serializer=n}return r(ServiceMessageBrokerFactory_,e),ServiceMessageBrokerFactory_.prototype.createMessageBroker=function(e,t){return void 0===t&&(t=!0),this._messageBus.initChannel(e,t),new d(this._messageBus,this._serializer,e)},ServiceMessageBrokerFactory_.decorators=[{type:i.Injectable}],ServiceMessageBrokerFactory_.ctorParameters=[{type:a.MessageBus},{type:l.Serializer}],ServiceMessageBrokerFactory_}(c);t.ServiceMessageBrokerFactory_=u;var p=function(){function ServiceMessageBroker(){}return ServiceMessageBroker}();t.ServiceMessageBroker=p;var d=function(e){function ServiceMessageBroker_(t,n,r){var i=this;e.call(this),this._serializer=n,this.channel=r,this._methods=new o.Map,this._sink=t.to(r);var s=t.from(r);s.subscribe({next:function(e){return i._handleMessage(e)}})}return r(ServiceMessageBroker_,e),ServiceMessageBroker_.prototype.registerMethod=function(e,t,n,r){var i=this;this._methods.set(e,function(e){for(var a=e.args,l=null===t?0:t.length,c=o.ListWrapper.createFixedSize(l),u=0;u0?n[n.length-1]._routeConfig._loadedConfig:null}function nodeChildrenAsMap(e){return e?e.children.reduce(function(e,t){return e[t.value.outlet]=t,e},{}):{}}function getOutlet(e,t){var n=e._outlets[t.outlet];if(!n){var r=t.component.name;throw t.outlet===g.PRIMARY_OUTLET?new Error(\"Cannot find primary outlet to load '\"+r+\"'\"):new Error(\"Cannot find the outlet \"+t.outlet+\" to load '\"+r+\"'\")}return n}n(140),n(499),n(305),n(500),n(493);var r=n(0),i=n(20),o=n(309),s=n(141),a=n(623),l=n(624),c=n(625),u=n(626),p=n(627),d=n(628),h=n(187),f=n(129),m=n(91),g=n(63),y=n(73),v=n(74),b=function(){function NavigationStart(e,t){this.id=e,this.url=t}return NavigationStart.prototype.toString=function(){return\"NavigationStart(id: \"+this.id+\", url: '\"+this.url+\"')\"},NavigationStart}();t.NavigationStart=b;var _=function(){function NavigationEnd(e,t,n){this.id=e,this.url=t,this.urlAfterRedirects=n}return NavigationEnd.prototype.toString=function(){return\"NavigationEnd(id: \"+this.id+\", url: '\"+this.url+\"', urlAfterRedirects: '\"+this.urlAfterRedirects+\"')\"},NavigationEnd}();t.NavigationEnd=_;var w=function(){function NavigationCancel(e,t){this.id=e,this.url=t}return NavigationCancel.prototype.toString=function(){return\"NavigationCancel(id: \"+this.id+\", url: '\"+this.url+\"')\"},NavigationCancel}();t.NavigationCancel=w;var S=function(){function NavigationError(e,t,n){this.id=e,this.url=t,this.error=n}return NavigationError.prototype.toString=function(){return\"NavigationError(id: \"+this.id+\", url: '\"+this.url+\"', error: \"+this.error+\")\"},NavigationError}();t.NavigationError=S;var C=function(){function RoutesRecognized(e,t,n,r){this.id=e,this.url=t,this.urlAfterRedirects=n,this.state=r}return RoutesRecognized.prototype.toString=function(){return\"RoutesRecognized(id: \"+this.id+\", url: '\"+this.url+\"', urlAfterRedirects: '\"+this.urlAfterRedirects+\"', state: \"+this.state+\")\"},RoutesRecognized}();t.RoutesRecognized=C;var E=function(){function Router(e,t,n,r,o,s,a,l){this.rootComponentType=e,this.resolver=t,this.urlSerializer=n,this.outletMap=r,this.location=o,this.injector=s,this.navigationId=0,this.navigated=!1,this.resetConfig(l),this.routerEvents=new i.Subject,this.currentUrlTree=y.createEmptyUrlTree(),this.configLoader=new h.RouterConfigLoader(a),this.currentRouterState=m.createEmptyState(this.currentUrlTree,this.rootComponentType)}return Router.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),this.navigateByUrl(this.location.path(!0))},Object.defineProperty(Router.prototype,\"routerState\",{get:function(){return this.currentRouterState},enumerable:!0,configurable:!0}),Object.defineProperty(Router.prototype,\"url\",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),Object.defineProperty(Router.prototype,\"events\",{get:function(){return this.routerEvents},enumerable:!0,configurable:!0}),Router.prototype.resetConfig=function(e){l.validateConfig(e),this.config=e},Router.prototype.ngOnDestroy=function(){this.dispose()},Router.prototype.dispose=function(){this.locationSubscription.unsubscribe()},Router.prototype.createUrlTree=function(e,t){var n=void 0===t?{}:t,r=n.relativeTo,i=n.queryParams,o=n.fragment,s=n.preserveQueryParams,a=n.preserveFragment,l=r?r:this.routerState.root,c=s?this.currentUrlTree.queryParams:i,p=a?this.currentUrlTree.fragment:o;return u.createUrlTree(l,this.currentUrlTree,e,c,p)},Router.prototype.navigateByUrl=function(e,t){if(void 0===t&&(t={skipLocationChange:!1}),e instanceof y.UrlTree)return this.scheduleNavigation(e,t);var n=this.urlSerializer.parse(e);return this.scheduleNavigation(n,t)},Router.prototype.navigate=function(e,t){return void 0===t&&(t={skipLocationChange:!1}),this.scheduleNavigation(this.createUrlTree(e,t),t)},Router.prototype.serializeUrl=function(e){return this.urlSerializer.serialize(e)},Router.prototype.parseUrl=function(e){return this.urlSerializer.parse(e)},Router.prototype.isActive=function(e,t){if(e instanceof y.UrlTree)return y.containsTree(this.currentUrlTree,e,t);var n=this.urlSerializer.parse(e);return y.containsTree(this.currentUrlTree,n,t)},Router.prototype.scheduleNavigation=function(e,t){var n=this,r=++this.navigationId;return this.routerEvents.next(new b(r,this.serializeUrl(e))),Promise.resolve().then(function(i){return n.runNavigate(e,t.skipLocationChange,r)})},Router.prototype.setUpLocationChangeListener=function(){var e=this;this.locationSubscription=this.location.subscribe(Zone.current.wrap(function(t){var n=e.urlSerializer.parse(t.url);return e.currentUrlTree.toString()!==n.toString()?e.scheduleNavigation(n,t.pop):null}))},Router.prototype.runNavigate=function(e,t,n){var r=this;return n!==this.navigationId?(this.location.go(this.urlSerializer.serialize(this.currentUrlTree)),this.routerEvents.next(new w(n,this.serializeUrl(e))),Promise.resolve(!1)):new Promise(function(i,o){var l,u,h,f,m=r.currentRouterState,g=r.currentUrlTree;a.applyRedirects(r.injector,r.configLoader,e,r.config).mergeMap(function(e){return f=e,p.recognize(r.rootComponentType,r.config,f,r.serializeUrl(f))}).mergeMap(function(t){return r.routerEvents.next(new C(n,r.serializeUrl(e),r.serializeUrl(f),t)),d.resolve(r.resolver,t)}).map(function(e){return c.createRouterState(e,r.currentRouterState)}).map(function(e){l=e,h=new P(l.snapshot,r.currentRouterState.snapshot,r.injector),h.traverse(r.outletMap)}).mergeMap(function(e){return h.checkGuards()}).mergeMap(function(e){return e?h.resolveData().map(function(){return e}):s.of(e)}).forEach(function(i){if(!i||n!==r.navigationId)return r.routerEvents.next(new w(n,r.serializeUrl(e))),void(u=!1);if(r.currentUrlTree=f,r.currentRouterState=l,new x(l,m).activate(r.outletMap),!t){var o=r.urlSerializer.serialize(f);r.location.isCurrentPathEqualTo(o)?r.location.replaceState(o):r.location.go(o)}u=!0}).then(function(){r.navigated=!0,r.routerEvents.next(new _(n,r.serializeUrl(e),r.serializeUrl(f))),i(u)},function(t){r.currentRouterState=m,r.currentUrlTree=g,r.routerEvents.next(new S(n,r.serializeUrl(e),t)),o(t)})})},Router}();t.Router=E;var R=function(){function CanActivate(e){this.path=e}return Object.defineProperty(CanActivate.prototype,\"route\",{get:function(){return this.path[this.path.length-1]},enumerable:!0,configurable:!0}),CanActivate}(),T=function(){function CanDeactivate(e,t){this.component=e,this.route=t}return CanDeactivate}(),P=function(){function PreActivation(e,t,n){this.future=e,this.curr=t,this.injector=n,this.checks=[]}return PreActivation.prototype.traverse=function(e){var t=this.future._root,n=this.curr?this.curr._root:null;this.traverseChildRoutes(t,n,e,[t.value])},PreActivation.prototype.checkGuards=function(){var e=this;return 0===this.checks.length?s.of(!0):o.from(this.checks).map(function(t){if(t instanceof R)return v.andObservables(o.from([e.runCanActivate(t.route),e.runCanActivateChild(t.path)]));if(t instanceof T){var n=t;return e.runCanDeactivate(n.component,n.route)}throw new Error(\"Cannot be reached\")}).mergeAll().every(function(e){return e===!0})},PreActivation.prototype.resolveData=function(){var e=this;return 0===this.checks.length?s.of(null):o.from(this.checks).mergeMap(function(t){return t instanceof R?e.runResolve(t.route):s.of(null)}).reduce(function(e,t){return e})},PreActivation.prototype.traverseChildRoutes=function(e,t,n,r){var i=this,o=nodeChildrenAsMap(t);e.children.forEach(function(e){i.traverseRoutes(e,o[e.value.outlet],n,r.concat([e.value])),delete o[e.value.outlet]}),v.forEach(o,function(e,t){return i.deactivateOutletAndItChildren(e,n._outlets[t])})},PreActivation.prototype.traverseRoutes=function(e,t,n,r){var i=e.value,o=t?t.value:null,s=n?n._outlets[e.value.outlet]:null;o&&i._routeConfig===o._routeConfig?(v.shallowEqual(i.params,o.params)||this.checks.push(new T(s.component,o),new R(r)),i.component?this.traverseChildRoutes(e,t,s?s.outletMap:null,r):this.traverseChildRoutes(e,t,n,r)):(o&&(o.component?this.deactivateOutletAndItChildren(o,s):this.deactivateOutletMap(n)),this.checks.push(new R(r)),i.component?this.traverseChildRoutes(e,null,s?s.outletMap:null,r):this.traverseChildRoutes(e,null,n,r))},PreActivation.prototype.deactivateOutletAndItChildren=function(e,t){t&&t.isActivated&&(this.deactivateOutletMap(t.outletMap),this.checks.push(new T(t.component,e)))},PreActivation.prototype.deactivateOutletMap=function(e){var t=this;v.forEach(e._outlets,function(e){e.isActivated&&t.deactivateOutletAndItChildren(e.activatedRoute.snapshot,e)})},PreActivation.prototype.runCanActivate=function(e){var t=this,n=e._routeConfig?e._routeConfig.canActivate:null;if(!n||0===n.length)return s.of(!0);var r=o.from(n).map(function(n){var r=t.getToken(n,e,t.future);return r.canActivate?v.wrapIntoObservable(r.canActivate(e,t.future)):v.wrapIntoObservable(r(e,t.future))});return v.andObservables(r)},PreActivation.prototype.runCanActivateChild=function(e){var t=this,n=e[e.length-1],r=e.slice(0,e.length-1).reverse().map(function(e){return t.extractCanActivateChild(e)}).filter(function(e){return null!==e});return v.andObservables(o.from(r).map(function(e){var r=o.from(e.guards).map(function(e){var r=t.getToken(e,e.node,t.future);return r.canActivateChild?v.wrapIntoObservable(r.canActivateChild(n,t.future)):v.wrapIntoObservable(r(n,t.future))});return v.andObservables(r)}))},PreActivation.prototype.extractCanActivateChild=function(e){var t=e._routeConfig?e._routeConfig.canActivateChild:null;return t&&0!==t.length?{node:e,guards:t}:null},PreActivation.prototype.runCanDeactivate=function(e,t){var n=this,r=t&&t._routeConfig?t._routeConfig.canDeactivate:null;return r&&0!==r.length?o.from(r).map(function(r){var i=n.getToken(r,t,n.curr);return i.canDeactivate?v.wrapIntoObservable(i.canDeactivate(e,t,n.curr)):v.wrapIntoObservable(i(e,t,n.curr))}).mergeAll().every(function(e){return e===!0}):s.of(!0)},PreActivation.prototype.runResolve=function(e){var t=e._resolve;return this.resolveNode(t.current,e).map(function(n){return t.resolvedData=n,e.data=v.merge(e.data,t.flattenedResolvedData),null})},PreActivation.prototype.resolveNode=function(e,t){var n=this;return v.waitForMap(e,function(e,r){var i=n.getToken(r,t,n.future);return i.resolve?v.wrapIntoObservable(i.resolve(t,n.future)):v.wrapIntoObservable(i(t,n.future))})},PreActivation.prototype.getToken=function(e,t,n){var r=closestLoadedConfig(n,t),i=r?r.injector:this.injector;return i.get(e)},PreActivation}(),x=function(){function ActivateRoutes(e,t){this.futureState=e,this.currState=t}return ActivateRoutes.prototype.activate=function(e){var t=this.futureState._root,n=this.currState?this.currState._root:null;m.advanceActivatedRoute(this.futureState.root),this.activateChildRoutes(t,n,e)},ActivateRoutes.prototype.activateChildRoutes=function(e,t,n){var r=this,i=nodeChildrenAsMap(t);e.children.forEach(function(e){r.activateRoutes(e,i[e.value.outlet],n),delete i[e.value.outlet]}),v.forEach(i,function(e,t){return r.deactivateOutletAndItChildren(n._outlets[t])})},ActivateRoutes.prototype.activateRoutes=function(e,t,n){\nvar r=e.value,i=t?t.value:null;if(r===i)if(m.advanceActivatedRoute(r),r.component){var o=getOutlet(n,e.value);this.activateChildRoutes(e,t,o.outletMap)}else this.activateChildRoutes(e,t,n);else{if(i)if(i.component){var o=getOutlet(n,e.value);this.deactivateOutletAndItChildren(o)}else this.deactivateOutletMap(n);if(r.component){m.advanceActivatedRoute(r);var o=getOutlet(n,e.value),s=new f.RouterOutletMap;this.placeComponentIntoOutlet(s,r,o),this.activateChildRoutes(e,null,s)}else m.advanceActivatedRoute(r),this.activateChildRoutes(e,null,n)}},ActivateRoutes.prototype.placeComponentIntoOutlet=function(e,t,n){var i=[{provide:m.ActivatedRoute,useValue:t},{provide:f.RouterOutletMap,useValue:e}],o=closestLoadedConfig(this.futureState.snapshot,t.snapshot),s=null,a=null;o&&(s=o.factoryResolver,a=o.injector,i.push({provide:r.ComponentFactoryResolver,useValue:s})),n.activate(t,s,a,r.ReflectiveInjector.resolve(i),e)},ActivateRoutes.prototype.deactivateOutletAndItChildren=function(e){e&&e.isActivated&&(this.deactivateOutletMap(e.outletMap),e.deactivate())},ActivateRoutes.prototype.deactivateOutletMap=function(e){var t=this;v.forEach(e._outlets,function(e){return t.deactivateOutletAndItChildren(e)})},ActivateRoutes}()},function(e,t){\"use strict\";var n=function(){function RouterOutletMap(){this._outlets={}}return RouterOutletMap.prototype.registerOutlet=function(e,t){this._outlets[e]=t},RouterOutletMap.prototype.removeOutlet=function(e){this._outlets[e]=void 0},RouterOutletMap}();t.RouterOutletMap=n},function(e,t,n){\"use strict\";var r=n(43),i=(n.n(r),n(0));n.n(i);n.d(t,\"a\",function(){return a});var o=this&&this.__decorate||function(e,t,n,r){var i,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},s=this&&this.__metadata||function(e,t){if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},a=function(){function FeaturesService(e){var t=this;this.http=e,this.activeReparents=!1,this.showStatus=!1,this.showTopologyCRUD=!1,this.showWorkflows=!1,this.workflows=[],this.featuresUrl=\"../api/features\",this.getFeatures().subscribe(function(e){t.activeReparents=e.activeReparents,t.showStatus=e.showStatus,t.showTopologyCRUD=e.showTopologyCRUD,t.showWorkflows=e.showWorkflows,t.workflows=e.workflows})}return FeaturesService.prototype.getFeatures=function(){return this.http.get(this.featuresUrl).map(function(e){return e.json()})},FeaturesService=o([n.i(i.Injectable)(),s(\"design:paramtypes\",[\"function\"==typeof(e=\"undefined\"!=typeof r.Http&&r.Http)&&e||Object])],FeaturesService);var e}()},function(e,t,n){\"use strict\";var r=n(43),i=(n.n(r),n(0)),o=(n.n(i),n(484)),s=(n.n(o),n(283)),a=n(644),l=n(284);n.d(t,\"a\",function(){return p});var c=this&&this.__decorate||function(e,t,n,r){var i,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},u=this&&this.__metadata||function(e,t){if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},p=function(){function KeyspaceService(e,t){this.http=e,this.shardService=t,this.keyspacesUrl=\"../api/keyspaces/\",this.srvKeyspaceUrl=\"../api/srv_keyspace/local/\"}return KeyspaceService.prototype.getShards=function(e){return this.shardService.getShards(e)},KeyspaceService.prototype.getKeyspaceNames=function(){return this.http.get(this.keyspacesUrl).map(function(e){return e.json()})},KeyspaceService.prototype.getSrvKeyspaces=function(){return this.http.get(this.srvKeyspaceUrl).map(function(e){return e.json()})},KeyspaceService.prototype.SrvKeyspaceAndNamesObservable=function(){var e=this.getKeyspaceNames(),t=this.getSrvKeyspaces();return e.combineLatest(t)},KeyspaceService.prototype.getKeyspaceShardingData=function(e){return this.http.get(this.keyspacesUrl+e).map(function(e){return e.json()})},KeyspaceService.prototype.getShardsAndShardingData=function(e){var t=this.getShards(e),n=this.getKeyspaceShardingData(e);return t.combineLatest(n)},KeyspaceService.prototype.buildKeyspace=function(e,t){return this.getShardsAndShardingData(e).map(function(n){var r=n[0],i=n[1],o=new a.a(e);return t.forEach(function(e){return o.addServingShard(e)}),r.forEach(function(e){o.contains(e)||o.addNonservingShard(e)}),o.shardingColumnName=i.sharding_column_name||\"\",o.shardingColumnType=i.sharding_column_type||\"\",o})},KeyspaceService.prototype.getServingShards=function(e,t){if(t&&t[e]){var n=t[e].partitions;if(void 0===n)return[];for(var r=0;r=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(t,n,s):i(t,n))||s);return o>3&&s&&Object.defineProperty(t,n,s),s},i=this&&this.__metadata||function(e,t){if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.metadata)return Reflect.metadata(e,t)},o=n(0),s=n(9),a=n(3),l=function(){function Button(e,t){this.el=e,this.domHandler=t,this.iconPos=\"left\"}return Button.prototype.ngAfterViewInit=function(){if(this.domHandler.addMultipleClasses(this.el.nativeElement,this.getStyleClass()),this.icon){var e=document.createElement(\"span\"),t=\"right\"==this.iconPos?\"ui-button-icon-right\":\"ui-button-icon-left\";e.className=t+\" ui-c fa fa-fw \"+this.icon,this.el.nativeElement.appendChild(e)}var n=document.createElement(\"span\");n.className=\"ui-button-text ui-c\",n.appendChild(document.createTextNode(this.label||\"ui-button\")),this.el.nativeElement.appendChild(n),this.initialized=!0},Button.prototype.onMouseenter=function(e){this.hover=!0},Button.prototype.onMouseleave=function(e){this.hover=!1,this.active=!1},Button.prototype.onMouseDown=function(e){this.active=!0},Button.prototype.onMouseUp=function(e){this.active=!1},Button.prototype.onFocus=function(e){this.focus=!0},Button.prototype.onBlur=function(e){this.focus=!1},Button.prototype.isDisabled=function(){return this.el.nativeElement.disabled},Button.prototype.getStyleClass=function(){var e=\"ui-button ui-widget ui-state-default ui-corner-all\";return e+=this.icon?null!=this.label&&void 0!=this.label?\"left\"==this.iconPos?\" ui-button-text-icon-left\":\" ui-button-text-icon-right\":\" ui-button-icon-only\":\" ui-button-text-only\"},Object.defineProperty(Button.prototype,\"label\",{get:function(){return this._label},set:function(e){this._label=e,this.initialized&&(this.domHandler.findSingle(this.el.nativeElement,\".ui-button-text\").textContent=this._label)},enumerable:!0,configurable:!0}),Button.prototype.ngOnDestroy=function(){for(;this.el.nativeElement.hasChildNodes();)this.el.nativeElement.removeChild(this.el.nativeElement.lastChild);this.initialized=!1},r([o.Input(),i(\"design:type\",String)],Button.prototype,\"icon\",void 0),r([o.Input(),i(\"design:type\",String)],Button.prototype,\"iconPos\",void 0),r([o.HostListener(\"mouseenter\",[\"$event\"]),i(\"design:type\",Function),i(\"design:paramtypes\",[Object]),i(\"design:returntype\",void 0)],Button.prototype,\"onMouseenter\",null),r([o.HostListener(\"mouseleave\",[\"$event\"]),i(\"design:type\",Function),i(\"design:paramtypes\",[Object]),i(\"design:returntype\",void 0)],Button.prototype,\"onMouseleave\",null),r([o.HostListener(\"mousedown\",[\"$event\"]),i(\"design:type\",Function),i(\"design:paramtypes\",[Object]),i(\"design:returntype\",void 0)],Button.prototype,\"onMouseDown\",null),r([o.HostListener(\"mouseup\",[\"$event\"]),i(\"design:type\",Function),i(\"design:paramtypes\",[Object]),i(\"design:returntype\",void 0)],Button.prototype,\"onMouseUp\",null),r([o.HostListener(\"focus\",[\"$event\"]),i(\"design:type\",Function),i(\"design:paramtypes\",[Object]),i(\"design:returntype\",void 0)],Button.prototype,\"onFocus\",null),r([o.HostListener(\"blur\",[\"$event\"]),i(\"design:type\",Function),i(\"design:paramtypes\",[Object]),i(\"design:returntype\",void 0)],Button.prototype,\"onBlur\",null),r([o.Input(),i(\"design:type\",String)],Button.prototype,\"label\",null),Button=r([o.Directive({selector:\"[pButton]\",host:{\"[class.ui-state-hover]\":\"hover&&!isDisabled()\",\"[class.ui-state-focus]\":\"focus\",\"[class.ui-state-active]\":\"active\",\"[class.ui-state-disabled]\":\"isDisabled()\"},providers:[s.DomHandler]}),i(\"design:paramtypes\",[o.ElementRef,s.DomHandler])],Button)}();t.Button=l;var c=function(){function ButtonModule(){}return ButtonModule=r([o.NgModule({imports:[a.CommonModule],exports:[l],declarations:[l]}),i(\"design:paramtypes\",[])],ButtonModule)}();t.ButtonModule=c},function(e,t,n){\"use strict\";var r=n(1),i=n(505);r.Observable.prototype.map=i.map},function(e,t,n){\"use strict\";var r=n(79);t.of=r.ArrayObservable.of},function(e,t,n){\"use strict\";var r=n(51),i=r.root.Symbol;if(\"function\"==typeof i)i.iterator?t.$$iterator=i.iterator:\"function\"==typeof i.for&&(t.$$iterator=i.for(\"iterator\"));else if(r.root.Set&&\"function\"==typeof(new r.root.Set)[\"@@iterator\"])t.$$iterator=\"@@iterator\";else if(r.root.Map)for(var o=Object.getOwnPropertyNames(r.root.Map.prototype),s=0;s=this.length?i.$EOF:o.StringWrapper.charCodeAt(this.input,this.index)},_Scanner.prototype.scanToken=function(){for(var e=this.input,t=this.length,n=this.peek,r=this.index;n<=i.$SPACE;){if(++r>=t){n=i.$EOF;break}n=o.StringWrapper.charCodeAt(e,r)}if(this.peek=n,this.index=r,r>=t)return null;if(isIdentifierStart(n))return this.scanIdentifier();if(i.isDigit(n))return this.scanNumber(r);var s=r;switch(n){case i.$PERIOD:return this.advance(),i.isDigit(this.peek)?this.scanNumber(s):newCharacterToken(s,i.$PERIOD);case i.$LPAREN:case i.$RPAREN:case i.$LBRACE:case i.$RBRACE:case i.$LBRACKET:case i.$RBRACKET:case i.$COMMA:case i.$COLON:case i.$SEMICOLON:return this.scanCharacter(s,n);case i.$SQ:case i.$DQ:return this.scanString();case i.$HASH:case i.$PLUS:case i.$MINUS:case i.$STAR:case i.$SLASH:case i.$PERCENT:case i.$CARET:return this.scanOperator(s,o.StringWrapper.fromCharCode(n));case i.$QUESTION:return this.scanComplexOperator(s,\"?\",i.$PERIOD,\".\");case i.$LT:case i.$GT:return this.scanComplexOperator(s,o.StringWrapper.fromCharCode(n),i.$EQ,\"=\");case i.$BANG:case i.$EQ:return this.scanComplexOperator(s,o.StringWrapper.fromCharCode(n),i.$EQ,\"=\",i.$EQ,\"=\");case i.$AMPERSAND:return this.scanComplexOperator(s,\"&\",i.$AMPERSAND,\"&\");case i.$BAR:return this.scanComplexOperator(s,\"|\",i.$BAR,\"|\");case i.$NBSP:for(;i.isWhitespace(this.peek);)this.advance();return this.scanToken()}return this.advance(),this.error(\"Unexpected character [\"+o.StringWrapper.fromCharCode(n)+\"]\",0)},_Scanner.prototype.scanCharacter=function(e,t){return this.advance(),newCharacterToken(e,t)},_Scanner.prototype.scanOperator=function(e,t){return this.advance(),newOperatorToken(e,t)},_Scanner.prototype.scanComplexOperator=function(e,t,n,r,i,s){this.advance();var a=t;return this.peek==n&&(this.advance(),a+=r),o.isPresent(i)&&this.peek==i&&(this.advance(),a+=s),newOperatorToken(e,a)},_Scanner.prototype.scanIdentifier=function(){var e=this.index;for(this.advance();isIdentifierPart(this.peek);)this.advance();var t=this.input.substring(e,this.index);return a.indexOf(t)>-1?newKeywordToken(e,t):newIdentifierToken(e,t)},_Scanner.prototype.scanNumber=function(e){var t=this.index===e;for(this.advance();;){if(i.isDigit(this.peek));else if(this.peek==i.$PERIOD)t=!1;else{if(!isExponentStart(this.peek))break;if(this.advance(),isExponentSign(this.peek)&&this.advance(),!i.isDigit(this.peek))return this.error(\"Invalid exponent\",-1);t=!1}this.advance()}var n=this.input.substring(e,this.index),r=t?o.NumberWrapper.parseIntAutoRadix(n):o.NumberWrapper.parseFloat(n);return newNumberToken(e,r)},_Scanner.prototype.scanString=function(){var e=this.index,t=this.peek;this.advance();for(var n,r=this.index,s=this.input;this.peek!=t;)if(this.peek==i.$BACKSLASH){null==n&&(n=new o.StringJoiner),n.add(s.substring(r,this.index)),this.advance();var a;if(this.peek==i.$u){var l=s.substring(this.index+1,this.index+5);try{a=o.NumberWrapper.parseInt(l,16)}catch(c){return this.error(\"Invalid unicode escape [\\\\u\"+l+\"]\",0)}for(var u=0;u<5;u++)this.advance()}else a=unescape(this.peek),this.advance();n.add(o.StringWrapper.fromCharCode(a)),r=this.index}else{if(this.peek==i.$EOF)return this.error(\"Unterminated quote\",0);this.advance()}var p=s.substring(r,this.index);this.advance();var d=p;return null!=n&&(n.add(p),d=n.toString()),newStringToken(e,d)},_Scanner.prototype.error=function(e,t){var n=this.index+t;return newErrorToken(n,\"Lexer Error: \"+e+\" at column \"+n+\" in expression [\"+this.input+\"]\")},_Scanner}();t.isIdentifier=isIdentifier,t.isQuote=isQuote},function(e,t,n){\"use strict\";function _createInterpolateRegExp(e){var t=o.escapeRegExp(e.start)+\"([\\\\s\\\\S]*?)\"+o.escapeRegExp(e.end);return new RegExp(t,\"g\")}var r=n(0),i=n(233),o=n(5),s=n(68),a=n(236),l=n(151),c=function(){function SplitInterpolation(e,t){this.strings=e,this.expressions=t}return SplitInterpolation}();t.SplitInterpolation=c;var u=function(){function TemplateBindingParseResult(e,t,n){this.templateBindings=e,this.warnings=t,this.errors=n}return TemplateBindingParseResult}();t.TemplateBindingParseResult=u;var p=function(){function Parser(e){this._lexer=e,this.errors=[]}return Parser.prototype.parseAction=function(e,t,n){void 0===n&&(n=s.DEFAULT_INTERPOLATION_CONFIG),this._checkNoInterpolation(e,t,n);var r=this._lexer.tokenize(this._stripComments(e)),i=new d(e,t,r,(!0),this.errors).parseChain();return new a.ASTWithSource(i,e,t,this.errors)},Parser.prototype.parseBinding=function(e,t,n){void 0===n&&(n=s.DEFAULT_INTERPOLATION_CONFIG);var r=this._parseBindingAst(e,t,n);return new a.ASTWithSource(r,e,t,this.errors)},Parser.prototype.parseSimpleBinding=function(e,t,n){void 0===n&&(n=s.DEFAULT_INTERPOLATION_CONFIG);var r=this._parseBindingAst(e,t,n);return h.check(r)||this._reportError(\"Host binding expression can only contain field access and constants\",e,t),new a.ASTWithSource(r,e,t,this.errors)},Parser.prototype._reportError=function(e,t,n,r){this.errors.push(new a.ParserError(e,t,n,r))},Parser.prototype._parseBindingAst=function(e,t,n){var r=this._parseQuote(e,t);if(o.isPresent(r))return r;this._checkNoInterpolation(e,t,n);var i=this._lexer.tokenize(this._stripComments(e));return new d(e,t,i,(!1),this.errors).parseChain()},Parser.prototype._parseQuote=function(e,t){if(o.isBlank(e))return null;var n=e.indexOf(\":\");if(n==-1)return null;var r=e.substring(0,n).trim();if(!l.isIdentifier(r))return null;var i=e.substring(n+1);return new a.Quote(new a.ParseSpan(0,e.length),r,i,t)},Parser.prototype.parseTemplateBindings=function(e,t){var n=this._lexer.tokenize(e);return new d(e,t,n,(!1),this.errors).parseTemplateBindings()},Parser.prototype.parseInterpolation=function(e,t,n){void 0===n&&(n=s.DEFAULT_INTERPOLATION_CONFIG);var r=this.splitInterpolation(e,t,n);if(null==r)return null;for(var i=[],l=0;l0?l.push(p):this._reportError(\"Blank expressions are not allowed in interpolated strings\",e,\"at column \"+this._findInterpolationErrorColumn(i,u,n)+\" in\",t)}return new c(a,l)},Parser.prototype.wrapLiteralPrimitive=function(e,t){return new a.ASTWithSource(new a.LiteralPrimitive(new a.ParseSpan(0,o.isBlank(e)?0:e.length),e),e,t,this.errors)},Parser.prototype._stripComments=function(e){var t=this._commentStart(e);return o.isPresent(t)?e.substring(0,t).trim():e},Parser.prototype._commentStart=function(e){for(var t=null,n=0;n1&&this._reportError(\"Got interpolation (\"+n.start+n.end+\") where expression was expected\",e,\"at column \"+this._findInterpolationErrorColumn(i,1,n)+\" in\",t)},Parser.prototype._findInterpolationErrorColumn=function(e,t,n){for(var r=\"\",i=0;i\":case\"<=\":case\">=\":this.advance();var n=this.parseAdditive();e=new a.Binary(this.span(e.span.start),t,e,n);continue}break}return e},_ParseAST.prototype.parseAdditive=function(){for(var e=this.parseMultiplicative();this.next.type==l.TokenType.Operator;){var t=this.next.strValue;switch(t){case\"+\":case\"-\":this.advance();var n=this.parseMultiplicative();e=new a.Binary(this.span(e.span.start),t,e,n);continue}break}return e},_ParseAST.prototype.parseMultiplicative=function(){for(var e=this.parsePrefix();this.next.type==l.TokenType.Operator;){var t=this.next.strValue;switch(t){case\"*\":case\"%\":case\"/\":this.advance();var n=this.parsePrefix();e=new a.Binary(this.span(e.span.start),t,e,n);continue}break}return e},_ParseAST.prototype.parsePrefix=function(){if(this.next.type==l.TokenType.Operator){var e=this.inputIndex,t=this.next.strValue,n=void 0;switch(t){case\"+\":return this.advance(),this.parsePrefix();case\"-\":return this.advance(),n=this.parsePrefix(),new a.Binary(this.span(e),t,new a.LiteralPrimitive(new a.ParseSpan(e,e),0),n);case\"!\":return this.advance(),n=this.parsePrefix(),new a.PrefixNot(this.span(e),n)}}return this.parseCallChain()},_ParseAST.prototype.parseCallChain=function(){for(var e=this.parsePrimary();;)if(this.optionalCharacter(i.$PERIOD))e=this.parseAccessMemberOrMethodCall(e,!1);else if(this.optionalOperator(\"?.\"))e=this.parseAccessMemberOrMethodCall(e,!0);else if(this.optionalCharacter(i.$LBRACKET)){this.rbracketsExpected++;var t=this.parsePipe();if(this.rbracketsExpected--,this.expectCharacter(i.$RBRACKET),this.optionalOperator(\"=\")){var n=this.parseConditional();e=new a.KeyedWrite(this.span(e.span.start),e,t,n)}else e=new a.KeyedRead(this.span(e.span.start),e,t)}else{if(!this.optionalCharacter(i.$LPAREN))return e;this.rparensExpected++;var r=this.parseCallArguments();this.rparensExpected--,this.expectCharacter(i.$RPAREN),e=new a.FunctionCall(this.span(e.span.start),e,r)}},_ParseAST.prototype.parsePrimary=function(){var e=this.inputIndex;if(this.optionalCharacter(i.$LPAREN)){this.rparensExpected++;var t=this.parsePipe();return this.rparensExpected--,this.expectCharacter(i.$RPAREN),t}if(this.next.isKeywordNull())return this.advance(),new a.LiteralPrimitive(this.span(e),null);if(this.next.isKeywordUndefined())return this.advance(),new a.LiteralPrimitive(this.span(e),(void 0));if(this.next.isKeywordTrue())return this.advance(),new a.LiteralPrimitive(this.span(e),(!0));if(this.next.isKeywordFalse())return this.advance(),new a.LiteralPrimitive(this.span(e),(!1));if(this.next.isKeywordThis())return this.advance(),new a.ImplicitReceiver(this.span(e));if(this.optionalCharacter(i.$LBRACKET)){this.rbracketsExpected++;var n=this.parseExpressionList(i.$RBRACKET);return this.rbracketsExpected--,this.expectCharacter(i.$RBRACKET),new a.LiteralArray(this.span(e),n)}if(this.next.isCharacter(i.$LBRACE))return this.parseLiteralMap();if(this.next.isIdentifier())return this.parseAccessMemberOrMethodCall(new a.ImplicitReceiver(this.span(e)),!1);if(this.next.isNumber()){var r=this.next.toNumber();return this.advance(),new a.LiteralPrimitive(this.span(e),r)}if(this.next.isString()){var o=this.next.toString();return this.advance(),new a.LiteralPrimitive(this.span(e),o)}return this.index>=this.tokens.length?(this.error(\"Unexpected end of expression: \"+this.input),new a.EmptyExpr(this.span(e))):(this.error(\"Unexpected token \"+this.next),new a.EmptyExpr(this.span(e)))},_ParseAST.prototype.parseExpressionList=function(e){var t=[];if(!this.next.isCharacter(e))do t.push(this.parsePipe());while(this.optionalCharacter(i.$COMMA));return t},_ParseAST.prototype.parseLiteralMap=function(){var e=[],t=[],n=this.inputIndex;if(this.expectCharacter(i.$LBRACE),!this.optionalCharacter(i.$RBRACE)){this.rbracesExpected++;do{var r=this.expectIdentifierOrKeywordOrString();e.push(r),this.expectCharacter(i.$COLON),t.push(this.parsePipe())}while(this.optionalCharacter(i.$COMMA));this.rbracesExpected--,this.expectCharacter(i.$RBRACE)}return new a.LiteralMap(this.span(n),e,t)},_ParseAST.prototype.parseAccessMemberOrMethodCall=function(e,t){void 0===t&&(t=!1);var n=e.span.start,r=this.expectIdentifierOrKeyword();if(this.optionalCharacter(i.$LPAREN)){this.rparensExpected++;var o=this.parseCallArguments();this.expectCharacter(i.$RPAREN),this.rparensExpected--;var s=this.span(n);return t?new a.SafeMethodCall(s,e,r,o):new a.MethodCall(s,e,r,o)}if(t)return this.optionalOperator(\"=\")?(this.error(\"The '?.' operator cannot be used in the assignment\"),new a.EmptyExpr(this.span(n))):new a.SafePropertyRead(this.span(n),e,r);if(this.optionalOperator(\"=\")){if(!this.parseAction)return this.error(\"Bindings cannot contain assignments\"),new a.EmptyExpr(this.span(n));var l=this.parseConditional();return new a.PropertyWrite(this.span(n),e,r,l)}return new a.PropertyRead(this.span(n),e,r)},_ParseAST.prototype.parseCallArguments=function(){if(this.next.isCharacter(i.$RPAREN))return[];var e=[];do e.push(this.parsePipe());while(this.optionalCharacter(i.$COMMA));return e},_ParseAST.prototype.expectTemplateBindingKey=function(){var e=\"\",t=!1;do e+=this.expectIdentifierOrKeywordOrString(),t=this.optionalOperator(\"-\"),t&&(e+=\"-\");while(t);return e.toString()},_ParseAST.prototype.parseTemplateBindings=function(){for(var e=[],t=null,n=[];this.index0&&e[e.length-1]===t}var r=this&&this.__extends||function(e,t){function __(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)},i=n(10),o=n(5),s=n(60),a=n(85),l=n(68),c=n(546),u=n(102),p=function(e){function TreeError(t,n,r){e.call(this,n,r),this.elementName=t}return r(TreeError,e),TreeError.create=function(e,t,n){return new TreeError(e,t,n)},TreeError}(s.ParseError);t.TreeError=p;var d=function(){function ParseTreeResult(e,t){this.rootNodes=e,this.errors=t}return ParseTreeResult}();t.ParseTreeResult=d;var h=function(){function Parser(e){this._getTagDefinition=e}return Parser.prototype.parse=function(e,t,n,r){void 0===n&&(n=!1),void 0===r&&(r=l.DEFAULT_INTERPOLATION_CONFIG);var i=c.tokenize(e,t,this._getTagDefinition,n,r),o=new f(i.tokens,this._getTagDefinition).build();return new d(o.rootNodes,i.errors.concat(o.errors))},Parser}();t.Parser=h;var f=function(){function _TreeBuilder(e,t){this.tokens=e,this.getTagDefinition=t,this._index=-1,this._rootNodes=[],this._errors=[],this._elementStack=[],this._advance()}return _TreeBuilder.prototype.build=function(){for(;this._peek.type!==c.TokenType.EOF;)this._peek.type===c.TokenType.TAG_OPEN_START?this._consumeStartTag(this._advance()):this._peek.type===c.TokenType.TAG_CLOSE?this._consumeEndTag(this._advance()):this._peek.type===c.TokenType.CDATA_START?(this._closeVoidElement(),this._consumeCdata(this._advance())):this._peek.type===c.TokenType.COMMENT_START?(this._closeVoidElement(),this._consumeComment(this._advance())):this._peek.type===c.TokenType.TEXT||this._peek.type===c.TokenType.RAW_TEXT||this._peek.type===c.TokenType.ESCAPABLE_RAW_TEXT?(this._closeVoidElement(),this._consumeText(this._advance())):this._peek.type===c.TokenType.EXPANSION_FORM_START?this._consumeExpansion(this._advance()):this._advance();return new d(this._rootNodes,this._errors)},_TreeBuilder.prototype._advance=function(){var e=this._peek;return this._index0)return this._errors=this._errors.concat(i.errors),null;var l=new s.ParseSourceSpan(e.sourceSpan.start,r.sourceSpan.end),u=new s.ParseSourceSpan(t.sourceSpan.start,r.sourceSpan.end);return new a.ExpansionCase(e.parts[0],i.rootNodes,l,e.sourceSpan,u)},_TreeBuilder.prototype._collectExpansionExpTokens=function(e){for(var t=[],n=[c.TokenType.EXPANSION_CASE_EXP_START];;){if(this._peek.type!==c.TokenType.EXPANSION_FORM_START&&this._peek.type!==c.TokenType.EXPANSION_CASE_EXP_START||n.push(this._peek.type),this._peek.type===c.TokenType.EXPANSION_CASE_EXP_END){if(!lastOnStack(n,c.TokenType.EXPANSION_CASE_EXP_START))return this._errors.push(p.create(null,e.sourceSpan,\"Invalid ICU message. Missing '}'.\")),null;if(n.pop(),0==n.length)return t}if(this._peek.type===c.TokenType.EXPANSION_FORM_END){if(!lastOnStack(n,c.TokenType.EXPANSION_FORM_START))return this._errors.push(p.create(null,e.sourceSpan,\"Invalid ICU message. Missing '}'.\")),null;n.pop()}if(this._peek.type===c.TokenType.EOF)return this._errors.push(p.create(null,e.sourceSpan,\"Invalid ICU message. Missing '}'.\")),null;t.push(this._advance())}},_TreeBuilder.prototype._consumeText=function(e){var t=e.parts[0];if(t.length>0&&\"\\n\"==t[0]){var n=this._getParentElement();o.isPresent(n)&&0==n.children.length&&this.getTagDefinition(n.name).ignoreFirstLf&&(t=t.substring(1))}t.length>0&&this._addToParent(new a.Text(t,e.sourceSpan))},_TreeBuilder.prototype._closeVoidElement=function(){if(this._elementStack.length>0){var e=i.ListWrapper.last(this._elementStack);this.getTagDefinition(e.name).isVoid&&this._elementStack.pop()}},_TreeBuilder.prototype._consumeStartTag=function(e){for(var t=e.parts[0],n=e.parts[1],r=[];this._peek.type===c.TokenType.ATTR_NAME;)r.push(this._consumeAttr(this._advance()));var i=this._getElementFullName(t,n,this._getParentElement()),o=!1;if(this._peek.type===c.TokenType.TAG_OPEN_END_VOID){this._advance(),o=!0;var l=this.getTagDefinition(i);l.canSelfClose||null!==u.getNsPrefix(i)||l.isVoid||this._errors.push(p.create(i,e.sourceSpan,'Only void and foreign elements can be self closed \"'+e.parts[1]+'\"'))}else this._peek.type===c.TokenType.TAG_OPEN_END&&(this._advance(),o=!1);var d=this._peek.sourceSpan.start,h=new s.ParseSourceSpan(e.sourceSpan.start,d),f=new a.Element(i,r,[],h,h,null);this._pushElement(f),o&&(this._popElement(i),f.endSourceSpan=h)},_TreeBuilder.prototype._pushElement=function(e){if(this._elementStack.length>0){var t=i.ListWrapper.last(this._elementStack);this.getTagDefinition(t.name).isClosedByChild(e.name)&&this._elementStack.pop()}var n=this.getTagDefinition(e.name),r=this._getParentElementSkippingContainers(),s=r.parent,l=r.container;if(o.isPresent(s)&&n.requireExtraParent(s.name)){var c=new a.Element(n.parentToAdd,[],[],e.sourceSpan,e.startSourceSpan,e.endSourceSpan);this._insertBeforeContainer(s,l,c)}this._addToParent(e),this._elementStack.push(e)},_TreeBuilder.prototype._consumeEndTag=function(e){var t=this._getElementFullName(e.parts[0],e.parts[1],this._getParentElement());this._getParentElement()&&(this._getParentElement().endSourceSpan=e.sourceSpan),this.getTagDefinition(t).isVoid?this._errors.push(p.create(t,e.sourceSpan,'Void elements do not have end tags \"'+e.parts[1]+'\"')):this._popElement(t)||this._errors.push(p.create(t,e.sourceSpan,'Unexpected closing tag \"'+e.parts[1]+'\"'))},_TreeBuilder.prototype._popElement=function(e){for(var t=this._elementStack.length-1;t>=0;t--){var n=this._elementStack[t];if(n.name==e)return i.ListWrapper.splice(this._elementStack,t,this._elementStack.length-t),!0;if(!this.getTagDefinition(n.name).closedByParent)return!1}return!1},_TreeBuilder.prototype._consumeAttr=function(e){var t=u.mergeNsAndName(e.parts[0],e.parts[1]),n=e.sourceSpan.end,r=\"\";if(this._peek.type===c.TokenType.ATTR_VALUE){var i=this._advance();r=i.parts[0],n=i.sourceSpan.end}return new a.Attribute(t,r,new s.ParseSourceSpan(e.sourceSpan.start,n))},_TreeBuilder.prototype._getParentElement=function(){return this._elementStack.length>0?i.ListWrapper.last(this._elementStack):null},_TreeBuilder.prototype._getParentElementSkippingContainers=function(){for(var e=null,t=this._elementStack.length-1;t>=0;t--){if(\"ng-container\"!==this._elementStack[t].name)return{parent:this._elementStack[t],container:e};e=this._elementStack[t]}return{parent:i.ListWrapper.last(this._elementStack),container:e}},_TreeBuilder.prototype._addToParent=function(e){var t=this._getParentElement();o.isPresent(t)?t.children.push(e):this._rootNodes.push(e)},_TreeBuilder.prototype._insertBeforeContainer=function(e,t,n){if(t){if(e){var r=e.children.indexOf(t);e.children[r]=n}else this._rootNodes.push(n);n.children.push(t),this._elementStack.splice(this._elementStack.indexOf(t),0,n)}else this._addToParent(n),this._elementStack.push(n)},_TreeBuilder.prototype._getElementFullName=function(e,t,n){return o.isBlank(e)&&(e=this.getTagDefinition(t).implicitNamespacePrefix,o.isBlank(e)&&o.isPresent(n)&&(e=u.getNsPrefix(n.name))),u.mergeNsAndName(e,t)},_TreeBuilder}()},function(e,t,n){\"use strict\";function splitClasses(e){return e.trim().split(/\\s+/g)}function createElementCssSelector(e,t){var n=new w.CssSelector,r=y.splitNsName(e)[1];n.setElement(r);for(var i=0;i0&&this._console.warn(\"Template parse warnings:\\n\"+a.join(\"\\n\")),l.length>0){var c=l.join(\"\\n\");throw new u.BaseException(\"Template parse errors:\\n\"+c)}return s.templateAst},TemplateParser.prototype.tryParse=function(e,t,n,r,i,o){var a;e.template&&(a=g.InterpolationConfig.fromArray(e.template.interpolation));var l,c=this._htmlParser.parse(t,o,!0,a),u=c.errors;if(0==u.length){var d=m.expandNodes(c.rootNodes);u.push.apply(u,d.errors),c=new f.ParseTreeResult(d.nodes,u)}if(c.rootNodes.length>0){var y=s.removeIdentifierDuplicates(n),v=s.removeIdentifierDuplicates(r),_=new b.ProviderViewContext(e,c.rootNodes[0].sourceSpan),w=new j(_,y,v,i,this._exprParser,this._schemaRegistry);l=h.visitAll(w,c.rootNodes,z),u.push.apply(u,w.errors.concat(_.errors))}else l=[];return this._assertNoReferenceDuplicationOnTemplate(l,u),u.length>0?new L(l,u):(p.isPresent(this.transforms)&&this.transforms.forEach(function(e){l=E.templateVisitAll(e,l)}),new L(l,u))},TemplateParser.prototype._assertNoReferenceDuplicationOnTemplate=function(e,t){var n=[];e.filter(function(e){return!!e.references}).forEach(function(e){return e.references.forEach(function(e){var r=e.name;if(n.indexOf(r)<0)n.push(r);else{var i=new V('Reference \"#'+r+'\" is defined several times',e.sourceSpan,v.ParseErrorLevel.FATAL);t.push(i)}})})},TemplateParser.decorators=[{type:i.Injectable}],TemplateParser.ctorParameters=[{type:l.Parser},{type:_.ElementSchemaRegistry},{type:f.HtmlParser},{type:o.Console},{type:Array,decorators:[{type:i.Optional},{type:i.Inject,args:[t.TEMPLATE_TRANSFORMS]}]}],TemplateParser}();t.TemplateParser=F;var j=function(){function TemplateParseVisitor(e,t,n,r,i,o){var s=this;this.providerViewContext=e,this._schemas=r,this._exprParser=i,this._schemaRegistry=o,this.errors=[],this.directivesIndex=new Map,this.ngContentCount=0,this.selectorMatcher=new w.SelectorMatcher;var a=e.component.template;p.isPresent(a)&&p.isPresent(a.interpolation)&&(this._interpolationConfig={start:a.interpolation[0],end:a.interpolation[1]}),c.ListWrapper.forEachWithIndex(t,function(e,t){var n=w.CssSelector.parse(e.selector);s.selectorMatcher.addSelectables(n,e),s.directivesIndex.set(e,t)}),this.pipesByName=new Map,n.forEach(function(e){return s.pipesByName.set(e.name,e)})}return TemplateParseVisitor.prototype._reportError=function(e,t,n){void 0===n&&(n=v.ParseErrorLevel.FATAL),this.errors.push(new V(e,t,n))},TemplateParseVisitor.prototype._reportParserErors=function(e,t){for(var n=0,r=e;no.MAX_INTERPOLATION_VALUES)throw new u.BaseException(\"Only support at most \"+o.MAX_INTERPOLATION_VALUES+\" interpolation values!\");return r}catch(i){return this._reportError(\"\"+i,t),this._exprParser.wrapLiteralPrimitive(\"ERROR\",n)}},TemplateParseVisitor.prototype._parseAction=function(e,t){var n=t.start.toString();try{var r=this._exprParser.parseAction(e,n,this._interpolationConfig);return r&&this._reportParserErors(r.errors,t),!r||r.ast instanceof a.EmptyExpr?(this._reportError(\"Empty expressions are not allowed\",t),this._exprParser.wrapLiteralPrimitive(\"ERROR\",n)):(this._checkPipes(r,t),r)}catch(i){return this._reportError(\"\"+i,t),this._exprParser.wrapLiteralPrimitive(\"ERROR\",n)}},TemplateParseVisitor.prototype._parseBinding=function(e,t){var n=t.start.toString();try{var r=this._exprParser.parseBinding(e,n,this._interpolationConfig);return r&&this._reportParserErors(r.errors,t),this._checkPipes(r,t),r}catch(i){return this._reportError(\"\"+i,t),this._exprParser.wrapLiteralPrimitive(\"ERROR\",n)}},TemplateParseVisitor.prototype._parseTemplateBindings=function(e,t){var n=this,r=t.start.toString();try{var i=this._exprParser.parseTemplateBindings(e,r);return this._reportParserErors(i.errors,t),i.templateBindings.forEach(function(e){p.isPresent(e.expression)&&n._checkPipes(e.expression,t)}),i.warnings.forEach(function(e){n._reportError(e,t,v.ParseErrorLevel.WARNING)}),i.templateBindings}catch(o){return this._reportError(\"\"+o,t),[]}},TemplateParseVisitor.prototype._checkPipes=function(e,t){var n=this;if(p.isPresent(e)){var r=new q;e.visit(r),r.pipes.forEach(function(e){n.pipesByName.has(e)||n._reportError(\"The pipe '\"+e+\"' could not be found\",t)})}},TemplateParseVisitor.prototype.visitExpansion=function(e,t){return null},TemplateParseVisitor.prototype.visitExpansionCase=function(e,t){return null},TemplateParseVisitor.prototype.visitText=function(e,t){var n=t.findNgContentIndex(N),r=this._parseInterpolation(e.value,e.sourceSpan);return p.isPresent(r)?new E.BoundTextAst(r,n,e.sourceSpan):new E.TextAst(e.value,n,e.sourceSpan)},TemplateParseVisitor.prototype.visitAttribute=function(e,t){return new E.AttrAst(e.name,e.value,e.sourceSpan)},TemplateParseVisitor.prototype.visitComment=function(e,t){return null},TemplateParseVisitor.prototype.visitElement=function(e,t){var n=this,r=e.name,i=R.preparseElement(e);if(i.type===R.PreparsedElementType.SCRIPT||i.type===R.PreparsedElementType.STYLE)return null;if(i.type===R.PreparsedElementType.STYLESHEET&&S.isStyleUrlResolvable(i.hrefAttr))return null;var o=[],s=[],a=[],l=[],c=[],u=[],d=[],f=[],m=[],g=!1,v=[],_=y.splitNsName(r.toLowerCase())[1],C=_==P;e.attrs.forEach(function(e){var t=n._parseAttr(C,e,o,s,c,u,a,l),r=n._parseInlineTemplateBinding(e,f,d,m);r&&g&&n._reportError(\"Can't have multiple template bindings on one element. Use only one attribute named 'template' or prefixed with *\",e.sourceSpan),t||r||(v.push(n.visitAttribute(e,null)),o.push([e.name,e.value])),r&&(g=!0)});var T=createElementCssSelector(r,o),x=this._parseDirectives(this.selectorMatcher,T),M=[],k=this._createDirectiveAsts(C,e.name,x,s,a,e.sourceSpan,M),I=this._createElementPropertyAsts(e.name,s,k).concat(c),A=t.isTemplateElement||g,O=new b.ProviderElementContext(this.providerViewContext,t.providerContext,A,k,v,M,e.sourceSpan),D=h.visitAll(i.nonBindable?G:this,e.children,U.create(C,k,C?t.providerContext:O));O.afterElement();var N,V=p.isPresent(i.projectAs)?w.CssSelector.parse(i.projectAs)[0]:T,L=t.findNgContentIndex(V);if(i.type===R.PreparsedElementType.NG_CONTENT)p.isPresent(e.children)&&e.children.length>0&&this._reportError(\" element cannot have content. must be immediately followed by \",e.sourceSpan),N=new E.NgContentAst((this.ngContentCount++),g?null:L,e.sourceSpan);else if(C)this._assertAllEventsPublishedByDirectives(k,u),this._assertNoComponentsNorElementBindingsOnTemplate(k,I,e.sourceSpan),N=new E.EmbeddedTemplateAst(v,u,M,l,O.transformedDirectiveAsts,O.transformProviders,O.transformedHasViewContainer,D,g?null:L,e.sourceSpan);else{this._assertOnlyOneComponent(k,e.sourceSpan);var F=g?null:t.findNgContentIndex(V);N=new E.ElementAst(r,v,I,u,M,O.transformedDirectiveAsts,O.transformProviders,O.transformedHasViewContainer,D,g?null:F,e.sourceSpan)}if(g){var j=createElementCssSelector(P,f),B=this._parseDirectives(this.selectorMatcher,j),W=this._createDirectiveAsts(!0,e.name,B,d,[],e.sourceSpan,[]),H=this._createElementPropertyAsts(e.name,d,W);this._assertNoComponentsNorElementBindingsOnTemplate(W,H,e.sourceSpan);var z=new b.ProviderElementContext(this.providerViewContext,t.providerContext,t.isTemplateElement,W,[],[],e.sourceSpan);z.afterElement(),N=new E.EmbeddedTemplateAst([],[],[],m,z.transformedDirectiveAsts,z.transformProviders,z.transformedHasViewContainer,[N],L,e.sourceSpan)}return N},TemplateParseVisitor.prototype._parseInlineTemplateBinding=function(e,t,n,r){var i=null;if(this._normalizeAttributeName(e.name)==x)i=e.value;else if(e.name.startsWith(M)){var o=e.name.substring(M.length);i=0==e.value.length?o:o+\" \"+e.value}if(p.isPresent(i)){for(var s=this._parseTemplateBindings(i,e.sourceSpan),a=0;a elements is deprecated. Use \"let-\" instead!',t.sourceSpan,v.ParseErrorLevel.WARNING),this._parseVariable(h,c,t.sourceSpan,a)):(this._reportError('\"var-\" on non